diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..10d269a --- /dev/null +++ b/404.html @@ -0,0 +1,1024 @@ + + + + + + + + + + + + + + + + + + + + + + + ESIIL Working Group OASIS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + +
+
+ +

404 - Not found

+ +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/assets/_mkdocstrings.css b/assets/_mkdocstrings.css new file mode 100644 index 0000000..e69de29 diff --git a/assets/cyverse_basics/app_launch.png b/assets/cyverse_basics/app_launch.png new file mode 100644 index 0000000..30fc759 Binary files /dev/null and b/assets/cyverse_basics/app_launch.png differ diff --git a/assets/cyverse_basics/app_settings.png b/assets/cyverse_basics/app_settings.png new file mode 100644 index 0000000..dbf7179 Binary files /dev/null and b/assets/cyverse_basics/app_settings.png differ diff --git a/assets/cyverse_basics/apps.png b/assets/cyverse_basics/apps.png new file mode 100644 index 0000000..ad242a7 Binary files /dev/null and b/assets/cyverse_basics/apps.png differ diff --git a/assets/cyverse_basics/click_cyverse_utils.png b/assets/cyverse_basics/click_cyverse_utils.png new file mode 100644 index 0000000..ddf7445 Binary files /dev/null and b/assets/cyverse_basics/click_cyverse_utils.png differ diff --git a/assets/cyverse_basics/clone.png b/assets/cyverse_basics/clone.png new file mode 100644 index 0000000..875860b Binary files /dev/null and b/assets/cyverse_basics/clone.png differ diff --git a/assets/cyverse_basics/cyverse-utils.png b/assets/cyverse_basics/cyverse-utils.png new file mode 100644 index 0000000..de9c188 Binary files /dev/null and b/assets/cyverse_basics/cyverse-utils.png differ diff --git a/assets/cyverse_basics/email.png b/assets/cyverse_basics/email.png new file mode 100644 index 0000000..6d4bcfa Binary files /dev/null and b/assets/cyverse_basics/email.png differ diff --git a/assets/cyverse_basics/final.png b/assets/cyverse_basics/final.png new file mode 100644 index 0000000..3d92723 Binary files /dev/null and b/assets/cyverse_basics/final.png differ diff --git a/assets/cyverse_basics/go_to_analysis.png b/assets/cyverse_basics/go_to_analysis.png new file mode 100644 index 0000000..802ef3f Binary files /dev/null and b/assets/cyverse_basics/go_to_analysis.png differ diff --git a/assets/cyverse_basics/jupyterlab.png b/assets/cyverse_basics/jupyterlab.png new file mode 100644 index 0000000..f4b4540 Binary files /dev/null and b/assets/cyverse_basics/jupyterlab.png differ diff --git a/assets/cyverse_basics/key.png b/assets/cyverse_basics/key.png new file mode 100644 index 0000000..1670fea Binary files /dev/null and b/assets/cyverse_basics/key.png differ diff --git a/assets/cyverse_basics/launch.png b/assets/cyverse_basics/launch.png new file mode 100644 index 0000000..49e7044 Binary files /dev/null and b/assets/cyverse_basics/launch.png differ diff --git a/assets/cyverse_basics/new_key.png b/assets/cyverse_basics/new_key.png new file mode 100644 index 0000000..5306330 Binary files /dev/null and b/assets/cyverse_basics/new_key.png differ diff --git a/assets/cyverse_basics/open_cyverse_utils.png b/assets/cyverse_basics/open_cyverse_utils.png new file mode 100644 index 0000000..d542da4 Binary files /dev/null and b/assets/cyverse_basics/open_cyverse_utils.png differ diff --git a/assets/cyverse_basics/paste_key.png b/assets/cyverse_basics/paste_key.png new file mode 100644 index 0000000..f515a1b Binary files /dev/null and b/assets/cyverse_basics/paste_key.png differ diff --git a/assets/cyverse_basics/script_1.png b/assets/cyverse_basics/script_1.png new file mode 100644 index 0000000..f316c2c Binary files /dev/null and b/assets/cyverse_basics/script_1.png differ diff --git a/assets/cyverse_basics/settings.png b/assets/cyverse_basics/settings.png new file mode 100644 index 0000000..874200e Binary files /dev/null and b/assets/cyverse_basics/settings.png differ diff --git a/assets/cyverse_basics/ssh.png b/assets/cyverse_basics/ssh.png new file mode 100644 index 0000000..17dc6b8 Binary files /dev/null and b/assets/cyverse_basics/ssh.png differ diff --git a/assets/cyverse_basics/use_this_app.png b/assets/cyverse_basics/use_this_app.png new file mode 100644 index 0000000..c4876cb Binary files /dev/null and b/assets/cyverse_basics/use_this_app.png differ diff --git a/assets/cyverse_basics/username.png b/assets/cyverse_basics/username.png new file mode 100644 index 0000000..fdd0cbc Binary files /dev/null and b/assets/cyverse_basics/username.png differ diff --git a/assets/docker_basics/actions.png b/assets/docker_basics/actions.png new file mode 100644 index 0000000..414dbe8 Binary files /dev/null and b/assets/docker_basics/actions.png differ diff --git a/assets/docker_basics/add_tool.png b/assets/docker_basics/add_tool.png new file mode 100644 index 0000000..39bcdbd Binary files /dev/null and b/assets/docker_basics/add_tool.png differ diff --git a/assets/docker_basics/app_name.png b/assets/docker_basics/app_name.png new file mode 100644 index 0000000..a54b4cf Binary files /dev/null and b/assets/docker_basics/app_name.png differ diff --git a/assets/docker_basics/container_port.png b/assets/docker_basics/container_port.png new file mode 100644 index 0000000..34f0861 Binary files /dev/null and b/assets/docker_basics/container_port.png differ diff --git a/assets/docker_basics/create_app.png b/assets/docker_basics/create_app.png new file mode 100644 index 0000000..e1b3a51 Binary files /dev/null and b/assets/docker_basics/create_app.png differ diff --git a/assets/docker_basics/dockerhub.png b/assets/docker_basics/dockerhub.png new file mode 100644 index 0000000..d5ddd0c Binary files /dev/null and b/assets/docker_basics/dockerhub.png differ diff --git a/assets/docker_basics/image_name.png b/assets/docker_basics/image_name.png new file mode 100644 index 0000000..c675fa7 Binary files /dev/null and b/assets/docker_basics/image_name.png differ diff --git a/assets/docker_basics/manage_tools.png b/assets/docker_basics/manage_tools.png new file mode 100644 index 0000000..575c56c Binary files /dev/null and b/assets/docker_basics/manage_tools.png differ diff --git a/assets/docker_basics/restrictions.png b/assets/docker_basics/restrictions.png new file mode 100644 index 0000000..ccb3a05 Binary files /dev/null and b/assets/docker_basics/restrictions.png differ diff --git a/assets/docker_basics/run_workflow.png b/assets/docker_basics/run_workflow.png new file mode 100644 index 0000000..b8e54f3 Binary files /dev/null and b/assets/docker_basics/run_workflow.png differ diff --git a/assets/docker_basics/save_and_launch.png b/assets/docker_basics/save_and_launch.png new file mode 100644 index 0000000..48a8db5 Binary files /dev/null and b/assets/docker_basics/save_and_launch.png differ diff --git a/assets/docker_basics/tool_name.png b/assets/docker_basics/tool_name.png new file mode 100644 index 0000000..9046571 Binary files /dev/null and b/assets/docker_basics/tool_name.png differ diff --git a/assets/docker_basics/tool_search.png b/assets/docker_basics/tool_search.png new file mode 100644 index 0000000..4d1b076 Binary files /dev/null and b/assets/docker_basics/tool_search.png differ diff --git a/assets/docker_basics/workflows.png b/assets/docker_basics/workflows.png new file mode 100644 index 0000000..4c1f068 Binary files /dev/null and b/assets/docker_basics/workflows.png differ diff --git a/assets/esiil_art/antenna_girl.png b/assets/esiil_art/antenna_girl.png new file mode 100644 index 0000000..e59ce9a Binary files /dev/null and b/assets/esiil_art/antenna_girl.png differ diff --git a/assets/esiil_art/child_plant_interaction.png b/assets/esiil_art/child_plant_interaction.png new file mode 100644 index 0000000..a9c0682 Binary files /dev/null and b/assets/esiil_art/child_plant_interaction.png differ diff --git a/assets/esiil_art/diver.png b/assets/esiil_art/diver.png new file mode 100644 index 0000000..1e161fe Binary files /dev/null and b/assets/esiil_art/diver.png differ diff --git a/assets/esiil_art/fancy_dandilion.png b/assets/esiil_art/fancy_dandilion.png new file mode 100644 index 0000000..7bfd2d8 Binary files /dev/null and b/assets/esiil_art/fancy_dandilion.png differ diff --git a/assets/esiil_art/gull_trash.png b/assets/esiil_art/gull_trash.png new file mode 100644 index 0000000..0e0e0bb Binary files /dev/null and b/assets/esiil_art/gull_trash.png differ diff --git a/assets/esiil_art/hen_harrier.png b/assets/esiil_art/hen_harrier.png new file mode 100644 index 0000000..235f06c Binary files /dev/null and b/assets/esiil_art/hen_harrier.png differ diff --git a/assets/esiil_art/looker.png b/assets/esiil_art/looker.png new file mode 100644 index 0000000..725bd87 Binary files /dev/null and b/assets/esiil_art/looker.png differ diff --git a/assets/esiil_art/monolith-alpha.png b/assets/esiil_art/monolith-alpha.png new file mode 100644 index 0000000..a8c9cf4 Binary files /dev/null and b/assets/esiil_art/monolith-alpha.png differ diff --git a/assets/esiil_art/paperclip.png b/assets/esiil_art/paperclip.png new file mode 100644 index 0000000..fe5aca5 Binary files /dev/null and b/assets/esiil_art/paperclip.png differ diff --git a/assets/esiil_art/peel_back.png b/assets/esiil_art/peel_back.png new file mode 100644 index 0000000..75e2778 Binary files /dev/null and b/assets/esiil_art/peel_back.png differ diff --git a/assets/esiil_art/sculpture_toothpaste.png b/assets/esiil_art/sculpture_toothpaste.png new file mode 100644 index 0000000..85e989b Binary files /dev/null and b/assets/esiil_art/sculpture_toothpaste.png differ diff --git a/assets/esiil_art/swans.png b/assets/esiil_art/swans.png new file mode 100644 index 0000000..15bf83d Binary files /dev/null and b/assets/esiil_art/swans.png differ diff --git a/assets/esiil_art/tree hands.png b/assets/esiil_art/tree hands.png new file mode 100644 index 0000000..aa03415 Binary files /dev/null and b/assets/esiil_art/tree hands.png differ diff --git a/assets/esiil_art/tree_eyes.png b/assets/esiil_art/tree_eyes.png new file mode 100644 index 0000000..74cde3a Binary files /dev/null and b/assets/esiil_art/tree_eyes.png differ diff --git a/assets/esiil_art/tree_hair.png b/assets/esiil_art/tree_hair.png new file mode 100644 index 0000000..73ac371 Binary files /dev/null and b/assets/esiil_art/tree_hair.png differ diff --git a/assets/esiil_art/tree_palm.png b/assets/esiil_art/tree_palm.png new file mode 100644 index 0000000..86161a2 Binary files /dev/null and b/assets/esiil_art/tree_palm.png differ diff --git a/assets/esiil_art/turtle.png b/assets/esiil_art/turtle.png new file mode 100644 index 0000000..4d6cff6 Binary files /dev/null and b/assets/esiil_art/turtle.png differ diff --git a/assets/esiil_art/veg_as_hair.png b/assets/esiil_art/veg_as_hair.png new file mode 100644 index 0000000..5d940a6 Binary files /dev/null and b/assets/esiil_art/veg_as_hair.png differ diff --git a/assets/esiil_art/veg_from_box.png b/assets/esiil_art/veg_from_box.png new file mode 100644 index 0000000..c50c81d Binary files /dev/null and b/assets/esiil_art/veg_from_box.png differ diff --git a/assets/esiil_content/ESIIL_logo.png b/assets/esiil_content/ESIIL_logo.png new file mode 100644 index 0000000..0f7d2f3 Binary files /dev/null and b/assets/esiil_content/ESIIL_logo.png differ diff --git a/assets/esiil_content/favicon.ico b/assets/esiil_content/favicon.ico new file mode 100644 index 0000000..ca12695 Binary files /dev/null and b/assets/esiil_content/favicon.ico differ diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 0000000..1cf13b9 Binary files /dev/null and b/assets/images/favicon.png differ diff --git a/assets/javascripts/bundle.3220b9d7.min.js b/assets/javascripts/bundle.3220b9d7.min.js new file mode 100644 index 0000000..d5c6dfd --- /dev/null +++ b/assets/javascripts/bundle.3220b9d7.min.js @@ -0,0 +1,29 @@ +"use strict";(()=>{var Fi=Object.create;var gr=Object.defineProperty;var ji=Object.getOwnPropertyDescriptor;var Wi=Object.getOwnPropertyNames,Dt=Object.getOwnPropertySymbols,Ui=Object.getPrototypeOf,xr=Object.prototype.hasOwnProperty,no=Object.prototype.propertyIsEnumerable;var oo=(e,t,r)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,R=(e,t)=>{for(var r in t||(t={}))xr.call(t,r)&&oo(e,r,t[r]);if(Dt)for(var r of Dt(t))no.call(t,r)&&oo(e,r,t[r]);return e};var io=(e,t)=>{var r={};for(var o in e)xr.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&Dt)for(var o of Dt(e))t.indexOf(o)<0&&no.call(e,o)&&(r[o]=e[o]);return r};var yr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Di=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Wi(t))!xr.call(e,n)&&n!==r&&gr(e,n,{get:()=>t[n],enumerable:!(o=ji(t,n))||o.enumerable});return e};var Vt=(e,t,r)=>(r=e!=null?Fi(Ui(e)):{},Di(t||!e||!e.__esModule?gr(r,"default",{value:e,enumerable:!0}):r,e));var ao=(e,t,r)=>new Promise((o,n)=>{var i=p=>{try{s(r.next(p))}catch(c){n(c)}},a=p=>{try{s(r.throw(p))}catch(c){n(c)}},s=p=>p.done?o(p.value):Promise.resolve(p.value).then(i,a);s((r=r.apply(e,t)).next())});var co=yr((Er,so)=>{(function(e,t){typeof Er=="object"&&typeof so!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(Er,function(){"use strict";function e(r){var o=!0,n=!1,i=null,a={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function s(H){return!!(H&&H!==document&&H.nodeName!=="HTML"&&H.nodeName!=="BODY"&&"classList"in H&&"contains"in H.classList)}function p(H){var lt=H.type,ze=H.tagName;return!!(ze==="INPUT"&&a[lt]&&!H.readOnly||ze==="TEXTAREA"&&!H.readOnly||H.isContentEditable)}function c(H){H.classList.contains("focus-visible")||(H.classList.add("focus-visible"),H.setAttribute("data-focus-visible-added",""))}function l(H){H.hasAttribute("data-focus-visible-added")&&(H.classList.remove("focus-visible"),H.removeAttribute("data-focus-visible-added"))}function f(H){H.metaKey||H.altKey||H.ctrlKey||(s(r.activeElement)&&c(r.activeElement),o=!0)}function u(H){o=!1}function h(H){s(H.target)&&(o||p(H.target))&&c(H.target)}function w(H){s(H.target)&&(H.target.classList.contains("focus-visible")||H.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),l(H.target))}function A(H){document.visibilityState==="hidden"&&(n&&(o=!0),te())}function te(){document.addEventListener("mousemove",J),document.addEventListener("mousedown",J),document.addEventListener("mouseup",J),document.addEventListener("pointermove",J),document.addEventListener("pointerdown",J),document.addEventListener("pointerup",J),document.addEventListener("touchmove",J),document.addEventListener("touchstart",J),document.addEventListener("touchend",J)}function ie(){document.removeEventListener("mousemove",J),document.removeEventListener("mousedown",J),document.removeEventListener("mouseup",J),document.removeEventListener("pointermove",J),document.removeEventListener("pointerdown",J),document.removeEventListener("pointerup",J),document.removeEventListener("touchmove",J),document.removeEventListener("touchstart",J),document.removeEventListener("touchend",J)}function J(H){H.target.nodeName&&H.target.nodeName.toLowerCase()==="html"||(o=!1,ie())}document.addEventListener("keydown",f,!0),document.addEventListener("mousedown",u,!0),document.addEventListener("pointerdown",u,!0),document.addEventListener("touchstart",u,!0),document.addEventListener("visibilitychange",A,!0),te(),r.addEventListener("focus",h,!0),r.addEventListener("blur",w,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var Yr=yr((Rt,Kr)=>{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof Rt=="object"&&typeof Kr=="object"?Kr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Rt=="object"?Rt.ClipboardJS=r():t.ClipboardJS=r()})(Rt,function(){return function(){var e={686:function(o,n,i){"use strict";i.d(n,{default:function(){return Ii}});var a=i(279),s=i.n(a),p=i(370),c=i.n(p),l=i(817),f=i.n(l);function u(V){try{return document.execCommand(V)}catch(_){return!1}}var h=function(_){var O=f()(_);return u("cut"),O},w=h;function A(V){var _=document.documentElement.getAttribute("dir")==="rtl",O=document.createElement("textarea");O.style.fontSize="12pt",O.style.border="0",O.style.padding="0",O.style.margin="0",O.style.position="absolute",O.style[_?"right":"left"]="-9999px";var j=window.pageYOffset||document.documentElement.scrollTop;return O.style.top="".concat(j,"px"),O.setAttribute("readonly",""),O.value=V,O}var te=function(_,O){var j=A(_);O.container.appendChild(j);var D=f()(j);return u("copy"),j.remove(),D},ie=function(_){var O=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},j="";return typeof _=="string"?j=te(_,O):_ instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(_==null?void 0:_.type)?j=te(_.value,O):(j=f()(_),u("copy")),j},J=ie;function H(V){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?H=function(O){return typeof O}:H=function(O){return O&&typeof Symbol=="function"&&O.constructor===Symbol&&O!==Symbol.prototype?"symbol":typeof O},H(V)}var lt=function(){var _=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},O=_.action,j=O===void 0?"copy":O,D=_.container,Y=_.target,ke=_.text;if(j!=="copy"&&j!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(Y!==void 0)if(Y&&H(Y)==="object"&&Y.nodeType===1){if(j==="copy"&&Y.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(j==="cut"&&(Y.hasAttribute("readonly")||Y.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(ke)return J(ke,{container:D});if(Y)return j==="cut"?w(Y):J(Y,{container:D})},ze=lt;function Ie(V){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Ie=function(O){return typeof O}:Ie=function(O){return O&&typeof Symbol=="function"&&O.constructor===Symbol&&O!==Symbol.prototype?"symbol":typeof O},Ie(V)}function _i(V,_){if(!(V instanceof _))throw new TypeError("Cannot call a class as a function")}function ro(V,_){for(var O=0;O<_.length;O++){var j=_[O];j.enumerable=j.enumerable||!1,j.configurable=!0,"value"in j&&(j.writable=!0),Object.defineProperty(V,j.key,j)}}function Ai(V,_,O){return _&&ro(V.prototype,_),O&&ro(V,O),V}function Ci(V,_){if(typeof _!="function"&&_!==null)throw new TypeError("Super expression must either be null or a function");V.prototype=Object.create(_&&_.prototype,{constructor:{value:V,writable:!0,configurable:!0}}),_&&br(V,_)}function br(V,_){return br=Object.setPrototypeOf||function(j,D){return j.__proto__=D,j},br(V,_)}function Hi(V){var _=Pi();return function(){var j=Wt(V),D;if(_){var Y=Wt(this).constructor;D=Reflect.construct(j,arguments,Y)}else D=j.apply(this,arguments);return ki(this,D)}}function ki(V,_){return _&&(Ie(_)==="object"||typeof _=="function")?_:$i(V)}function $i(V){if(V===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return V}function Pi(){if(typeof Reflect=="undefined"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(V){return!1}}function Wt(V){return Wt=Object.setPrototypeOf?Object.getPrototypeOf:function(O){return O.__proto__||Object.getPrototypeOf(O)},Wt(V)}function vr(V,_){var O="data-clipboard-".concat(V);if(_.hasAttribute(O))return _.getAttribute(O)}var Ri=function(V){Ci(O,V);var _=Hi(O);function O(j,D){var Y;return _i(this,O),Y=_.call(this),Y.resolveOptions(D),Y.listenClick(j),Y}return Ai(O,[{key:"resolveOptions",value:function(){var D=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof D.action=="function"?D.action:this.defaultAction,this.target=typeof D.target=="function"?D.target:this.defaultTarget,this.text=typeof D.text=="function"?D.text:this.defaultText,this.container=Ie(D.container)==="object"?D.container:document.body}},{key:"listenClick",value:function(D){var Y=this;this.listener=c()(D,"click",function(ke){return Y.onClick(ke)})}},{key:"onClick",value:function(D){var Y=D.delegateTarget||D.currentTarget,ke=this.action(Y)||"copy",Ut=ze({action:ke,container:this.container,target:this.target(Y),text:this.text(Y)});this.emit(Ut?"success":"error",{action:ke,text:Ut,trigger:Y,clearSelection:function(){Y&&Y.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(D){return vr("action",D)}},{key:"defaultTarget",value:function(D){var Y=vr("target",D);if(Y)return document.querySelector(Y)}},{key:"defaultText",value:function(D){return vr("text",D)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(D){var Y=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return J(D,Y)}},{key:"cut",value:function(D){return w(D)}},{key:"isSupported",value:function(){var D=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],Y=typeof D=="string"?[D]:D,ke=!!document.queryCommandSupported;return Y.forEach(function(Ut){ke=ke&&!!document.queryCommandSupported(Ut)}),ke}}]),O}(s()),Ii=Ri},828:function(o){var n=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function a(s,p){for(;s&&s.nodeType!==n;){if(typeof s.matches=="function"&&s.matches(p))return s;s=s.parentNode}}o.exports=a},438:function(o,n,i){var a=i(828);function s(l,f,u,h,w){var A=c.apply(this,arguments);return l.addEventListener(u,A,w),{destroy:function(){l.removeEventListener(u,A,w)}}}function p(l,f,u,h,w){return typeof l.addEventListener=="function"?s.apply(null,arguments):typeof u=="function"?s.bind(null,document).apply(null,arguments):(typeof l=="string"&&(l=document.querySelectorAll(l)),Array.prototype.map.call(l,function(A){return s(A,f,u,h,w)}))}function c(l,f,u,h){return function(w){w.delegateTarget=a(w.target,f),w.delegateTarget&&h.call(l,w)}}o.exports=p},879:function(o,n){n.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},n.nodeList=function(i){var a=Object.prototype.toString.call(i);return i!==void 0&&(a==="[object NodeList]"||a==="[object HTMLCollection]")&&"length"in i&&(i.length===0||n.node(i[0]))},n.string=function(i){return typeof i=="string"||i instanceof String},n.fn=function(i){var a=Object.prototype.toString.call(i);return a==="[object Function]"}},370:function(o,n,i){var a=i(879),s=i(438);function p(u,h,w){if(!u&&!h&&!w)throw new Error("Missing required arguments");if(!a.string(h))throw new TypeError("Second argument must be a String");if(!a.fn(w))throw new TypeError("Third argument must be a Function");if(a.node(u))return c(u,h,w);if(a.nodeList(u))return l(u,h,w);if(a.string(u))return f(u,h,w);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(u,h,w){return u.addEventListener(h,w),{destroy:function(){u.removeEventListener(h,w)}}}function l(u,h,w){return Array.prototype.forEach.call(u,function(A){A.addEventListener(h,w)}),{destroy:function(){Array.prototype.forEach.call(u,function(A){A.removeEventListener(h,w)})}}}function f(u,h,w){return s(document.body,u,h,w)}o.exports=p},817:function(o){function n(i){var a;if(i.nodeName==="SELECT")i.focus(),a=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var s=i.hasAttribute("readonly");s||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),s||i.removeAttribute("readonly"),a=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var p=window.getSelection(),c=document.createRange();c.selectNodeContents(i),p.removeAllRanges(),p.addRange(c),a=p.toString()}return a}o.exports=n},279:function(o){function n(){}n.prototype={on:function(i,a,s){var p=this.e||(this.e={});return(p[i]||(p[i]=[])).push({fn:a,ctx:s}),this},once:function(i,a,s){var p=this;function c(){p.off(i,c),a.apply(s,arguments)}return c._=a,this.on(i,c,s)},emit:function(i){var a=[].slice.call(arguments,1),s=((this.e||(this.e={}))[i]||[]).slice(),p=0,c=s.length;for(p;p{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var ts=/["'&<>]/;ei.exports=rs;function rs(e){var t=""+e,r=ts.exec(t);if(!r)return t;var o,n="",i=0,a=0;for(i=r.index;i0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function N(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var o=r.call(e),n,i=[],a;try{for(;(t===void 0||t-- >0)&&!(n=o.next()).done;)i.push(n.value)}catch(s){a={error:s}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(a)throw a.error}}return i}function q(e,t,r){if(r||arguments.length===2)for(var o=0,n=t.length,i;o1||s(u,h)})})}function s(u,h){try{p(o[u](h))}catch(w){f(i[0][3],w)}}function p(u){u.value instanceof ot?Promise.resolve(u.value.v).then(c,l):f(i[0][2],u)}function c(u){s("next",u)}function l(u){s("throw",u)}function f(u,h){u(h),i.shift(),i.length&&s(i[0][0],i[0][1])}}function mo(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof de=="function"?de(e):e[Symbol.iterator](),r={},o("next"),o("throw"),o("return"),r[Symbol.asyncIterator]=function(){return this},r);function o(i){r[i]=e[i]&&function(a){return new Promise(function(s,p){a=e[i](a),n(s,p,a.done,a.value)})}}function n(i,a,s,p){Promise.resolve(p).then(function(c){i({value:c,done:s})},a)}}function k(e){return typeof e=="function"}function mt(e){var t=function(o){Error.call(o),o.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var zt=mt(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(o,n){return n+1+") "+o.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function qe(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Fe=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var a=this._parentage;if(a)if(this._parentage=null,Array.isArray(a))try{for(var s=de(a),p=s.next();!p.done;p=s.next()){var c=p.value;c.remove(this)}}catch(A){t={error:A}}finally{try{p&&!p.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}else a.remove(this);var l=this.initialTeardown;if(k(l))try{l()}catch(A){i=A instanceof zt?A.errors:[A]}var f=this._finalizers;if(f){this._finalizers=null;try{for(var u=de(f),h=u.next();!h.done;h=u.next()){var w=h.value;try{fo(w)}catch(A){i=i!=null?i:[],A instanceof zt?i=q(q([],N(i)),N(A.errors)):i.push(A)}}}catch(A){o={error:A}}finally{try{h&&!h.done&&(n=u.return)&&n.call(u)}finally{if(o)throw o.error}}}if(i)throw new zt(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)fo(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&qe(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&qe(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Tr=Fe.EMPTY;function qt(e){return e instanceof Fe||e&&"closed"in e&&k(e.remove)&&k(e.add)&&k(e.unsubscribe)}function fo(e){k(e)?e():e.unsubscribe()}var $e={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var ft={setTimeout:function(e,t){for(var r=[],o=2;o0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var o=this,n=this,i=n.hasError,a=n.isStopped,s=n.observers;return i||a?Tr:(this.currentObservers=null,s.push(r),new Fe(function(){o.currentObservers=null,qe(s,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,a=o.isStopped;n?r.error(i):a&&r.complete()},t.prototype.asObservable=function(){var r=new F;return r.source=this,r},t.create=function(r,o){return new Eo(r,o)},t}(F);var Eo=function(e){re(t,e);function t(r,o){var n=e.call(this)||this;return n.destination=r,n.source=o,n}return t.prototype.next=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.next)===null||n===void 0||n.call(o,r)},t.prototype.error=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.error)===null||n===void 0||n.call(o,r)},t.prototype.complete=function(){var r,o;(o=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||o===void 0||o.call(r)},t.prototype._subscribe=function(r){var o,n;return(n=(o=this.source)===null||o===void 0?void 0:o.subscribe(r))!==null&&n!==void 0?n:Tr},t}(g);var _r=function(e){re(t,e);function t(r){var o=e.call(this)||this;return o._value=r,o}return Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!1,configurable:!0}),t.prototype._subscribe=function(r){var o=e.prototype._subscribe.call(this,r);return!o.closed&&r.next(this._value),o},t.prototype.getValue=function(){var r=this,o=r.hasError,n=r.thrownError,i=r._value;if(o)throw n;return this._throwIfClosed(),i},t.prototype.next=function(r){e.prototype.next.call(this,this._value=r)},t}(g);var Lt={now:function(){return(Lt.delegate||Date).now()},delegate:void 0};var _t=function(e){re(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=Lt);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,o),i}return t.prototype.next=function(r){var o=this,n=o.isStopped,i=o._buffer,a=o._infiniteTimeWindow,s=o._timestampProvider,p=o._windowTime;n||(i.push(r),!a&&i.push(s.now()+p)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var o=this._innerSubscribe(r),n=this,i=n._infiniteTimeWindow,a=n._buffer,s=a.slice(),p=0;p0?e.prototype.schedule.call(this,r,o):(this.delay=o,this.state=r,this.scheduler.flush(this),this)},t.prototype.execute=function(r,o){return o>0||this.closed?e.prototype.execute.call(this,r,o):this._execute(r,o)},t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!=null&&n>0||n==null&&this.delay>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.flush(this),0)},t}(bt);var So=function(e){re(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t}(vt);var Hr=new So(To);var Oo=function(e){re(t,e);function t(r,o){var n=e.call(this,r,o)||this;return n.scheduler=r,n.work=o,n}return t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!==null&&n>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=ht.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){var i;if(n===void 0&&(n=0),n!=null?n>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);var a=r.actions;o!=null&&((i=a[a.length-1])===null||i===void 0?void 0:i.id)!==o&&(ht.cancelAnimationFrame(o),r._scheduled=void 0)},t}(bt);var Mo=function(e){re(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var o=this._scheduled;this._scheduled=void 0;var n=this.actions,i;r=r||n.shift();do if(i=r.execute(r.state,r.delay))break;while((r=n[0])&&r.id===o&&n.shift());if(this._active=!1,i){for(;(r=n[0])&&r.id===o&&n.shift();)r.unsubscribe();throw i}},t}(vt);var me=new Mo(Oo);var M=new F(function(e){return e.complete()});function Yt(e){return e&&k(e.schedule)}function kr(e){return e[e.length-1]}function Xe(e){return k(kr(e))?e.pop():void 0}function He(e){return Yt(kr(e))?e.pop():void 0}function Bt(e,t){return typeof kr(e)=="number"?e.pop():t}var gt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Gt(e){return k(e==null?void 0:e.then)}function Jt(e){return k(e[dt])}function Xt(e){return Symbol.asyncIterator&&k(e==null?void 0:e[Symbol.asyncIterator])}function Zt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function Gi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var er=Gi();function tr(e){return k(e==null?void 0:e[er])}function rr(e){return lo(this,arguments,function(){var r,o,n,i;return Nt(this,function(a){switch(a.label){case 0:r=e.getReader(),a.label=1;case 1:a.trys.push([1,,9,10]),a.label=2;case 2:return[4,ot(r.read())];case 3:return o=a.sent(),n=o.value,i=o.done,i?[4,ot(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,ot(n)];case 6:return[4,a.sent()];case 7:return a.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function or(e){return k(e==null?void 0:e.getReader)}function W(e){if(e instanceof F)return e;if(e!=null){if(Jt(e))return Ji(e);if(gt(e))return Xi(e);if(Gt(e))return Zi(e);if(Xt(e))return Lo(e);if(tr(e))return ea(e);if(or(e))return ta(e)}throw Zt(e)}function Ji(e){return new F(function(t){var r=e[dt]();if(k(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function Xi(e){return new F(function(t){for(var r=0;r=2;return function(o){return o.pipe(e?b(function(n,i){return e(n,i,o)}):le,we(1),r?Be(t):zo(function(){return new ir}))}}function Fr(e){return e<=0?function(){return M}:x(function(t,r){var o=[];t.subscribe(T(r,function(n){o.push(n),e=2,!0))}function pe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new g}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,a=i===void 0?!0:i,s=e.resetOnRefCountZero,p=s===void 0?!0:s;return function(c){var l,f,u,h=0,w=!1,A=!1,te=function(){f==null||f.unsubscribe(),f=void 0},ie=function(){te(),l=u=void 0,w=A=!1},J=function(){var H=l;ie(),H==null||H.unsubscribe()};return x(function(H,lt){h++,!A&&!w&&te();var ze=u=u!=null?u:r();lt.add(function(){h--,h===0&&!A&&!w&&(f=Wr(J,p))}),ze.subscribe(lt),!l&&h>0&&(l=new it({next:function(Ie){return ze.next(Ie)},error:function(Ie){A=!0,te(),f=Wr(ie,n,Ie),ze.error(Ie)},complete:function(){w=!0,te(),f=Wr(ie,a),ze.complete()}}),W(H).subscribe(l))})(c)}}function Wr(e,t){for(var r=[],o=2;oe.next(document)),e}function $(e,t=document){return Array.from(t.querySelectorAll(e))}function P(e,t=document){let r=fe(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function fe(e,t=document){return t.querySelector(e)||void 0}function Re(){var e,t,r,o;return(o=(r=(t=(e=document.activeElement)==null?void 0:e.shadowRoot)==null?void 0:t.activeElement)!=null?r:document.activeElement)!=null?o:void 0}var xa=S(d(document.body,"focusin"),d(document.body,"focusout")).pipe(_e(1),Q(void 0),m(()=>Re()||document.body),B(1));function et(e){return xa.pipe(m(t=>e.contains(t)),K())}function kt(e,t){return C(()=>S(d(e,"mouseenter").pipe(m(()=>!0)),d(e,"mouseleave").pipe(m(()=>!1))).pipe(t?Ht(r=>Me(+!r*t)):le,Q(e.matches(":hover"))))}function Bo(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)Bo(e,r)}function E(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="undefined"&&(typeof t[n]!="boolean"?o.setAttribute(n,t[n]):o.setAttribute(n,""));for(let n of r)Bo(o,n);return o}function sr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function Et(e){let t=E("script",{src:e});return C(()=>(document.head.appendChild(t),S(d(t,"load"),d(t,"error").pipe(v(()=>$r(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),L(()=>document.head.removeChild(t)),we(1))))}var Go=new g,ya=C(()=>typeof ResizeObserver=="undefined"?Et("https://unpkg.com/resize-observer-polyfill"):I(void 0)).pipe(m(()=>new ResizeObserver(e=>e.forEach(t=>Go.next(t)))),v(e=>S(Ke,I(e)).pipe(L(()=>e.disconnect()))),B(1));function ce(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ge(e){let t=e;for(;t.clientWidth===0&&t.parentElement;)t=t.parentElement;return ya.pipe(y(r=>r.observe(t)),v(r=>Go.pipe(b(o=>o.target===t),L(()=>r.unobserve(t)))),m(()=>ce(e)),Q(ce(e)))}function wt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function cr(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}function Jo(e){let t=[],r=e.parentElement;for(;r;)(e.clientWidth>r.clientWidth||e.clientHeight>r.clientHeight)&&t.push(r),r=(e=r).parentElement;return t.length===0&&t.push(document.documentElement),t}function Ue(e){return{x:e.offsetLeft,y:e.offsetTop}}function Xo(e){let t=e.getBoundingClientRect();return{x:t.x+window.scrollX,y:t.y+window.scrollY}}function Zo(e){return S(d(window,"load"),d(window,"resize")).pipe(Le(0,me),m(()=>Ue(e)),Q(Ue(e)))}function pr(e){return{x:e.scrollLeft,y:e.scrollTop}}function De(e){return S(d(e,"scroll"),d(window,"scroll"),d(window,"resize")).pipe(Le(0,me),m(()=>pr(e)),Q(pr(e)))}var en=new g,Ea=C(()=>I(new IntersectionObserver(e=>{for(let t of e)en.next(t)},{threshold:0}))).pipe(v(e=>S(Ke,I(e)).pipe(L(()=>e.disconnect()))),B(1));function Tt(e){return Ea.pipe(y(t=>t.observe(e)),v(t=>en.pipe(b(({target:r})=>r===e),L(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function tn(e,t=16){return De(e).pipe(m(({y:r})=>{let o=ce(e),n=wt(e);return r>=n.height-o.height-t}),K())}var lr={drawer:P("[data-md-toggle=drawer]"),search:P("[data-md-toggle=search]")};function rn(e){return lr[e].checked}function Je(e,t){lr[e].checked!==t&&lr[e].click()}function Ve(e){let t=lr[e];return d(t,"change").pipe(m(()=>t.checked),Q(t.checked))}function wa(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Ta(){return S(d(window,"compositionstart").pipe(m(()=>!0)),d(window,"compositionend").pipe(m(()=>!1))).pipe(Q(!1))}function on(){let e=d(window,"keydown").pipe(b(t=>!(t.metaKey||t.ctrlKey)),m(t=>({mode:rn("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),b(({mode:t,type:r})=>{if(t==="global"){let o=Re();if(typeof o!="undefined")return!wa(o,r)}return!0}),pe());return Ta().pipe(v(t=>t?M:e))}function xe(){return new URL(location.href)}function ct(e,t=!1){if(G("navigation.instant")&&!t){let r=E("a",{href:e.href});document.body.appendChild(r),r.click(),r.remove()}else location.href=e.href}function nn(){return new g}function an(){return location.hash.slice(1)}function sn(e){let t=E("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Sa(e){return S(d(window,"hashchange"),e).pipe(m(an),Q(an()),b(t=>t.length>0),B(1))}function cn(e){return Sa(e).pipe(m(t=>fe(`[id="${t}"]`)),b(t=>typeof t!="undefined"))}function $t(e){let t=matchMedia(e);return ar(r=>t.addListener(()=>r(t.matches))).pipe(Q(t.matches))}function pn(){let e=matchMedia("print");return S(d(window,"beforeprint").pipe(m(()=>!0)),d(window,"afterprint").pipe(m(()=>!1))).pipe(Q(e.matches))}function Nr(e,t){return e.pipe(v(r=>r?t():M))}function zr(e,t){return new F(r=>{let o=new XMLHttpRequest;return o.open("GET",`${e}`),o.responseType="blob",o.addEventListener("load",()=>{o.status>=200&&o.status<300?(r.next(o.response),r.complete()):r.error(new Error(o.statusText))}),o.addEventListener("error",()=>{r.error(new Error("Network error"))}),o.addEventListener("abort",()=>{r.complete()}),typeof(t==null?void 0:t.progress$)!="undefined"&&(o.addEventListener("progress",n=>{var i;if(n.lengthComputable)t.progress$.next(n.loaded/n.total*100);else{let a=(i=o.getResponseHeader("Content-Length"))!=null?i:0;t.progress$.next(n.loaded/+a*100)}}),t.progress$.next(5)),o.send(),()=>o.abort()})}function Ne(e,t){return zr(e,t).pipe(v(r=>r.text()),m(r=>JSON.parse(r)),B(1))}function ln(e,t){let r=new DOMParser;return zr(e,t).pipe(v(o=>o.text()),m(o=>r.parseFromString(o,"text/html")),B(1))}function mn(e,t){let r=new DOMParser;return zr(e,t).pipe(v(o=>o.text()),m(o=>r.parseFromString(o,"text/xml")),B(1))}function fn(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function un(){return S(d(window,"scroll",{passive:!0}),d(window,"resize",{passive:!0})).pipe(m(fn),Q(fn()))}function dn(){return{width:innerWidth,height:innerHeight}}function hn(){return d(window,"resize",{passive:!0}).pipe(m(dn),Q(dn()))}function bn(){return z([un(),hn()]).pipe(m(([e,t])=>({offset:e,size:t})),B(1))}function mr(e,{viewport$:t,header$:r}){let o=t.pipe(Z("size")),n=z([o,r]).pipe(m(()=>Ue(e)));return z([r,t,n]).pipe(m(([{height:i},{offset:a,size:s},{x:p,y:c}])=>({offset:{x:a.x-p,y:a.y-c+i},size:s})))}function Oa(e){return d(e,"message",t=>t.data)}function Ma(e){let t=new g;return t.subscribe(r=>e.postMessage(r)),t}function vn(e,t=new Worker(e)){let r=Oa(t),o=Ma(t),n=new g;n.subscribe(o);let i=o.pipe(X(),ne(!0));return n.pipe(X(),Pe(r.pipe(U(i))),pe())}var La=P("#__config"),St=JSON.parse(La.textContent);St.base=`${new URL(St.base,xe())}`;function Te(){return St}function G(e){return St.features.includes(e)}function ye(e,t){return typeof t!="undefined"?St.translations[e].replace("#",t.toString()):St.translations[e]}function Se(e,t=document){return P(`[data-md-component=${e}]`,t)}function ae(e,t=document){return $(`[data-md-component=${e}]`,t)}function _a(e){let t=P(".md-typeset > :first-child",e);return d(t,"click",{once:!0}).pipe(m(()=>P(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function gn(e){if(!G("announce.dismiss")||!e.childElementCount)return M;if(!e.hidden){let t=P(".md-typeset",e);__md_hash(t.innerHTML)===__md_get("__announce")&&(e.hidden=!0)}return C(()=>{let t=new g;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),_a(e).pipe(y(r=>t.next(r)),L(()=>t.complete()),m(r=>R({ref:e},r)))})}function Aa(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function xn(e,t){let r=new g;return r.subscribe(({hidden:o})=>{e.hidden=o}),Aa(e,t).pipe(y(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))}function Pt(e,t){return t==="inline"?E("div",{class:"md-tooltip md-tooltip--inline",id:e,role:"tooltip"},E("div",{class:"md-tooltip__inner md-typeset"})):E("div",{class:"md-tooltip",id:e,role:"tooltip"},E("div",{class:"md-tooltip__inner md-typeset"}))}function yn(...e){return E("div",{class:"md-tooltip2",role:"tooltip"},E("div",{class:"md-tooltip2__inner md-typeset"},e))}function En(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return E("aside",{class:"md-annotation",tabIndex:0},Pt(t),E("a",{href:r,class:"md-annotation__index",tabIndex:-1},E("span",{"data-md-annotation-id":e})))}else return E("aside",{class:"md-annotation",tabIndex:0},Pt(t),E("span",{class:"md-annotation__index",tabIndex:-1},E("span",{"data-md-annotation-id":e})))}function wn(e){return E("button",{class:"md-clipboard md-icon",title:ye("clipboard.copy"),"data-clipboard-target":`#${e} > code`})}function qr(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(p=>!e.terms[p]).reduce((p,c)=>[...p,E("del",null,c)," "],[]).slice(0,-1),i=Te(),a=new URL(e.location,i.base);G("search.highlight")&&a.searchParams.set("h",Object.entries(e.terms).filter(([,p])=>p).reduce((p,[c])=>`${p} ${c}`.trim(),""));let{tags:s}=Te();return E("a",{href:`${a}`,class:"md-search-result__link",tabIndex:-1},E("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&E("div",{class:"md-search-result__icon md-icon"}),r>0&&E("h1",null,e.title),r<=0&&E("h2",null,e.title),o>0&&e.text.length>0&&e.text,e.tags&&e.tags.map(p=>{let c=s?p in s?`md-tag-icon md-tag--${s[p]}`:"md-tag-icon":"";return E("span",{class:`md-tag ${c}`},p)}),o>0&&n.length>0&&E("p",{class:"md-search-result__terms"},ye("search.result.term.missing"),": ",...n)))}function Tn(e){let t=e[0].score,r=[...e],o=Te(),n=r.findIndex(l=>!`${new URL(l.location,o.base)}`.includes("#")),[i]=r.splice(n,1),a=r.findIndex(l=>l.scoreqr(l,1)),...p.length?[E("details",{class:"md-search-result__more"},E("summary",{tabIndex:-1},E("div",null,p.length>0&&p.length===1?ye("search.result.more.one"):ye("search.result.more.other",p.length))),...p.map(l=>qr(l,1)))]:[]];return E("li",{class:"md-search-result__item"},c)}function Sn(e){return E("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>E("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?sr(r):r)))}function Qr(e){let t=`tabbed-control tabbed-control--${e}`;return E("div",{class:t,hidden:!0},E("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function On(e){return E("div",{class:"md-typeset__scrollwrap"},E("div",{class:"md-typeset__table"},e))}function Ca(e){let t=Te(),r=new URL(`../${e.version}/`,t.base);return E("li",{class:"md-version__item"},E("a",{href:`${r}`,class:"md-version__link"},e.title))}function Mn(e,t){return e=e.filter(r=>{var o;return!((o=r.properties)!=null&&o.hidden)}),E("div",{class:"md-version"},E("button",{class:"md-version__current","aria-label":ye("select.version")},t.title),E("ul",{class:"md-version__list"},e.map(Ca)))}var Ha=0;function ka(e){let t=z([et(e),kt(e)]).pipe(m(([o,n])=>o||n),K()),r=C(()=>Jo(e)).pipe(oe(De),st(1),m(()=>Xo(e)));return t.pipe(Ae(o=>o),v(()=>z([t,r])),m(([o,n])=>({active:o,offset:n})),pe())}function $a(e,t){let{content$:r,viewport$:o}=t,n=`__tooltip2_${Ha++}`;return C(()=>{let i=new g,a=new _r(!1);i.pipe(X(),ne(!1)).subscribe(a);let s=a.pipe(Ht(c=>Me(+!c*250,Hr)),K(),v(c=>c?r:M),y(c=>c.id=n),pe());z([i.pipe(m(({active:c})=>c)),s.pipe(v(c=>kt(c,250)),Q(!1))]).pipe(m(c=>c.some(l=>l))).subscribe(a);let p=a.pipe(b(c=>c),ee(s,o),m(([c,l,{size:f}])=>{let u=e.getBoundingClientRect(),h=u.width/2;if(l.role==="tooltip")return{x:h,y:8+u.height};if(u.y>=f.height/2){let{height:w}=ce(l);return{x:h,y:-16-w}}else return{x:h,y:16+u.height}}));return z([s,i,p]).subscribe(([c,{offset:l},f])=>{c.style.setProperty("--md-tooltip-host-x",`${l.x}px`),c.style.setProperty("--md-tooltip-host-y",`${l.y}px`),c.style.setProperty("--md-tooltip-x",`${f.x}px`),c.style.setProperty("--md-tooltip-y",`${f.y}px`),c.classList.toggle("md-tooltip2--top",f.y<0),c.classList.toggle("md-tooltip2--bottom",f.y>=0)}),a.pipe(b(c=>c),ee(s,(c,l)=>l),b(c=>c.role==="tooltip")).subscribe(c=>{let l=ce(P(":scope > *",c));c.style.setProperty("--md-tooltip-width",`${l.width}px`),c.style.setProperty("--md-tooltip-tail","0px")}),a.pipe(K(),be(me),ee(s)).subscribe(([c,l])=>{l.classList.toggle("md-tooltip2--active",c)}),z([a.pipe(b(c=>c)),s]).subscribe(([c,l])=>{l.role==="dialog"?(e.setAttribute("aria-controls",n),e.setAttribute("aria-haspopup","dialog")):e.setAttribute("aria-describedby",n)}),a.pipe(b(c=>!c)).subscribe(()=>{e.removeAttribute("aria-controls"),e.removeAttribute("aria-describedby"),e.removeAttribute("aria-haspopup")}),ka(e).pipe(y(c=>i.next(c)),L(()=>i.complete()),m(c=>R({ref:e},c)))})}function pt(e,{viewport$:t},r=document.body){return $a(e,{content$:new F(o=>{let n=e.title,i=yn(n);return o.next(i),e.removeAttribute("title"),r.append(i),()=>{i.remove(),e.setAttribute("title",n)}}),viewport$:t})}function Pa(e,t){let r=C(()=>z([Zo(e),De(t)])).pipe(m(([{x:o,y:n},i])=>{let{width:a,height:s}=ce(e);return{x:o-i.x+a/2,y:n-i.y+s/2}}));return et(e).pipe(v(o=>r.pipe(m(n=>({active:o,offset:n})),we(+!o||1/0))))}function Ln(e,t,{target$:r}){let[o,n]=Array.from(e.children);return C(()=>{let i=new g,a=i.pipe(X(),ne(!0));return i.subscribe({next({offset:s}){e.style.setProperty("--md-tooltip-x",`${s.x}px`),e.style.setProperty("--md-tooltip-y",`${s.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),Tt(e).pipe(U(a)).subscribe(s=>{e.toggleAttribute("data-md-visible",s)}),S(i.pipe(b(({active:s})=>s)),i.pipe(_e(250),b(({active:s})=>!s))).subscribe({next({active:s}){s?e.prepend(o):o.remove()},complete(){e.prepend(o)}}),i.pipe(Le(16,me)).subscribe(({active:s})=>{o.classList.toggle("md-tooltip--active",s)}),i.pipe(st(125,me),b(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:s})=>s)).subscribe({next(s){s?e.style.setProperty("--md-tooltip-0",`${-s}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),d(n,"click").pipe(U(a),b(s=>!(s.metaKey||s.ctrlKey))).subscribe(s=>{s.stopPropagation(),s.preventDefault()}),d(n,"mousedown").pipe(U(a),ee(i)).subscribe(([s,{active:p}])=>{var c;if(s.button!==0||s.metaKey||s.ctrlKey)s.preventDefault();else if(p){s.preventDefault();let l=e.parentElement.closest(".md-annotation");l instanceof HTMLElement?l.focus():(c=Re())==null||c.blur()}}),r.pipe(U(a),b(s=>s===o),Ge(125)).subscribe(()=>e.focus()),Pa(e,t).pipe(y(s=>i.next(s)),L(()=>i.complete()),m(s=>R({ref:e},s)))})}function Ra(e){return e.tagName==="CODE"?$(".c, .c1, .cm",e):[e]}function Ia(e){let t=[];for(let r of Ra(e)){let o=[],n=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=n.nextNode();i;i=n.nextNode())o.push(i);for(let i of o){let a;for(;a=/(\(\d+\))(!)?/.exec(i.textContent);){let[,s,p]=a;if(typeof p=="undefined"){let c=i.splitText(a.index);i=c.splitText(s.length),t.push(c)}else{i.textContent=s,t.push(i);break}}}}return t}function _n(e,t){t.append(...Array.from(e.childNodes))}function fr(e,t,{target$:r,print$:o}){let n=t.closest("[id]"),i=n==null?void 0:n.id,a=new Map;for(let s of Ia(t)){let[,p]=s.textContent.match(/\((\d+)\)/);fe(`:scope > li:nth-child(${p})`,e)&&(a.set(p,En(p,i)),s.replaceWith(a.get(p)))}return a.size===0?M:C(()=>{let s=new g,p=s.pipe(X(),ne(!0)),c=[];for(let[l,f]of a)c.push([P(".md-typeset",f),P(`:scope > li:nth-child(${l})`,e)]);return o.pipe(U(p)).subscribe(l=>{e.hidden=!l,e.classList.toggle("md-annotation-list",l);for(let[f,u]of c)l?_n(f,u):_n(u,f)}),S(...[...a].map(([,l])=>Ln(l,t,{target$:r}))).pipe(L(()=>s.complete()),pe())})}function An(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return An(t)}}function Cn(e,t){return C(()=>{let r=An(e);return typeof r!="undefined"?fr(r,e,t):M})}var Hn=Vt(Yr());var Fa=0;function kn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return kn(t)}}function ja(e){return ge(e).pipe(m(({width:t})=>({scrollable:wt(e).width>t})),Z("scrollable"))}function $n(e,t){let{matches:r}=matchMedia("(hover)"),o=C(()=>{let n=new g,i=n.pipe(Fr(1));n.subscribe(({scrollable:c})=>{c&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")});let a=[];if(Hn.default.isSupported()&&(e.closest(".copy")||G("content.code.copy")&&!e.closest(".no-copy"))){let c=e.closest("pre");c.id=`__code_${Fa++}`;let l=wn(c.id);c.insertBefore(l,e),G("content.tooltips")&&a.push(pt(l,{viewport$}))}let s=e.closest(".highlight");if(s instanceof HTMLElement){let c=kn(s);if(typeof c!="undefined"&&(s.classList.contains("annotate")||G("content.code.annotate"))){let l=fr(c,e,t);a.push(ge(s).pipe(U(i),m(({width:f,height:u})=>f&&u),K(),v(f=>f?l:M)))}}return $(":scope > span[id]",e).length&&e.classList.add("md-code__content"),ja(e).pipe(y(c=>n.next(c)),L(()=>n.complete()),m(c=>R({ref:e},c)),Pe(...a))});return G("content.lazy")?Tt(e).pipe(b(n=>n),we(1),v(()=>o)):o}function Wa(e,{target$:t,print$:r}){let o=!0;return S(t.pipe(m(n=>n.closest("details:not([open])")),b(n=>e===n),m(()=>({action:"open",reveal:!0}))),r.pipe(b(n=>n||!o),y(()=>o=e.open),m(n=>({action:n?"open":"close"}))))}function Pn(e,t){return C(()=>{let r=new g;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),Wa(e,t).pipe(y(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))})}var Rn=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:#0000}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel rect,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel rect{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color);stroke-width:.05rem}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}g #flowchart-circleEnd,g #flowchart-circleStart,g #flowchart-crossEnd,g #flowchart-crossStart,g #flowchart-pointEnd,g #flowchart-pointStart{stroke:none}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs #classDiagram-compositionEnd,defs #classDiagram-compositionStart,defs #classDiagram-dependencyEnd,defs #classDiagram-dependencyStart,defs #classDiagram-extensionEnd,defs #classDiagram-extensionStart{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs #classDiagram-aggregationEnd,defs #classDiagram-aggregationStart{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel,.nodeLabel p{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}.attributeBoxEven,.attributeBoxOdd{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityBox{fill:var(--md-mermaid-label-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityLabel{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.relationshipLabelBox{fill:var(--md-mermaid-label-bg-color);fill-opacity:1;background-color:var(--md-mermaid-label-bg-color);opacity:1}.relationshipLabel{fill:var(--md-mermaid-label-fg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs #ONE_OR_MORE_END *,defs #ONE_OR_MORE_START *,defs #ONLY_ONE_END *,defs #ONLY_ONE_START *,defs #ZERO_OR_MORE_END *,defs #ZERO_OR_MORE_START *,defs #ZERO_OR_ONE_END *,defs #ZERO_OR_ONE_START *{stroke:var(--md-mermaid-edge-color)!important}defs #ZERO_OR_MORE_END circle,defs #ZERO_OR_MORE_START circle{fill:var(--md-mermaid-label-bg-color)}.actor{fill:var(--md-mermaid-sequence-actor-bg-color);stroke:var(--md-mermaid-sequence-actor-border-color)}text.actor>tspan{fill:var(--md-mermaid-sequence-actor-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-mermaid-sequence-actor-line-color)}.actor-man circle,.actor-man line{fill:var(--md-mermaid-sequence-actorman-bg-color);stroke:var(--md-mermaid-sequence-actorman-line-color)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-sequence-message-line-color)}.note{fill:var(--md-mermaid-sequence-note-bg-color);stroke:var(--md-mermaid-sequence-note-border-color)}.loopText,.loopText>tspan,.messageText,.noteText>tspan{stroke:none;font-family:var(--md-mermaid-font-family)!important}.messageText{fill:var(--md-mermaid-sequence-message-fg-color)}.loopText,.loopText>tspan{fill:var(--md-mermaid-sequence-loop-fg-color)}.noteText>tspan{fill:var(--md-mermaid-sequence-note-fg-color)}#arrowhead path{fill:var(--md-mermaid-sequence-message-line-color);stroke:none}.loopLine{fill:var(--md-mermaid-sequence-loop-bg-color);stroke:var(--md-mermaid-sequence-loop-border-color)}.labelBox{fill:var(--md-mermaid-sequence-label-bg-color);stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-sequence-label-fg-color);font-family:var(--md-mermaid-font-family)}.sequenceNumber{fill:var(--md-mermaid-sequence-number-fg-color)}rect.rect{fill:var(--md-mermaid-sequence-box-bg-color);stroke:none}rect.rect+text.text{fill:var(--md-mermaid-sequence-box-fg-color)}defs #sequencenumber{fill:var(--md-mermaid-sequence-number-bg-color)!important}";var Br,Da=0;function Va(){return typeof mermaid=="undefined"||mermaid instanceof Element?Et("https://unpkg.com/mermaid@10.7.0/dist/mermaid.min.js"):I(void 0)}function In(e){return e.classList.remove("mermaid"),Br||(Br=Va().pipe(y(()=>mermaid.initialize({startOnLoad:!1,themeCSS:Rn,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),B(1))),Br.subscribe(()=>ao(this,null,function*(){e.classList.add("mermaid");let t=`__mermaid_${Da++}`,r=E("div",{class:"mermaid"}),o=e.textContent,{svg:n,fn:i}=yield mermaid.render(t,o),a=r.attachShadow({mode:"closed"});a.innerHTML=n,e.replaceWith(r),i==null||i(a)})),Br.pipe(m(()=>({ref:e})))}var Fn=E("table");function jn(e){return e.replaceWith(Fn),Fn.replaceWith(On(e)),I({ref:e})}function Na(e){let t=e.find(r=>r.checked)||e[0];return S(...e.map(r=>d(r,"change").pipe(m(()=>P(`label[for="${r.id}"]`))))).pipe(Q(P(`label[for="${t.id}"]`)),m(r=>({active:r})))}function Wn(e,{viewport$:t,target$:r}){let o=P(".tabbed-labels",e),n=$(":scope > input",e),i=Qr("prev");e.append(i);let a=Qr("next");return e.append(a),C(()=>{let s=new g,p=s.pipe(X(),ne(!0));z([s,ge(e)]).pipe(U(p),Le(1,me)).subscribe({next([{active:c},l]){let f=Ue(c),{width:u}=ce(c);e.style.setProperty("--md-indicator-x",`${f.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let h=pr(o);(f.xh.x+l.width)&&o.scrollTo({left:Math.max(0,f.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),z([De(o),ge(o)]).pipe(U(p)).subscribe(([c,l])=>{let f=wt(o);i.hidden=c.x<16,a.hidden=c.x>f.width-l.width-16}),S(d(i,"click").pipe(m(()=>-1)),d(a,"click").pipe(m(()=>1))).pipe(U(p)).subscribe(c=>{let{width:l}=ce(o);o.scrollBy({left:l*c,behavior:"smooth"})}),r.pipe(U(p),b(c=>n.includes(c))).subscribe(c=>c.click()),o.classList.add("tabbed-labels--linked");for(let c of n){let l=P(`label[for="${c.id}"]`);l.replaceChildren(E("a",{href:`#${l.htmlFor}`,tabIndex:-1},...Array.from(l.childNodes))),d(l.firstElementChild,"click").pipe(U(p),b(f=>!(f.metaKey||f.ctrlKey)),y(f=>{f.preventDefault(),f.stopPropagation()})).subscribe(()=>{history.replaceState({},"",`#${l.htmlFor}`),l.click()})}return G("content.tabs.link")&&s.pipe(Ce(1),ee(t)).subscribe(([{active:c},{offset:l}])=>{let f=c.innerText.trim();if(c.hasAttribute("data-md-switching"))c.removeAttribute("data-md-switching");else{let u=e.offsetTop-l.y;for(let w of $("[data-tabs]"))for(let A of $(":scope > input",w)){let te=P(`label[for="${A.id}"]`);if(te!==c&&te.innerText.trim()===f){te.setAttribute("data-md-switching",""),A.click();break}}window.scrollTo({top:e.offsetTop-u});let h=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([f,...h])])}}),s.pipe(U(p)).subscribe(()=>{for(let c of $("audio, video",e))c.pause()}),Na(n).pipe(y(c=>s.next(c)),L(()=>s.complete()),m(c=>R({ref:e},c)))}).pipe(Qe(se))}function Un(e,{viewport$:t,target$:r,print$:o}){return S(...$(".annotate:not(.highlight)",e).map(n=>Cn(n,{target$:r,print$:o})),...$("pre:not(.mermaid) > code",e).map(n=>$n(n,{target$:r,print$:o})),...$("pre.mermaid",e).map(n=>In(n)),...$("table:not([class])",e).map(n=>jn(n)),...$("details",e).map(n=>Pn(n,{target$:r,print$:o})),...$("[data-tabs]",e).map(n=>Wn(n,{viewport$:t,target$:r})),...$("[title]",e).filter(()=>G("content.tooltips")).map(n=>pt(n,{viewport$:t})))}function za(e,{alert$:t}){return t.pipe(v(r=>S(I(!0),I(!1).pipe(Ge(2e3))).pipe(m(o=>({message:r,active:o})))))}function Dn(e,t){let r=P(".md-typeset",e);return C(()=>{let o=new g;return o.subscribe(({message:n,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=n}),za(e,t).pipe(y(n=>o.next(n)),L(()=>o.complete()),m(n=>R({ref:e},n)))})}var qa=0;function Qa(e,t){document.body.append(e);let{width:r}=ce(e);e.style.setProperty("--md-tooltip-width",`${r}px`),e.remove();let o=cr(t),n=typeof o!="undefined"?De(o):I({x:0,y:0}),i=S(et(t),kt(t)).pipe(K());return z([i,n]).pipe(m(([a,s])=>{let{x:p,y:c}=Ue(t),l=ce(t),f=t.closest("table");return f&&t.parentElement&&(p+=f.offsetLeft+t.parentElement.offsetLeft,c+=f.offsetTop+t.parentElement.offsetTop),{active:a,offset:{x:p-s.x+l.width/2-r/2,y:c-s.y+l.height+8}}}))}function Vn(e){let t=e.title;if(!t.length)return M;let r=`__tooltip_${qa++}`,o=Pt(r,"inline"),n=P(".md-typeset",o);return n.innerHTML=t,C(()=>{let i=new g;return i.subscribe({next({offset:a}){o.style.setProperty("--md-tooltip-x",`${a.x}px`),o.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){o.style.removeProperty("--md-tooltip-x"),o.style.removeProperty("--md-tooltip-y")}}),S(i.pipe(b(({active:a})=>a)),i.pipe(_e(250),b(({active:a})=>!a))).subscribe({next({active:a}){a?(e.insertAdjacentElement("afterend",o),e.setAttribute("aria-describedby",r),e.removeAttribute("title")):(o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t))},complete(){o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t)}}),i.pipe(Le(16,me)).subscribe(({active:a})=>{o.classList.toggle("md-tooltip--active",a)}),i.pipe(st(125,me),b(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?o.style.setProperty("--md-tooltip-0",`${-a}px`):o.style.removeProperty("--md-tooltip-0")},complete(){o.style.removeProperty("--md-tooltip-0")}}),Qa(o,e).pipe(y(a=>i.next(a)),L(()=>i.complete()),m(a=>R({ref:e},a)))}).pipe(Qe(se))}function Ka({viewport$:e}){if(!G("header.autohide"))return I(!1);let t=e.pipe(m(({offset:{y:n}})=>n),Ye(2,1),m(([n,i])=>[nMath.abs(i-n.y)>100),m(([,[n]])=>n),K()),o=Ve("search");return z([e,o]).pipe(m(([{offset:n},i])=>n.y>400&&!i),K(),v(n=>n?r:I(!1)),Q(!1))}function Nn(e,t){return C(()=>z([ge(e),Ka(t)])).pipe(m(([{height:r},o])=>({height:r,hidden:o})),K((r,o)=>r.height===o.height&&r.hidden===o.hidden),B(1))}function zn(e,{header$:t,main$:r}){return C(()=>{let o=new g,n=o.pipe(X(),ne(!0));o.pipe(Z("active"),We(t)).subscribe(([{active:a},{hidden:s}])=>{e.classList.toggle("md-header--shadow",a&&!s),e.hidden=s});let i=ue($("[title]",e)).pipe(b(()=>G("content.tooltips")),oe(a=>Vn(a)));return r.subscribe(o),t.pipe(U(n),m(a=>R({ref:e},a)),Pe(i.pipe(U(n))))})}function Ya(e,{viewport$:t,header$:r}){return mr(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:o}})=>{let{height:n}=ce(e);return{active:o>=n}}),Z("active"))}function qn(e,t){return C(()=>{let r=new g;r.subscribe({next({active:n}){e.classList.toggle("md-header__title--active",n)},complete(){e.classList.remove("md-header__title--active")}});let o=fe(".md-content h1");return typeof o=="undefined"?M:Ya(o,t).pipe(y(n=>r.next(n)),L(()=>r.complete()),m(n=>R({ref:e},n)))})}function Qn(e,{viewport$:t,header$:r}){let o=r.pipe(m(({height:i})=>i),K()),n=o.pipe(v(()=>ge(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),Z("bottom"))));return z([o,n,t]).pipe(m(([i,{top:a,bottom:s},{offset:{y:p},size:{height:c}}])=>(c=Math.max(0,c-Math.max(0,a-p,i)-Math.max(0,c+p-s)),{offset:a-i,height:c,active:a-i<=p})),K((i,a)=>i.offset===a.offset&&i.height===a.height&&i.active===a.active))}function Ba(e){let t=__md_get("__palette")||{index:e.findIndex(o=>matchMedia(o.getAttribute("data-md-color-media")).matches)},r=Math.max(0,Math.min(t.index,e.length-1));return I(...e).pipe(oe(o=>d(o,"change").pipe(m(()=>o))),Q(e[r]),m(o=>({index:e.indexOf(o),color:{media:o.getAttribute("data-md-color-media"),scheme:o.getAttribute("data-md-color-scheme"),primary:o.getAttribute("data-md-color-primary"),accent:o.getAttribute("data-md-color-accent")}})),B(1))}function Kn(e){let t=$("input",e),r=E("meta",{name:"theme-color"});document.head.appendChild(r);let o=E("meta",{name:"color-scheme"});document.head.appendChild(o);let n=$t("(prefers-color-scheme: light)");return C(()=>{let i=new g;return i.subscribe(a=>{if(document.body.setAttribute("data-md-color-switching",""),a.color.media==="(prefers-color-scheme)"){let s=matchMedia("(prefers-color-scheme: light)"),p=document.querySelector(s.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");a.color.scheme=p.getAttribute("data-md-color-scheme"),a.color.primary=p.getAttribute("data-md-color-primary"),a.color.accent=p.getAttribute("data-md-color-accent")}for(let[s,p]of Object.entries(a.color))document.body.setAttribute(`data-md-color-${s}`,p);for(let s=0;sa.key==="Enter"),ee(i,(a,s)=>s)).subscribe(({index:a})=>{a=(a+1)%t.length,t[a].click(),t[a].focus()}),i.pipe(m(()=>{let a=Se("header"),s=window.getComputedStyle(a);return o.content=s.colorScheme,s.backgroundColor.match(/\d+/g).map(p=>(+p).toString(16).padStart(2,"0")).join("")})).subscribe(a=>r.content=`#${a}`),i.pipe(be(se)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")}),Ba(t).pipe(U(n.pipe(Ce(1))),at(),y(a=>i.next(a)),L(()=>i.complete()),m(a=>R({ref:e},a)))})}function Yn(e,{progress$:t}){return C(()=>{let r=new g;return r.subscribe(({value:o})=>{e.style.setProperty("--md-progress-value",`${o}`)}),t.pipe(y(o=>r.next({value:o})),L(()=>r.complete()),m(o=>({ref:e,value:o})))})}var Gr=Vt(Yr());function Ga(e){e.setAttribute("data-md-copying","");let t=e.closest("[data-copy]"),r=t?t.getAttribute("data-copy"):e.innerText;return e.removeAttribute("data-md-copying"),r.trimEnd()}function Bn({alert$:e}){Gr.default.isSupported()&&new F(t=>{new Gr.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||Ga(P(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(y(t=>{t.trigger.focus()}),m(()=>ye("clipboard.copied"))).subscribe(e)}function Gn(e,t){return e.protocol=t.protocol,e.hostname=t.hostname,e}function Ja(e,t){let r=new Map;for(let o of $("url",e)){let n=P("loc",o),i=[Gn(new URL(n.textContent),t)];r.set(`${i[0]}`,i);for(let a of $("[rel=alternate]",o)){let s=a.getAttribute("href");s!=null&&i.push(Gn(new URL(s),t))}}return r}function ur(e){return mn(new URL("sitemap.xml",e)).pipe(m(t=>Ja(t,new URL(e))),ve(()=>I(new Map)))}function Xa(e,t){if(!(e.target instanceof Element))return M;let r=e.target.closest("a");if(r===null)return M;if(r.target||e.metaKey||e.ctrlKey)return M;let o=new URL(r.href);return o.search=o.hash="",t.has(`${o}`)?(e.preventDefault(),I(new URL(r.href))):M}function Jn(e){let t=new Map;for(let r of $(":scope > *",e.head))t.set(r.outerHTML,r);return t}function Xn(e){for(let t of $("[href], [src]",e))for(let r of["href","src"]){let o=t.getAttribute(r);if(o&&!/^(?:[a-z]+:)?\/\//i.test(o)){t[r]=t[r];break}}return I(e)}function Za(e){for(let o of["[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...G("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let n=fe(o),i=fe(o,e);typeof n!="undefined"&&typeof i!="undefined"&&n.replaceWith(i)}let t=Jn(document);for(let[o,n]of Jn(e))t.has(o)?t.delete(o):document.head.appendChild(n);for(let o of t.values()){let n=o.getAttribute("name");n!=="theme-color"&&n!=="color-scheme"&&o.remove()}let r=Se("container");return je($("script",r)).pipe(v(o=>{let n=e.createElement("script");if(o.src){for(let i of o.getAttributeNames())n.setAttribute(i,o.getAttribute(i));return o.replaceWith(n),new F(i=>{n.onload=()=>i.complete()})}else return n.textContent=o.textContent,o.replaceWith(n),M}),X(),ne(document))}function Zn({location$:e,viewport$:t,progress$:r}){let o=Te();if(location.protocol==="file:")return M;let n=ur(o.base);I(document).subscribe(Xn);let i=d(document.body,"click").pipe(We(n),v(([p,c])=>Xa(p,c)),pe()),a=d(window,"popstate").pipe(m(xe),pe());i.pipe(ee(t)).subscribe(([p,{offset:c}])=>{history.replaceState(c,""),history.pushState(null,"",p)}),S(i,a).subscribe(e);let s=e.pipe(Z("pathname"),v(p=>ln(p,{progress$:r}).pipe(ve(()=>(ct(p,!0),M)))),v(Xn),v(Za),pe());return S(s.pipe(ee(e,(p,c)=>c)),e.pipe(Z("pathname"),v(()=>e),Z("hash")),e.pipe(K((p,c)=>p.pathname===c.pathname&&p.hash===c.hash),v(()=>i),y(()=>history.back()))).subscribe(p=>{var c,l;history.state!==null||!p.hash?window.scrollTo(0,(l=(c=history.state)==null?void 0:c.y)!=null?l:0):(history.scrollRestoration="auto",sn(p.hash),history.scrollRestoration="manual")}),e.subscribe(()=>{history.scrollRestoration="manual"}),d(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),t.pipe(Z("offset"),_e(100)).subscribe(({offset:p})=>{history.replaceState(p,"")}),s}var ri=Vt(ti());function oi(e){let t=e.separator.split("|").map(n=>n.replace(/(\(\?[!=<][^)]+\))/g,"").length===0?"\uFFFD":n).join("|"),r=new RegExp(t,"img"),o=(n,i,a)=>`${i}${a}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator}|)(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return a=>(0,ri.default)(a).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function It(e){return e.type===1}function dr(e){return e.type===3}function ni(e,t){let r=vn(e);return S(I(location.protocol!=="file:"),Ve("search")).pipe(Ae(o=>o),v(()=>t)).subscribe(({config:o,docs:n})=>r.next({type:0,data:{config:o,docs:n,options:{suggest:G("search.suggest")}}})),r}function ii({document$:e}){let t=Te(),r=Ne(new URL("../versions.json",t.base)).pipe(ve(()=>M)),o=r.pipe(m(n=>{let[,i]=t.base.match(/([^/]+)\/?$/);return n.find(({version:a,aliases:s})=>a===i||s.includes(i))||n[0]}));r.pipe(m(n=>new Map(n.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),v(n=>d(document.body,"click").pipe(b(i=>!i.metaKey&&!i.ctrlKey),ee(o),v(([i,a])=>{if(i.target instanceof Element){let s=i.target.closest("a");if(s&&!s.target&&n.has(s.href)){let p=s.href;return!i.target.closest(".md-version")&&n.get(p)===a?M:(i.preventDefault(),I(p))}}return M}),v(i=>{let{version:a}=n.get(i);return ur(new URL(i)).pipe(m(s=>{let c=xe().href.replace(t.base,"");return s.has(c.split("#")[0])?new URL(`../${a}/${c}`,t.base):new URL(i)}))})))).subscribe(n=>ct(n,!0)),z([r,o]).subscribe(([n,i])=>{P(".md-header__topic").appendChild(Mn(n,i))}),e.pipe(v(()=>o)).subscribe(n=>{var a;let i=__md_get("__outdated",sessionStorage);if(i===null){i=!0;let s=((a=t.version)==null?void 0:a.default)||"latest";Array.isArray(s)||(s=[s]);e:for(let p of s)for(let c of n.aliases.concat(n.version))if(new RegExp(p,"i").test(c)){i=!1;break e}__md_set("__outdated",i,sessionStorage)}if(i)for(let s of ae("outdated"))s.hidden=!1})}function ns(e,{worker$:t}){let{searchParams:r}=xe();r.has("q")&&(Je("search",!0),e.value=r.get("q"),e.focus(),Ve("search").pipe(Ae(i=>!i)).subscribe(()=>{let i=xe();i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=et(e),n=S(t.pipe(Ae(It)),d(e,"keyup"),o).pipe(m(()=>e.value),K());return z([n,o]).pipe(m(([i,a])=>({value:i,focus:a})),B(1))}function ai(e,{worker$:t}){let r=new g,o=r.pipe(X(),ne(!0));z([t.pipe(Ae(It)),r],(i,a)=>a).pipe(Z("value")).subscribe(({value:i})=>t.next({type:2,data:i})),r.pipe(Z("focus")).subscribe(({focus:i})=>{i&&Je("search",i)}),d(e.form,"reset").pipe(U(o)).subscribe(()=>e.focus());let n=P("header [for=__search]");return d(n,"click").subscribe(()=>e.focus()),ns(e,{worker$:t}).pipe(y(i=>r.next(i)),L(()=>r.complete()),m(i=>R({ref:e},i)),B(1))}function si(e,{worker$:t,query$:r}){let o=new g,n=tn(e.parentElement).pipe(b(Boolean)),i=e.parentElement,a=P(":scope > :first-child",e),s=P(":scope > :last-child",e);Ve("search").subscribe(l=>s.setAttribute("role",l?"list":"presentation")),o.pipe(ee(r),Ur(t.pipe(Ae(It)))).subscribe(([{items:l},{value:f}])=>{switch(l.length){case 0:a.textContent=f.length?ye("search.result.none"):ye("search.result.placeholder");break;case 1:a.textContent=ye("search.result.one");break;default:let u=sr(l.length);a.textContent=ye("search.result.other",u)}});let p=o.pipe(y(()=>s.innerHTML=""),v(({items:l})=>S(I(...l.slice(0,10)),I(...l.slice(10)).pipe(Ye(4),Vr(n),v(([f])=>f)))),m(Tn),pe());return p.subscribe(l=>s.appendChild(l)),p.pipe(oe(l=>{let f=fe("details",l);return typeof f=="undefined"?M:d(f,"toggle").pipe(U(o),m(()=>f))})).subscribe(l=>{l.open===!1&&l.offsetTop<=i.scrollTop&&i.scrollTo({top:l.offsetTop})}),t.pipe(b(dr),m(({data:l})=>l)).pipe(y(l=>o.next(l)),L(()=>o.complete()),m(l=>R({ref:e},l)))}function is(e,{query$:t}){return t.pipe(m(({value:r})=>{let o=xe();return o.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),o.search=`q=${r}`,{url:o}}))}function ci(e,t){let r=new g,o=r.pipe(X(),ne(!0));return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),d(e,"click").pipe(U(o)).subscribe(n=>n.preventDefault()),is(e,t).pipe(y(n=>r.next(n)),L(()=>r.complete()),m(n=>R({ref:e},n)))}function pi(e,{worker$:t,keyboard$:r}){let o=new g,n=Se("search-query"),i=S(d(n,"keydown"),d(n,"focus")).pipe(be(se),m(()=>n.value),K());return o.pipe(We(i),m(([{suggest:s},p])=>{let c=p.split(/([\s-]+)/);if(s!=null&&s.length&&c[c.length-1]){let l=s[s.length-1];l.startsWith(c[c.length-1])&&(c[c.length-1]=l)}else c.length=0;return c})).subscribe(s=>e.innerHTML=s.join("").replace(/\s/g," ")),r.pipe(b(({mode:s})=>s==="search")).subscribe(s=>{switch(s.type){case"ArrowRight":e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText);break}}),t.pipe(b(dr),m(({data:s})=>s)).pipe(y(s=>o.next(s)),L(()=>o.complete()),m(()=>({ref:e})))}function li(e,{index$:t,keyboard$:r}){let o=Te();try{let n=ni(o.search,t),i=Se("search-query",e),a=Se("search-result",e);d(e,"click").pipe(b(({target:p})=>p instanceof Element&&!!p.closest("a"))).subscribe(()=>Je("search",!1)),r.pipe(b(({mode:p})=>p==="search")).subscribe(p=>{let c=Re();switch(p.type){case"Enter":if(c===i){let l=new Map;for(let f of $(":first-child [href]",a)){let u=f.firstElementChild;l.set(f,parseFloat(u.getAttribute("data-md-score")))}if(l.size){let[[f]]=[...l].sort(([,u],[,h])=>h-u);f.click()}p.claim()}break;case"Escape":case"Tab":Je("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof c=="undefined")i.focus();else{let l=[i,...$(":not(details) > [href], summary, details[open] [href]",a)],f=Math.max(0,(Math.max(0,l.indexOf(c))+l.length+(p.type==="ArrowUp"?-1:1))%l.length);l[f].focus()}p.claim();break;default:i!==Re()&&i.focus()}}),r.pipe(b(({mode:p})=>p==="global")).subscribe(p=>{switch(p.type){case"f":case"s":case"/":i.focus(),i.select(),p.claim();break}});let s=ai(i,{worker$:n});return S(s,si(a,{worker$:n,query$:s})).pipe(Pe(...ae("search-share",e).map(p=>ci(p,{query$:s})),...ae("search-suggest",e).map(p=>pi(p,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,Ke}}function mi(e,{index$:t,location$:r}){return z([t,r.pipe(Q(xe()),b(o=>!!o.searchParams.get("h")))]).pipe(m(([o,n])=>oi(o.config)(n.searchParams.get("h"))),m(o=>{var a;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let s=i.nextNode();s;s=i.nextNode())if((a=s.parentElement)!=null&&a.offsetHeight){let p=s.textContent,c=o(p);c.length>p.length&&n.set(s,c)}for(let[s,p]of n){let{childNodes:c}=E("span",null,p);s.replaceWith(...Array.from(c))}return{ref:e,nodes:n}}))}function as(e,{viewport$:t,main$:r}){let o=e.closest(".md-grid"),n=o.offsetTop-o.parentElement.offsetTop;return z([r,t]).pipe(m(([{offset:i,height:a},{offset:{y:s}}])=>(a=a+Math.min(n,Math.max(0,s-i))-n,{height:a,locked:s>=i+n})),K((i,a)=>i.height===a.height&&i.locked===a.locked))}function Jr(e,o){var n=o,{header$:t}=n,r=io(n,["header$"]);let i=P(".md-sidebar__scrollwrap",e),{y:a}=Ue(i);return C(()=>{let s=new g,p=s.pipe(X(),ne(!0)),c=s.pipe(Le(0,me));return c.pipe(ee(t)).subscribe({next([{height:l},{height:f}]){i.style.height=`${l-2*a}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),c.pipe(Ae()).subscribe(()=>{for(let l of $(".md-nav__link--active[href]",e)){if(!l.clientHeight)continue;let f=l.closest(".md-sidebar__scrollwrap");if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:h}=ce(f);f.scrollTo({top:u-h/2})}}}),ue($("label[tabindex]",e)).pipe(oe(l=>d(l,"click").pipe(be(se),m(()=>l),U(p)))).subscribe(l=>{let f=P(`[id="${l.htmlFor}"]`);P(`[aria-labelledby="${l.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),as(e,r).pipe(y(l=>s.next(l)),L(()=>s.complete()),m(l=>R({ref:e},l)))})}function fi(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return Ct(Ne(`${r}/releases/latest`).pipe(ve(()=>M),m(o=>({version:o.tag_name})),Be({})),Ne(r).pipe(ve(()=>M),m(o=>({stars:o.stargazers_count,forks:o.forks_count})),Be({}))).pipe(m(([o,n])=>R(R({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return Ne(r).pipe(m(o=>({repositories:o.public_repos})),Be({}))}}function ui(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return Ne(r).pipe(ve(()=>M),m(({star_count:o,forks_count:n})=>({stars:o,forks:n})),Be({}))}function di(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return fi(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return ui(r,o)}return M}var ss;function cs(e){return ss||(ss=C(()=>{let t=__md_get("__source",sessionStorage);if(t)return I(t);if(ae("consent").length){let o=__md_get("__consent");if(!(o&&o.github))return M}return di(e.href).pipe(y(o=>__md_set("__source",o,sessionStorage)))}).pipe(ve(()=>M),b(t=>Object.keys(t).length>0),m(t=>({facts:t})),B(1)))}function hi(e){let t=P(":scope > :last-child",e);return C(()=>{let r=new g;return r.subscribe(({facts:o})=>{t.appendChild(Sn(o)),t.classList.add("md-source__repository--active")}),cs(e).pipe(y(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))})}function ps(e,{viewport$:t,header$:r}){return ge(document.body).pipe(v(()=>mr(e,{header$:r,viewport$:t})),m(({offset:{y:o}})=>({hidden:o>=10})),Z("hidden"))}function bi(e,t){return C(()=>{let r=new g;return r.subscribe({next({hidden:o}){e.hidden=o},complete(){e.hidden=!1}}),(G("navigation.tabs.sticky")?I({hidden:!1}):ps(e,t)).pipe(y(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))})}function ls(e,{viewport$:t,header$:r}){let o=new Map,n=$(".md-nav__link",e);for(let s of n){let p=decodeURIComponent(s.hash.substring(1)),c=fe(`[id="${p}"]`);typeof c!="undefined"&&o.set(s,c)}let i=r.pipe(Z("height"),m(({height:s})=>{let p=Se("main"),c=P(":scope > :first-child",p);return s+.8*(c.offsetTop-p.offsetTop)}),pe());return ge(document.body).pipe(Z("height"),v(s=>C(()=>{let p=[];return I([...o].reduce((c,[l,f])=>{for(;p.length&&o.get(p[p.length-1]).tagName>=f.tagName;)p.pop();let u=f.offsetTop;for(;!u&&f.parentElement;)f=f.parentElement,u=f.offsetTop;let h=f.offsetParent;for(;h;h=h.offsetParent)u+=h.offsetTop;return c.set([...p=[...p,l]].reverse(),u)},new Map))}).pipe(m(p=>new Map([...p].sort(([,c],[,l])=>c-l))),We(i),v(([p,c])=>t.pipe(jr(([l,f],{offset:{y:u},size:h})=>{let w=u+h.height>=Math.floor(s.height);for(;f.length;){let[,A]=f[0];if(A-c=u&&!w)f=[l.pop(),...f];else break}return[l,f]},[[],[...p]]),K((l,f)=>l[0]===f[0]&&l[1]===f[1])))))).pipe(m(([s,p])=>({prev:s.map(([c])=>c),next:p.map(([c])=>c)})),Q({prev:[],next:[]}),Ye(2,1),m(([s,p])=>s.prev.length{let i=new g,a=i.pipe(X(),ne(!0));if(i.subscribe(({prev:s,next:p})=>{for(let[c]of p)c.classList.remove("md-nav__link--passed"),c.classList.remove("md-nav__link--active");for(let[c,[l]]of s.entries())l.classList.add("md-nav__link--passed"),l.classList.toggle("md-nav__link--active",c===s.length-1)}),G("toc.follow")){let s=S(t.pipe(_e(1),m(()=>{})),t.pipe(_e(250),m(()=>"smooth")));i.pipe(b(({prev:p})=>p.length>0),We(o.pipe(be(se))),ee(s)).subscribe(([[{prev:p}],c])=>{let[l]=p[p.length-1];if(l.offsetHeight){let f=cr(l);if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:h}=ce(f);f.scrollTo({top:u-h/2,behavior:c})}}})}return G("navigation.tracking")&&t.pipe(U(a),Z("offset"),_e(250),Ce(1),U(n.pipe(Ce(1))),at({delay:250}),ee(i)).subscribe(([,{prev:s}])=>{let p=xe(),c=s[s.length-1];if(c&&c.length){let[l]=c,{hash:f}=new URL(l.href);p.hash!==f&&(p.hash=f,history.replaceState({},"",`${p}`))}else p.hash="",history.replaceState({},"",`${p}`)}),ls(e,{viewport$:t,header$:r}).pipe(y(s=>i.next(s)),L(()=>i.complete()),m(s=>R({ref:e},s)))})}function ms(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(m(({offset:{y:a}})=>a),Ye(2,1),m(([a,s])=>a>s&&s>0),K()),i=r.pipe(m(({active:a})=>a));return z([i,n]).pipe(m(([a,s])=>!(a&&s)),K(),U(o.pipe(Ce(1))),ne(!0),at({delay:250}),m(a=>({hidden:a})))}function gi(e,{viewport$:t,header$:r,main$:o,target$:n}){let i=new g,a=i.pipe(X(),ne(!0));return i.subscribe({next({hidden:s}){e.hidden=s,s?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(U(a),Z("height")).subscribe(({height:s})=>{e.style.top=`${s+16}px`}),d(e,"click").subscribe(s=>{s.preventDefault(),window.scrollTo({top:0})}),ms(e,{viewport$:t,main$:o,target$:n}).pipe(y(s=>i.next(s)),L(()=>i.complete()),m(s=>R({ref:e},s)))}function xi({document$:e,viewport$:t}){e.pipe(v(()=>$(".md-ellipsis")),oe(r=>Tt(r).pipe(U(e.pipe(Ce(1))),b(o=>o),m(()=>r),we(1))),b(r=>r.offsetWidth{let o=r.innerText,n=r.closest("a")||r;return n.title=o,pt(n,{viewport$:t}).pipe(U(e.pipe(Ce(1))),L(()=>n.removeAttribute("title")))})).subscribe(),e.pipe(v(()=>$(".md-status")),oe(r=>pt(r,{viewport$:t}))).subscribe()}function yi({document$:e,tablet$:t}){e.pipe(v(()=>$(".md-toggle--indeterminate")),y(r=>{r.indeterminate=!0,r.checked=!1}),oe(r=>d(r,"change").pipe(Dr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),ee(t)).subscribe(([r,o])=>{r.classList.remove("md-toggle--indeterminate"),o&&(r.checked=!1)})}function fs(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function Ei({document$:e}){e.pipe(v(()=>$("[data-md-scrollfix]")),y(t=>t.removeAttribute("data-md-scrollfix")),b(fs),oe(t=>d(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function wi({viewport$:e,tablet$:t}){z([Ve("search"),t]).pipe(m(([r,o])=>r&&!o),v(r=>I(r).pipe(Ge(r?400:100))),ee(e)).subscribe(([r,{offset:{y:o}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${o}px`;else{let n=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",n&&window.scrollTo(0,n)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let o=e[r];typeof o=="string"?o=document.createTextNode(o):o.parentNode&&o.parentNode.removeChild(o),r?t.insertBefore(this.previousSibling,o):t.replaceChild(o,this)}}}));function us(){return location.protocol==="file:"?Et(`${new URL("search/search_index.js",Xr.base)}`).pipe(m(()=>__index),B(1)):Ne(new URL("search/search_index.json",Xr.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var rt=Yo(),jt=nn(),Ot=cn(jt),Zr=on(),Oe=bn(),hr=$t("(min-width: 960px)"),Si=$t("(min-width: 1220px)"),Oi=pn(),Xr=Te(),Mi=document.forms.namedItem("search")?us():Ke,eo=new g;Bn({alert$:eo});var to=new g;G("navigation.instant")&&Zn({location$:jt,viewport$:Oe,progress$:to}).subscribe(rt);var Ti;((Ti=Xr.version)==null?void 0:Ti.provider)==="mike"&&ii({document$:rt});S(jt,Ot).pipe(Ge(125)).subscribe(()=>{Je("drawer",!1),Je("search",!1)});Zr.pipe(b(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=fe("link[rel=prev]");typeof t!="undefined"&&ct(t);break;case"n":case".":let r=fe("link[rel=next]");typeof r!="undefined"&&ct(r);break;case"Enter":let o=Re();o instanceof HTMLLabelElement&&o.click()}});xi({viewport$:Oe,document$:rt});yi({document$:rt,tablet$:hr});Ei({document$:rt});wi({viewport$:Oe,tablet$:hr});var tt=Nn(Se("header"),{viewport$:Oe}),Ft=rt.pipe(m(()=>Se("main")),v(e=>Qn(e,{viewport$:Oe,header$:tt})),B(1)),ds=S(...ae("consent").map(e=>xn(e,{target$:Ot})),...ae("dialog").map(e=>Dn(e,{alert$:eo})),...ae("header").map(e=>zn(e,{viewport$:Oe,header$:tt,main$:Ft})),...ae("palette").map(e=>Kn(e)),...ae("progress").map(e=>Yn(e,{progress$:to})),...ae("search").map(e=>li(e,{index$:Mi,keyboard$:Zr})),...ae("source").map(e=>hi(e))),hs=C(()=>S(...ae("announce").map(e=>gn(e)),...ae("content").map(e=>Un(e,{viewport$:Oe,target$:Ot,print$:Oi})),...ae("content").map(e=>G("search.highlight")?mi(e,{index$:Mi,location$:jt}):M),...ae("header-title").map(e=>qn(e,{viewport$:Oe,header$:tt})),...ae("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?Nr(Si,()=>Jr(e,{viewport$:Oe,header$:tt,main$:Ft})):Nr(hr,()=>Jr(e,{viewport$:Oe,header$:tt,main$:Ft}))),...ae("tabs").map(e=>bi(e,{viewport$:Oe,header$:tt})),...ae("toc").map(e=>vi(e,{viewport$:Oe,header$:tt,main$:Ft,target$:Ot})),...ae("top").map(e=>gi(e,{viewport$:Oe,header$:tt,main$:Ft,target$:Ot})))),Li=rt.pipe(v(()=>hs),Pe(ds),B(1));Li.subscribe();window.document$=rt;window.location$=jt;window.target$=Ot;window.keyboard$=Zr;window.viewport$=Oe;window.tablet$=hr;window.screen$=Si;window.print$=Oi;window.alert$=eo;window.progress$=to;window.component$=Li;})(); +//# sourceMappingURL=bundle.3220b9d7.min.js.map + diff --git a/assets/javascripts/bundle.3220b9d7.min.js.map b/assets/javascripts/bundle.3220b9d7.min.js.map new file mode 100644 index 0000000..df36593 --- /dev/null +++ b/assets/javascripts/bundle.3220b9d7.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["node_modules/focus-visible/dist/focus-visible.js", "node_modules/clipboard/dist/clipboard.js", "node_modules/escape-html/index.js", "src/templates/assets/javascripts/bundle.ts", "node_modules/rxjs/node_modules/tslib/tslib.es6.js", "node_modules/rxjs/src/internal/util/isFunction.ts", "node_modules/rxjs/src/internal/util/createErrorClass.ts", "node_modules/rxjs/src/internal/util/UnsubscriptionError.ts", "node_modules/rxjs/src/internal/util/arrRemove.ts", "node_modules/rxjs/src/internal/Subscription.ts", "node_modules/rxjs/src/internal/config.ts", "node_modules/rxjs/src/internal/scheduler/timeoutProvider.ts", "node_modules/rxjs/src/internal/util/reportUnhandledError.ts", "node_modules/rxjs/src/internal/util/noop.ts", "node_modules/rxjs/src/internal/NotificationFactories.ts", "node_modules/rxjs/src/internal/util/errorContext.ts", "node_modules/rxjs/src/internal/Subscriber.ts", "node_modules/rxjs/src/internal/symbol/observable.ts", "node_modules/rxjs/src/internal/util/identity.ts", "node_modules/rxjs/src/internal/util/pipe.ts", "node_modules/rxjs/src/internal/Observable.ts", "node_modules/rxjs/src/internal/util/lift.ts", "node_modules/rxjs/src/internal/operators/OperatorSubscriber.ts", "node_modules/rxjs/src/internal/scheduler/animationFrameProvider.ts", "node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts", "node_modules/rxjs/src/internal/Subject.ts", "node_modules/rxjs/src/internal/BehaviorSubject.ts", "node_modules/rxjs/src/internal/scheduler/dateTimestampProvider.ts", "node_modules/rxjs/src/internal/ReplaySubject.ts", "node_modules/rxjs/src/internal/scheduler/Action.ts", "node_modules/rxjs/src/internal/scheduler/intervalProvider.ts", "node_modules/rxjs/src/internal/scheduler/AsyncAction.ts", "node_modules/rxjs/src/internal/Scheduler.ts", "node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts", "node_modules/rxjs/src/internal/scheduler/async.ts", "node_modules/rxjs/src/internal/scheduler/QueueAction.ts", "node_modules/rxjs/src/internal/scheduler/QueueScheduler.ts", "node_modules/rxjs/src/internal/scheduler/queue.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameAction.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameScheduler.ts", "node_modules/rxjs/src/internal/scheduler/animationFrame.ts", "node_modules/rxjs/src/internal/observable/empty.ts", "node_modules/rxjs/src/internal/util/isScheduler.ts", "node_modules/rxjs/src/internal/util/args.ts", "node_modules/rxjs/src/internal/util/isArrayLike.ts", "node_modules/rxjs/src/internal/util/isPromise.ts", "node_modules/rxjs/src/internal/util/isInteropObservable.ts", "node_modules/rxjs/src/internal/util/isAsyncIterable.ts", "node_modules/rxjs/src/internal/util/throwUnobservableError.ts", "node_modules/rxjs/src/internal/symbol/iterator.ts", "node_modules/rxjs/src/internal/util/isIterable.ts", "node_modules/rxjs/src/internal/util/isReadableStreamLike.ts", "node_modules/rxjs/src/internal/observable/innerFrom.ts", "node_modules/rxjs/src/internal/util/executeSchedule.ts", "node_modules/rxjs/src/internal/operators/observeOn.ts", "node_modules/rxjs/src/internal/operators/subscribeOn.ts", "node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts", "node_modules/rxjs/src/internal/scheduled/schedulePromise.ts", "node_modules/rxjs/src/internal/scheduled/scheduleArray.ts", "node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleAsyncIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleReadableStreamLike.ts", "node_modules/rxjs/src/internal/scheduled/scheduled.ts", "node_modules/rxjs/src/internal/observable/from.ts", "node_modules/rxjs/src/internal/observable/of.ts", "node_modules/rxjs/src/internal/observable/throwError.ts", "node_modules/rxjs/src/internal/util/EmptyError.ts", "node_modules/rxjs/src/internal/util/isDate.ts", "node_modules/rxjs/src/internal/operators/map.ts", "node_modules/rxjs/src/internal/util/mapOneOrManyArgs.ts", "node_modules/rxjs/src/internal/util/argsArgArrayOrObject.ts", "node_modules/rxjs/src/internal/util/createObject.ts", "node_modules/rxjs/src/internal/observable/combineLatest.ts", "node_modules/rxjs/src/internal/operators/mergeInternals.ts", "node_modules/rxjs/src/internal/operators/mergeMap.ts", "node_modules/rxjs/src/internal/operators/mergeAll.ts", "node_modules/rxjs/src/internal/operators/concatAll.ts", "node_modules/rxjs/src/internal/observable/concat.ts", "node_modules/rxjs/src/internal/observable/defer.ts", "node_modules/rxjs/src/internal/observable/fromEvent.ts", "node_modules/rxjs/src/internal/observable/fromEventPattern.ts", "node_modules/rxjs/src/internal/observable/timer.ts", "node_modules/rxjs/src/internal/observable/merge.ts", "node_modules/rxjs/src/internal/observable/never.ts", "node_modules/rxjs/src/internal/util/argsOrArgArray.ts", "node_modules/rxjs/src/internal/operators/filter.ts", "node_modules/rxjs/src/internal/observable/zip.ts", "node_modules/rxjs/src/internal/operators/audit.ts", "node_modules/rxjs/src/internal/operators/auditTime.ts", "node_modules/rxjs/src/internal/operators/bufferCount.ts", "node_modules/rxjs/src/internal/operators/catchError.ts", "node_modules/rxjs/src/internal/operators/scanInternals.ts", "node_modules/rxjs/src/internal/operators/combineLatest.ts", "node_modules/rxjs/src/internal/operators/combineLatestWith.ts", "node_modules/rxjs/src/internal/operators/debounce.ts", "node_modules/rxjs/src/internal/operators/debounceTime.ts", "node_modules/rxjs/src/internal/operators/defaultIfEmpty.ts", "node_modules/rxjs/src/internal/operators/take.ts", "node_modules/rxjs/src/internal/operators/ignoreElements.ts", "node_modules/rxjs/src/internal/operators/mapTo.ts", "node_modules/rxjs/src/internal/operators/delayWhen.ts", "node_modules/rxjs/src/internal/operators/delay.ts", "node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts", "node_modules/rxjs/src/internal/operators/distinctUntilKeyChanged.ts", "node_modules/rxjs/src/internal/operators/throwIfEmpty.ts", "node_modules/rxjs/src/internal/operators/endWith.ts", "node_modules/rxjs/src/internal/operators/finalize.ts", "node_modules/rxjs/src/internal/operators/first.ts", "node_modules/rxjs/src/internal/operators/takeLast.ts", "node_modules/rxjs/src/internal/operators/merge.ts", "node_modules/rxjs/src/internal/operators/mergeWith.ts", "node_modules/rxjs/src/internal/operators/repeat.ts", "node_modules/rxjs/src/internal/operators/scan.ts", "node_modules/rxjs/src/internal/operators/share.ts", "node_modules/rxjs/src/internal/operators/shareReplay.ts", "node_modules/rxjs/src/internal/operators/skip.ts", "node_modules/rxjs/src/internal/operators/skipUntil.ts", "node_modules/rxjs/src/internal/operators/startWith.ts", "node_modules/rxjs/src/internal/operators/switchMap.ts", "node_modules/rxjs/src/internal/operators/takeUntil.ts", "node_modules/rxjs/src/internal/operators/takeWhile.ts", "node_modules/rxjs/src/internal/operators/tap.ts", "node_modules/rxjs/src/internal/operators/throttle.ts", "node_modules/rxjs/src/internal/operators/throttleTime.ts", "node_modules/rxjs/src/internal/operators/withLatestFrom.ts", "node_modules/rxjs/src/internal/operators/zip.ts", "node_modules/rxjs/src/internal/operators/zipWith.ts", "src/templates/assets/javascripts/browser/document/index.ts", "src/templates/assets/javascripts/browser/element/_/index.ts", "src/templates/assets/javascripts/browser/element/focus/index.ts", "src/templates/assets/javascripts/browser/element/hover/index.ts", "src/templates/assets/javascripts/utilities/h/index.ts", "src/templates/assets/javascripts/utilities/round/index.ts", "src/templates/assets/javascripts/browser/script/index.ts", "src/templates/assets/javascripts/browser/element/size/_/index.ts", "src/templates/assets/javascripts/browser/element/size/content/index.ts", "src/templates/assets/javascripts/browser/element/offset/_/index.ts", "src/templates/assets/javascripts/browser/element/offset/content/index.ts", "src/templates/assets/javascripts/browser/element/visibility/index.ts", "src/templates/assets/javascripts/browser/toggle/index.ts", "src/templates/assets/javascripts/browser/keyboard/index.ts", "src/templates/assets/javascripts/browser/location/_/index.ts", "src/templates/assets/javascripts/browser/location/hash/index.ts", "src/templates/assets/javascripts/browser/media/index.ts", "src/templates/assets/javascripts/browser/request/index.ts", "src/templates/assets/javascripts/browser/viewport/offset/index.ts", "src/templates/assets/javascripts/browser/viewport/size/index.ts", "src/templates/assets/javascripts/browser/viewport/_/index.ts", "src/templates/assets/javascripts/browser/viewport/at/index.ts", "src/templates/assets/javascripts/browser/worker/index.ts", "src/templates/assets/javascripts/_/index.ts", "src/templates/assets/javascripts/components/_/index.ts", "src/templates/assets/javascripts/components/announce/index.ts", "src/templates/assets/javascripts/components/consent/index.ts", "src/templates/assets/javascripts/templates/tooltip/index.tsx", "src/templates/assets/javascripts/templates/annotation/index.tsx", "src/templates/assets/javascripts/templates/clipboard/index.tsx", "src/templates/assets/javascripts/templates/search/index.tsx", "src/templates/assets/javascripts/templates/source/index.tsx", "src/templates/assets/javascripts/templates/tabbed/index.tsx", "src/templates/assets/javascripts/templates/table/index.tsx", "src/templates/assets/javascripts/templates/version/index.tsx", "src/templates/assets/javascripts/components/tooltip2/index.ts", "src/templates/assets/javascripts/components/content/annotation/_/index.ts", "src/templates/assets/javascripts/components/content/annotation/list/index.ts", "src/templates/assets/javascripts/components/content/annotation/block/index.ts", "src/templates/assets/javascripts/components/content/code/_/index.ts", "src/templates/assets/javascripts/components/content/details/index.ts", "src/templates/assets/javascripts/components/content/mermaid/index.css", "src/templates/assets/javascripts/components/content/mermaid/index.ts", "src/templates/assets/javascripts/components/content/table/index.ts", "src/templates/assets/javascripts/components/content/tabs/index.ts", "src/templates/assets/javascripts/components/content/_/index.ts", "src/templates/assets/javascripts/components/dialog/index.ts", "src/templates/assets/javascripts/components/tooltip/index.ts", "src/templates/assets/javascripts/components/header/_/index.ts", "src/templates/assets/javascripts/components/header/title/index.ts", "src/templates/assets/javascripts/components/main/index.ts", "src/templates/assets/javascripts/components/palette/index.ts", "src/templates/assets/javascripts/components/progress/index.ts", "src/templates/assets/javascripts/integrations/clipboard/index.ts", "src/templates/assets/javascripts/integrations/sitemap/index.ts", "src/templates/assets/javascripts/integrations/instant/index.ts", "src/templates/assets/javascripts/integrations/search/highlighter/index.ts", "src/templates/assets/javascripts/integrations/search/worker/message/index.ts", "src/templates/assets/javascripts/integrations/search/worker/_/index.ts", "src/templates/assets/javascripts/integrations/version/index.ts", "src/templates/assets/javascripts/components/search/query/index.ts", "src/templates/assets/javascripts/components/search/result/index.ts", "src/templates/assets/javascripts/components/search/share/index.ts", "src/templates/assets/javascripts/components/search/suggest/index.ts", "src/templates/assets/javascripts/components/search/_/index.ts", "src/templates/assets/javascripts/components/search/highlight/index.ts", "src/templates/assets/javascripts/components/sidebar/index.ts", "src/templates/assets/javascripts/components/source/facts/github/index.ts", "src/templates/assets/javascripts/components/source/facts/gitlab/index.ts", "src/templates/assets/javascripts/components/source/facts/_/index.ts", "src/templates/assets/javascripts/components/source/_/index.ts", "src/templates/assets/javascripts/components/tabs/index.ts", "src/templates/assets/javascripts/components/toc/index.ts", "src/templates/assets/javascripts/components/top/index.ts", "src/templates/assets/javascripts/patches/ellipsis/index.ts", "src/templates/assets/javascripts/patches/indeterminate/index.ts", "src/templates/assets/javascripts/patches/scrollfix/index.ts", "src/templates/assets/javascripts/patches/scrolllock/index.ts", "src/templates/assets/javascripts/polyfills/index.ts"], + "sourcesContent": ["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (factory());\n}(this, (function () { 'use strict';\n\n /**\n * Applies the :focus-visible polyfill at the given scope.\n * A scope in this case is either the top-level Document or a Shadow Root.\n *\n * @param {(Document|ShadowRoot)} scope\n * @see https://github.com/WICG/focus-visible\n */\n function applyFocusVisiblePolyfill(scope) {\n var hadKeyboardEvent = true;\n var hadFocusVisibleRecently = false;\n var hadFocusVisibleRecentlyTimeout = null;\n\n var inputTypesAllowlist = {\n text: true,\n search: true,\n url: true,\n tel: true,\n email: true,\n password: true,\n number: true,\n date: true,\n month: true,\n week: true,\n time: true,\n datetime: true,\n 'datetime-local': true\n };\n\n /**\n * Helper function for legacy browsers and iframes which sometimes focus\n * elements like document, body, and non-interactive SVG.\n * @param {Element} el\n */\n function isValidFocusTarget(el) {\n if (\n el &&\n el !== document &&\n el.nodeName !== 'HTML' &&\n el.nodeName !== 'BODY' &&\n 'classList' in el &&\n 'contains' in el.classList\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} el\n * @return {boolean}\n */\n function focusTriggersKeyboardModality(el) {\n var type = el.type;\n var tagName = el.tagName;\n\n if (tagName === 'INPUT' && inputTypesAllowlist[type] && !el.readOnly) {\n return true;\n }\n\n if (tagName === 'TEXTAREA' && !el.readOnly) {\n return true;\n }\n\n if (el.isContentEditable) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Add the `focus-visible` class to the given element if it was not added by\n * the author.\n * @param {Element} el\n */\n function addFocusVisibleClass(el) {\n if (el.classList.contains('focus-visible')) {\n return;\n }\n el.classList.add('focus-visible');\n el.setAttribute('data-focus-visible-added', '');\n }\n\n /**\n * Remove the `focus-visible` class from the given element if it was not\n * originally added by the author.\n * @param {Element} el\n */\n function removeFocusVisibleClass(el) {\n if (!el.hasAttribute('data-focus-visible-added')) {\n return;\n }\n el.classList.remove('focus-visible');\n el.removeAttribute('data-focus-visible-added');\n }\n\n /**\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * Apply `focus-visible` to any current active element and keep track\n * of our keyboard modality state with `hadKeyboardEvent`.\n * @param {KeyboardEvent} e\n */\n function onKeyDown(e) {\n if (e.metaKey || e.altKey || e.ctrlKey) {\n return;\n }\n\n if (isValidFocusTarget(scope.activeElement)) {\n addFocusVisibleClass(scope.activeElement);\n }\n\n hadKeyboardEvent = true;\n }\n\n /**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n * @param {Event} e\n */\n function onPointerDown(e) {\n hadKeyboardEvent = false;\n }\n\n /**\n * On `focus`, add the `focus-visible` class to the target if:\n * - the target received focus as a result of keyboard navigation, or\n * - the event target is an element that will likely require interaction\n * via the keyboard (e.g. a text box)\n * @param {Event} e\n */\n function onFocus(e) {\n // Prevent IE from focusing the document or HTML element.\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (hadKeyboardEvent || focusTriggersKeyboardModality(e.target)) {\n addFocusVisibleClass(e.target);\n }\n }\n\n /**\n * On `blur`, remove the `focus-visible` class from the target.\n * @param {Event} e\n */\n function onBlur(e) {\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (\n e.target.classList.contains('focus-visible') ||\n e.target.hasAttribute('data-focus-visible-added')\n ) {\n // To detect a tab/window switch, we look for a blur event followed\n // rapidly by a visibility change.\n // If we don't see a visibility change within 100ms, it's probably a\n // regular focus change.\n hadFocusVisibleRecently = true;\n window.clearTimeout(hadFocusVisibleRecentlyTimeout);\n hadFocusVisibleRecentlyTimeout = window.setTimeout(function() {\n hadFocusVisibleRecently = false;\n }, 100);\n removeFocusVisibleClass(e.target);\n }\n }\n\n /**\n * If the user changes tabs, keep track of whether or not the previously\n * focused element had .focus-visible.\n * @param {Event} e\n */\n function onVisibilityChange(e) {\n if (document.visibilityState === 'hidden') {\n // If the tab becomes active again, the browser will handle calling focus\n // on the element (Safari actually calls it twice).\n // If this tab change caused a blur on an element with focus-visible,\n // re-apply the class when the user switches back to the tab.\n if (hadFocusVisibleRecently) {\n hadKeyboardEvent = true;\n }\n addInitialPointerMoveListeners();\n }\n }\n\n /**\n * Add a group of listeners to detect usage of any pointing devices.\n * These listeners will be added when the polyfill first loads, and anytime\n * the window is blurred, so that they are active when the window regains\n * focus.\n */\n function addInitialPointerMoveListeners() {\n document.addEventListener('mousemove', onInitialPointerMove);\n document.addEventListener('mousedown', onInitialPointerMove);\n document.addEventListener('mouseup', onInitialPointerMove);\n document.addEventListener('pointermove', onInitialPointerMove);\n document.addEventListener('pointerdown', onInitialPointerMove);\n document.addEventListener('pointerup', onInitialPointerMove);\n document.addEventListener('touchmove', onInitialPointerMove);\n document.addEventListener('touchstart', onInitialPointerMove);\n document.addEventListener('touchend', onInitialPointerMove);\n }\n\n function removeInitialPointerMoveListeners() {\n document.removeEventListener('mousemove', onInitialPointerMove);\n document.removeEventListener('mousedown', onInitialPointerMove);\n document.removeEventListener('mouseup', onInitialPointerMove);\n document.removeEventListener('pointermove', onInitialPointerMove);\n document.removeEventListener('pointerdown', onInitialPointerMove);\n document.removeEventListener('pointerup', onInitialPointerMove);\n document.removeEventListener('touchmove', onInitialPointerMove);\n document.removeEventListener('touchstart', onInitialPointerMove);\n document.removeEventListener('touchend', onInitialPointerMove);\n }\n\n /**\n * When the polfyill first loads, assume the user is in keyboard modality.\n * If any event is received from a pointing device (e.g. mouse, pointer,\n * touch), turn off keyboard modality.\n * This accounts for situations where focus enters the page from the URL bar.\n * @param {Event} e\n */\n function onInitialPointerMove(e) {\n // Work around a Safari quirk that fires a mousemove on whenever the\n // window blurs, even if you're tabbing out of the page. \u00AF\\_(\u30C4)_/\u00AF\n if (e.target.nodeName && e.target.nodeName.toLowerCase() === 'html') {\n return;\n }\n\n hadKeyboardEvent = false;\n removeInitialPointerMoveListeners();\n }\n\n // For some kinds of state, we are interested in changes at the global scope\n // only. For example, global pointer input, global key presses and global\n // visibility change should affect the state at every scope:\n document.addEventListener('keydown', onKeyDown, true);\n document.addEventListener('mousedown', onPointerDown, true);\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('touchstart', onPointerDown, true);\n document.addEventListener('visibilitychange', onVisibilityChange, true);\n\n addInitialPointerMoveListeners();\n\n // For focus and blur, we specifically care about state changes in the local\n // scope. This is because focus / blur events that originate from within a\n // shadow root are not re-dispatched from the host element if it was already\n // the active element in its own scope:\n scope.addEventListener('focus', onFocus, true);\n scope.addEventListener('blur', onBlur, true);\n\n // We detect that a node is a ShadowRoot by ensuring that it is a\n // DocumentFragment and also has a host property. This check covers native\n // implementation and polyfill implementation transparently. If we only cared\n // about the native implementation, we could just check if the scope was\n // an instance of a ShadowRoot.\n if (scope.nodeType === Node.DOCUMENT_FRAGMENT_NODE && scope.host) {\n // Since a ShadowRoot is a special kind of DocumentFragment, it does not\n // have a root element to add a class to. So, we add this attribute to the\n // host element instead:\n scope.host.setAttribute('data-js-focus-visible', '');\n } else if (scope.nodeType === Node.DOCUMENT_NODE) {\n document.documentElement.classList.add('js-focus-visible');\n document.documentElement.setAttribute('data-js-focus-visible', '');\n }\n }\n\n // It is important to wrap all references to global window and document in\n // these checks to support server-side rendering use cases\n // @see https://github.com/WICG/focus-visible/issues/199\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Make the polyfill helper globally available. This can be used as a signal\n // to interested libraries that wish to coordinate with the polyfill for e.g.,\n // applying the polyfill to a shadow root:\n window.applyFocusVisiblePolyfill = applyFocusVisiblePolyfill;\n\n // Notify interested libraries of the polyfill's presence, in case the\n // polyfill was loaded lazily:\n var event;\n\n try {\n event = new CustomEvent('focus-visible-polyfill-ready');\n } catch (error) {\n // IE11 does not support using CustomEvent as a constructor directly:\n event = document.createEvent('CustomEvent');\n event.initCustomEvent('focus-visible-polyfill-ready', false, false, {});\n }\n\n window.dispatchEvent(event);\n }\n\n if (typeof document !== 'undefined') {\n // Apply the polyfill to the global document, so that no JavaScript\n // coordination is required to use the polyfill in the top-level document:\n applyFocusVisiblePolyfill(document);\n }\n\n})));\n", "/*!\n * clipboard.js v2.0.11\n * https://clipboardjs.com/\n *\n * Licensed MIT \u00A9 Zeno Rocha\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClipboardJS\"] = factory();\n\telse\n\t\troot[\"ClipboardJS\"] = factory();\n})(this, function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 686:\n/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ clipboard; }\n});\n\n// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js\nvar tiny_emitter = __webpack_require__(279);\nvar tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);\n// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js\nvar listen = __webpack_require__(370);\nvar listen_default = /*#__PURE__*/__webpack_require__.n(listen);\n// EXTERNAL MODULE: ./node_modules/select/src/select.js\nvar src_select = __webpack_require__(817);\nvar select_default = /*#__PURE__*/__webpack_require__.n(src_select);\n;// CONCATENATED MODULE: ./src/common/command.js\n/**\n * Executes a given operation type.\n * @param {String} type\n * @return {Boolean}\n */\nfunction command(type) {\n try {\n return document.execCommand(type);\n } catch (err) {\n return false;\n }\n}\n;// CONCATENATED MODULE: ./src/actions/cut.js\n\n\n/**\n * Cut action wrapper.\n * @param {String|HTMLElement} target\n * @return {String}\n */\n\nvar ClipboardActionCut = function ClipboardActionCut(target) {\n var selectedText = select_default()(target);\n command('cut');\n return selectedText;\n};\n\n/* harmony default export */ var actions_cut = (ClipboardActionCut);\n;// CONCATENATED MODULE: ./src/common/create-fake-element.js\n/**\n * Creates a fake textarea element with a value.\n * @param {String} value\n * @return {HTMLElement}\n */\nfunction createFakeElement(value) {\n var isRTL = document.documentElement.getAttribute('dir') === 'rtl';\n var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS\n\n fakeElement.style.fontSize = '12pt'; // Reset box model\n\n fakeElement.style.border = '0';\n fakeElement.style.padding = '0';\n fakeElement.style.margin = '0'; // Move element out of screen horizontally\n\n fakeElement.style.position = 'absolute';\n fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically\n\n var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n fakeElement.style.top = \"\".concat(yPosition, \"px\");\n fakeElement.setAttribute('readonly', '');\n fakeElement.value = value;\n return fakeElement;\n}\n;// CONCATENATED MODULE: ./src/actions/copy.js\n\n\n\n/**\n * Create fake copy action wrapper using a fake element.\n * @param {String} target\n * @param {Object} options\n * @return {String}\n */\n\nvar fakeCopyAction = function fakeCopyAction(value, options) {\n var fakeElement = createFakeElement(value);\n options.container.appendChild(fakeElement);\n var selectedText = select_default()(fakeElement);\n command('copy');\n fakeElement.remove();\n return selectedText;\n};\n/**\n * Copy action wrapper.\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @return {String}\n */\n\n\nvar ClipboardActionCopy = function ClipboardActionCopy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n var selectedText = '';\n\n if (typeof target === 'string') {\n selectedText = fakeCopyAction(target, options);\n } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {\n // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n selectedText = fakeCopyAction(target.value, options);\n } else {\n selectedText = select_default()(target);\n command('copy');\n }\n\n return selectedText;\n};\n\n/* harmony default export */ var actions_copy = (ClipboardActionCopy);\n;// CONCATENATED MODULE: ./src/actions/default.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/**\n * Inner function which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n * @param {Object} options\n */\n\nvar ClipboardActionDefault = function ClipboardActionDefault() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // Defines base properties passed from constructor.\n var _options$action = options.action,\n action = _options$action === void 0 ? 'copy' : _options$action,\n container = options.container,\n target = options.target,\n text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'.\n\n if (action !== 'copy' && action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n } // Sets the `target` property using an element that will be have its content copied.\n\n\n if (target !== undefined) {\n if (target && _typeof(target) === 'object' && target.nodeType === 1) {\n if (action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n }\n } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n } // Define selection strategy based on `text` property.\n\n\n if (text) {\n return actions_copy(text, {\n container: container\n });\n } // Defines which selection strategy based on `target` property.\n\n\n if (target) {\n return action === 'cut' ? actions_cut(target) : actions_copy(target, {\n container: container\n });\n }\n};\n\n/* harmony default export */ var actions_default = (ClipboardActionDefault);\n;// CONCATENATED MODULE: ./src/clipboard.js\nfunction clipboard_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return clipboard_typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n/**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n\nfunction getAttributeValue(suffix, element) {\n var attribute = \"data-clipboard-\".concat(suffix);\n\n if (!element.hasAttribute(attribute)) {\n return;\n }\n\n return element.getAttribute(attribute);\n}\n/**\n * Base class which takes one or more elements, adds event listeners to them,\n * and instantiates a new `ClipboardAction` on each click.\n */\n\n\nvar Clipboard = /*#__PURE__*/function (_Emitter) {\n _inherits(Clipboard, _Emitter);\n\n var _super = _createSuper(Clipboard);\n\n /**\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n * @param {Object} options\n */\n function Clipboard(trigger, options) {\n var _this;\n\n _classCallCheck(this, Clipboard);\n\n _this = _super.call(this);\n\n _this.resolveOptions(options);\n\n _this.listenClick(trigger);\n\n return _this;\n }\n /**\n * Defines if attributes would be resolved using internal setter functions\n * or custom functions that were passed in the constructor.\n * @param {Object} options\n */\n\n\n _createClass(Clipboard, [{\n key: \"resolveOptions\",\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;\n }\n /**\n * Adds a click event listener to the passed trigger.\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n */\n\n }, {\n key: \"listenClick\",\n value: function listenClick(trigger) {\n var _this2 = this;\n\n this.listener = listen_default()(trigger, 'click', function (e) {\n return _this2.onClick(e);\n });\n }\n /**\n * Defines a new `ClipboardAction` on each click event.\n * @param {Event} e\n */\n\n }, {\n key: \"onClick\",\n value: function onClick(e) {\n var trigger = e.delegateTarget || e.currentTarget;\n var action = this.action(trigger) || 'copy';\n var text = actions_default({\n action: action,\n container: this.container,\n target: this.target(trigger),\n text: this.text(trigger)\n }); // Fires an event based on the copy operation result.\n\n this.emit(text ? 'success' : 'error', {\n action: action,\n text: text,\n trigger: trigger,\n clearSelection: function clearSelection() {\n if (trigger) {\n trigger.focus();\n }\n\n window.getSelection().removeAllRanges();\n }\n });\n }\n /**\n * Default `action` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultAction\",\n value: function defaultAction(trigger) {\n return getAttributeValue('action', trigger);\n }\n /**\n * Default `target` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultTarget\",\n value: function defaultTarget(trigger) {\n var selector = getAttributeValue('target', trigger);\n\n if (selector) {\n return document.querySelector(selector);\n }\n }\n /**\n * Allow fire programmatically a copy action\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @returns Text copied.\n */\n\n }, {\n key: \"defaultText\",\n\n /**\n * Default `text` lookup function.\n * @param {Element} trigger\n */\n value: function defaultText(trigger) {\n return getAttributeValue('text', trigger);\n }\n /**\n * Destroy lifecycle.\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.listener.destroy();\n }\n }], [{\n key: \"copy\",\n value: function copy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n return actions_copy(target, options);\n }\n /**\n * Allow fire programmatically a cut action\n * @param {String|HTMLElement} target\n * @returns Text cutted.\n */\n\n }, {\n key: \"cut\",\n value: function cut(target) {\n return actions_cut(target);\n }\n /**\n * Returns the support of the given action, or all actions if no action is\n * given.\n * @param {String} [action]\n */\n\n }, {\n key: \"isSupported\",\n value: function isSupported() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n var actions = typeof action === 'string' ? [action] : action;\n var support = !!document.queryCommandSupported;\n actions.forEach(function (action) {\n support = support && !!document.queryCommandSupported(action);\n });\n return support;\n }\n }]);\n\n return Clipboard;\n}((tiny_emitter_default()));\n\n/* harmony default export */ var clipboard = (Clipboard);\n\n/***/ }),\n\n/***/ 828:\n/***/ (function(module) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n\n/***/ 438:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar closest = __webpack_require__(828);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n\n/***/ 879:\n/***/ (function(__unused_webpack_module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n return value !== undefined\n && value instanceof HTMLElement\n && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return value !== undefined\n && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n && ('length' in value)\n && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n return typeof value === 'string'\n || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return type === '[object Function]';\n};\n\n\n/***/ }),\n\n/***/ 370:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar is = __webpack_require__(879);\nvar delegate = __webpack_require__(438);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n if (!target && !type && !callback) {\n throw new Error('Missing required arguments');\n }\n\n if (!is.string(type)) {\n throw new TypeError('Second argument must be a String');\n }\n\n if (!is.fn(callback)) {\n throw new TypeError('Third argument must be a Function');\n }\n\n if (is.node(target)) {\n return listenNode(target, type, callback);\n }\n else if (is.nodeList(target)) {\n return listenNodeList(target, type, callback);\n }\n else if (is.string(target)) {\n return listenSelector(target, type, callback);\n }\n else {\n throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n node.addEventListener(type, callback);\n\n return {\n destroy: function() {\n node.removeEventListener(type, callback);\n }\n }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.addEventListener(type, callback);\n });\n\n return {\n destroy: function() {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.removeEventListener(type, callback);\n });\n }\n }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n\n/***/ 817:\n/***/ (function(module) {\n\nfunction select(element) {\n var selectedText;\n\n if (element.nodeName === 'SELECT') {\n element.focus();\n\n selectedText = element.value;\n }\n else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n var isReadOnly = element.hasAttribute('readonly');\n\n if (!isReadOnly) {\n element.setAttribute('readonly', '');\n }\n\n element.select();\n element.setSelectionRange(0, element.value.length);\n\n if (!isReadOnly) {\n element.removeAttribute('readonly');\n }\n\n selectedText = element.value;\n }\n else {\n if (element.hasAttribute('contenteditable')) {\n element.focus();\n }\n\n var selection = window.getSelection();\n var range = document.createRange();\n\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n\n selectedText = selection.toString();\n }\n\n return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ }),\n\n/***/ 279:\n/***/ (function(module) {\n\nfunction E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\n/******/ \t// module exports must be returned from runtime so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(686);\n/******/ })()\n.default;\n});", "/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n", "/*\n * Copyright (c) 2016-2024 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport \"focus-visible\"\n\nimport {\n EMPTY,\n NEVER,\n Observable,\n Subject,\n defer,\n delay,\n filter,\n map,\n merge,\n mergeWith,\n shareReplay,\n switchMap\n} from \"rxjs\"\n\nimport { configuration, feature } from \"./_\"\nimport {\n at,\n getActiveElement,\n getOptionalElement,\n requestJSON,\n setLocation,\n setToggle,\n watchDocument,\n watchKeyboard,\n watchLocation,\n watchLocationTarget,\n watchMedia,\n watchPrint,\n watchScript,\n watchViewport\n} from \"./browser\"\nimport {\n getComponentElement,\n getComponentElements,\n mountAnnounce,\n mountBackToTop,\n mountConsent,\n mountContent,\n mountDialog,\n mountHeader,\n mountHeaderTitle,\n mountPalette,\n mountProgress,\n mountSearch,\n mountSearchHiglight,\n mountSidebar,\n mountSource,\n mountTableOfContents,\n mountTabs,\n watchHeader,\n watchMain\n} from \"./components\"\nimport {\n SearchIndex,\n setupClipboardJS,\n setupInstantNavigation,\n setupVersionSelector\n} from \"./integrations\"\nimport {\n patchEllipsis,\n patchIndeterminate,\n patchScrollfix,\n patchScrolllock\n} from \"./patches\"\nimport \"./polyfills\"\n\n/* ----------------------------------------------------------------------------\n * Functions - @todo refactor\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch search index\n *\n * @returns Search index observable\n */\nfunction fetchSearchIndex(): Observable {\n if (location.protocol === \"file:\") {\n return watchScript(\n `${new URL(\"search/search_index.js\", config.base)}`\n )\n .pipe(\n // @ts-ignore - @todo fix typings\n map(() => __index),\n shareReplay(1)\n )\n } else {\n return requestJSON(\n new URL(\"search/search_index.json\", config.base)\n )\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Application\n * ------------------------------------------------------------------------- */\n\n/* Yay, JavaScript is available */\ndocument.documentElement.classList.remove(\"no-js\")\ndocument.documentElement.classList.add(\"js\")\n\n/* Set up navigation observables and subjects */\nconst document$ = watchDocument()\nconst location$ = watchLocation()\nconst target$ = watchLocationTarget(location$)\nconst keyboard$ = watchKeyboard()\n\n/* Set up media observables */\nconst viewport$ = watchViewport()\nconst tablet$ = watchMedia(\"(min-width: 960px)\")\nconst screen$ = watchMedia(\"(min-width: 1220px)\")\nconst print$ = watchPrint()\n\n/* Retrieve search index, if search is enabled */\nconst config = configuration()\nconst index$ = document.forms.namedItem(\"search\")\n ? fetchSearchIndex()\n : NEVER\n\n/* Set up Clipboard.js integration */\nconst alert$ = new Subject()\nsetupClipboardJS({ alert$ })\n\n/* Set up progress indicator */\nconst progress$ = new Subject()\n\n/* Set up instant navigation, if enabled */\nif (feature(\"navigation.instant\"))\n setupInstantNavigation({ location$, viewport$, progress$ })\n .subscribe(document$)\n\n/* Set up version selector */\nif (config.version?.provider === \"mike\")\n setupVersionSelector({ document$ })\n\n/* Always close drawer and search on navigation */\nmerge(location$, target$)\n .pipe(\n delay(125)\n )\n .subscribe(() => {\n setToggle(\"drawer\", false)\n setToggle(\"search\", false)\n })\n\n/* Set up global keyboard handlers */\nkeyboard$\n .pipe(\n filter(({ mode }) => mode === \"global\")\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Go to previous page */\n case \"p\":\n case \",\":\n const prev = getOptionalElement(\"link[rel=prev]\")\n if (typeof prev !== \"undefined\")\n setLocation(prev)\n break\n\n /* Go to next page */\n case \"n\":\n case \".\":\n const next = getOptionalElement(\"link[rel=next]\")\n if (typeof next !== \"undefined\")\n setLocation(next)\n break\n\n /* Expand navigation, see https://bit.ly/3ZjG5io */\n case \"Enter\":\n const active = getActiveElement()\n if (active instanceof HTMLLabelElement)\n active.click()\n }\n })\n\n/* Set up patches */\npatchEllipsis({ viewport$, document$ })\npatchIndeterminate({ document$, tablet$ })\npatchScrollfix({ document$ })\npatchScrolllock({ viewport$, tablet$ })\n\n/* Set up header and main area observable */\nconst header$ = watchHeader(getComponentElement(\"header\"), { viewport$ })\nconst main$ = document$\n .pipe(\n map(() => getComponentElement(\"main\")),\n switchMap(el => watchMain(el, { viewport$, header$ })),\n shareReplay(1)\n )\n\n/* Set up control component observables */\nconst control$ = merge(\n\n /* Consent */\n ...getComponentElements(\"consent\")\n .map(el => mountConsent(el, { target$ })),\n\n /* Dialog */\n ...getComponentElements(\"dialog\")\n .map(el => mountDialog(el, { alert$ })),\n\n /* Header */\n ...getComponentElements(\"header\")\n .map(el => mountHeader(el, { viewport$, header$, main$ })),\n\n /* Color palette */\n ...getComponentElements(\"palette\")\n .map(el => mountPalette(el)),\n\n /* Progress bar */\n ...getComponentElements(\"progress\")\n .map(el => mountProgress(el, { progress$ })),\n\n /* Search */\n ...getComponentElements(\"search\")\n .map(el => mountSearch(el, { index$, keyboard$ })),\n\n /* Repository information */\n ...getComponentElements(\"source\")\n .map(el => mountSource(el))\n)\n\n/* Set up content component observables */\nconst content$ = defer(() => merge(\n\n /* Announcement bar */\n ...getComponentElements(\"announce\")\n .map(el => mountAnnounce(el)),\n\n /* Content */\n ...getComponentElements(\"content\")\n .map(el => mountContent(el, { viewport$, target$, print$ })),\n\n /* Search highlighting */\n ...getComponentElements(\"content\")\n .map(el => feature(\"search.highlight\")\n ? mountSearchHiglight(el, { index$, location$ })\n : EMPTY\n ),\n\n /* Header title */\n ...getComponentElements(\"header-title\")\n .map(el => mountHeaderTitle(el, { viewport$, header$ })),\n\n /* Sidebar */\n ...getComponentElements(\"sidebar\")\n .map(el => el.getAttribute(\"data-md-type\") === \"navigation\"\n ? at(screen$, () => mountSidebar(el, { viewport$, header$, main$ }))\n : at(tablet$, () => mountSidebar(el, { viewport$, header$, main$ }))\n ),\n\n /* Navigation tabs */\n ...getComponentElements(\"tabs\")\n .map(el => mountTabs(el, { viewport$, header$ })),\n\n /* Table of contents */\n ...getComponentElements(\"toc\")\n .map(el => mountTableOfContents(el, {\n viewport$, header$, main$, target$\n })),\n\n /* Back-to-top button */\n ...getComponentElements(\"top\")\n .map(el => mountBackToTop(el, { viewport$, header$, main$, target$ }))\n))\n\n/* Set up component observables */\nconst component$ = document$\n .pipe(\n switchMap(() => content$),\n mergeWith(control$),\n shareReplay(1)\n )\n\n/* Subscribe to all components */\ncomponent$.subscribe()\n\n/* ----------------------------------------------------------------------------\n * Exports\n * ------------------------------------------------------------------------- */\n\nwindow.document$ = document$ /* Document observable */\nwindow.location$ = location$ /* Location subject */\nwindow.target$ = target$ /* Location target observable */\nwindow.keyboard$ = keyboard$ /* Keyboard observable */\nwindow.viewport$ = viewport$ /* Viewport observable */\nwindow.tablet$ = tablet$ /* Media tablet observable */\nwindow.screen$ = screen$ /* Media screen observable */\nwindow.print$ = print$ /* Media print observable */\nwindow.alert$ = alert$ /* Alert subject */\nwindow.progress$ = progress$ /* Progress indicator subject */\nwindow.component$ = component$ /* Component observable */\n", "/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n", "/**\n * Returns true if the object is a function.\n * @param value The value to check\n */\nexport function isFunction(value: any): value is (...args: any[]) => any {\n return typeof value === 'function';\n}\n", "/**\n * Used to create Error subclasses until the community moves away from ES5.\n *\n * This is because compiling from TypeScript down to ES5 has issues with subclassing Errors\n * as well as other built-in types: https://github.com/Microsoft/TypeScript/issues/12123\n *\n * @param createImpl A factory function to create the actual constructor implementation. The returned\n * function should be a named function that calls `_super` internally.\n */\nexport function createErrorClass(createImpl: (_super: any) => any): T {\n const _super = (instance: any) => {\n Error.call(instance);\n instance.stack = new Error().stack;\n };\n\n const ctorFunc = createImpl(_super);\n ctorFunc.prototype = Object.create(Error.prototype);\n ctorFunc.prototype.constructor = ctorFunc;\n return ctorFunc;\n}\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface UnsubscriptionError extends Error {\n readonly errors: any[];\n}\n\nexport interface UnsubscriptionErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (errors: any[]): UnsubscriptionError;\n}\n\n/**\n * An error thrown when one or more errors have occurred during the\n * `unsubscribe` of a {@link Subscription}.\n */\nexport const UnsubscriptionError: UnsubscriptionErrorCtor = createErrorClass(\n (_super) =>\n function UnsubscriptionErrorImpl(this: any, errors: (Error | string)[]) {\n _super(this);\n this.message = errors\n ? `${errors.length} errors occurred during unsubscription:\n${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\\n ')}`\n : '';\n this.name = 'UnsubscriptionError';\n this.errors = errors;\n }\n);\n", "/**\n * Removes an item from an array, mutating it.\n * @param arr The array to remove the item from\n * @param item The item to remove\n */\nexport function arrRemove(arr: T[] | undefined | null, item: T) {\n if (arr) {\n const index = arr.indexOf(item);\n 0 <= index && arr.splice(index, 1);\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { SubscriptionLike, TeardownLogic, Unsubscribable } from './types';\nimport { arrRemove } from './util/arrRemove';\n\n/**\n * Represents a disposable resource, such as the execution of an Observable. A\n * Subscription has one important method, `unsubscribe`, that takes no argument\n * and just disposes the resource held by the subscription.\n *\n * Additionally, subscriptions may be grouped together through the `add()`\n * method, which will attach a child Subscription to the current Subscription.\n * When a Subscription is unsubscribed, all its children (and its grandchildren)\n * will be unsubscribed as well.\n *\n * @class Subscription\n */\nexport class Subscription implements SubscriptionLike {\n /** @nocollapse */\n public static EMPTY = (() => {\n const empty = new Subscription();\n empty.closed = true;\n return empty;\n })();\n\n /**\n * A flag to indicate whether this Subscription has already been unsubscribed.\n */\n public closed = false;\n\n private _parentage: Subscription[] | Subscription | null = null;\n\n /**\n * The list of registered finalizers to execute upon unsubscription. Adding and removing from this\n * list occurs in the {@link #add} and {@link #remove} methods.\n */\n private _finalizers: Exclude[] | null = null;\n\n /**\n * @param initialTeardown A function executed first as part of the finalization\n * process that is kicked off when {@link #unsubscribe} is called.\n */\n constructor(private initialTeardown?: () => void) {}\n\n /**\n * Disposes the resources held by the subscription. May, for instance, cancel\n * an ongoing Observable execution or cancel any other type of work that\n * started when the Subscription was created.\n * @return {void}\n */\n unsubscribe(): void {\n let errors: any[] | undefined;\n\n if (!this.closed) {\n this.closed = true;\n\n // Remove this from it's parents.\n const { _parentage } = this;\n if (_parentage) {\n this._parentage = null;\n if (Array.isArray(_parentage)) {\n for (const parent of _parentage) {\n parent.remove(this);\n }\n } else {\n _parentage.remove(this);\n }\n }\n\n const { initialTeardown: initialFinalizer } = this;\n if (isFunction(initialFinalizer)) {\n try {\n initialFinalizer();\n } catch (e) {\n errors = e instanceof UnsubscriptionError ? e.errors : [e];\n }\n }\n\n const { _finalizers } = this;\n if (_finalizers) {\n this._finalizers = null;\n for (const finalizer of _finalizers) {\n try {\n execFinalizer(finalizer);\n } catch (err) {\n errors = errors ?? [];\n if (err instanceof UnsubscriptionError) {\n errors = [...errors, ...err.errors];\n } else {\n errors.push(err);\n }\n }\n }\n }\n\n if (errors) {\n throw new UnsubscriptionError(errors);\n }\n }\n }\n\n /**\n * Adds a finalizer to this subscription, so that finalization will be unsubscribed/called\n * when this subscription is unsubscribed. If this subscription is already {@link #closed},\n * because it has already been unsubscribed, then whatever finalizer is passed to it\n * will automatically be executed (unless the finalizer itself is also a closed subscription).\n *\n * Closed Subscriptions cannot be added as finalizers to any subscription. Adding a closed\n * subscription to a any subscription will result in no operation. (A noop).\n *\n * Adding a subscription to itself, or adding `null` or `undefined` will not perform any\n * operation at all. (A noop).\n *\n * `Subscription` instances that are added to this instance will automatically remove themselves\n * if they are unsubscribed. Functions and {@link Unsubscribable} objects that you wish to remove\n * will need to be removed manually with {@link #remove}\n *\n * @param teardown The finalization logic to add to this subscription.\n */\n add(teardown: TeardownLogic): void {\n // Only add the finalizer if it's not undefined\n // and don't add a subscription to itself.\n if (teardown && teardown !== this) {\n if (this.closed) {\n // If this subscription is already closed,\n // execute whatever finalizer is handed to it automatically.\n execFinalizer(teardown);\n } else {\n if (teardown instanceof Subscription) {\n // We don't add closed subscriptions, and we don't add the same subscription\n // twice. Subscription unsubscribe is idempotent.\n if (teardown.closed || teardown._hasParent(this)) {\n return;\n }\n teardown._addParent(this);\n }\n (this._finalizers = this._finalizers ?? []).push(teardown);\n }\n }\n }\n\n /**\n * Checks to see if a this subscription already has a particular parent.\n * This will signal that this subscription has already been added to the parent in question.\n * @param parent the parent to check for\n */\n private _hasParent(parent: Subscription) {\n const { _parentage } = this;\n return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));\n }\n\n /**\n * Adds a parent to this subscription so it can be removed from the parent if it\n * unsubscribes on it's own.\n *\n * NOTE: THIS ASSUMES THAT {@link _hasParent} HAS ALREADY BEEN CHECKED.\n * @param parent The parent subscription to add\n */\n private _addParent(parent: Subscription) {\n const { _parentage } = this;\n this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;\n }\n\n /**\n * Called on a child when it is removed via {@link #remove}.\n * @param parent The parent to remove\n */\n private _removeParent(parent: Subscription) {\n const { _parentage } = this;\n if (_parentage === parent) {\n this._parentage = null;\n } else if (Array.isArray(_parentage)) {\n arrRemove(_parentage, parent);\n }\n }\n\n /**\n * Removes a finalizer from this subscription that was previously added with the {@link #add} method.\n *\n * Note that `Subscription` instances, when unsubscribed, will automatically remove themselves\n * from every other `Subscription` they have been added to. This means that using the `remove` method\n * is not a common thing and should be used thoughtfully.\n *\n * If you add the same finalizer instance of a function or an unsubscribable object to a `Subscription` instance\n * more than once, you will need to call `remove` the same number of times to remove all instances.\n *\n * All finalizer instances are removed to free up memory upon unsubscription.\n *\n * @param teardown The finalizer to remove from this subscription\n */\n remove(teardown: Exclude): void {\n const { _finalizers } = this;\n _finalizers && arrRemove(_finalizers, teardown);\n\n if (teardown instanceof Subscription) {\n teardown._removeParent(this);\n }\n }\n}\n\nexport const EMPTY_SUBSCRIPTION = Subscription.EMPTY;\n\nexport function isSubscription(value: any): value is Subscription {\n return (\n value instanceof Subscription ||\n (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe))\n );\n}\n\nfunction execFinalizer(finalizer: Unsubscribable | (() => void)) {\n if (isFunction(finalizer)) {\n finalizer();\n } else {\n finalizer.unsubscribe();\n }\n}\n", "import { Subscriber } from './Subscriber';\nimport { ObservableNotification } from './types';\n\n/**\n * The {@link GlobalConfig} object for RxJS. It is used to configure things\n * like how to react on unhandled errors.\n */\nexport const config: GlobalConfig = {\n onUnhandledError: null,\n onStoppedNotification: null,\n Promise: undefined,\n useDeprecatedSynchronousErrorHandling: false,\n useDeprecatedNextContext: false,\n};\n\n/**\n * The global configuration object for RxJS, used to configure things\n * like how to react on unhandled errors. Accessible via {@link config}\n * object.\n */\nexport interface GlobalConfig {\n /**\n * A registration point for unhandled errors from RxJS. These are errors that\n * cannot were not handled by consuming code in the usual subscription path. For\n * example, if you have this configured, and you subscribe to an observable without\n * providing an error handler, errors from that subscription will end up here. This\n * will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onUnhandledError: ((err: any) => void) | null;\n\n /**\n * A registration point for notifications that cannot be sent to subscribers because they\n * have completed, errored or have been explicitly unsubscribed. By default, next, complete\n * and error notifications sent to stopped subscribers are noops. However, sometimes callers\n * might want a different behavior. For example, with sources that attempt to report errors\n * to stopped subscribers, a caller can configure RxJS to throw an unhandled error instead.\n * This will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onStoppedNotification: ((notification: ObservableNotification, subscriber: Subscriber) => void) | null;\n\n /**\n * The promise constructor used by default for {@link Observable#toPromise toPromise} and {@link Observable#forEach forEach}\n * methods.\n *\n * @deprecated As of version 8, RxJS will no longer support this sort of injection of a\n * Promise constructor. If you need a Promise implementation other than native promises,\n * please polyfill/patch Promise as you see appropriate. Will be removed in v8.\n */\n Promise?: PromiseConstructorLike;\n\n /**\n * If true, turns on synchronous error rethrowing, which is a deprecated behavior\n * in v6 and higher. This behavior enables bad patterns like wrapping a subscribe\n * call in a try/catch block. It also enables producer interference, a nasty bug\n * where a multicast can be broken for all observers by a downstream consumer with\n * an unhandled error. DO NOT USE THIS FLAG UNLESS IT'S NEEDED TO BUY TIME\n * FOR MIGRATION REASONS.\n *\n * @deprecated As of version 8, RxJS will no longer support synchronous throwing\n * of unhandled errors. All errors will be thrown on a separate call stack to prevent bad\n * behaviors described above. Will be removed in v8.\n */\n useDeprecatedSynchronousErrorHandling: boolean;\n\n /**\n * If true, enables an as-of-yet undocumented feature from v5: The ability to access\n * `unsubscribe()` via `this` context in `next` functions created in observers passed\n * to `subscribe`.\n *\n * This is being removed because the performance was severely problematic, and it could also cause\n * issues when types other than POJOs are passed to subscribe as subscribers, as they will likely have\n * their `this` context overwritten.\n *\n * @deprecated As of version 8, RxJS will no longer support altering the\n * context of next functions provided as part of an observer to Subscribe. Instead,\n * you will have access to a subscription or a signal or token that will allow you to do things like\n * unsubscribe and test closed status. Will be removed in v8.\n */\n useDeprecatedNextContext: boolean;\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetTimeoutFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearTimeoutFunction = (handle: TimerHandle) => void;\n\ninterface TimeoutProvider {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n delegate:\n | {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n }\n | undefined;\n}\n\nexport const timeoutProvider: TimeoutProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setTimeout(handler: () => void, timeout?: number, ...args) {\n const { delegate } = timeoutProvider;\n if (delegate?.setTimeout) {\n return delegate.setTimeout(handler, timeout, ...args);\n }\n return setTimeout(handler, timeout, ...args);\n },\n clearTimeout(handle) {\n const { delegate } = timeoutProvider;\n return (delegate?.clearTimeout || clearTimeout)(handle as any);\n },\n delegate: undefined,\n};\n", "import { config } from '../config';\nimport { timeoutProvider } from '../scheduler/timeoutProvider';\n\n/**\n * Handles an error on another job either with the user-configured {@link onUnhandledError},\n * or by throwing it on that new job so it can be picked up by `window.onerror`, `process.on('error')`, etc.\n *\n * This should be called whenever there is an error that is out-of-band with the subscription\n * or when an error hits a terminal boundary of the subscription and no error handler was provided.\n *\n * @param err the error to report\n */\nexport function reportUnhandledError(err: any) {\n timeoutProvider.setTimeout(() => {\n const { onUnhandledError } = config;\n if (onUnhandledError) {\n // Execute the user-configured error handler.\n onUnhandledError(err);\n } else {\n // Throw so it is picked up by the runtime's uncaught error mechanism.\n throw err;\n }\n });\n}\n", "/* tslint:disable:no-empty */\nexport function noop() { }\n", "import { CompleteNotification, NextNotification, ErrorNotification } from './types';\n\n/**\n * A completion object optimized for memory use and created to be the\n * same \"shape\" as other notifications in v8.\n * @internal\n */\nexport const COMPLETE_NOTIFICATION = (() => createNotification('C', undefined, undefined) as CompleteNotification)();\n\n/**\n * Internal use only. Creates an optimized error notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function errorNotification(error: any): ErrorNotification {\n return createNotification('E', undefined, error) as any;\n}\n\n/**\n * Internal use only. Creates an optimized next notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function nextNotification(value: T) {\n return createNotification('N', value, undefined) as NextNotification;\n}\n\n/**\n * Ensures that all notifications created internally have the same \"shape\" in v8.\n *\n * TODO: This is only exported to support a crazy legacy test in `groupBy`.\n * @internal\n */\nexport function createNotification(kind: 'N' | 'E' | 'C', value: any, error: any) {\n return {\n kind,\n value,\n error,\n };\n}\n", "import { config } from '../config';\n\nlet context: { errorThrown: boolean; error: any } | null = null;\n\n/**\n * Handles dealing with errors for super-gross mode. Creates a context, in which\n * any synchronously thrown errors will be passed to {@link captureError}. Which\n * will record the error such that it will be rethrown after the call back is complete.\n * TODO: Remove in v8\n * @param cb An immediately executed function.\n */\nexport function errorContext(cb: () => void) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n const isRoot = !context;\n if (isRoot) {\n context = { errorThrown: false, error: null };\n }\n cb();\n if (isRoot) {\n const { errorThrown, error } = context!;\n context = null;\n if (errorThrown) {\n throw error;\n }\n }\n } else {\n // This is the general non-deprecated path for everyone that\n // isn't crazy enough to use super-gross mode (useDeprecatedSynchronousErrorHandling)\n cb();\n }\n}\n\n/**\n * Captures errors only in super-gross mode.\n * @param err the error to capture\n */\nexport function captureError(err: any) {\n if (config.useDeprecatedSynchronousErrorHandling && context) {\n context.errorThrown = true;\n context.error = err;\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { Observer, ObservableNotification } from './types';\nimport { isSubscription, Subscription } from './Subscription';\nimport { config } from './config';\nimport { reportUnhandledError } from './util/reportUnhandledError';\nimport { noop } from './util/noop';\nimport { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';\nimport { timeoutProvider } from './scheduler/timeoutProvider';\nimport { captureError } from './util/errorContext';\n\n/**\n * Implements the {@link Observer} interface and extends the\n * {@link Subscription} class. While the {@link Observer} is the public API for\n * consuming the values of an {@link Observable}, all Observers get converted to\n * a Subscriber, in order to provide Subscription-like capabilities such as\n * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for\n * implementing operators, but it is rarely used as a public API.\n *\n * @class Subscriber\n */\nexport class Subscriber extends Subscription implements Observer {\n /**\n * A static factory for a Subscriber, given a (potentially partial) definition\n * of an Observer.\n * @param next The `next` callback of an Observer.\n * @param error The `error` callback of an\n * Observer.\n * @param complete The `complete` callback of an\n * Observer.\n * @return A Subscriber wrapping the (partially defined)\n * Observer represented by the given arguments.\n * @nocollapse\n * @deprecated Do not use. Will be removed in v8. There is no replacement for this\n * method, and there is no reason to be creating instances of `Subscriber` directly.\n * If you have a specific use case, please file an issue.\n */\n static create(next?: (x?: T) => void, error?: (e?: any) => void, complete?: () => void): Subscriber {\n return new SafeSubscriber(next, error, complete);\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected isStopped: boolean = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected destination: Subscriber | Observer; // this `any` is the escape hatch to erase extra type param (e.g. R)\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * There is no reason to directly create an instance of Subscriber. This type is exported for typings reasons.\n */\n constructor(destination?: Subscriber | Observer) {\n super();\n if (destination) {\n this.destination = destination;\n // Automatically chain subscriptions together here.\n // if destination is a Subscription, then it is a Subscriber.\n if (isSubscription(destination)) {\n destination.add(this);\n }\n } else {\n this.destination = EMPTY_OBSERVER;\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `next` from\n * the Observable, with a value. The Observable may call this method 0 or more\n * times.\n * @param {T} [value] The `next` value.\n * @return {void}\n */\n next(value?: T): void {\n if (this.isStopped) {\n handleStoppedNotification(nextNotification(value), this);\n } else {\n this._next(value!);\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `error` from\n * the Observable, with an attached `Error`. Notifies the Observer that\n * the Observable has experienced an error condition.\n * @param {any} [err] The `error` exception.\n * @return {void}\n */\n error(err?: any): void {\n if (this.isStopped) {\n handleStoppedNotification(errorNotification(err), this);\n } else {\n this.isStopped = true;\n this._error(err);\n }\n }\n\n /**\n * The {@link Observer} callback to receive a valueless notification of type\n * `complete` from the Observable. Notifies the Observer that the Observable\n * has finished sending push-based notifications.\n * @return {void}\n */\n complete(): void {\n if (this.isStopped) {\n handleStoppedNotification(COMPLETE_NOTIFICATION, this);\n } else {\n this.isStopped = true;\n this._complete();\n }\n }\n\n unsubscribe(): void {\n if (!this.closed) {\n this.isStopped = true;\n super.unsubscribe();\n this.destination = null!;\n }\n }\n\n protected _next(value: T): void {\n this.destination.next(value);\n }\n\n protected _error(err: any): void {\n try {\n this.destination.error(err);\n } finally {\n this.unsubscribe();\n }\n }\n\n protected _complete(): void {\n try {\n this.destination.complete();\n } finally {\n this.unsubscribe();\n }\n }\n}\n\n/**\n * This bind is captured here because we want to be able to have\n * compatibility with monoid libraries that tend to use a method named\n * `bind`. In particular, a library called Monio requires this.\n */\nconst _bind = Function.prototype.bind;\n\nfunction bind any>(fn: Fn, thisArg: any): Fn {\n return _bind.call(fn, thisArg);\n}\n\n/**\n * Internal optimization only, DO NOT EXPOSE.\n * @internal\n */\nclass ConsumerObserver implements Observer {\n constructor(private partialObserver: Partial>) {}\n\n next(value: T): void {\n const { partialObserver } = this;\n if (partialObserver.next) {\n try {\n partialObserver.next(value);\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n\n error(err: any): void {\n const { partialObserver } = this;\n if (partialObserver.error) {\n try {\n partialObserver.error(err);\n } catch (error) {\n handleUnhandledError(error);\n }\n } else {\n handleUnhandledError(err);\n }\n }\n\n complete(): void {\n const { partialObserver } = this;\n if (partialObserver.complete) {\n try {\n partialObserver.complete();\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n}\n\nexport class SafeSubscriber extends Subscriber {\n constructor(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((e?: any) => void) | null,\n complete?: (() => void) | null\n ) {\n super();\n\n let partialObserver: Partial>;\n if (isFunction(observerOrNext) || !observerOrNext) {\n // The first argument is a function, not an observer. The next\n // two arguments *could* be observers, or they could be empty.\n partialObserver = {\n next: (observerOrNext ?? undefined) as (((value: T) => void) | undefined),\n error: error ?? undefined,\n complete: complete ?? undefined,\n };\n } else {\n // The first argument is a partial observer.\n let context: any;\n if (this && config.useDeprecatedNextContext) {\n // This is a deprecated path that made `this.unsubscribe()` available in\n // next handler functions passed to subscribe. This only exists behind a flag\n // now, as it is *very* slow.\n context = Object.create(observerOrNext);\n context.unsubscribe = () => this.unsubscribe();\n partialObserver = {\n next: observerOrNext.next && bind(observerOrNext.next, context),\n error: observerOrNext.error && bind(observerOrNext.error, context),\n complete: observerOrNext.complete && bind(observerOrNext.complete, context),\n };\n } else {\n // The \"normal\" path. Just use the partial observer directly.\n partialObserver = observerOrNext;\n }\n }\n\n // Wrap the partial observer to ensure it's a full observer, and\n // make sure proper error handling is accounted for.\n this.destination = new ConsumerObserver(partialObserver);\n }\n}\n\nfunction handleUnhandledError(error: any) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n captureError(error);\n } else {\n // Ideal path, we report this as an unhandled error,\n // which is thrown on a new call stack.\n reportUnhandledError(error);\n }\n}\n\n/**\n * An error handler used when no error handler was supplied\n * to the SafeSubscriber -- meaning no error handler was supplied\n * do the `subscribe` call on our observable.\n * @param err The error to handle\n */\nfunction defaultErrorHandler(err: any) {\n throw err;\n}\n\n/**\n * A handler for notifications that cannot be sent to a stopped subscriber.\n * @param notification The notification being sent\n * @param subscriber The stopped subscriber\n */\nfunction handleStoppedNotification(notification: ObservableNotification, subscriber: Subscriber) {\n const { onStoppedNotification } = config;\n onStoppedNotification && timeoutProvider.setTimeout(() => onStoppedNotification(notification, subscriber));\n}\n\n/**\n * The observer used as a stub for subscriptions where the user did not\n * pass any arguments to `subscribe`. Comes with the default error handling\n * behavior.\n */\nexport const EMPTY_OBSERVER: Readonly> & { closed: true } = {\n closed: true,\n next: noop,\n error: defaultErrorHandler,\n complete: noop,\n};\n", "/**\n * Symbol.observable or a string \"@@observable\". Used for interop\n *\n * @deprecated We will no longer be exporting this symbol in upcoming versions of RxJS.\n * Instead polyfill and use Symbol.observable directly *or* use https://www.npmjs.com/package/symbol-observable\n */\nexport const observable: string | symbol = (() => (typeof Symbol === 'function' && Symbol.observable) || '@@observable')();\n", "/**\n * This function takes one parameter and just returns it. Simply put,\n * this is like `(x: T): T => x`.\n *\n * ## Examples\n *\n * This is useful in some cases when using things like `mergeMap`\n *\n * ```ts\n * import { interval, take, map, range, mergeMap, identity } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(5));\n *\n * const result$ = source$.pipe(\n * map(i => range(i)),\n * mergeMap(identity) // same as mergeMap(x => x)\n * );\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * Or when you want to selectively apply an operator\n *\n * ```ts\n * import { interval, take, identity } from 'rxjs';\n *\n * const shouldLimit = () => Math.random() < 0.5;\n *\n * const source$ = interval(1000);\n *\n * const result$ = source$.pipe(shouldLimit() ? take(5) : identity);\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * @param x Any value that is returned by this function\n * @returns The value passed as the first parameter to this function\n */\nexport function identity(x: T): T {\n return x;\n}\n", "import { identity } from './identity';\nimport { UnaryFunction } from '../types';\n\nexport function pipe(): typeof identity;\nexport function pipe(fn1: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction,\n ...fns: UnaryFunction[]\n): UnaryFunction;\n\n/**\n * pipe() can be called on one or more functions, each of which can take one argument (\"UnaryFunction\")\n * and uses it to return a value.\n * It returns a function that takes one argument, passes it to the first UnaryFunction, and then\n * passes the result to the next one, passes that result to the next one, and so on. \n */\nexport function pipe(...fns: Array>): UnaryFunction {\n return pipeFromArray(fns);\n}\n\n/** @internal */\nexport function pipeFromArray(fns: Array>): UnaryFunction {\n if (fns.length === 0) {\n return identity as UnaryFunction;\n }\n\n if (fns.length === 1) {\n return fns[0];\n }\n\n return function piped(input: T): R {\n return fns.reduce((prev: any, fn: UnaryFunction) => fn(prev), input as any);\n };\n}\n", "import { Operator } from './Operator';\nimport { SafeSubscriber, Subscriber } from './Subscriber';\nimport { isSubscription, Subscription } from './Subscription';\nimport { TeardownLogic, OperatorFunction, Subscribable, Observer } from './types';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\nimport { isFunction } from './util/isFunction';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A representation of any set of values over any amount of time. This is the most basic building block\n * of RxJS.\n *\n * @class Observable\n */\nexport class Observable implements Subscribable {\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n source: Observable | undefined;\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n operator: Operator | undefined;\n\n /**\n * @constructor\n * @param {Function} subscribe the function that is called when the Observable is\n * initially subscribed to. This function is given a Subscriber, to which new values\n * can be `next`ed, or an `error` method can be called to raise an error, or\n * `complete` can be called to notify of a successful completion.\n */\n constructor(subscribe?: (this: Observable, subscriber: Subscriber) => TeardownLogic) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n\n // HACK: Since TypeScript inherits static properties too, we have to\n // fight against TypeScript here so Subject can have a different static create signature\n /**\n * Creates a new Observable by calling the Observable constructor\n * @owner Observable\n * @method create\n * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor\n * @return {Observable} a new observable\n * @nocollapse\n * @deprecated Use `new Observable()` instead. Will be removed in v8.\n */\n static create: (...args: any[]) => any = (subscribe?: (subscriber: Subscriber) => TeardownLogic) => {\n return new Observable(subscribe);\n };\n\n /**\n * Creates a new Observable, with this Observable instance as the source, and the passed\n * operator defined as the new observable's operator.\n * @method lift\n * @param operator the operator defining the operation to take on the observable\n * @return a new observable with the Operator applied\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * If you have implemented an operator using `lift`, it is recommended that you create an\n * operator by simply returning `new Observable()` directly. See \"Creating new operators from\n * scratch\" section here: https://rxjs.dev/guide/operators\n */\n lift(operator?: Operator): Observable {\n const observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n }\n\n subscribe(observerOrNext?: Partial> | ((value: T) => void)): Subscription;\n /** @deprecated Instead of passing separate callback arguments, use an observer argument. Signatures taking separate callback arguments will be removed in v8. Details: https://rxjs.dev/deprecations/subscribe-arguments */\n subscribe(next?: ((value: T) => void) | null, error?: ((error: any) => void) | null, complete?: (() => void) | null): Subscription;\n /**\n * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.\n *\n * Use it when you have all these Observables, but still nothing is happening.\n *\n * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It\n * might be for example a function that you passed to Observable's constructor, but most of the time it is\n * a library implementation, which defines what will be emitted by an Observable, and when it be will emitted. This means\n * that calling `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often\n * the thought.\n *\n * Apart from starting the execution of an Observable, this method allows you to listen for values\n * that an Observable emits, as well as for when it completes or errors. You can achieve this in two\n * of the following ways.\n *\n * The first way is creating an object that implements {@link Observer} interface. It should have methods\n * defined by that interface, but note that it should be just a regular JavaScript object, which you can create\n * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular, do\n * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also\n * that your object does not have to implement all methods. If you find yourself creating a method that doesn't\n * do anything, you can simply omit it. Note however, if the `error` method is not provided and an error happens,\n * it will be thrown asynchronously. Errors thrown asynchronously cannot be caught using `try`/`catch`. Instead,\n * use the {@link onUnhandledError} configuration option or use a runtime handler (like `window.onerror` or\n * `process.on('error)`) to be notified of unhandled errors. Because of this, it's recommended that you provide\n * an `error` method to avoid missing thrown errors.\n *\n * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.\n * This means you can provide three functions as arguments to `subscribe`, where the first function is equivalent\n * of a `next` method, the second of an `error` method and the third of a `complete` method. Just as in case of an Observer,\n * if you do not need to listen for something, you can omit a function by passing `undefined` or `null`,\n * since `subscribe` recognizes these functions by where they were placed in function call. When it comes\n * to the `error` function, as with an Observer, if not provided, errors emitted by an Observable will be thrown asynchronously.\n *\n * You can, however, subscribe with no parameters at all. This may be the case where you're not interested in terminal events\n * and you also handled emissions internally by using operators (e.g. using `tap`).\n *\n * Whichever style of calling `subscribe` you use, in both cases it returns a Subscription object.\n * This object allows you to call `unsubscribe` on it, which in turn will stop the work that an Observable does and will clean\n * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback\n * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.\n *\n * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.\n * It is an Observable itself that decides when these functions will be called. For example {@link of}\n * by default emits all its values synchronously. Always check documentation for how given Observable\n * will behave when subscribed and if its default behavior can be modified with a `scheduler`.\n *\n * #### Examples\n *\n * Subscribe with an {@link guide/observer Observer}\n *\n * ```ts\n * import { of } from 'rxjs';\n *\n * const sumObserver = {\n * sum: 0,\n * next(value) {\n * console.log('Adding: ' + value);\n * this.sum = this.sum + value;\n * },\n * error() {\n * // We actually could just remove this method,\n * // since we do not really care about errors right now.\n * },\n * complete() {\n * console.log('Sum equals: ' + this.sum);\n * }\n * };\n *\n * of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.\n * .subscribe(sumObserver);\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Subscribe with functions ({@link deprecations/subscribe-arguments deprecated})\n *\n * ```ts\n * import { of } from 'rxjs'\n *\n * let sum = 0;\n *\n * of(1, 2, 3).subscribe(\n * value => {\n * console.log('Adding: ' + value);\n * sum = sum + value;\n * },\n * undefined,\n * () => console.log('Sum equals: ' + sum)\n * );\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Cancel a subscription\n *\n * ```ts\n * import { interval } from 'rxjs';\n *\n * const subscription = interval(1000).subscribe({\n * next(num) {\n * console.log(num)\n * },\n * complete() {\n * // Will not be called, even when cancelling subscription.\n * console.log('completed!');\n * }\n * });\n *\n * setTimeout(() => {\n * subscription.unsubscribe();\n * console.log('unsubscribed!');\n * }, 2500);\n *\n * // Logs:\n * // 0 after 1s\n * // 1 after 2s\n * // 'unsubscribed!' after 2.5s\n * ```\n *\n * @param {Observer|Function} observerOrNext (optional) Either an observer with methods to be called,\n * or the first of three possible handlers, which is the handler for each value emitted from the subscribed\n * Observable.\n * @param {Function} error (optional) A handler for a terminal event resulting from an error. If no error handler is provided,\n * the error will be thrown asynchronously as unhandled.\n * @param {Function} complete (optional) A handler for a terminal event resulting from successful completion.\n * @return {Subscription} a subscription reference to the registered handlers\n * @method subscribe\n */\n subscribe(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((error: any) => void) | null,\n complete?: (() => void) | null\n ): Subscription {\n const subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);\n\n errorContext(() => {\n const { operator, source } = this;\n subscriber.add(\n operator\n ? // We're dealing with a subscription in the\n // operator chain to one of our lifted operators.\n operator.call(subscriber, source)\n : source\n ? // If `source` has a value, but `operator` does not, something that\n // had intimate knowledge of our API, like our `Subject`, must have\n // set it. We're going to just call `_subscribe` directly.\n this._subscribe(subscriber)\n : // In all other cases, we're likely wrapping a user-provided initializer\n // function, so we need to catch errors and handle them appropriately.\n this._trySubscribe(subscriber)\n );\n });\n\n return subscriber;\n }\n\n /** @internal */\n protected _trySubscribe(sink: Subscriber): TeardownLogic {\n try {\n return this._subscribe(sink);\n } catch (err) {\n // We don't need to return anything in this case,\n // because it's just going to try to `add()` to a subscription\n // above.\n sink.error(err);\n }\n }\n\n /**\n * Used as a NON-CANCELLABLE means of subscribing to an observable, for use with\n * APIs that expect promises, like `async/await`. You cannot unsubscribe from this.\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * #### Example\n *\n * ```ts\n * import { interval, take } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(4));\n *\n * async function getTotal() {\n * let total = 0;\n *\n * await source$.forEach(value => {\n * total += value;\n * console.log('observable -> ' + value);\n * });\n *\n * return total;\n * }\n *\n * getTotal().then(\n * total => console.log('Total: ' + total)\n * );\n *\n * // Expected:\n * // 'observable -> 0'\n * // 'observable -> 1'\n * // 'observable -> 2'\n * // 'observable -> 3'\n * // 'Total: 6'\n * ```\n *\n * @param next a handler for each value emitted by the observable\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n */\n forEach(next: (value: T) => void): Promise;\n\n /**\n * @param next a handler for each value emitted by the observable\n * @param promiseCtor a constructor function used to instantiate the Promise\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n * @deprecated Passing a Promise constructor will no longer be available\n * in upcoming versions of RxJS. This is because it adds weight to the library, for very\n * little benefit. If you need this functionality, it is recommended that you either\n * polyfill Promise, or you create an adapter to convert the returned native promise\n * to whatever promise implementation you wanted. Will be removed in v8.\n */\n forEach(next: (value: T) => void, promiseCtor: PromiseConstructorLike): Promise;\n\n forEach(next: (value: T) => void, promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n const subscriber = new SafeSubscriber({\n next: (value) => {\n try {\n next(value);\n } catch (err) {\n reject(err);\n subscriber.unsubscribe();\n }\n },\n error: reject,\n complete: resolve,\n });\n this.subscribe(subscriber);\n }) as Promise;\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): TeardownLogic {\n return this.source?.subscribe(subscriber);\n }\n\n /**\n * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable\n * @method Symbol.observable\n * @return {Observable} this instance of the observable\n */\n [Symbol_observable]() {\n return this;\n }\n\n /* tslint:disable:max-line-length */\n pipe(): Observable;\n pipe(op1: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction,\n ...operations: OperatorFunction[]\n ): Observable;\n /* tslint:enable:max-line-length */\n\n /**\n * Used to stitch together functional operators into a chain.\n * @method pipe\n * @return {Observable} the Observable result of all of the operators having\n * been called in the order they were passed in.\n *\n * ## Example\n *\n * ```ts\n * import { interval, filter, map, scan } from 'rxjs';\n *\n * interval(1000)\n * .pipe(\n * filter(x => x % 2 === 0),\n * map(x => x + x),\n * scan((acc, x) => acc + x)\n * )\n * .subscribe(x => console.log(x));\n * ```\n */\n pipe(...operations: OperatorFunction[]): Observable {\n return pipeFromArray(operations)(this);\n }\n\n /* tslint:disable:max-line-length */\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: typeof Promise): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: PromiseConstructorLike): Promise;\n /* tslint:enable:max-line-length */\n\n /**\n * Subscribe to this Observable and get a Promise resolving on\n * `complete` with the last emission (if any).\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * @method toPromise\n * @param [promiseCtor] a constructor function used to instantiate\n * the Promise\n * @return A Promise that resolves with the last value emit, or\n * rejects on an error. If there were no emissions, Promise\n * resolves with undefined.\n * @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise\n */\n toPromise(promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n let value: T | undefined;\n this.subscribe(\n (x: T) => (value = x),\n (err: any) => reject(err),\n () => resolve(value)\n );\n }) as Promise;\n }\n}\n\n/**\n * Decides between a passed promise constructor from consuming code,\n * A default configured promise constructor, and the native promise\n * constructor and returns it. If nothing can be found, it will throw\n * an error.\n * @param promiseCtor The optional promise constructor to passed by consuming code\n */\nfunction getPromiseCtor(promiseCtor: PromiseConstructorLike | undefined) {\n return promiseCtor ?? config.Promise ?? Promise;\n}\n\nfunction isObserver(value: any): value is Observer {\n return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);\n}\n\nfunction isSubscriber(value: any): value is Subscriber {\n return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));\n}\n", "import { Observable } from '../Observable';\nimport { Subscriber } from '../Subscriber';\nimport { OperatorFunction } from '../types';\nimport { isFunction } from './isFunction';\n\n/**\n * Used to determine if an object is an Observable with a lift function.\n */\nexport function hasLift(source: any): source is { lift: InstanceType['lift'] } {\n return isFunction(source?.lift);\n}\n\n/**\n * Creates an `OperatorFunction`. Used to define operators throughout the library in a concise way.\n * @param init The logic to connect the liftedSource to the subscriber at the moment of subscription.\n */\nexport function operate(\n init: (liftedSource: Observable, subscriber: Subscriber) => (() => void) | void\n): OperatorFunction {\n return (source: Observable) => {\n if (hasLift(source)) {\n return source.lift(function (this: Subscriber, liftedSource: Observable) {\n try {\n return init(liftedSource, this);\n } catch (err) {\n this.error(err);\n }\n });\n }\n throw new TypeError('Unable to lift unknown Observable type');\n };\n}\n", "import { Subscriber } from '../Subscriber';\n\n/**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional teardown logic here. This will only be called on teardown if the\n * subscriber itself is not already closed. This is called after all other teardown logic is executed.\n */\nexport function createOperatorSubscriber(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n onFinalize?: () => void\n): Subscriber {\n return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);\n}\n\n/**\n * A generic helper for allowing operators to be created with a Subscriber and\n * use closures to capture necessary state from the operator function itself.\n */\nexport class OperatorSubscriber extends Subscriber {\n /**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional finalization logic here. This will only be called on finalization if the\n * subscriber itself is not already closed. This is called after all other finalization logic is executed.\n * @param shouldUnsubscribe An optional check to see if an unsubscribe call should truly unsubscribe.\n * NOTE: This currently **ONLY** exists to support the strange behavior of {@link groupBy}, where unsubscription\n * to the resulting observable does not actually disconnect from the source if there are active subscriptions\n * to any grouped observable. (DO NOT EXPOSE OR USE EXTERNALLY!!!)\n */\n constructor(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n private onFinalize?: () => void,\n private shouldUnsubscribe?: () => boolean\n ) {\n // It's important - for performance reasons - that all of this class's\n // members are initialized and that they are always initialized in the same\n // order. This will ensure that all OperatorSubscriber instances have the\n // same hidden class in V8. This, in turn, will help keep the number of\n // hidden classes involved in property accesses within the base class as\n // low as possible. If the number of hidden classes involved exceeds four,\n // the property accesses will become megamorphic and performance penalties\n // will be incurred - i.e. inline caches won't be used.\n //\n // The reasons for ensuring all instances have the same hidden class are\n // further discussed in this blog post from Benedikt Meurer:\n // https://benediktmeurer.de/2018/03/23/impact-of-polymorphism-on-component-based-frameworks-like-react/\n super(destination);\n this._next = onNext\n ? function (this: OperatorSubscriber, value: T) {\n try {\n onNext(value);\n } catch (err) {\n destination.error(err);\n }\n }\n : super._next;\n this._error = onError\n ? function (this: OperatorSubscriber, err: any) {\n try {\n onError(err);\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._error;\n this._complete = onComplete\n ? function (this: OperatorSubscriber) {\n try {\n onComplete();\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._complete;\n }\n\n unsubscribe() {\n if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {\n const { closed } = this;\n super.unsubscribe();\n // Execute additional teardown if we have any and we didn't already do so.\n !closed && this.onFinalize?.();\n }\n }\n}\n", "import { Subscription } from '../Subscription';\n\ninterface AnimationFrameProvider {\n schedule(callback: FrameRequestCallback): Subscription;\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n delegate:\n | {\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n }\n | undefined;\n}\n\nexport const animationFrameProvider: AnimationFrameProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n schedule(callback) {\n let request = requestAnimationFrame;\n let cancel: typeof cancelAnimationFrame | undefined = cancelAnimationFrame;\n const { delegate } = animationFrameProvider;\n if (delegate) {\n request = delegate.requestAnimationFrame;\n cancel = delegate.cancelAnimationFrame;\n }\n const handle = request((timestamp) => {\n // Clear the cancel function. The request has been fulfilled, so\n // attempting to cancel the request upon unsubscription would be\n // pointless.\n cancel = undefined;\n callback(timestamp);\n });\n return new Subscription(() => cancel?.(handle));\n },\n requestAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.requestAnimationFrame || requestAnimationFrame)(...args);\n },\n cancelAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.cancelAnimationFrame || cancelAnimationFrame)(...args);\n },\n delegate: undefined,\n};\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface ObjectUnsubscribedError extends Error {}\n\nexport interface ObjectUnsubscribedErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (): ObjectUnsubscribedError;\n}\n\n/**\n * An error thrown when an action is invalid because the object has been\n * unsubscribed.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n *\n * @class ObjectUnsubscribedError\n */\nexport const ObjectUnsubscribedError: ObjectUnsubscribedErrorCtor = createErrorClass(\n (_super) =>\n function ObjectUnsubscribedErrorImpl(this: any) {\n _super(this);\n this.name = 'ObjectUnsubscribedError';\n this.message = 'object unsubscribed';\n }\n);\n", "import { Operator } from './Operator';\nimport { Observable } from './Observable';\nimport { Subscriber } from './Subscriber';\nimport { Subscription, EMPTY_SUBSCRIPTION } from './Subscription';\nimport { Observer, SubscriptionLike, TeardownLogic } from './types';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { arrRemove } from './util/arrRemove';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A Subject is a special type of Observable that allows values to be\n * multicasted to many Observers. Subjects are like EventEmitters.\n *\n * Every Subject is an Observable and an Observer. You can subscribe to a\n * Subject, and you can call next to feed values as well as error and complete.\n */\nexport class Subject extends Observable implements SubscriptionLike {\n closed = false;\n\n private currentObservers: Observer[] | null = null;\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n observers: Observer[] = [];\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n isStopped = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n hasError = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n thrownError: any = null;\n\n /**\n * Creates a \"subject\" by basically gluing an observer to an observable.\n *\n * @nocollapse\n * @deprecated Recommended you do not use. Will be removed at some point in the future. Plans for replacement still under discussion.\n */\n static create: (...args: any[]) => any = (destination: Observer, source: Observable): AnonymousSubject => {\n return new AnonymousSubject(destination, source);\n };\n\n constructor() {\n // NOTE: This must be here to obscure Observable's constructor.\n super();\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n lift(operator: Operator): Observable {\n const subject = new AnonymousSubject(this, this);\n subject.operator = operator as any;\n return subject as any;\n }\n\n /** @internal */\n protected _throwIfClosed() {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n }\n\n next(value: T) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n if (!this.currentObservers) {\n this.currentObservers = Array.from(this.observers);\n }\n for (const observer of this.currentObservers) {\n observer.next(value);\n }\n }\n });\n }\n\n error(err: any) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.hasError = this.isStopped = true;\n this.thrownError = err;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.error(err);\n }\n }\n });\n }\n\n complete() {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.isStopped = true;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.complete();\n }\n }\n });\n }\n\n unsubscribe() {\n this.isStopped = this.closed = true;\n this.observers = this.currentObservers = null!;\n }\n\n get observed() {\n return this.observers?.length > 0;\n }\n\n /** @internal */\n protected _trySubscribe(subscriber: Subscriber): TeardownLogic {\n this._throwIfClosed();\n return super._trySubscribe(subscriber);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._checkFinalizedStatuses(subscriber);\n return this._innerSubscribe(subscriber);\n }\n\n /** @internal */\n protected _innerSubscribe(subscriber: Subscriber) {\n const { hasError, isStopped, observers } = this;\n if (hasError || isStopped) {\n return EMPTY_SUBSCRIPTION;\n }\n this.currentObservers = null;\n observers.push(subscriber);\n return new Subscription(() => {\n this.currentObservers = null;\n arrRemove(observers, subscriber);\n });\n }\n\n /** @internal */\n protected _checkFinalizedStatuses(subscriber: Subscriber) {\n const { hasError, thrownError, isStopped } = this;\n if (hasError) {\n subscriber.error(thrownError);\n } else if (isStopped) {\n subscriber.complete();\n }\n }\n\n /**\n * Creates a new Observable with this Subject as the source. You can do this\n * to create custom Observer-side logic of the Subject and conceal it from\n * code that uses the Observable.\n * @return {Observable} Observable that the Subject casts to\n */\n asObservable(): Observable {\n const observable: any = new Observable();\n observable.source = this;\n return observable;\n }\n}\n\n/**\n * @class AnonymousSubject\n */\nexport class AnonymousSubject extends Subject {\n constructor(\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n public destination?: Observer,\n source?: Observable\n ) {\n super();\n this.source = source;\n }\n\n next(value: T) {\n this.destination?.next?.(value);\n }\n\n error(err: any) {\n this.destination?.error?.(err);\n }\n\n complete() {\n this.destination?.complete?.();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n return this.source?.subscribe(subscriber) ?? EMPTY_SUBSCRIPTION;\n }\n}\n", "import { Subject } from './Subject';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\n\n/**\n * A variant of Subject that requires an initial value and emits its current\n * value whenever it is subscribed to.\n *\n * @class BehaviorSubject\n */\nexport class BehaviorSubject extends Subject {\n constructor(private _value: T) {\n super();\n }\n\n get value(): T {\n return this.getValue();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n const subscription = super._subscribe(subscriber);\n !subscription.closed && subscriber.next(this._value);\n return subscription;\n }\n\n getValue(): T {\n const { hasError, thrownError, _value } = this;\n if (hasError) {\n throw thrownError;\n }\n this._throwIfClosed();\n return _value;\n }\n\n next(value: T): void {\n super.next((this._value = value));\n }\n}\n", "import { TimestampProvider } from '../types';\n\ninterface DateTimestampProvider extends TimestampProvider {\n delegate: TimestampProvider | undefined;\n}\n\nexport const dateTimestampProvider: DateTimestampProvider = {\n now() {\n // Use the variable rather than `this` so that the function can be called\n // without being bound to the provider.\n return (dateTimestampProvider.delegate || Date).now();\n },\n delegate: undefined,\n};\n", "import { Subject } from './Subject';\nimport { TimestampProvider } from './types';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * A variant of {@link Subject} that \"replays\" old values to new subscribers by emitting them when they first subscribe.\n *\n * `ReplaySubject` has an internal buffer that will store a specified number of values that it has observed. Like `Subject`,\n * `ReplaySubject` \"observes\" values by having them passed to its `next` method. When it observes a value, it will store that\n * value for a time determined by the configuration of the `ReplaySubject`, as passed to its constructor.\n *\n * When a new subscriber subscribes to the `ReplaySubject` instance, it will synchronously emit all values in its buffer in\n * a First-In-First-Out (FIFO) manner. The `ReplaySubject` will also complete, if it has observed completion; and it will\n * error if it has observed an error.\n *\n * There are two main configuration items to be concerned with:\n *\n * 1. `bufferSize` - This will determine how many items are stored in the buffer, defaults to infinite.\n * 2. `windowTime` - The amount of time to hold a value in the buffer before removing it from the buffer.\n *\n * Both configurations may exist simultaneously. So if you would like to buffer a maximum of 3 values, as long as the values\n * are less than 2 seconds old, you could do so with a `new ReplaySubject(3, 2000)`.\n *\n * ### Differences with BehaviorSubject\n *\n * `BehaviorSubject` is similar to `new ReplaySubject(1)`, with a couple of exceptions:\n *\n * 1. `BehaviorSubject` comes \"primed\" with a single value upon construction.\n * 2. `ReplaySubject` will replay values, even after observing an error, where `BehaviorSubject` will not.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n * @see {@link shareReplay}\n */\nexport class ReplaySubject extends Subject {\n private _buffer: (T | number)[] = [];\n private _infiniteTimeWindow = true;\n\n /**\n * @param bufferSize The size of the buffer to replay on subscription\n * @param windowTime The amount of time the buffered items will stay buffered\n * @param timestampProvider An object with a `now()` method that provides the current timestamp. This is used to\n * calculate the amount of time something has been buffered.\n */\n constructor(\n private _bufferSize = Infinity,\n private _windowTime = Infinity,\n private _timestampProvider: TimestampProvider = dateTimestampProvider\n ) {\n super();\n this._infiniteTimeWindow = _windowTime === Infinity;\n this._bufferSize = Math.max(1, _bufferSize);\n this._windowTime = Math.max(1, _windowTime);\n }\n\n next(value: T): void {\n const { isStopped, _buffer, _infiniteTimeWindow, _timestampProvider, _windowTime } = this;\n if (!isStopped) {\n _buffer.push(value);\n !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);\n }\n this._trimBuffer();\n super.next(value);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._trimBuffer();\n\n const subscription = this._innerSubscribe(subscriber);\n\n const { _infiniteTimeWindow, _buffer } = this;\n // We use a copy here, so reentrant code does not mutate our array while we're\n // emitting it to a new subscriber.\n const copy = _buffer.slice();\n for (let i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {\n subscriber.next(copy[i] as T);\n }\n\n this._checkFinalizedStatuses(subscriber);\n\n return subscription;\n }\n\n private _trimBuffer() {\n const { _bufferSize, _timestampProvider, _buffer, _infiniteTimeWindow } = this;\n // If we don't have an infinite buffer size, and we're over the length,\n // use splice to truncate the old buffer values off. Note that we have to\n // double the size for instances where we're not using an infinite time window\n // because we're storing the values and the timestamps in the same array.\n const adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;\n _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);\n\n // Now, if we're not in an infinite time window, remove all values where the time is\n // older than what is allowed.\n if (!_infiniteTimeWindow) {\n const now = _timestampProvider.now();\n let last = 0;\n // Search the array for the first timestamp that isn't expired and\n // truncate the buffer up to that point.\n for (let i = 1; i < _buffer.length && (_buffer[i] as number) <= now; i += 2) {\n last = i;\n }\n last && _buffer.splice(0, last + 1);\n }\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Subscription } from '../Subscription';\nimport { SchedulerAction } from '../types';\n\n/**\n * A unit of work to be executed in a `scheduler`. An action is typically\n * created from within a {@link SchedulerLike} and an RxJS user does not need to concern\n * themselves about creating and manipulating an Action.\n *\n * ```ts\n * class Action extends Subscription {\n * new (scheduler: Scheduler, work: (state?: T) => void);\n * schedule(state?: T, delay: number = 0): Subscription;\n * }\n * ```\n *\n * @class Action\n */\nexport class Action extends Subscription {\n constructor(scheduler: Scheduler, work: (this: SchedulerAction, state?: T) => void) {\n super();\n }\n /**\n * Schedules this action on its parent {@link SchedulerLike} for execution. May be passed\n * some context object, `state`. May happen at some point in the future,\n * according to the `delay` parameter, if specified.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler.\n * @return {void}\n */\n public schedule(state?: T, delay: number = 0): Subscription {\n return this;\n }\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetIntervalFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearIntervalFunction = (handle: TimerHandle) => void;\n\ninterface IntervalProvider {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n delegate:\n | {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n }\n | undefined;\n}\n\nexport const intervalProvider: IntervalProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setInterval(handler: () => void, timeout?: number, ...args) {\n const { delegate } = intervalProvider;\n if (delegate?.setInterval) {\n return delegate.setInterval(handler, timeout, ...args);\n }\n return setInterval(handler, timeout, ...args);\n },\n clearInterval(handle) {\n const { delegate } = intervalProvider;\n return (delegate?.clearInterval || clearInterval)(handle as any);\n },\n delegate: undefined,\n};\n", "import { Action } from './Action';\nimport { SchedulerAction } from '../types';\nimport { Subscription } from '../Subscription';\nimport { AsyncScheduler } from './AsyncScheduler';\nimport { intervalProvider } from './intervalProvider';\nimport { arrRemove } from '../util/arrRemove';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncAction extends Action {\n public id: TimerHandle | undefined;\n public state?: T;\n // @ts-ignore: Property has no initializer and is not definitely assigned\n public delay: number;\n protected pending: boolean = false;\n\n constructor(protected scheduler: AsyncScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (this.closed) {\n return this;\n }\n\n // Always replace the current state with the new state.\n this.state = state;\n\n const id = this.id;\n const scheduler = this.scheduler;\n\n //\n // Important implementation note:\n //\n // Actions only execute once by default, unless rescheduled from within the\n // scheduled callback. This allows us to implement single and repeat\n // actions via the same code path, without adding API surface area, as well\n // as mimic traditional recursion but across asynchronous boundaries.\n //\n // However, JS runtimes and timers distinguish between intervals achieved by\n // serial `setTimeout` calls vs. a single `setInterval` call. An interval of\n // serial `setTimeout` calls can be individually delayed, which delays\n // scheduling the next `setTimeout`, and so on. `setInterval` attempts to\n // guarantee the interval callback will be invoked more precisely to the\n // interval period, regardless of load.\n //\n // Therefore, we use `setInterval` to schedule single and repeat actions.\n // If the action reschedules itself with the same delay, the interval is not\n // canceled. If the action doesn't reschedule, or reschedules with a\n // different delay, the interval will be canceled after scheduled callback\n // execution.\n //\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n\n // Set the pending flag indicating that this action has been scheduled, or\n // has recursively rescheduled itself.\n this.pending = true;\n\n this.delay = delay;\n // If this action has already an async Id, don't request a new one.\n this.id = this.id ?? this.requestAsyncId(scheduler, this.id, delay);\n\n return this;\n }\n\n protected requestAsyncId(scheduler: AsyncScheduler, _id?: TimerHandle, delay: number = 0): TimerHandle {\n return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);\n }\n\n protected recycleAsyncId(_scheduler: AsyncScheduler, id?: TimerHandle, delay: number | null = 0): TimerHandle | undefined {\n // If this action is rescheduled with the same delay time, don't clear the interval id.\n if (delay != null && this.delay === delay && this.pending === false) {\n return id;\n }\n // Otherwise, if the action's delay time is different from the current delay,\n // or the action has been rescheduled before it's executed, clear the interval id\n if (id != null) {\n intervalProvider.clearInterval(id);\n }\n\n return undefined;\n }\n\n /**\n * Immediately executes this action and the `work` it contains.\n * @return {any}\n */\n public execute(state: T, delay: number): any {\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n\n this.pending = false;\n const error = this._execute(state, delay);\n if (error) {\n return error;\n } else if (this.pending === false && this.id != null) {\n // Dequeue if the action didn't reschedule itself. Don't call\n // unsubscribe(), because the action could reschedule later.\n // For example:\n // ```\n // scheduler.schedule(function doWork(counter) {\n // /* ... I'm a busy worker bee ... */\n // var originalAction = this;\n // /* wait 100ms before rescheduling the action */\n // setTimeout(function () {\n // originalAction.schedule(counter + 1);\n // }, 100);\n // }, 1000);\n // ```\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n }\n\n protected _execute(state: T, _delay: number): any {\n let errored: boolean = false;\n let errorValue: any;\n try {\n this.work(state);\n } catch (e) {\n errored = true;\n // HACK: Since code elsewhere is relying on the \"truthiness\" of the\n // return here, we can't have it return \"\" or 0 or false.\n // TODO: Clean this up when we refactor schedulers mid-version-8 or so.\n errorValue = e ? e : new Error('Scheduled action threw falsy error');\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n }\n\n unsubscribe() {\n if (!this.closed) {\n const { id, scheduler } = this;\n const { actions } = scheduler;\n\n this.work = this.state = this.scheduler = null!;\n this.pending = false;\n\n arrRemove(actions, this);\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n\n this.delay = null!;\n super.unsubscribe();\n }\n }\n}\n", "import { Action } from './scheduler/Action';\nimport { Subscription } from './Subscription';\nimport { SchedulerLike, SchedulerAction } from './types';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * An execution context and a data structure to order tasks and schedule their\n * execution. Provides a notion of (potentially virtual) time, through the\n * `now()` getter method.\n *\n * Each unit of work in a Scheduler is called an `Action`.\n *\n * ```ts\n * class Scheduler {\n * now(): number;\n * schedule(work, delay?, state?): Subscription;\n * }\n * ```\n *\n * @class Scheduler\n * @deprecated Scheduler is an internal implementation detail of RxJS, and\n * should not be used directly. Rather, create your own class and implement\n * {@link SchedulerLike}. Will be made internal in v8.\n */\nexport class Scheduler implements SchedulerLike {\n public static now: () => number = dateTimestampProvider.now;\n\n constructor(private schedulerActionCtor: typeof Action, now: () => number = Scheduler.now) {\n this.now = now;\n }\n\n /**\n * A getter method that returns a number representing the current time\n * (at the time this function was called) according to the scheduler's own\n * internal clock.\n * @return {number} A number that represents the current time. May or may not\n * have a relation to wall-clock time. May or may not refer to a time unit\n * (e.g. milliseconds).\n */\n public now: () => number;\n\n /**\n * Schedules a function, `work`, for execution. May happen at some point in\n * the future, according to the `delay` parameter, if specified. May be passed\n * some context object, `state`, which will be passed to the `work` function.\n *\n * The given arguments will be processed an stored as an Action object in a\n * queue of actions.\n *\n * @param {function(state: ?T): ?Subscription} work A function representing a\n * task, or some unit of work to be executed by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler itself.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @return {Subscription} A subscription in order to be able to unsubscribe\n * the scheduled work.\n */\n public schedule(work: (this: SchedulerAction, state?: T) => void, delay: number = 0, state?: T): Subscription {\n return new this.schedulerActionCtor(this, work).schedule(state, delay);\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Action } from './Action';\nimport { AsyncAction } from './AsyncAction';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncScheduler extends Scheduler {\n public actions: Array> = [];\n /**\n * A flag to indicate whether the Scheduler is currently executing a batch of\n * queued actions.\n * @type {boolean}\n * @internal\n */\n public _active: boolean = false;\n /**\n * An internal ID used to track the latest asynchronous task such as those\n * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and\n * others.\n * @type {any}\n * @internal\n */\n public _scheduled: TimerHandle | undefined;\n\n constructor(SchedulerAction: typeof Action, now: () => number = Scheduler.now) {\n super(SchedulerAction, now);\n }\n\n public flush(action: AsyncAction): void {\n const { actions } = this;\n\n if (this._active) {\n actions.push(action);\n return;\n }\n\n let error: any;\n this._active = true;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions.shift()!)); // exhaust the scheduler queue\n\n this._active = false;\n\n if (error) {\n while ((action = actions.shift()!)) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\n/**\n *\n * Async Scheduler\n *\n * Schedule task as if you used setTimeout(task, duration)\n *\n * `async` scheduler schedules tasks asynchronously, by putting them on the JavaScript\n * event loop queue. It is best used to delay tasks in time or to schedule tasks repeating\n * in intervals.\n *\n * If you just want to \"defer\" task, that is to perform it right after currently\n * executing synchronous code ends (commonly achieved by `setTimeout(deferredTask, 0)`),\n * better choice will be the {@link asapScheduler} scheduler.\n *\n * ## Examples\n * Use async scheduler to delay task\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * const task = () => console.log('it works!');\n *\n * asyncScheduler.schedule(task, 2000);\n *\n * // After 2 seconds logs:\n * // \"it works!\"\n * ```\n *\n * Use async scheduler to repeat task in intervals\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * function task(state) {\n * console.log(state);\n * this.schedule(state + 1, 1000); // `this` references currently executing Action,\n * // which we reschedule with new state and delay\n * }\n *\n * asyncScheduler.schedule(task, 3000, 0);\n *\n * // Logs:\n * // 0 after 3s\n * // 1 after 4s\n * // 2 after 5s\n * // 3 after 6s\n * ```\n */\n\nexport const asyncScheduler = new AsyncScheduler(AsyncAction);\n\n/**\n * @deprecated Renamed to {@link asyncScheduler}. Will be removed in v8.\n */\nexport const async = asyncScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { Subscription } from '../Subscription';\nimport { QueueScheduler } from './QueueScheduler';\nimport { SchedulerAction } from '../types';\nimport { TimerHandle } from './timerHandle';\n\nexport class QueueAction extends AsyncAction {\n constructor(protected scheduler: QueueScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (delay > 0) {\n return super.schedule(state, delay);\n }\n this.delay = delay;\n this.state = state;\n this.scheduler.flush(this);\n return this;\n }\n\n public execute(state: T, delay: number): any {\n return delay > 0 || this.closed ? super.execute(state, delay) : this._execute(state, delay);\n }\n\n protected requestAsyncId(scheduler: QueueScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n\n if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n\n // Otherwise flush the scheduler starting with this action.\n scheduler.flush(this);\n\n // HACK: In the past, this was returning `void`. However, `void` isn't a valid\n // `TimerHandle`, and generally the return value here isn't really used. So the\n // compromise is to return `0` which is both \"falsy\" and a valid `TimerHandle`,\n // as opposed to refactoring every other instanceo of `requestAsyncId`.\n return 0;\n }\n}\n", "import { AsyncScheduler } from './AsyncScheduler';\n\nexport class QueueScheduler extends AsyncScheduler {\n}\n", "import { QueueAction } from './QueueAction';\nimport { QueueScheduler } from './QueueScheduler';\n\n/**\n *\n * Queue Scheduler\n *\n * Put every next task on a queue, instead of executing it immediately\n *\n * `queue` scheduler, when used with delay, behaves the same as {@link asyncScheduler} scheduler.\n *\n * When used without delay, it schedules given task synchronously - executes it right when\n * it is scheduled. However when called recursively, that is when inside the scheduled task,\n * another task is scheduled with queue scheduler, instead of executing immediately as well,\n * that task will be put on a queue and wait for current one to finish.\n *\n * This means that when you execute task with `queue` scheduler, you are sure it will end\n * before any other task scheduled with that scheduler will start.\n *\n * ## Examples\n * Schedule recursively first, then do something\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(() => {\n * queueScheduler.schedule(() => console.log('second')); // will not happen now, but will be put on a queue\n *\n * console.log('first');\n * });\n *\n * // Logs:\n * // \"first\"\n * // \"second\"\n * ```\n *\n * Reschedule itself recursively\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(function(state) {\n * if (state !== 0) {\n * console.log('before', state);\n * this.schedule(state - 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * console.log('after', state);\n * }\n * }, 0, 3);\n *\n * // In scheduler that runs recursively, you would expect:\n * // \"before\", 3\n * // \"before\", 2\n * // \"before\", 1\n * // \"after\", 1\n * // \"after\", 2\n * // \"after\", 3\n *\n * // But with queue it logs:\n * // \"before\", 3\n * // \"after\", 3\n * // \"before\", 2\n * // \"after\", 2\n * // \"before\", 1\n * // \"after\", 1\n * ```\n */\n\nexport const queueScheduler = new QueueScheduler(QueueAction);\n\n/**\n * @deprecated Renamed to {@link queueScheduler}. Will be removed in v8.\n */\nexport const queue = queueScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\nimport { SchedulerAction } from '../types';\nimport { animationFrameProvider } from './animationFrameProvider';\nimport { TimerHandle } from './timerHandle';\n\nexport class AnimationFrameAction extends AsyncAction {\n constructor(protected scheduler: AnimationFrameScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n protected requestAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay is greater than 0, request as an async action.\n if (delay !== null && delay > 0) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n // Push the action to the end of the scheduler queue.\n scheduler.actions.push(this);\n // If an animation frame has already been requested, don't request another\n // one. If an animation frame hasn't been requested yet, request one. Return\n // the current animation frame request id.\n return scheduler._scheduled || (scheduler._scheduled = animationFrameProvider.requestAnimationFrame(() => scheduler.flush(undefined)));\n }\n\n protected recycleAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle | undefined {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n if (delay != null ? delay > 0 : this.delay > 0) {\n return super.recycleAsyncId(scheduler, id, delay);\n }\n // If the scheduler queue has no remaining actions with the same async id,\n // cancel the requested animation frame and set the scheduled flag to\n // undefined so the next AnimationFrameAction will request its own.\n const { actions } = scheduler;\n if (id != null && actions[actions.length - 1]?.id !== id) {\n animationFrameProvider.cancelAnimationFrame(id as number);\n scheduler._scheduled = undefined;\n }\n // Return undefined so the action knows to request a new async id if it's rescheduled.\n return undefined;\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\nexport class AnimationFrameScheduler extends AsyncScheduler {\n public flush(action?: AsyncAction): void {\n this._active = true;\n // The async id that effects a call to flush is stored in _scheduled.\n // Before executing an action, it's necessary to check the action's async\n // id to determine whether it's supposed to be executed in the current\n // flush.\n // Previous implementations of this method used a count to determine this,\n // but that was unsound, as actions that are unsubscribed - i.e. cancelled -\n // are removed from the actions array and that can shift actions that are\n // scheduled to be executed in a subsequent flush into positions at which\n // they are executed within the current flush.\n const flushId = this._scheduled;\n this._scheduled = undefined;\n\n const { actions } = this;\n let error: any;\n action = action || actions.shift()!;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions[0]) && action.id === flushId && actions.shift());\n\n this._active = false;\n\n if (error) {\n while ((action = actions[0]) && action.id === flushId && actions.shift()) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AnimationFrameAction } from './AnimationFrameAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\n\n/**\n *\n * Animation Frame Scheduler\n *\n * Perform task when `window.requestAnimationFrame` would fire\n *\n * When `animationFrame` scheduler is used with delay, it will fall back to {@link asyncScheduler} scheduler\n * behaviour.\n *\n * Without delay, `animationFrame` scheduler can be used to create smooth browser animations.\n * It makes sure scheduled task will happen just before next browser content repaint,\n * thus performing animations as efficiently as possible.\n *\n * ## Example\n * Schedule div height animation\n * ```ts\n * // html:
\n * import { animationFrameScheduler } from 'rxjs';\n *\n * const div = document.querySelector('div');\n *\n * animationFrameScheduler.schedule(function(height) {\n * div.style.height = height + \"px\";\n *\n * this.schedule(height + 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * }, 0, 0);\n *\n * // You will see a div element growing in height\n * ```\n */\n\nexport const animationFrameScheduler = new AnimationFrameScheduler(AnimationFrameAction);\n\n/**\n * @deprecated Renamed to {@link animationFrameScheduler}. Will be removed in v8.\n */\nexport const animationFrame = animationFrameScheduler;\n", "import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\n\n/**\n * A simple Observable that emits no items to the Observer and immediately\n * emits a complete notification.\n *\n * Just emits 'complete', and nothing else.\n *\n * ![](empty.png)\n *\n * A simple Observable that only emits the complete notification. It can be used\n * for composing with other Observables, such as in a {@link mergeMap}.\n *\n * ## Examples\n *\n * Log complete notification\n *\n * ```ts\n * import { EMPTY } from 'rxjs';\n *\n * EMPTY.subscribe({\n * next: () => console.log('Next'),\n * complete: () => console.log('Complete!')\n * });\n *\n * // Outputs\n * // Complete!\n * ```\n *\n * Emit the number 7, then complete\n *\n * ```ts\n * import { EMPTY, startWith } from 'rxjs';\n *\n * const result = EMPTY.pipe(startWith(7));\n * result.subscribe(x => console.log(x));\n *\n * // Outputs\n * // 7\n * ```\n *\n * Map and flatten only odd numbers to the sequence `'a'`, `'b'`, `'c'`\n *\n * ```ts\n * import { interval, mergeMap, of, EMPTY } from 'rxjs';\n *\n * const interval$ = interval(1000);\n * const result = interval$.pipe(\n * mergeMap(x => x % 2 === 1 ? of('a', 'b', 'c') : EMPTY),\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following to the console:\n * // x is equal to the count on the interval, e.g. (0, 1, 2, 3, ...)\n * // x will occur every 1000ms\n * // if x % 2 is equal to 1, print a, b, c (each on its own)\n * // if x % 2 is not equal to 1, nothing will be output\n * ```\n *\n * @see {@link Observable}\n * @see {@link NEVER}\n * @see {@link of}\n * @see {@link throwError}\n */\nexport const EMPTY = new Observable((subscriber) => subscriber.complete());\n\n/**\n * @param scheduler A {@link SchedulerLike} to use for scheduling\n * the emission of the complete notification.\n * @deprecated Replaced with the {@link EMPTY} constant or {@link scheduled} (e.g. `scheduled([], scheduler)`). Will be removed in v8.\n */\nexport function empty(scheduler?: SchedulerLike) {\n return scheduler ? emptyScheduled(scheduler) : EMPTY;\n}\n\nfunction emptyScheduled(scheduler: SchedulerLike) {\n return new Observable((subscriber) => scheduler.schedule(() => subscriber.complete()));\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport function isScheduler(value: any): value is SchedulerLike {\n return value && isFunction(value.schedule);\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\nimport { isScheduler } from './isScheduler';\n\nfunction last(arr: T[]): T | undefined {\n return arr[arr.length - 1];\n}\n\nexport function popResultSelector(args: any[]): ((...args: unknown[]) => unknown) | undefined {\n return isFunction(last(args)) ? args.pop() : undefined;\n}\n\nexport function popScheduler(args: any[]): SchedulerLike | undefined {\n return isScheduler(last(args)) ? args.pop() : undefined;\n}\n\nexport function popNumber(args: any[], defaultValue: number): number {\n return typeof last(args) === 'number' ? args.pop()! : defaultValue;\n}\n", "export const isArrayLike = ((x: any): x is ArrayLike => x && typeof x.length === 'number' && typeof x !== 'function');", "import { isFunction } from \"./isFunction\";\n\n/**\n * Tests to see if the object is \"thennable\".\n * @param value the object to test\n */\nexport function isPromise(value: any): value is PromiseLike {\n return isFunction(value?.then);\n}\n", "import { InteropObservable } from '../types';\nimport { observable as Symbol_observable } from '../symbol/observable';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being Observable (but not necessary an Rx Observable) */\nexport function isInteropObservable(input: any): input is InteropObservable {\n return isFunction(input[Symbol_observable]);\n}\n", "import { isFunction } from './isFunction';\n\nexport function isAsyncIterable(obj: any): obj is AsyncIterable {\n return Symbol.asyncIterator && isFunction(obj?.[Symbol.asyncIterator]);\n}\n", "/**\n * Creates the TypeError to throw if an invalid object is passed to `from` or `scheduled`.\n * @param input The object that was passed.\n */\nexport function createInvalidObservableTypeError(input: any) {\n // TODO: We should create error codes that can be looked up, so this can be less verbose.\n return new TypeError(\n `You provided ${\n input !== null && typeof input === 'object' ? 'an invalid object' : `'${input}'`\n } where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`\n );\n}\n", "export function getSymbolIterator(): symbol {\n if (typeof Symbol !== 'function' || !Symbol.iterator) {\n return '@@iterator' as any;\n }\n\n return Symbol.iterator;\n}\n\nexport const iterator = getSymbolIterator();\n", "import { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being an Iterable */\nexport function isIterable(input: any): input is Iterable {\n return isFunction(input?.[Symbol_iterator]);\n}\n", "import { ReadableStreamLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport async function* readableStreamLikeToAsyncGenerator(readableStream: ReadableStreamLike): AsyncGenerator {\n const reader = readableStream.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n return;\n }\n yield value!;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport function isReadableStreamLike(obj: any): obj is ReadableStreamLike {\n // We don't want to use instanceof checks because they would return\n // false for instances from another Realm, like an ` + +### 4. Diagrams with Mermaid + +- **Flowcharts**: + +```mermaid + graph TD + A[Start] --> B[Analyze Data] + B --> C{Is Data Large?} + C -->|Yes| D[Apply Big Data Solutions] + C -->|No| E[Use Traditional Methods] + D --> F[Machine Learning] + E --> G[Statistical Analysis] + F --> H{Model Accurate?} + G --> I[Report Results] + H -->|Yes| J[Deploy Model] + H -->|No| K[Refine Model] + J --> L[Monitor Performance] + K --> F + L --> M[End: Success] + I --> N[End: Report Generated] + style A fill:#f9f,stroke:#333,stroke-width:2px + style M fill:#9f9,stroke:#333,stroke-width:2px + style N fill:#9f9,stroke:#333,stroke-width:2px +``` + +- **Mind Maps**: +```mermaid + mindmap + root((ESIIL)) + section Data Sources + Satellite Imagery + ::icon(fa fa-satellite) + Remote Sensing Data + Drones + Aircraft + On-ground Sensors + Weather Stations + IoT Devices + Open Environmental Data + Public Datasets + ::icon(fa fa-database) + section Research Focus + Climate Change Analysis + Ice Melt Patterns + Sea Level Rise + Biodiversity Monitoring + Species Distribution + Habitat Fragmentation + Geospatial Analysis Techniques + Machine Learning Models + Predictive Analytics + section Applications + Conservation Strategies + ::icon(fa fa-leaf) + Urban Planning + Green Spaces + Disaster Response + Flood Mapping + Wildfire Tracking + section Tools and Technologies + GIS Software + QGIS + ArcGIS + Programming Languages + Python + R + Cloud Computing Platforms + AWS + Google Earth Engine + Data Visualization + D3.js + Tableau +``` + +- **Timelines**: + +```mermaid +gantt + title ESIIL Year 2 Project Schedule + dateFormat YYYY-MM-DD + section CI + Sovereign OASIS via private jupiterhubs :2024-08-01, 2024-10-30 + OASIS documentation :2024-09-15, 70d + Data cube OASIS via cyverse account :2024-09-15, 100d + Integrate with ESIIL User Management system :2024-08-01, 2024-11-30 + Build badges to deploy DE from mkdoc :2024-09-01, 2024-12-15 + Streamline Github ssh key management :2024-10-01, 2024-12-31 + Cyverse support (R proxy link) :2024-11-01, 2024-12-31 + Cyverse use summary and statistics :2024-08-01, 2024-12-15 + + section CI Consultation and Education + Conferences/Invited talks :2024-08-01, 2024-12-31 + Office hours :2024-08-15, 2024-12-15 + Proposals :2024-09-01, 2024-11-15 + Private lessons :2024-09-15, 2024-11-30 + Pre-event trainings :2024-10-01, 2024-12-15 + Textbook development w/ education team :2024-08-01, 2024-12-15 + Train the trainers / group lessons :2024-08-15, 2024-11-30 + Tribal engagement :2024-09-01, 2024-12-15 + Ethical Space training :2024-09-15, 2024-12-31 + + section CI Design and Build + Data library (repository) :2024-08-01, 2024-10-30 + Analytics library (repository) :2024-08-15, 2024-11-15 + Containers (repository) :2024-09-01, 2024-11-30 + Cloud infrastructure templates (repository) :2024-09-15, 2024-12-15 + Tribal resilience Data Cube :2024-10-01, 2024-12-31 +``` + +```mermaid + +%%{init: { 'logLevel': 'debug', 'theme': 'base', 'gitGraph': {'rotateCommitLabel': true}} }%% +gitGraph + commit id: "Start from template" + branch c1 + commit id: "Set up SSH key pair" + commit id: "Modify _config.yml for GitHub Pages" + commit id: "Initial website structure" + commit id: "Add new markdown pages" + commit id: "Update navigation tree" + commit id: "Edit existing pages" + commit id: "Delete old markdown pages" + commit id: "Finalize website updates" + commit id: "Add new markdown pages" + commit id: "Update navigation tree" +checkout c1 + + branch b1 + + commit + commit + checkout c1 + merge b1 +``` + +```mermaid +%%{init: {"quadrantChart": {"chartWidth": 400, "chartHeight": 400}, "themeVariables": {"quadrant1TextFill": "#ff0000"} }}%% +quadrantChart + x-axis Urgent --> Not Urgent + y-axis Not Important --> "Important ❤" + quadrant-1 Plan + quadrant-2 Do + quadrant-3 Delegate + quadrant-4 Delete +``` + + +```mermaid +timeline + title Major Events in Environmental Science and Data Science + section Environmental Science + 19th century : Foundations in Ecology and Conservation + 1962 : Publication of 'Silent Spring' by Rachel Carson + 1970 : First Earth Day + 1987 : Brundtland Report introduces Sustainable Development + 1992 : Rio Earth Summit + 2015 : Paris Agreement on Climate Change + section Data Science + 1960s-1970s : Development of Database Management Systems + 1980s : Emergence of Data Warehousing + 1990s : Growth of the World Wide Web and Data Mining + 2000s : Big Data and Predictive Analytics + 2010s : AI and Machine Learning Revolution + 2020s : Integration of AI in Environmental Research +``` + + + + +```mermaid +erDiagram + CAR ||--o{ NAMED-DRIVER : allows + CAR { + string registrationNumber + string make + string model + } + PERSON ||--o{ NAMED-DRIVER : is + PERSON { + string firstName + string lastName + int age + } +``` + +```mermaid +--- +config: + sankey: + showValues: false +--- +sankey-beta + +NASA Data,Big Data Harmonization,100 + Satellite Imagery,Big Data Harmonization,80 + Open Environmental Data,Big Data Harmonization,70 + Remote Sensing Data,Big Data Harmonization,90 + Big Data Harmonization, Data Analysis and Integration,340 + Data Analysis and Integration,Climate Change Research,100 + Data Analysis and Integration,Biodiversity Monitoring,80 + Data Analysis and Integration,Geospatial Mapping,60 + Data Analysis and Integration,Urban Planning,50 + Data Analysis and Integration,Disaster Response,50 +``` + + +### 5. Interactive Elements + +- **Hyperlinks**: Use the format `[link text](URL)`. + - [Google](https://www.google.com) + - [Play Tetris](https://tetris.com/play-tetris) + +- **Embedding Interactive Content**: Use HTML tags or specific platform embed codes. + - `` + + + + +### 6. Math Notation + +Markdown can be combined with LaTeX for mathematical notation, useful in environmental data science for expressing statistical distributions, coordinate systems, and more. This requires a Markdown renderer with LaTeX support (like MathJax or KaTeX). + +- **Inline Math**: Use single dollar signs for inline math expressions. Representing the normal distribution. + + Example: The probability density function of the normal distribution is given by $f(x|\mu,\sigma) = \frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{1}{2}\left(\frac{x-\mu}{\sigma}\right)^2}$.` + +- **Display Math**: Use double dollar signs for standalone equations. + + Example: + $$ + f(x|\mu,\sigma) = \frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{1}{2}\left(\frac{x-\mu}{\sigma}\right)^2} + $$ + + +- **Common LaTeX Elements for Environmental Data Science**: + - **Statistical Distributions**: + - Normal Distribution: `\frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{1}{2}\left(\frac{x-\mu}{\sigma}\right)^2}` for $\frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{1}{2}\left(\frac{x-\mu}{\sigma}\right)^2}$ + - Poisson Distribution: `P(k; \lambda) = \frac{\lambda^k e^{-\lambda}}{k!}` for $P(k; \lambda) = \frac{\lambda^k e^{-\lambda}}{k!}$ + - **Coordinate Systems**: + - Spherical Coordinates: `(r, \theta, \phi)` for $(r, \theta, \phi)$ + - Cartesian Coordinates: `(x, y, z)` for $(x, y, z)$ + - **Geospatial Equations**: + - Haversine Formula for Distance: `a = \sin^2\left(\frac{\Delta\phi}{2}\right) + \cos(\phi_1)\cos(\phi_2)\sin^2\left(\frac{\Delta\lambda}{2}\right)` for $a = \sin^2\left(\frac{\Delta\phi}{2}\right) + \cos(\phi_1)\cos(\phi_2)\sin^2\left(\frac{\Delta\lambda}{2}\right)$ + +Note: The rendering of these equations as formatted math will depend on your Markdown viewer's LaTeX capabilities. + + + +### 7. Effective Citations in Markdown + +## Inline Citations + +- **Objective:** Learn how to use inline citations in Markdown. +- **Example Usage:** + - Inline citation of a single work: + - Some text with an inline citation. [@jones:envstudy:2020] + - Inline citation with specific page or section: + - More text with a specific section cited. [See @jones:envstudy:2020, §4.2] + - Contrasting views: + - Discussion of a topic with a contrasting view. [Contra @smith:climatechange:2019, p. 78] + +## Footnote Citations + +- **Objective:** Understand how to use footnote citations in Markdown. +- **Example Usage:** + - Citing with a footnote: + - Some statement in the text.[^1] + - Multiple references to the same footnote: + - Another statement referring to the same source.[^1] + - A different citation: + - Additional comment with a new citation.[^2] + +## Creating Footnotes + +- **Example Syntax:** + - [^1]: First reference details. Example: Emma Jones, "Environmental Study," Nature Journal, May 2020, https://nature-journal.com/envstudy2020. + - [^2]: Second reference details. Example: David Smith, "Climate Change Controversies," Science Daily, August 2019, https://sciencedaily.com/climatechange2019. + + diff --git a/resources/notes_from_readings/index.html b/resources/notes_from_readings/index.html new file mode 100644 index 0000000..e5a9956 --- /dev/null +++ b/resources/notes_from_readings/index.html @@ -0,0 +1,1264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Notes from readings - ESIIL Working Group OASIS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Literature Reading Notes

+

Reference Information

+
    +
  • Title:
  • +
  • Authors:
  • +
  • Publication Year:
  • +
  • Journal/Source:
  • +
  • DOI/URL:
  • +
+

Summary

+
    +
  • Brief summary of the main objective, research question, or thesis of the literature.
  • +
+

Key Findings

+
    +
  • Major findings or conclusions:
  • +
  • Finding 1
  • +
  • Finding 2
  • +
  • ...
  • +
+

Methodology

+
    +
  • Description of research methodology, techniques, or approaches.
  • +
  • Notable tools, datasets, or analytical methods used.
  • +
+

Theoretical Framework

+
    +
  • Theoretical models or frameworks underpinning the research.
  • +
  • Positioning within the broader field.
  • +
+

Critical Analysis

+
    +
  • Strengths: Well-executed aspects or convincing arguments.
  • +
  • Limitations: Weaknesses, gaps, or biases.
  • +
  • Insights: New understandings or perspectives gained.
  • +
+

Connections to Other Work

+
    +
  • Similarities or differences with other readings.
  • +
  • Complementarity to other studies.
  • +
+

Quotations and Notes

+
    +
  • Significant quotes:
  • +
  • "Quote here." - Author Name, page number
  • +
  • Additional notes or comments.
  • +
+

Personal Reflections

+
    +
  • Influence on understanding or perspective.
  • +
  • Potential impact on future research or studies.
  • +
+

Action Items

+
    +
  • Follow-up actions such as readings, discussions, or research activities:
  • +
  • [ ] Action item 1
  • +
  • [ ] Action item 2
  • +
  • ...
  • +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/resources/notes_from_readings/notes_from_readings.md b/resources/notes_from_readings/notes_from_readings.md new file mode 100644 index 0000000..f0dcbb8 --- /dev/null +++ b/resources/notes_from_readings/notes_from_readings.md @@ -0,0 +1,59 @@ +# Literature Reading Notes + +## Reference Information + +- **Title:** +- **Authors:** +- **Publication Year:** +- **Journal/Source:** +- **DOI/URL:** + +## Summary + +- Brief summary of the main objective, research question, or thesis of the literature. + +## Key Findings + +- Major findings or conclusions: + - Finding 1 + - Finding 2 + - ... + +## Methodology + +- Description of research methodology, techniques, or approaches. +- Notable tools, datasets, or analytical methods used. + +## Theoretical Framework + +- Theoretical models or frameworks underpinning the research. +- Positioning within the broader field. + +## Critical Analysis + +- **Strengths:** Well-executed aspects or convincing arguments. +- **Limitations:** Weaknesses, gaps, or biases. +- **Insights:** New understandings or perspectives gained. + +## Connections to Other Work + +- Similarities or differences with other readings. +- Complementarity to other studies. + +## Quotations and Notes + +- Significant quotes: + - "Quote here." - Author Name, page number +- Additional notes or comments. + +## Personal Reflections + +- Influence on understanding or perspective. +- Potential impact on future research or studies. + +## Action Items + +- Follow-up actions such as readings, discussions, or research activities: + - [ ] Action item 1 + - [ ] Action item 2 + - ... diff --git a/resources/participant_agreement/index.html b/resources/participant_agreement/index.html new file mode 100644 index 0000000..67a28af --- /dev/null +++ b/resources/participant_agreement/index.html @@ -0,0 +1,1207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Participant agreement - ESIIL Working Group OASIS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Participant Agreement

+

This Participant Agreement (“Agreement”) is a contract between you (“You/Your” or “Participant”) and THE REGENTS OF THE UNIVERSITY OF COLORADO, a body corporate, acting on behalf of the University of Colorado Boulder, a public institution of higher education created under the Constitution and the Law of the State of Colorado (the “University”), having offices located at 3100 Marine Street, Boulder, CO 80309.

+

In consideration of Your participation in the Forest Carbon Codefest (the “Codefest”), the sufficiency of which is hereby acknowledged, You agree as follows:

+

Environmental Data Science Innovation & Inclusion Lab (“ESIIL”) is a National Science Foundation (“NSF”) funded data synthesis center led by the University. Earth Lab is part of the Cooperative Institute for Research in Environmental Sciences (CIRES) specializing in data-intensive open, reproducible environmental science. Earth Lab and ESIIL will co-host the Codefest in person from March 12 through March 14, 2023.

+

Codefest Description

+

The Codefest aims to use big data to understand aboveground forest carbon dynamics. It brings together environmental scientists, data analysts, and forest experts from academia, non-profits, and the private sector under one roof to collaborate and provide solutions to on-the-ground needs in a respectful and inclusive environment. The Codefest provides resources to address environmental challenges, such as participation in training on Environmental Data Science and cyberinfrastructure. You will work on a cloud-based, highly secure platform that allows for the seamless integration of data sets and analytical tools. The Codefest encourages individuals participating to create a solution in the form of a research project, computer code, and models (individually and/or collectively, a “Solution”).

+

How to Participate

+

You will join a team of environmental scientists, data experts, and coders to explore curated data, consider the objectivity of the data, propose a scientific question that can be addressed with all or some of the data sets, and analyze the data in an attempt to answer your scientific question by the end of the event. You will present your Solution to the event community. Earth Lab and ESIIL will provide environmental data, cyberinfrastructure, cyberinfrastructure and data analytics training, and technical support. The team members of the winning Solution will receive a small monetary award. Details regarding how the winning Solution will be chosen and how the prize will be managed are outlined in the Official Rules for the Codefest (“Official Rules”).

+

Representations and Warranties

+

By and through Your participation in the Codefest, You represent and warrant the following:

+
    +
  • You have read, understand, and agree to abide by the Code of Conduct and Respectful Inclusive Collaboration Guidelines for the Forest Carbon Codefest (“Code of Conduct”) and the Official Rules.
  • +
  • Any decisions concerning the Code of Conduct, Official Rules, or any other matter relating to this Codefest by the University is final and binding on all Participants.
  • +
+

Codefest Assets

+

5.1 Access and Use

+

By participating in the Codefest, You may receive access to certain datasets, webinars, and/or other copyrighted materials (collectively, the “Codefest Assets”). You agree to follow all licenses, restrictions, and other instructions provided to You with the Codefest Assets.

+

5.2 Disclaimer

+

The Codefest Assets are provided “as is” without warranty of any kind, either express or implied, including, without limitation, any implied warranties of merchantability and fitness for a particular purpose. Without limiting the foregoing, the University does not warrant that the Materials will be suitable for Your Solution or that the operation or supply of the Codefest Assets will be uninterrupted or error free.

+

5.3 Restrictions

+

You agree not to access or use the Codefest Assets in a manner that may interfere with any other participants’ or users’ use of such assets, unless provided with express written consent by the University. Your access to and use of the Codefest Assets may be limited, throttled, or terminated at any time at the sole discretion of the University.

+

Intellectual Property

+

For purposes of this Agreement, “Intellectual Property” includes all copyright, patent, trademark, trade secret and other intellectual property rights.

+

6.1 Solution Publication

+

You agree to make Your Solution publicly available in GitHub under the MIT open-source license within five (5) months from the end of the Codefest.

+

6.2 Government Rights

+

In consideration of the funding provided by NSF for the Codefest, You hereby grant and agree to grant to the U.S. Government (i) a nonexclusive, non-transferable, irrevocable, royalty-free license to exercise or have exercised for or on behalf of the U.S. throughout the world all the exclusive rights provided by copyright in any copyrightable intellectual property that You create during the Codefest and (ii) a nonexclusive, non-transferable, irrevocable, paid-up license to practice, or have practiced for or on its behalf, any invention created by You during the Codefest throughout the world.

+

6.3 NSF Agreement and Invention Ownership

+

You acknowledge that the Codefest is subject to NSF’s Cooperative Agreement Terms and Conditions effective May 12, 2023. As such, the U.S. Government may be entitled to own any invention that You create during the Codefest as further outlined within 37 CFR 401 and the NSF Proposal & Award Policies and Procedures Guide. In such event, You agree to assign any invention created by You during the Codefest to the U.S. Government and to reasonably cooperate with the University and NSF to accomplish the same.

+

6.4 Representations and Warranties

+

You represent and warrant that You are legally entitled to grant the above licenses and other intellectual property rights as outlined in Sections 6.1, 6.2, and 6.3. If You are an individual, and if Your employer(s) and/or another third party has rights to Intellectual Property that You create that includes Your Solution, You represent that You have received permission to participate in the Codefest on behalf of that employer or third party and that Your employer or the third party has waived such rights for Your contributions.

+

6.5 Originality and Third-Party Materials

+

You represent that Your Solution is Your original creation. If you obtain permission under Section 6.5 to include third-party materials, You represent that Your Solution includes complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which You are aware and which are associated with any part of Your Solution. You represent and warrant that You will not submit any materials to the University that You know or believe to have components that are malicious or harmful. You represent that You will perform a reasonable amount of due diligence in order to be properly informed of third-party licenses, infringing materials, or harmful content associated with any part of Your Solution.

+

6.6 Submission of External Work

+

Should You wish to submit work that is not Your original creation during the Codefest (and that is not a Codefest Asset), You may ask for permission from the University to incorporate such work into Your Solution. To request such permission, identify the complete details of the materials you wish to use, including any licenses or other restrictions (including, but not limited to, related patents, trademarks, and license agreements) of which You are personally aware. Request for permission to add materials created outside of the Codefest must be submitted in advance of the Codefest to: Tyler McIntosh; tyler.l.mcintosh@colorado.edu.

+

6.7 Notification of Changes

+

You agree to notify the University of any facts or circumstances of which You become aware that would make these representations inaccurate in any respect. You agree to notify the University of any administrative or court proceeding which involve Your Solution.

+

Limitation of Liability

+

TO THE EXTENT ALLOWED BY LAW, IN NO EVENT SHALL THE UNIVERSITY, ITS PARTNERS, LICENSORS, SERVICE PROVIDERS, OR ANY OF THEIR RESPECTIVE OFFICERS, DIRECTORS, AGENTS, EMPLOYEES OR REPRESENTATIVES, BE LIABLE FOR DIRECT, INCIDENTAL, CONSEQUENTIAL, EXEMPLARY OR PUNITIVE DAMAGES ARISING OUT OF OR IN CONNECTION WITH THE HACKATHON OR THIS AGREEMENT (HOWEVER ARISING, INCLUDING NEGLIGENCE). IF YOU HAVE A DISPUTE WITH ANY PARTICIPANT OR ANY OTHER THIRD PARTY, YOU RELEASE THE UNIVERSITY, ITS, PARTNERS, LICENSORS, AND SERVICE PROVIDERS, AND EACH OF THEIR RESPECTIVE OFFICERS, DIRECTORS, AGENTS, EMPLOYEES AND REPRESENTATIVES FROM ANY AND ALL CLAIMS, DEMANDS AND DAMAGES (ACTUAL AND CONSEQUENTIAL) OF EVERY KIND AND NATURE ARISING OUT OF OR IN ANY WAY CONNECTED WITH SUCH DISPUTES. YOU AGREE THAT ANY CLAIMS AGAINST UNIVERSITY ARISING OUT OF THE HACKATHON OR THIS AGREEMENT MUST BE FILED WITHIN ONE YEAR AFTER SUCH CLAIM AROSE; OTHERWISE, YOUR CLAIM IS PERMANENTLY BARRED.

+

Not an Offer or Contract of Employment

+

Under no circumstances will Your participation in the Codefest or anything in this Agreement be construed as an offer or contract of employment with the University.

+

Additional Terms

+
    +
  • You must be at least eighteen (18) years of age to participate in the Codefest. The Codefest is subject to applicable federal, state, and local laws.
  • +
  • The University reserves the right to permanently disqualify any person from the Codefest that it reasonably believes has violated this Agreement, the Code of Conduct, and/or the Official Rules.
  • +
  • Any attempt to deliberately damage the Codefest or the operation thereof is unlawful and subject to legal action by the University, which may seek damages to the fullest extent permitted by law.
  • +
  • The University assumes no responsibility for any injury or damage to Your or any other person’s computer relating to or resulting from entering or downloading materials or software in connection with the Codefest.
  • +
  • The University is not responsible for telecommunications, network, electronic, technical, or computer failures of any kind; for inaccurate transcription of entry information; for any human or electronic error; or for Solutions that are stolen, misdirected, garbled, delayed, lost, late, damaged, or returned.
  • +
  • The University reserves the right to cancel, modify, or suspend the Codefest or any element thereof (including, without limitation, this Agreement) without notice in any manner and for any reason (including, without limitation, in the event of any unanticipated occurrence that is not fully addressed in this Agreement).
  • +
  • The University may prohibit any person from participating in the Codefest, if such person shows a disregard for this Agreement; acts with an intent to annoy, abuse, threaten, or harass any other entrant or any agents or representatives of the University (or any associated, partners, licensors, or service providers for the University); or behaves in any other disruptive manner (as determined by the University in its sole discretion).
  • +
  • Nothing contained in this Agreement shall be construed as an express or implied waiver by University of its governmental immunity or of the governmental immunity of the State of Colorado.
  • +
  • Your Solutions shall not contain any item(s) that are either export-controlled under the International Traffic in Arms Regulations, or that appear on the Commerce Control List (except as EAR99) of the Export Administration Regulations.
  • +
+

Dispute Resolution

+

This Agreement and the Codefest shall be governed and construed in accordance with and governed by the laws of the state of Colorado without giving effect to conflict of law provisions.

+

Entire Agreement

+

This Agreement, along with the Official Rules, and the Event Code of Conduct, constitutes the entire agreement between the University and You with respect to the Codefest and supersedes all previous or contemporaneous oral or written agreements concerning the Codefest. In the event of a conflict between this Agreement, the Official Rules and/or the Event Code of Conduct, the conflict shall be resolved with the following order of precedence:

+
    +
  1. This Agreement
  2. +
  3. The Official Rules
  4. +
  5. The Event Code of Conduct
  6. +
+

Severability

+

The invalidity, illegality, or unenforceability of any one or more phrases, sentences, clauses, or sections in this Agreement does not affect the remaining portions of this Agreement.

+

If you have questions about the Codefest, please contact Tyler McIntosh at tyler.l.mcintosh@colorado.edu.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/resources/participant_agreement/participant_agreement.md b/resources/participant_agreement/participant_agreement.md new file mode 100644 index 0000000..1b8a5c7 --- /dev/null +++ b/resources/participant_agreement/participant_agreement.md @@ -0,0 +1,96 @@ +# Participant Agreement + +This Participant Agreement (“Agreement”) is a contract between you (“You/Your” or “Participant”) and THE REGENTS OF THE UNIVERSITY OF COLORADO, a body corporate, acting on behalf of the University of Colorado Boulder, a public institution of higher education created under the Constitution and the Law of the State of Colorado (the “University”), having offices located at 3100 Marine Street, Boulder, CO 80309. + +In consideration of Your participation in the Forest Carbon Codefest (the “Codefest”), the sufficiency of which is hereby acknowledged, You agree as follows: + +Environmental Data Science Innovation & Inclusion Lab (“ESIIL”) is a National Science Foundation (“NSF”) funded data synthesis center led by the University. Earth Lab is part of the Cooperative Institute for Research in Environmental Sciences (CIRES) specializing in data-intensive open, reproducible environmental science. Earth Lab and ESIIL will co-host the Codefest in person from March 12 through March 14, 2023. + +## Codefest Description + +The Codefest aims to use big data to understand aboveground forest carbon dynamics. It brings together environmental scientists, data analysts, and forest experts from academia, non-profits, and the private sector under one roof to collaborate and provide solutions to on-the-ground needs in a respectful and inclusive environment. The Codefest provides resources to address environmental challenges, such as participation in training on Environmental Data Science and cyberinfrastructure. You will work on a cloud-based, highly secure platform that allows for the seamless integration of data sets and analytical tools. The Codefest encourages individuals participating to create a solution in the form of a research project, computer code, and models (individually and/or collectively, a “Solution”). + +## How to Participate + +You will join a team of environmental scientists, data experts, and coders to explore curated data, consider the objectivity of the data, propose a scientific question that can be addressed with all or some of the data sets, and analyze the data in an attempt to answer your scientific question by the end of the event. You will present your Solution to the event community. Earth Lab and ESIIL will provide environmental data, cyberinfrastructure, cyberinfrastructure and data analytics training, and technical support. The team members of the winning Solution will receive a small monetary award. Details regarding how the winning Solution will be chosen and how the prize will be managed are outlined in the Official Rules for the Codefest (“Official Rules”). + +## Representations and Warranties + +By and through Your participation in the Codefest, You represent and warrant the following: + +- You have read, understand, and agree to abide by the Code of Conduct and Respectful Inclusive Collaboration Guidelines for the Forest Carbon Codefest (“Code of Conduct”) and the Official Rules. +- Any decisions concerning the Code of Conduct, Official Rules, or any other matter relating to this Codefest by the University is final and binding on all Participants. + +# Codefest Assets + +## 5.1 Access and Use +By participating in the Codefest, You may receive access to certain datasets, webinars, and/or other copyrighted materials (collectively, the “Codefest Assets”). You agree to follow all licenses, restrictions, and other instructions provided to You with the Codefest Assets. + +## 5.2 Disclaimer +The Codefest Assets are provided “as is” without warranty of any kind, either express or implied, including, without limitation, any implied warranties of merchantability and fitness for a particular purpose. Without limiting the foregoing, the University does not warrant that the Materials will be suitable for Your Solution or that the operation or supply of the Codefest Assets will be uninterrupted or error free. + +## 5.3 Restrictions +You agree not to access or use the Codefest Assets in a manner that may interfere with any other participants’ or users’ use of such assets, unless provided with express written consent by the University. Your access to and use of the Codefest Assets may be limited, throttled, or terminated at any time at the sole discretion of the University. + +# Intellectual Property + +For purposes of this Agreement, “Intellectual Property” includes all copyright, patent, trademark, trade secret and other intellectual property rights. + +## 6.1 Solution Publication +You agree to make Your Solution publicly available in GitHub under the MIT open-source license within five (5) months from the end of the Codefest. + +## 6.2 Government Rights +In consideration of the funding provided by NSF for the Codefest, You hereby grant and agree to grant to the U.S. Government (i) a nonexclusive, non-transferable, irrevocable, royalty-free license to exercise or have exercised for or on behalf of the U.S. throughout the world all the exclusive rights provided by copyright in any copyrightable intellectual property that You create during the Codefest and (ii) a nonexclusive, non-transferable, irrevocable, paid-up license to practice, or have practiced for or on its behalf, any invention created by You during the Codefest throughout the world. + +## 6.3 NSF Agreement and Invention Ownership +You acknowledge that the Codefest is subject to NSF’s Cooperative Agreement Terms and Conditions effective May 12, 2023. As such, the U.S. Government may be entitled to own any invention that You create during the Codefest as further outlined within 37 CFR 401 and the NSF Proposal & Award Policies and Procedures Guide. In such event, You agree to assign any invention created by You during the Codefest to the U.S. Government and to reasonably cooperate with the University and NSF to accomplish the same. + +## 6.4 Representations and Warranties +You represent and warrant that You are legally entitled to grant the above licenses and other intellectual property rights as outlined in Sections 6.1, 6.2, and 6.3. If You are an individual, and if Your employer(s) and/or another third party has rights to Intellectual Property that You create that includes Your Solution, You represent that You have received permission to participate in the Codefest on behalf of that employer or third party and that Your employer or the third party has waived such rights for Your contributions. + +## 6.5 Originality and Third-Party Materials +You represent that Your Solution is Your original creation. If you obtain permission under Section 6.5 to include third-party materials, You represent that Your Solution includes complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which You are aware and which are associated with any part of Your Solution. You represent and warrant that You will not submit any materials to the University that You know or believe to have components that are malicious or harmful. You represent that You will perform a reasonable amount of due diligence in order to be properly informed of third-party licenses, infringing materials, or harmful content associated with any part of Your Solution. + +## 6.6 Submission of External Work +Should You wish to submit work that is not Your original creation during the Codefest (and that is not a Codefest Asset), You may ask for permission from the University to incorporate such work into Your Solution. To request such permission, identify the complete details of the materials you wish to use, including any licenses or other restrictions (including, but not limited to, related patents, trademarks, and license agreements) of which You are personally aware. Request for permission to add materials created outside of the Codefest must be submitted in advance of the Codefest to: Tyler McIntosh; [tyler.l.mcintosh@colorado.edu](mailto:tyler.l.mcintosh@colorado.edu). + +## 6.7 Notification of Changes +You agree to notify the University of any facts or circumstances of which You become aware that would make these representations inaccurate in any respect. You agree to notify the University of any administrative or court proceeding which involve Your Solution. + +# Limitation of Liability + +TO THE EXTENT ALLOWED BY LAW, IN NO EVENT SHALL THE UNIVERSITY, ITS PARTNERS, LICENSORS, SERVICE PROVIDERS, OR ANY OF THEIR RESPECTIVE OFFICERS, DIRECTORS, AGENTS, EMPLOYEES OR REPRESENTATIVES, BE LIABLE FOR DIRECT, INCIDENTAL, CONSEQUENTIAL, EXEMPLARY OR PUNITIVE DAMAGES ARISING OUT OF OR IN CONNECTION WITH THE HACKATHON OR THIS AGREEMENT (HOWEVER ARISING, INCLUDING NEGLIGENCE). IF YOU HAVE A DISPUTE WITH ANY PARTICIPANT OR ANY OTHER THIRD PARTY, YOU RELEASE THE UNIVERSITY, ITS, PARTNERS, LICENSORS, AND SERVICE PROVIDERS, AND EACH OF THEIR RESPECTIVE OFFICERS, DIRECTORS, AGENTS, EMPLOYEES AND REPRESENTATIVES FROM ANY AND ALL CLAIMS, DEMANDS AND DAMAGES (ACTUAL AND CONSEQUENTIAL) OF EVERY KIND AND NATURE ARISING OUT OF OR IN ANY WAY CONNECTED WITH SUCH DISPUTES. YOU AGREE THAT ANY CLAIMS AGAINST UNIVERSITY ARISING OUT OF THE HACKATHON OR THIS AGREEMENT MUST BE FILED WITHIN ONE YEAR AFTER SUCH CLAIM AROSE; OTHERWISE, YOUR CLAIM IS PERMANENTLY BARRED. + +# Not an Offer or Contract of Employment + +Under no circumstances will Your participation in the Codefest or anything in this Agreement be construed as an offer or contract of employment with the University. + +# Additional Terms + +- You must be at least eighteen (18) years of age to participate in the Codefest. The Codefest is subject to applicable federal, state, and local laws. +- The University reserves the right to permanently disqualify any person from the Codefest that it reasonably believes has violated this Agreement, the Code of Conduct, and/or the Official Rules. +- Any attempt to deliberately damage the Codefest or the operation thereof is unlawful and subject to legal action by the University, which may seek damages to the fullest extent permitted by law. +- The University assumes no responsibility for any injury or damage to Your or any other person’s computer relating to or resulting from entering or downloading materials or software in connection with the Codefest. +- The University is not responsible for telecommunications, network, electronic, technical, or computer failures of any kind; for inaccurate transcription of entry information; for any human or electronic error; or for Solutions that are stolen, misdirected, garbled, delayed, lost, late, damaged, or returned. +- The University reserves the right to cancel, modify, or suspend the Codefest or any element thereof (including, without limitation, this Agreement) without notice in any manner and for any reason (including, without limitation, in the event of any unanticipated occurrence that is not fully addressed in this Agreement). +- The University may prohibit any person from participating in the Codefest, if such person shows a disregard for this Agreement; acts with an intent to annoy, abuse, threaten, or harass any other entrant or any agents or representatives of the University (or any associated, partners, licensors, or service providers for the University); or behaves in any other disruptive manner (as determined by the University in its sole discretion). +- Nothing contained in this Agreement shall be construed as an express or implied waiver by University of its governmental immunity or of the governmental immunity of the State of Colorado. +- Your Solutions shall not contain any item(s) that are either export-controlled under the International Traffic in Arms Regulations, or that appear on the Commerce Control List (except as EAR99) of the Export Administration Regulations. + +# Dispute Resolution + +This Agreement and the Codefest shall be governed and construed in accordance with and governed by the laws of the state of Colorado without giving effect to conflict of law provisions. + +# Entire Agreement + +This Agreement, along with the Official Rules, and the Event Code of Conduct, constitutes the entire agreement between the University and You with respect to the Codefest and supersedes all previous or contemporaneous oral or written agreements concerning the Codefest. In the event of a conflict between this Agreement, the Official Rules and/or the Event Code of Conduct, the conflict shall be resolved with the following order of precedence: + +1. This Agreement +2. The Official Rules +3. The Event Code of Conduct + +# Severability + +The invalidity, illegality, or unenforceability of any one or more phrases, sentences, clauses, or sections in this Agreement does not affect the remaining portions of this Agreement. + +If you have questions about the Codefest, please contact Tyler McIntosh at [tyler.l.mcintosh@colorado.edu](mailto:tyler.l.mcintosh@colorado.edu). diff --git a/resources/post_meeting_notes/index.html b/resources/post_meeting_notes/index.html new file mode 100644 index 0000000..358d426 --- /dev/null +++ b/resources/post_meeting_notes/index.html @@ -0,0 +1,1305 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Post-meetings - ESIIL Working Group OASIS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Post-Meeting Notes Template

+

Meeting Details

+
    +
  • Date:
  • +
  • Time:
  • +
  • Location:
  • +
  • Facilitator:
  • +
+

Attendees

+
    +
  • List of attendees
  • +
+

Agenda

+

1. Review of Meeting Goals

+
    +
  • Recap the primary objectives and if they were met.
  • +
+

2. Manuscript Development

+
    +
  • Discuss the status of current manuscript drafts.
  • +
  • Assign writing and editing tasks for different sections of the manuscript.
  • +
  • Set deadlines for draft completion and review.
  • +
+

3. Research Highlights

+
    +
  • Identify key findings and outcomes that should be emphasized in the publications.
  • +
  • Discuss any new research insights that emerged from the meeting.
  • +
+

4. Publication Strategy

+
    +
  • Decide on target journals or conferences for publication submission.
  • +
  • Discuss authorship order and contributions.
  • +
  • Plan for any additional data or research needed to strengthen the manuscript.
  • +
+

5. Editing and Review Process

+
    +
  • Establish a peer-review process within the group for initial feedback.
  • +
  • Assign members to focus on specific aspects of editing, such as clarity, grammar, and technical accuracy.
  • +
  • Agree on a schedule for review rounds to ensure timely submission.
  • +
+

6. Responsibilities and Expectations

+
    +
  • Clearly define what is expected from each member before the next meeting.
  • +
  • Discuss communication methods for progress updates and questions.
  • +
+

7. Closing Remarks

+
    +
  • Summarize the discussion and confirm the action plan.
  • +
  • Reiterate the importance of meeting the set deadlines and maintaining communication.
  • +
+

Action Items

+
    +
  • [ ] Draft introduction section: Responsible person(s) - Deadline
  • +
  • [ ] Compile and analyze additional data: Responsible person(s) - Deadline
  • +
  • [ ] Draft methodology section: Responsible person(s) - Deadline
  • +
  • ...
  • +
  • [ ] Coordinate manuscript peer review: Responsible person(s) - Deadline
  • +
+

Next Steps

+
    +
  • Define the timeline for the submission process.
  • +
  • Schedule follow-up meetings or check-ins to monitor progress.
  • +
+

Notes

+
    +
  • (Additional notes, comments, or observations made during the meeting.)
  • +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/resources/post_meeting_notes/post_meeting_notes.md b/resources/post_meeting_notes/post_meeting_notes.md new file mode 100644 index 0000000..41615dc --- /dev/null +++ b/resources/post_meeting_notes/post_meeting_notes.md @@ -0,0 +1,57 @@ +# Post-Meeting Notes Template + +## Meeting Details +- **Date:** +- **Time:** +- **Location:** +- **Facilitator:** + +## Attendees +- List of attendees + +## Agenda + +### 1. Review of Meeting Goals +- Recap the primary objectives and if they were met. + +### 2. Manuscript Development +- Discuss the status of current manuscript drafts. +- Assign writing and editing tasks for different sections of the manuscript. +- Set deadlines for draft completion and review. + +### 3. Research Highlights +- Identify key findings and outcomes that should be emphasized in the publications. +- Discuss any new research insights that emerged from the meeting. + +### 4. Publication Strategy +- Decide on target journals or conferences for publication submission. +- Discuss authorship order and contributions. +- Plan for any additional data or research needed to strengthen the manuscript. + +### 5. Editing and Review Process +- Establish a peer-review process within the group for initial feedback. +- Assign members to focus on specific aspects of editing, such as clarity, grammar, and technical accuracy. +- Agree on a schedule for review rounds to ensure timely submission. + +### 6. Responsibilities and Expectations +- Clearly define what is expected from each member before the next meeting. +- Discuss communication methods for progress updates and questions. + +### 7. Closing Remarks +- Summarize the discussion and confirm the action plan. +- Reiterate the importance of meeting the set deadlines and maintaining communication. + +## Action Items +- [ ] Draft introduction section: Responsible person(s) - Deadline +- [ ] Compile and analyze additional data: Responsible person(s) - Deadline +- [ ] Draft methodology section: Responsible person(s) - Deadline +- ... +- [ ] Coordinate manuscript peer review: Responsible person(s) - Deadline + +## Next Steps +- Define the timeline for the submission process. +- Schedule follow-up meetings or check-ins to monitor progress. + +## Notes +- (Additional notes, comments, or observations made during the meeting.) + diff --git a/resources/pre_meeting_notes/index.html b/resources/pre_meeting_notes/index.html new file mode 100644 index 0000000..b2ad788 --- /dev/null +++ b/resources/pre_meeting_notes/index.html @@ -0,0 +1,1289 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Pre-meetings - ESIIL Working Group OASIS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Pre-Meeting Notes

+

Meeting Details

+
    +
  • Date:
  • +
  • Time:
  • +
  • Location:
  • +
  • Facilitator:
  • +
+

Attendees

+
    +
  • List of attendees
  • +
+

Agenda

+

1. Opening Remarks

+
    +
  • Brief welcome and overview of the meeting's objectives.
  • +
+

2. Introductions

+
    +
  • Roundtable introductions for all attendees.
  • +
  • Share a personal note or interesting fact to foster camaraderie.
  • +
+

3. Planning

+
    +
  • Discuss the agenda for the primary meetings.
  • +
  • Outline the key topics and issues to address.
  • +
  • Assign roles for note-taking, timekeeping, and facilitation in primary meetings.
  • +
+

4. Goal Setting

+
    +
  • Establish clear, actionable goals for the upcoming period.
  • +
  • Identify specific outcomes desired from the primary meetings.
  • +
  • Agree on metrics or indicators of success for these goals.
  • +
+

5. Camaraderie Building

+
    +
  • Icebreaker activity or team-building exercise.
  • +
  • Share expectations and aspirations for the group's progress.
  • +
  • Highlight the importance of collaboration and mutual support.
  • +
+

6. Open Discussion

+
    +
  • Allow for any additional topics, concerns, or ideas to be brought forward.
  • +
+

7. Closing Remarks

+
    +
  • Summarize the discussions and confirm the next steps.
  • +
  • Confirm dates and times for primary meetings.
  • +
  • Express appreciation for participation.
  • +
+

Action Items

+
    +
  • [ ] Action item 1: Responsible person(s) - Deadline
  • +
  • [ ] Action item 2: Responsible person(s) - Deadline
  • +
  • ...
  • +
+

Notes

+
    +
  • (Any additional notes or comments about the meeting.)
  • +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/resources/pre_meeting_notes/pre_meeting_notes.md b/resources/pre_meeting_notes/pre_meeting_notes.md new file mode 100644 index 0000000..4c2bad6 --- /dev/null +++ b/resources/pre_meeting_notes/pre_meeting_notes.md @@ -0,0 +1,51 @@ +# Pre-Meeting Notes + +## Meeting Details +- **Date:** +- **Time:** +- **Location:** +- **Facilitator:** + +## Attendees +- List of attendees + +## Agenda + +### 1. Opening Remarks +- Brief welcome and overview of the meeting's objectives. + +### 2. Introductions +- Roundtable introductions for all attendees. +- Share a personal note or interesting fact to foster camaraderie. + +### 3. Planning +- Discuss the agenda for the primary meetings. +- Outline the key topics and issues to address. +- Assign roles for note-taking, timekeeping, and facilitation in primary meetings. + +### 4. Goal Setting +- Establish clear, actionable goals for the upcoming period. +- Identify specific outcomes desired from the primary meetings. +- Agree on metrics or indicators of success for these goals. + +### 5. Camaraderie Building +- Icebreaker activity or team-building exercise. +- Share expectations and aspirations for the group's progress. +- Highlight the importance of collaboration and mutual support. + +### 6. Open Discussion +- Allow for any additional topics, concerns, or ideas to be brought forward. + +### 7. Closing Remarks +- Summarize the discussions and confirm the next steps. +- Confirm dates and times for primary meetings. +- Express appreciation for participation. + +## Action Items +- [ ] Action item 1: Responsible person(s) - Deadline +- [ ] Action item 2: Responsible person(s) - Deadline +- ... + +## Notes +- (Any additional notes or comments about the meeting.) + diff --git a/resources/second_meeting_notes/index.html b/resources/second_meeting_notes/index.html new file mode 100644 index 0000000..806ec91 --- /dev/null +++ b/resources/second_meeting_notes/index.html @@ -0,0 +1,1442 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Second meeting - ESIIL Working Group OASIS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Primary Meeting Day 6-10: Progress and Development

+

Meeting Details

+
    +
  • Dates:
  • +
  • Times:
  • +
  • Location:
  • +
  • Facilitator:
  • +
+

Attendees

+
    +
  • List of attendees
  • +
+

Daily Agenda

+

Day 6: Review and Refine

+

Recap of Previous Sessions

+
    +
  • Summary of progress made since the last meeting.
  • +
  • Review of action items and milestones achieved.
  • +
+

Refinement of Goals and Tasks

+
    +
  • Reassessment and adjustment of goals based on current progress.
  • +
  • Identification of any new challenges or opportunities.
  • +
+

Day 7-9: In-Depth Work Sessions

+

Daily Goals

+
    +
  • Clear objectives for each day’s work sessions.
  • +
+

Task Progress Updates

+
    +
  • Brief reports from team members on their assigned tasks.
  • +
  • Collaborative problem-solving for any issues encountered.
  • +
+

Theory and Data Integration

+
    +
  • Continued discussions on aligning theoretical frameworks with data analysis.
  • +
  • Workshops or breakout sessions for detailed aspects of the project.
  • +
+

Evening Collaborative Activities

+
    +
  • Informal sessions to encourage ongoing dialogue and collaboration.
  • +
+

Day 10: Mid-Point Review

+

Progress Evaluation

+
    +
  • Assessment of the work done during the week.
  • +
  • Feedback sessions to ensure quality and consistency in outputs.
  • +
+

Documentation and Record-Keeping

+
    +
  • Ensure thorough documentation of methods, results, and decisions.
  • +
  • Establish a system for organizing and sharing this documentation.
  • +
+

Planning Forward

+
    +
  • Setting objectives for the next phase of the project.
  • +
  • Adjusting the roadmap as necessary based on insights from the week’s work.
  • +
+

Detailed Notes

+

Day 6 Notes

+
    +
  • ...
  • +
+

Day 7 Notes

+
    +
  • ...
  • +
+

Day 8 Notes

+
    +
  • ...
  • +
+

Day 9 Notes

+
    +
  • ...
  • +
+

Day 10 Notes

+
    +
  • ...
  • +
+

Action Items

+
    +
  • [ ] Specific task: Assigned to - Deadline
  • +
  • [ ] Specific task: Assigned to - Deadline
  • +
  • ...
  • +
+

Reflections and Comments

+
    +
  • (Space for any additional thoughts, insights, or personal reflections on the meeting.)
  • +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/resources/second_meeting_notes/second_meeting_notes.md b/resources/second_meeting_notes/second_meeting_notes.md new file mode 100644 index 0000000..1c9037e --- /dev/null +++ b/resources/second_meeting_notes/second_meeting_notes.md @@ -0,0 +1,78 @@ +# Primary Meeting Day 6-10: Progress and Development + +## Meeting Details +- **Dates:** +- **Times:** +- **Location:** +- **Facilitator:** + +## Attendees +- List of attendees + +## Daily Agenda + +### Day 6: Review and Refine + +#### Recap of Previous Sessions +- Summary of progress made since the last meeting. +- Review of action items and milestones achieved. + +#### Refinement of Goals and Tasks +- Reassessment and adjustment of goals based on current progress. +- Identification of any new challenges or opportunities. + +### Day 7-9: In-Depth Work Sessions + +#### Daily Goals +- Clear objectives for each day’s work sessions. + +#### Task Progress Updates +- Brief reports from team members on their assigned tasks. +- Collaborative problem-solving for any issues encountered. + +#### Theory and Data Integration +- Continued discussions on aligning theoretical frameworks with data analysis. +- Workshops or breakout sessions for detailed aspects of the project. + +#### Evening Collaborative Activities +- Informal sessions to encourage ongoing dialogue and collaboration. + +### Day 10: Mid-Point Review + +#### Progress Evaluation +- Assessment of the work done during the week. +- Feedback sessions to ensure quality and consistency in outputs. + +#### Documentation and Record-Keeping +- Ensure thorough documentation of methods, results, and decisions. +- Establish a system for organizing and sharing this documentation. + +#### Planning Forward +- Setting objectives for the next phase of the project. +- Adjusting the roadmap as necessary based on insights from the week’s work. + +## Detailed Notes + +### Day 6 Notes +- ... + +### Day 7 Notes +- ... + +### Day 8 Notes +- ... + +### Day 9 Notes +- ... + +### Day 10 Notes +- ... + +## Action Items +- [ ] Specific task: Assigned to - Deadline +- [ ] Specific task: Assigned to - Deadline +- ... + +## Reflections and Comments +- (Space for any additional thoughts, insights, or personal reflections on the meeting.) + diff --git a/resources/slides/index.html b/resources/slides/index.html new file mode 100644 index 0000000..9b452e3 --- /dev/null +++ b/resources/slides/index.html @@ -0,0 +1,1129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Orientation Slides - ESIIL Working Group OASIS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Welcome to ESIIL Education Student OASIS

+

This is the central resource for ESIIL working groups.

+

Embedded Website

+

Below is an embedded website:

+ + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/resources/slides/slides.md b/resources/slides/slides.md new file mode 100644 index 0000000..74dba74 --- /dev/null +++ b/resources/slides/slides.md @@ -0,0 +1,10 @@ +# Welcome to ESIIL Education Student OASIS + +This is the central resource for ESIIL working groups. + +## Embedded Website + +Below is an embedded website: + + + diff --git a/resources/third_meeting_notes/index.html b/resources/third_meeting_notes/index.html new file mode 100644 index 0000000..bbbf196 --- /dev/null +++ b/resources/third_meeting_notes/index.html @@ -0,0 +1,1458 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Third meeting - ESIIL Working Group OASIS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Primary Meeting Day 11-15: Finalization and Conclusion

+

Meeting Details

+
    +
  • Dates:
  • +
  • Times:
  • +
  • Location:
  • +
  • Facilitator:
  • +
+

Attendees

+
    +
  • List of attendees
  • +
+

Daily Agenda

+

Day 11: Alignment and Focus

+

Realigning Objectives

+
    +
  • Review the project's main goals to ensure alignment with the final output.
  • +
  • Address any misalignments or deviations from the original plan.
  • +
+

Prioritization of Tasks

+
    +
  • Identify critical tasks that need to be completed.
  • +
  • Allocate resources and efforts to ensure these priorities are met.
  • +
+

Day 12-14: Intensive Work Period

+

Task Completion

+
    +
  • Dedicated time for team members to complete their individual contributions.
  • +
  • Regular check-ins to track progress and address any blockers.
  • +
+

Integration of Work

+
    +
  • Begin to combine individual contributions into a cohesive whole.
  • +
  • Review the integration to ensure consistency and coherency across the project.
  • +
+

Final Reviews and Edits

+
    +
  • Conduct thorough reviews of the project's outputs.
  • +
  • Perform final edits to refine the quality of the work.
  • +
+

Day 15: Closure and Celebration

+

Final Presentation

+
    +
  • Present the completed project to the group.
  • +
  • Discuss any last-minute adjustments or refinements needed.
  • +
+

Reflective Session

+
    +
  • Reflect on the achievements and learnings from the project.
  • +
  • Share appreciation for the team's hard work and dedication.
  • +
+

Celebration

+
    +
  • Acknowledge the successful completion of the project.
  • +
  • Plan for any dissemination of the project's findings or outputs.
  • +
+

Detailed Notes

+

Day 11 Notes

+
    +
  • ...
  • +
+

Day 12 Notes

+
    +
  • ...
  • +
+

Day 13 Notes

+
    +
  • ...
  • +
+

Day 14 Notes

+
    +
  • ...
  • +
+

Day 15 Notes

+
    +
  • ...
  • +
+

Action Items

+
    +
  • [ ] Finalize manuscript for publication: Assigned to - Deadline
  • +
  • [ ] Prepare data for repository submission: Assigned to - Deadline
  • +
  • [ ] Organize project materials for archival: Assigned to - Deadline
  • +
  • ...
  • +
+

Reflections and Comments

+
    +
  • (Space for any additional thoughts, insights, or personal reflections on the meeting and the project as a whole.)
  • +
+

Next Steps

+
    +
  • Define the publication and dissemination plan.
  • +
  • Outline any follow-up research or projects that have stemmed from this work.
  • +
+

Additional Documentation

+
    +
  • (Include or link to any additional documents, charts, or resources that were created or referenced during the meeting.)
  • +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/resources/third_meeting_notes/third_meeting_notes.md b/resources/third_meeting_notes/third_meeting_notes.md new file mode 100644 index 0000000..19abeda --- /dev/null +++ b/resources/third_meeting_notes/third_meeting_notes.md @@ -0,0 +1,83 @@ +# Primary Meeting Day 11-15: Finalization and Conclusion + +## Meeting Details +- **Dates:** +- **Times:** +- **Location:** +- **Facilitator:** + +## Attendees +- List of attendees + +## Daily Agenda + +### Day 11: Alignment and Focus + +#### Realigning Objectives +- Review the project's main goals to ensure alignment with the final output. +- Address any misalignments or deviations from the original plan. + +#### Prioritization of Tasks +- Identify critical tasks that need to be completed. +- Allocate resources and efforts to ensure these priorities are met. + +### Day 12-14: Intensive Work Period + +#### Task Completion +- Dedicated time for team members to complete their individual contributions. +- Regular check-ins to track progress and address any blockers. + +#### Integration of Work +- Begin to combine individual contributions into a cohesive whole. +- Review the integration to ensure consistency and coherency across the project. + +#### Final Reviews and Edits +- Conduct thorough reviews of the project's outputs. +- Perform final edits to refine the quality of the work. + +### Day 15: Closure and Celebration + +#### Final Presentation +- Present the completed project to the group. +- Discuss any last-minute adjustments or refinements needed. + +#### Reflective Session +- Reflect on the achievements and learnings from the project. +- Share appreciation for the team's hard work and dedication. + +#### Celebration +- Acknowledge the successful completion of the project. +- Plan for any dissemination of the project's findings or outputs. + +## Detailed Notes + +### Day 11 Notes +- ... + +### Day 12 Notes +- ... + +### Day 13 Notes +- ... + +### Day 14 Notes +- ... + +### Day 15 Notes +- ... + +## Action Items +- [ ] Finalize manuscript for publication: Assigned to - Deadline +- [ ] Prepare data for repository submission: Assigned to - Deadline +- [ ] Organize project materials for archival: Assigned to - Deadline +- ... + +## Reflections and Comments +- (Space for any additional thoughts, insights, or personal reflections on the meeting and the project as a whole.) + +## Next Steps +- Define the publication and dissemination plan. +- Outline any follow-up research or projects that have stemmed from this work. + +## Additional Documentation +- (Include or link to any additional documents, charts, or resources that were created or referenced during the meeting.) diff --git a/resources/visualizations/index.html b/resources/visualizations/index.html new file mode 100644 index 0000000..b9bebc3 --- /dev/null +++ b/resources/visualizations/index.html @@ -0,0 +1,1291 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Visualizations - ESIIL Working Group OASIS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Visualization Strategy and Development Documentation

+

Overview

+
    +
  • Brief overview of the visualization goals and their alignment with the overall project objectives.
  • +
+

Visualization Strategy

+

Identifying Key Messages

+
    +
  • Discuss main messages or insights to communicate through visualizations.
  • +
  • Identify target audience and their specific needs.
  • +
+

Selecting Appropriate Visualization Types

+
    +
  • Explore different types of visualizations (charts, graphs, 3D, interactive elements) suitable for the data and message.
  • +
  • Brainstorm creative visualization approaches.
  • +
+

Visualization Development

+

Code-Generated Visualizations

+
    +
  • Outline initial visualizations generated from the data pipeline.
  • +
  • Include code snippets and explanations.
  • +
+
# Example Python code for a basic plot
+import matplotlib.pyplot as plt
+plt.plot(data['x'], data['y'])
+plt.show()
+
+

Enhancing Visualizations

+
    +
  • Steps for annotating, animating, creating 3D, immersive, or interactive visualizations.
  • +
  • Discuss challenges and solutions in enhancing visuals.
  • +
+

Versioning and Iterations

+
    +
  • Document different versions and iterations of visualizations.
  • +
  • Reflect on improvements or changes in each version.
  • +
+

Finalizing Visualizations

+
    +
  • Process of finalizing visuals for presentation or publication.
  • +
  • Feedback incorporation from team or test audiences.
  • +
+

Documentation of Tools and Resources

+
    +
  • List software, libraries, and tools used for visualization.
  • +
  • Reference external resources or tutorials.
  • +
+

Conclusions

+
    +
  • Summarize the visualization process and contributions to the project.
  • +
  • Reflect on lessons learned and potential future improvements.
  • +
+

References

+
    +
  • Cite external sources, inspirations, or frameworks used in visualization.
  • +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/resources/visualizations/visualizations.md b/resources/visualizations/visualizations.md new file mode 100644 index 0000000..2857a8b --- /dev/null +++ b/resources/visualizations/visualizations.md @@ -0,0 +1,50 @@ +# Visualization Strategy and Development Documentation + +## Overview +- Brief overview of the visualization goals and their alignment with the overall project objectives. + +## Visualization Strategy + +### Identifying Key Messages +- Discuss main messages or insights to communicate through visualizations. +- Identify target audience and their specific needs. + +### Selecting Appropriate Visualization Types +- Explore different types of visualizations (charts, graphs, 3D, interactive elements) suitable for the data and message. +- Brainstorm creative visualization approaches. + +## Visualization Development + +### Code-Generated Visualizations +- Outline initial visualizations generated from the data pipeline. +- Include code snippets and explanations. + +```python +# Example Python code for a basic plot +import matplotlib.pyplot as plt +plt.plot(data['x'], data['y']) +plt.show() +``` + +### Enhancing Visualizations +- Steps for annotating, animating, creating 3D, immersive, or interactive visualizations. +- Discuss challenges and solutions in enhancing visuals. + +### Versioning and Iterations +- Document different versions and iterations of visualizations. +- Reflect on improvements or changes in each version. + +### Finalizing Visualizations +- Process of finalizing visuals for presentation or publication. +- Feedback incorporation from team or test audiences. + +### Documentation of Tools and Resources +- List software, libraries, and tools used for visualization. +- Reference external resources or tutorials. + +### Conclusions +- Summarize the visualization process and contributions to the project. +- Reflect on lessons learned and potential future improvements. + +### References +- Cite external sources, inspirations, or frameworks used in visualization. diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 0000000..7923f2f --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"[Your Working Group Name]","text":"

Welcome to the [Your Working Group Name] repository, part of the Environmental Data Science Innovation and Inclusion Lab (ESIIL). This repository serves as the central hub for our working group, hosting our project description, proposals, member bios, codebase, and more.

test edit

"},{"location":"#our-project","title":"Our Project","text":"

[Provide a brief overview of your project here. Explain what you aim to achieve, the importance of your project, and its expected impact.]

"},{"location":"#project-proposal","title":"Project Proposal","text":"

[Link to the detailed project proposal document or include the proposal directly in the repository. This should outline the goals, methodologies, anticipated challenges, and projected timelines.]

"},{"location":"#group-members","title":"Group Members","text":"

[List the names and a brief description of each group member, possibly linking to their personal or professional web pages.]

  • Member 1: Brief description or role within the group.
  • Member 2: Brief description or role within the group.
  • ...
"},{"location":"#code-repository","title":"Code Repository","text":"

This section of the repository will include all the code developed for the project. You can structure it as follows:

  • Analysis Code: Scripts for data analysis, statistical modeling, etc.
  • Data Processing: Scripts for cleaning, merging, and managing datasets.
  • Visualization: Code for creating figures, charts, and interactive visualizations.
"},{"location":"#meeting-notes-and-agendas","title":"Meeting Notes and Agendas","text":"

Meeting notes and agendas will be regularly updated here to keep all group members informed and engaged with the progress and direction of the project.

"},{"location":"#contributing-to-this-repository","title":"Contributing to This Repository","text":"

We welcome contributions from all group members. To maintain the quality and integrity of the repository, please adhere to the following guidelines:

  • Make sure all commits have a clear and concise message.
  • Document any major changes or decisions in the meeting notes.
  • Review and merge changes through pull requests to ensure oversight.
"},{"location":"#getting-help","title":"Getting Help","text":"

If you encounter any issues or have questions about how to contribute, please refer to the ESIIL Support Page or contact the repository maintainers directly.

"},{"location":"#customize-your-repository","title":"Customize Your Repository","text":"

As a new working group, you'll want to make this repository your own. Here's how to get started:

  1. Edit This Readme: Replace the placeholder content with information about your specific project. Ensure that the introduction, project overview, and objectives clearly reflect your group's research focus.

  2. Update Group Member Bios: Add details about each group member's expertise, role in the project, and professional background. Include links to personal or professional web pages to foster community engagement and collaboration.

  3. Organize Your Code: Structure your codebase in a way that is logical and accessible. Use directories and clear naming conventions to make it easy for all members to find and contribute to different parts of the project.

  4. Document Your Data: Include a data directory with README files explaining the datasets, sources, and any preprocessing steps. This will help new members understand and work with the project's data effectively.

  5. Outline Your Methods: Create a detailed METHODS.md file where you describe the methodologies, software, and tools you will be using in your research. This transparency will support reproducibility and collaborative development.

  6. Set Up Project Management: Utilize the 'Issues' and 'Projects' features on GitHub to track tasks, discuss ideas, and manage your workflow. This can help in maintaining a clear view of progress and priorities.

  7. Add a License: Choose and include an appropriate open-source license for your project, ensuring that the broader community understands how they can use and contribute to your work.

  8. Create Contribution Guidelines: Establish a CONTRIBUTING.md file with instructions for members on how to propose changes, submit issues, and contribute code.

  9. Review and Merge Workflow: Decide on a workflow for reviewing and merging changes. Will you use branch protection? Who will have merge privileges? Document this process to avoid confusion.

  10. Establish Communication Channels: Beyond GitHub, set up additional communication channels like Slack, Discord, or email lists for quick and informal discussions.

Remember, the goal is to make your repository clear, accessible, and useful for all current and future members of your working group. Happy researching!

"},{"location":"resources/art%20gallery/","title":"science art","text":"

2024-01-25

"},{"location":"resources/art%20gallery/#tys-art-opinion","title":"Ty\u2019s art opinion","text":"

In the context of the ongoing discussions for the redesign of our ESIIL office space, I would like to offer my personal perspective on the art and aesthetic that might enrich our environment:

Urban Realism with a Personal Touch: I have a strong appreciation for artworks that reflect a realistic depiction of nature and urban life but with an imaginative twist. Art that integrates with and elevates our daily surroundings could offer a fresh perspective on the mundane.

Nature in the Workplace: On a personal note, I find that art which brings elements of the outdoors inside can create a serene and motivating atmosphere, conducive to the values of sustainability that ESIIL embodies.

Interactive Art: I believe that art installations which invite interaction or present a playful exaggeration of reality can energize our space. They have the potential to foster a creative dialogue among the team and with visitors.

Dimensionality and Engagement: From my viewpoint, art that breaks out of the traditional two-dimensional space and engages with the viewer in three dimensions can transform the feel of an office. Such dynamic pieces could encourage innovative thinking and collaboration.

Art with a Message: It\u2019s my opinion that the art we choose should subtly reflect our collective social and environmental commitments. Pieces that prompt introspection about our role in larger societal issues could resonate well with our team\u2019s ethos.

Community Connection: Lastly, I feel that our office should not just be a place for work but also a space that invites community interaction. Art can be a bridge between ESIIL and the public, making our office a hub for inspiration and engagement.

"},{"location":"resources/citations/","title":"Citation Management and Notes Collection in Markdown","text":""},{"location":"resources/citations/#introduction","title":"Introduction","text":"

This document serves as a guide for managing citations and collecting research notes for our project. We'll use a combination of a .bib file for bibliographic references and Markdown for note-taking.

"},{"location":"resources/citations/#part-1-setting-up-your-bib-file-for-citations","title":"Part 1: Setting Up Your .bib File for Citations","text":""},{"location":"resources/citations/#creating-a-bib-file","title":"Creating a .bib File","text":"
  1. Create a new file with a .bib extension, for example, project_references.bib.
  2. Add bibliographic entries to this file. Each entry should follow the BibTeX format.
"},{"location":"resources/citations/#example-of-a-bib-entry","title":"Example of a .bib Entry","text":"

```bibtex @article{Doe2021, author = {Jane Doe and John Smith}, title = {Insights into Environmental Data Science}, journal = {Journal of Data Science}, year = {2021}, volume = {15}, number = {4}, pages = {123-145}, doi = {10.1000/jds.2021.15.4} }

"},{"location":"resources/citations/#part-2-using-citations-in-markdown","title":"Part 2: Using Citations in Markdown","text":""},{"location":"resources/citations/#citing-in-your-markdown-document","title":"Citing in Your Markdown Document","text":"
  • Refer to works in your .bib file using citation keys, like [@Doe2021].
"},{"location":"resources/citations/#converting-markdown-to-pdf-with-citations","title":"Converting Markdown to PDF with Citations","text":"
  • Use Pandoc: pandoc yourdoc.md --bibliography=project_references.bib --citeproc -o output.pdf
"},{"location":"resources/citations/#part-3-collecting-citations-and-research-notes","title":"Part 3: Collecting Citations and Research Notes","text":""},{"location":"resources/citations/#structuring-your-notes","title":"Structuring Your Notes","text":""},{"location":"resources/citations/#notes-on-doe-2021-doe2021","title":"Notes on Doe 2021 [@Doe2021]","text":"
  • Key Points:
  • Summary of the article's main arguments.
  • Notable methodologies.

  • Relevance to Our Project:

  • How this research informs our project.
  • Applicable methodologies or theories.
"},{"location":"resources/citations/#notes-on-another-article-another2021","title":"Notes on Another Article [@Another2021]","text":"
  • Key Points:
  • ...

  • Relevance to Our Project:

  • ...
"},{"location":"resources/citations/#conclusion","title":"Conclusion","text":"

This document facilitates efficient management of references and collaborative knowledge building for our project.

"},{"location":"resources/code-of-conduct/","title":"Code of Conduct and Respectful Inclusive Collaboration Guidelines","text":"

CIRES Earth Lab and Environmental Data Science Innovation & Inclusion Lab (ESIIL) are committed to building, maintaining, and fostering an inclusive, kind, collaborative, and diverse transdisciplinary environmental data science community, whose members feel welcome, supported, and safe to contribute ideas and knowledge.

The Forest Carbon Codefest will follow all aspects of the ESIIL Code of Conduct (below).

All community members are responsible for creating this culture, embodying our values, welcoming diverse perspectives and ways of knowing, creating safe inclusive spaces, and conducting ethical science as guided by FAIR (Findable, Accessible, Interoperable, Reusable) and CARE (Collective Benefit, Authority to Control, Responsibility, and Ethics) principles for scientific and Indigenous data management, governance, and stewardship.

"},{"location":"resources/code-of-conduct/#our-values","title":"Our values","text":"

ESIIL\u2019s vision is grounded in the conviction that innovation and breakthroughs in environmental data science will be precipitated by a diverse, collaborative, curious, and inclusive research community empowered by open data and infrastructure, cross-sector and community partnerships, team science, and engaged learning.

As such, our core values center people through inclusion, kindness, respect, collaboration, and genuine relationships. They also center innovation, driven by collaborative, cross-sector science and synthesis, open, accessible data and tools, and fun, diverse teams. Finally, they center learning, propelled by curiosity and accessible, inclusive training, and education opportunities.

"},{"location":"resources/code-of-conduct/#when-and-how-to-use-these-guidelines","title":"When and how to use these guidelines","text":"

These guidelines outline behavior expectations for ESIIL community members. Your participation in the ESIIL network is contingent upon following these guidelines in all ESIIL activities, including, but not limited to, participating in meetings, webinars, hackathons, working groups, hosted or funded by ESIIL, as well as email lists and online forums such as GutHub, Slack, and Twitter. These guidelines have been adapted from those of the International Arctic Research Policy Committee, the Geological Society of America, the American Geophysical Union, the University Corporation for Atmospheric Research, The Carpentries, and others. We encourage other organizations to adapt these guidelines for use in their own meetings.

Note: Working groups and hackathon/codefest teams are encouraged to discuss these guidelines and what they mean to them, and will have the opportunity to add to them to specifically support and empower their team. Collaborative and behavior commitments complement data use, management, authorship, and access plans that commit to CARE and FAIR principles.

"},{"location":"resources/code-of-conduct/#behavior-agreements","title":"Behavior Agreements","text":"

ESIIL community members are expected to act professionally and respectfully in all activities, such that each person, regardless of gender, gender identity or expression, sexual orientation, disability, physical appearance, age, body size, race, religion, national origin, ethnicity, level of experience, language fluency, political affiliation, veteran status, pregnancy, country of origin, and any other characteristic protected under state or federal law, feels safe and welcome in our activities and community. We gain strength from diversity and actively seek participation from those who enhance it.

In order to garner the benefits of a diverse community and to reach the full potential of our mission and charge, ESIIL participants must be allowed to develop a sense of belonging and trust within a respectful, inclusive, and collaborative culture. Guiding behaviors that contribute to this culture include, but are not limited to:

"},{"location":"resources/code-of-conduct/#showing-respect","title":"Showing Respect","text":"
  • Listen carefully \u2013 we each bring our own styles of communication, language, and ideas, and we must do our best to accept and accommodate differences. Do not interrupt when someone is speaking and maintain an open mind when others have different ideas than yours.

  • Be present \u2013 when engaging with others, give them your full attention. If you need to respond to outside needs, please step away from the group quietly.

  • Be kind \u2013 offer positive, supportive comments and constructive feedback. Critique ideas, not people. Harassment, discrimination, bullying, aggression, including offensive comments, jokes, and imagery, are unacceptable, regardless of intent, and will not be tolerated.

  • Be punctual - adhere to the schedule provided by the organizers and avoid disruptive behavior during presentations, trainings, or working sessions.

  • Respect privacy - be mindful of the confidentiality of others. Always obtain explicit consent before recording, sharing, or using someone else\u2019s personal information, photos, or recordings.

  • Practice good digital etiquette (netiquette) when communicating online, whether in emails, messages, or social media - think before posting online and consider the potential impact on others. Do not share or distribute content generated by or involving others without their explicit consent.

"},{"location":"resources/code-of-conduct/#being-inclusive","title":"Being Inclusive","text":"
  • Create space for everyone to participate \u2013 be thoughtful about who is at the table; openly address accessibility needs, and provide multiple ways to contribute.

  • Be welcoming \u2013 ESIIL participants come from a wide range of skill levels and career stages, backgrounds, and cultures. Demonstrate that you value these different perspectives and identities through your words and actions, including through correct use of names, titles, and pronouns.

  • Be self-aware \u2013 recognize that positionality, identity, unconscious biases, and upbringing can all affect how words and behaviors are perceived. Ensure that your words and behavior make others feel welcome.

  • Commit to ongoing learning \u2013 the move toward inclusive, equitable, and just environmental data science is a collective journey. Continue to learn about and apply practices of inclusion, anti-racism, bystander intervention, and cultural sensitivity. None of us is perfect; all of us will, from time to time, fail to live up to our own high standards. Being perfect is not what matters; owning our mistakes and committing to clear and persistent efforts to grow and improve is.

"},{"location":"resources/code-of-conduct/#being-curious","title":"Being Curious","text":"
  • Check your presumptions \u2013 we each bring our own ideas and assumptions about how the world should and does work \u2013 what are yours, and how do they affect how you interact with others? How do they shape your perception of new ideas?

  • Ask questions \u2013 one of the strengths of interdisciplinary and diverse teams is that we all bring different knowledge and viewpoints; no one person is expected to know everything. So don\u2019t be afraid to ask, to learn, and to share.

  • Be bold \u2013 significant innovations don\u2019t come from incremental efforts. Be brave in proposing and testing new ideas. When things don\u2019t work, learn from the experience.

  • Invite feedback \u2013 new ideas and improvements can emerge from many places when we\u2019re open to hearing them. Check your defensiveness and listen; accept feedback as a gift toward improving our work and ourselves.

"},{"location":"resources/code-of-conduct/#being-collaborative","title":"Being Collaborative","text":"
  • Recognize that everyone is bringing something different to the table \u2013 take the time to get to know each other. Keep an open mind, encourage ideas that are different from yours, and learn from each other\u2019s expertise and experience.

  • Be accountable - great team science depends on trust, communication, respect, and delivering on your commitments. Be clear about your needs, as both a requester and a responder, realistic about your time and capacity commitments, and communicate timelines and standards in advance.

  • Make assumptions explicit and provide context wherever possible - misunderstandings are common on transdisciplinary and cross-cultural teams and can best be managed with intentionality. Check in about assumptions, and be willing to share and correct misunderstandings or mistakes when they happen. Make use of collaboration agreements, communicate clearly and avoid jargon wherever possible.

  • Respect intellectual property and Indigenous data sovereignty \u2013 ESIIL recognizes the extractive and abusive history of scientific engagement with Native peoples, and is committed to doing better. Indigenous knowledge holders are under no obligation to share their data, stories or knowledge. Their work should always be credited, and only shared with permission. Follow guidelines for authorship, Indigenous data sovereignty, and CARE principles. Acknowledge and credit the ideas and work of others.

  • Use the resources that we provide - take advantage of the cyberinfrastructure and data cube at your disposal, but do not use them for unrelated tasks, as it could disrupt the event, introduce security risks, undermine the spirit of collaboration and fair play, and erode trust within the event community.

  • Be safe - never share sensitive personal information; use strong passwords for your Cyverse and GitHub accounts and do not share them with other participants; be cautious of unsolicited emails, messages, or links; and verify online contacts. If you encounter any illegal or harmful activities online related to this event, report them to Tyler McIntosh or Susan Sullivan.

Finally, speak up if you experience or notice a dangerous situation, or someone in distress!

"},{"location":"resources/code-of-conduct/#code-of-conduct-unacceptable-behaviors","title":"Code of Conduct: Unacceptable behaviors","text":"

We adopt the full Code of Conduct of our home institution, the University of Colorado, details of which are found here. To summarize, examples of unacceptable and reportable behaviors include, but are not limited to:

  • Harassment, intimidation, or discrimination in any form
  • Physical or verbal abuse by anyone to anyone, including but not limited to a participant, member of the public, guest, member of any institution or sponsor
  • Unwelcome sexual attention or advances
  • Personal attacks directed at other guests, members, participants, etc.
  • Alarming, intimidating, threatening, or hostile comments or conduct
  • Inappropriate use of nudity and/or sexual images in public spaces or in presentations
  • Threatening or stalking anyone
  • Unauthorized use or sharing of personal or confidential information or private communication
  • Continuing interactions, including but not limited to conversations, photographies, recordings, instant messages, and emails, after being asked to stop
  • Ethical and scientific misconduct, including failing to credit contributions or respect intellectual property
  • Engaging in any illegal activities, including hacking, cheating, or unauthorized access to systems or data
  • Using the cyberinfrastructure provided by the organizers for activities unrelated to this event.
  • Other conduct which could reasonably be considered inappropriate in a professional setting.

The University of Colorado recognizes all Federal and State protected classes, which include the following: race, color, national origin, sex, pregnancy, age, marital status, disability, creed, religion, sexual orientation, gender identity, gender expression, veteran status, political affiliation or political philosophy. Mistreatment or harassment not related to protected class also has a negative impact and will be addressed by the ESIIL team.

Anyone requested to stop unacceptable behavior is expected to comply immediately.

If there is a clear violation of the code of conduct during an ESIIL event\u2014for example, a meeting is Zoom bombed or a team member is verbally abusing another participant during a workshop\u2014 ESIIL leaders, facilitators (or their designee) or campus/local police may take any action deemed necessary and appropriate, including expelling the violator, or immediate removal of the violator from any online or in-person event or platform without warning or refund. If such actions are necessary, there will be follow up with the ESIIL Diversity Equity and Inclusion (DEI) team to determine what further action is needed (see Reporting Process and Consequences below).

"},{"location":"resources/code-of-conduct/#addressing-behavior-directly","title":"Addressing Behavior Directly","text":"

For smaller incidents that might be settled with a brief conversation, you may choose to contact the person in question or set up a (video) conversation to discuss how the behavior affected you. Please use this approach only if you feel comfortable; you do not have to carry the weight of addressing these issues yourself. If you are interested in this option but unsure how to go about it, please contact the ESIIL DEI lead, Susan Sullivan, first\u2014she will have advice on how to make the conversation happen and is available to join you in a conversation as requested.

"},{"location":"resources/code-of-conduct/#reporting-process-and-consequences","title":"Reporting Process and Consequences","text":"

We take any reports of Code of Conduct violations seriously, and aim to support those who are impacted and ensure that problematic behavior doesn\u2019t happen again.

"},{"location":"resources/code-of-conduct/#making-a-report","title":"Making a Report","text":"

If you believe you\u2019re experiencing or have experienced unacceptable behavior that is counter to this code of conduct, or you are witness to this behavior happening to someone else, we encourage you to contact our DEI lead:

  • Susan Sullivan, CIRES
  • Email: susan.sullivan@colorado.edu

You may also choose to anonymously report behavior to ESIIL using this form.

The DEI team will keep reports as confidential as possible. However, as mandatory reporters, we have an obligation to report alleged protected class violations to our home institution or to law enforcement.

"},{"location":"resources/code-of-conduct/#specifically","title":"Specifically:","text":"
  • Cases of potential protected-class harassment will be reported to the CU Office of Institutional Equity and Compliance.
  • If the violation is made by a member of another institution, that information may also be shared with that member\u2019s home institution by the CU Office of Institutional Equity and Compliance under Title IX.
  • In some instances, harassment information may be shared with the National Science Foundation, who are the funding organization of ESIIL.

When we discuss incidents with people who are accused of misconduct (the respondent), we will anonymize details as much as possible to protect the privacy of the reporter and the person who was impacted (the complainant). In some cases, even when the details are anonymized, the respondent may guess at the identities of the reporter and complainants. If you have concerns about retaliation or your personal safety, please let us know (or note that in your report). We encourage you to report in any case, so that we can support you while keeping ESIIL members safe. In some cases, we are able to compile several anonymized reports into a pattern of behavior, and take action based on that pattern.

If you prefer to speak with someone who is not on the ESIIL leadership team, or who can maintain confidentiality, you may contact:

  • CU Ombuds
  • Phone: 303-492-5077 (for guidance and support navigating difficult conversations)
  • CU Office of Victim Assistance
  • Phone: 303-492-8855

If you want more information about when to report, or how to help someone who needs to report, please review the resources at Don\u2019t Ignore It.

Note: The reporting party does not need to be directly involved in a code of conduct violation incident. Please make a bystander report if you observe a potentially dangerous situation, someone in distress, or violations of these guidelines, even if the situation is not happening to you.

"},{"location":"resources/code-of-conduct/#what-happens-after-a-report-is-filed","title":"What Happens After a Report Is Filed","text":"

After a member of the ESIIL DEI team takes your report, they will (if necessary) consult with the appropriate support people at CU. The ESIIL DEI team will respond with a status update within 5 business days.

During this time, they, or members of the CU Office of Institutional Equity and Compliance, will:

  • Meet with you or review report documentation to determine what happened
  • Consult documentation of past incidents for patterns of behavior
  • Discuss appropriate response(s) to the incident
  • Connect with the appropriate offices and/or make those response(s)
  • Determine the follow-up actions for any impacted people and/or the reporter
  • Follow up with the impacted people, including connecting them with support and resources.
"},{"location":"resources/code-of-conduct/#as-a-result-of-this-process-in-minor-cases-esiil-dei-may-communicate-with-the-respondent-to","title":"As a result of this process, in minor cases ESIIL DEI may communicate with the respondent to:","text":"
  • Explain what happened and the impact of their behavior
  • Offer concrete examples of how to improve their behavior
  • Explain consequences of their behavior, or future consequences if the behavior is repeated.

For significant infractions, follow up to the report may be turned over to the CU Office of Institutional Equity and Compliance and/or campus police.

"},{"location":"resources/code-of-conduct/#possible-consequences-to-code-of-conduct-violations","title":"Possible Consequences to Code of Conduct Violations","text":"

What follows are examples of possible responses to an incident report. This list is not inclusive, and ESIIL reserves the right to take any action it deems necessary. Generally speaking, the strongest response ESIIL may take is to completely ban a user from further engagement with ESIIL activities and, as is required, report a person to the CU Office of Institutional Equity and Compliance and/or their home institution and NSF. If law enforcement should be involved, they will recommend that the complainant make that contact. Employees of CU Boulder may also be subject to consequences as determined by the institution.

In addition to the responses above, ESIIL responses may include but are not limited to the following:

  • A verbal discussion in person or via phone/Zoom followed by documentation of the conversation via email
  • Not publishing the video or slides of a talk that violated the code of conduct
  • Not allowing a speaker who violated the code of conduct to give (further) talks
  • Immediately ending any team leadership, membership, or other responsibilities and privileges that a person holds
  • Temporarily banning a person from ESIIL activities
  • Permanently banning a person from ESIIL activities
  • Nothing, if the behavior is determined to not be a code of conduct violation

Do you need more resources?

Please don\u2019t hesitate to contact the ESIIL DEI lead, Susan Sullivan, if you have questions or concerns.

The CU Office of Institutional Equity and Compliance is a resource for all of us in navigating this space. They also offer resource materials that can assist you in exploring various topics and skills here.

If you have questions about what, when or how to report, or how to help someone else with concerns, Don\u2019t Ignore It.

CU Ombud\u2019s Office: Confidential support to navigate university situations. (Most universities have these resources)

The CU Office of Victims Assistance (counseling limited to CU students/staff/faculty, though advocacy is open to everyone engaged with a CU-sponsored activity. Please look for a similar resource on your campus if you are from another institution).

National Crisis Hotlines

How are we doing?

Despite our best intentions, in some cases we may not be living up to our ideals of a positive, supportive, inclusive, respectful and collaborative community. If you feel we could do better, we welcome your feedback. Comments, suggestions and praise are also very welcome! Acknowledgment By participating in this event, you agree to abide by this code of conduct and understand the consequences of violating it. We believe that a respectful and inclusive environment benefits all participants and leads to more creative and successful outcomes. Thank you for your cooperation in making the this event a welcoming event for all. Have fun!

"},{"location":"resources/cyverse_basics/","title":"Connecting Cyverse to GitHub","text":""},{"location":"resources/cyverse_basics/#log-in-to-cyverse","title":"Log in to Cyverse","text":"
  1. Go to the Cyverse user account website https://user.cyverse.org/
  1. Click Sign up (if you do not already have an account)
  1. Head over to the Cyverse Discovery Environment https://de.cyverse.org, and log in with your new account.

You should now see the Discovery Environment:

  1. We will give you permissions to access the Hackathon app. If you haven't already, let us know that you need access
"},{"location":"resources/cyverse_basics/#open-up-an-analysis-with-the-hackathon-environment-jupyter-lab","title":"Open up an analysis with the hackathon environment (Jupyter Lab)","text":"
  1. From the Cyverse Discovery Environment, click on Apps in the left menu

  2. Select JupyterLab ESIIL

  3. Configure and launch your analysis - when choosing the disk size, make sure to choose 64GB or greater. The rest of the settings you can change to suit your computing needs:

  1. Click Go to analysis:

  2. Now you should see Jupyter Lab!

"},{"location":"resources/cyverse_basics/#set-up-your-github-credentials","title":"Set up your GitHub credentials","text":""},{"location":"resources/cyverse_basics/#if-you-would-prefer-to-follow-a-video-instead-of-a-written-outline-we-have-prepared-a-video-here","title":"If you would prefer to follow a video instead of a written outline, we have prepared a video here:","text":"
  1. From Jupyter Lab, click on the Git Extension icon on the left menu:

  2. Click Clone a Repository and Paste the link to the cyverse-utils https://github.com/CU-ESIIL/cyverse-utils.git and click Clone:

  3. You should now see the cyverse-utils folder in your directory tree (provided you haven't changed directories from the default /home/jovyan/data-store

  4. Go into the cyverse-utils folder:

  5. open up the create_github_keypair.ipynb notebook if you prefer Python or the 'create_github_keypair.R' script if you prefer R by double-clicking and then select the default 'macrosystems' kernel:

  6. Now you should see the notebook open. Click the play button at the top. You will be prompted to enter your GitHub username and email:

  1. You should now see your Public Key. Copy the WHOLE LINE including ssh-ed25519 at the beginning and the jovyan@... at the end

  2. Go to your GitHub settings page (you may need to log in to GitHub first):

  3. Select SSH and GPG keys

  4. Select New SSH key

  5. Give your key a descriptive name, paste your ENTIRE public key in the Key input box, and click Add SSH Key. You may need to re-authenticate with your password or two-factor authentication.:

  6. You should now see your new SSH key in your Authentication Keys list! Now you will be able to clone private repositories and push changes to GitHub from your Cyverse analysis!

NOTE! Your GitHub authentication is ONLY for the analysis you're working with right now. You will be able to use it as long as you want there, but once you start a new analysis you will need to go through this process again. Feel free to delete keys from old analyses that have been shut down.

"},{"location":"resources/data_analysis/","title":"Data Analysis Documentation","text":""},{"location":"resources/data_analysis/#overview","title":"Overview","text":"

Brief overview of the data analysis goals and the analytical questions being addressed.

"},{"location":"resources/data_analysis/#analysis-methodology","title":"Analysis Methodology","text":"

Description of the analytical approach, methods used, and justification for the chosen techniques.

"},{"location":"resources/data_analysis/#code-overview","title":"Code Overview","text":"

Explanation of the structure of the analysis code, including key functions and their roles.

"},{"location":"resources/data_analysis/#running-the-analysis","title":"Running the Analysis","text":"

Instructions and example commands for executing the analysis scripts.

python analysis_script.py\n
"},{"location":"resources/data_analysis/#analysis-results","title":"Analysis Results","text":"

Summary of key findings from the analysis, including interpretation and relevance.

"},{"location":"resources/data_analysis/#challenges-and-solutions","title":"Challenges and Solutions","text":"

Discussion of challenges faced during the analysis and solutions or workarounds implemented.

"},{"location":"resources/data_analysis/#conclusions","title":"Conclusions","text":"

Concluding remarks on the analysis, insights gained, and their potential impact.

"},{"location":"resources/data_analysis/#future-work","title":"Future Work","text":"

Suggestions for extending or refining the analysis and potential areas for further research.

"},{"location":"resources/data_analysis/#references","title":"References","text":"

Citations or references to external sources or literature used.

"},{"location":"resources/data_processing/","title":"Data Processing Documentation","text":""},{"location":"resources/data_processing/#overview","title":"Overview","text":"

Brief description of the data processing objectives and scope. Reminder to adhere to data ownership and usage guidelines.

"},{"location":"resources/data_processing/#access-proposal","title":"ACCESS proposal","text":"

This is my draft text

"},{"location":"resources/data_processing/#data-sources","title":"Data Sources","text":"

List and describe data sources used, including links to cloud-optimized sources. Highlight permissions and compliance with data ownership guidelines.

"},{"location":"resources/data_processing/#cyverse-discovery-environment","title":"CyVerse Discovery Environment","text":"

Instructions for setting up and using the CyVerse Discovery Environment for data processing. Tips for cloud-based data access and processing.

"},{"location":"resources/data_processing/#data-processing-steps","title":"Data Processing Steps","text":""},{"location":"resources/data_processing/#using-gdal-vsi","title":"Using GDAL VSI","text":"

Guidance on using GDAL VSI (Virtual System Interface) for data access and processing. Example commands or scripts:

gdal_translate /vsicurl/http://example.com/data.tif output.tif\n
"},{"location":"resources/data_processing/#cloud-optimized-data","title":"Cloud-Optimized Data","text":"

Advantages of using cloud-optimized data formats and processing data without downloading. Instructions for such processes.

"},{"location":"resources/data_processing/#data-storage","title":"Data Storage","text":"

Information on storing processed data, with guidelines for choosing between the repository and CyVerse Data Store.

"},{"location":"resources/data_processing/#best-practices","title":"Best Practices","text":"

Recommendations for efficient and responsible data processing in the cloud. Tips to ensure data integrity and reproducibility.

"},{"location":"resources/data_processing/#challenges-and-troubleshooting","title":"Challenges and Troubleshooting","text":"

Common challenges in data processing and potential solutions. Resources for troubleshooting in the CyVerse Discovery Environment.

"},{"location":"resources/data_processing/#conclusions","title":"Conclusions","text":"

Summary of the data processing phase and its outcomes. Reflect on the methods used.

"},{"location":"resources/data_processing/#references","title":"References","text":"

Citations of tools, data sources, and other references used in the data processing phase.

"},{"location":"resources/docker_basics/","title":"Docker Basics","text":""},{"location":"resources/docker_basics/#what-is-docker","title":"What is Docker?","text":"

Docker is a containerization platform that enables you to package your applications along with their dependencies into self-contained units called containers. Containers provide a consistent and portable runtime environment, making it easy to develop, test, and deploy applications across different machines.

"},{"location":"resources/docker_basics/#key-concepts","title":"Key Concepts","text":""},{"location":"resources/docker_basics/#images","title":"Images","text":"

A blueprint for a Docker container. Images are read-only and contain all the necessary code, libraries, and configurations for an application.

"},{"location":"resources/docker_basics/#containers","title":"Containers","text":"

A running instance of a Docker image. Containers are isolated from each other and the host system.

"},{"location":"resources/docker_basics/#dockerfile","title":"Dockerfile","text":"

A text file that defines the instructions needed to build a Docker image.

"},{"location":"resources/docker_basics/#building-a-jupyterlab-docker-image-using-github-actions","title":"Building a jupyterlab Docker Image using GitHub Actions","text":""},{"location":"resources/docker_basics/#create-a-dockerfile","title":"Create a Dockerfile","text":"

Create a new directory and Dockerfile within the project docker directory. Since this will be jupyterlab image, we will call the directory jupyterlab.

FROM jupyter/r-notebook:hub-4.0.1 \n\nUSER root\n\n# Set up package manager\nRUN apt-get install -y apt-transport-https && \\\n    apt-get clean && apt-get update && apt-get install -y software-properties-common && \\\n    add-apt-repository multiverse && \\\n    apt-get clean && rm -rf /var/lib/apt/lists/*\n\n# Install some base software\nRUN apt-get update --yes && \\\n    apt-get install --yes \\\n    fonts-dejavu \\\n    unixodbc \\\n    unixodbc-dev \\\n    r-base \\\n    r-cran-rodbc && \\\n    apt-get clean && rm -rf /var/lib/apt/lists/*\n\n# Add sudo to jovyan user\nRUN apt update && \\\n    apt install -y sudo && \\\n    apt clean && \\\n    rm -rf /var/lib/apt/lists/*\n\n# This is where we can control which root permissions the jovyan user will have\nARG PRIV_CMDS='/bin/ch*,/bin/cat,/bin/gunzip,/bin/tar,/bin/mkdir,/bin/ps,/bin/mv,/bin/cp,/usr/bin/apt*,/usr/bin/pip*,/bin/yum,/opt,/opt/conda/bin/*,/usr/bin/*'\n\nRUN usermod -aG sudo jovyan && \\\n    echo \"$LOCAL_USER ALL=NOPASSWD: $PRIV_CMDS\" >> /etc/sudoers\nRUN addgroup jovyan\nRUN usermod -aG jovyan jovyan\n\n# Install RStudio\nRUN apt-get update && apt-get install --yes gdebi-core && \\\n    wget https://download2.rstudio.org/server/jammy/amd64/rstudio-server-2023.09.1-494-amd64.deb && \\\n    gdebi -n rstudio-server-2023.09.1-494-amd64.deb && \\\n    rm rstudio-server-2023.09.1-494-amd64.deb && \\\n    apt-get clean && rm -rf /var/lib/apt/lists/*\n\n# Install Geospatial libraries\nRUN apt-get update && \\\n    apt install -y \\\n    gdal-bin \\\n    lbzip2 \\\n    libfftw3-dev \\\n    libgdal-dev \\\n    libgeos-dev \\\n    libgsl0-dev \\\n    libgl1-mesa-dev \\\n    libglu1-mesa-dev \\\n    libhdf4-alt-dev \\\n    libhdf5-dev \\\n    libjq-dev \\\n    libpq-dev \\\n    libproj-dev \\\n    libprotobuf-dev \\\n    libnetcdf-dev \\\n    libsqlite3-dev \\\n    libudunits2-dev \\\n    lsb-release \\\n    netcdf-bin \\\n    postgis \\\n    protobuf-compiler \\\n    sqlite3 \\\n    tk-dev \\\n    libfmt-dev \\\n    unixodbc-dev && \\\n    apt-get clean && rm -rf /var/lib/apt/lists/*\n\n# Fix RStudio / Conda openssl version mismatch\nRUN wget https://www.openssl.org/source/openssl-3.2.0.tar.gz && \\\n    tar xfz openssl-3.2.0.tar.gz && \\\n    mkdir openssl-build && cd openssl-build && \\\n    ../openssl-3.2.0/Configure --libdir=/lib/x86_64-linux-gnu/ && \\\n    make && \\\n    make install\n\n# Update permissions for /opt/conda\nRUN mkdir /usr/local/bin/start-notebook.d && \\\n    chown -R jovyan:users /opt/conda/share /usr/local/share /usr/local/bin/start-notebook.d \n\nUSER jovyan\n\n# Install jupyterlab and rstudio dependencies\nRUN conda install -c conda-forge \\ \n    jupyter_client \\ \n    jupyter_core \\ \n    jupyterlab_server \\ \n    jupyter_server \\\n    r-rgl \\\n    r-htmlwidgets \\\n    r-htmltools && \\ \n    jupyter lab clean\n\n# reinstall R packages. Here is where you add any new R packages you would like to install \nRUN mamba install --quiet --yes \\\n    r-base \\\n    r-tidyverse \\\n    r-terra \\\n    r-future \\\n    r-future.apply \\\n    r-furrr \\\n    && \\ \n    mamba clean --all -f -y\n\n# Install Jupyter Lab Proxy extensions (cards in Launcher)\nRUN pip install jupyter-rsession-proxy jupyter-server-proxy jupyter-shiny-proxy jupyterlab-git \n\n# Install Mamba Gator package manager\nRUN rm -f ~/.jupyter/lab/workspaces/default* && \\\n    mamba install -y -c conda-forge mamba_gator\n\n# Install and configure jupyter lab \nCOPY jupyter_notebook_config.json /opt/conda/etc/jupyter/jupyter_notebook_config.json\n\n# Rebuild the Jupyter Lab with new tools\nRUN jupyter lab build\n\n# Build Conda environment. Any packages you would like to install with conda need to be added to the environment.yml file in this Dockerfiles directory\nRUN conda update -y conda && \\\n    conda config --remove channels conda-forge && \\\n    conda config --add channels conda-forge\nWORKDIR /home/jovyan\nCOPY environment.yml /home/jovyan/ \nRUN mamba env create -f /home/jovyan/environment.yml\nRUN . /opt/conda/etc/profile.d/conda.sh && conda deactivate && conda activate custom && python -m ipykernel install --name custom && pip install jupyter_contrib_nbextensions\n\n# Install R packages from CRAN and GitHub\nRUN R -e \"remotes::install_github('tomroh/ecoregions')\"\nRUN R -e \"install.packages('mblm', repos='http://cran.rstudio.com/')\"\n\n# Set any required environment variables \nENV PROJ_LIB=/opt/conda/envs/custom/share/proj\nRUN echo \"PROJ_LIB=/opt/conda/envs/custom/share/proj\" > /home/jovyan/.Renviron\n

There are many things going on in the Dockerfile above. Most of the lines, however, are just Linux commands you would run from a terminal when provisioning a new VM. Each block of code is commented with what it accomplishes.

"},{"location":"resources/docker_basics/#add-any-necessary-files","title":"Add any necessary files","text":"

The Dockerfile above uses a file called environment.yml to provision the its conda environment and a jupyter_config_notebook.json file to configure the jupyterlab server. Both of these files will need to be added to the docker/jupyterlab directory at the same level as the Dockerfile. You can view the content of these files in this repository.

"},{"location":"resources/docker_basics/#create-the-github-actions-workflow-file","title":"Create the GitHub actions workflow file","text":"

Workflow files specify when and how code is executed in a GitHub Actions workflow. Actions can be triggered automatically, such as when a commit is pushed to a repo or a specific file, or they can be triggered manually. The following workflow is defined so that the Action is triggered manually. Actions can also be run on different VM types. The following Action will be run on the latest Ubuntu image.

name: build-and-push-jupyterlab-image\n\non:\n  workflow_dispatch:  # This allows you to manually trigger the action from GitHub UI.\n\njobs:\n\n  build:\n    runs-on: ubuntu-latest\n\n    steps:\n\n      - name: Checkout\n        uses: actions/checkout@v3.5.0\n\n      - name: Set up Docker Buildx\n        id: buildx\n        uses: docker/setup-buildx-action@v2.5.0\n\n      - name: Login to dockerhub \n        uses: docker/login-action@v2.1.0\n        with:\n          username: ${{ secrets.DOCKERHUB_USERNAME }}\n          password: ${{ secrets.DOCKERHUB_PASSWORD }}\n\n      - name: Get lowercase repo name (for dynamic tags)\n        id: repo_name  \n        run: |\n          lowercase_name=$(echo ${{ github.event.repository.name }} | tr '[:upper:]' '[:lower:]')\n          echo \"::set-output name=repo_name::${lowercase_name}\"\n\n      - name: Build and push latest\n        id: docker_build_jupyterlab\n        uses: docker/build-push-action@v4.0.0\n        with:\n          context: docker/jupyterlab\n          file: docker/jupyterlab/Dockerfile\n          builder: ${{ steps.buildx.outputs.name }}\n          push: true\n          tags: |\n            esiil/${{ steps.repo_name.outputs.repo_name }}_jupyterlab:latest\n\n      - name: Image digest\n        run: echo ${{ steps.docker_build.outputs.digest }}\n

The steps section of the file defines what will be run by the Action. An overview of the steps of this file is as follows: Checkout the repository code, setup Docker buildx, login to DockerHub, resolve the name of the current GitHub reposiroy, build and push the Docker Image to DockerHub.

"},{"location":"resources/docker_basics/#running-the-action","title":"Running the Action","text":"

From your repositories GitHub page, click on the Actions tab

Find the workflow in the Workflow navigation menu and click on it

Click on the run workflow dropdown and click Run Workflow

"},{"location":"resources/docker_basics/#deploying-the-image-on-cyverse","title":"Deploying the Image on CyVerse","text":"

First go to de.cyverse.org and login. From there go to the Apps dashboard and click on Manage Tools.

"},{"location":"resources/docker_basics/#adding-the-image-as-a-tool","title":"Adding the Image as a Tool","text":"

Then click Add Tool.

Give the Tool a descriptive name and set the initial version. The version can be whatever you like but 1.0 makes the most sense.

Set the Image Name to esiil/name_of_your_image and the tag to whichever tag you would like the Tool to use. Most Tools will use the latest tag.

You can see all of this information on the ESIIL dockerhub page.

Leave the Entrypoint blank, and set the working directory to /home/jovyan/data-store and the UID to 1000. Add container port 8888. This will mount and give you access to the cyverse data store. Because the file explorer GUI will not let you go above the working directory that is set, you will have to use the terminal to go up one directory and copy over any files you included in your container.

Leave all of the restrictions blank and then save the Tool

"},{"location":"resources/docker_basics/#associating-the-tool-with-an-app","title":"Associating the Tool with an App","text":"

Go back to the Apps dashboard and click create

Just like for the Tool, give a descriptive name and description

For \"Tool used\" click select and then search for the name of the tool that was just added and then click on its row and then select at the bottom.

From the app creation screen click Next, and then click next through the next steps until you get to completion. From there click Save and Launch

From there you can go through the deployment of your app like you would deploy any other app on CyVerse and test it out.

"},{"location":"resources/esiil_training/","title":"ESIIL Working Groups training sessions","text":""},{"location":"resources/esiil_training/#introduction-to-esiil-training","title":"Introduction to ESIIL Training","text":"
  • Brief overview of the training program.
  • Objectives and expected outcomes for the working groups.
"},{"location":"resources/esiil_training/#session-1-the-science-of-team-science-2-hours","title":"Session 1: The Science of Team Science (2 Hours)","text":""},{"location":"resources/esiil_training/#part-1-creating-ethical-and-innovative-work-spaces","title":"Part 1: Creating Ethical and Innovative Work Spaces","text":"
  • Strategies for fostering ethical and inclusive environments.
  • Techniques for encouraging innovation and creativity in team settings.
"},{"location":"resources/esiil_training/#part-2-effective-communication-and-collaboration","title":"Part 2: Effective Communication and Collaboration","text":"
  • Best practices for ensuring every team member's voice is heard.
  • Approaches for maintaining productivity and positive team dynamics.
  • Overview of the code of conduct and participant agreement.
"},{"location":"resources/esiil_training/#session-2-foundations-of-environmental-data-science-2-hours","title":"Session 2: Foundations of Environmental Data Science (2 Hours)","text":""},{"location":"resources/esiil_training/#part-1-data-management-ethics-and-github-usage","title":"Part 1: Data Management, Ethics, and GitHub Usage","text":"
  • Principles of data management in environmental science.
  • Understanding data ethics and ownership guidelines.
  • Tour of GitHub repositories and setup instructions for effective collaboration.
"},{"location":"resources/esiil_training/#part-2-essential-tools-and-technologies","title":"Part 2: Essential Tools and Technologies","text":"
  • Introduction to key tools and technologies used in ESIIL.
  • Basic training on software and platforms essential for data analysis.
"},{"location":"resources/esiil_training/#session-3-practical-application-and-project-execution-2-hours","title":"Session 3: Practical Application and Project Execution (2 Hours)","text":""},{"location":"resources/esiil_training/#part-1-travel-planning-and-reimbursement","title":"Part 1: Travel Planning and Reimbursement","text":"
  • Learn how to manage finances and submit paperwork to the University.
"},{"location":"resources/esiil_training/#part-2-hands-on-data-analysis-workflow","title":"Part 2: Hands-on Data Analysis Workflow","text":"
  • Interactive session on constructing a data analysis pipeline using ESIIL/CyVerse tools.
  • Practical exercises on data processing, analysis, and visualization techniques.
  • Troubleshooting common issues and optimizing workflow efficiency.
"},{"location":"resources/esiil_training/#part-3-wrap-up-and-project-planning","title":"Part 3: Wrap-up and Project Planning","text":"
  • Strategies for sustaining project momentum and managing long-term research goals.
  • Planning for publication, data sharing, and broader impact.
  • Final Q&A session to address any outstanding questions or concerns.
"},{"location":"resources/esiil_training/#conclusion-and-feedback","title":"Conclusion and Feedback","text":"
  • Summary of key learnings from all sessions.
  • Encouragement for participants to apply these skills in their respective projects.
  • Collection of feedback for future training improvements.
"},{"location":"resources/esiil_training/#additional-resources","title":"Additional Resources","text":"
  • List of resources for further learning and exploration.
  • Links to community forums or groups for ongoing support and collaboration.
"},{"location":"resources/esiil_training/#roundtable-event-1-piteam-leads-discussion-2-hours","title":"Roundtable Event 1: PI/Team Leads Discussion (2 Hours)","text":"
  • A roundtable discussion for Principal Investigators and team leads.
  • Sharing experiences, challenges, and strategies among group leaders.
  • Fostering a collaborative network and problem-solving atmosphere.
"},{"location":"resources/esiil_training/#roundtable-event-2-technical-leads-office-hours-2-hours","title":"Roundtable Event 2: Technical Leads Office Hours (2 Hours)","text":"
  • A roundtable and office hours session for technical leads.
  • Ensuring a thorough understanding of the ESIIL/CyVerse cyberinfrastructure.
  • Providing technical support and knowledge exchange.
"},{"location":"resources/esiil_training/#conclusion-and-feedback_1","title":"Conclusion and Feedback","text":"
  • Recap of key takeaways from the training sessions and roundtables.
  • Collection of feedback for continuous improvement of the training program.
"},{"location":"resources/esiil_training/#additional-resources_1","title":"Additional Resources","text":"
  • Supplementary materials, reading lists, and links to online tutorials and documentation.
"},{"location":"resources/first_meeting_notes/","title":"Primary Meeting 1","text":""},{"location":"resources/first_meeting_notes/#day-1-5-project-kickoff-and-strategy","title":"Day 1-5: Project Kickoff and Strategy","text":""},{"location":"resources/first_meeting_notes/#meeting-details","title":"Meeting Details","text":"
  • Dates:
  • Times:
  • Location:
  • Facilitator:
"},{"location":"resources/first_meeting_notes/#attendees","title":"Attendees","text":"
  • List of attendees
"},{"location":"resources/first_meeting_notes/#daily-agenda","title":"Daily Agenda","text":""},{"location":"resources/first_meeting_notes/#day-1-setting-the-stage","title":"Day 1: Setting the Stage","text":""},{"location":"resources/first_meeting_notes/#opening-remarks","title":"Opening Remarks","text":"
  • Welcoming speech and outline of the week's objectives.
"},{"location":"resources/first_meeting_notes/#project-overview","title":"Project Overview","text":"
  • Presentation of the project goals and significance.
"},{"location":"resources/first_meeting_notes/#theoretical-framework","title":"Theoretical Framework","text":"
  • Discussion on the theoretical underpinnings of the project.
"},{"location":"resources/first_meeting_notes/#data-overview","title":"Data Overview","text":"
  • Review available data and any gaps that need addressing.
"},{"location":"resources/first_meeting_notes/#day-2-4-deep-dives","title":"Day 2-4: Deep Dives","text":""},{"location":"resources/first_meeting_notes/#daily-goals","title":"Daily Goals","text":"
  • Outline specific goals for each day.
"},{"location":"resources/first_meeting_notes/#task-assignments","title":"Task Assignments","text":"
  • Assign tasks and areas of responsibility to team members.
"},{"location":"resources/first_meeting_notes/#theory-and-data-synthesis","title":"Theory and Data Synthesis","text":"
  • Host focused discussions on how theory will inform data analysis.
  • Explore different methodological approaches and data integration strategies.
"},{"location":"resources/first_meeting_notes/#evening-social-and-soft-work-sessions","title":"Evening Social and Soft Work Sessions","text":"
  • Casual gatherings to further discuss ideas and foster team bonding.
"},{"location":"resources/first_meeting_notes/#day-5-roadmap-and-closure","title":"Day 5: Roadmap and Closure","text":""},{"location":"resources/first_meeting_notes/#project-roadmap","title":"Project Roadmap","text":"
  • Draft a detailed plan of action for the project going forward.
"},{"location":"resources/first_meeting_notes/#responsibilities","title":"Responsibilities","text":"
  • Confirm individual responsibilities and deadlines.
"},{"location":"resources/first_meeting_notes/#review-and-feedback","title":"Review and Feedback","text":"
  • Reflect on the week's discussions and adjust the project plan as needed.
"},{"location":"resources/first_meeting_notes/#closing-remarks","title":"Closing Remarks","text":"
  • Summarize achievements and express appreciation for the team's efforts.
"},{"location":"resources/first_meeting_notes/#detailed-notes","title":"Detailed Notes","text":""},{"location":"resources/first_meeting_notes/#day-1-notes","title":"Day 1 Notes","text":"
  • Summary of discussions, decisions, and key points.
"},{"location":"resources/first_meeting_notes/#day-2-notes","title":"Day 2 Notes","text":"
  • ...
"},{"location":"resources/first_meeting_notes/#day-3-notes","title":"Day 3 Notes","text":"
  • ...
"},{"location":"resources/first_meeting_notes/#day-4-notes","title":"Day 4 Notes","text":"
  • ...
"},{"location":"resources/first_meeting_notes/#day-5-notes","title":"Day 5 Notes","text":"
  • ...
"},{"location":"resources/first_meeting_notes/#action-items","title":"Action Items","text":"
  • [ ] Specific task: Assigned to - Deadline
  • [ ] Specific task: Assigned to - Deadline
  • ...
"},{"location":"resources/first_meeting_notes/#reflections-and-comments","title":"Reflections and Comments","text":"
  • (Space for any additional thoughts, insights, or personal reflections on the meeting.)
"},{"location":"resources/first_meeting_notes/#next-steps","title":"Next Steps","text":"
  • Schedule for follow-up meetings or checkpoints.
  • Outline of expected progress before the next primary meeting.
"},{"location":"resources/first_meeting_notes/#additional-documentation","title":"Additional Documentation","text":"
  • (Include or link to any additional documents, charts, or resources that were created or referenced during the meeting.)
"},{"location":"resources/manuscript/","title":"Manuscript Title","text":""},{"location":"resources/manuscript/#authors","title":"Authors","text":"
  • Author 1, Affiliation
  • Author 2, Affiliation
  • ...
"},{"location":"resources/manuscript/#abstract","title":"Abstract","text":"
  • A brief summary of the research, its objectives, main findings, and conclusions.
"},{"location":"resources/manuscript/#introduction","title":"Introduction","text":"
  • Background information and context setting for the research.
  • Statement of the problem and research objectives.
  • Overview of the methodology and approach.
"},{"location":"resources/manuscript/#literature-review","title":"Literature Review","text":"
  • Discussion of relevant previous work and how this research contributes to the field.
"},{"location":"resources/manuscript/#methodology","title":"Methodology","text":"
  • Detailed description of the research methodology.
  • Explanation of data collection and analysis techniques.
  • Justification for methodological choices.
"},{"location":"resources/manuscript/#results","title":"Results","text":"
  • Presentation of the research findings.
  • Use of tables, graphs, and figures to illustrate key points.
  • Analysis and interpretation of the results.
"},{"location":"resources/manuscript/#discussion","title":"Discussion","text":"
  • Discussion of the implications of the findings.
  • Comparison with previous research in the field.
  • Consideration of the limitations of the study.
"},{"location":"resources/manuscript/#conclusion","title":"Conclusion","text":"
  • Summary of the main findings.
  • Reflection on the research's significance and potential impact.
  • Suggestions for future research directions.
"},{"location":"resources/manuscript/#acknowledgements","title":"Acknowledgements","text":"
  • Acknowledgement of any assistance, funding, or contributions from others.
"},{"location":"resources/manuscript/#references","title":"References","text":"
  • Bibliographic details of the cited works.
  • Use a consistent citation style throughout.
"},{"location":"resources/manuscript/#appendices","title":"Appendices","text":"
  • Additional material that supports the manuscript but is too detailed for the main sections.
"},{"location":"resources/markdown_basics/","title":"Markdown for the Modern Researcher at ESIIL","text":""},{"location":"resources/markdown_basics/#introduction","title":"Introduction","text":"
  • Overview of Markdown's relevance and utility in modern research.
  • How Markdown streamlines documentation in diverse scientific and coding environments.
"},{"location":"resources/markdown_basics/#section-1-mastering-markdown-syntax","title":"Section 1: Mastering Markdown Syntax","text":"
  • Objective: Equip researchers with a thorough understanding of Markdown syntax and its diverse applications.
  • Topics Covered:
  • Fundamentals of Text Formatting (headings, lists, bold, italics)
  • Advanced Structures (tables, blockquotes)
  • Integrating Multimedia (image and video links)
  • Diagrams with Mermaid (creating flowcharts, mind maps, timelines)
  • Interactive Elements (hyperlinks, embedding interactive content)
  • Activities:
  • Crafting a Markdown document with various formatting elements.
  • Developing diagrams using Mermaid for research presentations.
  • Embedding multimedia elements in a Markdown document for enhanced communication.
"},{"location":"resources/markdown_basics/#section-2-markdown-in-research-tools","title":"Section 2: Markdown in Research Tools","text":"
  • Objective: Showcase the integration of Markdown in RStudio and Jupyter Notebooks for scientific documentation.
  • Topics Covered:
  • Implementing Markdown in RStudio (R Markdown, knitting to HTML/PDF)
  • Utilizing Markdown in Jupyter Notebooks (code and Markdown cells)
  • Best practices for documenting research code
  • Including code outputs and visualizations in documentation
  • Activities:
  • Creating and sharing an R Markdown document with annotated research data.
  • Building a comprehensive Jupyter Notebook with integrated Markdown annotations.
"},{"location":"resources/markdown_basics/#section-3-disseminating-research-with-markdown-and-github-pages","title":"Section 3: Disseminating Research with Markdown and GitHub Pages","text":"
  • Objective: Teach researchers how to publish and manage Markdown-based documentation as web pages.
  • Topics Covered:
  • Setting up a GitHub repository for hosting documentation
  • Transforming Markdown files into web-friendly formats
  • Customizing web page layouts and themes
  • Advanced features using Jekyll
  • Version control and content management for documentation
  • Activities:
  • Publishing a research project documentation on GitHub Pages.
  • Applying custom themes and layouts to enhance online documentation.
"},{"location":"resources/markdown_basics/#conclusion","title":"Conclusion","text":"
  • Review of Markdown's role in enhancing research efficiency and clarity.
  • Encouraging the integration of Markdown into daily research activities for improved documentation and dissemination.
"},{"location":"resources/markdown_basics/#additional-resources","title":"Additional Resources","text":"
  • Curated list of advanced Markdown tutorials, guides for GitHub Pages, and Jekyll resources for researchers.
"},{"location":"resources/markdown_basics/#section-1-mastering-markdown-syntax_1","title":"Section 1: Mastering Markdown Syntax","text":""},{"location":"resources/markdown_basics/#1-fundamentals-of-text-formatting","title":"1. Fundamentals of Text Formatting","text":"
  • Headings: Use # for different levels of headings.
  • Lists: Bulleted lists use asterisks, numbers for ordered lists.

  • Item 1
  • Item 2
    • Subitem 2.1
    • Subitem 2.2
    1. First item
    1. Second item
  • Bold and Italics: Use asterisks or underscores.

  • Bold Text
  • Italic Text
"},{"location":"resources/markdown_basics/#heading-level-1","title":"Heading Level 1","text":""},{"location":"resources/markdown_basics/#heading-level-2","title":"Heading Level 2","text":""},{"location":"resources/markdown_basics/#heading-level-3","title":"Heading Level 3","text":""},{"location":"resources/markdown_basics/#2-advanced-structures","title":"2. Advanced Structures","text":"
  • Tables: Create tables using dashes and pipes.
  • Header 1 Header 2 Header 3 Row 1 Data Data Row 2 Data Data
  • Add a \":\"\" to change text justification. Here the : is added on the left for left justification. | Header 1 | Header 2 | Header 3 | |---------:|--------- |----------| | Row 1 | Data | Data | | Row 2 | Data | Data |

  • A N A L Y T I C S E N R E I N V I R O N M E N T V E L O P M O C O M U N E G A G E L L A H C N E R A T A D E V E L O P W E I T S I T N E I C S R S O I G O L O I B H T L A H T L A E W E G N E L T I T S I T N E I C S N I E E S R E H T O E N I C S L L A H C E G L A N E G A L L E H C N E I C
  • If you hit the boundaries of Markdown's capabilities, you can start to add html directly. Remember, this entire exercisse is to translate to html.

Sudoku Puzzle Fill in the blank cells with numbers from 1 to 9, such that each row, column, and 3x3 subgrid contains all the numbers from 1 to 9 without repetition.

5 3 7 6 1 9 5 9 8 6 8 6 3 4 8 3 1 7 2 6 6 2 8 4 1 9 5 8 7 9 534678912 672195348 198342567 859761423 426853791 713924856 961537284 287419635 345286179
  • Blockquotes: Use > for blockquotes.
  • This is a blockquote.

  • It can span multiple lines.

"},{"location":"resources/markdown_basics/#3-integrating-multimedia","title":"3. Integrating Multimedia","text":"
  • Images: Add images using the format ![alt text](image_url).
  • Videos: Embed videos using HTML in Markdown.

  • <iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/dQw4w9WgXcQ\" frameborder=\"0\" allowfullscreen></iframe>
"},{"location":"resources/markdown_basics/#4-diagrams-with-mermaid","title":"4. Diagrams with Mermaid","text":"
  • Flowcharts:
    graph TD\n    A[Start] --> B[Analyze Data]\n    B --> C{Is Data Large?}\n    C -->|Yes| D[Apply Big Data Solutions]\n    C -->|No| E[Use Traditional Methods]\n    D --> F[Machine Learning]\n    E --> G[Statistical Analysis]\n    F --> H{Model Accurate?}\n    G --> I[Report Results]\n    H -->|Yes| J[Deploy Model]\n    H -->|No| K[Refine Model]\n    J --> L[Monitor Performance]\n    K --> F\n    L --> M[End: Success]\n    I --> N[End: Report Generated]\n    style A fill:#f9f,stroke:#333,stroke-width:2px\n    style M fill:#9f9,stroke:#333,stroke-width:2px\n    style N fill:#9f9,stroke:#333,stroke-width:2px\n
  • Mind Maps:
    mindmap\n  root((ESIIL))\n    section Data Sources\n      Satellite Imagery\n        ::icon(fa fa-satellite)\n      Remote Sensing Data\n        Drones\n        Aircraft\n      On-ground Sensors\n        Weather Stations\n        IoT Devices\n      Open Environmental Data\n        Public Datasets\n        ::icon(fa fa-database)\n    section Research Focus\n      Climate Change Analysis\n        Ice Melt Patterns\n        Sea Level Rise\n      Biodiversity Monitoring\n        Species Distribution\n        Habitat Fragmentation\n      Geospatial Analysis Techniques\n        Machine Learning Models\n        Predictive Analytics\n    section Applications\n      Conservation Strategies\n        ::icon(fa fa-leaf)\n      Urban Planning\n        Green Spaces\n      Disaster Response\n        Flood Mapping\n        Wildfire Tracking\n    section Tools and Technologies\n      GIS Software\n        QGIS\n        ArcGIS\n      Programming Languages\n        Python\n        R\n      Cloud Computing Platforms\n        AWS\n        Google Earth Engine\n      Data Visualization\n        D3.js\n        Tableau\n
  • Timelines:
gantt\n    title ESIIL Year 2 Project Schedule\n    dateFormat  YYYY-MM-DD\n    section CI\n    Sovereign OASIS via private jupiterhubs :2024-08-01, 2024-10-30\n    OASIS documentation                    :2024-09-15, 70d\n    Data cube OASIS via cyverse account    :2024-09-15, 100d\n    Integrate with ESIIL User Management system :2024-08-01, 2024-11-30\n    Build badges to deploy DE from mkdoc   :2024-09-01, 2024-12-15\n    Streamline Github ssh key management   :2024-10-01, 2024-12-31\n    Cyverse support (R proxy link)         :2024-11-01, 2024-12-31\n    Cyverse use summary and statistics     :2024-08-01, 2024-12-15\n\n    section CI Consultation and Education\n    Conferences/Invited talks              :2024-08-01, 2024-12-31\n    Office hours                           :2024-08-15, 2024-12-15\n    Proposals                              :2024-09-01, 2024-11-15\n    Private lessons                        :2024-09-15, 2024-11-30\n    Pre-event trainings                    :2024-10-01, 2024-12-15\n    Textbook development w/ education team :2024-08-01, 2024-12-15\n    Train the trainers / group lessons     :2024-08-15, 2024-11-30\n    Tribal engagement                      :2024-09-01, 2024-12-15\n    Ethical Space training                 :2024-09-15, 2024-12-31\n\n    section CI Design and Build\n    Data library (repository)              :2024-08-01, 2024-10-30\n    Analytics library (repository)         :2024-08-15, 2024-11-15\n    Containers (repository)                :2024-09-01, 2024-11-30\n    Cloud infrastructure templates (repository) :2024-09-15, 2024-12-15\n    Tribal resilience Data Cube            :2024-10-01, 2024-12-31\n
\n%%{init: { 'logLevel': 'debug', 'theme': 'base', 'gitGraph': {'rotateCommitLabel': true}} }%%\ngitGraph\n  commit id: \"Start from template\"\n  branch c1\n  commit id: \"Set up SSH key pair\"\n  commit id: \"Modify _config.yml for GitHub Pages\"\n  commit id: \"Initial website structure\"\n  commit id: \"Add new markdown pages\"\n  commit id: \"Update navigation tree\"\n  commit id: \"Edit existing pages\"\n  commit id: \"Delete old markdown pages\"\n  commit id: \"Finalize website updates\"\n  commit id: \"Add new markdown pages\"\n  commit id: \"Update navigation tree\"\ncheckout c1\n\n  branch b1\n\n  commit\n  commit\n  checkout c1\n  merge b1\n
%%{init: {\"quadrantChart\": {\"chartWidth\": 400, \"chartHeight\": 400}, \"themeVariables\": {\"quadrant1TextFill\": \"#ff0000\"} }}%%\nquadrantChart\n  x-axis Urgent --> Not Urgent\n  y-axis Not Important --> \"Important \u2764\"\n  quadrant-1 Plan\n  quadrant-2 Do\n  quadrant-3 Delegate\n  quadrant-4 Delete\n
timeline\n    title Major Events in Environmental Science and Data Science\n    section Environmental Science\n        19th century : Foundations in Ecology and Conservation\n        1962 : Publication of 'Silent Spring' by Rachel Carson\n        1970 : First Earth Day\n        1987 : Brundtland Report introduces Sustainable Development\n        1992 : Rio Earth Summit\n        2015 : Paris Agreement on Climate Change\n    section Data Science\n        1960s-1970s : Development of Database Management Systems\n        1980s : Emergence of Data Warehousing\n        1990s : Growth of the World Wide Web and Data Mining\n        2000s : Big Data and Predictive Analytics\n        2010s : AI and Machine Learning Revolution\n        2020s : Integration of AI in Environmental Research\n
erDiagram\n    CAR ||--o{ NAMED-DRIVER : allows\n    CAR {\n        string registrationNumber\n        string make\n        string model\n    }\n    PERSON ||--o{ NAMED-DRIVER : is\n    PERSON {\n        string firstName\n        string lastName\n        int age\n    }\n
---\nconfig:\n  sankey:\n    showValues: false\n---\nsankey-beta\n\nNASA Data,Big Data Harmonization,100\n    Satellite Imagery,Big Data Harmonization,80\n    Open Environmental Data,Big Data Harmonization,70\n    Remote Sensing Data,Big Data Harmonization,90\n    Big Data Harmonization, Data Analysis and Integration,340\n    Data Analysis and Integration,Climate Change Research,100\n    Data Analysis and Integration,Biodiversity Monitoring,80\n    Data Analysis and Integration,Geospatial Mapping,60\n    Data Analysis and Integration,Urban Planning,50\n    Data Analysis and Integration,Disaster Response,50\n
"},{"location":"resources/markdown_basics/#5-interactive-elements","title":"5. Interactive Elements","text":"
  • Hyperlinks: Use the format [link text](URL).
  • Google
  • Play Tetris

  • Embedding Interactive Content: Use HTML tags or specific platform embed codes.

  • <iframe src=\"https://example.com/interactive-content\" width=\"600\" height=\"400\"></iframe>
"},{"location":"resources/markdown_basics/#6-math-notation","title":"6. Math Notation","text":"

Markdown can be combined with LaTeX for mathematical notation, useful in environmental data science for expressing statistical distributions, coordinate systems, and more. This requires a Markdown renderer with LaTeX support (like MathJax or KaTeX).

  • Inline Math: Use single dollar signs for inline math expressions. Representing the normal distribution.

Example: The probability density function of the normal distribution is given by $f(x|\\mu,\\sigma) = \\frac{1}{\\sigma\\sqrt{2\\pi}}e^{-\\frac{1}{2}\\left(\\frac{x-\\mu}{\\sigma}\\right)^2}$.`

  • Display Math: Use double dollar signs for standalone equations.

Example: $$ f(x|\\mu,\\sigma) = \\frac{1}{\\sigma\\sqrt{2\\pi}}e^{-\\frac{1}{2}\\left(\\frac{x-\\mu}{\\sigma}\\right)^2} $$

  • Common LaTeX Elements for Environmental Data Science:
  • Statistical Distributions:
    • Normal Distribution: \\frac{1}{\\sigma\\sqrt{2\\pi}}e^{-\\frac{1}{2}\\left(\\frac{x-\\mu}{\\sigma}\\right)^2} for $\\frac{1}{\\sigma\\sqrt{2\\pi}}e^{-\\frac{1}{2}\\left(\\frac{x-\\mu}{\\sigma}\\right)^2}$
    • Poisson Distribution: P(k; \\lambda) = \\frac{\\lambda^k e^{-\\lambda}}{k!} for $P(k; \\lambda) = \\frac{\\lambda^k e^{-\\lambda}}{k!}$
  • Coordinate Systems:
    • Spherical Coordinates: (r, \\theta, \\phi) for $(r, \\theta, \\phi)$
    • Cartesian Coordinates: (x, y, z) for $(x, y, z)$
  • Geospatial Equations:
    • Haversine Formula for Distance: a = \\sin^2\\left(\\frac{\\Delta\\phi}{2}\\right) + \\cos(\\phi_1)\\cos(\\phi_2)\\sin^2\\left(\\frac{\\Delta\\lambda}{2}\\right) for $a = \\sin^2\\left(\\frac{\\Delta\\phi}{2}\\right) + \\cos(\\phi_1)\\cos(\\phi_2)\\sin^2\\left(\\frac{\\Delta\\lambda}{2}\\right)$

Note: The rendering of these equations as formatted math will depend on your Markdown viewer's LaTeX capabilities.

"},{"location":"resources/markdown_basics/#7-effective-citations-in-markdown","title":"7. Effective Citations in Markdown","text":""},{"location":"resources/markdown_basics/#inline-citations","title":"Inline Citations","text":"
  • Objective: Learn how to use inline citations in Markdown.
  • Example Usage:
  • Inline citation of a single work:
    • Some text with an inline citation. [@jones:envstudy:2020]
  • Inline citation with specific page or section:
    • More text with a specific section cited. [See @jones:envstudy:2020, \u00a74.2]
  • Contrasting views:
    • Discussion of a topic with a contrasting view. [Contra @smith:climatechange:2019, p. 78]
"},{"location":"resources/markdown_basics/#footnote-citations","title":"Footnote Citations","text":"
  • Objective: Understand how to use footnote citations in Markdown.
  • Example Usage:
  • Citing with a footnote:
    • Some statement in the text.[^1]
  • Multiple references to the same footnote:
    • Another statement referring to the same source.[^1]
  • A different citation:
    • Additional comment with a new citation.[^2]
"},{"location":"resources/markdown_basics/#creating-footnotes","title":"Creating Footnotes","text":"
  • Example Syntax:
  • [^1]: First reference details. Example: Emma Jones, \"Environmental Study,\" Nature Journal, May 2020, https://nature-journal.com/envstudy2020.
  • [^2]: Second reference details. Example: David Smith, \"Climate Change Controversies,\" Science Daily, August 2019, https://sciencedaily.com/climatechange2019.
"},{"location":"resources/notes_from_readings/","title":"Literature Reading Notes","text":""},{"location":"resources/notes_from_readings/#reference-information","title":"Reference Information","text":"
  • Title:
  • Authors:
  • Publication Year:
  • Journal/Source:
  • DOI/URL:
"},{"location":"resources/notes_from_readings/#summary","title":"Summary","text":"
  • Brief summary of the main objective, research question, or thesis of the literature.
"},{"location":"resources/notes_from_readings/#key-findings","title":"Key Findings","text":"
  • Major findings or conclusions:
  • Finding 1
  • Finding 2
  • ...
"},{"location":"resources/notes_from_readings/#methodology","title":"Methodology","text":"
  • Description of research methodology, techniques, or approaches.
  • Notable tools, datasets, or analytical methods used.
"},{"location":"resources/notes_from_readings/#theoretical-framework","title":"Theoretical Framework","text":"
  • Theoretical models or frameworks underpinning the research.
  • Positioning within the broader field.
"},{"location":"resources/notes_from_readings/#critical-analysis","title":"Critical Analysis","text":"
  • Strengths: Well-executed aspects or convincing arguments.
  • Limitations: Weaknesses, gaps, or biases.
  • Insights: New understandings or perspectives gained.
"},{"location":"resources/notes_from_readings/#connections-to-other-work","title":"Connections to Other Work","text":"
  • Similarities or differences with other readings.
  • Complementarity to other studies.
"},{"location":"resources/notes_from_readings/#quotations-and-notes","title":"Quotations and Notes","text":"
  • Significant quotes:
  • \"Quote here.\" - Author Name, page number
  • Additional notes or comments.
"},{"location":"resources/notes_from_readings/#personal-reflections","title":"Personal Reflections","text":"
  • Influence on understanding or perspective.
  • Potential impact on future research or studies.
"},{"location":"resources/notes_from_readings/#action-items","title":"Action Items","text":"
  • Follow-up actions such as readings, discussions, or research activities:
  • [ ] Action item 1
  • [ ] Action item 2
  • ...
"},{"location":"resources/participant_agreement/","title":"Participant Agreement","text":"

This Participant Agreement (\u201cAgreement\u201d) is a contract between you (\u201cYou/Your\u201d or \u201cParticipant\u201d) and THE REGENTS OF THE UNIVERSITY OF COLORADO, a body corporate, acting on behalf of the University of Colorado Boulder, a public institution of higher education created under the Constitution and the Law of the State of Colorado (the \u201cUniversity\u201d), having offices located at 3100 Marine Street, Boulder, CO 80309.

In consideration of Your participation in the Forest Carbon Codefest (the \u201cCodefest\u201d), the sufficiency of which is hereby acknowledged, You agree as follows:

Environmental Data Science Innovation & Inclusion Lab (\u201cESIIL\u201d) is a National Science Foundation (\u201cNSF\u201d) funded data synthesis center led by the University. Earth Lab is part of the Cooperative Institute for Research in Environmental Sciences (CIRES) specializing in data-intensive open, reproducible environmental science. Earth Lab and ESIIL will co-host the Codefest in person from March 12 through March 14, 2023.

"},{"location":"resources/participant_agreement/#codefest-description","title":"Codefest Description","text":"

The Codefest aims to use big data to understand aboveground forest carbon dynamics. It brings together environmental scientists, data analysts, and forest experts from academia, non-profits, and the private sector under one roof to collaborate and provide solutions to on-the-ground needs in a respectful and inclusive environment. The Codefest provides resources to address environmental challenges, such as participation in training on Environmental Data Science and cyberinfrastructure. You will work on a cloud-based, highly secure platform that allows for the seamless integration of data sets and analytical tools. The Codefest encourages individuals participating to create a solution in the form of a research project, computer code, and models (individually and/or collectively, a \u201cSolution\u201d).

"},{"location":"resources/participant_agreement/#how-to-participate","title":"How to Participate","text":"

You will join a team of environmental scientists, data experts, and coders to explore curated data, consider the objectivity of the data, propose a scientific question that can be addressed with all or some of the data sets, and analyze the data in an attempt to answer your scientific question by the end of the event. You will present your Solution to the event community. Earth Lab and ESIIL will provide environmental data, cyberinfrastructure, cyberinfrastructure and data analytics training, and technical support. The team members of the winning Solution will receive a small monetary award. Details regarding how the winning Solution will be chosen and how the prize will be managed are outlined in the Official Rules for the Codefest (\u201cOfficial Rules\u201d).

"},{"location":"resources/participant_agreement/#representations-and-warranties","title":"Representations and Warranties","text":"

By and through Your participation in the Codefest, You represent and warrant the following:

  • You have read, understand, and agree to abide by the Code of Conduct and Respectful Inclusive Collaboration Guidelines for the Forest Carbon Codefest (\u201cCode of Conduct\u201d) and the Official Rules.
  • Any decisions concerning the Code of Conduct, Official Rules, or any other matter relating to this Codefest by the University is final and binding on all Participants.
"},{"location":"resources/participant_agreement/#codefest-assets","title":"Codefest Assets","text":""},{"location":"resources/participant_agreement/#51-access-and-use","title":"5.1 Access and Use","text":"

By participating in the Codefest, You may receive access to certain datasets, webinars, and/or other copyrighted materials (collectively, the \u201cCodefest Assets\u201d). You agree to follow all licenses, restrictions, and other instructions provided to You with the Codefest Assets.

"},{"location":"resources/participant_agreement/#52-disclaimer","title":"5.2 Disclaimer","text":"

The Codefest Assets are provided \u201cas is\u201d without warranty of any kind, either express or implied, including, without limitation, any implied warranties of merchantability and fitness for a particular purpose. Without limiting the foregoing, the University does not warrant that the Materials will be suitable for Your Solution or that the operation or supply of the Codefest Assets will be uninterrupted or error free.

"},{"location":"resources/participant_agreement/#53-restrictions","title":"5.3 Restrictions","text":"

You agree not to access or use the Codefest Assets in a manner that may interfere with any other participants\u2019 or users\u2019 use of such assets, unless provided with express written consent by the University. Your access to and use of the Codefest Assets may be limited, throttled, or terminated at any time at the sole discretion of the University.

"},{"location":"resources/participant_agreement/#intellectual-property","title":"Intellectual Property","text":"

For purposes of this Agreement, \u201cIntellectual Property\u201d includes all copyright, patent, trademark, trade secret and other intellectual property rights.

"},{"location":"resources/participant_agreement/#61-solution-publication","title":"6.1 Solution Publication","text":"

You agree to make Your Solution publicly available in GitHub under the MIT open-source license within five (5) months from the end of the Codefest.

"},{"location":"resources/participant_agreement/#62-government-rights","title":"6.2 Government Rights","text":"

In consideration of the funding provided by NSF for the Codefest, You hereby grant and agree to grant to the U.S. Government (i) a nonexclusive, non-transferable, irrevocable, royalty-free license to exercise or have exercised for or on behalf of the U.S. throughout the world all the exclusive rights provided by copyright in any copyrightable intellectual property that You create during the Codefest and (ii) a nonexclusive, non-transferable, irrevocable, paid-up license to practice, or have practiced for or on its behalf, any invention created by You during the Codefest throughout the world.

"},{"location":"resources/participant_agreement/#63-nsf-agreement-and-invention-ownership","title":"6.3 NSF Agreement and Invention Ownership","text":"

You acknowledge that the Codefest is subject to NSF\u2019s Cooperative Agreement Terms and Conditions effective May 12, 2023. As such, the U.S. Government may be entitled to own any invention that You create during the Codefest as further outlined within 37 CFR 401 and the NSF Proposal & Award Policies and Procedures Guide. In such event, You agree to assign any invention created by You during the Codefest to the U.S. Government and to reasonably cooperate with the University and NSF to accomplish the same.

"},{"location":"resources/participant_agreement/#64-representations-and-warranties","title":"6.4 Representations and Warranties","text":"

You represent and warrant that You are legally entitled to grant the above licenses and other intellectual property rights as outlined in Sections 6.1, 6.2, and 6.3. If You are an individual, and if Your employer(s) and/or another third party has rights to Intellectual Property that You create that includes Your Solution, You represent that You have received permission to participate in the Codefest on behalf of that employer or third party and that Your employer or the third party has waived such rights for Your contributions.

"},{"location":"resources/participant_agreement/#65-originality-and-third-party-materials","title":"6.5 Originality and Third-Party Materials","text":"

You represent that Your Solution is Your original creation. If you obtain permission under Section 6.5 to include third-party materials, You represent that Your Solution includes complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which You are aware and which are associated with any part of Your Solution. You represent and warrant that You will not submit any materials to the University that You know or believe to have components that are malicious or harmful. You represent that You will perform a reasonable amount of due diligence in order to be properly informed of third-party licenses, infringing materials, or harmful content associated with any part of Your Solution.

"},{"location":"resources/participant_agreement/#66-submission-of-external-work","title":"6.6 Submission of External Work","text":"

Should You wish to submit work that is not Your original creation during the Codefest (and that is not a Codefest Asset), You may ask for permission from the University to incorporate such work into Your Solution. To request such permission, identify the complete details of the materials you wish to use, including any licenses or other restrictions (including, but not limited to, related patents, trademarks, and license agreements) of which You are personally aware. Request for permission to add materials created outside of the Codefest must be submitted in advance of the Codefest to: Tyler McIntosh; tyler.l.mcintosh@colorado.edu.

"},{"location":"resources/participant_agreement/#67-notification-of-changes","title":"6.7 Notification of Changes","text":"

You agree to notify the University of any facts or circumstances of which You become aware that would make these representations inaccurate in any respect. You agree to notify the University of any administrative or court proceeding which involve Your Solution.

"},{"location":"resources/participant_agreement/#limitation-of-liability","title":"Limitation of Liability","text":"

TO THE EXTENT ALLOWED BY LAW, IN NO EVENT SHALL THE UNIVERSITY, ITS PARTNERS, LICENSORS, SERVICE PROVIDERS, OR ANY OF THEIR RESPECTIVE OFFICERS, DIRECTORS, AGENTS, EMPLOYEES OR REPRESENTATIVES, BE LIABLE FOR DIRECT, INCIDENTAL, CONSEQUENTIAL, EXEMPLARY OR PUNITIVE DAMAGES ARISING OUT OF OR IN CONNECTION WITH THE HACKATHON OR THIS AGREEMENT (HOWEVER ARISING, INCLUDING NEGLIGENCE). IF YOU HAVE A DISPUTE WITH ANY PARTICIPANT OR ANY OTHER THIRD PARTY, YOU RELEASE THE UNIVERSITY, ITS, PARTNERS, LICENSORS, AND SERVICE PROVIDERS, AND EACH OF THEIR RESPECTIVE OFFICERS, DIRECTORS, AGENTS, EMPLOYEES AND REPRESENTATIVES FROM ANY AND ALL CLAIMS, DEMANDS AND DAMAGES (ACTUAL AND CONSEQUENTIAL) OF EVERY KIND AND NATURE ARISING OUT OF OR IN ANY WAY CONNECTED WITH SUCH DISPUTES. YOU AGREE THAT ANY CLAIMS AGAINST UNIVERSITY ARISING OUT OF THE HACKATHON OR THIS AGREEMENT MUST BE FILED WITHIN ONE YEAR AFTER SUCH CLAIM AROSE; OTHERWISE, YOUR CLAIM IS PERMANENTLY BARRED.

"},{"location":"resources/participant_agreement/#not-an-offer-or-contract-of-employment","title":"Not an Offer or Contract of Employment","text":"

Under no circumstances will Your participation in the Codefest or anything in this Agreement be construed as an offer or contract of employment with the University.

"},{"location":"resources/participant_agreement/#additional-terms","title":"Additional Terms","text":"
  • You must be at least eighteen (18) years of age to participate in the Codefest. The Codefest is subject to applicable federal, state, and local laws.
  • The University reserves the right to permanently disqualify any person from the Codefest that it reasonably believes has violated this Agreement, the Code of Conduct, and/or the Official Rules.
  • Any attempt to deliberately damage the Codefest or the operation thereof is unlawful and subject to legal action by the University, which may seek damages to the fullest extent permitted by law.
  • The University assumes no responsibility for any injury or damage to Your or any other person\u2019s computer relating to or resulting from entering or downloading materials or software in connection with the Codefest.
  • The University is not responsible for telecommunications, network, electronic, technical, or computer failures of any kind; for inaccurate transcription of entry information; for any human or electronic error; or for Solutions that are stolen, misdirected, garbled, delayed, lost, late, damaged, or returned.
  • The University reserves the right to cancel, modify, or suspend the Codefest or any element thereof (including, without limitation, this Agreement) without notice in any manner and for any reason (including, without limitation, in the event of any unanticipated occurrence that is not fully addressed in this Agreement).
  • The University may prohibit any person from participating in the Codefest, if such person shows a disregard for this Agreement; acts with an intent to annoy, abuse, threaten, or harass any other entrant or any agents or representatives of the University (or any associated, partners, licensors, or service providers for the University); or behaves in any other disruptive manner (as determined by the University in its sole discretion).
  • Nothing contained in this Agreement shall be construed as an express or implied waiver by University of its governmental immunity or of the governmental immunity of the State of Colorado.
  • Your Solutions shall not contain any item(s) that are either export-controlled under the International Traffic in Arms Regulations, or that appear on the Commerce Control List (except as EAR99) of the Export Administration Regulations.
"},{"location":"resources/participant_agreement/#dispute-resolution","title":"Dispute Resolution","text":"

This Agreement and the Codefest shall be governed and construed in accordance with and governed by the laws of the state of Colorado without giving effect to conflict of law provisions.

"},{"location":"resources/participant_agreement/#entire-agreement","title":"Entire Agreement","text":"

This Agreement, along with the Official Rules, and the Event Code of Conduct, constitutes the entire agreement between the University and You with respect to the Codefest and supersedes all previous or contemporaneous oral or written agreements concerning the Codefest. In the event of a conflict between this Agreement, the Official Rules and/or the Event Code of Conduct, the conflict shall be resolved with the following order of precedence:

  1. This Agreement
  2. The Official Rules
  3. The Event Code of Conduct
"},{"location":"resources/participant_agreement/#severability","title":"Severability","text":"

The invalidity, illegality, or unenforceability of any one or more phrases, sentences, clauses, or sections in this Agreement does not affect the remaining portions of this Agreement.

If you have questions about the Codefest, please contact Tyler McIntosh at tyler.l.mcintosh@colorado.edu.

"},{"location":"resources/post_meeting_notes/","title":"Post-Meeting Notes Template","text":""},{"location":"resources/post_meeting_notes/#meeting-details","title":"Meeting Details","text":"
  • Date:
  • Time:
  • Location:
  • Facilitator:
"},{"location":"resources/post_meeting_notes/#attendees","title":"Attendees","text":"
  • List of attendees
"},{"location":"resources/post_meeting_notes/#agenda","title":"Agenda","text":""},{"location":"resources/post_meeting_notes/#1-review-of-meeting-goals","title":"1. Review of Meeting Goals","text":"
  • Recap the primary objectives and if they were met.
"},{"location":"resources/post_meeting_notes/#2-manuscript-development","title":"2. Manuscript Development","text":"
  • Discuss the status of current manuscript drafts.
  • Assign writing and editing tasks for different sections of the manuscript.
  • Set deadlines for draft completion and review.
"},{"location":"resources/post_meeting_notes/#3-research-highlights","title":"3. Research Highlights","text":"
  • Identify key findings and outcomes that should be emphasized in the publications.
  • Discuss any new research insights that emerged from the meeting.
"},{"location":"resources/post_meeting_notes/#4-publication-strategy","title":"4. Publication Strategy","text":"
  • Decide on target journals or conferences for publication submission.
  • Discuss authorship order and contributions.
  • Plan for any additional data or research needed to strengthen the manuscript.
"},{"location":"resources/post_meeting_notes/#5-editing-and-review-process","title":"5. Editing and Review Process","text":"
  • Establish a peer-review process within the group for initial feedback.
  • Assign members to focus on specific aspects of editing, such as clarity, grammar, and technical accuracy.
  • Agree on a schedule for review rounds to ensure timely submission.
"},{"location":"resources/post_meeting_notes/#6-responsibilities-and-expectations","title":"6. Responsibilities and Expectations","text":"
  • Clearly define what is expected from each member before the next meeting.
  • Discuss communication methods for progress updates and questions.
"},{"location":"resources/post_meeting_notes/#7-closing-remarks","title":"7. Closing Remarks","text":"
  • Summarize the discussion and confirm the action plan.
  • Reiterate the importance of meeting the set deadlines and maintaining communication.
"},{"location":"resources/post_meeting_notes/#action-items","title":"Action Items","text":"
  • [ ] Draft introduction section: Responsible person(s) - Deadline
  • [ ] Compile and analyze additional data: Responsible person(s) - Deadline
  • [ ] Draft methodology section: Responsible person(s) - Deadline
  • ...
  • [ ] Coordinate manuscript peer review: Responsible person(s) - Deadline
"},{"location":"resources/post_meeting_notes/#next-steps","title":"Next Steps","text":"
  • Define the timeline for the submission process.
  • Schedule follow-up meetings or check-ins to monitor progress.
"},{"location":"resources/post_meeting_notes/#notes","title":"Notes","text":"
  • (Additional notes, comments, or observations made during the meeting.)
"},{"location":"resources/pre_meeting_notes/","title":"Pre-Meeting Notes","text":""},{"location":"resources/pre_meeting_notes/#meeting-details","title":"Meeting Details","text":"
  • Date:
  • Time:
  • Location:
  • Facilitator:
"},{"location":"resources/pre_meeting_notes/#attendees","title":"Attendees","text":"
  • List of attendees
"},{"location":"resources/pre_meeting_notes/#agenda","title":"Agenda","text":""},{"location":"resources/pre_meeting_notes/#1-opening-remarks","title":"1. Opening Remarks","text":"
  • Brief welcome and overview of the meeting's objectives.
"},{"location":"resources/pre_meeting_notes/#2-introductions","title":"2. Introductions","text":"
  • Roundtable introductions for all attendees.
  • Share a personal note or interesting fact to foster camaraderie.
"},{"location":"resources/pre_meeting_notes/#3-planning","title":"3. Planning","text":"
  • Discuss the agenda for the primary meetings.
  • Outline the key topics and issues to address.
  • Assign roles for note-taking, timekeeping, and facilitation in primary meetings.
"},{"location":"resources/pre_meeting_notes/#4-goal-setting","title":"4. Goal Setting","text":"
  • Establish clear, actionable goals for the upcoming period.
  • Identify specific outcomes desired from the primary meetings.
  • Agree on metrics or indicators of success for these goals.
"},{"location":"resources/pre_meeting_notes/#5-camaraderie-building","title":"5. Camaraderie Building","text":"
  • Icebreaker activity or team-building exercise.
  • Share expectations and aspirations for the group's progress.
  • Highlight the importance of collaboration and mutual support.
"},{"location":"resources/pre_meeting_notes/#6-open-discussion","title":"6. Open Discussion","text":"
  • Allow for any additional topics, concerns, or ideas to be brought forward.
"},{"location":"resources/pre_meeting_notes/#7-closing-remarks","title":"7. Closing Remarks","text":"
  • Summarize the discussions and confirm the next steps.
  • Confirm dates and times for primary meetings.
  • Express appreciation for participation.
"},{"location":"resources/pre_meeting_notes/#action-items","title":"Action Items","text":"
  • [ ] Action item 1: Responsible person(s) - Deadline
  • [ ] Action item 2: Responsible person(s) - Deadline
  • ...
"},{"location":"resources/pre_meeting_notes/#notes","title":"Notes","text":"
  • (Any additional notes or comments about the meeting.)
"},{"location":"resources/second_meeting_notes/","title":"Primary Meeting Day 6-10: Progress and Development","text":""},{"location":"resources/second_meeting_notes/#meeting-details","title":"Meeting Details","text":"
  • Dates:
  • Times:
  • Location:
  • Facilitator:
"},{"location":"resources/second_meeting_notes/#attendees","title":"Attendees","text":"
  • List of attendees
"},{"location":"resources/second_meeting_notes/#daily-agenda","title":"Daily Agenda","text":""},{"location":"resources/second_meeting_notes/#day-6-review-and-refine","title":"Day 6: Review and Refine","text":""},{"location":"resources/second_meeting_notes/#recap-of-previous-sessions","title":"Recap of Previous Sessions","text":"
  • Summary of progress made since the last meeting.
  • Review of action items and milestones achieved.
"},{"location":"resources/second_meeting_notes/#refinement-of-goals-and-tasks","title":"Refinement of Goals and Tasks","text":"
  • Reassessment and adjustment of goals based on current progress.
  • Identification of any new challenges or opportunities.
"},{"location":"resources/second_meeting_notes/#day-7-9-in-depth-work-sessions","title":"Day 7-9: In-Depth Work Sessions","text":""},{"location":"resources/second_meeting_notes/#daily-goals","title":"Daily Goals","text":"
  • Clear objectives for each day\u2019s work sessions.
"},{"location":"resources/second_meeting_notes/#task-progress-updates","title":"Task Progress Updates","text":"
  • Brief reports from team members on their assigned tasks.
  • Collaborative problem-solving for any issues encountered.
"},{"location":"resources/second_meeting_notes/#theory-and-data-integration","title":"Theory and Data Integration","text":"
  • Continued discussions on aligning theoretical frameworks with data analysis.
  • Workshops or breakout sessions for detailed aspects of the project.
"},{"location":"resources/second_meeting_notes/#evening-collaborative-activities","title":"Evening Collaborative Activities","text":"
  • Informal sessions to encourage ongoing dialogue and collaboration.
"},{"location":"resources/second_meeting_notes/#day-10-mid-point-review","title":"Day 10: Mid-Point Review","text":""},{"location":"resources/second_meeting_notes/#progress-evaluation","title":"Progress Evaluation","text":"
  • Assessment of the work done during the week.
  • Feedback sessions to ensure quality and consistency in outputs.
"},{"location":"resources/second_meeting_notes/#documentation-and-record-keeping","title":"Documentation and Record-Keeping","text":"
  • Ensure thorough documentation of methods, results, and decisions.
  • Establish a system for organizing and sharing this documentation.
"},{"location":"resources/second_meeting_notes/#planning-forward","title":"Planning Forward","text":"
  • Setting objectives for the next phase of the project.
  • Adjusting the roadmap as necessary based on insights from the week\u2019s work.
"},{"location":"resources/second_meeting_notes/#detailed-notes","title":"Detailed Notes","text":""},{"location":"resources/second_meeting_notes/#day-6-notes","title":"Day 6 Notes","text":"
  • ...
"},{"location":"resources/second_meeting_notes/#day-7-notes","title":"Day 7 Notes","text":"
  • ...
"},{"location":"resources/second_meeting_notes/#day-8-notes","title":"Day 8 Notes","text":"
  • ...
"},{"location":"resources/second_meeting_notes/#day-9-notes","title":"Day 9 Notes","text":"
  • ...
"},{"location":"resources/second_meeting_notes/#day-10-notes","title":"Day 10 Notes","text":"
  • ...
"},{"location":"resources/second_meeting_notes/#action-items","title":"Action Items","text":"
  • [ ] Specific task: Assigned to - Deadline
  • [ ] Specific task: Assigned to - Deadline
  • ...
"},{"location":"resources/second_meeting_notes/#reflections-and-comments","title":"Reflections and Comments","text":"
  • (Space for any additional thoughts, insights, or personal reflections on the meeting.)
"},{"location":"resources/slides/","title":"Welcome to ESIIL Education Student OASIS","text":"

This is the central resource for ESIIL working groups.

"},{"location":"resources/slides/#embedded-website","title":"Embedded Website","text":"

Below is an embedded website:

"},{"location":"resources/third_meeting_notes/","title":"Primary Meeting Day 11-15: Finalization and Conclusion","text":""},{"location":"resources/third_meeting_notes/#meeting-details","title":"Meeting Details","text":"
  • Dates:
  • Times:
  • Location:
  • Facilitator:
"},{"location":"resources/third_meeting_notes/#attendees","title":"Attendees","text":"
  • List of attendees
"},{"location":"resources/third_meeting_notes/#daily-agenda","title":"Daily Agenda","text":""},{"location":"resources/third_meeting_notes/#day-11-alignment-and-focus","title":"Day 11: Alignment and Focus","text":""},{"location":"resources/third_meeting_notes/#realigning-objectives","title":"Realigning Objectives","text":"
  • Review the project's main goals to ensure alignment with the final output.
  • Address any misalignments or deviations from the original plan.
"},{"location":"resources/third_meeting_notes/#prioritization-of-tasks","title":"Prioritization of Tasks","text":"
  • Identify critical tasks that need to be completed.
  • Allocate resources and efforts to ensure these priorities are met.
"},{"location":"resources/third_meeting_notes/#day-12-14-intensive-work-period","title":"Day 12-14: Intensive Work Period","text":""},{"location":"resources/third_meeting_notes/#task-completion","title":"Task Completion","text":"
  • Dedicated time for team members to complete their individual contributions.
  • Regular check-ins to track progress and address any blockers.
"},{"location":"resources/third_meeting_notes/#integration-of-work","title":"Integration of Work","text":"
  • Begin to combine individual contributions into a cohesive whole.
  • Review the integration to ensure consistency and coherency across the project.
"},{"location":"resources/third_meeting_notes/#final-reviews-and-edits","title":"Final Reviews and Edits","text":"
  • Conduct thorough reviews of the project's outputs.
  • Perform final edits to refine the quality of the work.
"},{"location":"resources/third_meeting_notes/#day-15-closure-and-celebration","title":"Day 15: Closure and Celebration","text":""},{"location":"resources/third_meeting_notes/#final-presentation","title":"Final Presentation","text":"
  • Present the completed project to the group.
  • Discuss any last-minute adjustments or refinements needed.
"},{"location":"resources/third_meeting_notes/#reflective-session","title":"Reflective Session","text":"
  • Reflect on the achievements and learnings from the project.
  • Share appreciation for the team's hard work and dedication.
"},{"location":"resources/third_meeting_notes/#celebration","title":"Celebration","text":"
  • Acknowledge the successful completion of the project.
  • Plan for any dissemination of the project's findings or outputs.
"},{"location":"resources/third_meeting_notes/#detailed-notes","title":"Detailed Notes","text":""},{"location":"resources/third_meeting_notes/#day-11-notes","title":"Day 11 Notes","text":"
  • ...
"},{"location":"resources/third_meeting_notes/#day-12-notes","title":"Day 12 Notes","text":"
  • ...
"},{"location":"resources/third_meeting_notes/#day-13-notes","title":"Day 13 Notes","text":"
  • ...
"},{"location":"resources/third_meeting_notes/#day-14-notes","title":"Day 14 Notes","text":"
  • ...
"},{"location":"resources/third_meeting_notes/#day-15-notes","title":"Day 15 Notes","text":"
  • ...
"},{"location":"resources/third_meeting_notes/#action-items","title":"Action Items","text":"
  • [ ] Finalize manuscript for publication: Assigned to - Deadline
  • [ ] Prepare data for repository submission: Assigned to - Deadline
  • [ ] Organize project materials for archival: Assigned to - Deadline
  • ...
"},{"location":"resources/third_meeting_notes/#reflections-and-comments","title":"Reflections and Comments","text":"
  • (Space for any additional thoughts, insights, or personal reflections on the meeting and the project as a whole.)
"},{"location":"resources/third_meeting_notes/#next-steps","title":"Next Steps","text":"
  • Define the publication and dissemination plan.
  • Outline any follow-up research or projects that have stemmed from this work.
"},{"location":"resources/third_meeting_notes/#additional-documentation","title":"Additional Documentation","text":"
  • (Include or link to any additional documents, charts, or resources that were created or referenced during the meeting.)
"},{"location":"resources/visualizations/","title":"Visualization Strategy and Development Documentation","text":""},{"location":"resources/visualizations/#overview","title":"Overview","text":"
  • Brief overview of the visualization goals and their alignment with the overall project objectives.
"},{"location":"resources/visualizations/#visualization-strategy","title":"Visualization Strategy","text":""},{"location":"resources/visualizations/#identifying-key-messages","title":"Identifying Key Messages","text":"
  • Discuss main messages or insights to communicate through visualizations.
  • Identify target audience and their specific needs.
"},{"location":"resources/visualizations/#selecting-appropriate-visualization-types","title":"Selecting Appropriate Visualization Types","text":"
  • Explore different types of visualizations (charts, graphs, 3D, interactive elements) suitable for the data and message.
  • Brainstorm creative visualization approaches.
"},{"location":"resources/visualizations/#visualization-development","title":"Visualization Development","text":""},{"location":"resources/visualizations/#code-generated-visualizations","title":"Code-Generated Visualizations","text":"
  • Outline initial visualizations generated from the data pipeline.
  • Include code snippets and explanations.
# Example Python code for a basic plot\nimport matplotlib.pyplot as plt\nplt.plot(data['x'], data['y'])\nplt.show()\n
"},{"location":"resources/visualizations/#enhancing-visualizations","title":"Enhancing Visualizations","text":"
  • Steps for annotating, animating, creating 3D, immersive, or interactive visualizations.
  • Discuss challenges and solutions in enhancing visuals.
"},{"location":"resources/visualizations/#versioning-and-iterations","title":"Versioning and Iterations","text":"
  • Document different versions and iterations of visualizations.
  • Reflect on improvements or changes in each version.
"},{"location":"resources/visualizations/#finalizing-visualizations","title":"Finalizing Visualizations","text":"
  • Process of finalizing visuals for presentation or publication.
  • Feedback incorporation from team or test audiences.
"},{"location":"resources/visualizations/#documentation-of-tools-and-resources","title":"Documentation of Tools and Resources","text":"
  • List software, libraries, and tools used for visualization.
  • Reference external resources or tutorials.
"},{"location":"resources/visualizations/#conclusions","title":"Conclusions","text":"
  • Summarize the visualization process and contributions to the project.
  • Reflect on lessons learned and potential future improvements.
"},{"location":"resources/visualizations/#references","title":"References","text":"
  • Cite external sources, inspirations, or frameworks used in visualization.
"}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..47733c1 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,103 @@ + + + + https://cu-esiil.github.io/Working_group_home/ + 2024-06-21 + daily + + + https://cu-esiil.github.io/Working_group_home/resources/art%20gallery/ + 2024-06-21 + daily + + + https://cu-esiil.github.io/Working_group_home/resources/citations/ + 2024-06-21 + daily + + + https://cu-esiil.github.io/Working_group_home/resources/code-of-conduct/ + 2024-06-21 + daily + + + https://cu-esiil.github.io/Working_group_home/resources/cyverse_basics/ + 2024-06-21 + daily + + + https://cu-esiil.github.io/Working_group_home/resources/data_analysis/ + 2024-06-21 + daily + + + https://cu-esiil.github.io/Working_group_home/resources/data_processing/ + 2024-06-21 + daily + + + https://cu-esiil.github.io/Working_group_home/resources/docker_basics/ + 2024-06-21 + daily + + + https://cu-esiil.github.io/Working_group_home/resources/esiil_training/ + 2024-06-21 + daily + + + https://cu-esiil.github.io/Working_group_home/resources/first_meeting_notes/ + 2024-06-21 + daily + + + https://cu-esiil.github.io/Working_group_home/resources/manuscript/ + 2024-06-21 + daily + + + https://cu-esiil.github.io/Working_group_home/resources/markdown_basics/ + 2024-06-21 + daily + + + https://cu-esiil.github.io/Working_group_home/resources/notes_from_readings/ + 2024-06-21 + daily + + + https://cu-esiil.github.io/Working_group_home/resources/participant_agreement/ + 2024-06-21 + daily + + + https://cu-esiil.github.io/Working_group_home/resources/post_meeting_notes/ + 2024-06-21 + daily + + + https://cu-esiil.github.io/Working_group_home/resources/pre_meeting_notes/ + 2024-06-21 + daily + + + https://cu-esiil.github.io/Working_group_home/resources/second_meeting_notes/ + 2024-06-21 + daily + + + https://cu-esiil.github.io/Working_group_home/resources/slides/ + 2024-06-21 + daily + + + https://cu-esiil.github.io/Working_group_home/resources/third_meeting_notes/ + 2024-06-21 + daily + + + https://cu-esiil.github.io/Working_group_home/resources/visualizations/ + 2024-06-21 + daily + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100644 index 0000000..a4e1e5a Binary files /dev/null and b/sitemap.xml.gz differ