diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/404.html b/404.html new file mode 100644 index 00000000..994d0c53 --- /dev/null +++ b/404.html @@ -0,0 +1,19 @@ + + + + + +Page Not Found | Evan Tay + + + + + + + + + + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

+ + \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 00000000..29ef153f --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +evantay.com \ No newline at end of file diff --git a/assets/css/styles.65cbffe7.css b/assets/css/styles.65cbffe7.css new file mode 100644 index 00000000..4e87e9be --- /dev/null +++ b/assets/css/styles.65cbffe7.css @@ -0,0 +1 @@ +.col,.container{padding:0 var(--ifm-spacing-horizontal)}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}*{box-sizing:border-box}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%;background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);text-rendering:optimizelegibility}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width);width:100%}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}.projectItem___un h1,h1{font-size:2.4rem}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.contentTableContainer td:first-child,.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_Gvgb,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{list-style:none;padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after,.inline-block{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card--full-height{height:100%}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}#nprogress,.dropdown__menu,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;list-style:none;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_BuS1>:last-child,.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p:last-child,.footer__items{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title,.title_f1Hy{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{list-style:none;margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{content:"";height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;filter:var(--ifm-menu-link-sublist-icon-filter)}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:-webkit-sticky;position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;position:fixed;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;left:0;top:0;visibility:hidden}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.h-full,.navbar__logo img,body,html{height:100%}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child,.pr-0{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{-webkit-appearance:none;appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:.9rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.cursor-pointer,.dropdownNavbarItemMobile_S0Fm,.pills__item,.tabs__item{cursor:pointer}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover,.sidebarItemLink_mo7H:hover{text-decoration:none}.pagination-nav{grid-gap:var(--ifm-spacing-horizontal);display:grid;gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec}:root{--docusaurus-progress-bar-color:var(--ifm-color-primary);--ifm-color-primary:#0f9d58;--ifm-color-primary-dark:#0d8d4f;--ifm-color-primary-darker:#0d854b;--ifm-color-primary-darkest:#0a6e3e;--ifm-color-primary-light:#10ad61;--ifm-color-primary-lighter:#11b565;--ifm-color-primary-lightest:#13cc72;--ifm-color-secondary:#878787;--ifm-color-secondary-dark:#616161;--ifm-color-secondary-darker:#141414;--ifm-color-secondary-darkest:#0d0d0d;--ifm-color-secondary-light:#adadad;--ifm-color-secondary-lighter:#d4d4d4;--ifm-color-secondary-lightest:#ededed;--ifm-navbar-background-color:#141414;--ifm-background-color:#141414;--ifm-color-success:#0f9d58;--ifm-color-warning:#f4b400;--ifm-color-danger:#db4437;--ifm-link-color:#0f9d58;--ifm-code-font-size:95%;--docusaurus-announcement-bar-height:auto;--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300)}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.container{width:100%}.m-3{margin:.75rem}.mx-auto{margin-left:auto;margin-right:auto}.my-0{margin-bottom:0;margin-top:0}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.block,.tocCollapsibleContent_vkbj a{display:block}.grid{display:grid}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_YfHR,.hidden,.sidebarLogo_isFc,.themedComponent_mlkZ,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.h-40{height:10rem}.max-w-7xl{max-width:80rem}@keyframes a{50%{opacity:.5}}.animate-pulse{animation:2s cubic-bezier(.4,0,.6,1) infinite a}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.gap-6{gap:1.5rem}.overflow-hidden{overflow:hidden}.rounded{border-radius:.25rem}.rounded-lg{border-radius:.5rem}.border-0{border-width:0}.border-b-4{border-bottom-width:4px}.border-solid{border-style:solid}.border-success{--tw-border-opacity:1;border-color:rgb(13 141 79/var(--tw-border-opacity))}.bg-danger{--tw-bg-opacity:1;background-color:rgb(219 68 55/var(--tw-bg-opacity))}.bg-primary-900{--tw-bg-opacity:1;background-color:rgb(10 110 62/var(--tw-bg-opacity))}.bg-secondary-800{--tw-bg-opacity:1;background-color:rgb(20 20 20/var(--tw-bg-opacity))}.bg-success{--tw-bg-opacity:1;background-color:rgb(13 141 79/var(--tw-bg-opacity))}.p-2{padding:.5rem}.px-4{padding-left:1rem;padding-right:1rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.pl-1{padding-left:.25rem}.pl-4{padding-left:1rem}.pt-4{padding-top:1rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.aboutText_V1HZ a,.font-bold{font-weight:700}.text-danger{--tw-text-opacity:1;color:rgb(219 68 55/var(--tw-text-opacity))}.text-primary-900{--tw-text-opacity:1;color:rgb(10 110 62/var(--tw-text-opacity))}.text-primary-default{--tw-text-opacity:1;color:rgb(15 157 88/var(--tw-text-opacity))}.text-secondary-500{--tw-text-opacity:1;color:rgb(173 173 173/var(--tw-text-opacity))}.text-success{--tw-text-opacity:1;color:rgb(13 141 79/var(--tw-text-opacity))}.text-warning{--tw-text-opacity:1;color:rgb(244 180 0/var(--tw-text-opacity))}.hover\:text-white:hover,.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.hover\:no-underline:hover,.no-underline{text-decoration-line:none}.transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.docusaurus-highlight-code-line{background-color:#484d5b;display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}h2{font-size:2rem}h3{font-size:1.2rem}p{margin:0 0 var(--ifm-paragraph-margin-bottom);font-size:1rem}.admonition a,.admonition a:hover{color:var(--ifm-alert-color);text-decoration:underline}.wideBodyMaxWidth{max-width:640px}.contentTableContainer table{display:table;margin:0;text-align:left;width:100%}.contentTableContainer th:first-child{width:5%}.contentTableContainer th:last-child{width:25%}.button:hover:any-link{color:var(--ifm-button-color)}.hover\:bg-primary-800:hover{--tw-bg-opacity:1;background-color:rgb(13 133 75/var(--tw-bg-opacity))}.hover\:bg-secondary-900:hover{--tw-bg-opacity:1;background-color:rgb(13 13 13/var(--tw-bg-opacity))}.hover\:text-primary-800:hover{--tw-text-opacity:1;color:rgb(13 133 75/var(--tw-text-opacity))}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit;text-decoration:underline}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}[data-theme=dark] .themedComponent--dark_xIcU,[data-theme=light] .themedComponent--light_NVdE,html:not([data-theme]) .themedComponent--light_NVdE{display:initial}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.iconExternalLink_nPIU{margin-left:.3rem}.docMainContainer_TBSr,.docRoot_UBD9{display:flex;width:100%}.docsWrapper_hBAB{display:flex;flex:1 0 auto}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}@supports selector(:has(*)){.navbarSearchContainer_Bca1:not(:has(>*)){display:none}}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.errorBoundaryFallback_VBag{color:red;padding:.55rem}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.sidebar_re4s{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:-webkit-sticky;position:sticky;top:calc(var(--ifm-navbar-height) + 2rem)}.sidebarItemTitle_pO2u{font-size:var(--ifm-h3-font-size);font-weight:var(--ifm-font-weight-bold)}.container_mt6G,.sidebarItemList_Yudw{font-size:.9rem}.sidebarItem__DBe{margin-top:.7rem}.sidebarItemLink_mo7H{color:var(--ifm-font-color-base);display:block}.sidebarItemLinkActive_I1ZP{color:var(--ifm-color-primary)!important}.projectPageHeader_YTeS{background-color:var(--ifm-color-secondary-darker);color:var(--ifm-color-secondary-lighter);display:block;overflow:hidden;padding:1rem 0;position:relative;text-align:center}.directory_PXbK,.directory_sHAu,.heroBanner_UJJx{color:var(--ifm-color-secondary-lightest);background-color:var(--ifm-color-secondary-darker)}.aboutHeader_v4hF h2,.projectPageHeader_YTeS h2{display:inline-block;padding-bottom:6px}.projectItem___un{margin:0 auto;max-width:768px;text-align:left}.projectItem___un h2{font-size:1rem;font-weight:400}.projectItem___un ul{list-style:none;margin:0;padding:8px;text-align:left}.projectItem___un li{margin-bottom:8px}.projectItem___un svg{margin-right:4px;max-width:12px}.projectItemButton_CuAo{display:flex;justify-content:center;margin:0}.directory_PXbK,.directory_sHAu{padding:3.6rem .4rem;width:100%}.authorCol_Hf19{flex-grow:1!important;max-width:inherit!important}.imageOnlyAuthorRow_pa_O{display:flex;flex-flow:row wrap}.imageOnlyAuthorCol_G86a{margin-left:.3rem;margin-right:.3rem}.heroBanner_UJJx{align-items:center;display:flex;justify-content:center;overflow:hidden;padding:3.6rem 1.2rem}.heroBannerWrapper_T2xm{min-height:1024px}.heroBanner_UJJx h1{font-size:4.8rem;font-weight:600;line-height:5.4rem}.heroBanner_UJJx p{font-size:1.2rem;margin:0 4px;max-width:512px}.aboutHeader_v4hF{background-color:var(--ifm-color-secondary-darker);color:var(--ifm-color-secondary-lighter);display:block;overflow:hidden;padding:3.6rem 0 1rem;position:relative;text-align:center}.about_t7Hw{align-items:center;background-color:var(--ifm-color-secondary-lightest);color:var(--ifm-color-secondary-darker);display:flex;flex-direction:row;gap:2.4rem;justify-content:center;padding:3.6rem 1.2rem}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.aboutProfilePic_YGLO{border-radius:5%;max-height:196px;max-width:196px}.aboutText_V1HZ{max-width:512px}.socialLinks_imCW{display:flex;flex-direction:row;justify-content:left;margin:1.2rem 0;padding-left:.3rem}.socialLinks_imCW div{margin-right:1rem}.socialLinks_imCW a{font-size:1rem;width:100%}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:-webkit-sticky;position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tag_Nnez{display:inline-block;margin:.5rem .5rem 0 1rem}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{fill:currentColor;height:inherit;left:0;opacity:inherit;position:absolute;top:0;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.lastUpdated_vwxv{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;list-style:none;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.containsTaskList_mC6p{list-style:none}.img_ev3q{height:auto}.admonition_xJq3{margin-bottom:1em}.admonitionHeading_Gvgb{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family)}.admonitionHeading_Gvgb:not(:last-child){margin-bottom:.3rem}.admonitionHeading_Gvgb code{text-transform:none}.admonitionIcon_Rf37{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_Rf37 svg{fill:var(--ifm-alert-foreground-color);display:inline-block;height:1.6em;width:1.6em}.blogPostFooterDetailsFull_mRVl{flex-direction:column}.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:-webkit-sticky;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}.md\:h-48{height:12rem}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:gap-4{gap:1rem}.md\:px-0{padding-left:0;padding-right:0}.md\:py-12{padding-bottom:3rem;padding-top:3rem}}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_TmdG{background-color:var(--docusaurus-collapse-button-bg)}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:-webkit-sticky;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_i1dp,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_TmdG:focus,.expandButton_TmdG:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_TmdG{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_i1dp{transform:rotate(180deg)}.docSidebarContainer_YfHR{border-right:1px solid var(--ifm-toc-border-color);-webkit-clip-path:inset(0);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_DPk8{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_aRkj{height:100%;max-height:100vh;position:-webkit-sticky;position:sticky;top:0}.docMainContainer_TBSr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_lQrH{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_JWYK{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.navbarSearchContainer_Bca1{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.lastUpdated_vwxv{text-align:right}.tocMobile_ITEo{display:none}.docItemCol_VOVn{max-width:75%!important}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (min-width:1536px){.container{max-width:1536px}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.sidebar_re4s,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.navbarSearchContainer_Bca1{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_F8PC{padding:0 .3rem}}@media screen and (max-width:966px){h1{font-size:2.4rem}h2{font-size:1.6rem}h3{font-size:1.4rem}.projectItemBackButton_g1Ck,p{font-size:1rem}.about_t7Hw{flex-direction:column}.socialLinks_imCW{justify-content:space-between;padding:0 1.6rem .4rem}.socialLinks_imCW div{margin-right:0}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}.title_f1Hy{font-size:2rem}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}} \ No newline at end of file diff --git a/assets/images/bubbletea-4acc6e9960cd794bcb3fd3f5e1b6a217.jpg b/assets/images/bubbletea-4acc6e9960cd794bcb3fd3f5e1b6a217.jpg new file mode 100644 index 00000000..62eed38c Binary files /dev/null and b/assets/images/bubbletea-4acc6e9960cd794bcb3fd3f5e1b6a217.jpg differ diff --git a/assets/images/ceevee-c984f85d7b99c9bc76ee1ef040108bb5.png b/assets/images/ceevee-c984f85d7b99c9bc76ee1ef040108bb5.png new file mode 100644 index 00000000..2f8cc20e Binary files /dev/null and b/assets/images/ceevee-c984f85d7b99c9bc76ee1ef040108bb5.png differ diff --git a/assets/images/ddia-30dc818fa9e54c52f11a89f8279d4f28.png b/assets/images/ddia-30dc818fa9e54c52f11a89f8279d4f28.png new file mode 100644 index 00000000..4b53850f Binary files /dev/null and b/assets/images/ddia-30dc818fa9e54c52f11a89f8279d4f28.png differ diff --git a/assets/images/ddia-b2e39270aee1d26da86d96745aa744e1.png b/assets/images/ddia-b2e39270aee1d26da86d96745aa744e1.png new file mode 100644 index 00000000..9f314d37 Binary files /dev/null and b/assets/images/ddia-b2e39270aee1d26da86d96745aa744e1.png differ diff --git a/assets/images/evantay_v1-3aa5b8191d0711f10104318d8524a768.png b/assets/images/evantay_v1-3aa5b8191d0711f10104318d8524a768.png new file mode 100644 index 00000000..e58cb52d Binary files /dev/null and b/assets/images/evantay_v1-3aa5b8191d0711f10104318d8524a768.png differ diff --git a/assets/images/ikigai-c82d2290bd6e8082e34a7ee7774f0cdd.jpeg b/assets/images/ikigai-c82d2290bd6e8082e34a7ee7774f0cdd.jpeg new file mode 100644 index 00000000..99729cc1 Binary files /dev/null and b/assets/images/ikigai-c82d2290bd6e8082e34a7ee7774f0cdd.jpeg differ diff --git a/assets/images/posthog_actions_secrets-7a037b4178c7a64a3976caf1d1a95aea.png b/assets/images/posthog_actions_secrets-7a037b4178c7a64a3976caf1d1a95aea.png new file mode 100644 index 00000000..0fab36c8 Binary files /dev/null and b/assets/images/posthog_actions_secrets-7a037b4178c7a64a3976caf1d1a95aea.png differ diff --git a/assets/images/posthog_api_key-fc6aa3dcbe700acaa44ac9d74e270d69.png b/assets/images/posthog_api_key-fc6aa3dcbe700acaa44ac9d74e270d69.png new file mode 100644 index 00000000..6755392e Binary files /dev/null and b/assets/images/posthog_api_key-fc6aa3dcbe700acaa44ac9d74e270d69.png differ diff --git a/assets/images/stashaway_returns-256d650580fc97ddb678ec06b3aa49ba.png b/assets/images/stashaway_returns-256d650580fc97ddb678ec06b3aa49ba.png new file mode 100644 index 00000000..56fc96d7 Binary files /dev/null and b/assets/images/stashaway_returns-256d650580fc97ddb678ec06b3aa49ba.png differ diff --git a/assets/js/01a85c17.222e58b9.js b/assets/js/01a85c17.222e58b9.js new file mode 100644 index 00000000..6968d991 --- /dev/null +++ b/assets/js/01a85c17.222e58b9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[8412],{9452:(e,t,s)=>{s.d(t,{c:()=>v});var a=s(1504),i=s(5456),r=s(9012),l=s(1432),n=s(867),c=s(4357),o=s(5592),m=s(3376);function d(e){const{pathname:t}=(0,o.IT)();return(0,a.useMemo)((()=>e.filter((e=>function(e,t){return!(e.unlisted&&!(0,m.Sc)(e.permalink,t))}(e,t)))),[e,t])}const u={sidebar:"sidebar_re4s",sidebarItemTitle:"sidebarItemTitle_pO2u",sidebarItemList:"sidebarItemList_Yudw",sidebarItem:"sidebarItem__DBe",sidebarItemLink:"sidebarItemLink_mo7H",sidebarItemLinkActive:"sidebarItemLinkActive_I1ZP"};var g=s(7624);function h(e){let{sidebar:t}=e;const s=d(t.items);return(0,g.jsx)("aside",{className:"col col--3",children:(0,g.jsxs)("nav",{className:(0,i.c)(u.sidebar,"thin-scrollbar"),"aria-label":(0,c.G)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"}),children:[(0,g.jsx)("div",{className:(0,i.c)(u.sidebarItemTitle,"margin-bottom--md"),children:t.title}),(0,g.jsx)("ul",{className:(0,i.c)(u.sidebarItemList,"clean-list"),children:s.map((e=>(0,g.jsx)("li",{className:u.sidebarItem,children:(0,g.jsx)(n.c,{isNavLink:!0,to:e.permalink,className:u.sidebarItemLink,activeClassName:u.sidebarItemLinkActive,children:e.title})},e.permalink)))})]})})}var b=s(5168);function p(e){let{sidebar:t}=e;const s=d(t.items);return(0,g.jsx)("ul",{className:"menu__list",children:s.map((e=>(0,g.jsx)("li",{className:"menu__list-item",children:(0,g.jsx)(n.c,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active",children:e.title})},e.permalink)))})}function j(e){return(0,g.jsx)(b.Mx,{component:p,props:e})}function x(e){let{sidebar:t}=e;const s=(0,l.U)();return null!=t&&t.items.length?"mobile"===s?(0,g.jsx)(j,{sidebar:t}):(0,g.jsx)(h,{sidebar:t}):null}function v(e){const{sidebar:t,toc:s,children:a,...l}=e,n=t&&t.items.length>0;return(0,g.jsx)(r.c,{...l,children:(0,g.jsx)("div",{className:"container margin-vert--lg",children:(0,g.jsxs)("div",{className:"row",children:[(0,g.jsx)(x,{sidebar:t}),(0,g.jsx)("main",{className:(0,i.c)("col",{"col--7":n,"col--9 col--offset-1":!n}),itemScope:!0,itemType:"https://schema.org/Blog",children:a}),s&&(0,g.jsx)("div",{className:"col col--2",children:s})]})})})}},3024:(e,t,s)=>{s.r(t),s.d(t,{default:()=>p});s(1504);var a=s(5456),i=s(4357);const r=()=>(0,i.G)({id:"theme.tags.tagsPageTitle",message:"Tags",description:"The title of the tag list page"});var l=s(5756),n=s(5864),c=s(9452),o=s(3020),m=s(6448);const d={tag:"tag_Nnez"};var u=s(7624);function g(e){let{letterEntry:t}=e;return(0,u.jsxs)("article",{children:[(0,u.jsx)(m.c,{as:"h2",id:t.letter,children:t.letter}),(0,u.jsx)("ul",{className:"padding--none",children:t.tags.map((e=>(0,u.jsx)("li",{className:d.tag,children:(0,u.jsx)(o.c,{...e})},e.permalink)))}),(0,u.jsx)("hr",{})]})}function h(e){let{tags:t}=e;const s=function(e){const t={};return Object.values(e).forEach((e=>{const s=function(e){return e[0].toUpperCase()}(e.label);null!=t[s]||(t[s]=[]),t[s].push(e)})),Object.entries(t).sort(((e,t)=>{let[s]=e,[a]=t;return s.localeCompare(a)})).map((e=>{let[t,s]=e;return{letter:t,tags:s.sort(((e,t)=>e.label.localeCompare(t.label)))}}))}(t);return(0,u.jsx)("section",{className:"margin-vert--lg",children:s.map((e=>(0,u.jsx)(g,{letterEntry:e},e.letter)))})}var b=s(8712);function p(e){let{tags:t,sidebar:s}=e;const i=r();return(0,u.jsxs)(l.cr,{className:(0,a.c)(n.W.wrapper.blogPages,n.W.page.blogTagsListPage),children:[(0,u.jsx)(l.U7,{title:i}),(0,u.jsx)(b.c,{tag:"blog_tags_list"}),(0,u.jsxs)(c.c,{sidebar:s,children:[(0,u.jsx)(m.c,{as:"h1",children:i}),(0,u.jsx)(h,{tags:t})]})]})}},3020:(e,t,s)=>{s.d(t,{c:()=>n});s(1504);var a=s(5456),i=s(867);const r={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var l=s(7624);function n(e){let{permalink:t,label:s,count:n}=e;return(0,l.jsxs)(i.c,{href:t,className:(0,a.c)(r.tag,n?r.tagWithCount:r.tagRegular),children:[s,n&&(0,l.jsx)("span",{children:n})]})}}}]); \ No newline at end of file diff --git a/assets/js/0440a4a2.b8f030b0.js b/assets/js/0440a4a2.b8f030b0.js new file mode 100644 index 00000000..f849f3f5 --- /dev/null +++ b/assets/js/0440a4a2.b8f030b0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[5104],{5452:a=>{a.exports=JSON.parse('{"label":"GovTechSTACK","permalink":"/blog/tags/gov-tech-stack","allTagsPath":"/blog/tags","count":1,"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/061a123b.434244cb.js b/assets/js/061a123b.434244cb.js new file mode 100644 index 00000000..9a8e122e --- /dev/null +++ b/assets/js/061a123b.434244cb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[1528],{6e3:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>h,contentTitle:()=>o,default:()=>c,frontMatter:()=>i,metadata:()=>r,toc:()=>l});var s=a(7624),n=a(2172);const i={slug:"stashaway",title:"Top 3 reasons why you should start investing with StashAway today!",author:"Evan Tay",author_url:"https://github.com/DigiPie",author_title:"Wage Slave",author_image_url:"https://avatars2.githubusercontent.com/u/13582874",tags:["investing","sharing"]},o=void 0,r={permalink:"/blog/stashaway",editUrl:"https://github.com/DigiPie/kaya-folio/tree/main/website/blog/2021-03-11-stashaway.md",source:"@site/blog/2021-03-11-stashaway.md",title:"Top 3 reasons why you should start investing with StashAway today!",description:"This article was posted sometime back in early 2021 and may be outdated. Refer to SingSaver instead for updated information.",date:"2021-03-11T00:00:00.000Z",formattedDate:"March 11, 2021",tags:[{label:"investing",permalink:"/blog/tags/investing"},{label:"sharing",permalink:"/blog/tags/sharing"}],readingTime:4.47,hasTruncateMarker:!0,authors:[{name:"Evan Tay",title:"Wage Slave",url:"https://github.com/DigiPie",imageURL:"https://avatars2.githubusercontent.com/u/13582874"}],frontMatter:{slug:"stashaway",title:"Top 3 reasons why you should start investing with StashAway today!",author:"Evan Tay",author_url:"https://github.com/DigiPie",author_title:"Wage Slave",author_image_url:"https://avatars2.githubusercontent.com/u/13582874",tags:["investing","sharing"]},unlisted:!1,prevItem:{title:"Integrating PostHog product analytics with Docusaurus v2 on GitHub Pages",permalink:"/blog/docusaurus-posthog"},nextItem:{title:"GitHub Action for Docusaurus",permalink:"/blog/docusaurus-gh-action"}},h={authorsImageUrls:[void 0]},l=[{value:"Backstory",id:"backstory",level:2},{value:"1. StashAway's all-star C-suite",id:"1-stashaways-all-star-c-suite",level:2},{value:"2. No minimum amount at all",id:"2-no-minimum-amount-at-all",level:2},{value:"3. My money is safe",id:"3-my-money-is-safe",level:2},{value:"Closing note",id:"closing-note",level:2}];function d(e){const t={a:"a",admonition:"admonition",br:"br",del:"del",em:"em",h2:"h2",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,n.M)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.admonition,{title:"Deprecated",type:"caution",children:(0,s.jsxs)(t.p,{children:["This article was posted sometime back in early 2021 and may be outdated. Refer to ",(0,s.jsx)(t.a,{href:"https://www.singsaver.com.sg/investments/robo-advisory",children:"SingSaver"})," instead for updated information."]})}),"\n",(0,s.jsx)(t.admonition,{title:"Disclaimer",type:"note",children:(0,s.jsx)(t.p,{children:"This post is not sponsored, and does not constitute financial advice of any form (I bet you know better than me). Read at your own discretion."})}),"\n",(0,s.jsxs)(t.p,{children:["Signing up on ",(0,s.jsx)(t.a,{href:"https://www.stashaway.sg/referrals/tayegd",children:"StashAway"})," (a ",(0,s.jsx)(t.a,{href:"https://blog.moneysmart.sg/invest/robo-advisors-singapore/#what-are-robo-advisors",children:"robo-advisor platform"}),") back in the early 2020s was the first step in taking control of my financial health. Before that, 100% of my cash was just sitting in a POSB Savings account, growing at an incredibly pointless rate of ",(0,s.jsx)(t.a,{href:"https://www.dbs.com.sg/personal/rates-online/deposit-rates.page",children:"0.05% per annum"}),". I might as well have kept the money under my mattress."]}),"\n",(0,s.jsx)(t.h2,{id:"backstory",children:"Backstory"}),"\n",(0,s.jsxs)(t.p,{children:["I was hesitant to invest for years because I used to think any form of investment was risky. Like ",(0,s.jsx)(t.del,{children:"most"})," some Singaporeans, I ",(0,s.jsx)(t.del,{children:"am"})," was ",(0,s.jsx)(t.a,{href:"http://www.singlishdictionary.com/",children:(0,s.jsx)(t.em,{children:"kiasi"})}),". I was afraid of the unknown. What eventually changed my mind was chancing upon this article: ",(0,s.jsx)(t.a,{href:"https://thewokesalaryman.com/2020/10/16/the-big-problem-playing-it-too-safe-with-money-in-our-20s/",children:(0,s.jsx)(t.em,{children:"The big problem (of) playing it too safe with money in our 20s"})})," by ",(0,s.jsx)(t.em,{children:"thewokesalaryman"}),", and the following quote:"]}),"\n",(0,s.jsx)(t.admonition,{title:"Quote of the Day",type:"tip",children:(0,s.jsx)(t.p,{children:"Ironically, by not taking any risks and letting all your money get eroded by certain inflation, you are actually doing the riskiest thing."})}),"\n",(0,s.jsx)(t.p,{children:"This quote was the wake-up call for me to start investing, and could be yours too if you are someone who is privileged enough to start doing the same (i.e. you have the financial ability to buy bubble tea at least once a week)."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Milksha's Bubble Tea",src:a(1144).c+"",width:"960",height:"1280"})}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.em,{children:"Photo by my bubble-tea buddy Elsie Lee"}),(0,s.jsx)(t.br,{}),"\n",(0,s.jsx)(t.strong,{children:"Pictured (from left):"})," Milksha's Fresh Milk, and Izumo Matcha Milk with Honey Pearls",(0,s.jsx)(t.br,{}),"\n",(0,s.jsx)(t.strong,{children:"Is Milksha a buy?"})," Milksha isn't cheap by any stretch but you can't put a price tag on happiness ","\u2b50"]}),"\n",(0,s.jsx)(t.admonition,{title:"Pro Tip from fellow bubble-tea enthusiast Freda",type:"tip",children:(0,s.jsx)(t.p,{children:"Buy Milksha coupons from Shopee beforehand to get massive discounts!"})}),"\n",(0,s.jsxs)(t.p,{children:["Anyhow, I reasoned the best way to kick-start my investment journey would be with a robo-advisor platform, given how beginner-friendly it is, how low the commission fees are, and ",(0,s.jsx)(t.del,{children:"how lazy I am"})," given the passive and minimal-effort investment a robo-advisor offers."]}),"\n",(0,s.jsxs)(t.p,{children:["You can check out this ",(0,s.jsx)(t.a,{href:"https://dollarsandsense.sg/robo-advisors-in-singapore-what-you-need-to-know-before-investing/",children:"page"})," by ",(0,s.jsx)(t.em,{children:"dollarsandsense"})," giving an introduction to robo-advisors for more reasons why you should or should not invest with a robo-advisor platform."]}),"\n",(0,s.jsx)(t.p,{children:"I ended up choosing StashAway as my platform of choice, and here are the top 3 reasons why!"}),"\n",(0,s.jsx)(t.h2,{id:"1-stashaways-all-star-c-suite",children:"1. StashAway's all-star C-suite"}),"\n",(0,s.jsx)(t.p,{children:'StashAway is led by an "Expert Investment Team" (their words not mine) made up of the following co-founders:'}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Chief Executive Officer Michele Ferrario, a former CEO of ",(0,s.jsx)(t.a,{href:"https://www.zalora.sg/about/",children:"Zalora Group"})," and the co-founder of ",(0,s.jsx)(t.a,{href:"https://www.rocket-internet.com/",children:"Rocket Internet"})]}),"\n",(0,s.jsxs)(t.li,{children:["Chief Investment Officer Freddy Lim, a former Managing Director and Global Head of Derivatives Strategy at ",(0,s.jsx)(t.a,{href:"https://www.nomura.com/",children:"Nomura"})]}),"\n",(0,s.jsx)(t.li,{children:"Chief Technology Officer Nino Ulsamer, the co-founder and former CTO of a now-defunct (oops) software solution company for e-commerce analytics"}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"These guys have real, solid credentials. They are far more experienced in investing than an amateur like me (surprise surprise), and this assured me that my investments in StashAway would be handled by well-informed and secure hands."}),"\n",(0,s.jsxs)(t.p,{children:["Credentials aside, they also have a proven track record of high returns for most of their portfolios. Despite how volatile and uncertain 2020 was, I achieved an ",(0,s.jsxs)(t.strong,{children:["impressive 19.59% ",(0,s.jsx)(t.a,{href:"https://www.investopedia.com/terms/t/time-weightedror.asp",children:"time-weighted return"})]})," for my portfolio of ",(0,s.jsx)(t.a,{href:"https://www.stashaway.sg/r/what-is-the-stashaway-risk-index",children:"StashAway Risk Index"})," 22%, between 3rd of February 2020, and 10th of March, 2021."]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Evan's StashAway returns",src:a(1403).c+"",width:"899",height:"184"})}),"\n",(0,s.jsxs)(t.p,{children:["To find out how well StashAway's portfolios performed at other risk-levels, check out their article: ",(0,s.jsx)(t.a,{href:"https://www.stashaway.my/r/our-returns-2020",children:(0,s.jsx)(t.em,{children:"Our Returns in 2020"})}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"2-no-minimum-amount-at-all",children:"2. No minimum amount at all"}),"\n",(0,s.jsxs)(t.p,{children:["Another robo-advisor platform I was considering at the time was ",(0,s.jsx)(t.a,{href:"https://endowus.com/",children:"EndowUs"}),". However, I ultimately went with StashAway because while EndowUs had a minimum investment amount of $10,000.00 (added cents for emphasis), ",(0,s.jsx)(t.strong,{children:"StashAway had no minimum amount at all"}),". This is still the case as of 11 March 2021."]}),"\n",(0,s.jsx)(t.p,{children:"As someone new to investing, the decision to invest $10,000 all at once was too intimidating for me to make. More importantly, I was still a student back then, one who did not have that many digits in his bank account. Therefore, StashAway was a natural choice for its low entry barrier!"}),"\n",(0,s.jsx)(t.h2,{id:"3-my-money-is-safe",children:"3. My money is safe"}),"\n",(0,s.jsx)(t.p,{children:"Naturally, I was concerned about how safe using StashAway would be. More specifically, I was worried about losing my initial investment of $100 in StashAway, in the event of StashAway filing for bankruptcy. As it turned out, it was an unfound concern given that:"}),"\n",(0,s.jsxs)(t.admonition,{title:"Quote",type:"note",children:[(0,s.jsx)(t.p,{children:"Your money is kept entirely separate from StashAway's finances. To ensure that we never touch your money, we use custodian banks that hold your money, whether it's in cash or in securities."}),(0,s.jsx)(t.p,{children:"In these custodian institutions, your assets are always in a segregated account-- one that is separate from StashAway's operations and assets. This means that you will always have full access and claim to your assets no matter what happens to StashAway."})]}),"\n",(0,s.jsxs)(t.p,{children:["You can read more about StashAway's Frequently Asked Questions ",(0,s.jsx)(t.a,{href:"https://www.stashaway.sg/faq/115003747047-what-happens-to-my-money-if-stashaway-gets-acquired-goes-public-or-closes",children:"here"}),". Do your own research ",(0,s.jsx)(t.em,{children:"hor"}),"!"]}),"\n",(0,s.jsx)(t.h2,{id:"closing-note",children:"Closing note"}),"\n",(0,s.jsxs)(t.p,{children:["I hope you found this post/rambling/",(0,s.jsx)(t.em,{children:"thing"})," (*gestures wildly at everything) insightful in any way. If you are still interested in StashAway, but not entirely convinced by me (I\u2019ll try not to take it personally), you can check out this ",(0,s.jsx)(t.a,{href:"https://www.youtube.com/watch?v=0IvyrANMz78",children:"video"})," by ",(0,s.jsx)(t.em,{children:"Kevin Learns Investing"}),". All the best with getting financially fit!"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.em,{children:"Special thanks to Vanessa Tay for editing this!"})})]})}function c(e={}){const{wrapper:t}={...(0,n.M)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},1144:(e,t,a)=>{a.d(t,{c:()=>s});const s=a.p+"assets/images/bubbletea-4acc6e9960cd794bcb3fd3f5e1b6a217.jpg"},1403:(e,t,a)=>{a.d(t,{c:()=>s});const s=a.p+"assets/images/stashaway_returns-256d650580fc97ddb678ec06b3aa49ba.png"},2172:(e,t,a)=>{a.d(t,{I:()=>r,M:()=>o});var s=a(1504);const n={},i=s.createContext(n);function o(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0d0c74f6.2f4c9065.js b/assets/js/0d0c74f6.2f4c9065.js new file mode 100644 index 00000000..6f6540a7 --- /dev/null +++ b/assets/js/0d0c74f6.2f4c9065.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[6220],{4932:(e,t,i)=>{i.r(t),i.d(t,{ProjectListing:()=>x,ProjectListings:()=>j,default:()=>y});var o=i(1504),s=i(5592),a=i(5456),n=i(867),r=i(964),c=i(8264),l=i(9012),h=i(792),d=i(5896),p=i(9472);const m={projectPageHeader:"projectPageHeader_YTeS",projectItem:"projectItem___un",projectItemButton:"projectItemButton_CuAo",directory:"directory_sHAu",projectItemBackButton:"projectItemBackButton_g1Ck"};var u=i(7624);const g=[{category:"Project",title:"nodejs-mysql-cloudformation",slug:"#nodejs-mysql-cloudformation",subtitle:"An example for deploying a NodeJS app to Beanstalk using AWS CloudFormation.",period:"November 2020",tech:"AWS CloudFormation",description:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)("p",{children:"An example of how you can perform Infrastructure-As-Code (IaC) using AWS CloudFormation and Continuous-Integration/Continuous-Deployment (CI/CD) using AWS CodePipeline."}),(0,u.jsxs)("p",{children:["This example deploys the NodeJS-ExpressJS-MySQL Create-Read-Update-Delete (CRUD) application at"," ",(0,u.jsx)("a",{href:"https://github.com/DigiPie/nodejs-mysql-aws-beanstalk",children:"DigiPie/nodejs-mysql-aws-beanstalk"}),", by using the CloudFormation IaC templates in this repository and setting up a simple AWS CodePipeline."]}),(0,u.jsxs)("p",{children:["I worked on this project to learn more about the"," ",(0,u.jsx)("a",{href:"https://www.hashicorp.com/resources/getting-started-with-infrastructure-as-code-iac",children:"Infrastructure-as-Code"})," ","concept and"," ",(0,u.jsx)("a",{href:"https://aws.amazon.com/cloudformation/",children:"AWS CloudFormation"}),"."]})]}),links:[{name:"GitHub repository",link:"https://github.com/DigiPie/nodejs-mysql-cloudformation"}]},{category:"Website",title:"KayaFolio",slug:"#kaya-folio",imageUrl:"img/projects/kayafolio.png",subtitle:"A software engineer portfolio template built with Docusaurus 3.0 and ReactJS.",period:"October 2020 to Present",tech:"Docusaurus 3.0, ReactJS",description:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)("p",{children:"I first started this portfolio template project back in October 2020. The template has gone through numerous iterations ever since, and is still updated presently."}),(0,u.jsxs)("p",{children:["I built it using"," ",(0,u.jsx)("a",{href:"https://docusaurus.io/",target:"_blank",children:"Docusaurus 3.0"})," ","and"," ",(0,u.jsx)("a",{href:"https://reactjs.org/",target:"_blank",children:"ReactJS"}),"."]}),(0,u.jsxs)("p",{children:[(0,u.jsx)("a",{href:"https://github.com/DigiPie/kaya-folio/workflows/deploy-docusaurus/badge.svg",children:(0,u.jsx)("img",{src:"https://github.com/DigiPie/kaya-folio/workflows/deploy-docusaurus/badge.svg"})})," ",(0,u.jsx)("a",{href:"https://camo.githubusercontent.com/399d62140ec640c832d3c3390f39e2df16086f415f7a6723bd803baca2062627/68747470733a2f2f696d672e736869656c64732e696f2f776562736974653f75726c3d68747470732533412532462532466576616e7461792e636f6d",children:(0,u.jsx)("img",{src:"https://camo.githubusercontent.com/399d62140ec640c832d3c3390f39e2df16086f415f7a6723bd803baca2062627/68747470733a2f2f696d672e736869656c64732e696f2f776562736974653f75726c3d68747470732533412532462532466576616e7461792e636f6d"})})]}),(0,u.jsxs)("p",{children:["I wrote this template for my own use but you are free to use it as long as you credit me. Check out the"," ",(0,u.jsx)("a",{href:"https://github.com/DigiPie/kaya-folio",children:"GitHub repository"})," ","for how to do so."]})]}),links:[{name:"GitHub repository",link:"https://github.com/DigiPie/kaya-folio"},{name:"Website",link:"https://evantay.com/"},{name:"Blog post: History of EvanTay.com",link:"http://evantay.com/blog/history"}]},{category:"Project",title:"mocha-chai-mongoose",slug:"#mocha-chai-mongoose",imageUrl:"img/projects/mochai.png",subtitle:"An example for testing a NodeJS-MongoDB app with Mocha-Chai.",period:"April 2020",tech:"Mocha, Chai, NodeJS, ExpressJS, MongoDB",description:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)("p",{children:"An up-to-date 2020 example of how you can use Mocha and Chai to perform API testing for a Node-ExpressJS-Mongoose app. You will be able to test your code locally and also automatically using Github Action."}),(0,u.jsx)("p",{children:(0,u.jsx)("a",{href:"https://github.com/DigiPie/mocha-chai-mongoose/workflows/Node.js%20CI/badge.svg",title:"Node.js CI",children:(0,u.jsx)("img",{src:"https://github.com/DigiPie/mocha-chai-mongoose/workflows/Node.js%20CI/badge.svg"})})}),(0,u.jsxs)("p",{children:["I worked on this project to learn more about API testing using"," ",(0,u.jsx)("a",{href:"https://mochajs.org/",children:"Mocha"})," and"," ",(0,u.jsx)("a",{href:"https://www.chaijs.com/",children:"Chai"}),", and also to practice setting up a NodeJS-ExpressJS-Mongoose backend application."]})]}),links:[{name:"GitHub repository",link:"https://github.com/DigiPie/mocha-chai-mongoose"}]},{category:"Open Source Tool",title:"Mongo-Action",slug:"#mongo-action",imageUrl:"img/projects/mongo-action.png",subtitle:"A Github action which creates a mongo Docker container.",period:"March 2020",tech:"GitHub Action, NodeJS, Docker",description:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsxs)("p",{children:["mongo-action is a Github Action which creates a mongo Docker container using the official"," ",(0,u.jsx)("a",{href:"https://hub.docker.com/_/mongo",children:"Dockerhub image"}),". The MongoDB instance's port will be exposed to other containers and also to the host running the Github Workflow."]}),(0,u.jsx)("p",{children:(0,u.jsx)("a",{href:"https://github.com/DigiPie/mongo-action/workflows/mongo-action%20CI/badge.svg",title:"mongo-action CI",children:(0,u.jsx)("img",{src:"https://github.com/DigiPie/mongo-action/workflows/mongo-action%20CI/badge.svg"})})}),(0,u.jsxs)("p",{children:["I created this Github Action to learn more about Continuous Integration tooling, and to simplify automated testing for my own"," ",(0,u.jsx)("a",{href:"https://github.com/DigiPie/mocha-chai-mongoose",children:"Node-ExpressJS-Mongoose"})," ","project."]}),(0,u.jsx)("p",{children:"By using this Github Action, there is no longer a need to provision a test database on MongoDB Atlas or elsewhere. Furthermore, each test will run on a fresh, isolated copy of a MongoDB instance."}),(0,u.jsxs)("p",{children:["I submitted this to the"," ",(0,u.jsx)("a",{href:"https://githubhackathon.com/",children:"Github Hackathon for Github Actions"}),"."]})]}),links:[{name:"GitHub repository",link:"https://github.com/DigiPie/mongo-action"},{name:"GitHub Marketplace",link:"https://github.com/marketplace/actions/mongo-action"}]},{category:"Website",title:"Google Developer Student Club NUS",slug:"#dsc-nus",imageUrl:"img/projects/dscnustech.png",subtitle:"DSC NUS tech team's website for workshop registration and materials.",period:"January to March 2020",tech:"Jekyll, Bootstrap, Github pages",team:[{name:"Andre Wong",link:"https://github.com/AndreWongZH/"},{name:"Evan Tay",link:"https://github.com/DigiPie/"},{name:"Melodies Sim",link:"https://github.com/Happytreat/"}],description:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)("p",{children:"Developer Student Club, National University of Singapore is made up of people from diverse backgrounds, majors, years of study, genders and races. We come together to push our mission of #techforgood."}),(0,u.jsx)("p",{children:"The Technology team is responsible for the execution of DSC-NUS workshops and thematic tech events. I co-lead the team as the Deputy Head of Technology."}),(0,u.jsx)("p",{children:"We created this website to act as a one-stop portal for NUS students to find out more about our workshops, register for them, and access past workshop materials."})]}),links:[{name:"GitHub repository",link:"https://github.com/dscnustech/dscnustech.github.io"},{name:"Website",link:"https://dscnustech.github.io/"}]},{category:"Project",title:"DigiCourse",slug:"#digicourse",imageUrl:"img/projects/digicourse.png",subtitle:"A full-stack course platform with forum and enrolment features.",period:"September to November 2019",tech:"NodeJS, ExpressJS, PostgreSQL, Herokuapp",team:[{name:"Bryan Koh",link:"https://github.com/awarenessxz/"},{name:"Evan Tay",link:"https://github.com/DigiPie/"},{name:"Jacqueline Cheong",link:"https://github.com/Aquarinte/"},{name:"Lee Tze Ting",link:"https://github.com/halcyoneee/"}],description:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)("p",{children:"A course management platform where student-teacher interactions can take place seamlessly online."}),(0,u.jsxs)("p",{children:["We worked on DigiCourse under National University of Singapore's"," ",(0,u.jsx)("a",{href:"https://nusmods.com/modules/CS2102/database-systems",children:"CS2102: Database Systems"}),". It is a database-centric project which features two major components, a course enrolment system, and a forum system."]}),(0,u.jsxs)("p",{children:["DigiCourse is continuously deployed from Github to Herokuapp, with the aid of Heroku build-packs such as the"," ",(0,u.jsx)("a",{href:"https://github.com/DigiPie/psql-heroku-buildpack",children:"psql-heroku-buildpack"}),". I wrote this build pack to automate the execution of a PostgreSQL setup script file on deployment to Heroku."]})]}),links:[{name:"GitHub repository",link:"https://github.com/DigiPie/DigiCourse"}]},{category:"Project",title:"Dynalite",slug:"#dynalite",imageUrl:"img/projects/dynalite.png",subtitle:"A full-stack Internet-of-Things occupancy visualisation application.",period:"September to November 2019",tech:"Raspberry-Pi, Python, COAP, NodeJS, ExpressJS, PostgreSQL, ReactJS, Docker",team:[{name:"Evan Tay",link:"https://github.com/DigiPie/"},{name:"Joyce Yeo",link:"https://github.com/pikulet/"},{name:"Matthew Lee",link:"https://github.com/crazoter/"},{name:"Melodies Sim",link:"https://github.com/Happytreat/"}],description:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)("p",{children:"Dynalite is an Internet-of-Things application which performs dynamic visualisation of room occupancy."}),(0,u.jsxs)("p",{children:["We worked on Dynalite under National University of Singapore's"," ",(0,u.jsx)("a",{href:"https://nusmods.com/modules/CS3103/computer-networks-practice",children:"CS3103: Computer Networks Practice"}),". It is an Internet-of-Things application which performs dynamic visualisation of room occupancy."]}),(0,u.jsx)("p",{children:"Dynalite was built using 3 Docker containers and 1 Raspberry Pi. The RPi reads light data and sends it via COAP to the first Docker container containing a backend NodeJS-ExpressJS web server."}),(0,u.jsx)("p",{children:"The backend server authenticates and stores the measurements into a PostgreSQL database stored in the second Docker container."}),(0,u.jsx)("p",{children:"The backend server also provides a HTTP REST API which is used by a frontend React web server in the third Docker container."})]}),links:[{name:"GitHub repository",link:"https://github.com/DigiPie/dynalite"},{name:"Presentation Slides (PDF)",link:"https://evantay.com/pdf/dynalite.pdf"}]},{category:"Open Source Tool",title:"psql-heroku-buildpack",slug:"#psql-heroku-buildpack",subtitle:"A Heroku buildpack which executes a PostgreSQL script file on deployment.",period:"September 2019",tech:"Herokuapp, PostgreSQL",description:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)("p",{children:"psql-heroku-buildpack is a buildpack which executes a PostgreSQL script file on deployment to Heroku."}),(0,u.jsx)("p",{children:"I developed this buildpack while working on DigiCourse, a full-stack application built on PostgreSQL. I wrote this build pack to automate the execution of a PostgreSQL setup script file in the Git repo on deployment to Heroku from Github."})]}),links:[{name:"GitHub repository",link:"https://github.com/DigiPie/psql-heroku-buildpack"}],bgColor:"alternate"},{category:"Project",title:"BrainTrain",slug:"#braintrain",imageUrl:"img/projects/braintrain.png",subtitle:"A spaced-repetition flashcard desktop application built in Java and JUnit5.",period:"March to April 2019",tech:"Java, JUnit5, JavaFx, OpenCSV",team:[{name:"Evan Tay",link:"https://github.com/DigiPie/"},{name:"Eugene Foo",link:"https://github.com/eugenefdw/"},{name:"Lee Tze Ting",link:"https://github.com/halcyoneee/"}],description:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsxs)("p",{children:["BrainTrain is a spaced-repetition flashcard application which makes memorizing easy and effective. With BrainTrain\u2019s"," ",(0,u.jsx)("a",{href:"https://www.theguardian.com/education/2016/jan/23/spaced-repetition-a-hack-to-make-your-brain-store-information",children:"Spaced Repetition System (SRS)"})," ","optimizing your flashcard revision intervals, you will be able to learn more in less time."]}),(0,u.jsxs)("p",{children:[(0,u.jsx)("a",{href:"https://travis-ci.org/CS2103-AY1819S2-W14-1/main",title:"Build status",children:(0,u.jsx)("img",{src:"https://travis-ci.org/CS2103-AY1819S2-W14-1/main.svg?branch=master"})})," ",(0,u.jsx)("a",{href:"https://ci.appveyor.com/project/eugenefdw/main",title:"Build status",children:(0,u.jsx)("img",{src:"https://ci.appveyor.com/api/projects/status/vl6bo937loonr7x3?svg=true"})})," ",(0,u.jsx)("a",{href:"https://coveralls.io/github/CS2103-AY1819S2-W14-1/main?branch=master",title:"Coverage status",children:(0,u.jsx)("img",{src:"https://coveralls.io/repos/github/CS2103-AY1819S2-W14-1/main/badge.svg?branch=master"})})," "]}),(0,u.jsxs)("p",{children:["We worked on BrainTrain under National University of Singapore's"," ",(0,u.jsx)("a",{href:"https://nusmods.com/modules/CS2103T/software-engineering",children:"CS2103T: Software Engineering"}),". My primary responsibility was to design and develop the Card Management System. My secondary responsibility was to act as the project\u2019s documentation lead. To find out more, view my"," ",(0,u.jsx)("a",{href:"https://digipie.github.io/BrainTrain/team/digipie.html",children:"project portfolio page"}),"."]})]}),links:[{name:"GitHub repository",link:"https://github.com/DigiPie/BrainTrain"},{name:"Project documentation",link:"https://digipie.github.io/BrainTrain/index.html"},{name:"Project portfolio page",link:"https://digipie.github.io/BrainTrain/team/digipie.html"}]},{category:"Game",title:"Glory: Tales of Yi-Shun",slug:"#glory",imageUrl:"img/projects/glory.png",subtitle:"A 2D hack-and-slash action survival game built using Unity and C#.",period:"May to September 2018",tech:"Unity, C#",team:[{name:"Evan Tay",link:"https://github.com/DigiPie/"},{name:"Lim Xuan Hao",link:"https://github.com/Lunastryke/"}],description:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)("p",{children:"In Glory, you play as Yi-Shun, the last remaining swordsman of the great city of Sandosa. The undead warlord Ma Ti and his minions are advancing on the city and only you can stop them."}),(0,u.jsxs)("p",{children:["We worked on this project under National University of Singapore's"," ",(0,u.jsxs)("a",{href:"http://nusskylab-dev.comp.nus.edu.sg/",children:["CP2106: Independent Software Development Project (Orbital)"," "]}),". This module was conducted during the summer break."]}),(0,u.jsx)("p",{children:"We were one of the top 11 out of 211 teams which received an award (Honorable Mention), and a Google Chromecast each from Google Singapore."})]}),links:[{name:"GitHub repository",link:"https://github.com/DigiPie/Glory"},{name:"Itch.io (Download and Play)",link:"https://digipie.itch.io/glory"}]}];function b(e){let t,{category:i,size:o="1x"}=e;switch(i){case"Project":default:t=d.$cR;break;case"Open Source Tool":t=d.Cq1;break;case"Website":t=p.I1R;break;case"Game":t=d.wB$}return(0,u.jsx)(h.u,{alt:i,size:o,icon:t})}function j(){return(0,u.jsx)("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-6 md:gap-4 px-4 md:px-0",children:g.map((e=>(0,u.jsx)("div",{id:e.title,className:"bg-secondary-800 hover:bg-secondary-900 transition rounded-lg overflow-hidden",children:(0,u.jsxs)(n.c,{to:(0,r.c)(e.slug),className:"block h-full text-white hover:text-white no-underline hover:no-underline",children:[e.imageUrl?(0,u.jsx)("div",{className:"overflow-hidden h-40 md:h-48",children:(0,u.jsx)("img",{src:(0,r.c)(e.imageUrl),alt:e.title})}):(0,u.jsx)("div",{className:"alternate"==e.bgColor?"overflow-hidden bg-danger h-40 md:h-48":"overflow-hidden bg-success h-40 md:h-48",children:(0,u.jsx)("h2",{className:"m-3 inline-block",children:e.title})}),(0,u.jsxs)("div",{className:"pt-4 px-4",children:[(0,u.jsx)("h3",{className:"mb-1",children:e.title}),(0,u.jsx)("p",{className:"text-s mb-2 text-secondary-500",children:e.period}),(0,u.jsx)("p",{children:e.subtitle}),(0,u.jsx)("p",{className:"text-primary-default font-bold",children:"Read more"})]})]})},e.title+"-card")))})}function x(e){const t=e.projectItem;return(0,u.jsxs)("div",{className:(0,a.c)("text--center margin-bottom--xl px-4",m.projectItem),children:[(0,u.jsx)(n.c,{to:(0,r.c)("/projects"),children:(0,u.jsx)("button",{className:"border-0 rounded py-2 px-4 mb-2 bg-primary-900 hover:bg-primary-800 transition text-white text-lg cursor-pointer",children:"Back"})}),(0,u.jsx)("h1",{children:t.title}),(0,u.jsx)("h2",{children:t.subtitle}),t.imageUrl&&(0,u.jsx)("img",{src:(0,r.c)(t.imageUrl),alt:t.title}),(0,u.jsxs)("div",{children:[(0,u.jsxs)("ul",{children:[(0,u.jsxs)("li",{children:[(0,u.jsx)(b,{category:t.category})," ",t.category]}),(0,u.jsxs)("li",{children:[(0,u.jsx)(h.u,{alt:"Calendar",icon:d.Ujh})," ",t.period]}),(0,u.jsxs)("li",{children:[(0,u.jsx)(h.u,{alt:"Code",icon:d.YV1})," ",t.tech]}),t.team&&(0,u.jsxs)("li",{children:[(0,u.jsx)(h.u,{alt:"Team",icon:d.c9t})," ",t.team.map(((e,i)=>(0,u.jsxs)("span",{children:[e.link&&(0,u.jsx)("a",{href:e.link,children:e.name}),!e.link&&e.name,i(0,u.jsx)("li",{children:(0,u.jsxs)("a",{href:e.link,children:[(0,u.jsx)(h.u,{alt:"Link",icon:d.Y$m})," ",e.name]})},t)))})]})]}),(0,u.jsx)(n.c,{to:(0,r.c)("/projects"),children:(0,u.jsx)("button",{className:"border-0 rounded py-2 px-4 bg-primary-900 hover:bg-primary-800 transition text-white text-lg cursor-pointer",children:"More projects"})})]})}function f(){return(0,u.jsx)("section",{className:m.directory,children:(0,u.jsxs)("div",{className:"container",children:[(0,u.jsx)("h3",{children:"Continue exploring?"}),(0,u.jsxs)("nav",{className:"pagination-nav",children:[(0,u.jsx)("div",{className:"pagination-nav__item",children:(0,u.jsxs)(n.c,{className:"pagination-nav__link",to:(0,r.c)("blog/"),children:[(0,u.jsx)("div",{className:"pagination-nav__sublabel",children:"Read"}),(0,u.jsx)("div",{className:"pagination-nav__label",children:"My blog"})]})}),(0,u.jsx)("div",{className:"pagination-nav__item pagination-nav__item--next",children:(0,u.jsxs)("a",{className:"pagination-nav__link",href:(0,r.c)("pdf/resume.pdf"),children:[(0,u.jsx)("div",{className:"pagination-nav__sublabel",children:"Download"}),(0,u.jsx)("div",{className:"pagination-nav__label",children:"My resume"})]})})]})]})})}function y(){const e=(0,c.c)(),{siteConfig:t={}}=e,[i,a]=(0,o.useState)(!1),[n,r]=(0,o.useState)(!1),[h,d]=(0,o.useState)(g[0]),p=(0,s.IT)();return(0,o.useEffect)((()=>{!function(){let e;p.hash&&(e=g.find((e=>e.slug==p.hash))),e?(d(e),r(!0),window.scrollTo(0,0)):r(!1),a(!0)}()})),(0,u.jsxs)(l.c,{title:"Projects",description:t.tagline,children:[(0,u.jsx)("header",{className:m.projectPageHeader,children:(0,u.jsx)("h2",{className:"border-0 border-b-4 border-solid border-success",children:"My projects"})}),i&&(0,u.jsxs)("main",{children:[(0,u.jsx)("div",{className:"py-6 md:py-12",children:(0,u.jsxs)("div",{className:"my-0 mx-auto max-w-7xl",children:[!n&&(0,u.jsx)(j,{}),n&&(0,u.jsx)(x,{projectItem:h})]})}),(0,u.jsx)(f,{})]})]})}}}]); \ No newline at end of file diff --git a/assets/js/17896441.787ce50c.js b/assets/js/17896441.787ce50c.js new file mode 100644 index 00000000..6379d8cc --- /dev/null +++ b/assets/js/17896441.787ce50c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[6752],{5104:(e,t,n)=>{n.r(t),n.d(t,{default:()=>de});var s=n(1504),a=n(5756),l=n(1100),i=n(7624);const o=s.createContext(null);function c(e){let{children:t,content:n}=e;const a=function(e){return(0,s.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(n);return(0,i.jsx)(o.Provider,{value:a,children:t})}function r(){const e=(0,s.useContext)(o);if(null===e)throw new l.AH("DocProvider");return e}function d(){var e;const{metadata:t,frontMatter:n,assets:s}=r();return(0,i.jsx)(a.U7,{title:t.title,description:t.description,keywords:n.keywords,image:null!=(e=s.image)?e:n.image})}var u=n(5456),m=n(1432),h=n(4357),v=n(308);function b(e){const{previous:t,next:n}=e;return(0,i.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,h.G)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[t&&(0,i.jsx)(v.c,{...t,subLabel:(0,i.jsx)(h.c,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),n&&(0,i.jsx)(v.c,{...n,subLabel:(0,i.jsx)(h.c,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}function x(){const{metadata:e}=r();return(0,i.jsx)(b,{previous:e.previous,next:e.next})}var p=n(8264),f=n(867),j=n(2840),g=n(5864),L=n(4592),C=n(9920);const N={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,i.jsx)(h.c,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:(0,i.jsx)("b",{children:n.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,i.jsx)(h.c,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:(0,i.jsx)("b",{children:n.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function _(e){const t=N[e.versionMetadata.banner];return(0,i.jsx)(t,{...e})}function T(e){let{versionLabel:t,to:n,onClick:s}=e;return(0,i.jsx)(h.c,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:(0,i.jsx)("b",{children:(0,i.jsx)(f.c,{to:n,onClick:s,children:(0,i.jsx)(h.c,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function U(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:s}}=(0,p.c)(),{pluginId:a}=(0,j.UF)({failfast:!0}),{savePreferredVersionName:l}=(0,L.iy)(a),{latestDocSuggestion:o,latestVersionSuggestion:c}=(0,j.i8)(a),r=null!=o?o:(d=c).docs.find((e=>e.id===d.mainDocId));var d;return(0,i.jsxs)("div",{className:(0,u.c)(t,g.W.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,i.jsx)("div",{children:(0,i.jsx)(_,{siteTitle:s,versionMetadata:n})}),(0,i.jsx)("div",{className:"margin-top--md",children:(0,i.jsx)(T,{versionLabel:c.label,to:r.path,onClick:()=>l(c.name)})})]})}function k(e){let{className:t}=e;const n=(0,C.E)();return n.banner?(0,i.jsx)(U,{className:t,versionMetadata:n}):null}function y(e){let{className:t}=e;const n=(0,C.E)();return n.badge?(0,i.jsx)("span",{className:(0,u.c)(t,g.W.docs.docVersionBadge,"badge badge--secondary"),children:(0,i.jsx)(h.c,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label},children:"Version: {versionLabel}"})}):null}function H(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n}=e;return(0,i.jsx)(h.c,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:(0,i.jsx)("b",{children:(0,i.jsx)("time",{dateTime:new Date(1e3*t).toISOString(),children:n})})},children:" on {date}"})}function A(e){let{lastUpdatedBy:t}=e;return(0,i.jsx)(h.c,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:(0,i.jsx)("b",{children:t})},children:" by {user}"})}function w(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n,lastUpdatedBy:s}=e;return(0,i.jsxs)("span",{className:g.W.common.lastUpdated,children:[(0,i.jsx)(h.c,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t&&n?(0,i.jsx)(H,{lastUpdatedAt:t,formattedLastUpdatedAt:n}):"",byUser:s?(0,i.jsx)(A,{lastUpdatedBy:s}):""},children:"Last updated{atDate}{byUser}"}),!1]})}var M=n(7790),B=n(1096);const I={lastUpdated:"lastUpdated_vwxv"};function E(e){return(0,i.jsx)("div",{className:(0,u.c)(g.W.docs.docFooterTagsRow,"row margin-bottom--sm"),children:(0,i.jsx)("div",{className:"col",children:(0,i.jsx)(B.c,{...e})})})}function O(e){let{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s,formattedLastUpdatedAt:a}=e;return(0,i.jsxs)("div",{className:(0,u.c)(g.W.docs.docFooterEditMetaRow,"row"),children:[(0,i.jsx)("div",{className:"col",children:t&&(0,i.jsx)(M.c,{editUrl:t})}),(0,i.jsx)("div",{className:(0,u.c)("col",I.lastUpdated),children:(n||s)&&(0,i.jsx)(w,{lastUpdatedAt:n,formattedLastUpdatedAt:a,lastUpdatedBy:s})})]})}function S(){const{metadata:e}=r(),{editUrl:t,lastUpdatedAt:n,formattedLastUpdatedAt:s,lastUpdatedBy:a,tags:l}=e,o=l.length>0,c=!!(t||n||a);return o||c?(0,i.jsxs)("footer",{className:(0,u.c)(g.W.docs.docFooter,"docusaurus-mt-lg"),children:[o&&(0,i.jsx)(E,{tags:l}),c&&(0,i.jsx)(O,{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:a,formattedLastUpdatedAt:s})]}):null}var V=n(8448),P=n(3088);const W={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function D(e){let{collapsed:t,...n}=e;return(0,i.jsx)("button",{type:"button",...n,className:(0,u.c)("clean-btn",W.tocCollapsibleButton,!t&&W.tocCollapsibleButtonExpanded,n.className),children:(0,i.jsx)(h.c,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component",children:"On this page"})})}const R={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function F(e){let{toc:t,className:n,minHeadingLevel:s,maxHeadingLevel:a}=e;const{collapsed:l,toggleCollapsed:o}=(0,V.a)({initialState:!0});return(0,i.jsxs)("div",{className:(0,u.c)(R.tocCollapsible,!l&&R.tocCollapsibleExpanded,n),children:[(0,i.jsx)(D,{collapsed:l,onClick:o}),(0,i.jsx)(V.U,{lazy:!0,className:R.tocCollapsibleContent,collapsed:l,children:(0,i.jsx)(P.c,{toc:t,minHeadingLevel:s,maxHeadingLevel:a})})]})}const z={tocMobile:"tocMobile_ITEo"};function G(){const{toc:e,frontMatter:t}=r();return(0,i.jsx)(F,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,u.c)(g.W.docs.docTocMobile,z.tocMobile)})}var q=n(5124);function Y(){const{toc:e,frontMatter:t}=r();return(0,i.jsx)(q.c,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:g.W.docs.docTocDesktop})}var Z=n(6448),J=n(9444);function K(e){let{children:t}=e;const n=function(){const{metadata:e,frontMatter:t,contentTitle:n}=r();return t.hide_title||void 0!==n?null:e.title}();return(0,i.jsxs)("div",{className:(0,u.c)(g.W.docs.docMarkdown,"markdown"),children:[n&&(0,i.jsx)("header",{children:(0,i.jsx)(Z.c,{as:"h1",children:n})}),(0,i.jsx)(J.c,{children:t})]})}var Q=n(9940),X=n(3376),$=n(964);function ee(e){return(0,i.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,i.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})})}const te={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function ne(){const e=(0,$.c)("/");return(0,i.jsx)("li",{className:"breadcrumbs__item",children:(0,i.jsx)(f.c,{"aria-label":(0,h.G)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,i.jsx)(ee,{className:te.breadcrumbHomeIcon})})})}const se={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function ae(e){let{children:t,href:n,isLast:s}=e;const a="breadcrumbs__link";return s?(0,i.jsx)("span",{className:a,itemProp:"name",children:t}):n?(0,i.jsx)(f.c,{className:a,href:n,itemProp:"item",children:(0,i.jsx)("span",{itemProp:"name",children:t})}):(0,i.jsx)("span",{className:a,children:t})}function le(e){let{children:t,active:n,index:s,addMicrodata:a}=e;return(0,i.jsxs)("li",{...a&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},className:(0,u.c)("breadcrumbs__item",{"breadcrumbs__item--active":n}),children:[t,(0,i.jsx)("meta",{itemProp:"position",content:String(s+1)})]})}function ie(){const e=(0,Q.js)(),t=(0,X.Y5)();return e?(0,i.jsx)("nav",{className:(0,u.c)(g.W.docs.docBreadcrumbs,se.breadcrumbsContainer),"aria-label":(0,h.G)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,i.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[t&&(0,i.jsx)(ne,{}),e.map(((t,n)=>{const s=n===e.length-1,a="category"===t.type&&t.linkUnlisted?void 0:t.href;return(0,i.jsx)(le,{active:s,index:n,addMicrodata:!!a,children:(0,i.jsx)(ae,{href:a,isLast:s,children:t.label})},n)}))]})}):null}var oe=n(1528);const ce={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function re(e){let{children:t}=e;const n=function(){const{frontMatter:e,toc:t}=r(),n=(0,m.U)(),s=e.hide_table_of_contents,a=!s&&t.length>0;return{hidden:s,mobile:a?(0,i.jsx)(G,{}):void 0,desktop:!a||"desktop"!==n&&"ssr"!==n?void 0:(0,i.jsx)(Y,{})}}(),{metadata:{unlisted:s}}=r();return(0,i.jsxs)("div",{className:"row",children:[(0,i.jsxs)("div",{className:(0,u.c)("col",!n.hidden&&ce.docItemCol),children:[s&&(0,i.jsx)(oe.c,{}),(0,i.jsx)(k,{}),(0,i.jsxs)("div",{className:ce.docItemContainer,children:[(0,i.jsxs)("article",{children:[(0,i.jsx)(ie,{}),(0,i.jsx)(y,{}),n.mobile,(0,i.jsx)(K,{children:t}),(0,i.jsx)(S,{})]}),(0,i.jsx)(x,{})]})]}),n.desktop&&(0,i.jsx)("div",{className:"col col--3",children:n.desktop})]})}function de(e){const t="docs-doc-id-"+e.content.metadata.id,n=e.content;return(0,i.jsx)(c,{content:e.content,children:(0,i.jsxs)(a.cr,{className:t,children:[(0,i.jsx)(d,{}),(0,i.jsx)(re,{children:(0,i.jsx)(n,{})})]})})}},5124:(e,t,n)=>{n.d(t,{c:()=>r});n(1504);var s=n(5456),a=n(3088);const l={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var i=n(7624);const o="table-of-contents__link toc-highlight",c="table-of-contents__link--active";function r(e){let{className:t,...n}=e;return(0,i.jsx)("div",{className:(0,s.c)(l.tableOfContents,"thin-scrollbar",t),children:(0,i.jsx)(a.c,{...n,linkClassName:o,linkActiveClassName:c})})}},3088:(e,t,n)=>{n.d(t,{c:()=>b});var s=n(1504),a=n(1824);function l(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const s=n.slice(2,e.level);e.parentIndex=Math.max(...s),n[e.level]=t}));const s=[];return t.forEach((e=>{const{parentIndex:n,...a}=e;n>=0?t[n].children.push(a):s.push(a)})),s}function i(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:s}=e;return t.flatMap((e=>{const t=i({toc:e.children,minHeadingLevel:n,maxHeadingLevel:s});return function(e){return e.level>=n&&e.level<=s}(e)?[{...e,children:t}]:t}))}function o(e){const t=e.getBoundingClientRect();return t.top===t.bottom?o(e.parentNode):t}function c(e,t){var n;let{anchorTopOffset:s}=t;const a=e.find((e=>o(e).top>=s));if(a){var l;return function(e){return e.top>0&&e.bottom{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function d(e){const t=(0,s.useRef)(void 0),n=r();(0,s.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:s,linkActiveClassName:a,minHeadingLevel:l,maxHeadingLevel:i}=e;function o(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(s),o=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const s=[];for(let a=t;a<=n;a+=1)s.push("h"+a+".anchor");return Array.from(document.querySelectorAll(s.join()))}({minHeadingLevel:l,maxHeadingLevel:i}),r=c(o,{anchorTopOffset:n.current}),d=e.find((e=>r&&r.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(a),e.classList.add(a),t.current=e):e.classList.remove(a)}(e,e===d)}))}return document.addEventListener("scroll",o),document.addEventListener("resize",o),o(),()=>{document.removeEventListener("scroll",o),document.removeEventListener("resize",o)}}),[e,n])}var u=n(867),m=n(7624);function h(e){let{toc:t,className:n,linkClassName:s,isChild:a}=e;return t.length?(0,m.jsx)("ul",{className:a?void 0:n,children:t.map((e=>(0,m.jsxs)("li",{children:[(0,m.jsx)(u.c,{to:"#"+e.id,className:null!=s?s:void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,m.jsx)(h,{isChild:!0,toc:e.children,className:n,linkClassName:s})]},e.id)))}):null}const v=s.memo(h);function b(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:o="table-of-contents__link",linkActiveClassName:c,minHeadingLevel:r,maxHeadingLevel:u,...h}=e;const b=(0,a.y)(),x=null!=r?r:b.tableOfContents.minHeadingLevel,p=null!=u?u:b.tableOfContents.maxHeadingLevel,f=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,s.useMemo)((()=>i({toc:l(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:x,maxHeadingLevel:p});return d((0,s.useMemo)((()=>{if(o&&c)return{linkClassName:o,linkActiveClassName:c,minHeadingLevel:x,maxHeadingLevel:p}}),[o,c,x,p])),(0,m.jsx)(v,{toc:f,className:n,linkClassName:o,...h})}},1528:(e,t,n)=>{n.d(t,{c:()=>h});n(1504);var s=n(5456),a=n(4357),l=n(6952),i=n(7624);function o(){return(0,i.jsx)(a.c,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function c(){return(0,i.jsx)(a.c,{id:"theme.unlistedContent.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function r(){return(0,i.jsx)(l.c,{children:(0,i.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}var d=n(5864),u=n(304);function m(e){let{className:t}=e;return(0,i.jsx)(u.c,{type:"caution",title:(0,i.jsx)(o,{}),className:(0,s.c)(t,d.W.common.unlistedBanner),children:(0,i.jsx)(c,{})})}function h(e){return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(r,{}),(0,i.jsx)(m,{...e})]})}}}]); \ No newline at end of file diff --git a/assets/js/1e9048c4.4490369d.js b/assets/js/1e9048c4.4490369d.js new file mode 100644 index 00000000..26d340c1 --- /dev/null +++ b/assets/js/1e9048c4.4490369d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[1880],{6248:(t,a,e)=>{e.r(a),e.d(a,{assets:()=>u,contentTitle:()=>n,default:()=>h,frontMatter:()=>i,metadata:()=>r,toc:()=>l});var s=e(7624),o=e(2172);const i={slug:"docusaurus-posthog",title:"Integrating PostHog product analytics with Docusaurus v2 on GitHub Pages",author:"Evan Tay",author_url:"https://github.com/DigiPie",author_title:"Software Engineer at Padlet",author_image_url:"https://avatars2.githubusercontent.com/u/13582874",tags:["docusaurus","posthog","analytics"]},n=void 0,r={permalink:"/blog/docusaurus-posthog",editUrl:"https://github.com/DigiPie/kaya-folio/tree/main/website/blog/2021-06-26-docusaurus-posthog-analytics.md",source:"@site/blog/2021-06-26-docusaurus-posthog-analytics.md",title:"Integrating PostHog product analytics with Docusaurus v2 on GitHub Pages",description:"I integrated PostHog analytics into this website today. I decided to do so after reading Gergely Orosz's Stats page on his blog The Pragmatic Engineer. He had installed Plausible analytics and made his analytics dashboard public. I thought that was cool and wanted to do the same.",date:"2021-06-26T00:00:00.000Z",formattedDate:"June 26, 2021",tags:[{label:"docusaurus",permalink:"/blog/tags/docusaurus"},{label:"posthog",permalink:"/blog/tags/posthog"},{label:"analytics",permalink:"/blog/tags/analytics"}],readingTime:3.15,hasTruncateMarker:!0,authors:[{name:"Evan Tay",title:"Software Engineer at Padlet",url:"https://github.com/DigiPie",imageURL:"https://avatars2.githubusercontent.com/u/13582874"}],frontMatter:{slug:"docusaurus-posthog",title:"Integrating PostHog product analytics with Docusaurus v2 on GitHub Pages",author:"Evan Tay",author_url:"https://github.com/DigiPie",author_title:"Software Engineer at Padlet",author_image_url:"https://avatars2.githubusercontent.com/u/13582874",tags:["docusaurus","posthog","analytics"]},unlisted:!1,prevItem:{title:"Why every Software Engineer should read Designing Data-Intensive Applications",permalink:"/blog/why-you-should-read-ddia"},nextItem:{title:"Top 3 reasons why you should start investing with StashAway today!",permalink:"/blog/stashaway"}},u={authorsImageUrls:[void 0]},l=[];function c(t){const a={a:"a",p:"p",...(0,o.M)(),...t.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(a.p,{children:["I integrated ",(0,s.jsx)(a.a,{href:"https://posthog.com/",children:"PostHog"})," analytics into this website today. I decided to do so after reading Gergely Orosz's ",(0,s.jsx)(a.a,{href:"https://blog.pragmaticengineer.com/stats/",children:"Stats"})," page on his blog ",(0,s.jsx)(a.a,{href:"https://blog.pragmaticengineer.com/",children:"The Pragmatic Engineer"}),". He had installed ",(0,s.jsx)(a.a,{href:"https://plausible.io/",children:"Plausible"})," analytics and made his ",(0,s.jsx)(a.a,{href:"https://plausible.io/blog.pragmaticengineer.com?period=6mo",children:"analytics dashboard"})," public. I thought that was cool and wanted to do the same."]}),"\n",(0,s.jsxs)(a.p,{children:["I managed to find a ",(0,s.jsx)(a.a,{href:"https://github.com/infracost/docusaurus-plugin-plausible",children:"Plausible plugin"})," for ",(0,s.jsx)(a.a,{href:"https://docusaurus.io/",children:"Docusaurus v2"}),", which is what this website runs on. But I decided to use ",(0,s.jsx)(a.a,{href:"https://posthog.com/",children:"PostHog"})," instead. It also has a ",(0,s.jsx)(a.a,{href:"https://github.com/PostHog/posthog-docusaurus",children:"Docusaurus plugin"})," and a public dashboard feature. I decided so because it is free and Plausible isn't."]})]})}function h(t={}){const{wrapper:a}={...(0,o.M)(),...t.components};return a?(0,s.jsx)(a,{...t,children:(0,s.jsx)(c,{...t})}):c(t)}},2172:(t,a,e)=>{e.d(a,{I:()=>r,M:()=>n});var s=e(1504);const o={},i=s.createContext(o);function n(t){const a=s.useContext(i);return s.useMemo((function(){return"function"==typeof t?t(a):{...a,...t}}),[a,t])}function r(t){let a;return a=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:n(t.components),s.createElement(i.Provider,{value:a},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/1fc56582.8476b124.js b/assets/js/1fc56582.8476b124.js new file mode 100644 index 00000000..f6f301cc --- /dev/null +++ b/assets/js/1fc56582.8476b124.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[1720],{7384:a=>{a.exports=JSON.parse('{"label":"investing","permalink":"/blog/tags/investing","allTagsPath":"/blog/tags","count":1,"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/213ccdc7.0c630abc.js b/assets/js/213ccdc7.0c630abc.js new file mode 100644 index 00000000..84bc35d5 --- /dev/null +++ b/assets/js/213ccdc7.0c630abc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[2268],{3424:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>r,contentTitle:()=>a,default:()=>c,frontMatter:()=>s,metadata:()=>l,toc:()=>h});var t=i(7624),o=i(2172);const s={title:"Ikigai"},a=void 0,l={id:"ikigai",title:"Ikigai",description:"Published on May 16, 2021",source:"@site/docs/ikigai.md",sourceDirName:".",slug:"/ikigai",permalink:"/docs/ikigai",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{title:"Ikigai"},sidebar:"docs",previous:{title:"Reliable, Scalable, and Maintainable Applications",permalink:"/docs/reliable-scalable-maintainable"},next:{title:"Docker Cheatsheet",permalink:"/docs/docker-cheatsheet"}},r={},h=[{value:"Review",id:"review",level:2},{value:"Reason for being",id:"reason-for-being",level:2},{value:"Living in the present",id:"living-in-the-present",level:2},{value:"Having the right attitude",id:"having-the-right-attitude",level:2},{value:"Discipline over motivation",id:"discipline-over-motivation",level:2},{value:"Life is not a solvable problem",id:"life-is-not-a-solvable-problem",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",em:"em",h2:"h2",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.M)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Published on May 16, 2021"}),"\n",(0,t.jsxs)(n.p,{children:["Personal thoughts for ",(0,t.jsx)(n.a,{href:"https://www.goodreads.com/book/show/39995046-ikigai",children:"Ikigai: The Japanese Secret to a Long and Happy Life"})]}),"\n",(0,t.jsx)(n.h2,{id:"review",children:"Review"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Ikigai",src:i(9874).c+"",width:"467",height:"653"})}),"\n",(0,t.jsx)(n.p,{children:"I found the book's cover illustration captivating. Sadly, I can't say I felt the same for the rest of the book. While the authors did introduce numerous interesting concepts, they did not explore the concepts in a depth which was meaningful. Instead, they jumped far too quickly from one concept to another, covering each concept superficially. As such, the book felt like a list of fun facts. It was a pity given how many concepts introduced could have been starters for insightful discourse."}),"\n",(0,t.jsx)(n.p,{children:"That being said, I still penned a personal reflection on the book. That's because parts of it were still thought provoking for me. In this document, you'll find some of these thoughts. They are the ones I am comfortable sharing. They are also my biggest takeaways from the book."}),"\n",(0,t.jsx)(n.h2,{id:"reason-for-being",children:"Reason for being"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"In Okinawa, a blue zone, there is no word for retirement."}),"\n"]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:['"Blue Zones\xa0are regions of the world where a higher than usual number of people live much longer than average." - ',(0,t.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Blue_Zone",children:"Wikipedia"})]}),"\n"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Instead, they have ",(0,t.jsx)(n.strong,{children:"Ikigai"})," which loosely translates to the reason for which you wake up in the morning."]}),"\n",(0,t.jsx)(n.li,{children:"Ikigai is at the intersection of what you love, what the world needs, what you can be paid for, and what you are good at."}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.em,{children:"I am grateful I found my Ikigai - writing software for computers, early in my life, back when I was 14."})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.em,{children:"I am also thankful I get to develop my other passion - which is to write for humans, on this website."})}),"\n",(0,t.jsx)(n.li,{children:"Having an Ikigai, a reason for being, a why for living, is parmount in living a meaningful life:"}),"\n"]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:['"He who has a ',(0,t.jsx)(n.em,{children:"why"})," to live for can bear with almost any ",(0,t.jsx)(n.em,{children:"how"}),'." - Friedrich Nietzsche, a German philosopher who has a profound influence on modern intellectual history']}),"\n"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsxs)(n.em,{children:["If we ever feel overwhelmed, chances are we might have lost sight of our ",(0,t.jsx)(n.em,{children:"why"}),"."]})}),"\n"]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:'"Why do you not commit suicide?" - Viktor Frankl, an Austrian\xa0neurologist,\xa0psychiatrist,\xa0philosopher, author, and\xa0Holocaust survivor who founded logotherapy'}),"\n"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.em,{children:"It is also important to always be conscious about why we choose to live day after day."})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.em,{children:"Reading this reminded me of the following quote:"})}),"\n"]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:'"Memento Mori" - Latin for "remember you must die"'}),"\n"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.em,{children:"Knowing that we must die one day, why do we still do what we do?"})}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"living-in-the-present",children:"Living in the present"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"We should enjoy the present, and not lose ourselves in worries about the past or the future."}),"\n"]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"\u201cYesterday is history, tomorrow is a mystery, and today is a gift\u2026 that\u2019s why they call it the present.\u201d\xa0\u2013 Master Oogway from Kungfu Panda"}),"\n",(0,t.jsx)(n.p,{children:'"The only moment in which you can be truly alive is the present moment." - Thich Nhat Hanh, a Buddhist monk'}),"\n",(0,t.jsx)(n.p,{children:'"\u4e00\u671f\u4e00\u4f1a/Ichi-go ichi-e" - Japanese for "one time, one meeting" or "this moment exists only now and won\'t come again"'}),"\n"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"We should embrace our feelings: we don't create them; they simply come to us; and we have to accept them."}),"\n"]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:'"Hello, solitude. How are you today? Come, sit with me, and I will care for you." - Thich Nhat Hanh.'}),"\n"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"We must avoid attempting to eliminate negative feelings; instead, we should focus on the present moment, as recovery will come on its own eventually."}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.em,{children:"But we must be mindful to not let negative thoughts spiral out of control."})}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsxs)(n.em,{children:["Reading that reminded me of ",(0,t.jsx)(n.a,{href:"https://markmanson.net/feedback-loop-from-hell",children:"Mark Manson's Feedback Loop from Hell"})]}),"."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"having-the-right-attitude",children:"Having the right attitude"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"We should live like the locals in Ogimi, a village in Okinawa known as the Village of Longevity - they are always busy with meaningful tasks but did everything with a sense of calm, and never in a rush."}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.em,{children:"We all have to face difficult times in life, we don't get a say in that, but we can choose what attitude we have and what we do in those moments."})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsxs)(n.em,{children:["We also need to remember that ",(0,t.jsx)(n.strong,{children:"this too shall pass"}),", and sometimes all we have to do is persevere a little longer."]})}),"\n"]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:'"This too shall pass." - A Persian adage which reflects on the temporary nature of all things human'}),"\n",(0,t.jsx)(n.p,{children:'"\u9811\u5f35\u308b/Ganbaru." - Japanese for "to persevere" and "to stand firm"'}),"\n"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Resilience isn't just about the ability to persevere, but also to stay focused on the important things in life."}),"\n",(0,t.jsx)(n.li,{children:"It is important not to get swept up with negative emotions and lose sight of what truly matters."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"discipline-over-motivation",children:"Discipline over motivation"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Shoma Morita, a psychotherapist who founded Morita therapy - a branch of clinical psychology strongly influenced by Zen Buddhism, believes that ",(0,t.jsx)(n.strong,{children:"feelings will change as a result of your actions."})]}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsxs)(n.em,{children:["This is echoed in ",(0,t.jsx)(n.a,{href:"https://markmanson.net/how-to-get-motivated",children:"Mark Manson's How to Get Motivated and Take Action"})," too:"]})}),"\n"]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:'"Action isn\u2019t just the effect of motivation, but also the cause of it." - Mark Manson, an American self-help author and blogger'}),"\n"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.em,{children:"It is important that we rely on discipline rather than motivation. We have control over the former, but never the latter."})}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"life-is-not-a-solvable-problem",children:"Life is not a solvable problem"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.em,{children:"The concluding paragraph of the book resonated deeply with me. It embodies what I want to live by moving forward:"})}),"\n"]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:'"Life is not a problem to be solved. Just remember to have something that keeps you busy doing what you love while being surrounded by the people who love you."'}),"\n"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsxs)(n.em,{children:["Being able to pursue my Ikigai while surrounded by cherished ones is really all I need in this life, besides the lowest tiers of ",(0,t.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Maslow%27s_hierarchy_of_needs",children:"Maslow's hierarchy of needs"}),"."]})}),"\n"]})]})}function c(e={}){const{wrapper:n}={...(0,o.M)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},9874:(e,n,i)=>{i.d(n,{c:()=>t});const t=i.p+"assets/images/ikigai-c82d2290bd6e8082e34a7ee7774f0cdd.jpeg"},2172:(e,n,i)=>{i.d(n,{I:()=>l,M:()=>a});var t=i(1504);const o={},s=t.createContext(o);function a(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/224a301e.34b00daf.js b/assets/js/224a301e.34b00daf.js new file mode 100644 index 00000000..e6420732 --- /dev/null +++ b/assets/js/224a301e.34b00daf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[8876],{2352:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/github-action","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/2419c069.5affec2c.js b/assets/js/2419c069.5affec2c.js new file mode 100644 index 00000000..aa9ff152 --- /dev/null +++ b/assets/js/2419c069.5affec2c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[7904],{9428:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>a,frontMatter:()=>s,metadata:()=>l,toc:()=>h});var t=i(7624),o=i(2172);const s={title:"Mininet Setup"},r=void 0,l={id:"mininet-setup",title:"Mininet Setup",description:"Published on December 21, 2020",source:"@site/docs/mininet-setup.md",sourceDirName:".",slug:"/mininet-setup",permalink:"/docs/mininet-setup",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{title:"Mininet Setup"},sidebar:"docs",previous:{title:"GKE Cheatsheet",permalink:"/docs/gcp-gke-cheatsheet"},next:{title:"Network Model (CS4226)",permalink:"/docs/network-model"}},c={},h=[{value:"Set up Mininet VM",id:"set-up-mininet-vm",level:2},{value:"Set up POX",id:"set-up-pox",level:2},{value:"Connecting POX to Mininet VM",id:"connecting-pox-to-mininet-vm",level:2},{value:"Verify POX is reachable by VM",id:"verify-pox-is-reachable-by-vm",level:3},{value:"Verify Mininet uses remote POX",id:"verify-mininet-uses-remote-pox",level:3},{value:"Mininet Cheat-sheet",id:"mininet-cheat-sheet",level:2},{value:"Enter Mininet",id:"enter-mininet",level:4},{value:"Display",id:"display",level:4},{value:"Test connectivity",id:"test-connectivity",level:4},{value:"Exit Mininet",id:"exit-mininet",level:4},{value:"Troubleshoot connectivity",id:"troubleshoot-connectivity",level:2},{value:"VM-Host connectivity",id:"vm-host-connectivity",level:3},{value:"Resources",id:"resources",level:2}];function d(e){const n={a:"a",admonition:"admonition",br:"br",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,o.M)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["Published on December 21, 2020",(0,t.jsx)(n.br,{}),"\n","Updated on December 27, 2020"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsxs)(n.em,{children:["This document was migrated from ",(0,t.jsx)(n.a,{href:"https://digipie.github.io/digidocs/mininet/getting-started/",children:"DigiDocs"})]})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Mininet diagram",src:i(4832).c+"",width:"580",height:"380"})}),"\n",(0,t.jsx)(n.p,{children:"In this section you will find my notes on:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Setting up and running Mininet VM on a virtualization program."}),"\n",(0,t.jsx)(n.li,{children:"Setting up and running NOX/POX controller on your local machine."}),"\n",(0,t.jsx)(n.li,{children:"Connecting your POX controller to your Mininet application (and troubleshooting)."}),"\n"]}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["I wrote this setup guide using MacOS, POX ",(0,t.jsx)(n.a,{href:"https://github.com/noxrepo/pox/issues/192",children:"using Python3"}),", and VMware Fusion. However, the setup flow and troubleshooting should be similar for Linux/Window and other virtualization programs."]})}),"\n",(0,t.jsx)(n.h2,{id:"set-up-mininet-vm",children:"Set up Mininet VM"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Download, setup and launch the latest Mininet VM ",(0,t.jsx)(n.a,{href:"https://github.com/mininet/mininet/wiki/Mininet-VM-Images",children:"here"}),".","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"For virtualization program, try VirtualBox first given that it is free and open-source."}),"\n",(0,t.jsxs)(n.li,{children:["If you do use VirtualBox, remember to add a Host-only network adapter to your VM under",(0,t.jsx)(n.br,{}),"\n",(0,t.jsx)(n.em,{children:"Select VM > Settings > Network"})]}),"\n",(0,t.jsxs)(n.li,{children:["If you are on MacOS, and the Mininet VM aborts when you launch it (as it does for me), you may have to consider using ",(0,t.jsx)(n.a,{href:"https://www.vmware.com/products/fusion.html",children:"VMware Fusion"})," instead."]}),"\n",(0,t.jsxs)(n.li,{children:["If you do use VMware Fusion, change your network adapter:",(0,t.jsx)(n.br,{}),"\n",(0,t.jsx)(n.em,{children:"Virtual Machine > Network Adapter > Bridged (Autodetect)"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["Log into the VM using ",(0,t.jsx)(n.code,{children:"mininet"})," as both username and password."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Before setting up the NOX/POX on your local machine, it would be best to familiarise and verify that your Mininet setup is working fine. Try out a few of the commands in ",(0,t.jsx)(n.a,{href:"#mininet-cheat-sheet",children:"#mininet-cheat-sheet"})," such as ",(0,t.jsx)(n.code,{children:"pingall"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"set-up-pox",children:"Set up POX"}),"\n",(0,t.jsx)(n.p,{children:"You will be setting up the NOX/POX controller on your local machine, and linking it up with the Mininet application in your VM."}),"\n",(0,t.jsx)(n.p,{children:"Verify that your POX installation is working:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/noxrepo/pox\ncd pox\n./pox.py log.level --DEBUG\n"})}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Verify that you see:",(0,t.jsx)(n.br,{}),"\n",(0,t.jsx)(n.code,{children:"INFO:core:POX 0.7.0 (gar) is up."})]}),"\n",(0,t.jsx)(n.li,{children:"You can terminate POX after step 1."}),"\n",(0,t.jsxs)(n.li,{children:["If it does not work, it is likely because you do not have Python3 installed. You can ",(0,t.jsx)(n.code,{children:"git checkout master"})," to change to the Python2 version for POX. See ",(0,t.jsx)(n.a,{href:"https://github.com/noxrepo/pox/issues/192",children:"this"})," for more information."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"connecting-pox-to-mininet-vm",children:"Connecting POX to Mininet VM"}),"\n",(0,t.jsx)(n.p,{children:"Next, we will set up a Mininet network (on your Mininet VM) with the remote controller set to the POX controller (on your local machine). To do so, you will need to open two terminals, one on your local machine where POX is at, and another terminal in your Mininet VM."}),"\n",(0,t.jsx)(n.h3,{id:"verify-pox-is-reachable-by-vm",children:"Verify POX is reachable by VM"}),"\n",(0,t.jsxs)(n.p,{children:["On your local machine, at the ",(0,t.jsx)(n.code,{children:"pox/"})," directory:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"./pox.py log.level --DEBUG forwarding.l2_learning\n"})}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Verify that you see something similar to:",(0,t.jsx)(n.br,{}),"\n",(0,t.jsx)(n.code,{children:"DEBUG:openflow.of_01:Listening on 0.0.0.0:6633"})]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"On your Mininet VM, check if your VM can reach the POX controller at the port it is listening on:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"nc -zvw10 0.0.0.0 6633\n"})}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Replace the IP address and port with what you see after ",(0,t.jsx)(n.code,{children:"Listening on"})," in the previous step."]}),"\n",(0,t.jsxs)(n.li,{children:["Verify that you see something similar to:",(0,t.jsx)(n.br,{}),"\n",(0,t.jsx)(n.code,{children:"Connection to 127.0.0.1 port 6633 [tcp/*] succeeded!"})]}),"\n",(0,t.jsxs)(n.li,{children:["If you see something like:",(0,t.jsx)(n.br,{}),"\n",(0,t.jsx)(n.code,{children:"nc: connectx to 127.0.0.1 port 6633 (tcp) failed: Connection refused"}),",",(0,t.jsx)(n.br,{}),"\n","it is probably because your VM cannot access your host machine. See ",(0,t.jsx)(n.a,{href:"#troubleshoot-connectivity",children:"#troubleshoot-connectivity"}),"."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"verify-mininet-uses-remote-pox",children:"Verify Mininet uses remote POX"}),"\n",(0,t.jsx)(n.p,{children:"Next, start Mininet with the controller set to your POX controller on your local machine:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"sudo mn --controller=remote,ip=0.0.0.0,port=6633\n"})}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Replace the IP address and port accordingly."}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Lastly, check if your POX remote controller is connected:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"h1 ping h2\n"})}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Verify that ",(0,t.jsx)(n.code,{children:"h1"})," is able to ping ",(0,t.jsx)(n.code,{children:"h2"}),". If not, your remote controller is not connected."]}),"\n",(0,t.jsxs)(n.li,{children:["You should also see output in the POX window similar to:",(0,t.jsx)(n.br,{}),"\n",(0,t.jsx)(n.code,{children:"DEBUG:forwarding.l2_learning:installing flow for 52:1e:48:64:23:43.2 -> 02:07:aa:33:88:e5.1"})]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["If you are able to make it to this point, your setup for Mininet VM and remote POX is completed. See ",(0,t.jsx)(n.a,{href:"#resources",children:"#resources"})," for more information on what you can do next with Mininet!"]}),"\n",(0,t.jsx)(n.h2,{id:"mininet-cheat-sheet",children:"Mininet Cheat-sheet"}),"\n",(0,t.jsx)(n.h4,{id:"enter-mininet",children:"Enter Mininet"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"sudo mn\n"})}),"\n",(0,t.jsx)(n.h4,{id:"display",children:"Display"}),"\n",(0,t.jsx)(n.p,{children:"Display all Mininet commands:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"help\n"})}),"\n",(0,t.jsx)(n.p,{children:"Display all nodes:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"nodes\n"})}),"\n",(0,t.jsx)(n.p,{children:"Display all links:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"net\n"})}),"\n",(0,t.jsx)(n.p,{children:"Display information on everything:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"dump\n"})}),"\n",(0,t.jsx)(n.h4,{id:"test-connectivity",children:"Test connectivity"}),"\n",(0,t.jsx)(n.p,{children:"This command tests the connectivity between all hosts:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"pingall\n"})}),"\n",(0,t.jsx)(n.h4,{id:"exit-mininet",children:"Exit Mininet"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"exit\nsudo mn \u2013c\n"})}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"sudo mn -c"})," is used to clean up Mininet."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"troubleshoot-connectivity",children:"Troubleshoot connectivity"}),"\n",(0,t.jsx)(n.p,{children:"If you are unable to connect to the POX controller from your VM, it could be one of the following problems:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Firewall rules are blocking it."}),"\n",(0,t.jsx)(n.li,{children:"Incorrect IP address or port."}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["If you are certain you are specifiying the correct IP address and port, and that your firewall is off or allowing traffic in for the port POX is listening on, attempt the fix in ",(0,t.jsx)(n.a,{href:"#vm-host-connectivity",children:"#vm-host-connectivity"}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"vm-host-connectivity",children:"VM-Host connectivity"}),"\n",(0,t.jsxs)(n.p,{children:["The instructions here are for VMware Fusion and MacOS, but you can use it as a guide for solving connectivity issues between Windows/Linux and VirtualBox/other virtualization programs too. See ",(0,t.jsx)(n.a,{href:"https://stackoverflow.com/a/19824282",children:"this"})," for more information."]}),"\n",(0,t.jsx)(n.p,{children:"On your local machine:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Turn off your Mininet VM:",(0,t.jsx)(n.br,{}),"\n",(0,t.jsx)(n.em,{children:"Virtual Machine > Shutdown (for VMware Fusion)"})]}),"\n",(0,t.jsxs)(n.li,{children:["Change your network adapter to Bridged (Autodetect) if you have not done so yet:",(0,t.jsx)(n.br,{}),"\n",(0,t.jsx)(n.em,{children:"Virtual Machine > Network Adapter > Bridged (Autodetect)"})]}),"\n",(0,t.jsx)(n.li,{children:"Turn on your Mininet VM."}),"\n",(0,t.jsxs)(n.li,{children:["Find out your local machine's IP address:",(0,t.jsx)(n.br,{}),"\n",(0,t.jsx)(n.em,{children:"System Preferences > Network > Wi-Fi"})]}),"\n",(0,t.jsxs)(n.li,{children:["Look out for something similar to:",(0,t.jsx)(n.br,{}),"\n",(0,t.jsx)(n.code,{children:"Wi-Fi is connected to YourWifi and has the IP address 192.168.0.152"})]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"On your Mininet VM:"}),"\n",(0,t.jsxs)(n.p,{children:["Use your local machine's IP address for the ",(0,t.jsx)(n.code,{children:"nc"})," command:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"nc -zvw10 192.168.0.152 6633\n"})}),"\n",(0,t.jsxs)(n.p,{children:["If this works, use this address instead of ",(0,t.jsx)(n.code,{children:"127.0.0.1"})," or ",(0,t.jsx)(n.code,{children:"0.0.0.0"})," whenever you are specifying the remote controller's IP address for Mininet."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"sudo mn --controller=remote,ip=192.168.0.152,port=6633\n"})}),"\n",(0,t.jsx)(n.h2,{id:"resources",children:"Resources"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://digipie.github.io/digidocs/mininet/getting-started/",children:"Original copy of this document at DigiDocs"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"http://mininet.org/download/",children:"Download/Get Started With Mininet"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"http://mininet.org/walkthrough/",children:"Mininet Walkthrough"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://www.comp.nus.edu.sg/~tbma/teaching/cs4226y16_past/tutorial-Mininet-POX.pdf",children:"NUS CS4226: A short walk-through of Mininet and POX"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://stackoverflow.com/a/19824282",children:"StackOverflow: VMWare fusion: connecting to host's web server from guest"})}),"\n"]})]})}function a(e={}){const{wrapper:n}={...(0,o.M)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},4832:(e,n,i)=>{i.d(n,{c:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAkQAAAF8CAMAAAAZ/1Q1AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABklBMVEX////x8fHZ2dnGxsb4+PiWlpZeXl5tbW2NjY2rq6vi4uLl5eW6urq1tbXd3d3FxcWmpqbOzs7W1tZTU1MzMzNxcXFDQ0O7u7uxsbGZmZliYmJ/f3/f399qamp7b3yPe5CxkLOzkbWVf5bk2OW5mru8nr62lbjYx9m0krbTv9TNt8/q4evApML39Pjx6/HEqsbJsMrez9+sjK2fhaCvjrFmYmZnfFZukFF5tEh6tkhwlk/Q5b+YxnKEvFeKv158t0qoz4h/uU/y+O3F37CRwmi72qKy1JXb686gy33n8d13rklzoU14skhgZluQbklRd4qxeTvsjCLvjSJJh6c6pNs6pt27fDdGjLDyp1X517H1vX/vjiXxmz3wljT0tXBKrd+63/Ob0e1SseH86tecgJ6tjK/vkStWVlZXUVc/Oz+ihaTK5/V/xenzrmLxoUn2xY94s0dpl0NNXT83Nzc9p91ctePb7vjs9vuNy+tCqd6q2PD64MT4zZ/99OpRazxnuuRzv+Z2sEdlj0FFVThkeFSvr6+JRHMhAAAAAWJLR0QAiAUdSAAAAAlwSFlzAAAYmwAAGJsBSXWDlAAAAAd0SU1FB+QKFwglAVeYNXoAABPXSURBVHja7d2JW1PXuoDxLadGxJZBCSgqSEMChFkUpYACVhyw1olzRIHaeq93sMM599ranuq9vdP/fb9vrZ0JNrrDSrKS8L7PUzOSnbh/z1prJzQGARERERERERERERERERERERERERERERERERERERERERERERERERERERERETV2R1r+RIekliNVIfTJ0QQdoo5+UnlDLcd8vyqqbcdaKj4OGUOtdEgyiio9FulcdrztBB2S2o7LDj9aWUNH1JDvF0a1TBVVdnXdIo/IOHSoapNdXtlV0Z9kPeT7VVFtk3XRpyAip45XelEEosPXZyAi10BEzoGInANRdWrv6OwqvNPR1dnl+wlVMxBVo5OnujX7F9GRNBeSHb6fVdUCURXq6um2JeVCW+5Cd7vv51WtQBS/k10n23pPt51o7zxpr2jr6CwMLzKBnQ6v16Hn1Bl1Izd3yvmu9t5TllRTBqL4JbuTQuFUh+A4Ixfb+5RJz1m79DltBptTnXK2y85k7daNDER6ZW93T7JZhyIQxc+ubbp7dH6Si2cVjfzXq7d1mlvkvy57Xr2cMfeTn+pp8g8TQRQ/4XBagbQJnbZwvOksLHyS7W3C5pRFpPfvNZi6zHDV28yOQBQ/QdQlJPpUSdeJ9q6uLjt1tVsvcqk9mZQ5Kxkuf7rslXYA62lt3qN8EMVPNLS3KRCDSMicPpvsK8xgxfcrRnSit8/Og017jA+i+CUVSgFRX+7Qvcusj/ry95NJrUdPdQVuj9dOdpoDNt8voFqBKH6liHQGO9N1OmIkMuumExFX9vp+BVUKRPErRdRnBp8iRDroJDs7TxpeOnX16eDTmTx1yiyqZTV+1vcrqFIgil8pIjke62tr12mqU+Yre9JrD+f1wL8zvEkXRmfa7dzW6fsVVCkQxa8UUauo6OvR94Z6esM3qc+GUDpzqyUVZd65Np+l9fBmI4hKEXXYz1h77UdkbeEy2y6vQ0WndIZryy/Am3VJBKIyOpMULcnkmRO9yaTwaO9M6nuIvWeTRsfp1mTydG6s6epMJs92hm8wyj2k0837diOIyDkQkXMgIudARM6BiJwDETkHInIOROQciMg5EJFzICLnaoeopeOzpqujxff+q4tqhehcq+/vya1Ored878E6qEaIOs773tvV6nzT/vp9/GqD6Jwx1N90GUWMRbVBpHPZwIXBpuvCQILjiBoh0q8lHvC9w6uTKjr0q+uaIOqQv+kmHIe0C/LSDv2qqCaIZCP9vvd2ternHxAAkWsDLIpA5NrnIAIRiNwDEYicA1FYKpUaAtHB8otoKJ0eKpzLpO1FOUlXBMZQOtfHfchTP9BGQeQb0bD8wIieGZEzo1n5Y8yeDyqCKJV/VqmP35eR6MD5RTQuPzCeOzOkiIKMOV97RAcNRL4RDU4EwbCeypA0OWgQTZnhKRgsTEEyy5nRKp2dzthrRsx8l5nOZu0MNDQl50YiEU1mTVNmbsvYRxsKHyT343YCTRceIT2dezx77/Hs/jMdiLwjGg2CiRDTqEU0PDgZyCW5Jjd6ZM1qZdQ8+pjZm2lVZoaZrO7oGXPTxN7ZKFU8BKXsvbPhdfaHLOFBez6UMjRmH0+HSBkVU0OFDYMoMs+Ihuy+05Mh3b9jwWRG9ps1Et5nRs+pm4nArJnsTrcIlMWk3DIZmEeIj0gfL6VaxncjGpkIN6WX5W6T5rH3nRBB5B2RChg1w8yk2b8ylU3LzhY2o7rkHs9O696ftFKG1Fom/ClhNJ2eSpuf0kFoJjeqxEM0afikzXZzLi0ieQoT2ZGpSXOTsZsdUrEg2jffiEbN4DJmKMn+ndJhKCX7cXBad+qkohEuZhWUMffLhiCCsZE8juHcFLcXUbgmSkcgmpQrCwupPKJwmTZlhjZ9VHGcCfZ9AwBE/hGZwSVj5yJd/OgYk9WpTHbfuF4/nbE7f2R8NJWaKEKU2/9y3aQcn6ci9nPh6CwbNZ0FY6OFn8j/uL23uUPa/DlUuBJEkflGpEPC1LSdVRSRrp/TimhEdptcH8ykzcSTLeJgQIwV7f1cZSDKLayLHya/aNczI2YMyo1vIPpQ3hGJmpkZM5sZRON6uGYW1RPB8JiukbI6Fuhqdyyt41QO0XDR3h9O7zpGLyAqWRMNWzz2uvHRsTzKIkQje0YiEH0s74hkPpuYsOtlRTSSSo1aRCk5VAsyk/pnboWS35epon2a2v/IqeSmmfxiKH9dRoa6iUwpInPkN1i8JgLRx/KOaHAsP6tkc/tRj87MG0OT5p3HMfv5yLiZ0yZ3Ixq2uz+bSs18cCSaNvfTP+W6dGpMpeiCKr0LkWCbzAxmUuYdLBDFyT8i3a16BFSESI/OzPWj5jOQ4fBQ27wLGQxnShGZ93VSk1G7uQSRec/QPIRcl9GTbHbGSBkK1+Vj5vMzs+Q275pPgShe/hHpIZh99yePKJV7e3HIjBXhO4o69UzYAaMY0eD4hN3yzJ6HLp3p7JA3aq+bDp/uRCglV9pOZEFgl2kgipN/RIPDqZRdJU/lPkiXg3kZYWR+suf1ypGpmdR0ZjA9nBrNmCunCg8wkp1JzUxHfAY/qgusQvLD05mh8LrMqI4/WdVrRqIwfZQhmRpT9uhfbzIcSzYIoj371zeixg5EIAJRBQIRiJwDEYicAxGInAMRiJwDEYicAxGInAMRiJwDEYicAxGInAMRiJwDEYicAxGInAMRiJwDEYicAxGInAMRiJwDEYicAxGInAMRiJzzi+ji7OcN0+xFEO2TT0SX+n3/i3fl1X8JRJF5RDR72beKcrs8C6Ko/CG6ZAzNNUxG0SUQReQPkc5lV67ON0xXrySiXgaIPCK6qIZ8wygvVXQRRHvzhmhW9kgDjUPaVXnKsyDamzdE8pc/51tFuc1F/FO2IAJRWV2Jfh0gAlH8vgBRZCACkXMgApFzDYFoYWFhMfqWJbkJRL6rQ0RL165duz4/f11Oluw18rDL0fe9JjfF2Psry5E/L1tYMWd0Wyt7twuieNUhogVrZlFOwlHGeSRajKa2GgQ3crcHX+7dLojiVaeIZC/e3H9nlt2NaERrsonreka2tWq2e+uD2wVRdHWKSPbtargzr5nstLOkZ64vLttLK/Ym+1NmLlq6vXg9N0YtLi9fux7eJA91zU5WpeOYDkDhkHRz93ZBFLu6RHRH9q3s4FWzM+3DLud8LS/rxZvKaNneZH9KndySP1bNPVdumJtWl+bzj6B32L2pO4rHrqyWCtu9A6LyqktEq6vB2m3dpbsRyVRzo3B5N6Jb9vKK1bF6JzA2PoRoTacxc3LHCL2j211lJCqzukQkUm7dVC4LeSAWkbK5s6gjTnhL4ehMt31j5bYIWDT300Hohh1o9j+GW7LMhNta1HZBFK/6RHRbh5Xb0Yhkp9/OoyhBdMv+8E3roejW/d8IMHxW7KPu3S6I4lWfiJbMTBSJaLUERQmiNTszLZiF8h05+F8Ip7D9Ea0pvdtmNovYLojiVZ+IdIS4Mx+JaGF/RMv5exQ9nw8jUjW6CF8rbHd1HkRlVqeIbuqs5ITopj3+N4f1H3hfW5ZX+u7iUuR2QRSvOkX05cLClw6IFkod6L2uR2/str6TYGaziO2CKF51iih0cVBEN+08trywcEPxXA8iDu9tK+ZJr0VvF0TxqndES+H6WNfJS6WIFuUqfWtowXx+VoLounnb+VYen6x6Vm/cXFiLns/sbAaiA1fviK4VPfS1UkTLRTftQjT/5aq93n6+aj5UDaJt6NsFt/YZAUEUrzpEtLaQ//B+zY5EYUs6+OhoYj+7Xyy6Kf9Jf3iP+evLNxZu3M7/SsfKolxcjvpVgJX8rwiUbBdEZVSHiOo3EEUHIhA5ByIQOQciEDkHIhA5ByIQOQciEDkHIhA5ByIQOQciEDkHIhA5ByIQOQciEDkHIhA5ByIQOQciEDkHIhA5ByIQOQciEDkHIhA5ByIQOVd/iO6uf+G99bt+EbV0fOa9jpaGRXRvzve/jGebu+cP0blW36/e1nquMRGtf+X7by7XV+u+EHWc9/3ac53vaERE94yh+94ziu75QXTOGPrae0ZRvLGovhDNyRN/8PCR9x4+SEQ9vZog0rns8ZMN7z15nIj70uoK0V015BuQTRXd9YGoRQ35BmRTRbFW13WFaF2edR2MQ9pDeSrrPhB1yIbrYBzSnshTibUqqitEspPu+9aT637EP1FbC0Tyd/W1bz25ZF10HEQOPYh+focK0eOYrw1E+/RnEG38BUQgAhGIvAciEIHIdyACEYhA5D8QgQhEIPIfiEAEIhD5D0QgAhGI/AciEIEIRP4DEYhABCL/gQhEIAKR/0AEIhCByH8gAhGIQOQ/EIEIRCDyH4hABCIQ+Q9EIAIRiPwHIhCBCET+AxGIQAQi/4HoECB6urm5uc9NzzY3n4IIRLt7vrW1tS2n23L63FyzI9vaZ/9vBsFOHIY7W82C6JsXtm+/A9H+iLYCa+alnGxVaCR6+UFq+yL6h3+sDKL26C9mPRCi7/J//d+C6MOIth69CvKInNsODoDon/75X7r/tTKIurp7WiMcHRjR69fm7//73FUgikT07NEPIaJXWyZz03NzZnsnHHzsLa/M+Vc6Bz7/cWc7fJTnWzs7T7fDm34Kgp/CSTIeor/+7d/+vVuqGCKp52xvW4UQfbfx5mc5eaGXv/9Fzr399c3Gxm9vg+DvG/a07FGq+RC9DH5/9C54bxDt2G3lfT2Xq4OXhpG9xY4xcrfNH/XipqHy9L257afwJttmPER//dt/dIdVEpFW6sgB0cbGCznd2HjzOnxtv4gihfWzuUUvgUitvNyDSKe4d4XLuxC9LMB5Kqe/64V35SIqElQFRKWOXBG9lXFIB6T/VFA6t/0q1735Qy58U/bDNh8igfKD+XMrByQ8OjNItvVyuFraLEIUvH/6Si6/lLnsvbEkS6HgVcm9PoLov/77f7pLqgIiqe90uyui3HQmM9evcuW3RtTGhoxLL+SqP8p+1CZEtPNexpH3O5GIdGx5n0dRguhHO+G9Mn9uF90aC9EeQdXMOHJdWP+88VtgxejoozPYN2/1+r+Xb6gZEemc9S4a0Q8lKEoQPZcxyAxSuijflF6GU9jHEf1vLQXlHP2f2yH+94W5LXdqNJW/IGpORLqmeRqNaGt/RPl77BSeY1Miev3ixYvvf9uIQPRtkDsHIl1Bv3JDZI//7WF9s01neSW/2QEpP539bPbL2wMMRU2I6NG7zXePDo5oKyh9n3JT33j6GKKGWljnCt8aChfW+g7RH68PtChqRkShiwMiMm8FPH+0/S78UOTZ/of3JYga6RDfpof43/78IhyQ9OBs45vgIIdnTY3omV0f6zr52S5EunSW47SXm0qlBJE94P9J/zAf4eqx/u/ySNsfR9Qwbzba3vwS7ovXb4yot79ZWGW/UdTUiDYLm9vchajomezsQvQ8fEsyCNm8tJe2YiFqhI89Cop+1aN687HHd7khSAak14cc0Xbug/mnOnToSBT2zAw+ysJ+dl+4RS7lPukP7/HoR7nPsx+f52XqxZ1XcRHV8Qewe3vz3UGO6ZsbUe1rqF8FqVIgqhaiva/D/y+lgQhEIAIRiEAEIhCBCEQgAhGIQAQiEIEIRCACEYhABCIQgQhEIAIRiEAEIhCBCEQgAhGIQAQiEIEIRCACEYhABCIQgQhEIAIRiEAEIhCBCEQgAhGIQAQiEIEIRCACEYhABCIQgQhEIAIRiEAUrwcg2ngMIrfuJxJXDjuirxOJ4w2HaD2RSDz0rcf2UJ7Kug9EHbLhJ7712J7IU+mI85zrCtFdedYPfPOxyWyWuOsDUYts+LFvPjaZzRItDYdofk4V1cFY9FAN7X16tUB0olUV1cFY9EQNxXtp9YXo3lfyxBP3H/zZaw/u67P46p4fROfO69a/fvwXrz3+Wp/F+XMNiGh+3Siqh75an/eD6ETHed+vPdf5WCuiukM0f2/O99+cbe7evC9EJ861+n71ttZ441D9IZLV9fqVOc9dWb8b+dRqhEhW1x3HWz13vCPWmrpOEdVxNUPUYIEIRM6BCETOgQhEzoEIRM6BCETOgQhEzoEIRM6BCETOgQhEzoEIRM6BqIyugCgyEJXRXCIxAKK9eUM0m0gkrvpWUV5X5SnPgmhv3hBdTET87xT1ncxmiYsg2ps3RIP9qqiBxqKramjvywCRT0SXLpvfILzyRUN0ZU6f7eVLIIrIH6LB2cu+f/+z3C7PDoIoIo+IBi/1+1ZRXv2XBkEUlU9EsrqeHehvkAZmL0a+BBD5RtQEgQhEIKpAIAKRcyACkXMgApFzIAKRcyACkXMgApFzIAKRcyACkXMgApFzIHJsAEQgcq0/5nc9N3M1QaTfzXzB996uThcSMb/ruZmrCSL9buYB9x1Wj8lsFu+7npu5miAy38080IRj0QU1dOiXRDVCZL+buX/g86ZqwPxmZszvem7maoOojr6budLF/a7nZq5GiOrmu5krXezvem7maoWoLr6b2ed3PTdztUNETRuIyDkQkXMgIudARM6BiJwDETkHInIOROQciMg5EJFzICLnjoOIXGtNJD6tKCL9Vdg236+Kalmb7PKWiiI6kuB/fzhkyWyWOFJRRMFRVcRYdGhqU0OVXRIFwSfHzG/8Hf+MDkHHzW+sHvukwoiClmO+f2eVatuxyq6I7Fh01Perolp2tOLjkOlIy6dH6VD0aUuF19RERERERERERERERERERERERERERERERERERERERERERERERERERERERERU8/4fao1EwQ8NH2wAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjAtMTAtMjNUMDg6Mzc6MDErMDA6MDATRdwgAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIwLTEwLTIzVDA4OjM3OjAxKzAwOjAwYhhknAAAAABJRU5ErkJggg=="},2172:(e,n,i)=>{i.d(n,{I:()=>l,M:()=>r});var t=i(1504);const o={},s=t.createContext(o);function r(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2c3dd313.22495fc8.js b/assets/js/2c3dd313.22495fc8.js new file mode 100644 index 00000000..409dad26 --- /dev/null +++ b/assets/js/2c3dd313.22495fc8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[3700],{9238:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/sharing","page":1,"postsPerPage":10,"totalPages":1,"totalCount":2,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/2dc3d3ff.a2932b09.js b/assets/js/2dc3d3ff.a2932b09.js new file mode 100644 index 00000000..49a54228 --- /dev/null +++ b/assets/js/2dc3d3ff.a2932b09.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[7968],{2940:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>o,frontMatter:()=>i,metadata:()=>l,toc:()=>h});var s=t(7624),d=t(2172);const i={title:"Contents",slug:"/"},r=void 0,l={id:"contents",title:"Contents",description:"Published on January 23, 2021",source:"@site/docs/contents.md",sourceDirName:".",slug:"/",permalink:"/docs/",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{title:"Contents",slug:"/"},sidebar:"docs",next:{title:"Reading List",permalink:"/docs/reading-list"}},c={},h=[{value:"Reading List",id:"reading-list",level:2},{value:"Article Summaries",id:"article-summaries",level:3},{value:"Book Summaries",id:"book-summaries",level:3},{value:"Documentation",id:"documentation",level:2},{value:"Cloud and Networking",id:"cloud-and-networking",level:3},{value:"Programming",id:"programming",level:3},{value:"Tooling and OS",id:"tooling-and-os",level:3},{value:"Web Development",id:"web-development",level:3}];function a(e){const n={a:"a",br:"br",h2:"h2",h3:"h3",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,d.M)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["Published on January 23, 2021",(0,s.jsx)(n.br,{}),"\n","Updated on October 24, 2021"]}),"\n",(0,s.jsx)(n.h2,{id:"reading-list",children:"Reading List"}),"\n",(0,s.jsxs)(n.p,{children:["Here, you will find my thoughts on articles, books, videos and other forms of media. I also maintain a ",(0,s.jsx)(n.a,{href:"reading-list",children:"Reading List"})," of articles, books, videos, and more which I think are meaningful and insightful."]}),"\n",(0,s.jsx)(n.h3,{id:"article-summaries",children:"Article Summaries"}),"\n",(0,s.jsx)("div",{class:"contentTableContainer",children:(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{}),(0,s.jsx)(n.th,{children:"Topic"}),(0,s.jsx)(n.th,{children:"Date Last Updated"})]})}),(0,s.jsx)(n.tbody,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"1"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"scaling-memcached",children:"Lessons Learnt from Scaling Memcached in Production"})}),(0,s.jsx)(n.td,{children:"April 14, 2021"})]})})]})}),"\n",(0,s.jsx)(n.h3,{id:"book-summaries",children:"Book Summaries"}),"\n",(0,s.jsx)("div",{class:"contentTableContainer",children:(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{}),(0,s.jsx)(n.th,{children:"Title"}),(0,s.jsx)(n.th,{children:"Date Last Updated"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"1"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"reliable-scalable-maintainable",children:"Designing Data-Intensive Applications"})}),(0,s.jsx)(n.td,{children:"August 23, 2021"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"2"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"ikigai",children:"Ikigai: The Japanese Secret to a Long and Happy Life"})}),(0,s.jsx)(n.td,{children:"May 16, 2021"})]})]})]})}),"\n",(0,s.jsx)(n.h2,{id:"documentation",children:"Documentation"}),"\n",(0,s.jsx)(n.p,{children:"Here, you will find a collection of concise notes on full-stack software engineering and cloud operations. These notes are filed under their respective topic, with related topics are categorised under the same chapter."}),"\n",(0,s.jsx)(n.h3,{id:"cloud-and-networking",children:"Cloud and Networking"}),"\n",(0,s.jsx)("div",{class:"contentTableContainer",children:(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{}),(0,s.jsx)(n.th,{children:"Topic"}),(0,s.jsx)(n.th,{children:"Date Last Updated"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"1"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"docker-cheatsheet",children:"Docker"})}),(0,s.jsx)(n.td,{children:"December 24, 2020"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"2"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"gcp-gke-cheatsheet",children:"GCP GKE"})}),(0,s.jsx)(n.td,{children:"December 24, 2020"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"3"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"mininet-setup",children:"Mininet"})}),(0,s.jsx)(n.td,{children:"December 27, 2020"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"4"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"network-model",children:"Network Model"})}),(0,s.jsx)(n.td,{children:"November 30, 2020"})]})]})]})}),"\n",(0,s.jsx)(n.h3,{id:"programming",children:"Programming"}),"\n",(0,s.jsx)("div",{class:"contentTableContainer",children:(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{}),(0,s.jsx)(n.th,{children:"Topic"}),(0,s.jsx)(n.th,{children:"Date Last Updated"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"1"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"c-cheatsheet",children:"C"})}),(0,s.jsx)(n.td,{children:"December 23, 2020"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"2"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"js-cheatsheet",children:"Javascript"})}),(0,s.jsx)(n.td,{children:"August 1, 2021"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"3"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"ruby-dependency-management",children:"Ruby"})}),(0,s.jsx)(n.td,{children:"October 23, 2021"})]})]})]})}),"\n",(0,s.jsx)(n.h3,{id:"tooling-and-os",children:"Tooling and OS"}),"\n",(0,s.jsx)("div",{class:"contentTableContainer",children:(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{}),(0,s.jsx)(n.th,{children:"Topic"}),(0,s.jsx)(n.th,{children:"Date Last Updated"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"1"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"git-cheatsheet",children:"Git"})}),(0,s.jsx)(n.td,{children:"December 23, 2020"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"2"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"iterm2-cheatsheet",children:"iTerm2"})}),(0,s.jsx)(n.td,{children:"January 23, 2021"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"3"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"os-ubuntu-cheatsheet",children:"Ubuntu"})}),(0,s.jsx)(n.td,{children:"December 23, 2020"})]})]})]})}),"\n",(0,s.jsx)(n.h3,{id:"web-development",children:"Web Development"}),"\n",(0,s.jsx)("div",{class:"contentTableContainer",children:(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{}),(0,s.jsx)(n.th,{children:"Topic"}),(0,s.jsx)(n.th,{children:"Date Last Updated"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"1"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"mongodb-setup",children:"MongoDB"})}),(0,s.jsx)(n.td,{children:"December 23, 2020"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"2"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"nodejs-auto-reload",children:"NodeJS"})}),(0,s.jsx)(n.td,{children:"December 23, 2020"})]})]})]})})]})}function o(e={}){const{wrapper:n}={...(0,d.M)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},2172:(e,n,t)=>{t.d(n,{I:()=>l,M:()=>r});var s=t(1504);const d={},i=s.createContext(d);function r(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:r(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3344da23.3551f293.js b/assets/js/3344da23.3551f293.js new file mode 100644 index 00000000..93bc0be8 --- /dev/null +++ b/assets/js/3344da23.3551f293.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[4520],{7916:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>o,toc:()=>c});var i=t(7624),s=t(2172);const a={title:"Reading List"},r=void 0,o={id:"reading-list",title:"Reading List",description:"Published on December 23, 2020",source:"@site/docs/reading-list.md",sourceDirName:".",slug:"/reading-list",permalink:"/docs/reading-list",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{title:"Reading List"},sidebar:"docs",previous:{title:"Contents",permalink:"/docs/"},next:{title:"Scaling Memcached",permalink:"/docs/scaling-memcached"}},l={},c=[{value:"2021",id:"2021",level:2},{value:"Articles 2021",id:"articles-2021",level:3},{value:"Books 2021",id:"books-2021",level:3},{value:"2020",id:"2020",level:2},{value:"Articles 2020",id:"articles-2020",level:3},{value:"Conferences 2020",id:"conferences-2020",level:3},{value:"Papers 2020",id:"papers-2020",level:3}];function d(e){const n={a:"a",br:"br",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.M)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.p,{children:["Published on December 23, 2020",(0,i.jsx)(n.br,{}),"\n","Updated on July 3, 2021"]}),"\n",(0,i.jsx)(n.p,{children:"This is a collection of software engineering-related articles, books and videos I have read or watch and recommend to others."}),"\n",(0,i.jsx)(n.h2,{id:"2021",children:"2021"}),"\n",(0,i.jsx)(n.h3,{id:"articles-2021",children:"Articles 2021"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://www.figma.com/blog/how-figmas-multiplayer-technology-works/",children:"Figma: How Figma\u2019s multiplayer technology works"}),": How Figma implemented multiplayer in-house, without having to use operational transforms which is the standard multiplayer algorithm used by apps like Google Docs. I really like how the article explores synchronization issues clearly and succinctly, often with the aid of easy-to-understand animations."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://levelup.gitconnected.com/lessons-learnt-from-scaling-memcached-in-production-86778ab616c7",children:"Melodies Sim: Lessons Learnt from Scaling Memcached in Production"}),": Scaling Memcached with High Availability and Consistency in mind. ",(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.a,{href:"/docs/scaling-memcached",children:"Read my article review!"})})]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"books-2021",children:"Books 2021"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://dataintensive.net/",children:"Martin Kleppmann: Designing Data-Intensive Applications"}),": Reading this book was one of the best decisions I ever made as a fledgling software engineer. It enlightens readers on the fundamental ideas behind the broad range of popular data systems out there today. It also discusses the key trade-offs between these systems, so readers can make better-informed decisions about which to use given the constraints and context."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"2020",children:"2020"}),"\n",(0,i.jsx)(n.h3,{id:"articles-2020",children:"Articles 2020"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://github.blog/2020-08-13-why-write-adrs/",children:"Github: Why Write ADRs"}),": Architecture Decision Records (ADRs) are a great way to document how and why a decision was reached within a codebase. ADRs discuss the problem context, concerns, outcomes, alternative options and accepted trade-offs."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"conferences-2020",children:"Conferences 2020"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://www.youtube.com/watch?v=9LfmrkyP81M",children:"RailsConf 2014 - Keynote: Writing Software by David Heinemeier Hansson"}),": David on how, 'most information system development has very little to do with the ",(0,i.jsx)(n.em,{children:"science"})," part of computer science' and more!"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"papers-2020",children:"Papers 2020"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://www.hashicorp.com/cloud-operating-model",children:"Hashicorp: Unlocking the Cloud Operating Model"}),": Hashicorp's white paper discusses how enterprises can adopt the Cloud Operating Model to maximise the value of their digital transformation efforts. The paper succinctly but clearly explains how one can capitalise on the dynamic nature of the cloud to achieve much more than possible with a static on-premise infrastructure setup."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://www.cs.rutgers.edu/~rmartin/teaching/fall15/papers/arch2/cdn.pdf",children:"The Akamai Network: A Platform for High-Performance Internet Application"}),": The creators of Akamai's CDN (Content Delivery Network) share how Akamai overcome numerous network challenges such as the middle-mile bottleneck problem in order to enable the delivery of high-performance Internet applications."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://web.mit.edu/Saltzer/www/publications/endtoend/endtoend.pdf",children:"End-To-End Arguments In System Design by J.H. Saltzer, D.P. Reed and D.D. Clark"}),": The authors make a strong case against prematurely performing a function at a lower-level in anticipation of usage at a higher-level in a hypothetical future and more."]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.M)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},2172:(e,n,t)=>{t.d(n,{I:()=>o,M:()=>r});var i=t(1504);const s={},a=i.createContext(s);function r(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3614913f.b2521fee.js b/assets/js/3614913f.b2521fee.js new file mode 100644 index 00000000..11f28603 --- /dev/null +++ b/assets/js/3614913f.b2521fee.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[3431],{6254:a=>{a.exports=JSON.parse('{"label":"analytics","permalink":"/blog/tags/analytics","allTagsPath":"/blog/tags","count":1,"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/3bdc16c1.8a645b01.js b/assets/js/3bdc16c1.8a645b01.js new file mode 100644 index 00000000..acc82544 --- /dev/null +++ b/assets/js/3bdc16c1.8a645b01.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[7576],{248:a=>{a.exports=JSON.parse('{"label":"sharing","permalink":"/blog/tags/sharing","allTagsPath":"/blog/tags","count":2,"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/3cee07f2.fac10c02.js b/assets/js/3cee07f2.fac10c02.js new file mode 100644 index 00000000..e9e04019 --- /dev/null +++ b/assets/js/3cee07f2.fac10c02.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[586],{2640:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>s,toc:()=>l});var n=a(7624),o=a(2172);const i={slug:"why-you-should-read-ddia",title:"Why every Software Engineer should read Designing Data-Intensive Applications",author:"Evan Tay",author_url:"https://github.com/DigiPie",author_title:"Software Engineer at Padlet",author_image_url:"https://avatars2.githubusercontent.com/u/13582874",tags:["book-review","software-engineering","software-architecture"]},r=void 0,s={permalink:"/blog/why-you-should-read-ddia",editUrl:"https://github.com/DigiPie/kaya-folio/tree/main/website/blog/2021-09-10-why-you-should-read-ddia.md",source:"@site/blog/2021-09-10-why-you-should-read-ddia.md",title:"Why every Software Engineer should read Designing Data-Intensive Applications",description:"Picking up this book was one of the best decisions I made for my fledgling software engineering career. Its insights enabled me to make well-reasoned software design decisions, and confidently communicate them, in spite of my relative professional inexperience. Given how helpful it has been, I\u2019m here today to share more about the impression it has left on me, and convince you that it is a must-read if you are a software engineer.",date:"2021-09-10T00:00:00.000Z",formattedDate:"September 10, 2021",tags:[{label:"book-review",permalink:"/blog/tags/book-review"},{label:"software-engineering",permalink:"/blog/tags/software-engineering"},{label:"software-architecture",permalink:"/blog/tags/software-architecture"}],readingTime:2.475,hasTruncateMarker:!0,authors:[{name:"Evan Tay",title:"Software Engineer at Padlet",url:"https://github.com/DigiPie",imageURL:"https://avatars2.githubusercontent.com/u/13582874"}],frontMatter:{slug:"why-you-should-read-ddia",title:"Why every Software Engineer should read Designing Data-Intensive Applications",author:"Evan Tay",author_url:"https://github.com/DigiPie",author_title:"Software Engineer at Padlet",author_image_url:"https://avatars2.githubusercontent.com/u/13582874",tags:["book-review","software-engineering","software-architecture"]},unlisted:!1,nextItem:{title:"Integrating PostHog product analytics with Docusaurus v2 on GitHub Pages",permalink:"/blog/docusaurus-posthog"}},u={authorsImageUrls:[void 0]},l=[];function c(e){const t={p:"p",...(0,o.M)(),...e.components};return(0,n.jsx)(t.p,{children:"Picking up this book was one of the best decisions I made for my fledgling software engineering career. Its insights enabled me to make well-reasoned software design decisions, and confidently communicate them, in spite of my relative professional inexperience. Given how helpful it has been, I\u2019m here today to share more about the impression it has left on me, and convince you that it is a must-read if you are a software engineer."})}function h(e={}){const{wrapper:t}={...(0,o.M)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},2172:(e,t,a)=>{a.d(t,{I:()=>s,M:()=>r});var n=a(1504);const o={},i=n.createContext(o);function r(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3e991810.0bcc367f.js b/assets/js/3e991810.0bcc367f.js new file mode 100644 index 00000000..5f769ca2 --- /dev/null +++ b/assets/js/3e991810.0bcc367f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[2020],{4656:e=>{e.exports=JSON.parse('{"label":"book-review","permalink":"/blog/tags/book-review","allTagsPath":"/blog/tags","count":1,"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/40e2aa62.e3cff75d.js b/assets/js/40e2aa62.e3cff75d.js new file mode 100644 index 00000000..261e756c --- /dev/null +++ b/assets/js/40e2aa62.e3cff75d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[2392],{7896:e=>{e.exports=JSON.parse('{"label":"microservices","permalink":"/blog/tags/microservices","allTagsPath":"/blog/tags","count":1,"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/44183a86.7ee83ca2.js b/assets/js/44183a86.7ee83ca2.js new file mode 100644 index 00000000..3f41baed --- /dev/null +++ b/assets/js/44183a86.7ee83ca2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[6942],{680:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/ci","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/4552.03f91008.js b/assets/js/4552.03f91008.js new file mode 100644 index 00000000..20296333 --- /dev/null +++ b/assets/js/4552.03f91008.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[4552],{6592:(e,t,n)=>{n.d(t,{c:()=>s});n(1504);var i=n(5456),o=n(4357),a=n(6448),c=n(7624);function s(e){let{className:t}=e;return(0,c.jsx)("main",{className:(0,i.c)("container margin-vert--xl",t),children:(0,c.jsx)("div",{className:"row",children:(0,c.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,c.jsx)(a.c,{as:"h1",className:"hero__title",children:(0,c.jsx)(o.c,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,c.jsx)("p",{children:(0,c.jsx)(o.c,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,c.jsx)("p",{children:(0,c.jsx)(o.c,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}},4552:(e,t,n)=>{n.r(t),n.d(t,{default:()=>r});n(1504);var i=n(4357),o=n(5756),a=n(9012),c=n(6592),s=n(7624);function r(){const e=(0,i.G)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.U7,{title:e}),(0,s.jsx)(a.c,{children:(0,s.jsx)(c.c,{})})]})}}}]); \ No newline at end of file diff --git a/assets/js/462880c5.2d4747f6.js b/assets/js/462880c5.2d4747f6.js new file mode 100644 index 00000000..4025ea07 --- /dev/null +++ b/assets/js/462880c5.2d4747f6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[5244],{848:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>d,metadata:()=>r,toc:()=>c});var s=o(7624),t=o(2172);const d={title:"NodeJS Auto-reload server"},i=void 0,r={id:"nodejs-auto-reload",title:"NodeJS Auto-reload server",description:"Published on December 23, 2020",source:"@site/docs/nodejs-auto-reload.md",sourceDirName:".",slug:"/nodejs-auto-reload",permalink:"/docs/nodejs-auto-reload",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{title:"NodeJS Auto-reload server"},sidebar:"docs",previous:{title:"MongoDB Cheatsheet",permalink:"/docs/mongodb-cheatsheet"},next:{title:"NodeJS Set npm run shell",permalink:"/docs/nodejs-set-npm-run-shell"}},l={},c=[{value:"Nodemon",id:"nodemon",level:2},{value:"How-to-use",id:"how-to-use",level:3},{value:"Add to npm scripts",id:"add-to-npm-scripts",level:3},{value:"Resources",id:"resources",level:2}];function a(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.M)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"Published on December 23, 2020"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsxs)(n.em,{children:["This document was migrated from ",(0,s.jsx)(n.a,{href:"https://digipie.github.io/digidocs/nodejs/auto-reload/",children:"DigiDocs"})]})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Problem:"})," Manually reloading the NodeJS server by hitting ",(0,s.jsx)(n.code,{children:"Ctrl + C"})," and entering ",(0,s.jsx)(n.code,{children:"npm start"})," repeatedly in development is exhausting."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Solution:"})," Automatically reload the server each time there is a change!"]}),"\n",(0,s.jsx)(n.h2,{id:"nodemon",children:"Nodemon"}),"\n",(0,s.jsx)(n.admonition,{title:"Cite",type:"note",children:(0,s.jsx)(n.p,{children:"Nodemon is a utility that will monitor for any changes in your source and automatically restart your server."})}),"\n",(0,s.jsx)(n.h3,{id:"how-to-use",children:"How-to-use"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"npm i -g nodemon\n"})}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Install ",(0,s.jsx)(n.code,{children:"nodemon"}),": ",(0,s.jsx)(n.code,{children:"npm i -g nodemon"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Replace ",(0,s.jsx)(n.code,{children:"node"})," with ",(0,s.jsx)(n.code,{children:"nodemon"})," in your command. For example, change ",(0,s.jsx)(n.code,{children:"node index.js"})," to ",(0,s.jsx)(n.code,{children:"nodemon index.js"}),". That's it."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"add-to-npm-scripts",children:"Add to npm scripts"}),"\n",(0,s.jsx)(n.p,{children:"You can also add it to npm scripts to make life even easier."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'{\n "scripts": {\n "start": "node index.js",\n "dev": "nodemon index.js"\n }\n}\n'})}),"\n",(0,s.jsxs)(n.p,{children:["After doing so, you can enter ",(0,s.jsx)(n.code,{children:"npm run dev"})," subsequently, which will resolve to ",(0,s.jsx)(n.code,{children:"nodemon index.js"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"resources",children:"Resources"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://digipie.github.io/digidocs/nodejs/auto-reload/",children:"Original copy of this document at DigiDocs"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://nodemon.io/",children:"Nodemon's landing page"})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.M)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},2172:(e,n,o)=>{o.d(n,{I:()=>r,M:()=>i});var s=o(1504);const t={},d=s.createContext(t);function i(e){const n=s.useContext(d);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),s.createElement(d.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/48332b76.befa346d.js b/assets/js/48332b76.befa346d.js new file mode 100644 index 00000000..d0707d21 --- /dev/null +++ b/assets/js/48332b76.befa346d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[8284],{9924:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>c,default:()=>d,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var t=i(7624),r=i(2172);const s={title:"Git Cheatsheet"},c=void 0,a={id:"git-cheatsheet",title:"Git Cheatsheet",description:"Published on December 24, 2020",source:"@site/docs/git-cheatsheet.md",sourceDirName:".",slug:"/git-cheatsheet",permalink:"/docs/git-cheatsheet",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{title:"Git Cheatsheet"},sidebar:"docs",previous:{title:"JS Cheatsheet",permalink:"/docs/js-cheatsheet"},next:{title:"Git Ignore file",permalink:"/docs/git-ignore-file"}},o={},l=[{value:"Get branch information",id:"get-branch-information",level:2},{value:"Delete local and remote branches",id:"delete-local-and-remote-branches",level:2},{value:"Reset a branch",id:"reset-a-branch",level:2},{value:"Ignore a file's changes temporarily",id:"ignore-a-files-changes-temporarily",level:2},{value:"Resources",id:"resources",level:2}];function h(e){const n={a:"a",admonition:"admonition",br:"br",code:"code",em:"em",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.M)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Published on December 24, 2020"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsxs)(n.em,{children:["This document was migrated from ",(0,t.jsx)(n.a,{href:"https://digipie.github.io/digidocs/git/cheat-sheet/",children:"DigiDocs"})]})}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["Basic knowledge of Git is assumed in this tutorial. If you are new to Git, visit ",(0,t.jsx)(n.a,{href:"http://rogerdudler.github.io/git-guide/",children:"http://rogerdudler.github.io/git-guide/"})," to learn the basics first."]})}),"\n",(0,t.jsx)(n.h2,{id:"get-branch-information",children:"Get branch information"}),"\n",(0,t.jsx)(n.p,{children:"I want to find out what branches I have locally:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"git branch\n"})}),"\n",(0,t.jsx)(n.p,{children:"I want to find out what is the upstream branch for a given branch:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"git branch -v\n"})}),"\n",(0,t.jsx)(n.p,{children:"Even more verbose information:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"git branch -vv\n"})}),"\n",(0,t.jsx)(n.h2,{id:"delete-local-and-remote-branches",children:"Delete local and remote branches"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Example scenario:"}),(0,t.jsx)(n.br,{}),"\n","I have merged my development branch ",(0,t.jsx)(n.code,{children:"feat/new-feature"})," into ",(0,t.jsx)(n.code,{children:"develop"})," and wish to delete the local and remote branch of ",(0,t.jsx)(n.code,{children:"feat/new-feature"})," now."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"The solution:"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Delete the local branch:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"git branch -d feat/new-feature"})}),"\n",(0,t.jsxs)(n.li,{children:["or with ",(0,t.jsx)(n.code,{children:"--force"}),": ",(0,t.jsx)(n.code,{children:"git branch -D feat/new-feature"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["Delete the remote branch: ",(0,t.jsx)(n.code,{children:"git push -d "})]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"The general command format it is based on:"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Delete a local branch:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"git branch -d|--delete "})}),"\n",(0,t.jsxs)(n.li,{children:["or with ",(0,t.jsx)(n.code,{children:"--force"}),": ",(0,t.jsx)(n.code,{children:"git branch -D "})]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["Delete a remote branch: ",(0,t.jsx)(n.code,{children:"git push -d|--delete "})]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"reset-a-branch",children:"Reset a branch"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Example scenario:"}),(0,t.jsx)(n.br,{}),"\n","I messed up my local ",(0,t.jsx)(n.code,{children:"master"})," branch. I want to reset it such that it will revert to being the same as ",(0,t.jsx)(n.code,{children:"origin/master"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"The one-line solution:"}),(0,t.jsx)(n.br,{}),"\n",(0,t.jsx)(n.code,{children:"git checkout -B master origin/master"})]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"The general command format it is based on:"}),(0,t.jsx)(n.br,{}),"\n",(0,t.jsx)(n.code,{children:"git checkout -b|-B []"})]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"How does it work?"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"git checkout -b|-B "})," is typically used to create and switch to a new branch. However, if ",(0,t.jsx)(n.code,{children:""})," already exists, it will be reset instead."]}),"\n",(0,t.jsx)(n.admonition,{title:"Cite",type:"note",children:(0,t.jsxs)(n.p,{children:["If ",(0,t.jsx)(n.code,{children:"-B"})," is given, ",(0,t.jsx)(n.code,{children:""})," is created if it doesn\u2019t exist; otherwise, it is reset."]})}),"\n",(0,t.jsx)(n.h2,{id:"ignore-a-files-changes-temporarily",children:"Ignore a file's changes temporarily"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Example scenario:"}),(0,t.jsx)(n.br,{}),"\n","I want to stop tracking changes for a given file temporarily, as I am still editing it and do not want an incomplete copy of it to be added to staging when I do ",(0,t.jsx)(n.code,{children:"git add *"})," (to add all changes in the current path)."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"The solution:"})}),"\n",(0,t.jsx)(n.p,{children:"To temporarily ignore (stop tracking) a file:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"git update-index --assume-unchanged \n"})}),"\n",(0,t.jsx)(n.p,{children:"To start tracking a file again:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"git update-index --no-assume-unchanged \n"})}),"\n",(0,t.jsxs)(n.p,{children:["See ",(0,t.jsx)(n.a,{href:"git-ignore-file#using-git-update-index",children:"Git Ignore file"})," for more information."]}),"\n",(0,t.jsx)(n.h2,{id:"resources",children:"Resources"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://digipie.github.io/digidocs/git/cheat-sheet/",children:"Original copy of this document at DigiDocs"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://git-scm.com/docs/git-branch",children:"gitscm's documentation for branch"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://git-scm.com/docs/git-checkout",children:"gitscm's documentation for checkout"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://git-scm.com/docs/git-push",children:"gitscm's documentation for push"})}),"\n"]})]})}function d(e={}){const{wrapper:n}={...(0,r.M)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},2172:(e,n,i)=>{i.d(n,{I:()=>a,M:()=>c});var t=i(1504);const r={},s=t.createContext(r);function c(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:c(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5b2b3d99.0bdc5dcc.js b/assets/js/5b2b3d99.0bdc5dcc.js new file mode 100644 index 00000000..e95bd63f --- /dev/null +++ b/assets/js/5b2b3d99.0bdc5dcc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[6040],{4416:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>r,toc:()=>h});var i=a(7624),n=a(2172);const o={slug:"why-you-should-read-ddia",title:"Why every Software Engineer should read Designing Data-Intensive Applications",author:"Evan Tay",author_url:"https://github.com/DigiPie",author_title:"Software Engineer at Padlet",author_image_url:"https://avatars2.githubusercontent.com/u/13582874",tags:["book-review","software-engineering","software-architecture"]},s=void 0,r={permalink:"/blog/why-you-should-read-ddia",editUrl:"https://github.com/DigiPie/kaya-folio/tree/main/website/blog/2021-09-10-why-you-should-read-ddia.md",source:"@site/blog/2021-09-10-why-you-should-read-ddia.md",title:"Why every Software Engineer should read Designing Data-Intensive Applications",description:"Picking up this book was one of the best decisions I made for my fledgling software engineering career. Its insights enabled me to make well-reasoned software design decisions, and confidently communicate them, in spite of my relative professional inexperience. Given how helpful it has been, I\u2019m here today to share more about the impression it has left on me, and convince you that it is a must-read if you are a software engineer.",date:"2021-09-10T00:00:00.000Z",formattedDate:"September 10, 2021",tags:[{label:"book-review",permalink:"/blog/tags/book-review"},{label:"software-engineering",permalink:"/blog/tags/software-engineering"},{label:"software-architecture",permalink:"/blog/tags/software-architecture"}],readingTime:2.475,hasTruncateMarker:!0,authors:[{name:"Evan Tay",title:"Software Engineer at Padlet",url:"https://github.com/DigiPie",imageURL:"https://avatars2.githubusercontent.com/u/13582874"}],frontMatter:{slug:"why-you-should-read-ddia",title:"Why every Software Engineer should read Designing Data-Intensive Applications",author:"Evan Tay",author_url:"https://github.com/DigiPie",author_title:"Software Engineer at Padlet",author_image_url:"https://avatars2.githubusercontent.com/u/13582874",tags:["book-review","software-engineering","software-architecture"]},unlisted:!1,nextItem:{title:"Integrating PostHog product analytics with Docusaurus v2 on GitHub Pages",permalink:"/blog/docusaurus-posthog"}},l={authorsImageUrls:[void 0]},h=[];function c(e){const t={a:"a",blockquote:"blockquote",em:"em",img:"img",p:"p",...(0,n.M)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"Picking up this book was one of the best decisions I made for my fledgling software engineering career. Its insights enabled me to make well-reasoned software design decisions, and confidently communicate them, in spite of my relative professional inexperience. Given how helpful it has been, I\u2019m here today to share more about the impression it has left on me, and convince you that it is a must-read if you are a software engineer."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Designing Data-Intensive Applications",src:a(2576).c+"",width:"748",height:"982"})}),"\n",(0,i.jsxs)(t.p,{children:["I kickstarted my engineering career back in January 2021, as a full stack engineer at ",(0,i.jsx)(t.a,{href:"https://padlet.com/",children:"Padlet"}),". During the onboarding process, my (amazing) mentor, Brian, imparted a great deal of guidance to me. One of his tips was that I should take a look at Kleppman\u2019s ",(0,i.jsx)(t.a,{href:"https://dataintensive.net/",children:"Designing Data-Intensive Applications"}),". Thankfully, we had two copies of the book in the office, purchased by my (also amazing) boss, Shu Yang, who recommended me to read it too. I\u2019m thankful I ended up taking their advice, because I was able to glean so much insights from Kleppman, which happened to be highly applicable to the infrastructure and full stack projects I was developing."]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:'"This book should be required reading for software engineers." - Kevin Scott, Chief Technology Officer at Microsoft'}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Like Brian, Shu Yang and Kevin, I now also believe all software engineers working on a distributed, cloud or data-intensive system will greatly benefit from reading the book. It provides the fundamental framework for thinking about these systems, and also the vocabulary to communicate such thoughts. Coupled together, these insights will empower you to make better design decisions and effectively convey them, even if you lack prior experience in the problem domain."}),"\n",(0,i.jsx)(t.p,{children:"Kleppman also compared the key fundamental ideas behind the broad range of popular data systems out there today, by discussing their advantages, limitations and trade-offs, rather than diving deep into the intricacies of each tool. This was ideal given that the book's objective was to help us choose the right tool for the right occasion, which these characteristics will be more relevant for."}),"\n",(0,i.jsx)(t.p,{children:"If you lack the time (or will) to pour over the entire book, you should at least check out the opening chapter. In it, Kleppman gives a comprehensive yet succinct overview of what I mentioned above, and provides a clear, detailed explanation of the three key principles in designing data-intensive system architecture: Reliability, Scalability and Maintainability. Just reading this first chapter alone was beneficial to me, as I was now able to better understand and discuss architectural concerns with my team."}),"\n",(0,i.jsxs)(t.p,{children:["If you're still not convinced whether to invest your time into this book, you can check out a ",(0,i.jsx)(t.a,{href:"/docs/reliable-scalable-maintainable",children:"summary I've written for the first chapter"}),", where I\u2019ve condensed Kleppman\u2019s opening discourse on Reliability, Scalability and Maintainability. I\u2019m certain it\u2019ll provide a glimpse into the many lessons that ",(0,i.jsx)(t.a,{href:"https://dataintensive.net/",children:"Designing Data-Intensive Applications"})," has to share, and if you do read the book, definitely let me know what you think!"]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsxs)(t.em,{children:["Special thanks to ",(0,i.jsx)(t.a,{href:"https://www.linkedin.com/in/thebestvanessatay",children:"Vanessa Tay"})," for editing this!"]})})]})}function d(e={}){const{wrapper:t}={...(0,n.M)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},2576:(e,t,a)=>{a.d(t,{c:()=>i});const i=a.p+"assets/images/ddia-30dc818fa9e54c52f11a89f8279d4f28.png"},2172:(e,t,a)=>{a.d(t,{I:()=>r,M:()=>s});var i=a(1504);const n={},o=i.createContext(n);function s(e){const t=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:s(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5d92e2d4.3d0fc586.js b/assets/js/5d92e2d4.3d0fc586.js new file mode 100644 index 00000000..e4a38dc7 --- /dev/null +++ b/assets/js/5d92e2d4.3d0fc586.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[9392],{2756:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>r,toc:()=>d});var t=o(7624),i=o(2172);const s={title:"MongoDB Setup"},a=void 0,r={id:"mongodb-setup",title:"MongoDB Setup",description:"Published on December 23, 2020",source:"@site/docs/mongodb-setup.md",sourceDirName:".",slug:"/mongodb-setup",permalink:"/docs/mongodb-setup",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{title:"MongoDB Setup"},sidebar:"docs",previous:{title:"Ubuntu Cheatsheet",permalink:"/docs/os-ubuntu-cheatsheet"},next:{title:"MongoDB Cheatsheet",permalink:"/docs/mongodb-cheatsheet"}},c={},d=[{value:"Installation and config",id:"installation-and-config",level:2},{value:"Create a new collection",id:"create-a-new-collection",level:2},{value:"Create a new user",id:"create-a-new-user",level:2},{value:"connection-string format",id:"connection-string-format",level:2},{value:"Authentication",id:"authentication",level:3},{value:"Verify connection-string",id:"verify-connection-string",level:3},{value:"Resources",id:"resources",level:2}];function l(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.M)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Published on December 23, 2020"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsxs)(n.em,{children:["This document was migrated from ",(0,t.jsx)(n.a,{href:"https://digipie.github.io/digidocs/mongodb/local-setup/",children:"DigiDocs"})]})}),"\n",(0,t.jsxs)(n.p,{children:["The purpose of this guide is to quickly set up a local copy of MongoDB ",(0,t.jsx)(n.strong,{children:"on Windows"})," for local development purposes. Authentication will not be enabled or covered in this tutorial."]}),"\n",(0,t.jsx)(n.h2,{id:"installation-and-config",children:"Installation and config"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Install ",(0,t.jsx)(n.a,{href:"https://docs.mongodb.com/manual/administration/install-community/",children:"MongoDB Community Edition"}),", the standard configuration is fine."]}),"\n",(0,t.jsxs)(n.li,{children:["Take note of where your installation's ",(0,t.jsx)(n.code,{children:"bin"})," folder is at, it should be at ",(0,t.jsx)(n.code,{children:"C:\\Program Files\\MongoDB\\Server\\4.2\\bin"})," by default."]}),"\n",(0,t.jsxs)(n.li,{children:["Add it to your environment variables. See guide ",(0,t.jsx)(n.a,{href:"https://www.architectryan.com/2018/03/17/add-to-the-path-on-windows-10/",children:"here"}),"."]}),"\n",(0,t.jsx)(n.li,{children:"Open your terminal - if you already have it opened, exit and re-open it to reload the enviroment variables."}),"\n",(0,t.jsxs)(n.li,{children:["Enter ",(0,t.jsx)(n.code,{children:"mongo"})," to access MongoDB."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"create-a-new-collection",children:"Create a new collection"}),"\n",(0,t.jsxs)(n.ol,{start:"6",children:["\n",(0,t.jsxs)(n.li,{children:["Next, create a new collection, use the ",(0,t.jsx)(n.code,{children:"use"})," command:"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"# To display the database you are using\ndb\n\n# To switch databases use `use `\n# To create a new database, switch to a non-existing database\nuse dev\n\n# Template\nuse \n"})}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["Read ",(0,t.jsx)(n.a,{href:"https://docs.mongodb.com/manual/mongo/",children:"https://docs.mongodb.com/manual/mongo/"})," for more information."]})}),"\n",(0,t.jsx)(n.h2,{id:"create-a-new-user",children:"Create a new user"}),"\n",(0,t.jsxs)(n.ol,{start:"7",children:["\n",(0,t.jsxs)(n.li,{children:["Next, create a user with ",(0,t.jsx)(n.code,{children:"readWrite"})," and ",(0,t.jsx)(n.code,{children:"dbAdmin"})," roles, using the ",(0,t.jsx)(n.code,{children:"db.createUser()"})," command:"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'# Switch to the database you want to add the user to\nuse dev\n\n# Create the user with `readWrite` and `dbAdmin` rights\ndb.createUser(\n {\n user: "devadmin",\n pwd: passwordPrompt(),\n roles: [ "readWrite", "dbAdmin" ]\n }\n)\n\n# Template\ndb.createUser(\n {\n user: ,\n pwd: ,\n roles: [ "readWrite", "dbAdmin" ]\n }\n)\n'})}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["Read ",(0,t.jsx)(n.a,{href:"https://docs.mongodb.com/manual/mongo/",children:"https://docs.mongodb.com/manual/mongo/"})," for more information."]})}),"\n",(0,t.jsx)(n.h2,{id:"connection-string-format",children:"connection-string format"}),"\n",(0,t.jsx)(n.p,{children:"The connection-string is used to access the MongoDB instance from your applications (i.e. MongooseJS). The format of your connection-string is as follows:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[database][?options]]\n# Parts in [ and ] are optional\n\n# Example, without authentication\nmongodb://localhost:27017/dev\n\n# Example, with authentication\nmongodb://devadmin:@localhost:27017/dev\n# Replace the with your actual password\n"})}),"\n",(0,t.jsx)(n.admonition,{type:"caution",children:(0,t.jsxs)(n.p,{children:["If the username or password includes the at sign @, colon :, slash /, or the percent sign % character, use percent encoding. See ",(0,t.jsx)(n.a,{href:"https://docs.mongodb.com/manual/reference/connection-string/#examples",children:"https://docs.mongodb.com/manual/reference/connection-string/#examples"})," for more information."]})}),"\n",(0,t.jsx)(n.h3,{id:"authentication",children:"Authentication"}),"\n",(0,t.jsx)(n.p,{children:"Given that we are not enabling authentication, you can use either of the above connection-string URI formats."}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["Read ",(0,t.jsx)(n.a,{href:"https://docs.mongodb.com/manual/tutorial/enable-authentication/",children:"https://docs.mongodb.com/manual/tutorial/enable-authentication/"})," for more information."]})}),"\n",(0,t.jsx)(n.h3,{id:"verify-connection-string",children:"Verify connection-string"}),"\n",(0,t.jsxs)(n.p,{children:["To verify your connection-string, simply use ",(0,t.jsx)(n.code,{children:"mongo "}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"# Example, without authentication\nmongo mongodb://localhost:27017/dev\n\n# Example, with authentication\nmongo mongodb://devadmin:@localhost:27017/dev\n"})}),"\n",(0,t.jsx)(n.h2,{id:"resources",children:"Resources"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://digipie.github.io/digidocs/mongodb/local-setup/",children:"Original copy of this document at DigiDocs"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://docs.mongodb.com/manual/administration/install-community/",children:"MongoDB's official guide to Install MongoDB Community Edition"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://www.architectryan.com/2018/03/17/add-to-the-path-on-windows-10/",children:"Architect Ryan's guide to Add to the PATH on Windows 10"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://docs.mongodb.com/manual/mongo/",children:"MongoDB's official guide to the mongo shell"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://docs.mongodb.com/manual/reference/method/db.createUser/",children:"MongoDB's official guide to db.createUser()"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://docs.mongodb.com/manual/reference/connection-string/",children:"MongoDB's official guide to Connection String URI Format"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://docs.mongodb.com/manual/tutorial/enable-authentication/",children:"MongoDB's official guide to Enable Access Control"})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.M)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},2172:(e,n,o)=>{o.d(n,{I:()=>r,M:()=>a});var t=o(1504);const i={},s=t.createContext(i);function a(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5e95c892.a288ae67.js b/assets/js/5e95c892.a288ae67.js new file mode 100644 index 00000000..66b7eb8b --- /dev/null +++ b/assets/js/5e95c892.a288ae67.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[4304],{3564:(e,c,a)=>{a.r(c),a.d(c,{default:()=>o});a(1504);var r=a(5456),s=a(5756),n=a(5864),t=a(5464),u=a(9012),l=a(7624);function o(e){return(0,l.jsx)(s.cr,{className:(0,r.c)(n.W.wrapper.docsPages),children:(0,l.jsx)(u.c,{children:(0,t.k)(e.route.routes)})})}}}]); \ No newline at end of file diff --git a/assets/js/5fc3ba7e.fb19b323.js b/assets/js/5fc3ba7e.fb19b323.js new file mode 100644 index 00000000..db51950a --- /dev/null +++ b/assets/js/5fc3ba7e.fb19b323.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[2740],{8772:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>c,metadata:()=>t,toc:()=>l});var s=i(7624),o=i(2172);const c={title:"Docker Cheatsheet"},r=void 0,t={id:"docker-cheatsheet",title:"Docker Cheatsheet",description:"Published on December 24, 2020",source:"@site/docs/docker-cheatsheet.md",sourceDirName:".",slug:"/docker-cheatsheet",permalink:"/docs/docker-cheatsheet",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{title:"Docker Cheatsheet"},sidebar:"docs",previous:{title:"Ikigai",permalink:"/docs/ikigai"},next:{title:"GKE Cheatsheet",permalink:"/docs/gcp-gke-cheatsheet"}},d={},l=[{value:"Useful Docker commands",id:"useful-docker-commands",level:2},{value:"Starting an interactive shell",id:"starting-an-interactive-shell",level:3},{value:"Stopping and removing containers",id:"stopping-and-removing-containers",level:3},{value:"Inspecting container metadata",id:"inspecting-container-metadata",level:3},{value:"Viewing container logs",id:"viewing-container-logs",level:3},{value:"Docker and Github",id:"docker-and-github",level:2},{value:"Deploy script",id:"deploy-script",level:3},{value:"Resources",id:"resources",level:2}];function a(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.M)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"Published on December 24, 2020"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsxs)(n.em,{children:["This document was migrated from ",(0,s.jsx)(n.a,{href:"https://digipie.github.io/digidocs/container/docker/",children:"DigiDocs"})]})}),"\n",(0,s.jsx)(n.p,{children:"In this section you will find my notes on using Docker for the deployment of Git projects."}),"\n",(0,s.jsx)(n.h2,{id:"useful-docker-commands",children:"Useful Docker commands"}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["You do not have to write out the ",(0,s.jsx)(n.code,{children:"CONTAINER_ID"})," in full. The partial ",(0,s.jsx)(n.code,{children:"CONTAINER_ID"})," specified need only uniquely identify the container. Given a container 'aa151b912448' and 'aa153cd14238', ",(0,s.jsx)(n.code,{children:"docker logs aa15"})," will not work, but ",(0,s.jsx)(n.code,{children:"docker logs aa151"})," will."]})}),"\n",(0,s.jsx)(n.h3,{id:"starting-an-interactive-shell",children:"Starting an interactive shell"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker exec -it [CONTAINER_ID] bash\n"})}),"\n",(0,s.jsx)(n.h3,{id:"stopping-and-removing-containers",children:"Stopping and removing containers"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker stop $(docker ps -q)\ndocker rm $(docker ps -aq)\n"})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"docker ps"})," options:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-q"}),": Only display numeric IDs"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-a"}),": Show all containers (default shows just running)"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"inspecting-container-metadata",children:"Inspecting container metadata"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker inspect [CONTAINER_ID]\n"})}),"\n",(0,s.jsx)(n.h3,{id:"viewing-container-logs",children:"Viewing container logs"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Typical command:"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker logs [CONTAINER_ID]\n"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Follow log output for a specified duration:"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker logs -f --until=[TIME]\n"})}),"\n",(0,s.jsx)(n.p,{children:"TIME can be a TIMESTAMP or relative (e.g. '10m' or '5s')"}),"\n",(0,s.jsx)(n.h2,{id:"docker-and-github",children:"Docker and Github"}),"\n",(0,s.jsx)(n.h3,{id:"deploy-script",children:"Deploy script"}),"\n",(0,s.jsxs)(n.p,{children:["This script assumes that the working directory contains a ",(0,s.jsx)(n.code,{children:".git"})," directory, ",(0,s.jsx)(n.code,{children:"Dockerfile"})," and ",(0,s.jsx)(n.code,{children:"package.json"}),". A ",(0,s.jsx)(n.code,{children:".gitignore"})," and a ",(0,s.jsx)(n.code,{children:".dockerignore"})," file may be useful too. It is also assumed that the project dependencies have been installed using ",(0,s.jsx)(n.code,{children:"npm install"}),"."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"deploy.sh"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'IMAGE_NAME=""\nVERSION="" # Can be left blank\nCONTAINER_NAME=""\nCONTAINER_PORT="" # To be mapped to HOST_PORT\nHOST_PORT="" # The port clients will access\n\ndocker stop $CONTAINER_NAME # Stop the running container\ndocker system prune -af # Removes the container and all unused images\ngit pull origin master # Pulls latest source files and image\ndocker build -t $IMAGE_NAME .\ndocker run --name $CONTAINER_NAME -p $CONTAINER_PORT:$HOST_PORT -d $IMAGE_NAME:$VERSION\n'})}),"\n",(0,s.jsx)(n.p,{children:"Before the script can be used, replace the following placeholders:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"IMAGE_NAME"})," : The name of your image."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"VERSION"})," : The version of your image. Can be left blank."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"CONTAINER_NAME"})," : The desired name of your container."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"CONTAINER_PORT"})," : The port of your container which your application is running on."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"HOST_PORT"})," : The host port your container port will be mapped to. This is the port that is exposed on the host system."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"resources",children:"Resources"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://digipie.github.io/digidocs/container/docker/",children:"Original copy of this document at DigiDocs"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://www.digitalocean.com/community/tutorials/how-to-build-a-node-js-application-with-docker#step-4-%E2%80%94-using-a-repository-to-work-with-images",children:"How To Build a Node.js Application with Docker"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://docs.docker.com/engine/reference/commandline/logs/",children:"docker logs"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://docs.docker.com/engine/reference/commandline/ps/",children:"docker ps"})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.M)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},2172:(e,n,i)=>{i.d(n,{I:()=>t,M:()=>r});var s=i(1504);const o={},c=s.createContext(o);function r(e){const n=s.useContext(c);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(c.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6044.a57e0516.js b/assets/js/6044.a57e0516.js new file mode 100644 index 00000000..1a8e9ebb --- /dev/null +++ b/assets/js/6044.a57e0516.js @@ -0,0 +1 @@ +(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[6044],{304:(e,t,n)=>{"use strict";n.d(t,{c:()=>L});var s=n(1504),c=n(7624);function o(e){var t;const{mdxAdmonitionTitle:n,rest:o}=function(e){const t=s.Children.toArray(e),n=t.find((e=>s.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),o=t.filter((e=>e!==n));return{mdxAdmonitionTitle:null==n?void 0:n.props.children,rest:o.length>0?(0,c.jsx)(c.Fragment,{children:o}):null}}(e.children),a=null!=(t=e.title)?t:n;return{...e,...a&&{title:a},children:o}}var a=n(5456),i=n(4357),r=n(5864);const l={admonition:"admonition_xJq3",admonitionHeading:"admonitionHeading_Gvgb",admonitionIcon:"admonitionIcon_Rf37",admonitionContent:"admonitionContent_BuS1"};function d(e){let{type:t,className:n,children:s}=e;return(0,c.jsx)("div",{className:(0,a.c)(r.W.common.admonition,r.W.common.admonitionType(t),l.admonition,n),children:s})}function u(e){let{icon:t,title:n}=e;return(0,c.jsxs)("div",{className:l.admonitionHeading,children:[(0,c.jsx)("span",{className:l.admonitionIcon,children:t}),n]})}function m(e){let{children:t}=e;return t?(0,c.jsx)("div",{className:l.admonitionContent,children:t}):null}function h(e){const{type:t,icon:n,title:s,children:o,className:a}=e;return(0,c.jsxs)(d,{type:t,className:a,children:[(0,c.jsx)(u,{title:s,icon:n}),(0,c.jsx)(m,{children:o})]})}function p(e){return(0,c.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,c.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const f={icon:(0,c.jsx)(p,{}),title:(0,c.jsx)(i.c,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function g(e){return(0,c.jsx)(h,{...f,...e,className:(0,a.c)("alert alert--secondary",e.className),children:e.children})}function x(e){return(0,c.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,c.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const b={icon:(0,c.jsx)(x,{}),title:(0,c.jsx)(i.c,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function j(e){return(0,c.jsx)(h,{...b,...e,className:(0,a.c)("alert alert--success",e.className),children:e.children})}function v(e){return(0,c.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,c.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const N={icon:(0,c.jsx)(v,{}),title:(0,c.jsx)(i.c,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function y(e){return(0,c.jsx)(h,{...N,...e,className:(0,a.c)("alert alert--info",e.className),children:e.children})}function k(e){return(0,c.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,c.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const C={icon:(0,c.jsx)(k,{}),title:(0,c.jsx)(i.c,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function B(e){return(0,c.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,c.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const w={icon:(0,c.jsx)(B,{}),title:(0,c.jsx)(i.c,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const _={icon:(0,c.jsx)(k,{}),title:(0,c.jsx)(i.c,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const E={...{note:g,tip:j,info:y,warning:function(e){return(0,c.jsx)(h,{...C,...e,className:(0,a.c)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,c.jsx)(h,{...w,...e,className:(0,a.c)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,c.jsx)(g,{title:"secondary",...e}),important:e=>(0,c.jsx)(y,{title:"important",...e}),success:e=>(0,c.jsx)(j,{title:"success",...e}),caution:function(e){return(0,c.jsx)(h,{..._,...e,className:(0,a.c)("alert alert--warning",e.className),children:e.children})}}};function L(e){const t=o(e),n=(s=t.type,E[s]||(console.warn('No admonition component found for admonition type "'+s+'". Using Info as fallback.'),E.info));var s;return(0,c.jsx)(n,{...t})}},7790:(e,t,n)=>{"use strict";n.d(t,{c:()=>d});n(1504);var s=n(4357),c=n(5864),o=n(867),a=n(5456);const i={iconEdit:"iconEdit_Z9Sw"};var r=n(7624);function l(e){let{className:t,...n}=e;return(0,r.jsx)("svg",{fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,a.c)(i.iconEdit,t),"aria-hidden":"true",...n,children:(0,r.jsx)("g",{children:(0,r.jsx)("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})})})}function d(e){let{editUrl:t}=e;return(0,r.jsxs)(o.c,{to:t,className:c.W.common.editThisPage,children:[(0,r.jsx)(l,{}),(0,r.jsx)(s.c,{id:"theme.common.editThisPage",description:"The link label to edit the current page",children:"Edit this page"})]})}},9444:(e,t,n)=>{"use strict";n.d(t,{c:()=>re});var s=n(1504),c=n(2172),o=n(6952),a=n(3664),i=n(5456),r=n(6528),l=n(1824);function d(){const{prism:e}=(0,l.y)(),{colorMode:t}=(0,r.U)(),n=e.theme,s=e.darkTheme||n;return"dark"===t?s:n}var u=n(5864),m=n(6504),h=n.n(m);const p=/title=(?["'])(?.*?)\1/,f=/\{(?<range>[\d,-]+)\}/,g={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}},x={...g,lua:{start:"--",end:""},wasm:{start:"\\;\\;",end:""},tex:{start:"%",end:""},vb:{start:"['\u2018\u2019]",end:""},vbnet:{start:"(?:_\\s*)?['\u2018\u2019]",end:""},rem:{start:"[Rr][Ee][Mm]\\b",end:""},f90:{start:"!",end:""},ml:{start:"\\(\\*",end:"\\*\\)"},cobol:{start:"\\*>",end:""}},b=Object.keys(g);function j(e,t){const n=e.map((e=>{const{start:n,end:s}=x[e];return"(?:"+n+"\\s*("+t.flatMap((e=>{var t,n;return[e.line,null==(t=e.block)?void 0:t.start,null==(n=e.block)?void 0:n.end].filter(Boolean)})).join("|")+")\\s*"+s+")"})).join("|");return new RegExp("^\\s*(?:"+n+")\\s*$")}function v(e,t){let n=e.replace(/\n$/,"");const{language:s,magicComments:c,metastring:o}=t;if(o&&f.test(o)){const e=o.match(f).groups.range;if(0===c.length)throw new Error("A highlight range has been given in code block's metastring (``` "+o+"), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.");const t=c[0].className,s=h()(e).filter((e=>e>0)).map((e=>[e-1,[t]]));return{lineClassNames:Object.fromEntries(s),code:n}}if(void 0===s)return{lineClassNames:{},code:n};const a=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return j(["js","jsBlock"],t);case"jsx":case"tsx":return j(["js","jsBlock","jsx"],t);case"html":return j(["js","jsBlock","html"],t);case"python":case"py":case"bash":return j(["bash"],t);case"markdown":case"md":return j(["html","jsx","bash"],t);case"tex":case"latex":case"matlab":return j(["tex"],t);case"lua":case"haskell":case"sql":return j(["lua"],t);case"wasm":return j(["wasm"],t);case"vb":case"vba":case"visual-basic":return j(["vb","rem"],t);case"vbnet":return j(["vbnet","rem"],t);case"batch":return j(["rem"],t);case"basic":return j(["rem","f90"],t);case"fsharp":return j(["js","ml"],t);case"ocaml":case"sml":return j(["ml"],t);case"fortran":return j(["f90"],t);case"cobol":return j(["cobol"],t);default:return j(b,t)}}(s,c),i=n.split("\n"),r=Object.fromEntries(c.map((e=>[e.className,{start:0,range:""}]))),l=Object.fromEntries(c.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),d=Object.fromEntries(c.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),u=Object.fromEntries(c.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let h=0;h<i.length;){const e=i[h].match(a);if(!e){h+=1;continue}const t=e.slice(1).find((e=>void 0!==e));l[t]?r[l[t]].range+=h+",":d[t]?r[d[t]].start=h:u[t]&&(r[u[t]].range+=r[u[t]].start+"-"+(h-1)+","),i.splice(h,1)}n=i.join("\n");const m={};return Object.entries(r).forEach((e=>{let[t,{range:n}]=e;h()(n).forEach((e=>{null!=m[e]||(m[e]=[]),m[e].push(t)}))})),{lineClassNames:m,code:n}}const N={codeBlockContainer:"codeBlockContainer_Ckt0"};var y=n(7624);function k(e){let{as:t,...n}=e;const s=function(e){const t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach((e=>{let[s,c]=e;const o=t[s];o&&"string"==typeof c&&(n[o]=c)})),n}(d());return(0,y.jsx)(t,{...n,style:s,className:(0,i.c)(n.className,N.codeBlockContainer,u.W.common.codeBlock)})}const C={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function B(e){let{children:t,className:n}=e;return(0,y.jsx)(k,{as:"pre",tabIndex:0,className:(0,i.c)(C.codeBlockStandalone,"thin-scrollbar",n),children:(0,y.jsx)("code",{className:C.codeBlockLines,children:t})})}var w=n(1100);const _={attributes:!0,characterData:!0,childList:!0,subtree:!0};function E(e,t){const[n,c]=(0,s.useState)(),o=(0,s.useCallback)((()=>{var t;c(null==(t=e.current)?void 0:t.closest("[role=tabpanel][hidden]"))}),[e,c]);(0,s.useEffect)((()=>{o()}),[o]),function(e,t,n){void 0===n&&(n=_);const c=(0,w.yA)(t),o=(0,w.Mh)(n);(0,s.useEffect)((()=>{const t=new MutationObserver(c);return e&&t.observe(e,o),()=>t.disconnect()}),[e,c,o])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),o())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}var L=n(5720);const T={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function S(e){let{line:t,classNames:n,showLineNumbers:s,getLineProps:c,getTokenProps:o}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const a=c({line:t,className:(0,i.c)(n,s&&T.codeLine)}),r=t.map(((e,t)=>(0,y.jsx)("span",{...o({token:e,key:t})},t)));return(0,y.jsxs)("span",{...a,children:[s?(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)("span",{className:T.codeLineNumber}),(0,y.jsx)("span",{className:T.codeLineContent,children:r})]}):r,(0,y.jsx)("br",{})]})}var A=n(4357);function M(e){return(0,y.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,y.jsx)("path",{fill:"currentColor",d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"})})}function z(e){return(0,y.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,y.jsx)("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"})})}const I={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function H(e){let{code:t,className:n}=e;const[c,o]=(0,s.useState)(!1),a=(0,s.useRef)(void 0),r=(0,s.useCallback)((()=>{!function(e,t){let{target:n=document.body}=void 0===t?{}:t;if("string"!=typeof e)throw new TypeError("Expected parameter `text` to be a `string`, got `"+typeof e+"`.");const s=document.createElement("textarea"),c=document.activeElement;s.value=e,s.setAttribute("readonly",""),s.style.contain="strict",s.style.position="absolute",s.style.left="-9999px",s.style.fontSize="12pt";const o=document.getSelection(),a=o.rangeCount>0&&o.getRangeAt(0);n.append(s),s.select(),s.selectionStart=0,s.selectionEnd=e.length;let i=!1;try{i=document.execCommand("copy")}catch{}s.remove(),a&&(o.removeAllRanges(),o.addRange(a)),c&&c.focus()}(t),o(!0),a.current=window.setTimeout((()=>{o(!1)}),1e3)}),[t]);return(0,s.useEffect)((()=>()=>window.clearTimeout(a.current)),[]),(0,y.jsx)("button",{type:"button","aria-label":c?(0,A.G)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,A.G)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,A.G)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,i.c)("clean-btn",n,I.copyButton,c&&I.copyButtonCopied),onClick:r,children:(0,y.jsxs)("span",{className:I.copyButtonIcons,"aria-hidden":"true",children:[(0,y.jsx)(M,{className:I.copyButtonIcon}),(0,y.jsx)(z,{className:I.copyButtonSuccessIcon})]})})}function R(e){return(0,y.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,y.jsx)("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"})})}const W={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function V(e){let{className:t,onClick:n,isEnabled:s}=e;const c=(0,A.G)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return(0,y.jsx)("button",{type:"button",onClick:n,className:(0,i.c)("clean-btn",t,s&&W.wordWrapButtonEnabled),"aria-label":c,title:c,children:(0,y.jsx)(R,{className:W.wordWrapButtonIcon,"aria-hidden":"true"})})}function P(e){var t;let{children:n,className:c="",metastring:o,title:a,showLineNumbers:r,language:u}=e;const{prism:{defaultLanguage:m,magicComments:h}}=(0,l.y)(),f=function(e){return null==e?void 0:e.toLowerCase()}(null!=(t=null!=u?u:function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return null==t?void 0:t.replace(/language-/,"")}(c))?t:m),g=d(),x=function(){const[e,t]=(0,s.useState)(!1),[n,c]=(0,s.useState)(!1),o=(0,s.useRef)(null),a=(0,s.useCallback)((()=>{const n=o.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[o,e]),i=(0,s.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=o.current,n=e>t||o.current.querySelector("code").hasAttribute("style");c(n)}),[o]);return E(o,i),(0,s.useEffect)((()=>{i()}),[e,i]),(0,s.useEffect)((()=>(window.addEventListener("resize",i,{passive:!0}),()=>{window.removeEventListener("resize",i)})),[i]),{codeBlockRef:o,isEnabled:e,isCodeScrollable:n,toggle:a}}(),b=function(e){var t,n;return null!=(t=null==e||null==(n=e.match(p))?void 0:n.groups.title)?t:""}(o)||a,{lineClassNames:j,code:N}=v(n,{metastring:o,language:f,magicComments:h}),B=null!=r?r:function(e){return Boolean(null==e?void 0:e.includes("showLineNumbers"))}(o);return(0,y.jsxs)(k,{as:"div",className:(0,i.c)(c,f&&!c.includes("language-"+f)&&"language-"+f),children:[b&&(0,y.jsx)("div",{className:C.codeBlockTitle,children:b}),(0,y.jsxs)("div",{className:C.codeBlockContent,children:[(0,y.jsx)(L.gl,{theme:g,code:N,language:null!=f?f:"text",children:e=>{let{className:t,style:n,tokens:s,getLineProps:c,getTokenProps:o}=e;return(0,y.jsx)("pre",{tabIndex:0,ref:x.codeBlockRef,className:(0,i.c)(t,C.codeBlock,"thin-scrollbar"),style:n,children:(0,y.jsx)("code",{className:(0,i.c)(C.codeBlockLines,B&&C.codeBlockLinesWithNumbering),children:s.map(((e,t)=>(0,y.jsx)(S,{line:e,getLineProps:c,getTokenProps:o,classNames:j[t],showLineNumbers:B},t)))})})}}),(0,y.jsxs)("div",{className:C.buttonGroup,children:[(x.isEnabled||x.isCodeScrollable)&&(0,y.jsx)(V,{className:C.codeButton,onClick:()=>x.toggle(),isEnabled:x.isEnabled}),(0,y.jsx)(H,{className:C.codeButton,code:N})]})]})]})}function q(e){let{children:t,...n}=e;const c=(0,a.c)(),o=function(e){return s.Children.toArray(e).some((e=>(0,s.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),i="string"==typeof o?P:B;return(0,y.jsx)(i,{...n,children:o},String(c))}function D(e){return(0,y.jsx)("code",{...e})}var G=n(867);var O=n(5976),F=n(8448);const U={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};function $(e){return!!e&&("SUMMARY"===e.tagName||$(e.parentElement))}function Z(e,t){return!!e&&(e===t||Z(e.parentElement,t))}function J(e){let{summary:t,children:n,...c}=e;(0,O.c)().collectAnchor(c.id);const o=(0,a.c)(),r=(0,s.useRef)(null),{collapsed:l,setCollapsed:d}=(0,F.a)({initialState:!c.open}),[u,m]=(0,s.useState)(c.open),h=s.isValidElement(t)?t:(0,y.jsx)("summary",{children:null!=t?t:"Details"});return(0,y.jsxs)("details",{...c,ref:r,open:u,"data-collapsed":l,className:(0,i.c)(U.details,o&&U.isBrowser,c.className),onMouseDown:e=>{$(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const t=e.target;$(t)&&Z(t,r.current)&&(e.preventDefault(),l?(d(!1),m(!0)):d(!0))},children:[h,(0,y.jsx)(F.U,{lazy:!1,collapsed:l,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{d(e),m(!e)},children:(0,y.jsx)("div",{className:U.collapsibleContent,children:n})})]})}const Y={details:"details_b_Ee"},K="alert alert--info";function Q(e){let{...t}=e;return(0,y.jsx)(J,{...t,className:(0,i.c)(K,Y.details,t.className)})}function X(e){const t=s.Children.toArray(e.children),n=t.find((e=>s.isValidElement(e)&&"summary"===e.type)),c=(0,y.jsx)(y.Fragment,{children:t.filter((e=>e!==n))});return(0,y.jsx)(Q,{...e,summary:n,children:c})}var ee=n(6448);function te(e){return(0,y.jsx)(ee.c,{...e})}const ne={containsTaskList:"containsTaskList_mC6p"};function se(e){if(void 0!==e)return(0,i.c)(e,(null==e?void 0:e.includes("contains-task-list"))&&ne.containsTaskList)}const ce={img:"img_ev3q"};var oe=n(304),ae=n(2944);const ie={Head:o.c,details:X,Details:X,code:function(e){return function(e){return void 0!==e.children&&s.Children.toArray(e.children).every((e=>"string"==typeof e&&!e.includes("\n")))}(e)?(0,y.jsx)(D,{...e}):(0,y.jsx)(q,{...e})},a:function(e){return(0,y.jsx)(G.c,{...e})},pre:function(e){return(0,y.jsx)(y.Fragment,{children:e.children})},ul:function(e){return(0,y.jsx)("ul",{...e,className:se(e.className)})},li:function(e){return(0,O.c)().collectAnchor(e.id),(0,y.jsx)("li",{...e})},img:function(e){return(0,y.jsx)("img",{decoding:"async",loading:"lazy",...e,className:(t=e.className,(0,i.c)(t,ce.img))});var t},h1:e=>(0,y.jsx)(te,{as:"h1",...e}),h2:e=>(0,y.jsx)(te,{as:"h2",...e}),h3:e=>(0,y.jsx)(te,{as:"h3",...e}),h4:e=>(0,y.jsx)(te,{as:"h4",...e}),h5:e=>(0,y.jsx)(te,{as:"h5",...e}),h6:e=>(0,y.jsx)(te,{as:"h6",...e}),admonition:oe.c,mermaid:ae.c};function re(e){let{children:t}=e;return(0,y.jsx)(c.I,{components:ie,children:t})}},308:(e,t,n)=>{"use strict";n.d(t,{c:()=>a});n(1504);var s=n(5456),c=n(867),o=n(7624);function a(e){const{permalink:t,title:n,subLabel:a,isNext:i}=e;return(0,o.jsxs)(c.c,{className:(0,s.c)("pagination-nav__link",i?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[a&&(0,o.jsx)("div",{className:"pagination-nav__sublabel",children:a}),(0,o.jsx)("div",{className:"pagination-nav__label",children:n})]})}},3020:(e,t,n)=>{"use strict";n.d(t,{c:()=>i});n(1504);var s=n(5456),c=n(867);const o={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var a=n(7624);function i(e){let{permalink:t,label:n,count:i}=e;return(0,a.jsxs)(c.c,{href:t,className:(0,s.c)(o.tag,i?o.tagWithCount:o.tagRegular),children:[n,i&&(0,a.jsx)("span",{children:i})]})}},1096:(e,t,n)=>{"use strict";n.d(t,{c:()=>r});n(1504);var s=n(5456),c=n(4357),o=n(3020);const a={tags:"tags_jXut",tag:"tag_QGVx"};var i=n(7624);function r(e){let{tags:t}=e;return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("b",{children:(0,i.jsx)(c.c,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,i.jsx)("ul",{className:(0,s.c)(a.tags,"padding--none","margin-left--sm"),children:t.map((e=>{let{label:t,permalink:n}=e;return(0,i.jsx)("li",{className:a.tag,children:(0,i.jsx)(o.c,{label:t,permalink:n})},n)}))})]})}},6504:(e,t)=>{function n(e){let t,n=[];for(let s of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(s))n.push(parseInt(s,10));else if(t=s.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,s,c,o]=t;if(s&&o){s=parseInt(s),o=parseInt(o);const e=s<o?1:-1;"-"!==c&&".."!==c&&"\u2025"!==c||(o+=e);for(let t=s;t!==o;t+=e)n.push(t)}}return n}t.default=n,e.exports=n},2172:(e,t,n)=>{"use strict";n.d(t,{I:()=>i,M:()=>a});var s=n(1504);const c={},o=s.createContext(c);function a(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:a(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/606.b5950734.js b/assets/js/606.b5950734.js new file mode 100644 index 00000000..4904f806 --- /dev/null +++ b/assets/js/606.b5950734.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[606],{9452:(e,t,s)=>{s.d(t,{c:()=>b});var r=s(1504),a=s(5456),n=s(9012),l=s(1432),i=s(867),o=s(4357),c=s(5592),m=s(3376);function d(e){const{pathname:t}=(0,c.IT)();return(0,r.useMemo)((()=>e.filter((e=>function(e,t){return!(e.unlisted&&!(0,m.Sc)(e.permalink,t))}(e,t)))),[e,t])}const u={sidebar:"sidebar_re4s",sidebarItemTitle:"sidebarItemTitle_pO2u",sidebarItemList:"sidebarItemList_Yudw",sidebarItem:"sidebarItem__DBe",sidebarItemLink:"sidebarItemLink_mo7H",sidebarItemLinkActive:"sidebarItemLinkActive_I1ZP"};var h=s(7624);function g(e){let{sidebar:t}=e;const s=d(t.items);return(0,h.jsx)("aside",{className:"col col--3",children:(0,h.jsxs)("nav",{className:(0,a.c)(u.sidebar,"thin-scrollbar"),"aria-label":(0,o.G)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"}),children:[(0,h.jsx)("div",{className:(0,a.c)(u.sidebarItemTitle,"margin-bottom--md"),children:t.title}),(0,h.jsx)("ul",{className:(0,a.c)(u.sidebarItemList,"clean-list"),children:s.map((e=>(0,h.jsx)("li",{className:u.sidebarItem,children:(0,h.jsx)(i.c,{isNavLink:!0,to:e.permalink,className:u.sidebarItemLink,activeClassName:u.sidebarItemLinkActive,children:e.title})},e.permalink)))})]})})}var p=s(5168);function x(e){let{sidebar:t}=e;const s=d(t.items);return(0,h.jsx)("ul",{className:"menu__list",children:s.map((e=>(0,h.jsx)("li",{className:"menu__list-item",children:(0,h.jsx)(i.c,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active",children:e.title})},e.permalink)))})}function j(e){return(0,h.jsx)(p.Mx,{component:x,props:e})}function f(e){let{sidebar:t}=e;const s=(0,l.U)();return null!=t&&t.items.length?"mobile"===s?(0,h.jsx)(j,{sidebar:t}):(0,h.jsx)(g,{sidebar:t}):null}function b(e){const{sidebar:t,toc:s,children:r,...l}=e,i=t&&t.items.length>0;return(0,h.jsx)(n.c,{...l,children:(0,h.jsx)("div",{className:"container margin-vert--lg",children:(0,h.jsxs)("div",{className:"row",children:[(0,h.jsx)(f,{sidebar:t}),(0,h.jsx)("main",{className:(0,a.c)("col",{"col--7":i,"col--9 col--offset-1":!i}),itemScope:!0,itemType:"https://schema.org/Blog",children:r}),s&&(0,h.jsx)("div",{className:"col col--2",children:s})]})})})}},7792:(e,t,s)=>{s.d(t,{c:()=>B});s(1504);var r=s(5456),a=s(3152),n=s(964),l=s(7624);function i(e){var t,s;let{children:r,className:i}=e;const{frontMatter:o,assets:c,metadata:{description:m}}=(0,a.g)(),{withBaseUrl:d}=(0,n.E)(),u=null!=(t=c.image)?t:o.image,h=null!=(s=o.keywords)?s:[];return(0,l.jsxs)("article",{className:i,itemProp:"blogPost",itemScope:!0,itemType:"https://schema.org/BlogPosting",children:[m&&(0,l.jsx)("meta",{itemProp:"description",content:m}),u&&(0,l.jsx)("link",{itemProp:"image",href:d(u,{absolute:!0})}),h.length>0&&(0,l.jsx)("meta",{itemProp:"keywords",content:h.join(",")}),r]})}var o=s(867);const c={title:"title_f1Hy"};function m(e){let{className:t}=e;const{metadata:s,isBlogPostPage:n}=(0,a.g)(),{permalink:i,title:m}=s,d=n?"h1":"h2";return(0,l.jsx)(d,{className:(0,r.c)(c.title,t),itemProp:"headline",children:n?m:(0,l.jsx)(o.c,{itemProp:"url",to:i,children:m})})}var d=s(4357),u=s(5944);const h={container:"container_mt6G"};function g(e){let{readingTime:t}=e;const s=function(){const{selectMessage:e}=(0,u.A)();return t=>{const s=Math.ceil(t);return e(s,(0,d.G)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:s}))}}();return(0,l.jsx)(l.Fragment,{children:s(t)})}function p(e){let{date:t,formattedDate:s}=e;return(0,l.jsx)("time",{dateTime:t,itemProp:"datePublished",children:s})}function x(){return(0,l.jsx)(l.Fragment,{children:" \xb7 "})}function j(e){let{className:t}=e;const{metadata:s}=(0,a.g)(),{date:n,formattedDate:i,readingTime:o}=s;return(0,l.jsxs)("div",{className:(0,r.c)(h.container,"margin-vert--md",t),children:[(0,l.jsx)(p,{date:n,formattedDate:i}),void 0!==o&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(x,{}),(0,l.jsx)(g,{readingTime:o})]})]})}function f(e){return e.href?(0,l.jsx)(o.c,{...e}):(0,l.jsx)(l.Fragment,{children:e.children})}function b(e){let{author:t,className:s}=e;const{name:a,title:n,url:i,imageURL:o,email:c}=t,m=i||c&&"mailto:"+c||void 0;return(0,l.jsxs)("div",{className:(0,r.c)("avatar margin-bottom--sm",s),children:[o&&(0,l.jsx)(f,{href:m,className:"avatar__photo-link",children:(0,l.jsx)("img",{className:"avatar__photo",src:o,alt:a,itemProp:"image"})}),a&&(0,l.jsxs)("div",{className:"avatar__intro",itemProp:"author",itemScope:!0,itemType:"https://schema.org/Person",children:[(0,l.jsx)("div",{className:"avatar__name",children:(0,l.jsx)(f,{href:m,itemProp:"url",children:(0,l.jsx)("span",{itemProp:"name",children:a})})}),n&&(0,l.jsx)("small",{className:"avatar__subtitle",itemProp:"description",children:n})]})]})}const v={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function P(e){let{className:t}=e;const{metadata:{authors:s},assets:n}=(0,a.g)();if(0===s.length)return null;const i=s.every((e=>{let{name:t}=e;return!t}));return(0,l.jsx)("div",{className:(0,r.c)("margin-top--md margin-bottom--sm",i?v.imageOnlyAuthorRow:"row",t),children:s.map(((e,t)=>{var s;return(0,l.jsx)("div",{className:(0,r.c)(!i&&"col col--6",i?v.imageOnlyAuthorCol:v.authorCol),children:(0,l.jsx)(b,{author:{...e,imageURL:null!=(s=n.authorsImageUrls[t])?s:e.imageURL}})},t)}))})}function N(){return(0,l.jsxs)("header",{children:[(0,l.jsx)(m,{}),(0,l.jsx)(j,{}),(0,l.jsx)(P,{})]})}var _=s(5684),k=s(9444);function I(e){let{children:t,className:s}=e;const{isBlogPostPage:n}=(0,a.g)();return(0,l.jsx)("div",{id:n?_.blogPostContainerID:void 0,className:(0,r.c)("markdown",s),itemProp:"articleBody",children:(0,l.jsx)(k.c,{children:t})})}var w=s(7790),T=s(1096);function y(){return(0,l.jsx)("b",{children:(0,l.jsx)(d.c,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts",children:"Read More"})})}function F(e){const{blogPostTitle:t,...s}=e;return(0,l.jsx)(o.c,{"aria-label":(0,d.G)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t}),...s,children:(0,l.jsx)(y,{})})}const A={blogPostFooterDetailsFull:"blogPostFooterDetailsFull_mRVl"};function L(){const{metadata:e,isBlogPostPage:t}=(0,a.g)(),{tags:s,title:n,editUrl:i,hasTruncateMarker:o}=e,c=!t&&o,m=s.length>0;return m||c||i?(0,l.jsxs)("footer",{className:(0,r.c)("row docusaurus-mt-lg",t&&A.blogPostFooterDetailsFull),children:[m&&(0,l.jsx)("div",{className:(0,r.c)("col",{"col--9":c}),children:(0,l.jsx)(T.c,{tags:s})}),t&&i&&(0,l.jsx)("div",{className:"col margin-top--sm",children:(0,l.jsx)(w.c,{editUrl:i})}),c&&(0,l.jsx)("div",{className:(0,r.c)("col text--right",{"col--3":m}),children:(0,l.jsx)(F,{blogPostTitle:n,to:e.permalink})})]}):null}function B(e){let{children:t,className:s}=e;const n=function(){const{isBlogPostPage:e}=(0,a.g)();return e?void 0:"margin-bottom--xl"}();return(0,l.jsxs)(i,{className:(0,r.c)(n,s),children:[(0,l.jsx)(N,{}),(0,l.jsx)(I,{children:t}),(0,l.jsx)(L,{})]})}},3152:(e,t,s)=>{s.d(t,{E:()=>i,g:()=>o});var r=s(1504),a=s(1100),n=s(7624);const l=r.createContext(null);function i(e){let{children:t,content:s,isBlogPostPage:a=!1}=e;const i=function(e){let{content:t,isBlogPostPage:s}=e;return(0,r.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:s})),[t,s])}({content:s,isBlogPostPage:a});return(0,n.jsx)(l.Provider,{value:i,children:t})}function o(){const e=(0,r.useContext)(l);if(null===e)throw new a.AH("BlogPostProvider");return e}},5944:(e,t,s)=>{s.d(t,{A:()=>c});var r=s(1504),a=s(8264);const n=["zero","one","two","few","many","other"];function l(e){return n.filter((t=>e.includes(t)))}const i={locale:"en",pluralForms:l(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,a.c)();return(0,r.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:l(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error('Failed to use Intl.PluralRules for locale "'+e+'".\nDocusaurus will fallback to the default (English) implementation.\nError: '+t.message+"\n"),i}}),[e])}function c(){const e=o();return{selectMessage:(t,s)=>function(e,t,s){const r=e.split("|");if(1===r.length)return r[0];r.length>s.pluralForms.length&&console.error("For locale="+s.locale+", a maximum of "+s.pluralForms.length+" plural forms are expected ("+s.pluralForms.join(",")+"), but the message contains "+r.length+": "+e);const a=s.select(t),n=s.pluralForms.indexOf(a);return r[Math.min(n,r.length-1)]}(s,t,e)}}}}]); \ No newline at end of file diff --git a/assets/js/608ae6a4.6187c8c9.js b/assets/js/608ae6a4.6187c8c9.js new file mode 100644 index 00000000..825f5590 --- /dev/null +++ b/assets/js/608ae6a4.6187c8c9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[5168],{3120:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/docusaurus","page":1,"postsPerPage":10,"totalPages":1,"totalCount":2,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/609cb24b.aa8f2289.js b/assets/js/609cb24b.aa8f2289.js new file mode 100644 index 00000000..bd564c81 --- /dev/null +++ b/assets/js/609cb24b.aa8f2289.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[712],{7040:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>l});var s=t(7624),r=t(2172);const i={title:"C Cheatsheet"},c=void 0,o={id:"c-cheatsheet",title:"C Cheatsheet",description:"Published on December 23, 2020",source:"@site/docs/c-cheatsheet.md",sourceDirName:".",slug:"/c-cheatsheet",permalink:"/docs/c-cheatsheet",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{title:"C Cheatsheet"},sidebar:"docs",previous:{title:"Dependency management",permalink:"/docs/ruby-dependency-management"},next:{title:"JS Cheatsheet",permalink:"/docs/js-cheatsheet"}},a={},l=[{value:"Print out arguments",id:"print-out-arguments",level:2},{value:"Resources",id:"resources",level:2}];function d(e){const n={a:"a",code:"code",em:"em",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.M)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"Published on December 23, 2020"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsxs)(n.em,{children:["This document was migrated from ",(0,s.jsx)(n.a,{href:"https://digipie.github.io/digidocs/c/arguments/",children:"DigiDocs"})]})}),"\n",(0,s.jsx)(n.h2,{id:"print-out-arguments",children:"Print out arguments"}),"\n",(0,s.jsxs)(n.p,{children:["The example program below prints out all command line arguments passed into the ",(0,s.jsx)(n.code,{children:"main()"})," function."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"print-arguments.c"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-c",children:'#include <stdio.h>\n\nint main(int argc, char **argv) {\n for (int i = 0; i < argc; i++) {\n printf("%s\\n", argv[i]);\n }\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"Key details:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"argc"})," - the number of arguments passed into the program"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"argv"})," - the array of character pointers (strings) containing all arguments"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"argv[0]"})," - the first argument which is also the name of the program"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"To use:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Enter the above code into a file (e.g. ",(0,s.jsx)(n.code,{children:"print-arguments.c"}),")."]}),"\n",(0,s.jsxs)(n.li,{children:["Compile the code with ",(0,s.jsx)(n.code,{children:"gcc print-arguments.c -o print-arguments"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Run the executable with ",(0,s.jsx)(n.code,{children:"./print-arguments test"})," or ",(0,s.jsx)(n.code,{children:"./print-arguments $USER"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"resources",children:"Resources"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://digipie.github.io/digidocs/c/arguments/",children:"Original copy of this document at DigiDocs"})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,r.M)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},2172:(e,n,t)=>{t.d(n,{I:()=>o,M:()=>c});var s=t(1504);const r={},i=s.createContext(r);function c(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:c(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/64285692.61bea2e5.js b/assets/js/64285692.61bea2e5.js new file mode 100644 index 00000000..b0e1b691 --- /dev/null +++ b/assets/js/64285692.61bea2e5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[4936],{7215:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>d,default:()=>u,frontMatter:()=>o,metadata:()=>r,toc:()=>a});var i=s(7624),t=s(2172);const o={title:"Ubuntu Cheatsheet"},d=void 0,r={id:"os-ubuntu-cheatsheet",title:"Ubuntu Cheatsheet",description:"Published on December 24, 2020",source:"@site/docs/os-ubuntu-cheatsheet.md",sourceDirName:".",slug:"/os-ubuntu-cheatsheet",permalink:"/docs/os-ubuntu-cheatsheet",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{title:"Ubuntu Cheatsheet"},sidebar:"docs",previous:{title:"iTerm2 Cheatsheet",permalink:"/docs/iterm2-cheatsheet"},next:{title:"MongoDB Setup",permalink:"/docs/mongodb-setup"}},l={},a=[{value:"Creating a new non-root Sudo user",id:"creating-a-new-non-root-sudo-user",level:2},{value:"Add a new user",id:"add-a-new-user",level:3},{value:"Add user to sudo group",id:"add-user-to-sudo-group",level:3},{value:"Log in to user",id:"log-in-to-user",level:3},{value:"Only allow Key Authentication",id:"only-allow-key-authentication",level:2},{value:"Add Public Key to User",id:"add-public-key-to-user",level:3},{value:"Disable Password Authentication",id:"disable-password-authentication",level:3},{value:"Basic Firewall",id:"basic-firewall",level:2},{value:"Resources",id:"resources",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,t.M)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"Published on December 24, 2020"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsxs)(n.em,{children:["This document was migrated from ",(0,i.jsx)(n.a,{href:"https://digipie.github.io/digidocs/os/ubuntu18-04/",children:"DigiDocs"})]})}),"\n",(0,i.jsxs)(n.p,{children:["In this section you will find my notes on setting up and securing Ubuntu 18.04. ",(0,i.jsx)(n.a,{href:"https://www.linux.com/learn/vim-101-beginners-guide-vim",children:"Vim"})," knowledge is assumed."]}),"\n",(0,i.jsx)(n.h2,{id:"creating-a-new-non-root-sudo-user",children:"Creating a new non-root Sudo user"}),"\n",(0,i.jsx)(n.p,{children:"It is recommended to avoid using the root user account on a regular basis as it compromises security and is risky. Instead, create a new user account and add it to the sudo group."}),"\n",(0,i.jsx)(n.h3,{id:"add-a-new-user",children:"Add a new user"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"adduser evan\n"})}),"\n",(0,i.jsx)(n.h3,{id:"add-user-to-sudo-group",children:"Add user to sudo group"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"usermod -aG sudo evan\n"})}),"\n",(0,i.jsx)(n.h3,{id:"log-in-to-user",children:"Log in to user"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"su evan\n"})}),"\n",(0,i.jsx)(n.h2,{id:"only-allow-key-authentication",children:"Only allow Key Authentication"}),"\n",(0,i.jsx)(n.p,{children:"Password-based authentication is susceptible to brute-force attacks. Thus, it is good practice to disable it and only allow key-based authentication."}),"\n",(0,i.jsx)(n.h3,{id:"add-public-key-to-user",children:"Add Public Key to User"}),"\n",(0,i.jsx)(n.p,{children:"As mentioned, usage of the root user account should be avoided. Hence, it is advisable that you add your public key to the user account you created earlier on. It is assumed that you logged into your root account using SSH key."}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Create a ",(0,i.jsx)(n.code,{children:"authorized_keys"})," file:"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"su evan\ncd ~\nmkdir .ssh\nvim .ssh/authorized_keys\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsxs)(n.li,{children:["Insert your public key and save the file with ",(0,i.jsx)(n.code,{children:":wq!"}),". You can copy this from the ",(0,i.jsx)(n.code,{children:"authorized_keys"})," file under the root account's directory. You can find the file using the following commands:"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"su root\ncd ~\nvim .ssh/authorized_keys\n"})}),"\n",(0,i.jsxs)(n.admonition,{type:"tip",children:[(0,i.jsxs)(n.p,{children:["Toggle visual mode by pressing ",(0,i.jsx)(n.code,{children:"v"})," at the start of the line for the public key you wish to copy over. Press ",(0,i.jsx)(n.code,{children:"$"})," to move the cursor to the end of the line; doing so highlights the entire line. Press ",(0,i.jsx)(n.code,{children:"y"})," to yank (copy). Then exit the file using ",(0,i.jsx)(n.code,{children:":q!"}),"."]}),(0,i.jsxs)(n.p,{children:["Enter the destination ",(0,i.jsx)(n.code,{children:"authorized_keys"})," file. Press ",(0,i.jsx)(n.code,{children:"p"})," to paste what you yanked."]})]}),"\n",(0,i.jsx)(n.h3,{id:"disable-password-authentication",children:"Disable Password Authentication"}),"\n",(0,i.jsxs)(n.p,{children:["As it is assumed that you logged into your root account using SSH key, this step could be unnecessary. However, do still perform a check to verify that ",(0,i.jsx)(n.code,{children:"PasswordAuthentication no"})," is in place."]}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Open ",(0,i.jsx)(n.code,{children:"sshd_config"})," with Vim:"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo vim /etc/ssh/sshd_config\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsxs)(n.li,{children:["Add ",(0,i.jsx)(n.code,{children:"PasswordAuthentication no"}),". It might be commented out as ",(0,i.jsx)(n.code,{children:"#PasswordAuthentication no"})," or written as ",(0,i.jsx)(n.code,{children:"PasswordAuthentication yes"}),". If you find either, replace with ",(0,i.jsx)(n.code,{children:"PasswordAuthentication no"}),". Else just add it in."]}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["Use ",(0,i.jsx)(n.code,{children:":/PasswordAuthentication"})," to find ",(0,i.jsx)(n.code,{children:"#PasswordAuthentication no"}),"."]})}),"\n",(0,i.jsxs)(n.ol,{start:"3",children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Save the file with ",(0,i.jsx)(n.code,{children:":wq!"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Restart ",(0,i.jsx)(n.code,{children:"ssh"})," to implement this change:"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo systemctl restart ssh\n"})}),"\n",(0,i.jsx)(n.h2,{id:"basic-firewall",children:"Basic Firewall"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"List application profiles registered with ufw firewall:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo ufw app list\n"})}),"\n",(0,i.jsx)(n.p,{children:"You should see"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"Available applications:\n OpenSSH\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsx)(n.li,{children:"Ensure the firewall allows SSH connections:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo ufw allow OpenSSH\nsudo ufw enable # Enable firewall\nsudo ufw status # Check if OpenSSH is allowed\n"})}),"\n",(0,i.jsxs)(n.p,{children:["You should see the following after executing ",(0,i.jsx)(n.code,{children:"sudo ufw status"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"To Action From\n-- ------ ----\nOpenSSH ALLOW Anywhere\nOpenSSH (v6) ALLOW Anywhere (v6)\n"})}),"\n",(0,i.jsx)(n.h2,{id:"resources",children:"Resources"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://digipie.github.io/digidocs/os/ubuntu18-04/",children:"Original copy of this document at DigiDocs"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-18-04",children:"Initial Server Setup with Ubuntu 18.04"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys-on-ubuntu-1804",children:"How to Set Up SSH Keys on Ubuntu 18.04 "})}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,t.M)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},2172:(e,n,s)=>{s.d(n,{I:()=>r,M:()=>d});var i=s(1504);const t={},o=i.createContext(t);function d(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6855b58d.4222be59.js b/assets/js/6855b58d.4222be59.js new file mode 100644 index 00000000..638faf07 --- /dev/null +++ b/assets/js/6855b58d.4222be59.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[8132],{8888:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>r,toc:()=>h});var t=i(7624),s=i(2172);const a={title:"Reliable, Scalable, and Maintainable Applications"},o=void 0,r={id:"reliable-scalable-maintainable",title:"Reliable, Scalable, and Maintainable Applications",description:"Published on July 31, 2021",source:"@site/docs/reliable-scalable-maintainable.md",sourceDirName:".",slug:"/reliable-scalable-maintainable",permalink:"/docs/reliable-scalable-maintainable",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{title:"Reliable, Scalable, and Maintainable Applications"},sidebar:"docs",previous:{title:"Scaling Memcached",permalink:"/docs/scaling-memcached"},next:{title:"Ikigai",permalink:"/docs/ikigai"}},l={},h=[{value:"Reliability, Scalability, and Maintainability",id:"reliability-scalability-and-maintainability",level:2},{value:"Reliability",id:"reliability",level:2},{value:"Working correctly",id:"working-correctly",level:3},{value:"Fault-tolerance",id:"fault-tolerance",level:3},{value:"Human (un)reliability",id:"human-unreliability",level:3},{value:"Scalability",id:"scalability",level:2},{value:"Load parameter",id:"load-parameter",level:3},{value:"Performance",id:"performance",level:3},{value:"Response time",id:"response-time",level:3},{value:"Tail latencies",id:"tail-latencies",level:3},{value:"Scaling to cope with increased load",id:"scaling-to-cope-with-increased-load",level:3},{value:"Maintainability",id:"maintainability",level:2},{value:"Operability",id:"operability",level:3},{value:"Simplicity",id:"simplicity",level:3},{value:"Evolvability",id:"evolvability",level:3},{value:"Resources",id:"resources",level:2}];function c(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",br:"br",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,s.M)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["Published on July 31, 2021",(0,t.jsx)(n.br,{}),"\n","Updated on January 3, 2022",(0,t.jsx)(n.br,{}),"\n","Edited by ",(0,t.jsx)(n.a,{href:"https://www.linkedin.com/in/vanessa-tay-5973021ab/",children:"Vanessa Tay"})]}),"\n",(0,t.jsxs)(n.p,{children:["The opening chapter of Kleppman\u2019s ",(0,t.jsx)(n.a,{href:"https://dataintensive.net/",children:(0,t.jsx)(n.em,{children:"Designing Data-Intensive Applications"})})," book: ",(0,t.jsx)(n.em,{children:"Reliable, Scalable, and Maintainable Applications"}),", addresses key concerns you should consider when designing distributed and data-intensive systems, in an insightful way. I believe anyone working on a distributed system will benefit from reading it. However, as not all of us may have the time (or will) to pour over the book, I\u2019ve decided to share a quick summary of the key points Kleppman raises, as well as to offer some of my personal inputs with references to other literature and experts."]}),"\n",(0,t.jsx)(n.h2,{id:"reliability-scalability-and-maintainability",children:"Reliability, Scalability, and Maintainability"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Designing Data-Intensive Applications",src:i(9623).c+"",width:"457",height:"600"})}),"\n",(0,t.jsx)(n.p,{children:"Reliability, Scalability, and Maintainability, the three characteristics that Kleppman opens with, are terms you might come across often. If you're not familiar with them, you may wonder: what are they and why are they important?"}),"\n",(0,t.jsx)(n.h2,{id:"reliability",children:"Reliability"}),"\n",(0,t.jsx)(n.p,{children:"When building an application, we want it to work correctly, even when things go wrong."}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:['"Anything that can go wrong will go wrong." - ',(0,t.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Murphy%27s_law",children:"Murphy's law"})]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"The adage above can be applied to just about anything in life and applications are no exception. If we want our applications to be resilient during adverse conditions, we will have to design them with the expectation that things will go wrong. We can't blindly hope they won't."}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:['"Hope is not a strategy." - Traditional SRE saying, found in ',(0,t.jsx)(n.a,{href:"https://sre.google/sre-book/introduction/",children:"Google's Site Reliability Engineering book"})]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"working-correctly",children:"Working correctly"}),"\n",(0,t.jsx)(n.p,{children:"When we declare an application system as working correctly, we typically mean that it is able to:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Perform the expected functionality,"}),"\n",(0,t.jsx)(n.li,{children:"With good enough performance under the expected load,"}),"\n",(0,t.jsx)(n.li,{children:"And can tolerate unintended user behaviour or mistakes,"}),"\n",(0,t.jsx)(n.li,{children:"And also prevent unauthorized access and abuse."}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"fault-tolerance",children:"Fault-tolerance"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Reliability"}),": A reliable system continues to work correctly, even when things go wrong."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Fault"}),": A fault is typically defined as an individual component of the system deviating from its spec, when it performs in an unexpected way."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Failure"}),": The entire system failing as a whole, and being unable to deliver the required service to its users."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Fault-tolerant/Resilient"}),": If a system anticipates and prevents faults from causing failures, it is fault-tolerant."]}),"\n"]}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsx)(n.p,{children:"As it is impossible to design a zero-fault system, we should focus on preventing faults from causing failures instead. We do so by implementing fault-tolerance mechanisms."})}),"\n",(0,t.jsx)(n.h3,{id:"human-unreliability",children:"Human (un)reliability"}),"\n",(0,t.jsx)(n.p,{children:"When we design a fault-tolerant system, we will naturally consider how we can build it to tolerate hardware and software errors. We introduce hardware redundancy, such that if a hard disk fails, there's a backup which will take its place. We also write fault-tolerant code, such that a software fault would not cause the server to fail."}),"\n",(0,t.jsx)(n.p,{children:"These errors aren't the only ones we should consider. We should also consider how we can prevent human errors. After all, we humans design, create and operate these systems."}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:'"Even when they have the best intentions, humans are known to be unreliable." - Found on Page 9 of the book'}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"We humans write the code, and decide what hardware to run our code on. We are responsible for all bugs and mistakes within our systems. Given that, it is important we ask ourselves often:"}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:'"How do we make our systems reliable, in spite of unreliable humans?" - Found on Page 9 of the book'}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"To achieve that, we will need to design the system such that it:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Minimizes opportunities for introducing errors"}),": We should design abstractions, APIs and administrator interfaces which make it easy to do the right thing, and hard to do the wrong thing."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Mitigates impact of failures by allowing quick and easy recovery"}),": We should provide a fast and easy way for developers to roll back a failure-inducing deployment, and for operators to undo accidental changes in the administrator interface."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Reduces delay in diagnosing errors through detailed monitoring"}),": We should set up clear and detailed monitoring which could provide early warning signals, and also insights into what went wrong so we can better triage errors."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"scalability",children:"Scalability"}),"\n",(0,t.jsx)(n.p,{children:"As the load on our system increases, we want it to continue working correctly. To achieve that, we will have to design it such that it is scalable. Scalability describes a system's ability to deliver its expected functionality in spite of increased load. Given that there are many different types of load a system can have, it is meaningless to discuss whether the system is scalable or not. It is more productive to talk about whether it is scalable in a specific manner:"}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:'"If the system grows in a particular way, what are our options for coping with the growth?" - Found on Page 11 of the book'}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Before we can describe scalability, we will first need to define load. We can do so numerically by using load parameters."}),"\n",(0,t.jsx)(n.h3,{id:"load-parameter",children:"Load parameter"}),"\n",(0,t.jsx)(n.p,{children:"A load parameter is a metric you can use to describe a particular load for a given system. Examples include requests per second for a web application, and the ratio of cache hits to misses. The load parameters you should focus on depends on the architecture of your system and your user requirements."}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:'"An architecture that scales well for a particular application is built around assumptions of which operations will be common and which will be rare - the load parameters." - Page 18 of the book'}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"performance",children:"Performance"}),"\n",(0,t.jsx)(n.p,{children:"After defining the load parameters of your system, you can now describe how increases in load affect the system:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"When a load parameter increases, how is the system performance affected if you keep the system resources constant?"}),"\n",(0,t.jsx)(n.li,{children:"When a load parameter increases, how much do you need to increase the resources by to keep the system performance constant?"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"To answer these questions, you would need to define performance metrics. Examples of such metrics include the throughput of a network protocol, and the response time of a web service."}),"\n",(0,t.jsx)(n.h3,{id:"response-time",children:"Response time"}),"\n",(0,t.jsx)(n.p,{children:"Response time is a common and important performance metrics for online, distributed systems. There are many different definitions for it out there. In the context of online systems, it is typically defined as the time between a client sending a request to the system and receiving a response from it."}),"\n",(0,t.jsx)(n.p,{children:"When you consider a system's response time, it is important to consider it not as a single value, the average (mean), but as a distribution of values, the percentiles. That's because the response time for requests varies a lot, and there are many outliers which are much slower. There are many reasons why this is so, here are some:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Different types of requests have different processing time"}),": An online system handles many different types of requests which take varying amounts of time to process."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Caching reduces response time for common requests"}),": Common requests are often cached for high-traffic systems, and responded to much faster than those which are not."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Given these reasons, the distribution of response time is asymmetric and significant outliers are common. This makes the mean much less representative of the response time than the median, also known as the 50th percentile."}),"\n",(0,t.jsx)(n.p,{children:"The median also provides information about the distribution which the mean does not - if the median response time is 80ms, you can infer that half of the requests have a response time faster than 80ms, and also that the other half would be slower than that. You can't infer the same from an average response time, as it is not a middle value like the median."}),"\n",(0,t.jsxs)(n.p,{children:["You can check out the article ",(0,t.jsx)(n.a,{href:"https://www.dynatrace.com/news/blog/why-averages-suck-and-percentiles-are-great/",children:"Michael Kopp: Why Averages Suck and Percentiles are Great"})," for more information on why the average response time is an inadequate performance metric."]}),"\n",(0,t.jsx)(n.h3,{id:"tail-latencies",children:"Tail latencies"}),"\n",(0,t.jsx)(n.p,{children:"You should also consider how slow the outliers are, by looking at higher percentiles such as the 95th and 99th percentile. These are the thresholds at which 95% or 99% of the requests are faster than that particular threshold. They're also commonly called tail latencies. It is important you consider these, because the users with the slowest response time are often those who have used the system most extensively."}),"\n",(0,t.jsx)(n.p,{children:"Amazon uses the 99.9th percentile for internal service response time requirements. They do so even though only 0.1% of requests are slower, because the customers with these requests are often the most valuable customers. They experience longer response time because they have more data. They have more data because they made many more purchases than typical customers, thus making them more valuable."}),"\n",(0,t.jsx)(n.h3,{id:"scaling-to-cope-with-increased-load",children:"Scaling to cope with increased load"}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:'"An architecture that is appropriate for one level of load is unlikely to cope with 10 times that load." - Found on Page 17 of the book'}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"If you want to maintain good system performance, when the load parameters increase, you would need to increase the resources. There are two ways of doing so:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Vertical scaling"}),": Scaling up by adding more power - adding more CPU or RAM to your virtual machine instance."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Horizontal scaling"}),": Scaling out by adding more machines - adding more instances to your instance group."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"There are tradeoffs between both approaches. A system running on a single, powerful machine is much simpler to develop and maintain than one on multiple machines. However, as you scale up a machine, it gets increasingly costly to do so, and scaling out becomes inevitable. You would need to find the right balance between both approaches if you want to achieve the most cost-effective and efficient outcome."}),"\n",(0,t.jsx)(n.h2,{id:"maintainability",children:"Maintainability"}),"\n",(0,t.jsx)(n.p,{children:"When building a system, we want to build it such that it is as easy to maintain as possible."}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:'"It is well known that the majority of the cost of software is not in its initial development, but in its ongoing maintenance - fixing bugs, investigating failures, modifying it for new use cases, and adding new features." - Found on Page 18 of the book'}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"We should design systems which are easy to operate, understand and evolve. To achieve that, we should follow these three principles when designing a system:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Operability"}),": We should make it easy for operators to keep the system running smoothly."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Simplicity"}),": We should make it easy for engineers to understand the system by reducing as much system complexity as possible."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Evolvability"}),": We should make it easy for engineers to change the system in future, adapting it for unanticipated use cases to match requirement changes."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"operability",children:"Operability"}),"\n",(0,t.jsx)(n.p,{children:"A system with good operability makes routine maintenance tasks easy, allowing the operations team to focus on higher-value contributions. We can achieve that by designing a system with:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Good telemetry"}),": Set up informative and usable monitoring and logging of the system's runtime behaviour and health."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Good documentation"}),': Document in an easy-to-understand manner such that operators are clear on what they can do and what is the outcome - e.g. "If I do X, Y will happen".']}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Good default behaviour"}),": Supply default values and settings for operational/internal tools, but allow operators to override defaults when needed for edge cases."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"simplicity",children:"Simplicity"}),"\n",(0,t.jsx)(n.p,{children:"As a system grows larger, so does its complexity. This makes the system harder to understand by those working on it, which is problematic in many ways, such as:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Lower productivity"}),": Engineers will take longer to complete tasks because they will have to spend more time understanding what they are working on"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Higher risk of introducing bugs"}),": Engineers are more likely to overlook hidden assumptions and unintended side effects which will cause faults."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Moseley and Marks define two types of complexity in their paper ",(0,t.jsx)(n.a,{href:"http://curtclifton.net/papers/MoseleyMarks06a.pdf",children:"Out of the Tar Pit"}),":"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Essential Complexity"}),": inherent in the essence of the problem"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Accidental Complexity"}),": anything else which the development team would not have to deal with ideally (e.g. complexity arising from suboptimal language and infrastructure)"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"While it is inevitable that a system becomes more complex as it grows, we can mitigate it by reducing accidental complexity. We can do so by keeping simplicity in mind when working on the system. One of the best and most common approaches to doing so is by implementing abstractions, which can hide a ton of implementation detail behind a simple-to-understand facade."}),"\n",(0,t.jsx)(n.h3,{id:"evolvability",children:"Evolvability"}),"\n",(0,t.jsx)(n.p,{children:"It is likely your system's requirements will change due to reasons such as:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"An unanticipated use case emerging"}),"\n",(0,t.jsx)(n.li,{children:"Business priorities changing"}),"\n",(0,t.jsx)(n.li,{children:"User requesting new features"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"The ease at which you evolve your system to meet the new requirements depends heavily on its simplicity. The easier it is to understand your system, the easier it would be to modify it."}),"\n",(0,t.jsx)(n.h2,{id:"resources",children:"Resources"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://dataintensive.net/",children:"Martin Kleppmann: Designing Data-Intensive Applications"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://www.dynatrace.com/news/blog/why-averages-suck-and-percentiles-are-great/",children:"Michael Kopp: Why Averages Suck and Percentiles are Great"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"http://curtclifton.net/papers/MoseleyMarks06a.pdf",children:"Ben Moseley and Peter Marks: Out of the Tar Pit"})}),"\n"]})]})}function d(e={}){const{wrapper:n}={...(0,s.M)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},9623:(e,n,i)=>{i.d(n,{c:()=>t});const t=i.p+"assets/images/ddia-b2e39270aee1d26da86d96745aa744e1.png"},2172:(e,n,i)=>{i.d(n,{I:()=>r,M:()=>o});var t=i(1504);const s={},a=t.createContext(s);function o(e){const n=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6875c492.94f18b0f.js b/assets/js/6875c492.94f18b0f.js new file mode 100644 index 00000000..8950a3c8 --- /dev/null +++ b/assets/js/6875c492.94f18b0f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[12],{2687:(e,t,n)=>{n.d(t,{c:()=>r});n(1504);var s=n(4357),a=n(308),i=n(7624);function r(e){const{metadata:t}=e,{previousPage:n,nextPage:r}=t;return(0,i.jsxs)("nav",{className:"pagination-nav","aria-label":(0,s.G)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[n&&(0,i.jsx)(a.c,{permalink:n,title:(0,i.jsx)(s.c,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer Entries"})}),r&&(0,i.jsx)(a.c,{permalink:r,title:(0,i.jsx)(s.c,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older Entries"}),isNext:!0})]})}},992:(e,t,n)=>{n.d(t,{c:()=>r});n(1504);var s=n(3152),a=n(7792),i=n(7624);function r(e){let{items:t,component:n=a.c}=e;return(0,i.jsx)(i.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,i.jsx)(s.E,{content:t,children:(0,i.jsx)(n,{children:(0,i.jsx)(t,{})})},t.metadata.permalink)}))})}},2948:(e,t,n)=>{n.r(t),n.d(t,{default:()=>f});n(1504);var s=n(5456),a=n(4357),i=n(5944),r=n(5756),l=n(5864),o=n(867),c=n(9452),g=n(2687),d=n(8712),u=n(992),h=n(1528),p=n(6448),m=n(7624);function x(e){const t=function(){const{selectMessage:e}=(0,i.A)();return t=>e(t,(0,a.G)({id:"theme.blog.post.plurals",description:'Pluralized label for "{count} posts". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One post|{count} posts"},{count:t}))}();return(0,a.G)({id:"theme.blog.tagTitle",description:"The title of the page for a blog tag",message:'{nPosts} tagged with "{tagName}"'},{nPosts:t(e.count),tagName:e.label})}function j(e){let{tag:t}=e;const n=x(t);return(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(r.U7,{title:n}),(0,m.jsx)(d.c,{tag:"blog_tags_posts"})]})}function b(e){let{tag:t,items:n,sidebar:s,listMetadata:i}=e;const r=x(t);return(0,m.jsxs)(c.c,{sidebar:s,children:[t.unlisted&&(0,m.jsx)(h.c,{}),(0,m.jsxs)("header",{className:"margin-bottom--xl",children:[(0,m.jsx)(p.c,{as:"h1",children:r}),(0,m.jsx)(o.c,{href:t.allTagsPath,children:(0,m.jsx)(a.c,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page",children:"View All Tags"})})]}),(0,m.jsx)(u.c,{items:n}),(0,m.jsx)(g.c,{metadata:i})]})}function f(e){return(0,m.jsxs)(r.cr,{className:(0,s.c)(l.W.wrapper.blogPages,l.W.page.blogTagPostListPage),children:[(0,m.jsx)(j,{...e}),(0,m.jsx)(b,{...e})]})}},1528:(e,t,n)=>{n.d(t,{c:()=>h});n(1504);var s=n(5456),a=n(4357),i=n(6952),r=n(7624);function l(){return(0,r.jsx)(a.c,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function o(){return(0,r.jsx)(a.c,{id:"theme.unlistedContent.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function c(){return(0,r.jsx)(i.c,{children:(0,r.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}var g=n(5864),d=n(304);function u(e){let{className:t}=e;return(0,r.jsx)(d.c,{type:"caution",title:(0,r.jsx)(l,{}),className:(0,s.c)(t,g.W.common.unlistedBanner),children:(0,r.jsx)(o,{})})}function h(e){return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(c,{}),(0,r.jsx)(u,{...e})]})}}}]); \ No newline at end of file diff --git a/assets/js/6969bc8f.1cbf14a5.js b/assets/js/6969bc8f.1cbf14a5.js new file mode 100644 index 00000000..ac1ba928 --- /dev/null +++ b/assets/js/6969bc8f.1cbf14a5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[2960],{5588:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>r,toc:()=>h});var n=i(7624),s=i(2172);const a={slug:"history",title:"History of EvanTay.com",author:"Evan Tay",author_url:"https://github.com/DigiPie",author_title:"Final year Computer Science major at NUS",author_image_url:"https://avatars2.githubusercontent.com/u/13582874",tags:["sharing"]},o=void 0,r={permalink:"/blog/history",editUrl:"https://github.com/DigiPie/kaya-folio/tree/main/website/blog/2020-12-21-history.md",source:"@site/blog/2020-12-21-history.md",title:"History of EvanTay.com",description:"_Established in 2013_",date:"2020-12-21T00:00:00.000Z",formattedDate:"December 21, 2020",tags:[{label:"sharing",permalink:"/blog/tags/sharing"}],readingTime:2.535,hasTruncateMarker:!0,authors:[{name:"Evan Tay",title:"Final year Computer Science major at NUS",url:"https://github.com/DigiPie",imageURL:"https://avatars2.githubusercontent.com/u/13582874"}],frontMatter:{slug:"history",title:"History of EvanTay.com",author:"Evan Tay",author_url:"https://github.com/DigiPie",author_title:"Final year Computer Science major at NUS",author_image_url:"https://avatars2.githubusercontent.com/u/13582874",tags:["sharing"]},unlisted:!1,prevItem:{title:"GitHub Action for Docusaurus",permalink:"/blog/docusaurus-gh-action"},nextItem:{title:"STACK 2020 Developers Conference",permalink:"/blog/stack-2020"}},c={authorsImageUrls:[void 0]},h=[];function l(e){const t={a:"a",em:"em",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",...(0,s.M)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:(0,n.jsx)(t.em,{children:"Established in 2013"})})}),"\n",(0,n.jsxs)(t.p,{children:["I first bought my personal domain ",(0,n.jsx)(t.a,{href:"https://www.evantay.com",children:"www.evantay.com"})," way back in 2013. Younger me thought it would be cool and fun to run my own website, and it still is. ","\ud83d\ude0e"]}),"\n",(0,n.jsx)(t.p,{children:"To be honest, I can't even remember what my very first website looked like, but I am quite sure it was built using vanilla HTML and CSS, something unthinkable in this day and age."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:(0,n.jsx)(t.em,{children:"Move to Grav CMS in 2017"})})}),"\n",(0,n.jsxs)(t.p,{children:["Given that I was building everything from the ground up, maintainability became problematic. In 2017, older younger me decided it wasn't worth the effort to do it myself, and I started shopping for a framework to adopt. I eventually settled on using ",(0,n.jsx)(t.a,{href:"https://getgrav.org/",children:"Grav"}),", a flat-file Content Management System (CMS) powered by PHP. I chose it because I was familiar and interested in PHP at the time."]}),"\n",(0,n.jsxs)(t.p,{children:["To get started on building my second site quickly, I used a one-page Grav theme ",(0,n.jsx)(t.a,{href:"https://github.com/getgrav/grav-theme-ceevee",children:"Ceevee"}),"."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Ceevee",src:i(2968).c+"",width:"2842",height:"1358"})}),"\n",(0,n.jsx)(t.p,{children:"However, I still wanted to add my personal touch to my portfolio website. This led me to heavily modifying the theme numerous times over the years, from 2017 up until 2020. It was a really fun journey while it lasted."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"EvanTay.com v1 site",src:i(12).c+"",width:"2842",height:"1358"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:(0,n.jsx)(t.em,{children:"Move to Cloud in 2017"})})}),"\n",(0,n.jsxs)(t.p,{children:["About the same time, I also moved from using a website host to ",(0,n.jsx)(t.a,{href:"https://digitalocean.com",children:"DigitalOcean"}),". I hosted my website on the cheapest droplet (VM) I could find (the 5 bucks one). I ran CentOS on the VM, and used an ",(0,n.jsx)(t.a,{href:"https://www.nginx.com/",children:"Nginx"})," web server to serve the Grav website. Pretty old-school right?"]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:(0,n.jsx)(t.em,{children:"Start of DigiDocs in 2019"})})}),"\n",(0,n.jsxs)(t.p,{children:["Last year, during January 2019, I also started working on a separate pet project called ",(0,n.jsx)(t.a,{href:"https://digipie.github.io/digidocs/",children:"DigiDocs"}),", my personal documentation website. I was motivated to do so because I wanted to consolidate useful knowledge gained from attending university classes, and my own self-directed learning. I kept the site updated up until October 2020."]}),"\n",(0,n.jsxs)(t.p,{children:["Back then, ",(0,n.jsx)(t.a,{href:"https://digipie.github.io/digidocs/",children:"DigiDocs"})," lived at ",(0,n.jsx)(t.a,{href:"https://www.evantay.com/docs/",children:"www.evantay.com/docs"}),", and was served by the same Nginx server which served my main portfolio website."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:(0,n.jsx)(t.em,{children:"Move to Docusaurus v2 in 2020"})})}),"\n",(0,n.jsxs)(t.p,{children:["More recently, in October 2020, I decided to replace both documentation and portfolio site with a single ",(0,n.jsx)(t.a,{href:"https://v2.docusaurus.io/",children:"Docusaurus v2"})," website (which you're looking at right now)."]}),"\n",(0,n.jsx)(t.p,{children:"I did so because I wanted to:"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Keep up with the latest technologies"}),": I wanted to learn more about ",(0,n.jsx)(t.a,{href:"https://v2.docusaurus.io/",children:"Docusaurus v2"})," and also ",(0,n.jsx)(t.a,{href:"https://reactjs.org/",children:"ReactJS"}),", which is what Docusaurus is built upon. It was about time to move on from PHP."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Reduce operating costs by moving from a dynamic to static website"})," ","\ud83d\udcb8"," : Given that all of my content are static, it did not make sense that I was using a dynamic PHP site generator such as ",(0,n.jsx)(t.a,{href:"https://getgrav.org/",children:"Grav"}),". By moving to a static website, I will be able to host my site at a cheaper cost or even for free! I am planning to achieve the latter by using ",(0,n.jsx)(t.a,{href:"https://pages.github.com/",children:"GitHub pages"}),"."]}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["So far, the experience of using ",(0,n.jsx)(t.a,{href:"https://v2.docusaurus.io/",children:"Docusaurus v2"})," has been great! I am glad I started on this migration journey, despite feeling sentimental about my old portfolio and documentation websites."]})]})}function d(e={}){const{wrapper:t}={...(0,s.M)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},2968:(e,t,i)=>{i.d(t,{c:()=>n});const n=i.p+"assets/images/ceevee-c984f85d7b99c9bc76ee1ef040108bb5.png"},12:(e,t,i)=>{i.d(t,{c:()=>n});const n=i.p+"assets/images/evantay_v1-3aa5b8191d0711f10104318d8524a768.png"},2172:(e,t,i)=>{i.d(t,{I:()=>r,M:()=>o});var n=i(1504);const s={},a=n.createContext(s);function o(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6aa6c2d1.8690593b.js b/assets/js/6aa6c2d1.8690593b.js new file mode 100644 index 00000000..0bb24c89 --- /dev/null +++ b/assets/js/6aa6c2d1.8690593b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[5796],{6112:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/microservices","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/72403b3b.c5b37b80.js b/assets/js/72403b3b.c5b37b80.js new file mode 100644 index 00000000..83a34964 --- /dev/null +++ b/assets/js/72403b3b.c5b37b80.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[9728],{3056:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>c,default:()=>l,frontMatter:()=>r,metadata:()=>i,toc:()=>a});var s=n(7624),d=n(2172);const r={title:"JS Cheatsheet"},c=void 0,i={id:"js-cheatsheet",title:"JS Cheatsheet",description:"Published on August 1, 2021",source:"@site/docs/js-cheatsheet.md",sourceDirName:".",slug:"/js-cheatsheet",permalink:"/docs/js-cheatsheet",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{title:"JS Cheatsheet"},sidebar:"docs",previous:{title:"C Cheatsheet",permalink:"/docs/c-cheatsheet"},next:{title:"Git Cheatsheet",permalink:"/docs/git-cheatsheet"}},o={},a=[{value:"Var, Let and Const",id:"var-let-and-const",level:2},{value:"Resources",id:"resources",level:2}];function h(e){const t={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,d.M)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"Published on August 1, 2021"}),"\n",(0,s.jsx)(t.h2,{id:"var-let-and-const",children:"Var, Let and Const"}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.a,{href:"https://www.w3schools.com/Js/js_es6.asp",children:"Javascript ES6"})," introduced two new keywords to define variables, ",(0,s.jsx)(t.code,{children:"let"})," and ",(0,s.jsx)(t.code,{children:"const"}),". Previously, the keyword ",(0,s.jsx)(t.code,{children:"var"})," was the only way to do so. ",(0,s.jsx)(t.code,{children:"let"})," and ",(0,s.jsx)(t.code,{children:"const"})," were introduced because there were issues with ",(0,s.jsx)(t.code,{children:"var"})," which made it error-prone and hard to debug."]}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{}),(0,s.jsx)(t.th,{children:(0,s.jsx)(t.code,{children:"var"})}),(0,s.jsx)(t.th,{children:(0,s.jsx)(t.code,{children:"let"})}),(0,s.jsx)(t.th,{children:(0,s.jsx)(t.code,{children:"const"})})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Scope"}),(0,s.jsx)(t.td,{children:"Global or Function"}),(0,s.jsxs)(t.td,{children:["Block scope ",(0,s.jsx)(t.code,{children:"{}"})]}),(0,s.jsxs)(t.td,{children:["Block scope ",(0,s.jsx)(t.code,{children:"{}"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Must be initialized when declared"}),(0,s.jsx)(t.td,{children:"No"}),(0,s.jsx)(t.td,{children:"No"}),(0,s.jsx)(t.td,{children:"Yes"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Can use before initialization"}),(0,s.jsx)(t.td,{children:"Yes"}),(0,s.jsx)(t.td,{children:"No"}),(0,s.jsx)(t.td,{children:"No"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Can be redeclared"}),(0,s.jsx)(t.td,{children:"Yes"}),(0,s.jsx)(t.td,{children:"No"}),(0,s.jsx)(t.td,{children:"No"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Can be updated"}),(0,s.jsx)(t.td,{children:"Yes"}),(0,s.jsx)(t.td,{children:"Yes"}),(0,s.jsx)(t.td,{children:"No"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Hoisted to start of scope"}),(0,s.jsx)(t.td,{children:"Yes"}),(0,s.jsx)(t.td,{children:"Yes"}),(0,s.jsx)(t.td,{children:"Yes"})]})]})]}),"\n",(0,s.jsxs)(t.p,{children:["Avoid using ",(0,s.jsx)(t.code,{children:"var"})," because it is either global or function scope, and a declaration and assignment of a ",(0,s.jsx)(t.code,{children:"var"})," can easily be redeclared or updated unknowingly in another function. Furthermore, a ",(0,s.jsx)(t.code,{children:"var"})," is initialized with ",(0,s.jsx)(t.code,{children:"undefined"})," and can be used even before being assigned a value."]}),"\n",(0,s.jsxs)(t.p,{children:["On the other hand, ",(0,s.jsx)(t.code,{children:"let"})," and ",(0,s.jsx)(t.code,{children:"const"})," are block scope, and cannot be redeclared. Additionally, ",(0,s.jsx)(t.code,{children:"const"})," cannot be updated. Both ",(0,s.jsx)(t.code,{children:"let"})," and ",(0,s.jsx)(t.code,{children:"const"})," also cannot be used before initialization, and will throw ",(0,s.jsx)(t.code,{children:"Reference error"})," rather than return ",(0,s.jsx)(t.code,{children:"undefined"})," like ",(0,s.jsx)(t.code,{children:"var"}),"."]}),"\n",(0,s.jsx)(t.admonition,{title:"Quote",type:"note",children:(0,s.jsxs)(t.p,{children:['"Hoisting is a JavaScript mechanism where variables and function declarations are moved to the top of their scope before code execution." - Sarah Chima Atuonwu, ',(0,s.jsx)(t.a,{href:"https://www.freecodecamp.org/news/var-let-and-const-whats-the-difference/",children:"Var, Let, and Const \u2013 What's the Difference?"})]})}),"\n",(0,s.jsx)(t.h2,{id:"resources",children:"Resources"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://www.freecodecamp.org/news/var-let-and-const-whats-the-difference/",children:"Var, Let, and Const \u2013 What's the Difference?"})}),"\n"]})]})}function l(e={}){const{wrapper:t}={...(0,d.M)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},2172:(e,t,n)=>{n.d(t,{I:()=>i,M:()=>c});var s=n(1504);const d={},r=s.createContext(d);function c(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:c(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7550f3ec.05f2a3e5.js b/assets/js/7550f3ec.05f2a3e5.js new file mode 100644 index 00000000..f42e9580 --- /dev/null +++ b/assets/js/7550f3ec.05f2a3e5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[8056],{9464:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>d,contentTitle:()=>i,default:()=>h,frontMatter:()=>c,metadata:()=>l,toc:()=>r});var t=o(7624),s=o(2172);const c={title:"MongoDB Cheatsheet"},i=void 0,l={id:"mongodb-cheatsheet",title:"MongoDB Cheatsheet",description:"Published on December 23, 2020",source:"@site/docs/mongodb-cheatsheet.md",sourceDirName:".",slug:"/mongodb-cheatsheet",permalink:"/docs/mongodb-cheatsheet",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{title:"MongoDB Cheatsheet"},sidebar:"docs",previous:{title:"MongoDB Setup",permalink:"/docs/mongodb-setup"},next:{title:"NodeJS Auto-reload server",permalink:"/docs/nodejs-auto-reload"}},d={},r=[{value:"Print a collection's documents",id:"print-a-collections-documents",level:2},{value:"Delete documents",id:"delete-documents",level:2},{value:"Resources",id:"resources",level:2}];function a(e){const n={a:"a",code:"code",em:"em",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.M)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Published on December 23, 2020"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsxs)(n.em,{children:["This document was migrated from ",(0,t.jsx)(n.a,{href:"https://digipie.github.io/digidocs/mongodb/cheat-sheet/",children:"DigiDocs"})]})}),"\n",(0,t.jsxs)(n.p,{children:["The purpose of this page is to summarise key ",(0,t.jsx)(n.code,{children:"mongodb"})," commands you will often use."]}),"\n",(0,t.jsx)(n.h2,{id:"print-a-collections-documents",children:"Print a collection's documents"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"# Select the database\nshow dbs\nuse <db-name>\n\n# Show all collections in the database\nshow collections\n\n# Print out all documents in the database\ndb.<collection-name>.find()\n\n# Print out in an easy-to-read but less compact format\ndb.<collection-name>.find().pretty()\n"})}),"\n",(0,t.jsx)(n.h2,{id:"delete-documents",children:"Delete documents"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"show dbs\nuse <db-name>\n\n# Show all collections in the database\nshow collections\n\n# Remove all documents in the collection\ndb.<collection-name>.remove( { } )\n\n# See reference for more information\n"})}),"\n",(0,t.jsx)(n.h2,{id:"resources",children:"Resources"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://digipie.github.io/digidocs/mongodb/cheat-sheet/",children:"Original copy of this document at DigiDocs"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://docs.mongodb.com/manual/reference/mongo-shell/",children:"MongoDB's official guide to mongo Shell Quick Reference"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://docs.mongodb.com/manual/reference/method/db.collection.remove/",children:"MongoDB's official guide to db.collection.remove()"})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.M)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},2172:(e,n,o)=>{o.d(n,{I:()=>l,M:()=>i});var t=o(1504);const s={},c=t.createContext(s);function i(e){const n=t.useContext(c);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),t.createElement(c.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/771f38eb.673356af.js b/assets/js/771f38eb.673356af.js new file mode 100644 index 00000000..68d505f2 --- /dev/null +++ b/assets/js/771f38eb.673356af.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[4720],{7840:a=>{a.exports=JSON.parse('{"label":"ci","permalink":"/blog/tags/ci","allTagsPath":"/blog/tags","count":1,"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/773806e0.c63e41b6.js b/assets/js/773806e0.c63e41b6.js new file mode 100644 index 00000000..5c3b99ca --- /dev/null +++ b/assets/js/773806e0.c63e41b6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[4888],{3648:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>t,metadata:()=>l,toc:()=>c});var s=i(7624),r=i(2172);const t={slug:"stack-2020",title:"STACK 2020 Developers Conference",author:"Evan Tay",author_url:"https://github.com/DigiPie",author_title:"Final year Computer Science major at NUS",author_image_url:"https://avatars2.githubusercontent.com/u/13582874",tags:["conference","cloud","microservices","GovTechSTACK"]},o=void 0,l={permalink:"/blog/stack-2020",editUrl:"https://github.com/DigiPie/kaya-folio/tree/main/website/blog/2020-12-03-stack-conference.md",source:"@site/blog/2020-12-03-stack-conference.md",title:"STACK 2020 Developers Conference",description:"STACK 2020 Developers Conference is GovTech\u2019s flagship conference and the largest government-led developers event in Singapore that connects government, industry and the tech community.",date:"2020-12-03T00:00:00.000Z",formattedDate:"December 3, 2020",tags:[{label:"conference",permalink:"/blog/tags/conference"},{label:"cloud",permalink:"/blog/tags/cloud"},{label:"microservices",permalink:"/blog/tags/microservices"},{label:"GovTechSTACK",permalink:"/blog/tags/gov-tech-stack"}],readingTime:7.07,hasTruncateMarker:!0,authors:[{name:"Evan Tay",title:"Final year Computer Science major at NUS",url:"https://github.com/DigiPie",imageURL:"https://avatars2.githubusercontent.com/u/13582874"}],frontMatter:{slug:"stack-2020",title:"STACK 2020 Developers Conference",author:"Evan Tay",author_url:"https://github.com/DigiPie",author_title:"Final year Computer Science major at NUS",author_image_url:"https://avatars2.githubusercontent.com/u/13582874",tags:["conference","cloud","microservices","GovTechSTACK"]},unlisted:!1,prevItem:{title:"History of EvanTay.com",permalink:"/blog/history"}},a={authorsImageUrls:[void 0]},c=[{value:"Opening note",id:"opening-note",level:2},{value:"Rethink, Reinvent, Rebuild",id:"rethink-reinvent-rebuild",level:2},{value:"Seeding the Cloud: Engineering Solutions for Cloud Adoption",id:"seeding-the-cloud-engineering-solutions-for-cloud-adoption",level:2},{value:"Six Principles for Refactoring a Monolith to Microservices",id:"six-principles-for-refactoring-a-monolith-to-microservices",level:2},{value:"You Won\u2019t BELIEVE This HACK to Improve Your Technical Communication!",id:"you-wont-believe-this-hack-to-improve-your-technical-communication",level:2},{value:"DevOps: Cloud and Back Again",id:"devops-cloud-and-back-again",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",mdxAdmonitionTitle:"mdxAdmonitionTitle",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.M)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://www.stack.gov.sg/",children:"STACK 2020 Developers Conference"})," is GovTech\u2019s flagship conference and the largest government-led developers event in Singapore that connects government, industry and the tech community."]}),"\n",(0,s.jsx)(n.p,{children:"In this post, you will find my key takeaways for some of the sessions I attended during the conference. I chose to attend these sessions based on my interests in Cloud and Microservices."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Day 1:"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:(0,s.jsx)(n.a,{href:"#opening-note",children:"Opening note"})})," by Dr. Vivian Balakrishnan: Minister-in-charge of Smart Nation Programme Office and Chan Cheow Hoe: Government Chief Digital Technology Officer"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:(0,s.jsx)(n.a,{href:"#rethink-reinvent-rebuild",children:"Rethink, Reinvent, Rebuild"})})," by Jeff Barr: Vice President & Chief Evangelist at Amazon Web Services"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:(0,s.jsx)(n.a,{href:"#seeding-the-cloud-engineering-solutions-for-cloud-adoption",children:"Seeding the Cloud: Engineering Solutions for Cloud Adoption"})})," by Hunter Nield: Distinguished Engineer at GovTech"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:(0,s.jsx)(n.a,{href:"#six-principles-for-refactoring-a-monolith-to-microservices",children:"Six Principles for Refactoring a Monolith to Microservices"})})," by Chris Richardson: Architect at Eventuate, Inc"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Day 2:"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:(0,s.jsx)(n.a,{href:"#you-wont-believe-this-hack-to-improve-your-technical-communication",children:"You Won\u2019t BELIEVE This HACK to Improve Your Technical Communication!"})})," by Nikhil Choudhary: Software Engineer at Open Government Products"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:(0,s.jsx)(n.a,{href:"#devops-cloud-and-back-again",children:"DevOps: Cloud and Back Again"})})," by Mitchell Hashimoto: Co-Founder and CTO at HashiCorp"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"opening-note",children:"Opening note"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Speaker(s)"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"http://vivian.balakrishnan.sg/",children:"Dr. Vivian Balakrishnan"}),": Minister-in-charge of Smart Nation Programme Office"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://www.linkedin.com/in/cheow-hoe-chan-92646215/",children:"Chan Cheow Hoe"}),": Government Chief Digital Technology Officer"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Key takeaways"})}),"\n",(0,s.jsx)(n.p,{children:"The government believes openness is the way to building a smart nation."}),"\n",(0,s.jsx)(n.p,{children:"On that note, they believe in:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Adopting the best solutions there are, including those from the industry, instead of doing everything in-house","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://www.developer.tech.gov.sg/technologies/infrastructure-and-hosting/government-commercial-cloud",children:"Government Commercial Cloud"}),": AWS, Azure, GCP"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Collaborating with industry developers via open-source","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://www.developer.tech.gov.sg/",children:"Singapore Government Developer Portal"}),": Collaboration platform for government and industry developers"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Providing transparency to citizens and industry professionals","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://www.tracetogether.gov.sg/",children:"TraceTogether"}),": Transparent and open collaboration with the industry"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"rethink-reinvent-rebuild",children:"Rethink, Reinvent, Rebuild"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Speaker(s)"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://www.linkedin.com/in/jeffbarr/",children:"Jeff Barr"}),": Vice President & Chief Evangelist at Amazon Web Services"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Key takeaways"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Rethink"})," - Take a good look at where we are","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Everything has changed due to COVID-19, Quarantine, WFH"}),"\n",(0,s.jsx)(n.li,{children:"No firm ground and constants are now variables"}),"\n",(0,s.jsx)(n.li,{children:"People are more receptive to change and invention right now"}),"\n",(0,s.jsx)(n.li,{children:"Good time for innovation and progress"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Reinvent"})," - Solve challenges in a new way","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Dream big dreams, address these challenges, change the world"}),"\n",(0,s.jsxs)(n.li,{children:["Share what you learn to reinforce what you learned","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Content creation / video streaming possibilities"}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Rebuild"})," - Put what you have learned to work","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Take what you learn, do something awesome, and remember to share it!"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"seeding-the-cloud-engineering-solutions-for-cloud-adoption",children:"Seeding the Cloud: Engineering Solutions for Cloud Adoption"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Speaker(s)"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://www.linkedin.com/in/hunter/?originalSubdomain=sg",children:"Hunter Nield"}),": Distinguished Engineer at GovTech"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Key takeaways"})}),"\n",(0,s.jsxs)(n.p,{children:["Hunter shared about how GovTech uses Infrastructure-as-Code (IaC) and Policy-as-Code (PaC) to accelerate cloud operations. Read ",(0,s.jsx)(n.a,{href:"#devops-cloud-and-back-again",children:"#devops-cloud-and-back-again"})," by Hashicorp CTO Mitchell for more information."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Establishing a Landing Zone"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"A repeatable configuration across multiple Cloud Service Providers (CSP)"}),"\n",(0,s.jsx)(n.li,{children:"The foundation of any cloud environment at scale"}),"\n",(0,s.jsx)(n.li,{children:"Serves as a consistent platform for governance, onboarding, networking and security"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Accelerating deployment with Infrastructure-as-Code (IaC)"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Code and configuration to provision cloud resources and Landing Zones"}),"\n",(0,s.jsx)(n.li,{children:"Develop common templates for consistency and familiarity"}),"\n",(0,s.jsx)(n.li,{children:'Get feedback on pain points faced by "customers" while using said templates'}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Consistent audit and reporting with Policy-as-Code (PaC)"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Code and configuration to test and validate cloud infrastructure deployed by IaC"}),"\n",(0,s.jsx)(n.li,{children:"Reduce need for manual audits and speed up auditing process"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"six-principles-for-refactoring-a-monolith-to-microservices",children:"Six Principles for Refactoring a Monolith to Microservices"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Speaker(s)"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://eventuate.io/about.html",children:"Chris Richardson"}),": Architect at Eventuate, Inc"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Key takeaways"})}),"\n",(0,s.jsx)(n.admonition,{title:"Quote",type:"note",children:(0,s.jsx)(n.p,{children:'"A Microservice application is structured as a set of loosely coupled services that can be independently deployed." - Chris Richardson'})}),"\n",(0,s.jsx)(n.p,{children:"Chris shared 6 principles to follow when moving from a Monolith to a Microservice architecture."}),"\n",(0,s.jsxs)(n.p,{children:["Here are 5 of them ","\ud83d\ude09"," :"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Adopt Microservice architecture for the right reasons","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Monolith architecture is not necessary bad (an anti-pattern), it has its valid use-cases"}),"\n",(0,s.jsx)(n.li,{children:"Adopt Microservice architecture because it allows you to deliver software rapidly, frequently and sustainability, with small, autonomous teams working on the different microservices"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Migrate to Microservice architecture incrementally rather than via Big Bang rewrite","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Strangler Application"}),": Incrementally migrate functionality from existing Monolith application to new Strangler Microservice application","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Extract existing code modules and database tables out into microservices"}),"\n",(0,s.jsx)(n.li,{children:"Implement new features as microservices"}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Consider Return-on-Investment when deciding which modules to convert into microservices","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Consider benefit of decoupling said module"}),"\n",(0,s.jsxs)(n.li,{children:["Consider cost of decoupling","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"How difficult it is to do so"}),"\n",(0,s.jsxs)(n.li,{children:["How many inbound dependencies it has","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"If module A is depended upon by module B, consider extracting module B first"}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Define the service boundaries correctly","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Avoid ",(0,s.jsx)(n.strong,{children:"Runtime Coupling"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Reduced availability due to reliance of a given microservice on another for serving a given request","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"For example, microservice A receives an API request which it can only respond to when its own API request to microservice B is answered first"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Make microservices as self-contained as possible","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Able to respond to a request without making follow-up requests to other microservices"}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Avoid ",(0,s.jsx)(n.strong,{children:"Design-Time Coupling"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Similar to ",(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Open%E2%80%93closed_principle",children:"Open-Closed Principle"})]}),"\n",(0,s.jsx)(n.li,{children:"Avoid having to modify other microservices when modifying a given microservice"}),"\n",(0,s.jsxs)(n.li,{children:["Must be able to modify or exend a given microservice independently as much as possible","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Have small and stable API which hides as much implementation complexity as possible"}),"\n",(0,s.jsx)(n.li,{children:"Hide what you can, not only code but also database schemas, so you can change them without affecting other microservices"}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Measuring success","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Improved metrics: Reduced lead time, deployment frequency, failure rate, etc."}),"\n",(0,s.jsx)(n.li,{children:"Improvements in other '-ilities': Availability, Reliability and Scalability"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"you-wont-believe-this-hack-to-improve-your-technical-communication",children:"You Won\u2019t BELIEVE This HACK to Improve Your Technical Communication!"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Speaker(s)"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://www.linkedin.com/in/nikhil-c-513647148/",children:"Nikhil Choudhary"}),": Software Engineer at Open Government Products"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Key takeaways"})}),"\n",(0,s.jsx)(n.p,{children:"When introducing non-technical folks to coding, keep in mind that the most important objective is to convey understanding of core programming concepts."}),"\n",(0,s.jsx)(n.p,{children:"On that note, here are some tips Nikhil shared:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Forgo coding best practices if doing so make it easier for the audience to understand","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Reduce surface area to increase accessibility, even if it is not good coding practice","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Collapse all HTML, JS and CSS into a single file so students can view everything in one place"}),"\n",(0,s.jsx)(n.li,{children:"Collapse all functions into one for the same reason as the previous line"}),"\n",(0,s.jsx)(n.li,{children:"Combine program lines if it makes things clearer"}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Use real-world examples to explain technical concepts","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["For example, use a restaurant scenario to explain ",(0,s.jsx)(n.code,{children:"async"})]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Enable students in sharing their joy/achievement","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Make deploying their application easy","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Can use ",(0,s.jsx)(n.a,{href:"https://app.netlify.com/drop",children:"Netlify Drop"}),": Simply drag and drop your HTML, JS, CSS files and Netlify Drop will do the rest for deployments"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.li,{children:"Practise empathy consciously throughout teaching process to identify ways you can make learning easier for your students"}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"devops-cloud-and-back-again",children:"DevOps: Cloud and Back Again"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Speaker(s)"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://www.linkedin.com/in/mitchellh/",children:"Mitchell Hashimoto"}),": Co-Founder and CTO at HashiCorp"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Key takeaways"})}),"\n",(0,s.jsxs)(n.p,{children:["Mitchell shared more about the ",(0,s.jsx)(n.a,{href:"https://www.hashicorp.com/cloud-operating-model",children:"Cloud Operating Model"})," during this session."]}),"\n",(0,s.jsxs)(n.admonition,{type:"note",children:[(0,s.jsx)(n.mdxAdmonitionTitle,{children:(0,s.jsx)(n.a,{href:"https://www.hashicorp.com/cloud-operating-model",children:"Cite"})}),(0,s.jsx)(n.p,{children:'"The Cloud Operating Model is a new approach for IT operations that organizations need to use to be successful with cloud adoption and thrive in an era of multi-cloud architecture." - Hashicorp'})]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{}),(0,s.jsx)(n.th,{children:"Static"}),(0,s.jsx)(n.th,{children:"Dynamic"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Run"}),(0,s.jsx)(n.td,{children:"Dedicated infrastructure to run app on"}),(0,s.jsx)(n.td,{children:"Scheduled automatically across a fleet (e.g. AWS Auto-Scaling Group, Hashicorp Nomad)"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Connect"}),(0,s.jsx)(n.td,{children:"Host-based, static IP-addressing"}),(0,s.jsx)(n.td,{children:"Service-based, dynamic IP addresses due to dynamic provisioning"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Secure"}),(0,s.jsx)(n.td,{children:"High-trust environment which is IP-address-based, with clear network perimeter"}),(0,s.jsx)(n.td,{children:"Low-trust environment with no clear perimeter given multi-tenancy and nature of the Cloud"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Provision"}),(0,s.jsx)(n.td,{children:"Dedicated resources - Physical servers, routers and switches"}),(0,s.jsx)(n.td,{children:"Capacity on-demand, provision VMs, Containers and other managed services, or simply use Serverless services"})]})]})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Infrastructure operations on the Cloud must follow the Dynamic Cloud Operating Model fully","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Pointless if you provision infrastructure in minutes using Infrastructure-as-Code (IaC), but still manually handle connectivity and security review using tickets"}),"\n",(0,s.jsx)(n.li,{children:"Have to adopt dynamic cloud operating tools for all 4 layers"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Why use IaC for provisioning","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Split Execution from Definition"}),"\n",(0,s.jsx)(n.li,{children:"Execution can be automated and carried out via API, UI or automatically through Continuous-Integration (CI) tools"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["How can teams use IaC","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Operations team still necessary, focus on creating and improving blueprints and handling edge-cases when doing so"}),"\n",(0,s.jsx)(n.li,{children:"Development team creates infrastructure in a self-service manner, using the blueprints created by the Operations team\nseparating buzz words from crucial tech"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Read up on Hashicorp's white paper on ",(0,s.jsx)(n.a,{href:"https://www.hashicorp.com/cloud-operating-model",children:"Cloud Operating Model"})," for more information."]})]})}function h(e={}){const{wrapper:n}={...(0,r.M)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},2172:(e,n,i)=>{i.d(n,{I:()=>l,M:()=>o});var s=i(1504);const r={},t=s.createContext(r);function o(e){const n=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7856.6c03dd8c.js b/assets/js/7856.6c03dd8c.js new file mode 100644 index 00000000..9a0278a1 --- /dev/null +++ b/assets/js/7856.6c03dd8c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[7856],{792:(n,t,a)=>{a.d(t,{u:()=>y});var e=a(5620),r=a(3268),i=a.n(r),o=a(1504);function s(n,t){var a=Object.keys(n);if(Object.getOwnPropertySymbols){var e=Object.getOwnPropertySymbols(n);t&&(e=e.filter((function(t){return Object.getOwnPropertyDescriptor(n,t).enumerable}))),a.push.apply(a,e)}return a}function c(n){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?s(Object(a),!0).forEach((function(t){l(n,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(a)):s(Object(a)).forEach((function(t){Object.defineProperty(n,t,Object.getOwnPropertyDescriptor(a,t))}))}return n}function f(n){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n},f(n)}function l(n,t,a){return t in n?Object.defineProperty(n,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):n[t]=a,n}function u(n,t){if(null==n)return{};var a,e,r=function(n,t){if(null==n)return{};var a,e,r={},i=Object.keys(n);for(e=0;e<i.length;e++)a=i[e],t.indexOf(a)>=0||(r[a]=n[a]);return r}(n,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(n);for(e=0;e<i.length;e++)a=i[e],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(n,a)&&(r[a]=n[a])}return r}function m(n){return function(n){if(Array.isArray(n))return d(n)}(n)||function(n){if("undefined"!=typeof Symbol&&null!=n[Symbol.iterator]||null!=n["@@iterator"])return Array.from(n)}(n)||function(n,t){if(!n)return;if("string"==typeof n)return d(n,t);var a=Object.prototype.toString.call(n).slice(8,-1);"Object"===a&&n.constructor&&(a=n.constructor.name);if("Map"===a||"Set"===a)return Array.from(n);if("Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a))return d(n,t)}(n)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function d(n,t){(null==t||t>n.length)&&(t=n.length);for(var a=0,e=new Array(t);a<t;a++)e[a]=n[a];return e}function p(n){return t=n,(t-=0)==t?n:(n=n.replace(/[\-_\s]+(.)?/g,(function(n,t){return t?t.toUpperCase():""}))).substr(0,1).toLowerCase()+n.substr(1);var t}var b=["style"];var v=!1;try{v=!0}catch(w){}function g(n){return n&&"object"===f(n)&&n.prefix&&n.iconName&&n.icon?n:e.K0.icon?e.K0.icon(n):null===n?null:n&&"object"===f(n)&&n.prefix&&n.iconName?n:Array.isArray(n)&&2===n.length?{prefix:n[0],iconName:n[1]}:"string"==typeof n?{prefix:"fas",iconName:n}:void 0}function h(n,t){return Array.isArray(t)&&t.length>0||!Array.isArray(t)&&t?l({},n,t):{}}var y=o.forwardRef((function(n,t){var a=n.icon,r=n.mask,i=n.symbol,o=n.className,s=n.title,f=n.titleId,u=n.maskId,d=g(a),p=h("classes",[].concat(m(function(n){var t,a=n.beat,e=n.fade,r=n.beatFade,i=n.bounce,o=n.shake,s=n.flash,c=n.spin,f=n.spinPulse,u=n.spinReverse,m=n.pulse,d=n.fixedWidth,p=n.inverse,b=n.border,v=n.listItem,g=n.flip,h=n.size,y=n.rotation,k=n.pull,w=(l(t={"fa-beat":a,"fa-fade":e,"fa-beat-fade":r,"fa-bounce":i,"fa-shake":o,"fa-flash":s,"fa-spin":c,"fa-spin-reverse":u,"fa-spin-pulse":f,"fa-pulse":m,"fa-fw":d,"fa-inverse":p,"fa-border":b,"fa-li":v,"fa-flip":!0===g,"fa-flip-horizontal":"horizontal"===g||"both"===g,"fa-flip-vertical":"vertical"===g||"both"===g},"fa-".concat(h),null!=h),l(t,"fa-rotate-".concat(y),null!=y&&0!==y),l(t,"fa-pull-".concat(k),null!=k),l(t,"fa-swap-opacity",n.swapOpacity),t);return Object.keys(w).map((function(n){return w[n]?n:null})).filter((function(n){return n}))}(n)),m(o.split(" ")))),b=h("transform","string"==typeof n.transform?e.K0.transform(n.transform):n.transform),w=h("mask",g(r)),x=(0,e.Kk)(d,c(c(c(c({},p),b),w),{},{symbol:i,title:s,titleId:f,maskId:u}));if(!x)return function(){var n;!v&&console&&"function"==typeof console.error&&(n=console).error.apply(n,arguments)}("Could not find icon",d),null;var O=x.abstract,A={ref:t};return Object.keys(n).forEach((function(t){y.defaultProps.hasOwnProperty(t)||(A[t]=n[t])})),k(O[0],A)}));y.displayName="FontAwesomeIcon",y.propTypes={beat:i().bool,border:i().bool,beatFade:i().bool,bounce:i().bool,className:i().string,fade:i().bool,flash:i().bool,mask:i().oneOfType([i().object,i().array,i().string]),maskId:i().string,fixedWidth:i().bool,inverse:i().bool,flip:i().oneOf([!0,!1,"horizontal","vertical","both"]),icon:i().oneOfType([i().object,i().array,i().string]),listItem:i().bool,pull:i().oneOf(["right","left"]),pulse:i().bool,rotation:i().oneOf([0,90,180,270]),shake:i().bool,size:i().oneOf(["2xs","xs","sm","lg","xl","2xl","1x","2x","3x","4x","5x","6x","7x","8x","9x","10x"]),spin:i().bool,spinPulse:i().bool,spinReverse:i().bool,symbol:i().oneOfType([i().bool,i().string]),title:i().string,titleId:i().string,transform:i().oneOfType([i().string,i().object]),swapOpacity:i().bool},y.defaultProps={border:!1,className:"",mask:null,maskId:null,fixedWidth:!1,inverse:!1,flip:!1,icon:null,listItem:!1,pull:null,pulse:!1,rotation:null,size:null,spin:!1,spinPulse:!1,spinReverse:!1,beat:!1,fade:!1,beatFade:!1,bounce:!1,shake:!1,symbol:!1,title:"",titleId:null,transform:null,swapOpacity:!1};var k=function n(t,a){var e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if("string"==typeof a)return a;var r=(a.children||[]).map((function(a){return n(t,a)})),i=Object.keys(a.attributes||{}).reduce((function(n,t){var e=a.attributes[t];switch(t){case"class":n.attrs.className=e,delete a.attributes.class;break;case"style":n.attrs.style=e.split(";").map((function(n){return n.trim()})).filter((function(n){return n})).reduce((function(n,t){var a,e=t.indexOf(":"),r=p(t.slice(0,e)),i=t.slice(e+1).trim();return r.startsWith("webkit")?n[(a=r,a.charAt(0).toUpperCase()+a.slice(1))]=i:n[r]=i,n}),{});break;default:0===t.indexOf("aria-")||0===t.indexOf("data-")?n.attrs[t.toLowerCase()]=e:n.attrs[p(t)]=e}return n}),{attrs:{}}),o=e.style,s=void 0===o?{}:o,f=u(e,b);return i.attrs.style=c(c({},i.attrs.style),s),t.apply(void 0,[a.tag,c(c({},i.attrs),f)].concat(m(r)))}.bind(null,o.createElement)},5620:(n,t,a)=>{function e(n,t){var a=Object.keys(n);if(Object.getOwnPropertySymbols){var e=Object.getOwnPropertySymbols(n);t&&(e=e.filter((function(t){return Object.getOwnPropertyDescriptor(n,t).enumerable}))),a.push.apply(a,e)}return a}function r(n){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?e(Object(a),!0).forEach((function(t){s(n,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(a)):e(Object(a)).forEach((function(t){Object.defineProperty(n,t,Object.getOwnPropertyDescriptor(a,t))}))}return n}function i(n){return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n},i(n)}function o(n,t){for(var a=0;a<t.length;a++){var e=t[a];e.enumerable=e.enumerable||!1,e.configurable=!0,"value"in e&&(e.writable=!0),Object.defineProperty(n,e.key,e)}}function s(n,t,a){return t in n?Object.defineProperty(n,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):n[t]=a,n}function c(n,t){return function(n){if(Array.isArray(n))return n}(n)||function(n,t){var a=null==n?null:"undefined"!=typeof Symbol&&n[Symbol.iterator]||n["@@iterator"];if(null==a)return;var e,r,i=[],o=!0,s=!1;try{for(a=a.call(n);!(o=(e=a.next()).done)&&(i.push(e.value),!t||i.length!==t);o=!0);}catch(c){s=!0,r=c}finally{try{o||null==a.return||a.return()}finally{if(s)throw r}}return i}(n,t)||l(n,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function f(n){return function(n){if(Array.isArray(n))return u(n)}(n)||function(n){if("undefined"!=typeof Symbol&&null!=n[Symbol.iterator]||null!=n["@@iterator"])return Array.from(n)}(n)||l(n)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function l(n,t){if(n){if("string"==typeof n)return u(n,t);var a=Object.prototype.toString.call(n).slice(8,-1);return"Object"===a&&n.constructor&&(a=n.constructor.name),"Map"===a||"Set"===a?Array.from(n):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?u(n,t):void 0}}function u(n,t){(null==t||t>n.length)&&(t=n.length);for(var a=0,e=new Array(t);a<t;a++)e[a]=n[a];return e}a.d(t,{En:()=>va,K0:()=>ga,Kk:()=>ha});var m=function(){},d={},p={},b=null,v={mark:m,measure:m};try{"undefined"!=typeof window&&(d=window),"undefined"!=typeof document&&(p=document),"undefined"!=typeof MutationObserver&&(b=MutationObserver),"undefined"!=typeof performance&&(v=performance)}catch(ya){}var g,h,y,k,w,x=(d.navigator||{}).userAgent,O=void 0===x?"":x,A=d,C=p,z=b,N=v,P=(A.document,!!C.documentElement&&!!C.head&&"function"==typeof C.addEventListener&&"function"==typeof C.createElement),j=~O.indexOf("MSIE")||~O.indexOf("Trident/"),M="___FONT_AWESOME___",S=16,L="fa",E="svg-inline--fa",I="data-fa-i2svg",R="data-fa-pseudo-element",Y="data-fa-pseudo-element-pending",T="data-prefix",D="data-icon",H="fontawesome-i2svg",F="async",V=["HTML","HEAD","STYLE","SCRIPT"],W=function(){try{return!0}catch(ya){return!1}}(),U="classic",_="sharp",K=[U,_];function B(n){return new Proxy(n,{get:function(n,t){return t in n?n[t]:n[U]}})}var X=B((s(g={},U,{fa:"solid",fas:"solid","fa-solid":"solid",far:"regular","fa-regular":"regular",fal:"light","fa-light":"light",fat:"thin","fa-thin":"thin",fad:"duotone","fa-duotone":"duotone",fab:"brands","fa-brands":"brands",fak:"kit",fakd:"kit","fa-kit":"kit","fa-kit-duotone":"kit"}),s(g,_,{fa:"solid",fass:"solid","fa-solid":"solid",fasr:"regular","fa-regular":"regular",fasl:"light","fa-light":"light",fast:"thin","fa-thin":"thin"}),g)),q=B((s(h={},U,{solid:"fas",regular:"far",light:"fal",thin:"fat",duotone:"fad",brands:"fab",kit:"fak"}),s(h,_,{solid:"fass",regular:"fasr",light:"fasl",thin:"fast"}),h)),G=B((s(y={},U,{fab:"fa-brands",fad:"fa-duotone",fak:"fa-kit",fal:"fa-light",far:"fa-regular",fas:"fa-solid",fat:"fa-thin"}),s(y,_,{fass:"fa-solid",fasr:"fa-regular",fasl:"fa-light",fast:"fa-thin"}),y)),$=B((s(k={},U,{"fa-brands":"fab","fa-duotone":"fad","fa-kit":"fak","fa-light":"fal","fa-regular":"far","fa-solid":"fas","fa-thin":"fat"}),s(k,_,{"fa-solid":"fass","fa-regular":"fasr","fa-light":"fasl","fa-thin":"fast"}),k)),J=/fa(s|r|l|t|d|b|k|ss|sr|sl|st)?[\-\ ]/,Q="fa-layers-text",Z=/Font ?Awesome ?([56 ]*)(Solid|Regular|Light|Thin|Duotone|Brands|Free|Pro|Sharp|Kit)?.*/i,nn=B((s(w={},U,{900:"fas",400:"far",normal:"far",300:"fal",100:"fat"}),s(w,_,{900:"fass",400:"fasr",300:"fasl",100:"fast"}),w)),tn=[1,2,3,4,5,6,7,8,9,10],an=tn.concat([11,12,13,14,15,16,17,18,19,20]),en=["class","data-prefix","data-icon","data-fa-transform","data-fa-mask"],rn={GROUP:"duotone-group",SWAP_OPACITY:"swap-opacity",PRIMARY:"primary",SECONDARY:"secondary"},on=new Set;Object.keys(q[U]).map(on.add.bind(on)),Object.keys(q[_]).map(on.add.bind(on));var sn=[].concat(K,f(on),["2xs","xs","sm","lg","xl","2xl","beat","border","fade","beat-fade","bounce","flip-both","flip-horizontal","flip-vertical","flip","fw","inverse","layers-counter","layers-text","layers","li","pull-left","pull-right","pulse","rotate-180","rotate-270","rotate-90","rotate-by","shake","spin-pulse","spin-reverse","spin","stack-1x","stack-2x","stack","ul",rn.GROUP,rn.SWAP_OPACITY,rn.PRIMARY,rn.SECONDARY]).concat(tn.map((function(n){return"".concat(n,"x")}))).concat(an.map((function(n){return"w-".concat(n)}))),cn=A.FontAwesomeConfig||{};if(C&&"function"==typeof C.querySelector){[["data-family-prefix","familyPrefix"],["data-css-prefix","cssPrefix"],["data-family-default","familyDefault"],["data-style-default","styleDefault"],["data-replacement-class","replacementClass"],["data-auto-replace-svg","autoReplaceSvg"],["data-auto-add-css","autoAddCss"],["data-auto-a11y","autoA11y"],["data-search-pseudo-elements","searchPseudoElements"],["data-observe-mutations","observeMutations"],["data-mutate-approach","mutateApproach"],["data-keep-original-source","keepOriginalSource"],["data-measure-performance","measurePerformance"],["data-show-missing-icons","showMissingIcons"]].forEach((function(n){var t=c(n,2),a=t[0],e=t[1],r=function(n){return""===n||"false"!==n&&("true"===n||n)}(function(n){var t=C.querySelector("script["+n+"]");if(t)return t.getAttribute(n)}(a));null!=r&&(cn[e]=r)}))}var fn={styleDefault:"solid",familyDefault:"classic",cssPrefix:L,replacementClass:E,autoReplaceSvg:!0,autoAddCss:!0,autoA11y:!0,searchPseudoElements:!1,observeMutations:!0,mutateApproach:"async",keepOriginalSource:!0,measurePerformance:!1,showMissingIcons:!0};cn.familyPrefix&&(cn.cssPrefix=cn.familyPrefix);var ln=r(r({},fn),cn);ln.autoReplaceSvg||(ln.observeMutations=!1);var un={};Object.keys(fn).forEach((function(n){Object.defineProperty(un,n,{enumerable:!0,set:function(t){ln[n]=t,mn.forEach((function(n){return n(un)}))},get:function(){return ln[n]}})})),Object.defineProperty(un,"familyPrefix",{enumerable:!0,set:function(n){ln.cssPrefix=n,mn.forEach((function(n){return n(un)}))},get:function(){return ln.cssPrefix}}),A.FontAwesomeConfig=un;var mn=[];var dn=S,pn={size:16,x:0,y:0,rotate:0,flipX:!1,flipY:!1};var bn="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";function vn(){for(var n=12,t="";n-- >0;)t+=bn[62*Math.random()|0];return t}function gn(n){for(var t=[],a=(n||[]).length>>>0;a--;)t[a]=n[a];return t}function hn(n){return n.classList?gn(n.classList):(n.getAttribute("class")||"").split(" ").filter((function(n){return n}))}function yn(n){return"".concat(n).replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">")}function kn(n){return Object.keys(n||{}).reduce((function(t,a){return t+"".concat(a,": ").concat(n[a].trim(),";")}),"")}function wn(n){return n.size!==pn.size||n.x!==pn.x||n.y!==pn.y||n.rotate!==pn.rotate||n.flipX||n.flipY}var xn=':root, :host {\n --fa-font-solid: normal 900 1em/1 "Font Awesome 6 Solid";\n --fa-font-regular: normal 400 1em/1 "Font Awesome 6 Regular";\n --fa-font-light: normal 300 1em/1 "Font Awesome 6 Light";\n --fa-font-thin: normal 100 1em/1 "Font Awesome 6 Thin";\n --fa-font-duotone: normal 900 1em/1 "Font Awesome 6 Duotone";\n --fa-font-sharp-solid: normal 900 1em/1 "Font Awesome 6 Sharp";\n --fa-font-sharp-regular: normal 400 1em/1 "Font Awesome 6 Sharp";\n --fa-font-sharp-light: normal 300 1em/1 "Font Awesome 6 Sharp";\n --fa-font-sharp-thin: normal 100 1em/1 "Font Awesome 6 Sharp";\n --fa-font-brands: normal 400 1em/1 "Font Awesome 6 Brands";\n}\n\nsvg:not(:root).svg-inline--fa, svg:not(:host).svg-inline--fa {\n overflow: visible;\n box-sizing: content-box;\n}\n\n.svg-inline--fa {\n display: var(--fa-display, inline-block);\n height: 1em;\n overflow: visible;\n vertical-align: -0.125em;\n}\n.svg-inline--fa.fa-2xs {\n vertical-align: 0.1em;\n}\n.svg-inline--fa.fa-xs {\n vertical-align: 0em;\n}\n.svg-inline--fa.fa-sm {\n vertical-align: -0.0714285705em;\n}\n.svg-inline--fa.fa-lg {\n vertical-align: -0.2em;\n}\n.svg-inline--fa.fa-xl {\n vertical-align: -0.25em;\n}\n.svg-inline--fa.fa-2xl {\n vertical-align: -0.3125em;\n}\n.svg-inline--fa.fa-pull-left {\n margin-right: var(--fa-pull-margin, 0.3em);\n width: auto;\n}\n.svg-inline--fa.fa-pull-right {\n margin-left: var(--fa-pull-margin, 0.3em);\n width: auto;\n}\n.svg-inline--fa.fa-li {\n width: var(--fa-li-width, 2em);\n top: 0.25em;\n}\n.svg-inline--fa.fa-fw {\n width: var(--fa-fw-width, 1.25em);\n}\n\n.fa-layers svg.svg-inline--fa {\n bottom: 0;\n left: 0;\n margin: auto;\n position: absolute;\n right: 0;\n top: 0;\n}\n\n.fa-layers-counter, .fa-layers-text {\n display: inline-block;\n position: absolute;\n text-align: center;\n}\n\n.fa-layers {\n display: inline-block;\n height: 1em;\n position: relative;\n text-align: center;\n vertical-align: -0.125em;\n width: 1em;\n}\n.fa-layers svg.svg-inline--fa {\n -webkit-transform-origin: center center;\n transform-origin: center center;\n}\n\n.fa-layers-text {\n left: 50%;\n top: 50%;\n -webkit-transform: translate(-50%, -50%);\n transform: translate(-50%, -50%);\n -webkit-transform-origin: center center;\n transform-origin: center center;\n}\n\n.fa-layers-counter {\n background-color: var(--fa-counter-background-color, #ff253a);\n border-radius: var(--fa-counter-border-radius, 1em);\n box-sizing: border-box;\n color: var(--fa-inverse, #fff);\n line-height: var(--fa-counter-line-height, 1);\n max-width: var(--fa-counter-max-width, 5em);\n min-width: var(--fa-counter-min-width, 1.5em);\n overflow: hidden;\n padding: var(--fa-counter-padding, 0.25em 0.5em);\n right: var(--fa-right, 0);\n text-overflow: ellipsis;\n top: var(--fa-top, 0);\n -webkit-transform: scale(var(--fa-counter-scale, 0.25));\n transform: scale(var(--fa-counter-scale, 0.25));\n -webkit-transform-origin: top right;\n transform-origin: top right;\n}\n\n.fa-layers-bottom-right {\n bottom: var(--fa-bottom, 0);\n right: var(--fa-right, 0);\n top: auto;\n -webkit-transform: scale(var(--fa-layers-scale, 0.25));\n transform: scale(var(--fa-layers-scale, 0.25));\n -webkit-transform-origin: bottom right;\n transform-origin: bottom right;\n}\n\n.fa-layers-bottom-left {\n bottom: var(--fa-bottom, 0);\n left: var(--fa-left, 0);\n right: auto;\n top: auto;\n -webkit-transform: scale(var(--fa-layers-scale, 0.25));\n transform: scale(var(--fa-layers-scale, 0.25));\n -webkit-transform-origin: bottom left;\n transform-origin: bottom left;\n}\n\n.fa-layers-top-right {\n top: var(--fa-top, 0);\n right: var(--fa-right, 0);\n -webkit-transform: scale(var(--fa-layers-scale, 0.25));\n transform: scale(var(--fa-layers-scale, 0.25));\n -webkit-transform-origin: top right;\n transform-origin: top right;\n}\n\n.fa-layers-top-left {\n left: var(--fa-left, 0);\n right: auto;\n top: var(--fa-top, 0);\n -webkit-transform: scale(var(--fa-layers-scale, 0.25));\n transform: scale(var(--fa-layers-scale, 0.25));\n -webkit-transform-origin: top left;\n transform-origin: top left;\n}\n\n.fa-1x {\n font-size: 1em;\n}\n\n.fa-2x {\n font-size: 2em;\n}\n\n.fa-3x {\n font-size: 3em;\n}\n\n.fa-4x {\n font-size: 4em;\n}\n\n.fa-5x {\n font-size: 5em;\n}\n\n.fa-6x {\n font-size: 6em;\n}\n\n.fa-7x {\n font-size: 7em;\n}\n\n.fa-8x {\n font-size: 8em;\n}\n\n.fa-9x {\n font-size: 9em;\n}\n\n.fa-10x {\n font-size: 10em;\n}\n\n.fa-2xs {\n font-size: 0.625em;\n line-height: 0.1em;\n vertical-align: 0.225em;\n}\n\n.fa-xs {\n font-size: 0.75em;\n line-height: 0.0833333337em;\n vertical-align: 0.125em;\n}\n\n.fa-sm {\n font-size: 0.875em;\n line-height: 0.0714285718em;\n vertical-align: 0.0535714295em;\n}\n\n.fa-lg {\n font-size: 1.25em;\n line-height: 0.05em;\n vertical-align: -0.075em;\n}\n\n.fa-xl {\n font-size: 1.5em;\n line-height: 0.0416666682em;\n vertical-align: -0.125em;\n}\n\n.fa-2xl {\n font-size: 2em;\n line-height: 0.03125em;\n vertical-align: -0.1875em;\n}\n\n.fa-fw {\n text-align: center;\n width: 1.25em;\n}\n\n.fa-ul {\n list-style-type: none;\n margin-left: var(--fa-li-margin, 2.5em);\n padding-left: 0;\n}\n.fa-ul > li {\n position: relative;\n}\n\n.fa-li {\n left: calc(var(--fa-li-width, 2em) * -1);\n position: absolute;\n text-align: center;\n width: var(--fa-li-width, 2em);\n line-height: inherit;\n}\n\n.fa-border {\n border-color: var(--fa-border-color, #eee);\n border-radius: var(--fa-border-radius, 0.1em);\n border-style: var(--fa-border-style, solid);\n border-width: var(--fa-border-width, 0.08em);\n padding: var(--fa-border-padding, 0.2em 0.25em 0.15em);\n}\n\n.fa-pull-left {\n float: left;\n margin-right: var(--fa-pull-margin, 0.3em);\n}\n\n.fa-pull-right {\n float: right;\n margin-left: var(--fa-pull-margin, 0.3em);\n}\n\n.fa-beat {\n -webkit-animation-name: fa-beat;\n animation-name: fa-beat;\n -webkit-animation-delay: var(--fa-animation-delay, 0s);\n animation-delay: var(--fa-animation-delay, 0s);\n -webkit-animation-direction: var(--fa-animation-direction, normal);\n animation-direction: var(--fa-animation-direction, normal);\n -webkit-animation-duration: var(--fa-animation-duration, 1s);\n animation-duration: var(--fa-animation-duration, 1s);\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n}\n\n.fa-bounce {\n -webkit-animation-name: fa-bounce;\n animation-name: fa-bounce;\n -webkit-animation-delay: var(--fa-animation-delay, 0s);\n animation-delay: var(--fa-animation-delay, 0s);\n -webkit-animation-direction: var(--fa-animation-direction, normal);\n animation-direction: var(--fa-animation-direction, normal);\n -webkit-animation-duration: var(--fa-animation-duration, 1s);\n animation-duration: var(--fa-animation-duration, 1s);\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1));\n animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1));\n}\n\n.fa-fade {\n -webkit-animation-name: fa-fade;\n animation-name: fa-fade;\n -webkit-animation-delay: var(--fa-animation-delay, 0s);\n animation-delay: var(--fa-animation-delay, 0s);\n -webkit-animation-direction: var(--fa-animation-direction, normal);\n animation-direction: var(--fa-animation-direction, normal);\n -webkit-animation-duration: var(--fa-animation-duration, 1s);\n animation-duration: var(--fa-animation-duration, 1s);\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));\n animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));\n}\n\n.fa-beat-fade {\n -webkit-animation-name: fa-beat-fade;\n animation-name: fa-beat-fade;\n -webkit-animation-delay: var(--fa-animation-delay, 0s);\n animation-delay: var(--fa-animation-delay, 0s);\n -webkit-animation-direction: var(--fa-animation-direction, normal);\n animation-direction: var(--fa-animation-direction, normal);\n -webkit-animation-duration: var(--fa-animation-duration, 1s);\n animation-duration: var(--fa-animation-duration, 1s);\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));\n animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));\n}\n\n.fa-flip {\n -webkit-animation-name: fa-flip;\n animation-name: fa-flip;\n -webkit-animation-delay: var(--fa-animation-delay, 0s);\n animation-delay: var(--fa-animation-delay, 0s);\n -webkit-animation-direction: var(--fa-animation-direction, normal);\n animation-direction: var(--fa-animation-direction, normal);\n -webkit-animation-duration: var(--fa-animation-duration, 1s);\n animation-duration: var(--fa-animation-duration, 1s);\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n}\n\n.fa-shake {\n -webkit-animation-name: fa-shake;\n animation-name: fa-shake;\n -webkit-animation-delay: var(--fa-animation-delay, 0s);\n animation-delay: var(--fa-animation-delay, 0s);\n -webkit-animation-direction: var(--fa-animation-direction, normal);\n animation-direction: var(--fa-animation-direction, normal);\n -webkit-animation-duration: var(--fa-animation-duration, 1s);\n animation-duration: var(--fa-animation-duration, 1s);\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n -webkit-animation-timing-function: var(--fa-animation-timing, linear);\n animation-timing-function: var(--fa-animation-timing, linear);\n}\n\n.fa-spin {\n -webkit-animation-name: fa-spin;\n animation-name: fa-spin;\n -webkit-animation-delay: var(--fa-animation-delay, 0s);\n animation-delay: var(--fa-animation-delay, 0s);\n -webkit-animation-direction: var(--fa-animation-direction, normal);\n animation-direction: var(--fa-animation-direction, normal);\n -webkit-animation-duration: var(--fa-animation-duration, 2s);\n animation-duration: var(--fa-animation-duration, 2s);\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n -webkit-animation-timing-function: var(--fa-animation-timing, linear);\n animation-timing-function: var(--fa-animation-timing, linear);\n}\n\n.fa-spin-reverse {\n --fa-animation-direction: reverse;\n}\n\n.fa-pulse,\n.fa-spin-pulse {\n -webkit-animation-name: fa-spin;\n animation-name: fa-spin;\n -webkit-animation-direction: var(--fa-animation-direction, normal);\n animation-direction: var(--fa-animation-direction, normal);\n -webkit-animation-duration: var(--fa-animation-duration, 1s);\n animation-duration: var(--fa-animation-duration, 1s);\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n -webkit-animation-timing-function: var(--fa-animation-timing, steps(8));\n animation-timing-function: var(--fa-animation-timing, steps(8));\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fa-beat,\n.fa-bounce,\n.fa-fade,\n.fa-beat-fade,\n.fa-flip,\n.fa-pulse,\n.fa-shake,\n.fa-spin,\n.fa-spin-pulse {\n -webkit-animation-delay: -1ms;\n animation-delay: -1ms;\n -webkit-animation-duration: 1ms;\n animation-duration: 1ms;\n -webkit-animation-iteration-count: 1;\n animation-iteration-count: 1;\n -webkit-transition-delay: 0s;\n transition-delay: 0s;\n -webkit-transition-duration: 0s;\n transition-duration: 0s;\n }\n}\n@-webkit-keyframes fa-beat {\n 0%, 90% {\n -webkit-transform: scale(1);\n transform: scale(1);\n }\n 45% {\n -webkit-transform: scale(var(--fa-beat-scale, 1.25));\n transform: scale(var(--fa-beat-scale, 1.25));\n }\n}\n@keyframes fa-beat {\n 0%, 90% {\n -webkit-transform: scale(1);\n transform: scale(1);\n }\n 45% {\n -webkit-transform: scale(var(--fa-beat-scale, 1.25));\n transform: scale(var(--fa-beat-scale, 1.25));\n }\n}\n@-webkit-keyframes fa-bounce {\n 0% {\n -webkit-transform: scale(1, 1) translateY(0);\n transform: scale(1, 1) translateY(0);\n }\n 10% {\n -webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);\n transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);\n }\n 30% {\n -webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));\n transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));\n }\n 50% {\n -webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);\n transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);\n }\n 57% {\n -webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));\n transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));\n }\n 64% {\n -webkit-transform: scale(1, 1) translateY(0);\n transform: scale(1, 1) translateY(0);\n }\n 100% {\n -webkit-transform: scale(1, 1) translateY(0);\n transform: scale(1, 1) translateY(0);\n }\n}\n@keyframes fa-bounce {\n 0% {\n -webkit-transform: scale(1, 1) translateY(0);\n transform: scale(1, 1) translateY(0);\n }\n 10% {\n -webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);\n transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);\n }\n 30% {\n -webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));\n transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));\n }\n 50% {\n -webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);\n transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);\n }\n 57% {\n -webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));\n transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));\n }\n 64% {\n -webkit-transform: scale(1, 1) translateY(0);\n transform: scale(1, 1) translateY(0);\n }\n 100% {\n -webkit-transform: scale(1, 1) translateY(0);\n transform: scale(1, 1) translateY(0);\n }\n}\n@-webkit-keyframes fa-fade {\n 50% {\n opacity: var(--fa-fade-opacity, 0.4);\n }\n}\n@keyframes fa-fade {\n 50% {\n opacity: var(--fa-fade-opacity, 0.4);\n }\n}\n@-webkit-keyframes fa-beat-fade {\n 0%, 100% {\n opacity: var(--fa-beat-fade-opacity, 0.4);\n -webkit-transform: scale(1);\n transform: scale(1);\n }\n 50% {\n opacity: 1;\n -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125));\n transform: scale(var(--fa-beat-fade-scale, 1.125));\n }\n}\n@keyframes fa-beat-fade {\n 0%, 100% {\n opacity: var(--fa-beat-fade-opacity, 0.4);\n -webkit-transform: scale(1);\n transform: scale(1);\n }\n 50% {\n opacity: 1;\n -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125));\n transform: scale(var(--fa-beat-fade-scale, 1.125));\n }\n}\n@-webkit-keyframes fa-flip {\n 50% {\n -webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));\n transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));\n }\n}\n@keyframes fa-flip {\n 50% {\n -webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));\n transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));\n }\n}\n@-webkit-keyframes fa-shake {\n 0% {\n -webkit-transform: rotate(-15deg);\n transform: rotate(-15deg);\n }\n 4% {\n -webkit-transform: rotate(15deg);\n transform: rotate(15deg);\n }\n 8%, 24% {\n -webkit-transform: rotate(-18deg);\n transform: rotate(-18deg);\n }\n 12%, 28% {\n -webkit-transform: rotate(18deg);\n transform: rotate(18deg);\n }\n 16% {\n -webkit-transform: rotate(-22deg);\n transform: rotate(-22deg);\n }\n 20% {\n -webkit-transform: rotate(22deg);\n transform: rotate(22deg);\n }\n 32% {\n -webkit-transform: rotate(-12deg);\n transform: rotate(-12deg);\n }\n 36% {\n -webkit-transform: rotate(12deg);\n transform: rotate(12deg);\n }\n 40%, 100% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n}\n@keyframes fa-shake {\n 0% {\n -webkit-transform: rotate(-15deg);\n transform: rotate(-15deg);\n }\n 4% {\n -webkit-transform: rotate(15deg);\n transform: rotate(15deg);\n }\n 8%, 24% {\n -webkit-transform: rotate(-18deg);\n transform: rotate(-18deg);\n }\n 12%, 28% {\n -webkit-transform: rotate(18deg);\n transform: rotate(18deg);\n }\n 16% {\n -webkit-transform: rotate(-22deg);\n transform: rotate(-22deg);\n }\n 20% {\n -webkit-transform: rotate(22deg);\n transform: rotate(22deg);\n }\n 32% {\n -webkit-transform: rotate(-12deg);\n transform: rotate(-12deg);\n }\n 36% {\n -webkit-transform: rotate(12deg);\n transform: rotate(12deg);\n }\n 40%, 100% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n}\n@-webkit-keyframes fa-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n@keyframes fa-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n.fa-rotate-90 {\n -webkit-transform: rotate(90deg);\n transform: rotate(90deg);\n}\n\n.fa-rotate-180 {\n -webkit-transform: rotate(180deg);\n transform: rotate(180deg);\n}\n\n.fa-rotate-270 {\n -webkit-transform: rotate(270deg);\n transform: rotate(270deg);\n}\n\n.fa-flip-horizontal {\n -webkit-transform: scale(-1, 1);\n transform: scale(-1, 1);\n}\n\n.fa-flip-vertical {\n -webkit-transform: scale(1, -1);\n transform: scale(1, -1);\n}\n\n.fa-flip-both,\n.fa-flip-horizontal.fa-flip-vertical {\n -webkit-transform: scale(-1, -1);\n transform: scale(-1, -1);\n}\n\n.fa-rotate-by {\n -webkit-transform: rotate(var(--fa-rotate-angle, none));\n transform: rotate(var(--fa-rotate-angle, none));\n}\n\n.fa-stack {\n display: inline-block;\n vertical-align: middle;\n height: 2em;\n position: relative;\n width: 2.5em;\n}\n\n.fa-stack-1x,\n.fa-stack-2x {\n bottom: 0;\n left: 0;\n margin: auto;\n position: absolute;\n right: 0;\n top: 0;\n z-index: var(--fa-stack-z-index, auto);\n}\n\n.svg-inline--fa.fa-stack-1x {\n height: 1em;\n width: 1.25em;\n}\n.svg-inline--fa.fa-stack-2x {\n height: 2em;\n width: 2.5em;\n}\n\n.fa-inverse {\n color: var(--fa-inverse, #fff);\n}\n\n.sr-only,\n.fa-sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n.sr-only-focusable:not(:focus),\n.fa-sr-only-focusable:not(:focus) {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n.svg-inline--fa .fa-primary {\n fill: var(--fa-primary-color, currentColor);\n opacity: var(--fa-primary-opacity, 1);\n}\n\n.svg-inline--fa .fa-secondary {\n fill: var(--fa-secondary-color, currentColor);\n opacity: var(--fa-secondary-opacity, 0.4);\n}\n\n.svg-inline--fa.fa-swap-opacity .fa-primary {\n opacity: var(--fa-secondary-opacity, 0.4);\n}\n\n.svg-inline--fa.fa-swap-opacity .fa-secondary {\n opacity: var(--fa-primary-opacity, 1);\n}\n\n.svg-inline--fa mask .fa-primary,\n.svg-inline--fa mask .fa-secondary {\n fill: black;\n}\n\n.fad.fa-inverse,\n.fa-duotone.fa-inverse {\n color: var(--fa-inverse, #fff);\n}';function On(){var n=L,t=E,a=un.cssPrefix,e=un.replacementClass,r=xn;if(a!==n||e!==t){var i=new RegExp("\\.".concat(n,"\\-"),"g"),o=new RegExp("\\--".concat(n,"\\-"),"g"),s=new RegExp("\\.".concat(t),"g");r=r.replace(i,".".concat(a,"-")).replace(o,"--".concat(a,"-")).replace(s,".".concat(e))}return r}var An=!1;function Cn(){un.autoAddCss&&!An&&(!function(n){if(n&&P){var t=C.createElement("style");t.setAttribute("type","text/css"),t.innerHTML=n;for(var a=C.head.childNodes,e=null,r=a.length-1;r>-1;r--){var i=a[r],o=(i.tagName||"").toUpperCase();["STYLE","LINK"].indexOf(o)>-1&&(e=i)}C.head.insertBefore(t,e)}}(On()),An=!0)}var zn={mixout:function(){return{dom:{css:On,insertCss:Cn}}},hooks:function(){return{beforeDOMElementCreation:function(){Cn()},beforeI2svg:function(){Cn()}}}},Nn=A||{};Nn[M]||(Nn[M]={}),Nn[M].styles||(Nn[M].styles={}),Nn[M].hooks||(Nn[M].hooks={}),Nn[M].shims||(Nn[M].shims=[]);var Pn=Nn[M],jn=[],Mn=!1;function Sn(n){var t=n.tag,a=n.attributes,e=void 0===a?{}:a,r=n.children,i=void 0===r?[]:r;return"string"==typeof n?yn(n):"<".concat(t," ").concat(function(n){return Object.keys(n||{}).reduce((function(t,a){return t+"".concat(a,'="').concat(yn(n[a]),'" ')}),"").trim()}(e),">").concat(i.map(Sn).join(""),"</").concat(t,">")}function Ln(n,t,a){if(n&&n[t]&&n[t][a])return{prefix:t,iconName:a,icon:n[t][a]}}P&&((Mn=(C.documentElement.doScroll?/^loaded|^c/:/^loaded|^i|^c/).test(C.readyState))||C.addEventListener("DOMContentLoaded",(function n(){C.removeEventListener("DOMContentLoaded",n),Mn=1,jn.map((function(n){return n()}))})));var En=function(n,t,a,e){var r,i,o,s=Object.keys(n),c=s.length,f=void 0!==e?function(n,t){return function(a,e,r,i){return n.call(t,a,e,r,i)}}(t,e):t;for(void 0===a?(r=1,o=n[s[0]]):(r=0,o=a);r<c;r++)o=f(o,n[i=s[r]],i,n);return o};function In(n){var t=function(n){for(var t=[],a=0,e=n.length;a<e;){var r=n.charCodeAt(a++);if(r>=55296&&r<=56319&&a<e){var i=n.charCodeAt(a++);56320==(64512&i)?t.push(((1023&r)<<10)+(1023&i)+65536):(t.push(r),a--)}else t.push(r)}return t}(n);return 1===t.length?t[0].toString(16):null}function Rn(n){return Object.keys(n).reduce((function(t,a){var e=n[a];return!!e.icon?t[e.iconName]=e.icon:t[a]=e,t}),{})}function Yn(n,t){var a=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).skipHooks,e=void 0!==a&&a,i=Rn(t);"function"!=typeof Pn.hooks.addPack||e?Pn.styles[n]=r(r({},Pn.styles[n]||{}),i):Pn.hooks.addPack(n,Rn(t)),"fas"===n&&Yn("fa",t)}var Tn,Dn,Hn,Fn=Pn.styles,Vn=Pn.shims,Wn=(s(Tn={},U,Object.values(G[U])),s(Tn,_,Object.values(G[_])),Tn),Un=null,_n={},Kn={},Bn={},Xn={},qn={},Gn=(s(Dn={},U,Object.keys(X[U])),s(Dn,_,Object.keys(X[_])),Dn);function $n(n,t){var a,e=t.split("-"),r=e[0],i=e.slice(1).join("-");return r!==n||""===i||(a=i,~sn.indexOf(a))?null:i}var Jn,Qn=function(){var n=function(n){return En(Fn,(function(t,a,e){return t[e]=En(a,n,{}),t}),{})};_n=n((function(n,t,a){(t[3]&&(n[t[3]]=a),t[2])&&t[2].filter((function(n){return"number"==typeof n})).forEach((function(t){n[t.toString(16)]=a}));return n})),Kn=n((function(n,t,a){(n[a]=a,t[2])&&t[2].filter((function(n){return"string"==typeof n})).forEach((function(t){n[t]=a}));return n})),qn=n((function(n,t,a){var e=t[2];return n[a]=a,e.forEach((function(t){n[t]=a})),n}));var t="far"in Fn||un.autoFetchSvg,a=En(Vn,(function(n,a){var e=a[0],r=a[1],i=a[2];return"far"!==r||t||(r="fas"),"string"==typeof e&&(n.names[e]={prefix:r,iconName:i}),"number"==typeof e&&(n.unicodes[e.toString(16)]={prefix:r,iconName:i}),n}),{names:{},unicodes:{}});Bn=a.names,Xn=a.unicodes,Un=rt(un.styleDefault,{family:un.familyDefault})};function Zn(n,t){return(_n[n]||{})[t]}function nt(n,t){return(qn[n]||{})[t]}function tt(n){return Bn[n]||{prefix:null,iconName:null}}function at(){return Un}Jn=function(n){Un=rt(n.styleDefault,{family:un.familyDefault})},mn.push(Jn),Qn();var et=function(){return{prefix:null,iconName:null,rest:[]}};function rt(n){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).family,a=void 0===t?U:t,e=X[a][n],r=q[a][n]||q[a][e],i=n in Pn.styles?n:null;return r||i||null}var it=(s(Hn={},U,Object.keys(G[U])),s(Hn,_,Object.keys(G[_])),Hn);function ot(n){var t,a=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).skipLookups,e=void 0!==a&&a,r=(s(t={},U,"".concat(un.cssPrefix,"-").concat(U)),s(t,_,"".concat(un.cssPrefix,"-").concat(_)),t),i=null,o=U;(n.includes(r[U])||n.some((function(n){return it[U].includes(n)})))&&(o=U),(n.includes(r[_])||n.some((function(n){return it[_].includes(n)})))&&(o=_);var c=n.reduce((function(n,t){var a=$n(un.cssPrefix,t);if(Fn[t]?(t=Wn[o].includes(t)?$[o][t]:t,i=t,n.prefix=t):Gn[o].indexOf(t)>-1?(i=t,n.prefix=rt(t,{family:o})):a?n.iconName=a:t!==un.replacementClass&&t!==r[U]&&t!==r[_]&&n.rest.push(t),!e&&n.prefix&&n.iconName){var s="fa"===i?tt(n.iconName):{},c=nt(n.prefix,n.iconName);s.prefix&&(i=null),n.iconName=s.iconName||c||n.iconName,n.prefix=s.prefix||n.prefix,"far"!==n.prefix||Fn.far||!Fn.fas||un.autoFetchSvg||(n.prefix="fas")}return n}),et());return(n.includes("fa-brands")||n.includes("fab"))&&(c.prefix="fab"),(n.includes("fa-duotone")||n.includes("fad"))&&(c.prefix="fad"),c.prefix||o!==_||!Fn.fass&&!un.autoFetchSvg||(c.prefix="fass",c.iconName=nt(c.prefix,c.iconName)||c.iconName),"fa"!==c.prefix&&"fa"!==i||(c.prefix=at()||"fas"),c}var st=function(){function n(){!function(n,t){if(!(n instanceof t))throw new TypeError("Cannot call a class as a function")}(this,n),this.definitions={}}var t,a,e;return t=n,a=[{key:"add",value:function(){for(var n=this,t=arguments.length,a=new Array(t),e=0;e<t;e++)a[e]=arguments[e];var i=a.reduce(this._pullDefinitions,{});Object.keys(i).forEach((function(t){n.definitions[t]=r(r({},n.definitions[t]||{}),i[t]),Yn(t,i[t]);var a=G[U][t];a&&Yn(a,i[t]),Qn()}))}},{key:"reset",value:function(){this.definitions={}}},{key:"_pullDefinitions",value:function(n,t){var a=t.prefix&&t.iconName&&t.icon?{0:t}:t;return Object.keys(a).map((function(t){var e=a[t],r=e.prefix,i=e.iconName,o=e.icon,s=o[2];n[r]||(n[r]={}),s.length>0&&s.forEach((function(t){"string"==typeof t&&(n[r][t]=o)})),n[r][i]=o})),n}}],a&&o(t.prototype,a),e&&o(t,e),Object.defineProperty(t,"prototype",{writable:!1}),n}(),ct=[],ft={},lt={},ut=Object.keys(lt);function mt(n,t){for(var a=arguments.length,e=new Array(a>2?a-2:0),r=2;r<a;r++)e[r-2]=arguments[r];return(ft[n]||[]).forEach((function(n){t=n.apply(null,[t].concat(e))})),t}function dt(n){for(var t=arguments.length,a=new Array(t>1?t-1:0),e=1;e<t;e++)a[e-1]=arguments[e];(ft[n]||[]).forEach((function(n){n.apply(null,a)}))}function pt(){var n=arguments[0],t=Array.prototype.slice.call(arguments,1);return lt[n]?lt[n].apply(null,t):void 0}function bt(n){"fa"===n.prefix&&(n.prefix="fas");var t=n.iconName,a=n.prefix||at();if(t)return t=nt(a,t)||t,Ln(vt.definitions,a,t)||Ln(Pn.styles,a,t)}var vt=new st,gt={i2svg:function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return P?(dt("beforeI2svg",n),pt("pseudoElements2svg",n),pt("i2svg",n)):Promise.reject("Operation requires a DOM of some kind.")},watch:function(){var n,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},a=t.autoReplaceSvgRoot;!1===un.autoReplaceSvg&&(un.autoReplaceSvg=!0),un.observeMutations=!0,n=function(){yt({autoReplaceSvgRoot:a}),dt("watch",t)},P&&(Mn?setTimeout(n,0):jn.push(n))}},ht={noAuto:function(){un.autoReplaceSvg=!1,un.observeMutations=!1,dt("noAuto")},config:un,dom:gt,parse:{icon:function(n){if(null===n)return null;if("object"===i(n)&&n.prefix&&n.iconName)return{prefix:n.prefix,iconName:nt(n.prefix,n.iconName)||n.iconName};if(Array.isArray(n)&&2===n.length){var t=0===n[1].indexOf("fa-")?n[1].slice(3):n[1],a=rt(n[0]);return{prefix:a,iconName:nt(a,t)||t}}if("string"==typeof n&&(n.indexOf("".concat(un.cssPrefix,"-"))>-1||n.match(J))){var e=ot(n.split(" "),{skipLookups:!0});return{prefix:e.prefix||at(),iconName:nt(e.prefix,e.iconName)||e.iconName}}if("string"==typeof n){var r=at();return{prefix:r,iconName:nt(r,n)||n}}}},library:vt,findIconDefinition:bt,toHtml:Sn},yt=function(){var n=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}).autoReplaceSvgRoot,t=void 0===n?C:n;(Object.keys(Pn.styles).length>0||un.autoFetchSvg)&&P&&un.autoReplaceSvg&&ht.dom.i2svg({node:t})};function kt(n,t){return Object.defineProperty(n,"abstract",{get:t}),Object.defineProperty(n,"html",{get:function(){return n.abstract.map((function(n){return Sn(n)}))}}),Object.defineProperty(n,"node",{get:function(){if(P){var t=C.createElement("div");return t.innerHTML=n.html,t.children}}}),n}function wt(n){var t=n.icons,a=t.main,e=t.mask,i=n.prefix,o=n.iconName,s=n.transform,c=n.symbol,f=n.title,l=n.maskId,u=n.titleId,m=n.extra,d=n.watchable,p=void 0!==d&&d,b=e.found?e:a,v=b.width,g=b.height,h="fak"===i,y=[un.replacementClass,o?"".concat(un.cssPrefix,"-").concat(o):""].filter((function(n){return-1===m.classes.indexOf(n)})).filter((function(n){return""!==n||!!n})).concat(m.classes).join(" "),k={children:[],attributes:r(r({},m.attributes),{},{"data-prefix":i,"data-icon":o,class:y,role:m.attributes.role||"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 ".concat(v," ").concat(g)})},w=h&&!~m.classes.indexOf("fa-fw")?{width:"".concat(v/g*16*.0625,"em")}:{};p&&(k.attributes[I]=""),f&&(k.children.push({tag:"title",attributes:{id:k.attributes["aria-labelledby"]||"title-".concat(u||vn())},children:[f]}),delete k.attributes.title);var x=r(r({},k),{},{prefix:i,iconName:o,main:a,mask:e,maskId:l,transform:s,symbol:c,styles:r(r({},w),m.styles)}),O=e.found&&a.found?pt("generateAbstractMask",x)||{children:[],attributes:{}}:pt("generateAbstractIcon",x)||{children:[],attributes:{}},A=O.children,C=O.attributes;return x.children=A,x.attributes=C,c?function(n){var t=n.prefix,a=n.iconName,e=n.children,i=n.attributes,o=n.symbol,s=!0===o?"".concat(t,"-").concat(un.cssPrefix,"-").concat(a):o;return[{tag:"svg",attributes:{style:"display: none;"},children:[{tag:"symbol",attributes:r(r({},i),{},{id:s}),children:e}]}]}(x):function(n){var t=n.children,a=n.main,e=n.mask,i=n.attributes,o=n.styles,s=n.transform;if(wn(s)&&a.found&&!e.found){var c={x:a.width/a.height/2,y:.5};i.style=kn(r(r({},o),{},{"transform-origin":"".concat(c.x+s.x/16,"em ").concat(c.y+s.y/16,"em")}))}return[{tag:"svg",attributes:i,children:t}]}(x)}function xt(n){var t=n.content,a=n.width,e=n.height,i=n.transform,o=n.title,s=n.extra,c=n.watchable,f=void 0!==c&&c,l=r(r(r({},s.attributes),o?{title:o}:{}),{},{class:s.classes.join(" ")});f&&(l[I]="");var u=r({},s.styles);wn(i)&&(u.transform=function(n){var t=n.transform,a=n.width,e=void 0===a?S:a,r=n.height,i=void 0===r?S:r,o=n.startCentered,s=void 0!==o&&o,c="";return c+=s&&j?"translate(".concat(t.x/dn-e/2,"em, ").concat(t.y/dn-i/2,"em) "):s?"translate(calc(-50% + ".concat(t.x/dn,"em), calc(-50% + ").concat(t.y/dn,"em)) "):"translate(".concat(t.x/dn,"em, ").concat(t.y/dn,"em) "),c+="scale(".concat(t.size/dn*(t.flipX?-1:1),", ").concat(t.size/dn*(t.flipY?-1:1),") "),c+"rotate(".concat(t.rotate,"deg) ")}({transform:i,startCentered:!0,width:a,height:e}),u["-webkit-transform"]=u.transform);var m=kn(u);m.length>0&&(l.style=m);var d=[];return d.push({tag:"span",attributes:l,children:[t]}),o&&d.push({tag:"span",attributes:{class:"sr-only"},children:[o]}),d}var Ot=Pn.styles;function At(n){var t=n[0],a=n[1],e=c(n.slice(4),1)[0];return{found:!0,width:t,height:a,icon:Array.isArray(e)?{tag:"g",attributes:{class:"".concat(un.cssPrefix,"-").concat(rn.GROUP)},children:[{tag:"path",attributes:{class:"".concat(un.cssPrefix,"-").concat(rn.SECONDARY),fill:"currentColor",d:e[0]}},{tag:"path",attributes:{class:"".concat(un.cssPrefix,"-").concat(rn.PRIMARY),fill:"currentColor",d:e[1]}}]}:{tag:"path",attributes:{fill:"currentColor",d:e}}}}var Ct={found:!1,width:512,height:512};function zt(n,t){var a=t;return"fa"===t&&null!==un.styleDefault&&(t=at()),new Promise((function(e,i){pt("missingIconAbstract");if("fa"===a){var o=tt(n)||{};n=o.iconName||n,t=o.prefix||t}if(n&&t&&Ot[t]&&Ot[t][n])return e(At(Ot[t][n]));!function(n,t){W||un.showMissingIcons||!n||console.error('Icon with name "'.concat(n,'" and prefix "').concat(t,'" is missing.'))}(n,t),e(r(r({},Ct),{},{icon:un.showMissingIcons&&n&&pt("missingIconAbstract")||{}}))}))}var Nt=function(){},Pt=un.measurePerformance&&N&&N.mark&&N.measure?N:{mark:Nt,measure:Nt},jt='FA "6.5.1"',Mt=function(n){Pt.mark("".concat(jt," ").concat(n," ends")),Pt.measure("".concat(jt," ").concat(n),"".concat(jt," ").concat(n," begins"),"".concat(jt," ").concat(n," ends"))},St={begin:function(n){return Pt.mark("".concat(jt," ").concat(n," begins")),function(){return Mt(n)}},end:Mt},Lt=function(){};function Et(n){return"string"==typeof(n.getAttribute?n.getAttribute(I):null)}function It(n){return C.createElementNS("http://www.w3.org/2000/svg",n)}function Rt(n){return C.createElement(n)}function Yt(n){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).ceFn,a=void 0===t?"svg"===n.tag?It:Rt:t;if("string"==typeof n)return C.createTextNode(n);var e=a(n.tag);return Object.keys(n.attributes||[]).forEach((function(t){e.setAttribute(t,n.attributes[t])})),(n.children||[]).forEach((function(n){e.appendChild(Yt(n,{ceFn:a}))})),e}var Tt={replace:function(n){var t=n[0];if(t.parentNode)if(n[1].forEach((function(n){t.parentNode.insertBefore(Yt(n),t)})),null===t.getAttribute(I)&&un.keepOriginalSource){var a=C.createComment(function(n){var t=" ".concat(n.outerHTML," ");return"".concat(t,"Font Awesome fontawesome.com ")}(t));t.parentNode.replaceChild(a,t)}else t.remove()},nest:function(n){var t=n[0],a=n[1];if(~hn(t).indexOf(un.replacementClass))return Tt.replace(n);var e=new RegExp("".concat(un.cssPrefix,"-.*"));if(delete a[0].attributes.id,a[0].attributes.class){var r=a[0].attributes.class.split(" ").reduce((function(n,t){return t===un.replacementClass||t.match(e)?n.toSvg.push(t):n.toNode.push(t),n}),{toNode:[],toSvg:[]});a[0].attributes.class=r.toSvg.join(" "),0===r.toNode.length?t.removeAttribute("class"):t.setAttribute("class",r.toNode.join(" "))}var i=a.map((function(n){return Sn(n)})).join("\n");t.setAttribute(I,""),t.innerHTML=i}};function Dt(n){n()}function Ht(n,t){var a="function"==typeof t?t:Lt;if(0===n.length)a();else{var e=Dt;un.mutateApproach===F&&(e=A.requestAnimationFrame||Dt),e((function(){var t=!0===un.autoReplaceSvg?Tt.replace:Tt[un.autoReplaceSvg]||Tt.replace,e=St.begin("mutate");n.map(t),e(),a()}))}}var Ft=!1;function Vt(){Ft=!0}function Wt(){Ft=!1}var Ut=null;function _t(n){if(z&&un.observeMutations){var t=n.treeCallback,a=void 0===t?Lt:t,e=n.nodeCallback,r=void 0===e?Lt:e,i=n.pseudoElementsCallback,o=void 0===i?Lt:i,s=n.observeMutationsRoot,c=void 0===s?C:s;Ut=new z((function(n){if(!Ft){var t=at();gn(n).forEach((function(n){if("childList"===n.type&&n.addedNodes.length>0&&!Et(n.addedNodes[0])&&(un.searchPseudoElements&&o(n.target),a(n.target)),"attributes"===n.type&&n.target.parentNode&&un.searchPseudoElements&&o(n.target.parentNode),"attributes"===n.type&&Et(n.target)&&~en.indexOf(n.attributeName))if("class"===n.attributeName&&function(n){var t=n.getAttribute?n.getAttribute(T):null,a=n.getAttribute?n.getAttribute(D):null;return t&&a}(n.target)){var e=ot(hn(n.target)),i=e.prefix,s=e.iconName;n.target.setAttribute(T,i||t),s&&n.target.setAttribute(D,s)}else(c=n.target)&&c.classList&&c.classList.contains&&c.classList.contains(un.replacementClass)&&r(n.target);var c}))}})),P&&Ut.observe(c,{childList:!0,attributes:!0,characterData:!0,subtree:!0})}}function Kt(n){var t,a,e=n.getAttribute("data-prefix"),r=n.getAttribute("data-icon"),i=void 0!==n.innerText?n.innerText.trim():"",o=ot(hn(n));return o.prefix||(o.prefix=at()),e&&r&&(o.prefix=e,o.iconName=r),o.iconName&&o.prefix||(o.prefix&&i.length>0&&(o.iconName=(t=o.prefix,a=n.innerText,(Kn[t]||{})[a]||Zn(o.prefix,In(n.innerText)))),!o.iconName&&un.autoFetchSvg&&n.firstChild&&n.firstChild.nodeType===Node.TEXT_NODE&&(o.iconName=n.firstChild.data)),o}function Bt(n){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{styleParser:!0},a=Kt(n),e=a.iconName,i=a.prefix,o=a.rest,s=function(n){var t=gn(n.attributes).reduce((function(n,t){return"class"!==n.name&&"style"!==n.name&&(n[t.name]=t.value),n}),{}),a=n.getAttribute("title"),e=n.getAttribute("data-fa-title-id");return un.autoA11y&&(a?t["aria-labelledby"]="".concat(un.replacementClass,"-title-").concat(e||vn()):(t["aria-hidden"]="true",t.focusable="false")),t}(n),c=mt("parseNodeAttributes",{},n),f=t.styleParser?function(n){var t=n.getAttribute("style"),a=[];return t&&(a=t.split(";").reduce((function(n,t){var a=t.split(":"),e=a[0],r=a.slice(1);return e&&r.length>0&&(n[e]=r.join(":").trim()),n}),{})),a}(n):[];return r({iconName:e,title:n.getAttribute("title"),titleId:n.getAttribute("data-fa-title-id"),prefix:i,transform:pn,mask:{iconName:null,prefix:null,rest:[]},maskId:null,symbol:!1,extra:{classes:o,styles:f,attributes:s}},c)}var Xt=Pn.styles;function qt(n){var t="nest"===un.autoReplaceSvg?Bt(n,{styleParser:!1}):Bt(n);return~t.extra.classes.indexOf(Q)?pt("generateLayersText",n,t):pt("generateSvgReplacementMutation",n,t)}var Gt=new Set;function $t(n){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(!P)return Promise.resolve();var a=C.documentElement.classList,e=function(n){return a.add("".concat(H,"-").concat(n))},r=function(n){return a.remove("".concat(H,"-").concat(n))},i=un.autoFetchSvg?Gt:K.map((function(n){return"fa-".concat(n)})).concat(Object.keys(Xt));i.includes("fa")||i.push("fa");var o=[".".concat(Q,":not([").concat(I,"])")].concat(i.map((function(n){return".".concat(n,":not([").concat(I,"])")}))).join(", ");if(0===o.length)return Promise.resolve();var s=[];try{s=gn(n.querySelectorAll(o))}catch(ya){}if(!(s.length>0))return Promise.resolve();e("pending"),r("complete");var c=St.begin("onTree"),f=s.reduce((function(n,t){try{var a=qt(t);a&&n.push(a)}catch(ya){W||"MissingIcon"===ya.name&&console.error(ya)}return n}),[]);return new Promise((function(n,a){Promise.all(f).then((function(a){Ht(a,(function(){e("active"),e("complete"),r("pending"),"function"==typeof t&&t(),c(),n()}))})).catch((function(n){c(),a(n)}))}))}function Jt(n){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;qt(n).then((function(n){n&&Ht([n],t)}))}K.map((function(n){Gt.add("fa-".concat(n))})),Object.keys(X[U]).map(Gt.add.bind(Gt)),Object.keys(X[_]).map(Gt.add.bind(Gt)),Gt=f(Gt);var Qt=function(n){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=t.transform,e=void 0===a?pn:a,i=t.symbol,o=void 0!==i&&i,s=t.mask,c=void 0===s?null:s,f=t.maskId,l=void 0===f?null:f,u=t.title,m=void 0===u?null:u,d=t.titleId,p=void 0===d?null:d,b=t.classes,v=void 0===b?[]:b,g=t.attributes,h=void 0===g?{}:g,y=t.styles,k=void 0===y?{}:y;if(n){var w=n.prefix,x=n.iconName,O=n.icon;return kt(r({type:"icon"},n),(function(){return dt("beforeDOMElementCreation",{iconDefinition:n,params:t}),un.autoA11y&&(m?h["aria-labelledby"]="".concat(un.replacementClass,"-title-").concat(p||vn()):(h["aria-hidden"]="true",h.focusable="false")),wt({icons:{main:At(O),mask:c?At(c.icon):{found:!1,width:null,height:null,icon:{}}},prefix:w,iconName:x,transform:r(r({},pn),e),symbol:o,title:m,maskId:l,titleId:p,extra:{attributes:h,styles:k,classes:v}})}))}},Zt={mixout:function(){return{icon:(n=Qt,function(t){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},e=(t||{}).icon?t:bt(t||{}),i=a.mask;return i&&(i=(i||{}).icon?i:bt(i||{})),n(e,r(r({},a),{},{mask:i}))})};var n},hooks:function(){return{mutationObserverCallbacks:function(n){return n.treeCallback=$t,n.nodeCallback=Jt,n}}},provides:function(n){n.i2svg=function(n){var t=n.node,a=void 0===t?C:t,e=n.callback;return $t(a,void 0===e?function(){}:e)},n.generateSvgReplacementMutation=function(n,t){var a=t.iconName,e=t.title,r=t.titleId,i=t.prefix,o=t.transform,s=t.symbol,f=t.mask,l=t.maskId,u=t.extra;return new Promise((function(t,m){Promise.all([zt(a,i),f.iconName?zt(f.iconName,f.prefix):Promise.resolve({found:!1,width:512,height:512,icon:{}})]).then((function(f){var m=c(f,2),d=m[0],p=m[1];t([n,wt({icons:{main:d,mask:p},prefix:i,iconName:a,transform:o,symbol:s,maskId:l,title:e,titleId:r,extra:u,watchable:!0})])})).catch(m)}))},n.generateAbstractIcon=function(n){var t,a=n.children,e=n.attributes,r=n.main,i=n.transform,o=kn(n.styles);return o.length>0&&(e.style=o),wn(i)&&(t=pt("generateAbstractTransformGrouping",{main:r,transform:i,containerWidth:r.width,iconWidth:r.width})),a.push(t||r.icon),{children:a,attributes:e}}}},na={mixout:function(){return{layer:function(n){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=t.classes,e=void 0===a?[]:a;return kt({type:"layer"},(function(){dt("beforeDOMElementCreation",{assembler:n,params:t});var a=[];return n((function(n){Array.isArray(n)?n.map((function(n){a=a.concat(n.abstract)})):a=a.concat(n.abstract)})),[{tag:"span",attributes:{class:["".concat(un.cssPrefix,"-layers")].concat(f(e)).join(" ")},children:a}]}))}}}},ta={mixout:function(){return{counter:function(n){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=t.title,e=void 0===a?null:a,i=t.classes,o=void 0===i?[]:i,s=t.attributes,c=void 0===s?{}:s,l=t.styles,u=void 0===l?{}:l;return kt({type:"counter",content:n},(function(){return dt("beforeDOMElementCreation",{content:n,params:t}),function(n){var t=n.content,a=n.title,e=n.extra,i=r(r(r({},e.attributes),a?{title:a}:{}),{},{class:e.classes.join(" ")}),o=kn(e.styles);o.length>0&&(i.style=o);var s=[];return s.push({tag:"span",attributes:i,children:[t]}),a&&s.push({tag:"span",attributes:{class:"sr-only"},children:[a]}),s}({content:n.toString(),title:e,extra:{attributes:c,styles:u,classes:["".concat(un.cssPrefix,"-layers-counter")].concat(f(o))}})}))}}}},aa={mixout:function(){return{text:function(n){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=t.transform,e=void 0===a?pn:a,i=t.title,o=void 0===i?null:i,s=t.classes,c=void 0===s?[]:s,l=t.attributes,u=void 0===l?{}:l,m=t.styles,d=void 0===m?{}:m;return kt({type:"text",content:n},(function(){return dt("beforeDOMElementCreation",{content:n,params:t}),xt({content:n,transform:r(r({},pn),e),title:o,extra:{attributes:u,styles:d,classes:["".concat(un.cssPrefix,"-layers-text")].concat(f(c))}})}))}}},provides:function(n){n.generateLayersText=function(n,t){var a=t.title,e=t.transform,r=t.extra,i=null,o=null;if(j){var s=parseInt(getComputedStyle(n).fontSize,10),c=n.getBoundingClientRect();i=c.width/s,o=c.height/s}return un.autoA11y&&!a&&(r.attributes["aria-hidden"]="true"),Promise.resolve([n,xt({content:n.innerHTML,width:i,height:o,transform:e,title:a,extra:r,watchable:!0})])}}},ea=new RegExp('"',"ug"),ra=[1105920,1112319];function ia(n,t){var a="".concat(Y).concat(t.replace(":","-"));return new Promise((function(e,i){if(null!==n.getAttribute(a))return e();var o,s,c,f=gn(n.children).filter((function(n){return n.getAttribute(R)===t}))[0],l=A.getComputedStyle(n,t),u=l.getPropertyValue("font-family").match(Z),m=l.getPropertyValue("font-weight"),d=l.getPropertyValue("content");if(f&&!u)return n.removeChild(f),e();if(u&&"none"!==d&&""!==d){var p=l.getPropertyValue("content"),b=~["Sharp"].indexOf(u[2])?_:U,v=~["Solid","Regular","Light","Thin","Duotone","Brands","Kit"].indexOf(u[2])?q[b][u[2].toLowerCase()]:nn[b][m],g=function(n){var t,a,e,r,i,o=n.replace(ea,""),s=(a=0,r=(t=o).length,(i=t.charCodeAt(a))>=55296&&i<=56319&&r>a+1&&(e=t.charCodeAt(a+1))>=56320&&e<=57343?1024*(i-55296)+e-56320+65536:i),c=s>=ra[0]&&s<=ra[1],f=2===o.length&&o[0]===o[1];return{value:In(f?o[0]:o),isSecondary:c||f}}(p),h=g.value,y=g.isSecondary,k=u[0].startsWith("FontAwesome"),w=Zn(v,h),x=w;if(k){var O=(s=Xn[o=h],c=Zn("fas",o),s||(c?{prefix:"fas",iconName:c}:null)||{prefix:null,iconName:null});O.iconName&&O.prefix&&(w=O.iconName,v=O.prefix)}if(!w||y||f&&f.getAttribute(T)===v&&f.getAttribute(D)===x)e();else{n.setAttribute(a,x),f&&n.removeChild(f);var z={iconName:null,title:null,titleId:null,prefix:null,transform:pn,symbol:!1,mask:{iconName:null,prefix:null,rest:[]},maskId:null,extra:{classes:[],styles:{},attributes:{}}},N=z.extra;N.attributes[R]=t,zt(w,v).then((function(i){var o=wt(r(r({},z),{},{icons:{main:i,mask:et()},prefix:v,iconName:x,extra:N,watchable:!0})),s=C.createElementNS("http://www.w3.org/2000/svg","svg");"::before"===t?n.insertBefore(s,n.firstChild):n.appendChild(s),s.outerHTML=o.map((function(n){return Sn(n)})).join("\n"),n.removeAttribute(a),e()})).catch(i)}}else e()}))}function oa(n){return Promise.all([ia(n,"::before"),ia(n,"::after")])}function sa(n){return!(n.parentNode===document.head||~V.indexOf(n.tagName.toUpperCase())||n.getAttribute(R)||n.parentNode&&"svg"===n.parentNode.tagName)}function ca(n){if(P)return new Promise((function(t,a){var e=gn(n.querySelectorAll("*")).filter(sa).map(oa),r=St.begin("searchPseudoElements");Vt(),Promise.all(e).then((function(){r(),Wt(),t()})).catch((function(){r(),Wt(),a()}))}))}var fa=!1,la=function(n){return n.toLowerCase().split(" ").reduce((function(n,t){var a=t.toLowerCase().split("-"),e=a[0],r=a.slice(1).join("-");if(e&&"h"===r)return n.flipX=!0,n;if(e&&"v"===r)return n.flipY=!0,n;if(r=parseFloat(r),isNaN(r))return n;switch(e){case"grow":n.size=n.size+r;break;case"shrink":n.size=n.size-r;break;case"left":n.x=n.x-r;break;case"right":n.x=n.x+r;break;case"up":n.y=n.y-r;break;case"down":n.y=n.y+r;break;case"rotate":n.rotate=n.rotate+r}return n}),{size:16,x:0,y:0,flipX:!1,flipY:!1,rotate:0})},ua={mixout:function(){return{parse:{transform:function(n){return la(n)}}}},hooks:function(){return{parseNodeAttributes:function(n,t){var a=t.getAttribute("data-fa-transform");return a&&(n.transform=la(a)),n}}},provides:function(n){n.generateAbstractTransformGrouping=function(n){var t=n.main,a=n.transform,e=n.containerWidth,i=n.iconWidth,o={transform:"translate(".concat(e/2," 256)")},s="translate(".concat(32*a.x,", ").concat(32*a.y,") "),c="scale(".concat(a.size/16*(a.flipX?-1:1),", ").concat(a.size/16*(a.flipY?-1:1),") "),f="rotate(".concat(a.rotate," 0 0)"),l={outer:o,inner:{transform:"".concat(s," ").concat(c," ").concat(f)},path:{transform:"translate(".concat(i/2*-1," -256)")}};return{tag:"g",attributes:r({},l.outer),children:[{tag:"g",attributes:r({},l.inner),children:[{tag:t.icon.tag,children:t.icon.children,attributes:r(r({},t.icon.attributes),l.path)}]}]}}}},ma={x:0,y:0,width:"100%",height:"100%"};function da(n){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return n.attributes&&(n.attributes.fill||t)&&(n.attributes.fill="black"),n}var pa={hooks:function(){return{parseNodeAttributes:function(n,t){var a=t.getAttribute("data-fa-mask"),e=a?ot(a.split(" ").map((function(n){return n.trim()}))):et();return e.prefix||(e.prefix=at()),n.mask=e,n.maskId=t.getAttribute("data-fa-mask-id"),n}}},provides:function(n){n.generateAbstractMask=function(n){var t,a=n.children,e=n.attributes,i=n.main,o=n.mask,s=n.maskId,c=n.transform,f=i.width,l=i.icon,u=o.width,m=o.icon,d=function(n){var t=n.transform,a=n.containerWidth,e=n.iconWidth,r={transform:"translate(".concat(a/2," 256)")},i="translate(".concat(32*t.x,", ").concat(32*t.y,") "),o="scale(".concat(t.size/16*(t.flipX?-1:1),", ").concat(t.size/16*(t.flipY?-1:1),") "),s="rotate(".concat(t.rotate," 0 0)");return{outer:r,inner:{transform:"".concat(i," ").concat(o," ").concat(s)},path:{transform:"translate(".concat(e/2*-1," -256)")}}}({transform:c,containerWidth:u,iconWidth:f}),p={tag:"rect",attributes:r(r({},ma),{},{fill:"white"})},b=l.children?{children:l.children.map(da)}:{},v={tag:"g",attributes:r({},d.inner),children:[da(r({tag:l.tag,attributes:r(r({},l.attributes),d.path)},b))]},g={tag:"g",attributes:r({},d.outer),children:[v]},h="mask-".concat(s||vn()),y="clip-".concat(s||vn()),k={tag:"mask",attributes:r(r({},ma),{},{id:h,maskUnits:"userSpaceOnUse",maskContentUnits:"userSpaceOnUse"}),children:[p,g]},w={tag:"defs",children:[{tag:"clipPath",attributes:{id:y},children:(t=m,"g"===t.tag?t.children:[t])},k]};return a.push(w,{tag:"rect",attributes:r({fill:"currentColor","clip-path":"url(#".concat(y,")"),mask:"url(#".concat(h,")")},ma)}),{children:a,attributes:e}}}},ba={provides:function(n){var t=!1;A.matchMedia&&(t=A.matchMedia("(prefers-reduced-motion: reduce)").matches),n.missingIconAbstract=function(){var n=[],a={fill:"currentColor"},e={attributeType:"XML",repeatCount:"indefinite",dur:"2s"};n.push({tag:"path",attributes:r(r({},a),{},{d:"M156.5,447.7l-12.6,29.5c-18.7-9.5-35.9-21.2-51.5-34.9l22.7-22.7C127.6,430.5,141.5,440,156.5,447.7z M40.6,272H8.5 c1.4,21.2,5.4,41.7,11.7,61.1L50,321.2C45.1,305.5,41.8,289,40.6,272z M40.6,240c1.4-18.8,5.2-37,11.1-54.1l-29.5-12.6 C14.7,194.3,10,216.7,8.5,240H40.6z M64.3,156.5c7.8-14.9,17.2-28.8,28.1-41.5L69.7,92.3c-13.7,15.6-25.5,32.8-34.9,51.5 L64.3,156.5z M397,419.6c-13.9,12-29.4,22.3-46.1,30.4l11.9,29.8c20.7-9.9,39.8-22.6,56.9-37.6L397,419.6z M115,92.4 c13.9-12,29.4-22.3,46.1-30.4l-11.9-29.8c-20.7,9.9-39.8,22.6-56.8,37.6L115,92.4z M447.7,355.5c-7.8,14.9-17.2,28.8-28.1,41.5 l22.7,22.7c13.7-15.6,25.5-32.9,34.9-51.5L447.7,355.5z M471.4,272c-1.4,18.8-5.2,37-11.1,54.1l29.5,12.6 c7.5-21.1,12.2-43.5,13.6-66.8H471.4z M321.2,462c-15.7,5-32.2,8.2-49.2,9.4v32.1c21.2-1.4,41.7-5.4,61.1-11.7L321.2,462z M240,471.4c-18.8-1.4-37-5.2-54.1-11.1l-12.6,29.5c21.1,7.5,43.5,12.2,66.8,13.6V471.4z M462,190.8c5,15.7,8.2,32.2,9.4,49.2h32.1 c-1.4-21.2-5.4-41.7-11.7-61.1L462,190.8z M92.4,397c-12-13.9-22.3-29.4-30.4-46.1l-29.8,11.9c9.9,20.7,22.6,39.8,37.6,56.9 L92.4,397z M272,40.6c18.8,1.4,36.9,5.2,54.1,11.1l12.6-29.5C317.7,14.7,295.3,10,272,8.5V40.6z M190.8,50 c15.7-5,32.2-8.2,49.2-9.4V8.5c-21.2,1.4-41.7,5.4-61.1,11.7L190.8,50z M442.3,92.3L419.6,115c12,13.9,22.3,29.4,30.5,46.1 l29.8-11.9C470,128.5,457.3,109.4,442.3,92.3z M397,92.4l22.7-22.7c-15.6-13.7-32.8-25.5-51.5-34.9l-12.6,29.5 C370.4,72.1,384.4,81.5,397,92.4z"})});var i=r(r({},e),{},{attributeName:"opacity"}),o={tag:"circle",attributes:r(r({},a),{},{cx:"256",cy:"364",r:"28"}),children:[]};return t||o.children.push({tag:"animate",attributes:r(r({},e),{},{attributeName:"r",values:"28;14;28;28;14;28;"})},{tag:"animate",attributes:r(r({},i),{},{values:"1;0;1;1;0;1;"})}),n.push(o),n.push({tag:"path",attributes:r(r({},a),{},{opacity:"1",d:"M263.7,312h-16c-6.6,0-12-5.4-12-12c0-71,77.4-63.9,77.4-107.8c0-20-17.8-40.2-57.4-40.2c-29.1,0-44.3,9.6-59.2,28.7 c-3.9,5-11.1,6-16.2,2.4l-13.1-9.2c-5.6-3.9-6.9-11.8-2.6-17.2c21.2-27.2,46.4-44.7,91.2-44.7c52.3,0,97.4,29.8,97.4,80.2 c0,67.6-77.4,63.5-77.4,107.8C275.7,306.6,270.3,312,263.7,312z"}),children:t?[]:[{tag:"animate",attributes:r(r({},i),{},{values:"1;0;0;0;0;1;"})}]}),t||n.push({tag:"path",attributes:r(r({},a),{},{opacity:"0",d:"M232.5,134.5l7,168c0.3,6.4,5.6,11.5,12,11.5h9c6.4,0,11.7-5.1,12-11.5l7-168c0.3-6.8-5.2-12.5-12-12.5h-23 C237.7,122,232.2,127.7,232.5,134.5z"}),children:[{tag:"animate",attributes:r(r({},i),{},{values:"0;0;1;1;0;0;"})}]}),{tag:"g",attributes:{class:"missing"},children:n}}}};!function(n,t){var a=t.mixoutsTo;ct=n,ft={},Object.keys(lt).forEach((function(n){-1===ut.indexOf(n)&&delete lt[n]})),ct.forEach((function(n){var t=n.mixout?n.mixout():{};if(Object.keys(t).forEach((function(n){"function"==typeof t[n]&&(a[n]=t[n]),"object"===i(t[n])&&Object.keys(t[n]).forEach((function(e){a[n]||(a[n]={}),a[n][e]=t[n][e]}))})),n.hooks){var e=n.hooks();Object.keys(e).forEach((function(n){ft[n]||(ft[n]=[]),ft[n].push(e[n])}))}n.provides&&n.provides(lt)}))}([zn,Zt,na,ta,aa,{hooks:function(){return{mutationObserverCallbacks:function(n){return n.pseudoElementsCallback=ca,n}}},provides:function(n){n.pseudoElements2svg=function(n){var t=n.node,a=void 0===t?C:t;un.searchPseudoElements&&ca(a)}}},{mixout:function(){return{dom:{unwatch:function(){Vt(),fa=!0}}}},hooks:function(){return{bootstrap:function(){_t(mt("mutationObserverCallbacks",{}))},noAuto:function(){Ut&&Ut.disconnect()},watch:function(n){var t=n.observeMutationsRoot;fa?Wt():_t(mt("mutationObserverCallbacks",{observeMutationsRoot:t}))}}}},ua,pa,ba,{hooks:function(){return{parseNodeAttributes:function(n,t){var a=t.getAttribute("data-fa-symbol"),e=null!==a&&(""===a||a);return n.symbol=e,n}}}}],{mixoutsTo:ht});var va=ht.dom,ga=ht.parse,ha=ht.icon},9472:(n,t,a)=>{a.d(t,{GK$:()=>i,I1R:()=>e,MPc:()=>r,eEK:()=>o});var e={prefix:"fab",iconName:"chrome",icon:[512,512,[],"f268","M0 256C0 209.4 12.47 165.6 34.27 127.1L144.1 318.3C166 357.5 207.9 384 256 384C270.3 384 283.1 381.7 296.8 377.4L220.5 509.6C95.9 492.3 0 385.3 0 256zM365.1 321.6C377.4 302.4 384 279.1 384 256C384 217.8 367.2 183.5 340.7 160H493.4C505.4 189.6 512 222.1 512 256C512 397.4 397.4 511.1 256 512L365.1 321.6zM477.8 128H256C193.1 128 142.3 172.1 130.5 230.7L54.19 98.47C101 38.53 174 0 256 0C350.8 0 433.5 51.48 477.8 128V128zM168 256C168 207.4 207.4 168 256 168C304.6 168 344 207.4 344 256C344 304.6 304.6 344 256 344C207.4 344 168 304.6 168 256z"]},r={prefix:"fab",iconName:"padlet",icon:[640,512,[],"e4a0","M297.9 0L298 .001C305.6 .1078 312.4 4.72 315.5 11.78L447.5 320.3L447.8 320.2L448 320.6L445.2 330.6L402.3 488.6C398.6 504.8 382.6 514.9 366.5 511.2L298.1 495.6L229.6 511.2C213.5 514.9 197.5 504.8 193.8 488.6L150.9 330.6L148.2 320.6L148.3 320.2L280.4 11.78C283.4 4.797 290.3 .1837 297.9 .0006L297.9 0zM160.1 322.1L291.1 361.2L298 483.7L305.9 362.2L436.5 322.9L436.7 322.8L305.7 347.9L297.1 27.72L291.9 347.9L160.1 322.1zM426 222.6L520.4 181.6H594.2L437.2 429.2L468.8 320.2L426 222.6zM597.5 181.4L638.9 257.6C642.9 265.1 635 273.5 627.3 269.8L579.7 247.1L597.5 181.4zM127.3 318.5L158.7 430L1.61 154.5C-4.292 144.1 7.128 132.5 17.55 138.3L169.4 222.5L127.3 318.5z"]},i={prefix:"fab",iconName:"linkedin",icon:[448,512,[],"f08c","M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"]},o={prefix:"fab",iconName:"github",icon:[496,512,[],"f09b","M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"]}},5896:(n,t,a)=>{a.d(t,{$cR:()=>c,Cq1:()=>s,Ujh:()=>l,Ww9:()=>u,Y$m:()=>f,YV1:()=>i,c9t:()=>r,wB$:()=>e});var e={prefix:"fas",iconName:"gamepad",icon:[640,512,[],"f11b","M192 64C86 64 0 150 0 256S86 448 192 448H448c106 0 192-86 192-192s-86-192-192-192H192zM496 168a40 40 0 1 1 0 80 40 40 0 1 1 0-80zM392 304a40 40 0 1 1 80 0 40 40 0 1 1 -80 0zM168 200c0-13.3 10.7-24 24-24s24 10.7 24 24v32h32c13.3 0 24 10.7 24 24s-10.7 24-24 24H216v32c0 13.3-10.7 24-24 24s-24-10.7-24-24V280H136c-13.3 0-24-10.7-24-24s10.7-24 24-24h32V200z"]},r={prefix:"fas",iconName:"users",icon:[640,512,[],"f0c0","M144 0a80 80 0 1 1 0 160A80 80 0 1 1 144 0zM512 0a80 80 0 1 1 0 160A80 80 0 1 1 512 0zM0 298.7C0 239.8 47.8 192 106.7 192h42.7c15.9 0 31 3.5 44.6 9.7c-1.3 7.2-1.9 14.7-1.9 22.3c0 38.2 16.8 72.5 43.3 96c-.2 0-.4 0-.7 0H21.3C9.6 320 0 310.4 0 298.7zM405.3 320c-.2 0-.4 0-.7 0c26.6-23.5 43.3-57.8 43.3-96c0-7.6-.7-15-1.9-22.3c13.6-6.3 28.7-9.7 44.6-9.7h42.7C592.2 192 640 239.8 640 298.7c0 11.8-9.6 21.3-21.3 21.3H405.3zM224 224a96 96 0 1 1 192 0 96 96 0 1 1 -192 0zM128 485.3C128 411.7 187.7 352 261.3 352H378.7C452.3 352 512 411.7 512 485.3c0 14.7-11.9 26.7-26.7 26.7H154.7c-14.7 0-26.7-11.9-26.7-26.7z"]},i={prefix:"fas",iconName:"code",icon:[640,512,[],"f121","M392.8 1.2c-17-4.9-34.7 5-39.6 22l-128 448c-4.9 17 5 34.7 22 39.6s34.7-5 39.6-22l128-448c4.9-17-5-34.7-22-39.6zm80.6 120.1c-12.5 12.5-12.5 32.8 0 45.3L562.7 256l-89.4 89.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l112-112c12.5-12.5 12.5-32.8 0-45.3l-112-112c-12.5-12.5-32.8-12.5-45.3 0zm-306.7 0c-12.5-12.5-32.8-12.5-45.3 0l-112 112c-12.5 12.5-12.5 32.8 0 45.3l112 112c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L77.3 256l89.4-89.4c12.5-12.5 12.5-32.8 0-45.3z"]},o={prefix:"fas",iconName:"screwdriver-wrench",icon:[512,512,["tools"],"f7d9","M78.6 5C69.1-2.4 55.6-1.5 47 7L7 47c-8.5 8.5-9.4 22-2.1 31.6l80 104c4.5 5.9 11.6 9.4 19 9.4h54.1l109 109c-14.7 29-10 65.4 14.3 89.6l112 112c12.5 12.5 32.8 12.5 45.3 0l64-64c12.5-12.5 12.5-32.8 0-45.3l-112-112c-24.2-24.2-60.6-29-89.6-14.3l-109-109V104c0-7.5-3.5-14.5-9.4-19L78.6 5zM19.9 396.1C7.2 408.8 0 426.1 0 444.1C0 481.6 30.4 512 67.9 512c18 0 35.3-7.2 48-19.9L233.7 374.3c-7.8-20.9-9-43.6-3.6-65.1l-61.7-61.7L19.9 396.1zM512 144c0-10.5-1.1-20.7-3.2-30.5c-2.4-11.2-16.1-14.1-24.2-6l-63.9 63.9c-3 3-7.1 4.7-11.3 4.7H352c-8.8 0-16-7.2-16-16V102.6c0-4.2 1.7-8.3 4.7-11.3l63.9-63.9c8.1-8.1 5.2-21.8-6-24.2C388.7 1.1 378.5 0 368 0C288.5 0 224 64.5 224 144l0 .8 85.3 85.3c36-9.1 75.8 .5 104 28.7L429 274.5c49-23 83-72.8 83-130.5zM56 432a24 24 0 1 1 48 0 24 24 0 1 1 -48 0z"]},s=o,c={prefix:"fas",iconName:"file",icon:[384,512,[128196,128459,61462],"f15b","M0 64C0 28.7 28.7 0 64 0H224V128c0 17.7 14.3 32 32 32H384V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V64zm384 64H256V0L384 128z"]},f={prefix:"fas",iconName:"link",icon:[640,512,[128279,"chain"],"f0c1","M579.8 267.7c56.5-56.5 56.5-148 0-204.5c-50-50-128.8-56.5-186.3-15.4l-1.6 1.1c-14.4 10.3-17.7 30.3-7.4 44.6s30.3 17.7 44.6 7.4l1.6-1.1c32.1-22.9 76-19.3 103.8 8.6c31.5 31.5 31.5 82.5 0 114L422.3 334.8c-31.5 31.5-82.5 31.5-114 0c-27.9-27.9-31.5-71.8-8.6-103.8l1.1-1.6c10.3-14.4 6.9-34.4-7.4-44.6s-34.4-6.9-44.6 7.4l-1.1 1.6C206.5 251.2 213 330 263 380c56.5 56.5 148 56.5 204.5 0L579.8 267.7zM60.2 244.3c-56.5 56.5-56.5 148 0 204.5c50 50 128.8 56.5 186.3 15.4l1.6-1.1c14.4-10.3 17.7-30.3 7.4-44.6s-30.3-17.7-44.6-7.4l-1.6 1.1c-32.1 22.9-76 19.3-103.8-8.6C74 372 74 321 105.5 289.5L217.7 177.2c31.5-31.5 82.5-31.5 114 0c27.9 27.9 31.5 71.8 8.6 103.9l-1.1 1.6c-10.3 14.4-6.9 34.4 7.4 44.6s34.4 6.9 44.6-7.4l1.1-1.6C433.5 260.8 427 182 377 132c-56.5-56.5-148-56.5-204.5 0L60.2 244.3z"]},l={prefix:"fas",iconName:"calendar",icon:[448,512,[128197,128198],"f133","M96 32V64H48C21.5 64 0 85.5 0 112v48H448V112c0-26.5-21.5-48-48-48H352V32c0-17.7-14.3-32-32-32s-32 14.3-32 32V64H160V32c0-17.7-14.3-32-32-32S96 14.3 96 32zM448 192H0V464c0 26.5 21.5 48 48 48H400c26.5 0 48-21.5 48-48V192z"]},u={prefix:"fas",iconName:"paper-plane",icon:[512,512,[61913],"f1d8","M498.1 5.6c10.1 7 15.4 19.1 13.5 31.2l-64 416c-1.5 9.7-7.4 18.2-16 23s-18.9 5.4-28 1.6L284 427.7l-68.5 74.1c-8.9 9.7-22.9 12.9-35.2 8.1S160 493.2 160 480V396.4c0-4 1.5-7.8 4.2-10.7L331.8 202.8c5.8-6.3 5.6-16-.4-22s-15.7-6.4-22-.7L106 360.8 17.7 316.6C7.1 311.3 .3 300.7 0 288.9s5.9-22.8 16.1-28.7l448-256c10.7-6.1 23.9-5.5 34 1.4z"]}}}]); \ No newline at end of file diff --git a/assets/js/7c5afa08.0e9ac1eb.js b/assets/js/7c5afa08.0e9ac1eb.js new file mode 100644 index 00000000..fac16da5 --- /dev/null +++ b/assets/js/7c5afa08.0e9ac1eb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[4932],{4512:(t,a,e)=>{e.r(a),e.d(a,{assets:()=>h,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>r,toc:()=>u});var s=e(7624),n=e(2172);const o={slug:"stashaway",title:"Top 3 reasons why you should start investing with StashAway today!",author:"Evan Tay",author_url:"https://github.com/DigiPie",author_title:"Wage Slave",author_image_url:"https://avatars2.githubusercontent.com/u/13582874",tags:["investing","sharing"]},i=void 0,r={permalink:"/blog/stashaway",editUrl:"https://github.com/DigiPie/kaya-folio/tree/main/website/blog/2021-03-11-stashaway.md",source:"@site/blog/2021-03-11-stashaway.md",title:"Top 3 reasons why you should start investing with StashAway today!",description:"This article was posted sometime back in early 2021 and may be outdated. Refer to SingSaver instead for updated information.",date:"2021-03-11T00:00:00.000Z",formattedDate:"March 11, 2021",tags:[{label:"investing",permalink:"/blog/tags/investing"},{label:"sharing",permalink:"/blog/tags/sharing"}],readingTime:4.47,hasTruncateMarker:!0,authors:[{name:"Evan Tay",title:"Wage Slave",url:"https://github.com/DigiPie",imageURL:"https://avatars2.githubusercontent.com/u/13582874"}],frontMatter:{slug:"stashaway",title:"Top 3 reasons why you should start investing with StashAway today!",author:"Evan Tay",author_url:"https://github.com/DigiPie",author_title:"Wage Slave",author_image_url:"https://avatars2.githubusercontent.com/u/13582874",tags:["investing","sharing"]},unlisted:!1,prevItem:{title:"Integrating PostHog product analytics with Docusaurus v2 on GitHub Pages",permalink:"/blog/docusaurus-posthog"},nextItem:{title:"GitHub Action for Docusaurus",permalink:"/blog/docusaurus-gh-action"}},h={authorsImageUrls:[void 0]},u=[];function l(t){const a={a:"a",admonition:"admonition",p:"p",...(0,n.M)(),...t.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(a.admonition,{title:"Deprecated",type:"caution",children:(0,s.jsxs)(a.p,{children:["This article was posted sometime back in early 2021 and may be outdated. Refer to ",(0,s.jsx)(a.a,{href:"https://www.singsaver.com.sg/investments/robo-advisory",children:"SingSaver"})," instead for updated information."]})}),"\n",(0,s.jsx)(a.admonition,{title:"Disclaimer",type:"note",children:(0,s.jsx)(a.p,{children:"This post is not sponsored, and does not constitute financial advice of any form (I bet you know better than me). Read at your own discretion."})}),"\n",(0,s.jsxs)(a.p,{children:["Signing up on ",(0,s.jsx)(a.a,{href:"https://www.stashaway.sg/referrals/tayegd",children:"StashAway"})," (a ",(0,s.jsx)(a.a,{href:"https://blog.moneysmart.sg/invest/robo-advisors-singapore/#what-are-robo-advisors",children:"robo-advisor platform"}),") back in the early 2020s was the first step in taking control of my financial health. Before that, 100% of my cash was just sitting in a POSB Savings account, growing at an incredibly pointless rate of ",(0,s.jsx)(a.a,{href:"https://www.dbs.com.sg/personal/rates-online/deposit-rates.page",children:"0.05% per annum"}),". I might as well have kept the money under my mattress."]})]})}function c(t={}){const{wrapper:a}={...(0,n.M)(),...t.components};return a?(0,s.jsx)(a,{...t,children:(0,s.jsx)(l,{...t})}):l(t)}},2172:(t,a,e)=>{e.d(a,{I:()=>r,M:()=>i});var s=e(1504);const n={},o=s.createContext(n);function i(t){const a=s.useContext(o);return s.useMemo((function(){return"function"==typeof t?t(a):{...a,...t}}),[a,t])}function r(t){let a;return a=t.disableParentContext?"function"==typeof t.components?t.components(n):t.components||n:i(t.components),s.createElement(o.Provider,{value:a},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/814f3328.e531b803.js b/assets/js/814f3328.e531b803.js new file mode 100644 index 00000000..1d538469 --- /dev/null +++ b/assets/js/814f3328.e531b803.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[5512],{4352:t=>{t.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"Why every Software Engineer should read Designing Data-Intensive Applications","permalink":"/blog/why-you-should-read-ddia","unlisted":false},{"title":"Integrating PostHog product analytics with Docusaurus v2 on GitHub Pages","permalink":"/blog/docusaurus-posthog","unlisted":false},{"title":"Top 3 reasons why you should start investing with StashAway today!","permalink":"/blog/stashaway","unlisted":false},{"title":"GitHub Action for Docusaurus","permalink":"/blog/docusaurus-gh-action","unlisted":false},{"title":"History of EvanTay.com","permalink":"/blog/history","unlisted":false}]}')}}]); \ No newline at end of file diff --git a/assets/js/86dbdca9.89cf8c3d.js b/assets/js/86dbdca9.89cf8c3d.js new file mode 100644 index 00000000..71b23a91 --- /dev/null +++ b/assets/js/86dbdca9.89cf8c3d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[7816],{3512:e=>{e.exports=JSON.parse('{"label":"conference","permalink":"/blog/tags/conference","allTagsPath":"/blog/tags","count":1,"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/8b28c975.aedb13d2.js b/assets/js/8b28c975.aedb13d2.js new file mode 100644 index 00000000..0c1bc2b9 --- /dev/null +++ b/assets/js/8b28c975.aedb13d2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[3028],{3448:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/investing","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/8bb152cf.5951aad0.js b/assets/js/8bb152cf.5951aad0.js new file mode 100644 index 00000000..d4d7e86d --- /dev/null +++ b/assets/js/8bb152cf.5951aad0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[6928],{6088:a=>{a.exports=JSON.parse('{"label":"software-architecture","permalink":"/blog/tags/software-architecture","allTagsPath":"/blog/tags","count":1,"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/901e7e12.d2454f63.js b/assets/js/901e7e12.d2454f63.js new file mode 100644 index 00000000..13131061 --- /dev/null +++ b/assets/js/901e7e12.d2454f63.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[4500],{2652:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>r,contentTitle:()=>a,default:()=>d,frontMatter:()=>s,metadata:()=>u,toc:()=>c});var n=o(7624),i=o(2172);const s={slug:"docusaurus-gh-action",title:"GitHub Action for Docusaurus",author:"Evan Tay",author_url:"https://github.com/DigiPie",author_title:"Software Engineer at Padlet",author_image_url:"https://avatars2.githubusercontent.com/u/13582874",tags:["docusaurus","github-action","ci"]},a=void 0,u={permalink:"/blog/docusaurus-gh-action",editUrl:"https://github.com/DigiPie/kaya-folio/tree/main/website/blog/2021-01-17-docusaurus-gh-action.md",source:"@site/blog/2021-01-17-docusaurus-gh-action.md",title:"GitHub Action for Docusaurus",description:"I got tired of deploying my Docusaurus website to GitHub Pages manually, and decided to do something about it using GitHub Action.",date:"2021-01-17T00:00:00.000Z",formattedDate:"January 17, 2021",tags:[{label:"docusaurus",permalink:"/blog/tags/docusaurus"},{label:"github-action",permalink:"/blog/tags/github-action"},{label:"ci",permalink:"/blog/tags/ci"}],readingTime:1.54,hasTruncateMarker:!0,authors:[{name:"Evan Tay",title:"Software Engineer at Padlet",url:"https://github.com/DigiPie",imageURL:"https://avatars2.githubusercontent.com/u/13582874"}],frontMatter:{slug:"docusaurus-gh-action",title:"GitHub Action for Docusaurus",author:"Evan Tay",author_url:"https://github.com/DigiPie",author_title:"Software Engineer at Padlet",author_image_url:"https://avatars2.githubusercontent.com/u/13582874",tags:["docusaurus","github-action","ci"]},unlisted:!1,prevItem:{title:"Top 3 reasons why you should start investing with StashAway today!",permalink:"/blog/stashaway"},nextItem:{title:"History of EvanTay.com",permalink:"/blog/history"}},r={authorsImageUrls:[void 0]},c=[{value:"deploy-docusaurus.yml",id:"deploy-docusaurusyml",level:2}];function l(e){const t={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.M)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"I got tired of deploying my Docusaurus website to GitHub Pages manually, and decided to do something about it using GitHub Action."}),"\n",(0,n.jsxs)(t.p,{children:["Initially, I was planning to follow the ",(0,n.jsx)(t.a,{href:"https://v2.docusaurus.io/docs/deployment#triggering-deployment-with-github-actions",children:"official guide"})," on doing so. However, it was actually much more complicated than I liked. I did not really want to generate and store a SSH key on GitHub. Too much effort man."]}),"\n",(0,n.jsx)(t.p,{children:"I decided it was better off for me to write my own script. Here it is:"}),"\n",(0,n.jsx)(t.h2,{id:"deploy-docusaurusyml",children:"deploy-docusaurus.yml"}),"\n",(0,n.jsxs)(t.admonition,{type:"caution",children:[(0,n.jsxs)(t.p,{children:["The script below assumes that your Docusaurus website resides at ",(0,n.jsx)(t.code,{children:"/website"})," of your repo. If that is not the case for you, you will need to:"]}),(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["Change ",(0,n.jsx)(t.code,{children:"cd website"})," to ",(0,n.jsx)(t.code,{children:"cd <docu_site_root>"}),", or delete the entire line if your Docusaurus website is at the root of your repo ",(0,n.jsx)(t.code,{children:"/"})]}),"\n",(0,n.jsxs)(t.li,{children:["Change ",(0,n.jsx)(t.code,{children:"build_dir"}),"'s value from ",(0,n.jsx)(t.code,{children:"website/build"})," to ",(0,n.jsx)(t.code,{children:"<docu_site_root>/build"}),", or ",(0,n.jsx)(t.code,{children:"build"})," if your Docusaurus website is at the root of your repo ",(0,n.jsx)(t.code,{children:"/"})]}),"\n"]})]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yml",children:'name: deploy-docusaurus\n\non:\n push:\n branches: [main]\n pull_request:\n branches: [main]\n\n # Allows you to run this workflow manually from the Actions tab\n workflow_dispatch:\n\n# A workflow run is made up of one or more jobs that can run sequentially or in parallel\njobs:\n publish:\n runs-on: ubuntu-latest\n steps:\n # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it\n - name: Check out repo\n uses: actions/checkout@v2\n # Node is required for npm\n - name: Set up Node\n uses: actions/setup-node@v2\n with:\n node-version: "12"\n # Install and build Docusaurus website\n - name: Build Docusaurus website\n run: |\n cd website\n npm install \n npm run build\n - name: Deploy to GitHub Pages\n if: success()\n uses: crazy-max/ghaction-github-pages@v2\n with:\n target_branch: gh-pages\n build_dir: website/build\n env:\n GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n'})}),"\n",(0,n.jsx)(t.admonition,{type:"note",children:(0,n.jsxs)(t.p,{children:["GitHub will automatically add ",(0,n.jsx)(t.code,{children:"GITHUB_TOKEN"})," to Secrets. You need not do so. See ",(0,n.jsx)(t.a,{href:"https://docs.github.com/en/actions/reference/authentication-in-a-workflow",children:"this"})," for more information."]})}),"\n",(0,n.jsxs)(t.p,{children:["To see this script in action, visit my ",(0,n.jsx)(t.a,{href:"https://github.com/DigiPie/kaya-folio/actions",children:"personal website repo"}),"."]})]})}function d(e={}){const{wrapper:t}={...(0,i.M)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},2172:(e,t,o)=>{o.d(t,{I:()=>u,M:()=>a});var n=o(1504);const i={},s=n.createContext(i);function a(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function u(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.8b594ff5.js b/assets/js/935f2afb.8b594ff5.js new file mode 100644 index 00000000..4d494526 --- /dev/null +++ b/assets/js/935f2afb.8b594ff5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[5696],{5988:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"docs":[{"type":"link","label":"Contents","href":"/docs/","docId":"contents","unlisted":false},{"type":"link","label":"Reading List","href":"/docs/reading-list","docId":"reading-list","unlisted":false},{"type":"category","label":"Article Summaries","items":[{"type":"link","label":"Scaling Memcached","href":"/docs/scaling-memcached","docId":"scaling-memcached","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Book Summaries","items":[{"type":"category","label":"Designing Data-Intensive Applications","items":[{"type":"link","label":"Reliable, Scalable, and Maintainable Applications","href":"/docs/reliable-scalable-maintainable","docId":"reliable-scalable-maintainable","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Ikigai","href":"/docs/ikigai","docId":"ikigai","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Cloud and Networking","items":[{"type":"link","label":"Docker Cheatsheet","href":"/docs/docker-cheatsheet","docId":"docker-cheatsheet","unlisted":false},{"type":"link","label":"GKE Cheatsheet","href":"/docs/gcp-gke-cheatsheet","docId":"gcp-gke-cheatsheet","unlisted":false},{"type":"link","label":"Mininet Setup","href":"/docs/mininet-setup","docId":"mininet-setup","unlisted":false},{"type":"link","label":"Network Model (CS4226)","href":"/docs/network-model","docId":"network-model","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Programming","items":[{"type":"category","label":"Ruby","items":[{"type":"link","label":"Dependency management","href":"/docs/ruby-dependency-management","docId":"ruby-dependency-management","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"C Cheatsheet","href":"/docs/c-cheatsheet","docId":"c-cheatsheet","unlisted":false},{"type":"link","label":"JS Cheatsheet","href":"/docs/js-cheatsheet","docId":"js-cheatsheet","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Tooling and OS","items":[{"type":"category","label":"Git","items":[{"type":"link","label":"Git Cheatsheet","href":"/docs/git-cheatsheet","docId":"git-cheatsheet","unlisted":false},{"type":"link","label":"Git Ignore file","href":"/docs/git-ignore-file","docId":"git-ignore-file","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"iTerm2","items":[{"type":"link","label":"iTerm2 and zsh Setup","href":"/docs/iterm2-zsh-setup","docId":"iterm2-zsh-setup","unlisted":false},{"type":"link","label":"iTerm2 Cheatsheet","href":"/docs/iterm2-cheatsheet","docId":"iterm2-cheatsheet","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Ubuntu Cheatsheet","href":"/docs/os-ubuntu-cheatsheet","docId":"os-ubuntu-cheatsheet","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Web Development","items":[{"type":"category","label":"MongoDB","items":[{"type":"link","label":"MongoDB Setup","href":"/docs/mongodb-setup","docId":"mongodb-setup","unlisted":false},{"type":"link","label":"MongoDB Cheatsheet","href":"/docs/mongodb-cheatsheet","docId":"mongodb-cheatsheet","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"NodeJS","items":[{"type":"link","label":"NodeJS Auto-reload server","href":"/docs/nodejs-auto-reload","docId":"nodejs-auto-reload","unlisted":false},{"type":"link","label":"NodeJS Set npm run shell","href":"/docs/nodejs-set-npm-run-shell","docId":"nodejs-set-npm-run-shell","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true}]},"docs":{"c-cheatsheet":{"id":"c-cheatsheet","title":"C Cheatsheet","description":"Published on December 23, 2020","sidebar":"docs"},"contents":{"id":"contents","title":"Contents","description":"Published on January 23, 2021","sidebar":"docs"},"docker-cheatsheet":{"id":"docker-cheatsheet","title":"Docker Cheatsheet","description":"Published on December 24, 2020","sidebar":"docs"},"gcp-gke-cheatsheet":{"id":"gcp-gke-cheatsheet","title":"GKE Cheatsheet","description":"Published on December 24, 2020","sidebar":"docs"},"git-cheatsheet":{"id":"git-cheatsheet","title":"Git Cheatsheet","description":"Published on December 24, 2020","sidebar":"docs"},"git-ignore-file":{"id":"git-ignore-file","title":"Git Ignore file","description":"Published on December 24, 2020","sidebar":"docs"},"ikigai":{"id":"ikigai","title":"Ikigai","description":"Published on May 16, 2021","sidebar":"docs"},"iterm2-cheatsheet":{"id":"iterm2-cheatsheet","title":"iTerm2 Cheatsheet","description":"Published on January 16, 2021","sidebar":"docs"},"iterm2-zsh-setup":{"id":"iterm2-zsh-setup","title":"iTerm2 and zsh Setup","description":"Published on January 16, 2021","sidebar":"docs"},"js-cheatsheet":{"id":"js-cheatsheet","title":"JS Cheatsheet","description":"Published on August 1, 2021","sidebar":"docs"},"mdx":{"id":"mdx","title":"Powered by MDX","description":"You can write JSX and use React components within your Markdown thanks to MDX."},"mininet-setup":{"id":"mininet-setup","title":"Mininet Setup","description":"Published on December 21, 2020","sidebar":"docs"},"mongodb-cheatsheet":{"id":"mongodb-cheatsheet","title":"MongoDB Cheatsheet","description":"Published on December 23, 2020","sidebar":"docs"},"mongodb-setup":{"id":"mongodb-setup","title":"MongoDB Setup","description":"Published on December 23, 2020","sidebar":"docs"},"network-model":{"id":"network-model","title":"Network Model (CS4226)","description":"Published on November 30, 2020","sidebar":"docs"},"nodejs-auto-reload":{"id":"nodejs-auto-reload","title":"NodeJS Auto-reload server","description":"Published on December 23, 2020","sidebar":"docs"},"nodejs-set-npm-run-shell":{"id":"nodejs-set-npm-run-shell","title":"NodeJS Set npm run shell","description":"Published on December 23, 2020","sidebar":"docs"},"os-ubuntu-cheatsheet":{"id":"os-ubuntu-cheatsheet","title":"Ubuntu Cheatsheet","description":"Published on December 24, 2020","sidebar":"docs"},"reading-list":{"id":"reading-list","title":"Reading List","description":"Published on December 23, 2020","sidebar":"docs"},"reliable-scalable-maintainable":{"id":"reliable-scalable-maintainable","title":"Reliable, Scalable, and Maintainable Applications","description":"Published on July 31, 2021","sidebar":"docs"},"ruby-dependency-management":{"id":"ruby-dependency-management","title":"Dependency management","description":"Published on October 24, 2021","sidebar":"docs"},"scaling-memcached":{"id":"scaling-memcached","title":"Scaling Memcached","description":"Published on April 14, 2021","sidebar":"docs"}}}')}}]); \ No newline at end of file diff --git a/assets/js/93b82f8b.d3db5731.js b/assets/js/93b82f8b.d3db5731.js new file mode 100644 index 00000000..5e9e856f --- /dev/null +++ b/assets/js/93b82f8b.d3db5731.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[8650],{139:a=>{a.exports=JSON.parse('{"label":"github-action","permalink":"/blog/tags/github-action","allTagsPath":"/blog/tags","count":1,"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/9e4087bc.53ec5649.js b/assets/js/9e4087bc.53ec5649.js new file mode 100644 index 00000000..a6e8e06d --- /dev/null +++ b/assets/js/9e4087bc.53ec5649.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[7028],{6140:(e,a,t)=>{t.r(a),t.d(a,{default:()=>o});t(1504);var r=t(867),s=t(4357),i=t(5756),c=t(9012),n=t(6448),l=t(7624);function h(e){let{year:a,posts:t}=e;return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(n.c,{as:"h3",id:a,children:a}),(0,l.jsx)("ul",{children:t.map((e=>(0,l.jsx)("li",{children:(0,l.jsxs)(r.c,{to:e.metadata.permalink,children:[e.metadata.formattedDate," - ",e.metadata.title]})},e.metadata.date)))})]})}function d(e){let{years:a}=e;return(0,l.jsx)("section",{className:"margin-vert--lg",children:(0,l.jsx)("div",{className:"container",children:(0,l.jsx)("div",{className:"row",children:a.map(((e,a)=>(0,l.jsx)("div",{className:"col col--4 margin-vert--lg",children:(0,l.jsx)(h,{...e})},a)))})})})}function o(e){let{archive:a}=e;const t=(0,s.G)({id:"theme.blog.archive.title",message:"Archive",description:"The page & hero title of the blog archive page"}),r=(0,s.G)({id:"theme.blog.archive.description",message:"Archive",description:"The page & hero description of the blog archive page"}),h=function(e){const a=e.reduce(((e,a)=>{var t;const r=a.metadata.date.split("-")[0],s=null!=(t=e.get(r))?t:[];return e.set(r,[a,...s])}),new Map);return Array.from(a,(e=>{let[a,t]=e;return{year:a,posts:t}}))}(a.blogPosts);return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(i.U7,{title:t,description:r}),(0,l.jsxs)(c.c,{children:[(0,l.jsx)("header",{className:"hero hero--primary",children:(0,l.jsxs)("div",{className:"container",children:[(0,l.jsx)(n.c,{as:"h1",className:"hero__title",children:t}),(0,l.jsx)("p",{className:"hero__subtitle",children:r})]})}),(0,l.jsx)("main",{children:h.length>0&&(0,l.jsx)(d,{years:h})})]})]})}}}]); \ No newline at end of file diff --git a/assets/js/a4f77f3b.4a76b647.js b/assets/js/a4f77f3b.4a76b647.js new file mode 100644 index 00000000..02726b74 --- /dev/null +++ b/assets/js/a4f77f3b.4a76b647.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[5664],{5800:(t,e,o)=>{o.r(e),o.d(e,{assets:()=>r,contentTitle:()=>u,default:()=>d,frontMatter:()=>n,metadata:()=>s,toc:()=>c});var a=o(7624),i=o(2172);const n={slug:"docusaurus-gh-action",title:"GitHub Action for Docusaurus",author:"Evan Tay",author_url:"https://github.com/DigiPie",author_title:"Software Engineer at Padlet",author_image_url:"https://avatars2.githubusercontent.com/u/13582874",tags:["docusaurus","github-action","ci"]},u=void 0,s={permalink:"/blog/docusaurus-gh-action",editUrl:"https://github.com/DigiPie/kaya-folio/tree/main/website/blog/2021-01-17-docusaurus-gh-action.md",source:"@site/blog/2021-01-17-docusaurus-gh-action.md",title:"GitHub Action for Docusaurus",description:"I got tired of deploying my Docusaurus website to GitHub Pages manually, and decided to do something about it using GitHub Action.",date:"2021-01-17T00:00:00.000Z",formattedDate:"January 17, 2021",tags:[{label:"docusaurus",permalink:"/blog/tags/docusaurus"},{label:"github-action",permalink:"/blog/tags/github-action"},{label:"ci",permalink:"/blog/tags/ci"}],readingTime:1.54,hasTruncateMarker:!0,authors:[{name:"Evan Tay",title:"Software Engineer at Padlet",url:"https://github.com/DigiPie",imageURL:"https://avatars2.githubusercontent.com/u/13582874"}],frontMatter:{slug:"docusaurus-gh-action",title:"GitHub Action for Docusaurus",author:"Evan Tay",author_url:"https://github.com/DigiPie",author_title:"Software Engineer at Padlet",author_image_url:"https://avatars2.githubusercontent.com/u/13582874",tags:["docusaurus","github-action","ci"]},unlisted:!1,prevItem:{title:"Top 3 reasons why you should start investing with StashAway today!",permalink:"/blog/stashaway"},nextItem:{title:"History of EvanTay.com",permalink:"/blog/history"}},r={authorsImageUrls:[void 0]},c=[];function l(t){const e={a:"a",p:"p",...(0,i.M)(),...t.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(e.p,{children:"I got tired of deploying my Docusaurus website to GitHub Pages manually, and decided to do something about it using GitHub Action."}),"\n",(0,a.jsxs)(e.p,{children:["Initially, I was planning to follow the ",(0,a.jsx)(e.a,{href:"https://v2.docusaurus.io/docs/deployment#triggering-deployment-with-github-actions",children:"official guide"})," on doing so. However, it was actually much more complicated than I liked. I did not really want to generate and store a SSH key on GitHub. Too much effort man."]}),"\n",(0,a.jsx)(e.p,{children:"I decided it was better off for me to write my own script. Here it is:"})]})}function d(t={}){const{wrapper:e}={...(0,i.M)(),...t.components};return e?(0,a.jsx)(e,{...t,children:(0,a.jsx)(l,{...t})}):l(t)}},2172:(t,e,o)=>{o.d(e,{I:()=>s,M:()=>u});var a=o(1504);const i={},n=a.createContext(i);function u(t){const e=a.useContext(n);return a.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function s(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(i):t.components||i:u(t.components),a.createElement(n.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/a6aa9e1f.766c90f3.js b/assets/js/a6aa9e1f.766c90f3.js new file mode 100644 index 00000000..9f6ec8ff --- /dev/null +++ b/assets/js/a6aa9e1f.766c90f3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[4976],{4328:(e,t,a)=>{a.r(t),a.d(t,{default:()=>h});a(1504);var n=a(5456),i=a(8264),s=a(5756),r=a(5864),l=a(9452),o=a(2687),c=a(8712),g=a(992),d=a(7624);function p(e){const{metadata:t}=e,{siteConfig:{title:a}}=(0,i.c)(),{blogDescription:n,blogTitle:r,permalink:l}=t,o="/"===l?a:r;return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(s.U7,{title:o,description:n}),(0,d.jsx)(c.c,{tag:"blog_posts_list"})]})}function m(e){const{metadata:t,items:a,sidebar:n}=e;return(0,d.jsxs)(l.c,{sidebar:n,children:[(0,d.jsx)(g.c,{items:a}),(0,d.jsx)(o.c,{metadata:t})]})}function h(e){return(0,d.jsxs)(s.cr,{className:(0,n.c)(r.W.wrapper.blogPages,r.W.page.blogListPage),children:[(0,d.jsx)(p,{...e}),(0,d.jsx)(m,{...e})]})}},2687:(e,t,a)=>{a.d(t,{c:()=>r});a(1504);var n=a(4357),i=a(308),s=a(7624);function r(e){const{metadata:t}=e,{previousPage:a,nextPage:r}=t;return(0,s.jsxs)("nav",{className:"pagination-nav","aria-label":(0,n.G)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[a&&(0,s.jsx)(i.c,{permalink:a,title:(0,s.jsx)(n.c,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer Entries"})}),r&&(0,s.jsx)(i.c,{permalink:r,title:(0,s.jsx)(n.c,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older Entries"}),isNext:!0})]})}},992:(e,t,a)=>{a.d(t,{c:()=>r});a(1504);var n=a(3152),i=a(7792),s=a(7624);function r(e){let{items:t,component:a=i.c}=e;return(0,s.jsx)(s.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,s.jsx)(n.E,{content:t,children:(0,s.jsx)(a,{children:(0,s.jsx)(t,{})})},t.metadata.permalink)}))})}}}]); \ No newline at end of file diff --git a/assets/js/a7023ddc.6616f8ea.js b/assets/js/a7023ddc.6616f8ea.js new file mode 100644 index 00000000..96d7cc86 --- /dev/null +++ b/assets/js/a7023ddc.6616f8ea.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[9112],{1568:e=>{e.exports=JSON.parse('[{"label":"book-review","permalink":"/blog/tags/book-review","count":1},{"label":"software-engineering","permalink":"/blog/tags/software-engineering","count":1},{"label":"software-architecture","permalink":"/blog/tags/software-architecture","count":1},{"label":"docusaurus","permalink":"/blog/tags/docusaurus","count":2},{"label":"posthog","permalink":"/blog/tags/posthog","count":1},{"label":"analytics","permalink":"/blog/tags/analytics","count":1},{"label":"investing","permalink":"/blog/tags/investing","count":1},{"label":"sharing","permalink":"/blog/tags/sharing","count":2},{"label":"github-action","permalink":"/blog/tags/github-action","count":1},{"label":"ci","permalink":"/blog/tags/ci","count":1},{"label":"conference","permalink":"/blog/tags/conference","count":1},{"label":"cloud","permalink":"/blog/tags/cloud","count":1},{"label":"microservices","permalink":"/blog/tags/microservices","count":1},{"label":"GovTechSTACK","permalink":"/blog/tags/gov-tech-stack","count":1}]')}}]); \ No newline at end of file diff --git a/assets/js/a77fb37c.345b470a.js b/assets/js/a77fb37c.345b470a.js new file mode 100644 index 00000000..a5acafcf --- /dev/null +++ b/assets/js/a77fb37c.345b470a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[2552],{6792:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-blog","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/a7bd4aaa.b6181012.js b/assets/js/a7bd4aaa.b6181012.js new file mode 100644 index 00000000..01abd0dc --- /dev/null +++ b/assets/js/a7bd4aaa.b6181012.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[6500],{2e3:(n,e,s)=>{s.r(e),s.d(e,{default:()=>x});s(1504);var r=s(5756),o=s(4456),t=s(9920),c=s(5464),a=s(8712),i=s(7624);function u(n){const{version:e}=n;return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(a.c,{version:e.version,tag:(0,o.SE)(e.pluginId,e.version)}),(0,i.jsx)(r.U7,{children:e.noIndex&&(0,i.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})]})}function l(n){const{version:e,route:s}=n;return(0,i.jsx)(r.cr,{className:e.className,children:(0,i.jsx)(t.Q,{version:e,children:(0,c.k)(s.routes)})})}function x(n){return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(u,{...n}),(0,i.jsx)(l,{...n})]})}}}]); \ No newline at end of file diff --git a/assets/js/a80da1cf.9e317cba.js b/assets/js/a80da1cf.9e317cba.js new file mode 100644 index 00000000..f26eb1ca --- /dev/null +++ b/assets/js/a80da1cf.9e317cba.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[8600],{2338:a=>{a.exports=JSON.parse('{"label":"docusaurus","permalink":"/blog/tags/docusaurus","allTagsPath":"/blog/tags","count":2,"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/a8e7919c.cc4d0793.js b/assets/js/a8e7919c.cc4d0793.js new file mode 100644 index 00000000..a2fe6495 --- /dev/null +++ b/assets/js/a8e7919c.cc4d0793.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[7388],{9416:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>u,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var a=n(7624),o=n(2172);const i={slug:"history",title:"History of EvanTay.com",author:"Evan Tay",author_url:"https://github.com/DigiPie",author_title:"Final year Computer Science major at NUS",author_image_url:"https://avatars2.githubusercontent.com/u/13582874",tags:["sharing"]},r=void 0,s={permalink:"/blog/history",editUrl:"https://github.com/DigiPie/kaya-folio/tree/main/website/blog/2020-12-21-history.md",source:"@site/blog/2020-12-21-history.md",title:"History of EvanTay.com",description:"_Established in 2013_",date:"2020-12-21T00:00:00.000Z",formattedDate:"December 21, 2020",tags:[{label:"sharing",permalink:"/blog/tags/sharing"}],readingTime:2.535,hasTruncateMarker:!0,authors:[{name:"Evan Tay",title:"Final year Computer Science major at NUS",url:"https://github.com/DigiPie",imageURL:"https://avatars2.githubusercontent.com/u/13582874"}],frontMatter:{slug:"history",title:"History of EvanTay.com",author:"Evan Tay",author_url:"https://github.com/DigiPie",author_title:"Final year Computer Science major at NUS",author_image_url:"https://avatars2.githubusercontent.com/u/13582874",tags:["sharing"]},unlisted:!1,prevItem:{title:"GitHub Action for Docusaurus",permalink:"/blog/docusaurus-gh-action"},nextItem:{title:"STACK 2020 Developers Conference",permalink:"/blog/stack-2020"}},u={authorsImageUrls:[void 0]},c=[];function l(t){const e={a:"a",em:"em",p:"p",strong:"strong",...(0,o.M)(),...t.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(e.p,{children:(0,a.jsx)(e.strong,{children:(0,a.jsx)(e.em,{children:"Established in 2013"})})}),"\n",(0,a.jsxs)(e.p,{children:["I first bought my personal domain ",(0,a.jsx)(e.a,{href:"https://www.evantay.com",children:"www.evantay.com"})," way back in 2013. Younger me thought it would be cool and fun to run my own website, and it still is. ","\ud83d\ude0e"]}),"\n",(0,a.jsx)(e.p,{children:"To be honest, I can't even remember what my very first website looked like, but I am quite sure it was built using vanilla HTML and CSS, something unthinkable in this day and age."})]})}function h(t={}){const{wrapper:e}={...(0,o.M)(),...t.components};return e?(0,a.jsx)(e,{...t,children:(0,a.jsx)(l,{...t})}):l(t)}},2172:(t,e,n)=>{n.d(e,{I:()=>s,M:()=>r});var a=n(1504);const o={},i=a.createContext(o);function r(t){const e=a.useContext(i);return a.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function s(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:r(t.components),a.createElement(i.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/a94703ab.2e2cf1b9.js b/assets/js/a94703ab.2e2cf1b9.js new file mode 100644 index 00000000..f52af4e4 --- /dev/null +++ b/assets/js/a94703ab.2e2cf1b9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[4666],{996:(e,t,n)=>{n.r(t),n.d(t,{default:()=>be});var a=n(1504),o=n(5456),i=n(5756),s=n(5864),c=n(9940),l=n(6192),r=n(4357),d=n(3943),u=n(7124);const m={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};var b=n(7624);function h(){const{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e;const[n,o]=(0,a.useState)(!1),i=(0,a.useRef)(!1),{startScroll:s,cancelScroll:c}=(0,d.yI)();return(0,d.SM)(((e,n)=>{let{scrollY:a}=e;const s=null==n?void 0:n.scrollY;s&&(i.current?i.current=!1:a>=s?(c(),o(!1)):a<t?o(!1):a+window.innerHeight<document.documentElement.scrollHeight&&o(!0))})),(0,u.c)((e=>{e.location.hash&&(i.current=!0,o(!1))})),{shown:n,scrollToTop:()=>s(0)}}({threshold:300});return(0,b.jsx)("button",{"aria-label":(0,r.G)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,o.c)("clean-btn",s.W.common.backToTopButton,m.backToTopButton,e&&m.backToTopButtonShow),type:"button",onClick:t})}var p=n(3856),x=n(5592),j=n(1432),f=n(1824),v=n(8164);function _(e){return(0,b.jsx)("svg",{width:"20",height:"20","aria-hidden":"true",...e,children:(0,b.jsxs)("g",{fill:"#7a7a7a",children:[(0,b.jsx)("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"}),(0,b.jsx)("path",{d:"M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"})]})})}const g={collapseSidebarButton:"collapseSidebarButton_PEFL",collapseSidebarButtonIcon:"collapseSidebarButtonIcon_kv0_"};function S(e){let{onClick:t}=e;return(0,b.jsx)("button",{type:"button",title:(0,r.G)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,r.G)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,o.c)("button button--secondary button--outline",g.collapseSidebarButton),onClick:t,children:(0,b.jsx)(_,{className:g.collapseSidebarButtonIcon})})}var k=n(3868),C=n(1100);const I=Symbol("EmptyContext"),N=a.createContext(I);function T(e){let{children:t}=e;const[n,o]=(0,a.useState)(null),i=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:o})),[n]);return(0,b.jsx)(N.Provider,{value:i,children:t})}var B=n(8448),y=n(3376),A=n(867),W=n(3664);function w(e){let{collapsed:t,categoryLabel:n,onClick:a}=e;return(0,b.jsx)("button",{"aria-label":t?(0,r.G)({id:"theme.DocSidebarItem.expandCategoryAriaLabel",message:"Expand sidebar category '{label}'",description:"The ARIA label to expand the sidebar category"},{label:n}):(0,r.G)({id:"theme.DocSidebarItem.collapseCategoryAriaLabel",message:"Collapse sidebar category '{label}'",description:"The ARIA label to collapse the sidebar category"},{label:n}),type:"button",className:"clean-btn menu__caret",onClick:a})}function L(e){let{item:t,onItemClick:n,activePath:i,level:l,index:r,...d}=e;const{items:u,label:m,collapsible:h,className:p,href:x}=t,{docs:{sidebar:{autoCollapseCategories:j}}}=(0,f.y)(),v=function(e){const t=(0,W.c)();return(0,a.useMemo)((()=>e.href&&!e.linkUnlisted?e.href:!t&&e.collapsible?(0,c.Gw)(e):void 0),[e,t])}(t),_=(0,c.Md)(t,i),g=(0,y.Sc)(x,i),{collapsed:S,setCollapsed:k}=(0,B.a)({initialState:()=>!!h&&(!_&&t.collapsed)}),{expandedItem:T,setExpandedItem:L}=function(){const e=(0,a.useContext)(N);if(e===I)throw new C.AH("DocSidebarItemsExpandedStateProvider");return e}(),E=function(e){void 0===e&&(e=!S),L(e?null:r),k(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:o}=e;const i=(0,C.i0)(t);(0,a.useEffect)((()=>{t&&!i&&n&&o(!1)}),[t,i,n,o])}({isActive:_,collapsed:S,updateCollapsed:E}),(0,a.useEffect)((()=>{h&&null!=T&&T!==r&&j&&k(!0)}),[h,T,r,k,j]),(0,b.jsxs)("li",{className:(0,o.c)(s.W.docs.docSidebarItemCategory,s.W.docs.docSidebarItemCategoryLevel(l),"menu__list-item",{"menu__list-item--collapsed":S},p),children:[(0,b.jsxs)("div",{className:(0,o.c)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":g}),children:[(0,b.jsx)(A.c,{className:(0,o.c)("menu__link",{"menu__link--sublist":h,"menu__link--sublist-caret":!x&&h,"menu__link--active":_}),onClick:h?e=>{null==n||n(t),x?E(!1):(e.preventDefault(),E())}:()=>{null==n||n(t)},"aria-current":g?"page":void 0,"aria-expanded":h?!S:void 0,href:h?null!=v?v:"#":v,...d,children:m}),x&&h&&(0,b.jsx)(w,{collapsed:S,categoryLabel:m,onClick:e=>{e.preventDefault(),E()}})]}),(0,b.jsx)(B.U,{lazy:!0,as:"ul",className:"menu__list",collapsed:S,children:(0,b.jsx)(F,{items:u,tabIndex:S?-1:0,onItemClick:n,activePath:i,level:l+1})})]})}var E=n(8136),M=n(3232);const H={menuExternalLink:"menuExternalLink_NmtK"};function P(e){let{item:t,onItemClick:n,activePath:a,level:i,index:l,...r}=e;const{href:d,label:u,className:m,autoAddBaseUrl:h}=t,p=(0,c.Md)(t,a),x=(0,E.c)(d);return(0,b.jsx)("li",{className:(0,o.c)(s.W.docs.docSidebarItemLink,s.W.docs.docSidebarItemLinkLevel(i),"menu__list-item",m),children:(0,b.jsxs)(A.c,{className:(0,o.c)("menu__link",!x&&H.menuExternalLink,{"menu__link--active":p}),autoAddBaseUrl:h,"aria-current":p?"page":void 0,to:d,...x&&{onClick:n?()=>n(t):void 0},...r,children:[u,!x&&(0,b.jsx)(M.c,{})]})},u)}const R={menuHtmlItem:"menuHtmlItem_M9Kj"};function G(e){let{item:t,level:n,index:a}=e;const{value:i,defaultStyle:c,className:l}=t;return(0,b.jsx)("li",{className:(0,o.c)(s.W.docs.docSidebarItemLink,s.W.docs.docSidebarItemLinkLevel(n),c&&[R.menuHtmlItem,"menu__list-item"],l),dangerouslySetInnerHTML:{__html:i}},a)}function D(e){let{item:t,...n}=e;switch(t.type){case"category":return(0,b.jsx)(L,{item:t,...n});case"html":return(0,b.jsx)(G,{item:t,...n});default:return(0,b.jsx)(P,{item:t,...n})}}function U(e){let{items:t,...n}=e;const a=(0,c.mg)(t,n.activePath);return(0,b.jsx)(T,{children:a.map(((e,t)=>(0,b.jsx)(D,{item:e,index:t,...n},t)))})}const F=(0,a.memo)(U),K={menu:"menu_SIkG",menuWithAnnouncementBar:"menuWithAnnouncementBar_GW3s"};function V(e){let{path:t,sidebar:n,className:i}=e;const c=function(){const{isActive:e}=(0,k.el)(),[t,n]=(0,a.useState)(e);return(0,d.SM)((t=>{let{scrollY:a}=t;e&&n(0===a)}),[e]),e&&t}();return(0,b.jsx)("nav",{"aria-label":(0,r.G)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,o.c)("menu thin-scrollbar",K.menu,c&&K.menuWithAnnouncementBar,i),children:(0,b.jsx)("ul",{className:(0,o.c)(s.W.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(F,{items:n,activePath:t,level:1})})})}const Y="sidebar_njMd",z="sidebarWithHideableNavbar_wUlq",q="sidebarHidden_VK0M",O="sidebarLogo_isFc";function J(e){let{path:t,sidebar:n,onCollapse:a,isHidden:i}=e;const{navbar:{hideOnScroll:s},docs:{sidebar:{hideable:c}}}=(0,f.y)();return(0,b.jsxs)("div",{className:(0,o.c)(Y,s&&z,i&&q),children:[s&&(0,b.jsx)(v.c,{tabIndex:-1,className:O}),(0,b.jsx)(V,{path:t,sidebar:n}),c&&(0,b.jsx)(S,{onClick:a})]})}const Q=a.memo(J);var X=n(5168),Z=n(1336);const $=e=>{let{sidebar:t,path:n}=e;const a=(0,Z.q)();return(0,b.jsx)("ul",{className:(0,o.c)(s.W.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(F,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&a.toggle(),"link"===e.type&&a.toggle()},level:1})})};function ee(e){return(0,b.jsx)(X.Mx,{component:$,props:e})}const te=a.memo(ee);function ne(e){const t=(0,j.U)(),n="desktop"===t||"ssr"===t,a="mobile"===t;return(0,b.jsxs)(b.Fragment,{children:[n&&(0,b.jsx)(Q,{...e}),a&&(0,b.jsx)(te,{...e})]})}const ae={expandButton:"expandButton_TmdG",expandButtonIcon:"expandButtonIcon_i1dp"};function oe(e){let{toggleSidebar:t}=e;return(0,b.jsx)("div",{className:ae.expandButton,title:(0,r.G)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,r.G)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:t,onClick:t,children:(0,b.jsx)(_,{className:ae.expandButtonIcon})})}const ie={docSidebarContainer:"docSidebarContainer_YfHR",docSidebarContainerHidden:"docSidebarContainerHidden_DPk8",sidebarViewport:"sidebarViewport_aRkj"};function se(e){var t;let{children:n}=e;const o=(0,l.m)();return(0,b.jsx)(a.Fragment,{children:n},null!=(t=null==o?void 0:o.name)?t:"noSidebar")}function ce(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:i}=e;const{pathname:c}=(0,x.IT)(),[l,r]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{l&&r(!1),!l&&(0,p.I)()&&r(!0),i((e=>!e))}),[i,l]);return(0,b.jsx)("aside",{className:(0,o.c)(s.W.docs.docSidebarContainer,ie.docSidebarContainer,n&&ie.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(ie.docSidebarContainer)&&n&&r(!0)},children:(0,b.jsx)(se,{children:(0,b.jsxs)("div",{className:(0,o.c)(ie.sidebarViewport,l&&ie.sidebarViewportHidden),children:[(0,b.jsx)(ne,{sidebar:t,path:c,onCollapse:d,isHidden:l}),l&&(0,b.jsx)(oe,{toggleSidebar:d})]})})})}const le={docMainContainer:"docMainContainer_TBSr",docMainContainerEnhanced:"docMainContainerEnhanced_lQrH",docItemWrapperEnhanced:"docItemWrapperEnhanced_JWYK"};function re(e){let{hiddenSidebarContainer:t,children:n}=e;const a=(0,l.m)();return(0,b.jsx)("main",{className:(0,o.c)(le.docMainContainer,(t||!a)&&le.docMainContainerEnhanced),children:(0,b.jsx)("div",{className:(0,o.c)("container padding-top--md padding-bottom--lg",le.docItemWrapper,t&&le.docItemWrapperEnhanced),children:n})})}const de={docRoot:"docRoot_UBD9",docsWrapper:"docsWrapper_hBAB"};function ue(e){let{children:t}=e;const n=(0,l.m)(),[o,i]=(0,a.useState)(!1);return(0,b.jsxs)("div",{className:de.docsWrapper,children:[(0,b.jsx)(h,{}),(0,b.jsxs)("div",{className:de.docRoot,children:[n&&(0,b.jsx)(ce,{sidebar:n.items,hiddenSidebarContainer:o,setHiddenSidebarContainer:i}),(0,b.jsx)(re,{hiddenSidebarContainer:o,children:t})]})]})}var me=n(6592);function be(e){const t=(0,c.Uj)(e);if(!t)return(0,b.jsx)(me.c,{});const{docElement:n,sidebarName:a,sidebarItems:r}=t;return(0,b.jsx)(i.cr,{className:(0,o.c)(s.W.page.docsDocPage),children:(0,b.jsx)(l.y,{name:a,items:r,children:(0,b.jsx)(ue,{children:n})})})}},6592:(e,t,n)=>{n.d(t,{c:()=>c});n(1504);var a=n(5456),o=n(4357),i=n(6448),s=n(7624);function c(e){let{className:t}=e;return(0,s.jsx)("main",{className:(0,a.c)("container margin-vert--xl",t),children:(0,s.jsx)("div",{className:"row",children:(0,s.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,s.jsx)(i.c,{as:"h1",className:"hero__title",children:(0,s.jsx)(o.c,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.c,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.c,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}}}]); \ No newline at end of file diff --git a/assets/js/ad7b700f.ebef52ac.js b/assets/js/ad7b700f.ebef52ac.js new file mode 100644 index 00000000..e2d45774 --- /dev/null +++ b/assets/js/ad7b700f.ebef52ac.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[4048],{2680:a=>{a.exports=JSON.parse('{"label":"posthog","permalink":"/blog/tags/posthog","allTagsPath":"/blog/tags","count":1,"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/b1513dc1.c10e4a59.js b/assets/js/b1513dc1.c10e4a59.js new file mode 100644 index 00000000..9d2e7b88 --- /dev/null +++ b/assets/js/b1513dc1.c10e4a59.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[5528],{2624:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/cloud","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/b16fdaf9.74b4136a.js b/assets/js/b16fdaf9.74b4136a.js new file mode 100644 index 00000000..79fa0bc6 --- /dev/null +++ b/assets/js/b16fdaf9.74b4136a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[9448],{3404:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var l=t(7624),i=t(2172);const s={title:"GKE Cheatsheet"},r=void 0,c={id:"gcp-gke-cheatsheet",title:"GKE Cheatsheet",description:"Published on December 24, 2020",source:"@site/docs/gcp-gke-cheatsheet.md",sourceDirName:".",slug:"/gcp-gke-cheatsheet",permalink:"/docs/gcp-gke-cheatsheet",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{title:"GKE Cheatsheet"},sidebar:"docs",previous:{title:"Docker Cheatsheet",permalink:"/docs/docker-cheatsheet"},next:{title:"Mininet Setup",permalink:"/docs/mininet-setup"}},o={},d=[{value:"Clusters",id:"clusters",level:2},{value:"Creating a cluster",id:"creating-a-cluster",level:3},{value:"Deleting a cluster",id:"deleting-a-cluster",level:3},{value:"Getting cluster info",id:"getting-cluster-info",level:3},{value:"Deployments",id:"deployments",level:2},{value:"Creating a deployment",id:"creating-a-deployment",level:3},{value:"Deleting a deployment",id:"deleting-a-deployment",level:3},{value:"Updating your deployment",id:"updating-your-deployment",level:3},{value:"Scaling a deployment",id:"scaling-a-deployment",level:3},{value:"Getting deployment info",id:"getting-deployment-info",level:3},{value:"Resources",id:"resources",level:2}];function a(e){const n={a:"a",admonition:"admonition",br:"br",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.M)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(n.p,{children:"Published on December 24, 2020"}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsxs)(n.em,{children:["This document was migrated from ",(0,l.jsx)(n.a,{href:"https://digipie.github.io/digidocs/gcp/kubernetes-engine/",children:"DigiDocs"})]})}),"\n",(0,l.jsxs)(n.p,{children:["In this section, you will find my notes on using Kubernetes on Google Cloud Platform's ",(0,l.jsx)(n.a,{href:"https://cloud.google.com/kubernetes-engine",children:"Kubernetes Engine"})," (GKE). It covers a typical workflow for starting a Kubernetes cluster and deploying an application on it."]}),"\n",(0,l.jsx)(n.h2,{id:"clusters",children:"Clusters"}),"\n",(0,l.jsx)(n.h3,{id:"creating-a-cluster",children:"Creating a cluster"}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Typical command:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"gcloud container clusters create $C_NAME --zone $ZONE --num-nodes $NUM\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Shorter command:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"gcloud container clusters create $C_NAME\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"With auto-scaling"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"gcloud container clusters create $C_NAME --enable-autoscaling --min-nodes $MIN --max-nodes $MAX\n"})}),"\n",(0,l.jsx)(n.admonition,{type:"note",children:(0,l.jsxs)(n.p,{children:["The default value for ",(0,l.jsx)(n.code,{children:"--num-nodes"})," is ",(0,l.jsx)(n.strong,{children:"3"})]})}),"\n",(0,l.jsxs)(n.admonition,{type:"tip",children:[(0,l.jsx)(n.p,{children:"You can set the default zone for Kubernetes Engine using the following:"}),(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:["For zonal clusters: ",(0,l.jsx)(n.code,{children:"gcloud config set compute/zone $ZONE"})]}),"\n",(0,l.jsxs)(n.li,{children:["For regional clusters: ",(0,l.jsx)(n.code,{children:"gcloud config set compute/region $REGION"})]}),"\n"]})]}),"\n",(0,l.jsx)(n.h3,{id:"deleting-a-cluster",children:"Deleting a cluster"}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Typical command"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"gcloud container clusters delete $C_NAME\n"})}),"\n",(0,l.jsx)(n.h3,{id:"getting-cluster-info",children:"Getting cluster info"}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Get all pods running in the cluster"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{children:"kubectl get pods\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Get all services running in the cluster"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{children:"kubectl get services\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Get credentials for cluster"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{children:"gcloud container clusters get-credentials $C_NAME\n"})}),"\n",(0,l.jsx)(n.admonition,{title:"Cite",type:"note",children:(0,l.jsx)(n.p,{children:"This command enables switching to a specific cluster, when working with multiple clusters. It can also be used to access a previously created cluster from a new workstation."})}),"\n",(0,l.jsx)(n.h2,{id:"deployments",children:"Deployments"}),"\n",(0,l.jsx)(n.h3,{id:"creating-a-deployment",children:"Creating a deployment"}),"\n",(0,l.jsxs)(n.p,{children:["To create a deployment, you need to have your Docker image prepared beforehand. This image must be built and uploaded to the ",(0,l.jsx)(n.a,{href:"https://cloud.google.com/container-registry",children:"Container Registry"})," before you can deploy it on your GKE cluster."]}),"\n",(0,l.jsx)(n.admonition,{type:"tip",children:(0,l.jsxs)(n.p,{children:["Before you proceed, you need to configure Docker to authenticate to the Container Registry: ",(0,l.jsx)(n.code,{children:"gcloud auth configure-docker"})]})}),"\n",(0,l.jsxs)(n.ol,{children:["\n",(0,l.jsxs)(n.li,{children:["Build your image:",(0,l.jsx)(n.br,{}),"\n",(0,l.jsx)(n.code,{children:"docker build -t gcr.io/$PROJECT_ID/$NAME:$VER ."})]}),"\n",(0,l.jsxs)(n.li,{children:["Verify it was built:",(0,l.jsx)(n.br,{}),"\n",(0,l.jsx)(n.code,{children:"docker images"})]}),"\n",(0,l.jsxs)(n.li,{children:["Upload your image to the registry:",(0,l.jsx)(n.br,{}),"\n",(0,l.jsx)(n.code,{children:"docker push gcr.io/$PROJECT_ID/$NAME:$VER"})]}),"\n",(0,l.jsxs)(n.li,{children:["Verify it was uploaded:",(0,l.jsx)(n.br,{}),"\n",(0,l.jsx)(n.code,{children:"docker run --rm -p $CONT_PORT:$HOST_PORT gcr.io/$PROJECT_ID/$NAME:$VER"})]}),"\n",(0,l.jsxs)(n.li,{children:["Create your deployment:",(0,l.jsx)(n.br,{}),"\n",(0,l.jsx)(n.code,{children:"kubectl create deployment $D_NAME --image=gcr.io/$PROJECT_ID/$NAME:$VER"})]}),"\n",(0,l.jsxs)(n.li,{children:["Verify it was deployed:",(0,l.jsx)(n.br,{}),"\n",(0,l.jsx)(n.code,{children:"kubectl get pods"})]}),"\n",(0,l.jsxs)(n.li,{children:["Expose the deployment to the Internet via a Service resource:",(0,l.jsx)(n.br,{}),"\n",(0,l.jsx)(n.code,{children:"kubectl expose deployment $D_NAME --type=LoadBalancer --port $EXPOSED_PORT --target-port $HOST_PORT"})]}),"\n",(0,l.jsxs)(n.li,{children:["Verify the service is running:",(0,l.jsx)(n.br,{}),"\n",(0,l.jsx)(n.code,{children:"kubectl get service"})]}),"\n"]}),"\n",(0,l.jsx)(n.h3,{id:"deleting-a-deployment",children:"Deleting a deployment"}),"\n",(0,l.jsxs)(n.ol,{children:["\n",(0,l.jsxs)(n.li,{children:["Delete the Service resource:",(0,l.jsx)(n.br,{}),"\n",(0,l.jsx)(n.code,{children:"kubectl delete service $D_NAME"})]}),"\n",(0,l.jsxs)(n.li,{children:["Delete the cluster:",(0,l.jsx)(n.br,{}),"\n",(0,l.jsx)(n.code,{children:"gcloud container clusters delete $C_NAME"})]}),"\n"]}),"\n",(0,l.jsx)(n.h3,{id:"updating-your-deployment",children:"Updating your deployment"}),"\n",(0,l.jsx)(n.p,{children:"To update your deployment with a new Docker image, you have to upload it to the Cloud Registry. Next, you can apply a rolling update of your deployment's Docker image."}),"\n",(0,l.jsxs)(n.ol,{children:["\n",(0,l.jsxs)(n.li,{children:["Build your new image (remember to update ",(0,l.jsx)(n.code,{children:"$VER"}),"):",(0,l.jsx)(n.br,{}),"\n",(0,l.jsx)(n.code,{children:"docker build -t gcr.io/$PROJECT_ID/$I_NAME:$VER ."})]}),"\n",(0,l.jsxs)(n.li,{children:["Verify it was built:",(0,l.jsx)(n.br,{}),"\n",(0,l.jsx)(n.code,{children:"docker images"})]}),"\n",(0,l.jsxs)(n.li,{children:["Upload your image to the registry:",(0,l.jsx)(n.br,{}),"\n",(0,l.jsx)(n.code,{children:"docker push gcr.io/$PROJECT_ID/$I_NAME:$VER"})]}),"\n",(0,l.jsxs)(n.li,{children:["Verify it was uploaded:",(0,l.jsx)(n.br,{}),"\n",(0,l.jsx)(n.code,{children:"docker run --rm -p $CONT_PORT:$HOST_PORT gcr.io/$PROJECT_ID/$I_NAME:$VER"})]}),"\n",(0,l.jsxs)(n.li,{children:["Apply a rolling image update:",(0,l.jsx)(n.br,{}),"\n",(0,l.jsx)(n.code,{children:"kubectl set image deployment/$D_NAME $I_NAME=gcr.io/$PROJECT_ID/$I_NAME:$VER"})]}),"\n"]}),"\n",(0,l.jsx)(n.h3,{id:"scaling-a-deployment",children:"Scaling a deployment"}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Typical example"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"kubectl scale deployment $D_NAME --replicas $NUM\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"With auto-scaling"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"kubectl autoscale deployment $D_NAME --max $MAX --min $MIN --cpu-percent $PERCENT\n"})}),"\n",(0,l.jsx)(n.h3,{id:"getting-deployment-info",children:"Getting deployment info"}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Typical example"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"kubectl get deployment $D_NAME\n"})}),"\n",(0,l.jsx)(n.h2,{id:"resources",children:"Resources"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"https://digipie.github.io/digidocs/gcp/kubernetes-engine/",children:"Original copy of this document at DigiDocs"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands",children:"Kubectl Reference Docs"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"https://cloud.google.com/sdk/gcloud/reference/container/clusters/create",children:"Documentation on 'gcloud container clusters create'"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"https://cloud.google.com/kubernetes-engine/docs/how-to/deleting-a-cluster",children:"Documentation on 'gcloud container clusters delete'"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"https://cloud.google.com/sdk/gcloud/reference/container/clusters/get-credentials",children:"Documentation on 'gcloud container clusters get-credentials'"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"https://cloud.google.com/kubernetes-engine/docs/tutorials/hello-app",children:"Tutorial on deploying a containerized web application"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"https://cloud.google.com/kubernetes-engine/docs/how-to/scaling-apps#autoscaling-deployments",children:"Documentation on 'kubectl autoscale'"})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.M)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(a,{...e})}):a(e)}},2172:(e,n,t)=>{t.d(n,{I:()=>c,M:()=>r});var l=t(1504);const i={},s=l.createContext(i);function r(e){const n=l.useContext(s);return l.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),l.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b2b675dd.faff854d.js b/assets/js/b2b675dd.faff854d.js new file mode 100644 index 00000000..39f01c48 --- /dev/null +++ b/assets/js/b2b675dd.faff854d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[6292],{6180:e=>{e.exports=JSON.parse('{"permalink":"/blog","page":1,"postsPerPage":10,"totalPages":1,"totalCount":6,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/b2f554cd.b8ce89aa.js b/assets/js/b2f554cd.b8ce89aa.js new file mode 100644 index 00000000..1836f790 --- /dev/null +++ b/assets/js/b2f554cd.b8ce89aa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[6880],{8256:e=>{e.exports=JSON.parse('{"blogPosts":[{"id":"why-you-should-read-ddia","metadata":{"permalink":"/blog/why-you-should-read-ddia","editUrl":"https://github.com/DigiPie/kaya-folio/tree/main/website/blog/2021-09-10-why-you-should-read-ddia.md","source":"@site/blog/2021-09-10-why-you-should-read-ddia.md","title":"Why every Software Engineer should read Designing Data-Intensive Applications","description":"Picking up this book was one of the best decisions I made for my fledgling software engineering career. Its insights enabled me to make well-reasoned software design decisions, and confidently communicate them, in spite of my relative professional inexperience. Given how helpful it has been, I\u2019m here today to share more about the impression it has left on me, and convince you that it is a must-read if you are a software engineer.","date":"2021-09-10T00:00:00.000Z","formattedDate":"September 10, 2021","tags":[{"label":"book-review","permalink":"/blog/tags/book-review"},{"label":"software-engineering","permalink":"/blog/tags/software-engineering"},{"label":"software-architecture","permalink":"/blog/tags/software-architecture"}],"readingTime":2.475,"hasTruncateMarker":true,"authors":[{"name":"Evan Tay","title":"Software Engineer at Padlet","url":"https://github.com/DigiPie","imageURL":"https://avatars2.githubusercontent.com/u/13582874"}],"frontMatter":{"slug":"why-you-should-read-ddia","title":"Why every Software Engineer should read Designing Data-Intensive Applications","author":"Evan Tay","author_url":"https://github.com/DigiPie","author_title":"Software Engineer at Padlet","author_image_url":"https://avatars2.githubusercontent.com/u/13582874","tags":["book-review","software-engineering","software-architecture"]},"unlisted":false,"nextItem":{"title":"Integrating PostHog product analytics with Docusaurus v2 on GitHub Pages","permalink":"/blog/docusaurus-posthog"}},"content":"Picking up this book was one of the best decisions I made for my fledgling software engineering career. Its insights enabled me to make well-reasoned software design decisions, and confidently communicate them, in spite of my relative professional inexperience. Given how helpful it has been, I\u2019m here today to share more about the impression it has left on me, and convince you that it is a must-read if you are a software engineer.\\n\\n\x3c!--truncate--\x3e\\n\\n![Designing Data-Intensive Applications](/img/blog/ddia.png)\\n\\nI kickstarted my engineering career back in January 2021, as a full stack engineer at [Padlet](https://padlet.com/). During the onboarding process, my (amazing) mentor, Brian, imparted a great deal of guidance to me. One of his tips was that I should take a look at Kleppman\u2019s [Designing Data-Intensive Applications](https://dataintensive.net/). Thankfully, we had two copies of the book in the office, purchased by my (also amazing) boss, Shu Yang, who recommended me to read it too. I\u2019m thankful I ended up taking their advice, because I was able to glean so much insights from Kleppman, which happened to be highly applicable to the infrastructure and full stack projects I was developing.\\n\\n> \\"This book should be required reading for software engineers.\\" - Kevin Scott, Chief Technology Officer at Microsoft\\n\\nLike Brian, Shu Yang and Kevin, I now also believe all software engineers working on a distributed, cloud or data-intensive system will greatly benefit from reading the book. It provides the fundamental framework for thinking about these systems, and also the vocabulary to communicate such thoughts. Coupled together, these insights will empower you to make better design decisions and effectively convey them, even if you lack prior experience in the problem domain.\\n\\nKleppman also compared the key fundamental ideas behind the broad range of popular data systems out there today, by discussing their advantages, limitations and trade-offs, rather than diving deep into the intricacies of each tool. This was ideal given that the book\'s objective was to help us choose the right tool for the right occasion, which these characteristics will be more relevant for.\\n\\nIf you lack the time (or will) to pour over the entire book, you should at least check out the opening chapter. In it, Kleppman gives a comprehensive yet succinct overview of what I mentioned above, and provides a clear, detailed explanation of the three key principles in designing data-intensive system architecture: Reliability, Scalability and Maintainability. Just reading this first chapter alone was beneficial to me, as I was now able to better understand and discuss architectural concerns with my team.\\n\\nIf you\'re still not convinced whether to invest your time into this book, you can check out a [summary I\'ve written for the first chapter](/docs/reliable-scalable-maintainable), where I\u2019ve condensed Kleppman\u2019s opening discourse on Reliability, Scalability and Maintainability. I\u2019m certain it\u2019ll provide a glimpse into the many lessons that [Designing Data-Intensive Applications](https://dataintensive.net/) has to share, and if you do read the book, definitely let me know what you think!\\n\\n_Special thanks to [Vanessa Tay](https://www.linkedin.com/in/thebestvanessatay) for editing this!_"},{"id":"docusaurus-posthog","metadata":{"permalink":"/blog/docusaurus-posthog","editUrl":"https://github.com/DigiPie/kaya-folio/tree/main/website/blog/2021-06-26-docusaurus-posthog-analytics.md","source":"@site/blog/2021-06-26-docusaurus-posthog-analytics.md","title":"Integrating PostHog product analytics with Docusaurus v2 on GitHub Pages","description":"I integrated PostHog analytics into this website today. I decided to do so after reading Gergely Orosz\'s Stats page on his blog The Pragmatic Engineer. He had installed Plausible analytics and made his analytics dashboard public. I thought that was cool and wanted to do the same.","date":"2021-06-26T00:00:00.000Z","formattedDate":"June 26, 2021","tags":[{"label":"docusaurus","permalink":"/blog/tags/docusaurus"},{"label":"posthog","permalink":"/blog/tags/posthog"},{"label":"analytics","permalink":"/blog/tags/analytics"}],"readingTime":3.15,"hasTruncateMarker":true,"authors":[{"name":"Evan Tay","title":"Software Engineer at Padlet","url":"https://github.com/DigiPie","imageURL":"https://avatars2.githubusercontent.com/u/13582874"}],"frontMatter":{"slug":"docusaurus-posthog","title":"Integrating PostHog product analytics with Docusaurus v2 on GitHub Pages","author":"Evan Tay","author_url":"https://github.com/DigiPie","author_title":"Software Engineer at Padlet","author_image_url":"https://avatars2.githubusercontent.com/u/13582874","tags":["docusaurus","posthog","analytics"]},"unlisted":false,"prevItem":{"title":"Why every Software Engineer should read Designing Data-Intensive Applications","permalink":"/blog/why-you-should-read-ddia"},"nextItem":{"title":"Top 3 reasons why you should start investing with StashAway today!","permalink":"/blog/stashaway"}},"content":"I integrated [PostHog](https://posthog.com/) analytics into this website today. I decided to do so after reading Gergely Orosz\'s [Stats](https://blog.pragmaticengineer.com/stats/) page on his blog [The Pragmatic Engineer](https://blog.pragmaticengineer.com/). He had installed [Plausible](https://plausible.io/) analytics and made his [analytics dashboard](https://plausible.io/blog.pragmaticengineer.com?period=6mo) public. I thought that was cool and wanted to do the same.\\n\\nI managed to find a [Plausible plugin](https://github.com/infracost/docusaurus-plugin-plausible) for [Docusaurus v2](https://docusaurus.io/), which is what this website runs on. But I decided to use [PostHog](https://posthog.com/) instead. It also has a [Docusaurus plugin](https://github.com/PostHog/posthog-docusaurus) and a public dashboard feature. I decided so because it is free and Plausible isn\'t.\\n\\n\x3c!--truncate--\x3e\\n\\nPlausible only offers a free 30-day trial, and would cost at least $6 monthly subsequently. In comparison, PostHog has a free non-expiring tier which provides up to 1 million events every month. It also requires no credit card and is completely self-serve. There was no need to request and wait for a free license. It took me less than 10 minutes from signing up to getting the analytics running.\\n\\n:::info PostHog is open-source\\n\\nIf you are looking for an open-source solution you can self-host, PostHog may be it.\\n\\n:::\\n\\nDespite what I have shared so far, I would still choose Plausible over PostHog if the former was free too. That\'s because the Plausible\'s dashboard interface looks much better and has more visualization options. For comparison, you can view the [PostHog dashboard](https://app.posthog.com/shared_dashboard/OpHsSFokK2VvhHFF-5Jn0rgVzqaMRg) for this site, and the [Plausible dashboard](https://plausible.io/blog.pragmaticengineer.com?period=6mo) for [The Pragmatic Engineer](https://blog.pragmaticengineer.com/).\\n\\nIf you want to integrate PostHog with your Docusaurus site, you can follow the guide below. The later steps are for deployment to GitHub Pages via GitHub Actions. But you can easily modify them for other platforms and deployment workflows. I will give some tips for doing that.\\n\\n## Installation Guide\\n\\n1. Sign up for **PostHog Cloud** on [posthog.com](https://posthog.com/).\\n1. Get your **Project API Key** from [Project Settings](https://app.posthog.com/project/settings).\\n ![PostHog Project API Key](/img/blog/posthog_api_key.png)\\n\\n1. Install the `posthog-docusaurus` package by running this command at your Docusaurus project root:\\n\\n ```zsh\\n yarn add posthog-docusaurus\\n ```\\n\\n or\\n\\n ```zsh\\n npm install --save posthog-docusaurus\\n ```\\n\\n1. Add this code block to `docusaurus.config.js`:\\n\\n ```js\\n module.exports = {\\n plugins: [\\"posthog-docusaurus\\"],\\n themeConfig: {\\n posthog: {\\n apiKey: process.env.POSTHOG_API_KEY || \\"DEV\\",\\n appUrl: \\"https://app.posthog.com\\", // optional\\n enableInDevelopment: false, // optional\\n },\\n },\\n };\\n ```\\n\\n :::note\\n\\n The example in the official PostHog guide for [Docusaurus v2 Integration](https://posthog.com/docs/libraries/docusaurus) inserts the API key directly into the code (e.g. `apiKey: \\"phc_fakekeyhHBZOuIq\\"`). It is a bad idea to do so, especially if you host your code publicly (i.e. on a GitHub public repo). It is good practice to keep API keys secret and outside of application code instead. We will be using [GitHub Encrypted Secrets](https://docs.github.com/en/actions/reference/encrypted-secrets) to achieve that.\\n\\n :::\\n\\n1. Add a **repository secret** to the GitHub repo hosting your site\'s code.\\n ![GitHub Action Secrets](/img/blog/posthog_actions_secrets.png)\\n\\n **Settings** > **Secrets** > **New repository secret** > **Name:** `POSTHOG_API_KEY`\\n\\n :::tip If you are using another deployment platform\\n\\n There should be a settings panel which allows you to specify environment variables or secrets to insert into your application deployments securely. Put your `POSTHOG_API_KEY` there. Skip the next step.\\n\\n :::\\n\\n1. Open the GitHub Action workflow file responsible for deploying your site, and add the environment variable `POSTHOG_API_KEY` to the Docusaurus build step:\\n\\n ```yml\\n env:\\n POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }}\\n ```\\n\\n Example:\\n\\n ```yml\\n # Install and build Docusaurus website\\n - name: Build Docusaurus website\\n run: |\\n cd website\\n npm install \\n npm run build\\n env:\\n POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }}\\n ```\\n\\nThat\'s it! Once you deploy your new changes, the plugin will automatically start tracking pageviews, clicks and more. For more customisation options, you can check out the [posthog-docusaurus](https://github.com/PostHog/posthog-docusaurus) plugin repo and the PostHog guide for [Docusaurus v2 Integration](https://posthog.com/docs/libraries/docusaurus). You can also check out the [commit](https://github.com/DigiPie/kaya-folio/commit/fd6b029dbc0be34909cd539f2d33bac5de8209bc) I made to integrate PostHog into this website.\\n\\nIf you want to deploy Docusaurus to GitHub Pages, check out my post on [GitHub Action for Docusaurus](2021-01-17-docusaurus-gh-action.md)."},{"id":"stashaway","metadata":{"permalink":"/blog/stashaway","editUrl":"https://github.com/DigiPie/kaya-folio/tree/main/website/blog/2021-03-11-stashaway.md","source":"@site/blog/2021-03-11-stashaway.md","title":"Top 3 reasons why you should start investing with StashAway today!","description":"This article was posted sometime back in early 2021 and may be outdated. Refer to SingSaver instead for updated information.","date":"2021-03-11T00:00:00.000Z","formattedDate":"March 11, 2021","tags":[{"label":"investing","permalink":"/blog/tags/investing"},{"label":"sharing","permalink":"/blog/tags/sharing"}],"readingTime":4.47,"hasTruncateMarker":true,"authors":[{"name":"Evan Tay","title":"Wage Slave","url":"https://github.com/DigiPie","imageURL":"https://avatars2.githubusercontent.com/u/13582874"}],"frontMatter":{"slug":"stashaway","title":"Top 3 reasons why you should start investing with StashAway today!","author":"Evan Tay","author_url":"https://github.com/DigiPie","author_title":"Wage Slave","author_image_url":"https://avatars2.githubusercontent.com/u/13582874","tags":["investing","sharing"]},"unlisted":false,"prevItem":{"title":"Integrating PostHog product analytics with Docusaurus v2 on GitHub Pages","permalink":"/blog/docusaurus-posthog"},"nextItem":{"title":"GitHub Action for Docusaurus","permalink":"/blog/docusaurus-gh-action"}},"content":":::caution Deprecated\\n\\nThis article was posted sometime back in early 2021 and may be outdated. Refer to [SingSaver](https://www.singsaver.com.sg/investments/robo-advisory) instead for updated information.\\n\\n:::\\n\\n:::note Disclaimer\\n\\nThis post is not sponsored, and does not constitute financial advice of any form (I bet you know better than me). Read at your own discretion.\\n\\n:::\\n\\nSigning up on [StashAway](https://www.stashaway.sg/referrals/tayegd) (a [robo-advisor platform](https://blog.moneysmart.sg/invest/robo-advisors-singapore/#what-are-robo-advisors)) back in the early 2020s was the first step in taking control of my financial health. Before that, 100% of my cash was just sitting in a POSB Savings account, growing at an incredibly pointless rate of [0.05% per annum](https://www.dbs.com.sg/personal/rates-online/deposit-rates.page). I might as well have kept the money under my mattress.\\n\\n\x3c!--truncate--\x3e\\n\\n## Backstory\\n\\nI was hesitant to invest for years because I used to think any form of investment was risky. Like ~~most~~ some Singaporeans, I ~~am~~ was [_kiasi_](http://www.singlishdictionary.com/). I was afraid of the unknown. What eventually changed my mind was chancing upon this article: [_The big problem (of) playing it too safe with money in our 20s_](https://thewokesalaryman.com/2020/10/16/the-big-problem-playing-it-too-safe-with-money-in-our-20s/) by _thewokesalaryman_, and the following quote:\\n\\n:::tip Quote of the Day\\n\\nIronically, by not taking any risks and letting all your money get eroded by certain inflation, you are actually doing the riskiest thing.\\n\\n:::\\n\\nThis quote was the wake-up call for me to start investing, and could be yours too if you are someone who is privileged enough to start doing the same (i.e. you have the financial ability to buy bubble tea at least once a week).\\n\\n![Milksha\'s Bubble Tea](/img/blog/bubbletea.jpg)\\n\\n_Photo by my bubble-tea buddy Elsie Lee_ \\n**Pictured (from left):** Milksha\'s Fresh Milk, and Izumo Matcha Milk with Honey Pearls \\n**Is Milksha a buy?** Milksha isn\'t cheap by any stretch but you can\'t put a price tag on happiness :star:\\n\\n:::tip Pro Tip from fellow bubble-tea enthusiast Freda\\n\\nBuy Milksha coupons from Shopee beforehand to get massive discounts!\\n\\n:::\\n\\nAnyhow, I reasoned the best way to kick-start my investment journey would be with a robo-advisor platform, given how beginner-friendly it is, how low the commission fees are, and ~~how lazy I am~~ given the passive and minimal-effort investment a robo-advisor offers.\\n\\nYou can check out this [page](https://dollarsandsense.sg/robo-advisors-in-singapore-what-you-need-to-know-before-investing/) by _dollarsandsense_ giving an introduction to robo-advisors for more reasons why you should or should not invest with a robo-advisor platform.\\n\\nI ended up choosing StashAway as my platform of choice, and here are the top 3 reasons why!\\n\\n## 1. StashAway\'s all-star C-suite\\n\\nStashAway is led by an \\"Expert Investment Team\\" (their words not mine) made up of the following co-founders:\\n\\n- Chief Executive Officer Michele Ferrario, a former CEO of [Zalora Group](https://www.zalora.sg/about/) and the co-founder of [Rocket Internet](https://www.rocket-internet.com/)\\n- Chief Investment Officer Freddy Lim, a former Managing Director and Global Head of Derivatives Strategy at [Nomura](https://www.nomura.com/)\\n- Chief Technology Officer Nino Ulsamer, the co-founder and former CTO of a now-defunct (oops) software solution company for e-commerce analytics\\n\\nThese guys have real, solid credentials. They are far more experienced in investing than an amateur like me (surprise surprise), and this assured me that my investments in StashAway would be handled by well-informed and secure hands.\\n\\nCredentials aside, they also have a proven track record of high returns for most of their portfolios. Despite how volatile and uncertain 2020 was, I achieved an **impressive 19.59% [time-weighted return](https://www.investopedia.com/terms/t/time-weightedror.asp)** for my portfolio of [StashAway Risk Index](https://www.stashaway.sg/r/what-is-the-stashaway-risk-index) 22%, between 3rd of February 2020, and 10th of March, 2021.\\n\\n![Evan\'s StashAway returns](/img/blog/stashaway_returns.png)\\n\\nTo find out how well StashAway\'s portfolios performed at other risk-levels, check out their article: [_Our Returns in 2020_](https://www.stashaway.my/r/our-returns-2020).\\n\\n## 2. No minimum amount at all\\n\\nAnother robo-advisor platform I was considering at the time was [EndowUs](https://endowus.com/). However, I ultimately went with StashAway because while EndowUs had a minimum investment amount of $10,000.00 (added cents for emphasis), **StashAway had no minimum amount at all**. This is still the case as of 11 March 2021.\\n\\nAs someone new to investing, the decision to invest $10,000 all at once was too intimidating for me to make. More importantly, I was still a student back then, one who did not have that many digits in his bank account. Therefore, StashAway was a natural choice for its low entry barrier!\\n\\n## 3. My money is safe\\n\\nNaturally, I was concerned about how safe using StashAway would be. More specifically, I was worried about losing my initial investment of $100 in StashAway, in the event of StashAway filing for bankruptcy. As it turned out, it was an unfound concern given that:\\n\\n:::note Quote\\n\\nYour money is kept entirely separate from StashAway\'s finances. To ensure that we never touch your money, we use custodian banks that hold your money, whether it\'s in cash or in securities.\\n\\nIn these custodian institutions, your assets are always in a segregated account-- one that is separate from StashAway\'s operations and assets. This means that you will always have full access and claim to your assets no matter what happens to StashAway.\\n\\n:::\\n\\nYou can read more about StashAway\'s Frequently Asked Questions [here](https://www.stashaway.sg/faq/115003747047-what-happens-to-my-money-if-stashaway-gets-acquired-goes-public-or-closes). Do your own research _hor_!\\n\\n## Closing note\\n\\nI hope you found this post/rambling/_thing_ (\\\\*gestures wildly at everything) insightful in any way. If you are still interested in StashAway, but not entirely convinced by me (I\u2019ll try not to take it personally), you can check out this [video](https://www.youtube.com/watch?v=0IvyrANMz78) by _Kevin Learns Investing_. All the best with getting financially fit!\\n\\n_Special thanks to Vanessa Tay for editing this!_"},{"id":"docusaurus-gh-action","metadata":{"permalink":"/blog/docusaurus-gh-action","editUrl":"https://github.com/DigiPie/kaya-folio/tree/main/website/blog/2021-01-17-docusaurus-gh-action.md","source":"@site/blog/2021-01-17-docusaurus-gh-action.md","title":"GitHub Action for Docusaurus","description":"I got tired of deploying my Docusaurus website to GitHub Pages manually, and decided to do something about it using GitHub Action.","date":"2021-01-17T00:00:00.000Z","formattedDate":"January 17, 2021","tags":[{"label":"docusaurus","permalink":"/blog/tags/docusaurus"},{"label":"github-action","permalink":"/blog/tags/github-action"},{"label":"ci","permalink":"/blog/tags/ci"}],"readingTime":1.54,"hasTruncateMarker":true,"authors":[{"name":"Evan Tay","title":"Software Engineer at Padlet","url":"https://github.com/DigiPie","imageURL":"https://avatars2.githubusercontent.com/u/13582874"}],"frontMatter":{"slug":"docusaurus-gh-action","title":"GitHub Action for Docusaurus","author":"Evan Tay","author_url":"https://github.com/DigiPie","author_title":"Software Engineer at Padlet","author_image_url":"https://avatars2.githubusercontent.com/u/13582874","tags":["docusaurus","github-action","ci"]},"unlisted":false,"prevItem":{"title":"Top 3 reasons why you should start investing with StashAway today!","permalink":"/blog/stashaway"},"nextItem":{"title":"History of EvanTay.com","permalink":"/blog/history"}},"content":"I got tired of deploying my Docusaurus website to GitHub Pages manually, and decided to do something about it using GitHub Action.\\n\\nInitially, I was planning to follow the [official guide](https://v2.docusaurus.io/docs/deployment#triggering-deployment-with-github-actions) on doing so. However, it was actually much more complicated than I liked. I did not really want to generate and store a SSH key on GitHub. Too much effort man.\\n\\nI decided it was better off for me to write my own script. Here it is:\\n\\n\x3c!--truncate--\x3e\\n\\n## deploy-docusaurus.yml\\n\\n:::caution\\n\\nThe script below assumes that your Docusaurus website resides at `/website` of your repo. If that is not the case for you, you will need to:\\n\\n- Change `cd website` to `cd <docu_site_root>`, or delete the entire line if your Docusaurus website is at the root of your repo `/`\\n- Change `build_dir`\'s value from `website/build` to `<docu_site_root>/build`, or `build` if your Docusaurus website is at the root of your repo `/`\\n\\n:::\\n\\n```yml\\nname: deploy-docusaurus\\n\\non:\\n push:\\n branches: [main]\\n pull_request:\\n branches: [main]\\n\\n # Allows you to run this workflow manually from the Actions tab\\n workflow_dispatch:\\n\\n# A workflow run is made up of one or more jobs that can run sequentially or in parallel\\njobs:\\n publish:\\n runs-on: ubuntu-latest\\n steps:\\n # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it\\n - name: Check out repo\\n uses: actions/checkout@v2\\n # Node is required for npm\\n - name: Set up Node\\n uses: actions/setup-node@v2\\n with:\\n node-version: \\"12\\"\\n # Install and build Docusaurus website\\n - name: Build Docusaurus website\\n run: |\\n cd website\\n npm install \\n npm run build\\n - name: Deploy to GitHub Pages\\n if: success()\\n uses: crazy-max/ghaction-github-pages@v2\\n with:\\n target_branch: gh-pages\\n build_dir: website/build\\n env:\\n GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\\n```\\n\\n:::note\\n\\nGitHub will automatically add `GITHUB_TOKEN` to Secrets. You need not do so. See [this](https://docs.github.com/en/actions/reference/authentication-in-a-workflow) for more information.\\n\\n:::\\n\\nTo see this script in action, visit my [personal website repo](https://github.com/DigiPie/kaya-folio/actions)."},{"id":"history","metadata":{"permalink":"/blog/history","editUrl":"https://github.com/DigiPie/kaya-folio/tree/main/website/blog/2020-12-21-history.md","source":"@site/blog/2020-12-21-history.md","title":"History of EvanTay.com","description":"_Established in 2013_","date":"2020-12-21T00:00:00.000Z","formattedDate":"December 21, 2020","tags":[{"label":"sharing","permalink":"/blog/tags/sharing"}],"readingTime":2.535,"hasTruncateMarker":true,"authors":[{"name":"Evan Tay","title":"Final year Computer Science major at NUS","url":"https://github.com/DigiPie","imageURL":"https://avatars2.githubusercontent.com/u/13582874"}],"frontMatter":{"slug":"history","title":"History of EvanTay.com","author":"Evan Tay","author_url":"https://github.com/DigiPie","author_title":"Final year Computer Science major at NUS","author_image_url":"https://avatars2.githubusercontent.com/u/13582874","tags":["sharing"]},"unlisted":false,"prevItem":{"title":"GitHub Action for Docusaurus","permalink":"/blog/docusaurus-gh-action"},"nextItem":{"title":"STACK 2020 Developers Conference","permalink":"/blog/stack-2020"}},"content":"**_Established in 2013_**\\n\\nI first bought my personal domain [www.evantay.com](https://www.evantay.com) way back in 2013. Younger me thought it would be cool and fun to run my own website, and it still is. :sunglasses:\\n\\nTo be honest, I can\'t even remember what my very first website looked like, but I am quite sure it was built using vanilla HTML and CSS, something unthinkable in this day and age.\\n\\n\x3c!--truncate--\x3e\\n\\n**_Move to Grav CMS in 2017_**\\n\\nGiven that I was building everything from the ground up, maintainability became problematic. In 2017, older younger me decided it wasn\'t worth the effort to do it myself, and I started shopping for a framework to adopt. I eventually settled on using [Grav](https://getgrav.org/), a flat-file Content Management System (CMS) powered by PHP. I chose it because I was familiar and interested in PHP at the time.\\n\\nTo get started on building my second site quickly, I used a one-page Grav theme [Ceevee](https://github.com/getgrav/grav-theme-ceevee).\\n\\n![Ceevee](/img/blog/ceevee.png)\\n\\nHowever, I still wanted to add my personal touch to my portfolio website. This led me to heavily modifying the theme numerous times over the years, from 2017 up until 2020. It was a really fun journey while it lasted.\\n\\n![EvanTay.com v1 site](/img/blog/evantay_v1.png)\\n\\n**_Move to Cloud in 2017_**\\n\\nAbout the same time, I also moved from using a website host to [DigitalOcean](https://digitalocean.com). I hosted my website on the cheapest droplet (VM) I could find (the 5 bucks one). I ran CentOS on the VM, and used an [Nginx](https://www.nginx.com/) web server to serve the Grav website. Pretty old-school right?\\n\\n**_Start of DigiDocs in 2019_**\\n\\nLast year, during January 2019, I also started working on a separate pet project called [DigiDocs](https://digipie.github.io/digidocs/), my personal documentation website. I was motivated to do so because I wanted to consolidate useful knowledge gained from attending university classes, and my own self-directed learning. I kept the site updated up until October 2020.\\n\\nBack then, [DigiDocs](https://digipie.github.io/digidocs/) lived at [www.evantay.com/docs](https://www.evantay.com/docs/), and was served by the same Nginx server which served my main portfolio website.\\n\\n**_Move to Docusaurus v2 in 2020_**\\n\\nMore recently, in October 2020, I decided to replace both documentation and portfolio site with a single [Docusaurus v2](https://v2.docusaurus.io/) website (which you\'re looking at right now).\\n\\nI did so because I wanted to:\\n\\n1. **Keep up with the latest technologies**: I wanted to learn more about [Docusaurus v2](https://v2.docusaurus.io/) and also [ReactJS](https://reactjs.org/), which is what Docusaurus is built upon. It was about time to move on from PHP.\\n1. **Reduce operating costs by moving from a dynamic to static website** :money_with_wings: : Given that all of my content are static, it did not make sense that I was using a dynamic PHP site generator such as [Grav](https://getgrav.org/). By moving to a static website, I will be able to host my site at a cheaper cost or even for free! I am planning to achieve the latter by using [GitHub pages](https://pages.github.com/).\\n\\nSo far, the experience of using [Docusaurus v2](https://v2.docusaurus.io/) has been great! I am glad I started on this migration journey, despite feeling sentimental about my old portfolio and documentation websites."},{"id":"stack-2020","metadata":{"permalink":"/blog/stack-2020","editUrl":"https://github.com/DigiPie/kaya-folio/tree/main/website/blog/2020-12-03-stack-conference.md","source":"@site/blog/2020-12-03-stack-conference.md","title":"STACK 2020 Developers Conference","description":"STACK 2020 Developers Conference is GovTech\u2019s flagship conference and the largest government-led developers event in Singapore that connects government, industry and the tech community.","date":"2020-12-03T00:00:00.000Z","formattedDate":"December 3, 2020","tags":[{"label":"conference","permalink":"/blog/tags/conference"},{"label":"cloud","permalink":"/blog/tags/cloud"},{"label":"microservices","permalink":"/blog/tags/microservices"},{"label":"GovTechSTACK","permalink":"/blog/tags/gov-tech-stack"}],"readingTime":7.07,"hasTruncateMarker":true,"authors":[{"name":"Evan Tay","title":"Final year Computer Science major at NUS","url":"https://github.com/DigiPie","imageURL":"https://avatars2.githubusercontent.com/u/13582874"}],"frontMatter":{"slug":"stack-2020","title":"STACK 2020 Developers Conference","author":"Evan Tay","author_url":"https://github.com/DigiPie","author_title":"Final year Computer Science major at NUS","author_image_url":"https://avatars2.githubusercontent.com/u/13582874","tags":["conference","cloud","microservices","GovTechSTACK"]},"unlisted":false,"prevItem":{"title":"History of EvanTay.com","permalink":"/blog/history"}},"content":"[STACK 2020 Developers Conference](https://www.stack.gov.sg/) is GovTech\u2019s flagship conference and the largest government-led developers event in Singapore that connects government, industry and the tech community.\\n\\nIn this post, you will find my key takeaways for some of the sessions I attended during the conference. I chose to attend these sessions based on my interests in Cloud and Microservices.\\n\\n\x3c!--truncate--\x3e\\n\\n**Day 1:**\\n\\n- **[Opening note](#opening-note)** by Dr. Vivian Balakrishnan: Minister-in-charge of Smart Nation Programme Office and Chan Cheow Hoe: Government Chief Digital Technology Officer\\n- **[Rethink, Reinvent, Rebuild](#rethink-reinvent-rebuild)** by Jeff Barr: Vice President & Chief Evangelist at Amazon Web Services\\n- **[Seeding the Cloud: Engineering Solutions for Cloud Adoption](#seeding-the-cloud-engineering-solutions-for-cloud-adoption)** by Hunter Nield: Distinguished Engineer at GovTech\\n- **[Six Principles for Refactoring a Monolith to Microservices](#six-principles-for-refactoring-a-monolith-to-microservices)** by Chris Richardson: Architect at Eventuate, Inc\\n\\n**Day 2:**\\n\\n- **[You Won\u2019t BELIEVE This HACK to Improve Your Technical Communication!](#you-wont-believe-this-hack-to-improve-your-technical-communication)** by Nikhil Choudhary: Software Engineer at Open Government Products\\n- **[DevOps: Cloud and Back Again](#devops-cloud-and-back-again)** by Mitchell Hashimoto: Co-Founder and CTO at HashiCorp\\n\\n## Opening note\\n\\n**Speaker(s)**\\n\\n- [Dr. Vivian Balakrishnan](http://vivian.balakrishnan.sg/): Minister-in-charge of Smart Nation Programme Office\\n- [Chan Cheow Hoe](https://www.linkedin.com/in/cheow-hoe-chan-92646215/): Government Chief Digital Technology Officer\\n\\n**Key takeaways**\\n\\nThe government believes openness is the way to building a smart nation.\\n\\nOn that note, they believe in:\\n\\n- Adopting the best solutions there are, including those from the industry, instead of doing everything in-house\\n - [Government Commercial Cloud](https://www.developer.tech.gov.sg/technologies/infrastructure-and-hosting/government-commercial-cloud): AWS, Azure, GCP\\n- Collaborating with industry developers via open-source\\n - [Singapore Government Developer Portal](https://www.developer.tech.gov.sg/): Collaboration platform for government and industry developers\\n- Providing transparency to citizens and industry professionals\\n - [TraceTogether](https://www.tracetogether.gov.sg/): Transparent and open collaboration with the industry\\n\\n## Rethink, Reinvent, Rebuild\\n\\n**Speaker(s)**\\n\\n- [Jeff Barr](https://www.linkedin.com/in/jeffbarr/): Vice President & Chief Evangelist at Amazon Web Services\\n\\n**Key takeaways**\\n\\n- **Rethink** - Take a good look at where we are\\n - Everything has changed due to COVID-19, Quarantine, WFH\\n - No firm ground and constants are now variables\\n - People are more receptive to change and invention right now\\n - Good time for innovation and progress\\n- **Reinvent** - Solve challenges in a new way\\n - Dream big dreams, address these challenges, change the world\\n - Share what you learn to reinforce what you learned\\n - Content creation / video streaming possibilities\\n- **Rebuild** - Put what you have learned to work\\n - Take what you learn, do something awesome, and remember to share it!\\n\\n## Seeding the Cloud: Engineering Solutions for Cloud Adoption\\n\\n**Speaker(s)**\\n\\n- [Hunter Nield](https://www.linkedin.com/in/hunter/?originalSubdomain=sg): Distinguished Engineer at GovTech\\n\\n**Key takeaways**\\n\\nHunter shared about how GovTech uses Infrastructure-as-Code (IaC) and Policy-as-Code (PaC) to accelerate cloud operations. Read [#devops-cloud-and-back-again](#devops-cloud-and-back-again) by Hashicorp CTO Mitchell for more information.\\n\\n- **Establishing a Landing Zone**\\n - A repeatable configuration across multiple Cloud Service Providers (CSP)\\n - The foundation of any cloud environment at scale\\n - Serves as a consistent platform for governance, onboarding, networking and security\\n- **Accelerating deployment with Infrastructure-as-Code (IaC)**\\n - Code and configuration to provision cloud resources and Landing Zones\\n - Develop common templates for consistency and familiarity\\n - Get feedback on pain points faced by \\"customers\\" while using said templates\\n- **Consistent audit and reporting with Policy-as-Code (PaC)**\\n - Code and configuration to test and validate cloud infrastructure deployed by IaC\\n - Reduce need for manual audits and speed up auditing process\\n\\n## Six Principles for Refactoring a Monolith to Microservices\\n\\n**Speaker(s)**\\n\\n- [Chris Richardson](https://eventuate.io/about.html): Architect at Eventuate, Inc\\n\\n**Key takeaways**\\n\\n:::note Quote\\n\\n\\"A Microservice application is structured as a set of loosely coupled services that can be independently deployed.\\" - Chris Richardson\\n\\n:::\\n\\nChris shared 6 principles to follow when moving from a Monolith to a Microservice architecture.\\n\\nHere are 5 of them :wink: :\\n\\n- Adopt Microservice architecture for the right reasons\\n - Monolith architecture is not necessary bad (an anti-pattern), it has its valid use-cases\\n - Adopt Microservice architecture because it allows you to deliver software rapidly, frequently and sustainability, with small, autonomous teams working on the different microservices\\n- Migrate to Microservice architecture incrementally rather than via Big Bang rewrite\\n - **Strangler Application**: Incrementally migrate functionality from existing Monolith application to new Strangler Microservice application\\n - Extract existing code modules and database tables out into microservices\\n - Implement new features as microservices\\n- Consider Return-on-Investment when deciding which modules to convert into microservices\\n - Consider benefit of decoupling said module\\n - Consider cost of decoupling\\n - How difficult it is to do so\\n - How many inbound dependencies it has\\n - If module A is depended upon by module B, consider extracting module B first\\n- Define the service boundaries correctly\\n - Avoid **Runtime Coupling**\\n - Reduced availability due to reliance of a given microservice on another for serving a given request\\n - For example, microservice A receives an API request which it can only respond to when its own API request to microservice B is answered first\\n - Make microservices as self-contained as possible\\n - Able to respond to a request without making follow-up requests to other microservices\\n - Avoid **Design-Time Coupling**\\n - Similar to [Open-Closed Principle](https://en.wikipedia.org/wiki/Open%E2%80%93closed_principle)\\n - Avoid having to modify other microservices when modifying a given microservice\\n - Must be able to modify or exend a given microservice independently as much as possible\\n - Have small and stable API which hides as much implementation complexity as possible\\n - Hide what you can, not only code but also database schemas, so you can change them without affecting other microservices\\n- Measuring success\\n - Improved metrics: Reduced lead time, deployment frequency, failure rate, etc.\\n - Improvements in other \'-ilities\': Availability, Reliability and Scalability \\n\\n## You Won\u2019t BELIEVE This HACK to Improve Your Technical Communication!\\n\\n**Speaker(s)**\\n\\n- [Nikhil Choudhary](https://www.linkedin.com/in/nikhil-c-513647148/): Software Engineer at Open Government Products\\n\\n**Key takeaways**\\n\\nWhen introducing non-technical folks to coding, keep in mind that the most important objective is to convey understanding of core programming concepts.\\n\\nOn that note, here are some tips Nikhil shared:\\n\\n- Forgo coding best practices if doing so make it easier for the audience to understand\\n - Reduce surface area to increase accessibility, even if it is not good coding practice\\n - Collapse all HTML, JS and CSS into a single file so students can view everything in one place\\n - Collapse all functions into one for the same reason as the previous line\\n - Combine program lines if it makes things clearer\\n- Use real-world examples to explain technical concepts\\n - For example, use a restaurant scenario to explain `async`\\n- Enable students in sharing their joy/achievement\\n - Make deploying their application easy\\n - Can use [Netlify Drop](https://app.netlify.com/drop): Simply drag and drop your HTML, JS, CSS files and Netlify Drop will do the rest for deployments\\n- Practise empathy consciously throughout teaching process to identify ways you can make learning easier for your students\\n\\n## DevOps: Cloud and Back Again\\n\\n**Speaker(s)**\\n\\n- [Mitchell Hashimoto](https://www.linkedin.com/in/mitchellh/): Co-Founder and CTO at HashiCorp\\n\\n**Key takeaways**\\n\\nMitchell shared more about the [Cloud Operating Model](https://www.hashicorp.com/cloud-operating-model) during this session.\\n\\n:::note [Cite](https://www.hashicorp.com/cloud-operating-model)\\n\\n\\"The Cloud Operating Model is a new approach for IT operations that organizations need to use to be successful with cloud adoption and thrive in an era of multi-cloud architecture.\\" - Hashicorp\\n\\n:::\\n\\n| | Static | Dynamic |\\n|-----------|--------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------|\\n| Run | Dedicated infrastructure to run app on | Scheduled automatically across a fleet (e.g. AWS Auto-Scaling Group, Hashicorp Nomad) |\\n| Connect | Host-based, static IP-addressing | Service-based, dynamic IP addresses due to dynamic provisioning |\\n| Secure | High-trust environment which is IP-address-based, with clear network perimeter | Low-trust environment with no clear perimeter given multi-tenancy and nature of the Cloud |\\n| Provision | Dedicated resources - Physical servers, routers and switches | Capacity on-demand, provision VMs, Containers and other managed services, or simply use Serverless services |\\n\\n- Infrastructure operations on the Cloud must follow the Dynamic Cloud Operating Model fully\\n - Pointless if you provision infrastructure in minutes using Infrastructure-as-Code (IaC), but still manually handle connectivity and security review using tickets\\n - Have to adopt dynamic cloud operating tools for all 4 layers\\n- Why use IaC for provisioning\\n - Split Execution from Definition\\n - Execution can be automated and carried out via API, UI or automatically through Continuous-Integration (CI) tools\\n- How can teams use IaC\\n - Operations team still necessary, focus on creating and improving blueprints and handling edge-cases when doing so\\n - Development team creates infrastructure in a self-service manner, using the blueprints created by the Operations team\\nseparating buzz words from crucial tech\\n\\nRead up on Hashicorp\'s white paper on [Cloud Operating Model](https://www.hashicorp.com/cloud-operating-model) for more information."}]}')}}]); \ No newline at end of file diff --git a/assets/js/b34035b6.50f8bcf2.js b/assets/js/b34035b6.50f8bcf2.js new file mode 100644 index 00000000..3c80339d --- /dev/null +++ b/assets/js/b34035b6.50f8bcf2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[4776],{6752:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/posthog","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/b4d628d3.fb33a989.js b/assets/js/b4d628d3.fb33a989.js new file mode 100644 index 00000000..1e765af5 --- /dev/null +++ b/assets/js/b4d628d3.fb33a989.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[6764],{3080:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/software-architecture","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/b99b6768.f7c9ceec.js b/assets/js/b99b6768.f7c9ceec.js new file mode 100644 index 00000000..7f065cb6 --- /dev/null +++ b/assets/js/b99b6768.f7c9ceec.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[7464],{1364:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>r,contentTitle:()=>c,default:()=>h,frontMatter:()=>a,metadata:()=>l,toc:()=>o});var t=i(7624),s=i(2172);const a={title:"Scaling Memcached"},c=void 0,l={id:"scaling-memcached",title:"Scaling Memcached",description:"Published on April 14, 2021",source:"@site/docs/scaling-memcached.md",sourceDirName:".",slug:"/scaling-memcached",permalink:"/docs/scaling-memcached",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{title:"Scaling Memcached"},sidebar:"docs",previous:{title:"Reading List",permalink:"/docs/reading-list"},next:{title:"Reliable, Scalable, and Maintainable Applications",permalink:"/docs/reliable-scalable-maintainable"}},r={},o=[{value:"Context",id:"context",level:2},{value:"Key takeaways",id:"key-takeaways",level:2},{value:"References",id:"references",level:2}];function d(e){const n={a:"a",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.M)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Published on April 14, 2021"}),"\n",(0,t.jsxs)(n.p,{children:["Article review for ",(0,t.jsx)(n.a,{href:"https://levelup.gitconnected.com/lessons-learnt-from-scaling-memcached-in-production-86778ab616c7",children:"Melodies Sim's Medium Article: Lessons Learnt from Scaling Memcached in Production"})]}),"\n",(0,t.jsx)(n.h2,{id:"context",children:"Context"}),"\n",(0,t.jsx)(n.p,{children:"Memcached is a(n):"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["In-memory cache typically used for look-aside caching","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Look-aside versus look-through caching: see slides 14 and 15 of ",(0,t.jsx)(n.a,{href:"https://www.cs.princeton.edu/courses/archive/fall19/cos316/lectures/08-caching.pdf",children:"Princeton COS 316 Intro to Caching"})]}),"\n",(0,t.jsx)(n.li,{children:"Look-aside caching: client requests item from backing store (database) on cache miss; simpler implementation, more flexible, slower on misses"}),"\n",(0,t.jsx)(n.li,{children:"Look-through caching: cache requests item from backing store on cache miss; harder implementation, less flexible, better consistency"}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.li,{children:"Simple implementation without built-in high availability features"}),"\n",(0,t.jsx)(n.li,{children:"Used by planet-scale companies such as Facebook and Twitter"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"The article discusses strategies for building caches with high availability and strong data consistency."}),"\n",(0,t.jsx)(n.h2,{id:"key-takeaways",children:"Key takeaways"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://sites.cs.ucsb.edu/~agrawal/fall2009/dynamo.pdf",children:"Trade-off between ACID (C stands for consistency) properties and availability"})}),"\n",(0,t.jsxs)(n.li,{children:["Memcached can be used as Authoritative Storage via Remote Marker mechanism","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Mechanism used to minimize probability of reading stale data in DB replicas"}),"\n",(0,t.jsx)(n.li,{children:"When the client writes to the master DB, there is a replication delay between it and its replicas"}),"\n",(0,t.jsx)(n.li,{children:"The client will write a marker to Memcached after writing to the master DB"}),"\n",(0,t.jsx)(n.li,{children:"Marker will have a short TTL - duration depending on DB replication delay"}),"\n",(0,t.jsx)(n.li,{children:"If marker exists, read from the master DB; otherwise read from DB replica"}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Writes are not idempotent nor commutative; deletes are."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["If we write to DB then write to cache naively, race conditions will arise when there are concurrent writes as writes are non-commutative","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Leads to infinitely stale data given writes and no eventual data consistency"}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["To avoid this issue, use delete instead: after writing to DB, do cache invalidation by deleting the data item from the cache","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Multiple deletes sent to the cache would not matter as you can only delete something once; ordering of delete doesn't matter too"}),"\n",(0,t.jsx)(n.li,{children:"Client will fetch the data item from the database on cache miss and update the most recent value to Memcached instead"}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["There is still a small risk of stale data, if a delete occurs between a cache read and set (see Melodies's article for illustration)","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Facebook deals with it using a check-and-set approach via a lease mechanism"}),"\n",(0,t.jsx)(n.li,{children:"On cache miss, client receives a lease token for the requested key"}),"\n",(0,t.jsx)(n.li,{children:"On cache set, client verifies the lease token before setting the key"}),"\n",(0,t.jsx)(n.li,{children:"If Memcached receive a delete request for the key, the lease is invalidated"}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"references",children:"References"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://levelup.gitconnected.com/lessons-learnt-from-scaling-memcached-in-production-86778ab616c7",children:"Melodies Sim's Medium Article: Lessons Learnt from Scaling Memcached in Production"})," - good introduction to Memcached in Production, has more references"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://research.fb.com/wp-content/uploads/2016/11/scaling-memcache-at-facebook.pdf",children:"Scaling Memcache at Facebook"})," - the paper the article was based upon"]}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://www.cs.princeton.edu/courses/archive/fall19/cos316/lectures/08-caching.pdf",children:"Princeton COS 316 Intro to Caching"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://sites.cs.ucsb.edu/~agrawal/fall2009/dynamo.pdf",children:"Dynamo: Amazon\u2019s Highly Available Key-value Store"})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.M)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},2172:(e,n,i)=>{i.d(n,{I:()=>l,M:()=>c});var t=i(1504);const s={},a=t.createContext(s);function c(e){const n=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),t.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c0b1fc1a.302f7e9c.js b/assets/js/c0b1fc1a.302f7e9c.js new file mode 100644 index 00000000..58cd6285 --- /dev/null +++ b/assets/js/c0b1fc1a.302f7e9c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[9060],{5872:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>s,default:()=>m,frontMatter:()=>a,metadata:()=>c,toc:()=>l});var o=n(7624),r=n(2172);const a={slug:"stack-2020",title:"STACK 2020 Developers Conference",author:"Evan Tay",author_url:"https://github.com/DigiPie",author_title:"Final year Computer Science major at NUS",author_image_url:"https://avatars2.githubusercontent.com/u/13582874",tags:["conference","cloud","microservices","GovTechSTACK"]},s=void 0,c={permalink:"/blog/stack-2020",editUrl:"https://github.com/DigiPie/kaya-folio/tree/main/website/blog/2020-12-03-stack-conference.md",source:"@site/blog/2020-12-03-stack-conference.md",title:"STACK 2020 Developers Conference",description:"STACK 2020 Developers Conference is GovTech\u2019s flagship conference and the largest government-led developers event in Singapore that connects government, industry and the tech community.",date:"2020-12-03T00:00:00.000Z",formattedDate:"December 3, 2020",tags:[{label:"conference",permalink:"/blog/tags/conference"},{label:"cloud",permalink:"/blog/tags/cloud"},{label:"microservices",permalink:"/blog/tags/microservices"},{label:"GovTechSTACK",permalink:"/blog/tags/gov-tech-stack"}],readingTime:7.07,hasTruncateMarker:!0,authors:[{name:"Evan Tay",title:"Final year Computer Science major at NUS",url:"https://github.com/DigiPie",imageURL:"https://avatars2.githubusercontent.com/u/13582874"}],frontMatter:{slug:"stack-2020",title:"STACK 2020 Developers Conference",author:"Evan Tay",author_url:"https://github.com/DigiPie",author_title:"Final year Computer Science major at NUS",author_image_url:"https://avatars2.githubusercontent.com/u/13582874",tags:["conference","cloud","microservices","GovTechSTACK"]},unlisted:!1,prevItem:{title:"History of EvanTay.com",permalink:"/blog/history"}},i={authorsImageUrls:[void 0]},l=[];function u(e){const t={a:"a",p:"p",...(0,r.M)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.a,{href:"https://www.stack.gov.sg/",children:"STACK 2020 Developers Conference"})," is GovTech\u2019s flagship conference and the largest government-led developers event in Singapore that connects government, industry and the tech community."]}),"\n",(0,o.jsx)(t.p,{children:"In this post, you will find my key takeaways for some of the sessions I attended during the conference. I chose to attend these sessions based on my interests in Cloud and Microservices."})]})}function m(e={}){const{wrapper:t}={...(0,r.M)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},2172:(e,t,n)=>{n.d(t,{I:()=>c,M:()=>s});var o=n(1504);const r={},a=o.createContext(r);function s(e){const t=o.useContext(a);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),o.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c4b0cf2f.0db9cb40.js b/assets/js/c4b0cf2f.0db9cb40.js new file mode 100644 index 00000000..5f541e43 --- /dev/null +++ b/assets/js/c4b0cf2f.0db9cb40.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[5144],{7216:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>d,contentTitle:()=>o,default:()=>g,frontMatter:()=>s,metadata:()=>l,toc:()=>c});var t=n(7624),r=n(2172);const s={title:"Git Ignore file"},o=void 0,l={id:"git-ignore-file",title:"Git Ignore file",description:"Published on December 24, 2020",source:"@site/docs/git-ignore-file.md",sourceDirName:".",slug:"/git-ignore-file",permalink:"/docs/git-ignore-file",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{title:"Git Ignore file"},sidebar:"docs",previous:{title:"Git Cheatsheet",permalink:"/docs/git-cheatsheet"},next:{title:"iTerm2 and zsh Setup",permalink:"/docs/iterm2-zsh-setup"}},d={},c=[{value:"Using .gitignore files",id:"using-gitignore-files",level:2},{value:"Using 'git update-index'",id:"using-git-update-index",level:2},{value:"Resources",id:"resources",level:2}];function a(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,r.M)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.p,{children:"Published on December 24, 2020"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsxs)(i.em,{children:["This document was migrated from ",(0,t.jsx)(i.a,{href:"https://digipie.github.io/digidocs/git/ignoring-files/",children:"DigiDocs"})]})}),"\n",(0,t.jsxs)(i.p,{children:["This section covers how to tell Git to ignore certain files and directories by using ",(0,t.jsx)(i.em,{children:".gitignore"})," files or the ",(0,t.jsx)(i.code,{children:"git update-index"})," commands."]}),"\n",(0,t.jsx)(i.admonition,{type:"tip",children:(0,t.jsxs)(i.p,{children:["Basic knowledge of Git is assumed in this tutorial. If you are new to Git, visit ",(0,t.jsx)(i.a,{href:"http://rogerdudler.github.io/git-guide/",children:"http://rogerdudler.github.io/git-guide/"})," to learn the basics first."]})}),"\n",(0,t.jsxs)(i.p,{children:["If you want a certain file or directory to be ignored for the long-term, you should choose to do so using ",(0,t.jsx)(i.em,{children:".gitignore"})," files. Otherwise, if you only want Git to ignore a certain file temporarily, before committing it at a later time, you should do so using the ",(0,t.jsx)(i.code,{children:"git update-index"})," commands."]}),"\n",(0,t.jsx)(i.h2,{id:"using-gitignore-files",children:"Using .gitignore files"}),"\n",(0,t.jsxs)(i.p,{children:["Git uses ",(0,t.jsx)(i.em,{children:".gitignore"})," files to decide which files and directories to ignore before you commit. Files and directories specified in ",(0,t.jsx)(i.em,{children:".gitignore"})," will not be tracked nor staged when ",(0,t.jsx)(i.code,{children:"git add *"})," or ",(0,t.jsx)(i.code,{children:"git commit -a"})," commands are used."]}),"\n",(0,t.jsxs)(i.p,{children:["To ignore a file or directory using ",(0,t.jsx)(i.em,{children:".gitignore"}),":"]}),"\n",(0,t.jsxs)(i.ol,{children:["\n",(0,t.jsxs)(i.li,{children:["Create a ",(0,t.jsx)(i.em,{children:".gitignore"})," file in the desired location (e.g. the project's root directory).","\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["The ",(0,t.jsx)(i.em,{children:".gitignore"})," file affects all files and sub-directories in its directory.","\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"It recursively affects all files and directories in its sub-directories."}),"\n",(0,t.jsxs)(i.li,{children:["Sub-directories with their own ",(0,t.jsx)(i.em,{children:".gitignore"})," file use their own ",(0,t.jsx)(i.em,{children:".gitignore"})," instead."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(i.li,{children:["Open the file and enter the filename or directory to be ignored (e.g. ",(0,t.jsx)(i.em,{children:"secret.txt"}),"). See example below."]}),"\n",(0,t.jsxs)(i.li,{children:["Save the file and commit it.","\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Commit it to share the ignore rules with other users using the same repository and also to version-control it."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(i.p,{children:["Example ",(0,t.jsx)(i.em,{children:".gitignore"})," file:"]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"# Ignore specific file\nplaintext_password.txt\n\n# Ignore specific file type using wildcards\n*.html\n\n# Ignore specific directory\nsite/\n"})}),"\n",(0,t.jsx)(i.admonition,{type:"caution",children:(0,t.jsxs)(i.p,{children:["If a file is already being tracked, adding it to ",(0,t.jsx)(i.em,{children:".gitignore"})," will not stop Git from tracking it. You will need to remove the file from the Git cache using the ",(0,t.jsx)(i.code,{children:"git rm --cached <file>"})," command. After doing this, the file will no longer be tracked provided it is specified in ",(0,t.jsx)(i.em,{children:".gitignore"}),"."]})}),"\n",(0,t.jsx)(i.h2,{id:"using-git-update-index",children:"Using 'git update-index'"}),"\n",(0,t.jsxs)(i.p,{children:["If you want Git to temporarily ignore a file which you will commit at a later time, you can do so easily by using the ",(0,t.jsx)(i.code,{children:"git update-index"})," commands to tell Git to stop and start tracking the file."]}),"\n",(0,t.jsx)(i.p,{children:"To temporarily ignore (stop tracking) a file:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"git update-index --assume-unchanged <file>\n"})}),"\n",(0,t.jsx)(i.p,{children:"To start tracking a file again:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"git update-index --no-assume-unchanged <file>\n"})}),"\n",(0,t.jsx)(i.admonition,{type:"tip",children:(0,t.jsxs)(i.p,{children:["Read the ",(0,t.jsx)(i.a,{href:"https://mirrors.edge.kernel.org/pub/software/scm/git/docs/git-update-index.html",children:"man page"})," to find out more about ",(0,t.jsx)(i.code,{children:"git update-index"})," rules."]})}),"\n",(0,t.jsx)(i.h2,{id:"resources",children:"Resources"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"https://digipie.github.io/digidocs/git/ignoring-files/",children:"Original copy of this document at DigiDocs"})}),"\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"https://git-scm.com/docs/gitignore",children:"gitscm's documentation for .gitignore"})}),"\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"https://help.github.com/en/articles/ignoring-files",children:"github's guide to ignoring files"})}),"\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"http://gitready.com/beginner/2009/01/19/ignoring-files.html",children:"gitready's guide to ignoring files"})}),"\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"http://gitready.com/intermediate/2009/02/18/temporarily-ignoring-files.html",children:"gitready's guide to temporarily ignoring files"})}),"\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"https://mirrors.edge.kernel.org/pub/software/scm/git/docs/git-update-index.html",children:"man page on 'git update-index'"})}),"\n"]})]})}function g(e={}){const{wrapper:i}={...(0,r.M)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},2172:(e,i,n)=>{n.d(i,{I:()=>l,M:()=>o});var t=n(1504);const r={},s=t.createContext(r);function o(e){const i=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function l(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),t.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c4f5d8e4.2ebf0493.js b/assets/js/c4f5d8e4.2ebf0493.js new file mode 100644 index 00000000..fbc90eb6 --- /dev/null +++ b/assets/js/c4f5d8e4.2ebf0493.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[2632],{3464:(e,a,s)=>{s.r(a),s.d(a,{default:()=>y});var n=s(1504),i=s(867),t=s(964),l=s(8264),c=s(9012);const r="heroBanner_UJJx",o="heroBannerWrapper_T2xm",d="aboutHeader_v4hF",h="about_t7Hw",m="aboutProfilePic_YGLO",p="aboutText_V1HZ",x="directory_PXbK";var g=s(5620),u=s(792);const j="socialLinks_imCW";var v=s(5896),_=s(9472);const b=[{faIcon:_.GK$,alt:"Linkedin",url:"https://www.linkedin.com/in/evanitsg/"},{faIcon:_.eEK,alt:"GitHub",url:"https://github.com/digipie"},{faIcon:_.MPc,alt:"Padlet",url:"https://padlet.com/about/us/wish/1072760846"},{faIcon:v.Ww9,alt:"Email",url:"mailto:evan.it.sg@gmail.com"}];var f=s(7624);function N(e){let{faIcon:a,alt:s,url:n}=e;return(0,f.jsx)("div",{children:(0,f.jsx)("a",{href:n,className:"text-primary-900 hover:text-primary-800",children:(0,f.jsx)(u.u,{alt:s,title:s,icon:a,size:"2x"})})})}const w=function(){return(0,f.jsxs)("div",{className:j,children:[(0,f.jsx)("style",{type:"text/css",children:g.En.css()}),b.map(((e,a)=>(0,f.jsx)(N,{...e},a)))]})};const y=function(){const e=(0,l.c)(),{siteConfig:a={}}=e,s=(0,n.useRef)(null),[g,u]=(0,n.useState)(!0),[j,v]=(0,n.useState)(1536),[_,b]=(0,n.useState)(256);return(0,n.useEffect)((()=>{const e=Math.max(384,window.innerHeight);v(e),b(Math.max(256,e/2)),u(!1),s.current.hidden=!1}),[]),(0,f.jsxs)(c.c,{title:"Home",description:a.tagline,children:[(0,f.jsx)("header",{className:r,style:{minHeight:j},children:(0,f.jsxs)("div",{className:o,style:{minHeight:_,display:g?"none":"block"},children:[(0,f.jsx)("p",{children:"Hi, my name is"}),(0,f.jsx)("h1",{className:"text-success",children:"Evan Tay."}),(0,f.jsxs)("p",{children:["I am a ",(0,f.jsx)("span",{className:"text-warning",children:"Software Engineer"})," and"," ",(0,f.jsx)("span",{className:"text-danger",children:"Cloud Engineer"})," passionate about solving meaningful problems."]}),(0,f.jsx)(w,{}),(0,f.jsx)("p",{children:(0,f.jsx)(i.c,{hash:"#main",children:(0,f.jsxs)("button",{className:"border-0 rounded p-2 pl-4 pr-0 bg-primary-900 hover:bg-primary-800 transition text-white text-lg cursor-pointer",children:["whoami",(0,f.jsx)("span",{className:"pl-1 animate-pulse",children:"\u258e"})]})})})]})}),(0,f.jsxs)("main",{id:"main",ref:s,hidden:!0,children:[(0,f.jsx)("div",{className:d,children:(0,f.jsx)("h2",{className:"border-0 border-b-4 border-solid border-success",children:"Who am I"})}),(0,f.jsxs)("div",{className:h,children:[(0,f.jsx)("div",{children:(0,f.jsx)("img",{className:m,src:(0,t.c)("img/profilepic.jpg")})}),(0,f.jsxs)("div",{className:p,children:[(0,f.jsx)("h2",{children:"Hi"}),(0,f.jsx)("p",{children:"\ud83c\uddf8\ud83c\uddec I am Evan, a Full Stack Software Engineer and Certified Cloud Engineer based in Singapore."}),(0,f.jsxs)("p",{children:["\ud83d\ude80 I love building cool and meaningful things with tech like"," ",(0,f.jsx)(i.c,{to:(0,t.c)("projects/"),children:"websites, applications or games"}),"."]}),(0,f.jsx)("p",{children:"\ud83c\udf0f To me, coding is the closest thing to magic we have on Earth."}),(0,f.jsxs)("p",{children:["\ud83d\udc68\u200d\ud83d\udcbb I have been writing beautiful code at"," ",(0,f.jsx)("a",{href:"https://padlet.com",children:"Padlet"})," since 2021."]}),(0,f.jsxs)("p",{children:["\ud83c\udf92 I was a"," ",(0,f.jsx)("a",{href:"https://www.comp.nus.edu.sg/programmes/ug/cs/",children:"Computer Science major"})," ","at the"," ",(0,f.jsx)("a",{href:"https://www.comp.nus.edu.sg/",children:"National University of Singapore"})," ","from 2017 to 2020."]}),(0,f.jsxs)("p",{children:["\ud83e\uddd1\u200d\ud83c\udfeb Back then, I was a"," ",(0,f.jsx)("a",{href:"https://github.com/DigiPie/CS1010-Tutorial-C09",children:"Teaching Assistant"})," ","for Programming Methodology and Networking courses."]}),(0,f.jsxs)("p",{children:["\ud83d\udefc I was also Deputy Head of Technology for the"," ",(0,f.jsx)("a",{href:"https://dscnustech.github.io/",children:"NUS Google Developer Student Club"}),", and President of the"," ",(0,f.jsx)("a",{href:"https://www.instagram.com/nusskating/",children:"NUS Skating Club"}),"."]})]})]}),(0,f.jsx)("section",{className:x,children:(0,f.jsxs)("div",{className:"container",children:[(0,f.jsx)("h3",{children:"Continue exploring?"}),(0,f.jsxs)("nav",{className:"pagination-nav",children:[(0,f.jsx)("div",{className:"pagination-nav__item",children:(0,f.jsxs)(i.c,{className:"pagination-nav__link",to:(0,t.c)("blog/"),children:[(0,f.jsx)("div",{className:"pagination-nav__sublabel",children:"Read"}),(0,f.jsx)("div",{className:"pagination-nav__label",children:"My blog"})]})}),(0,f.jsx)("div",{className:"pagination-nav__item pagination-nav__item--next",children:(0,f.jsxs)(i.c,{className:"pagination-nav__link",to:(0,t.c)("docs/"),children:[(0,f.jsx)("div",{className:"pagination-nav__sublabel",children:"Refer to"}),(0,f.jsx)("div",{className:"pagination-nav__label",children:"My docs"})]})})]}),(0,f.jsxs)("nav",{className:"pt-4 pagination-nav",children:[(0,f.jsx)("div",{className:"pagination-nav__item",children:(0,f.jsxs)(i.c,{className:"pagination-nav__link",to:(0,t.c)("projects/"),children:[(0,f.jsx)("div",{className:"pagination-nav__sublabel",children:"Check out"}),(0,f.jsx)("div",{className:"pagination-nav__label",children:"My projects"})]})}),(0,f.jsx)("div",{className:"pagination-nav__item pagination-nav__item--next",children:(0,f.jsxs)("a",{className:"pagination-nav__link",href:(0,t.c)("pdf/resume.pdf"),children:[(0,f.jsx)("div",{className:"pagination-nav__sublabel",children:"Download"}),(0,f.jsx)("div",{className:"pagination-nav__label",children:"My resume"})]})})]})]})})]})]})}}}]); \ No newline at end of file diff --git a/assets/js/c6e1e161.d3305235.js b/assets/js/c6e1e161.d3305235.js new file mode 100644 index 00000000..2daa7534 --- /dev/null +++ b/assets/js/c6e1e161.d3305235.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[3663],{6416:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/book-review","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/c933abd0.aa85ab53.js b/assets/js/c933abd0.aa85ab53.js new file mode 100644 index 00000000..70757e31 --- /dev/null +++ b/assets/js/c933abd0.aa85ab53.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[4492],{3552:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/software-engineering","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/ccc49370.601110a2.js b/assets/js/ccc49370.601110a2.js new file mode 100644 index 00000000..d67bc73a --- /dev/null +++ b/assets/js/ccc49370.601110a2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[6344],{8320:(e,n,t)=>{t.r(n),t.d(n,{default:()=>p});t(1504);var a=t(5456),i=t(5756),l=t(5864),s=t(3152),o=t(9452),r=t(7792),c=t(4357),d=t(308),u=t(7624);function m(e){const{nextItem:n,prevItem:t}=e;return(0,u.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,c.G)({id:"theme.blog.post.paginator.navAriaLabel",message:"Blog post page navigation",description:"The ARIA label for the blog posts pagination"}),children:[t&&(0,u.jsx)(d.c,{...t,subLabel:(0,u.jsx)(c.c,{id:"theme.blog.post.paginator.newerPost",description:"The blog post button label to navigate to the newer/previous post",children:"Newer Post"})}),n&&(0,u.jsx)(d.c,{...n,subLabel:(0,u.jsx)(c.c,{id:"theme.blog.post.paginator.olderPost",description:"The blog post button label to navigate to the older/next post",children:"Older Post"}),isNext:!0})]})}function g(){var e;const{assets:n,metadata:t}=(0,s.g)(),{title:a,description:l,date:o,tags:r,authors:c,frontMatter:d}=t,{keywords:m}=d,g=null!=(e=n.image)?e:d.image;return(0,u.jsxs)(i.U7,{title:a,description:l,keywords:m,image:g,children:[(0,u.jsx)("meta",{property:"og:type",content:"article"}),(0,u.jsx)("meta",{property:"article:published_time",content:o}),c.some((e=>e.url))&&(0,u.jsx)("meta",{property:"article:author",content:c.map((e=>e.url)).filter(Boolean).join(",")}),r.length>0&&(0,u.jsx)("meta",{property:"article:tag",content:r.map((e=>e.label)).join(",")})]})}var h=t(5124),v=t(1528);function f(e){let{sidebar:n,children:t}=e;const{metadata:a,toc:i}=(0,s.g)(),{nextItem:l,prevItem:c,frontMatter:d,unlisted:g}=a,{hide_table_of_contents:f,toc_min_heading_level:p,toc_max_heading_level:x}=d;return(0,u.jsxs)(o.c,{sidebar:n,toc:!f&&i.length>0?(0,u.jsx)(h.c,{toc:i,minHeadingLevel:p,maxHeadingLevel:x}):void 0,children:[g&&(0,u.jsx)(v.c,{}),(0,u.jsx)(r.c,{children:t}),(l||c)&&(0,u.jsx)(m,{nextItem:l,prevItem:c})]})}function p(e){const n=e.content;return(0,u.jsx)(s.E,{content:e.content,isBlogPostPage:!0,children:(0,u.jsxs)(i.cr,{className:(0,a.c)(l.W.wrapper.blogPages,l.W.page.blogPostPage),children:[(0,u.jsx)(g,{}),(0,u.jsx)(f,{sidebar:e.sidebar,children:(0,u.jsx)(n,{})})]})})}},5124:(e,n,t)=>{t.d(n,{c:()=>c});t(1504);var a=t(5456),i=t(3088);const l={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var s=t(7624);const o="table-of-contents__link toc-highlight",r="table-of-contents__link--active";function c(e){let{className:n,...t}=e;return(0,s.jsx)("div",{className:(0,a.c)(l.tableOfContents,"thin-scrollbar",n),children:(0,s.jsx)(i.c,{...t,linkClassName:o,linkActiveClassName:r})})}},3088:(e,n,t)=>{t.d(n,{c:()=>v});var a=t(1504),i=t(1824);function l(e){const n=e.map((e=>({...e,parentIndex:-1,children:[]}))),t=Array(7).fill(-1);n.forEach(((e,n)=>{const a=t.slice(2,e.level);e.parentIndex=Math.max(...a),t[e.level]=n}));const a=[];return n.forEach((e=>{const{parentIndex:t,...i}=e;t>=0?n[t].children.push(i):a.push(i)})),a}function s(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:a}=e;return n.flatMap((e=>{const n=s({toc:e.children,minHeadingLevel:t,maxHeadingLevel:a});return function(e){return e.level>=t&&e.level<=a}(e)?[{...e,children:n}]:n}))}function o(e){const n=e.getBoundingClientRect();return n.top===n.bottom?o(e.parentNode):n}function r(e,n){var t;let{anchorTopOffset:a}=n;const i=e.find((e=>o(e).top>=a));if(i){var l;return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(o(i))?i:null!=(l=e[e.indexOf(i)-1])?l:null}return null!=(t=e[e.length-1])?t:null}function c(){const e=(0,a.useRef)(0),{navbar:{hideOnScroll:n}}=(0,i.y)();return(0,a.useEffect)((()=>{e.current=n?0:document.querySelector(".navbar").clientHeight}),[n]),e}function d(e){const n=(0,a.useRef)(void 0),t=c();(0,a.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:a,linkActiveClassName:i,minHeadingLevel:l,maxHeadingLevel:s}=e;function o(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(a),o=function(e){let{minHeadingLevel:n,maxHeadingLevel:t}=e;const a=[];for(let i=n;i<=t;i+=1)a.push("h"+i+".anchor");return Array.from(document.querySelectorAll(a.join()))}({minHeadingLevel:l,maxHeadingLevel:s}),c=r(o,{anchorTopOffset:t.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,t){t?(n.current&&n.current!==e&&n.current.classList.remove(i),e.classList.add(i),n.current=e):e.classList.remove(i)}(e,e===d)}))}return document.addEventListener("scroll",o),document.addEventListener("resize",o),o(),()=>{document.removeEventListener("scroll",o),document.removeEventListener("resize",o)}}),[e,t])}var u=t(867),m=t(7624);function g(e){let{toc:n,className:t,linkClassName:a,isChild:i}=e;return n.length?(0,m.jsx)("ul",{className:i?void 0:t,children:n.map((e=>(0,m.jsxs)("li",{children:[(0,m.jsx)(u.c,{to:"#"+e.id,className:null!=a?a:void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,m.jsx)(g,{isChild:!0,toc:e.children,className:t,linkClassName:a})]},e.id)))}):null}const h=a.memo(g);function v(e){let{toc:n,className:t="table-of-contents table-of-contents__left-border",linkClassName:o="table-of-contents__link",linkActiveClassName:r,minHeadingLevel:c,maxHeadingLevel:u,...g}=e;const v=(0,i.y)(),f=null!=c?c:v.tableOfContents.minHeadingLevel,p=null!=u?u:v.tableOfContents.maxHeadingLevel,x=function(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:i}=e;return(0,a.useMemo)((()=>s({toc:l(n),minHeadingLevel:t,maxHeadingLevel:i})),[n,t,i])}({toc:n,minHeadingLevel:f,maxHeadingLevel:p});return d((0,a.useMemo)((()=>{if(o&&r)return{linkClassName:o,linkActiveClassName:r,minHeadingLevel:f,maxHeadingLevel:p}}),[o,r,f,p])),(0,m.jsx)(h,{toc:x,className:t,linkClassName:o,...g})}},1528:(e,n,t)=>{t.d(n,{c:()=>g});t(1504);var a=t(5456),i=t(4357),l=t(6952),s=t(7624);function o(){return(0,s.jsx)(i.c,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function r(){return(0,s.jsx)(i.c,{id:"theme.unlistedContent.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function c(){return(0,s.jsx)(l.c,{children:(0,s.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}var d=t(5864),u=t(304);function m(e){let{className:n}=e;return(0,s.jsx)(u.c,{type:"caution",title:(0,s.jsx)(o,{}),className:(0,a.c)(n,d.W.common.unlistedBanner),children:(0,s.jsx)(r,{})})}function g(e){return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(c,{}),(0,s.jsx)(m,{...e})]})}}}]); \ No newline at end of file diff --git a/assets/js/ce3e42ad.0827cfdc.js b/assets/js/ce3e42ad.0827cfdc.js new file mode 100644 index 00000000..d03ee2b0 --- /dev/null +++ b/assets/js/ce3e42ad.0827cfdc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[6664],{9292:(e,n,t)=>{t.r(n),t.d(n,{Highlight:()=>u,assets:()=>d,contentTitle:()=>c,default:()=>m,frontMatter:()=>s,metadata:()=>a,toc:()=>i});var o=t(7624),r=t(2172);const s={id:"mdx",title:"Powered by MDX"},c=void 0,a={id:"mdx",title:"Powered by MDX",description:"You can write JSX and use React components within your Markdown thanks to MDX.",source:"@site/docs/mdx.md",sourceDirName:".",slug:"/mdx",permalink:"/docs/mdx",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{id:"mdx",title:"Powered by MDX"}},d={},i=[],u=({children:e,color:n})=>{const t={span:"span",...(0,r.M)()};return(0,o.jsx)(t.span,{style:{backgroundColor:n,borderRadius:"2px",color:"#fff",padding:"0.2rem"},children:e})};function l(e){const n={a:"a",em:"em",p:"p",strong:"strong",...(0,r.M)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(n.p,{children:["You can write JSX and use React components within your Markdown thanks to ",(0,o.jsx)(n.a,{href:"https://mdxjs.com/",children:"MDX"}),"."]}),"\n","\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(u,{color:"#25c2a0",children:"Docusaurus green"})," and ",(0,o.jsx)(u,{color:"#1877F2",children:"Facebook blue"})," are my favorite colors."]}),"\n",(0,o.jsxs)(n.p,{children:["I can write ",(0,o.jsx)(n.strong,{children:"Markdown"})," alongside my ",(0,o.jsx)(n.em,{children:"JSX"}),"!"]})]})}function m(e={}){const{wrapper:n}={...(0,r.M)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},2172:(e,n,t)=>{t.d(n,{I:()=>a,M:()=>c});var o=t(1504);const r={},s=o.createContext(r);function c(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:c(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/cfb8f5b6.670c2124.js b/assets/js/cfb8f5b6.670c2124.js new file mode 100644 index 00000000..a029d05a --- /dev/null +++ b/assets/js/cfb8f5b6.670c2124.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[7640],{563:e=>{e.exports=JSON.parse('{"label":"software-engineering","permalink":"/blog/tags/software-engineering","allTagsPath":"/blog/tags","count":1,"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/cff29eac.7eb7c113.js b/assets/js/cff29eac.7eb7c113.js new file mode 100644 index 00000000..70be8f5a --- /dev/null +++ b/assets/js/cff29eac.7eb7c113.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[6984],{3304:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/conference","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/dc9e9921.629d8f89.js b/assets/js/dc9e9921.629d8f89.js new file mode 100644 index 00000000..565398cd --- /dev/null +++ b/assets/js/dc9e9921.629d8f89.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[9372],{1968:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/gov-tech-stack","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/e11f84c6.b71818cf.js b/assets/js/e11f84c6.b71818cf.js new file mode 100644 index 00000000..e95bfb67 --- /dev/null +++ b/assets/js/e11f84c6.b71818cf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[9311],{590:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/e25e4df4.5022d22c.js b/assets/js/e25e4df4.5022d22c.js new file mode 100644 index 00000000..133f4b90 --- /dev/null +++ b/assets/js/e25e4df4.5022d22c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[832],{887:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>a,frontMatter:()=>i,metadata:()=>l,toc:()=>d});var t=s(7624),o=s(2172);const i={title:"NodeJS Set npm run shell"},r=void 0,l={id:"nodejs-set-npm-run-shell",title:"NodeJS Set npm run shell",description:"Published on December 23, 2020",source:"@site/docs/nodejs-set-npm-run-shell.md",sourceDirName:".",slug:"/nodejs-set-npm-run-shell",permalink:"/docs/nodejs-set-npm-run-shell",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{title:"NodeJS Set npm run shell"},sidebar:"docs",previous:{title:"NodeJS Auto-reload server",permalink:"/docs/nodejs-auto-reload"}},c={},d=[{value:"Example scenario",id:"example-scenario",level:2},{value:"The one-line solution",id:"the-one-line-solution",level:2},{value:"Resources",id:"resources",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",li:"li",p:"p",ul:"ul",...(0,o.M)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Published on December 23, 2020"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsxs)(n.em,{children:["This document was migrated from ",(0,t.jsx)(n.a,{href:"https://digipie.github.io/digidocs/nodejs/set-npm-run-shell/",children:"DigiDocs"})]})}),"\n",(0,t.jsxs)(n.p,{children:["This article covers how you can set the shell used when you run the ",(0,t.jsx)(n.code,{children:"npm run"})," scripts."]}),"\n",(0,t.jsx)(n.h2,{id:"example-scenario",children:"Example scenario"}),"\n",(0,t.jsxs)(n.p,{children:['You are a Windows user who just started working on a new NodeJS project. While following through the "Getting Started" guide, you were instructed to run one or more ',(0,t.jsx)(n.code,{children:"npm run"})," scripts such as ",(0,t.jsx)(n.code,{children:"npm run dev"}),". These commands fail with errors."]}),"\n",(0,t.jsxs)(n.p,{children:["Upon checking, you realise that the reason why these commands fail is because they contains Bash (shell) commands not available to your Windows shell. You proceed to install ",(0,t.jsx)(n.a,{href:"https://gitforwindows.org/",children:"Git Bash for Windows"}),", and then re-run the command again using Git Bash instead. It still fails. It seems like ",(0,t.jsx)(n.code,{children:"npm run"})," scripts still uses your Windows shell for execution."]}),"\n",(0,t.jsx)(n.h2,{id:"the-one-line-solution",children:"The one-line solution"}),"\n",(0,t.jsxs)(n.p,{children:["Tell ",(0,t.jsx)(n.code,{children:"npm config"})," what shell you want your ",(0,t.jsx)(n.code,{children:"npm run"})," scripts to be executed with (in this case, the Git Bash shell):"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:'npm config set script-shell "C:\\\\Program Files\\\\git\\\\bin\\\\bash.exe"'})}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsx)(n.p,{children:'It is assumed that your Git Bash executable file is located at "C:\\Program Files\\git\\bin\\bash.exe", which is the default installation location. If it is not, amend the path accordingly.'})}),"\n",(0,t.jsx)(n.h2,{id:"resources",children:"Resources"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://digipie.github.io/digidocs/nodejs/set-npm-run-shell/",children:"Original copy of this document at DigiDocs"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://docs.npmjs.com/misc/config",children:"npmjs.com's documentation for npm config"})}),"\n"]})]})}function a(e={}){const{wrapper:n}={...(0,o.M)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},2172:(e,n,s)=>{s.d(n,{I:()=>l,M:()=>r});var t=s(1504);const o={},i=t.createContext(o);function r(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e25ee44f.2849761a.js b/assets/js/e25ee44f.2849761a.js new file mode 100644 index 00000000..06706864 --- /dev/null +++ b/assets/js/e25ee44f.2849761a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[2304],{7232:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>t,contentTitle:()=>c,default:()=>d,frontMatter:()=>l,metadata:()=>a,toc:()=>h});var i=s(7624),r=s(2172);const l={title:"iTerm2 and zsh Setup"},c=void 0,a={id:"iterm2-zsh-setup",title:"iTerm2 and zsh Setup",description:"Published on January 16, 2021",source:"@site/docs/iterm2-zsh-setup.md",sourceDirName:".",slug:"/iterm2-zsh-setup",permalink:"/docs/iterm2-zsh-setup",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{title:"iTerm2 and zsh Setup"},sidebar:"docs",previous:{title:"Git Ignore file",permalink:"/docs/git-ignore-file"},next:{title:"iTerm2 Cheatsheet",permalink:"/docs/iterm2-cheatsheet"}},t={},h=[{value:"Install",id:"install",level:2},{value:"Change theme",id:"change-theme",level:2},{value:"Add an alias",id:"add-an-alias",level:2},{value:"Resources",id:"resources",level:2}];function o(e){const n={a:"a",admonition:"admonition",br:"br",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,r.M)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.p,{children:["Published on January 16, 2021",(0,i.jsx)(n.br,{}),"\n","Updated on January 23, 2021"]}),"\n",(0,i.jsxs)(n.p,{children:["In this section you will find my notes on setting up ",(0,i.jsx)(n.a,{href:"https://iterm2.com/",children:"iTerm2"}),", an awesome terminal emulator for MacOS, and ",(0,i.jsx)(n.a,{href:"https://ohmyz.sh/",children:"ohmyzsh"}),", an amazing open-source framework for managing your zsh configuration."]}),"\n",(0,i.jsx)(n.h2,{id:"install",children:"Install"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Install iTerm2:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-zsh",children:"brew install --cask iterm2\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Install zsh:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-zsh",children:"brew install zsh\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Install ohmyzsh:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-zsh",children:'sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"\n'})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Update ohmyzsh:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-zsh",children:"omz update\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Exit Terminal and open iTerm2: ",(0,i.jsx)(n.code,{children:"\u2318"})," + ",(0,i.jsx)(n.code,{children:"Space Bar"})," > Search 'iTerm'"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"You are done setting up iTerm2 and ohmyzsh!"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"change-theme",children:"Change theme"}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["To configure ohmyzsh, you will almost always be doing so by opening ",(0,i.jsx)(n.code,{children:"~/.zshrc"}),"."]})}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Open the ",(0,i.jsx)(n.code,{children:"~/.zshrc"})," configuration file:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-zsh",children:"open ~/.zshrc\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Change your theme by updating ",(0,i.jsx)(n.code,{children:'ZSH_THEME="robbyrussell"'})," accordingly."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Find a theme you like ",(0,i.jsx)(n.a,{href:"https://github.com/ohmyzsh/ohmyzsh/wiki/External-themes",children:"here"})," and follow the install instructions in the theme repositories."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Run ",(0,i.jsx)(n.code,{children:"exec zsh"})," to reload your new configuration:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-zsh",children:"exec zsh\n"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"You should see your new theme in action."}),"\n",(0,i.jsx)(n.h2,{id:"add-an-alias",children:"Add an alias"}),"\n",(0,i.jsx)(n.p,{children:"Aliases are useful shorcuts you set to reduce the time spent on typing commands you often use. For example, if you often type:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-zsh",children:"cd /Users/evantay/Documents/Git\n"})}),"\n",(0,i.jsx)(n.p,{children:"or even worse:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-zsh",children:"cd /Users/\ncd evantay\ncd Documents/Git\n"})}),"\n",(0,i.jsxs)(n.p,{children:["You should add an alias for ",(0,i.jsx)(n.code,{children:"cd /Users/evantay/Documents/Git"}),":"]}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Open the ",(0,i.jsx)(n.code,{children:"~/.zshrc"})," configuration file:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-zsh",children:"open ~/.zshrc\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Add a new alias at the bottom of the file:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-zsh",children:'# Example aliases\n# alias zshconfig="mate ~/.zshrc"\n# alias ohmyzsh="mate ~/.oh-my-zsh"\nalias repo="/Users/evantay/Documents/Git"\n'})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Reload zsh:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-zsh",children:"exec zsh\n"})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["You can now type ",(0,i.jsx)(n.code,{children:"repo"})," whenever you want to ",(0,i.jsx)(n.code,{children:"cd /Users/evantay/Documents/Git"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"resources",children:"Resources"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://iterm2.com/",children:"iTerm2's Landing Site"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://www.freecodecamp.org/news/how-to-configure-your-macos-terminal-with-zsh-like-a-pro-c0ab3f3c1156/",children:"freeCodeCamp's Guide"})}),"\n"]})]})}function d(e={}){const{wrapper:n}={...(0,r.M)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}},2172:(e,n,s)=>{s.d(n,{I:()=>a,M:()=>c});var i=s(1504);const r={},l=i.createContext(r);function c(e){const n=i.useContext(l);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:c(e.components),i.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e5cc08ab.1f68d4af.js b/assets/js/e5cc08ab.1f68d4af.js new file mode 100644 index 00000000..8d997607 --- /dev/null +++ b/assets/js/e5cc08ab.1f68d4af.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[5744],{2080:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/f026c94c.d2959846.js b/assets/js/f026c94c.d2959846.js new file mode 100644 index 00000000..b84040dc --- /dev/null +++ b/assets/js/f026c94c.d2959846.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[2568],{1912:a=>{a.exports=JSON.parse('{"permalink":"/blog/tags/analytics","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/f3002ca5.c956b0ba.js b/assets/js/f3002ca5.c956b0ba.js new file mode 100644 index 00000000..8bf0c52a --- /dev/null +++ b/assets/js/f3002ca5.c956b0ba.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[588],{568:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>r,toc:()=>c});var t=s(7624),o=s(2172);const i={title:"Dependency management"},l=void 0,r={id:"ruby-dependency-management",title:"Dependency management",description:"Published on October 24, 2021",source:"@site/docs/ruby-dependency-management.md",sourceDirName:".",slug:"/ruby-dependency-management",permalink:"/docs/ruby-dependency-management",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{title:"Dependency management"},sidebar:"docs",previous:{title:"Network Model (CS4226)",permalink:"/docs/network-model"},next:{title:"C Cheatsheet",permalink:"/docs/c-cheatsheet"}},d={},c=[{value:"Why do we use bundler?",id:"why-do-we-use-bundler",level:2},{value:"Resources",id:"resources",level:2}];function a(e){const n={a:"a",code:"code",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.M)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Published on October 24, 2021"}),"\n",(0,t.jsx)(n.h2,{id:"why-do-we-use-bundler",children:"Why do we use bundler?"}),"\n",(0,t.jsxs)(n.p,{children:["Why do we use ",(0,t.jsx)(n.code,{children:"bundle install"})," rather than ",(0,t.jsx)(n.code,{children:"gem install"}),"?"]}),"\n",(0,t.jsxs)(n.p,{children:["Bundler installs the exact gems and versions that are needed. It resolves all dependency conflicts for you automatically, which you would have to manually resolve if you had used ",(0,t.jsx)(n.code,{children:"gem install"})," instead."]}),"\n",(0,t.jsxs)(n.p,{children:["For example, if you have two gems requiring different versions of the same gem ",(0,t.jsx)(n.code,{children:"nokogiri"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-Gemfile",children:"sunspot_rails\n nokogiri (>= 1.2.0)\n\nwebrat\n nokogiri (>= 1.3) \n"})}),"\n",(0,t.jsxs)(n.p,{children:["If you use ",(0,t.jsx)(n.code,{children:"gem install"})," to install ",(0,t.jsx)(n.code,{children:"sunspot_rails"})," and ",(0,t.jsx)(n.code,{children:"webrat"}),", it might install both ",(0,t.jsx)(n.code,{children:"1.2.0"})," and ",(0,t.jsx)(n.code,{children:"1.3.0"})," nokogiri versions or even complain about version conflicts. If you use ",(0,t.jsx)(n.code,{children:"bundle install"})," instead, Bundler will resolve this dependency conflict by installing the right ",(0,t.jsx)(n.code,{children:"nokogiri"})," version, which is ",(0,t.jsx)(n.code,{children:"1.3"})," in this example."]}),"\n",(0,t.jsx)(n.h2,{id:"resources",children:"Resources"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://bundler.io/",children:"bundler.io"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://stackoverflow.com/questions/7273853/why-bundle-install-a-gem-instead-of-gem-install-for-a-rails-3-app",children:'Why "bundle install" a gem instead of "gem install" for a rails 3 app?'})}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,o.M)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},2172:(e,n,s)=>{s.d(n,{I:()=>r,M:()=>l});var t=s(1504);const o={},i=t.createContext(o);function l(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:l(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f3543915.825b1ba9.js b/assets/js/f3543915.825b1ba9.js new file mode 100644 index 00000000..f2b8d073 --- /dev/null +++ b/assets/js/f3543915.825b1ba9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[6152],{4120:a=>{a.exports=JSON.parse('{"label":"cloud","permalink":"/blog/tags/cloud","allTagsPath":"/blog/tags","count":1,"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/f514138b.76d472ed.js b/assets/js/f514138b.76d472ed.js new file mode 100644 index 00000000..4cef6e91 --- /dev/null +++ b/assets/js/f514138b.76d472ed.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[7850],{3700:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>r,toc:()=>l});var o=s(7624),n=s(2172);const a={slug:"docusaurus-posthog",title:"Integrating PostHog product analytics with Docusaurus v2 on GitHub Pages",author:"Evan Tay",author_url:"https://github.com/DigiPie",author_title:"Software Engineer at Padlet",author_image_url:"https://avatars2.githubusercontent.com/u/13582874",tags:["docusaurus","posthog","analytics"]},i=void 0,r={permalink:"/blog/docusaurus-posthog",editUrl:"https://github.com/DigiPie/kaya-folio/tree/main/website/blog/2021-06-26-docusaurus-posthog-analytics.md",source:"@site/blog/2021-06-26-docusaurus-posthog-analytics.md",title:"Integrating PostHog product analytics with Docusaurus v2 on GitHub Pages",description:"I integrated PostHog analytics into this website today. I decided to do so after reading Gergely Orosz's Stats page on his blog The Pragmatic Engineer. He had installed Plausible analytics and made his analytics dashboard public. I thought that was cool and wanted to do the same.",date:"2021-06-26T00:00:00.000Z",formattedDate:"June 26, 2021",tags:[{label:"docusaurus",permalink:"/blog/tags/docusaurus"},{label:"posthog",permalink:"/blog/tags/posthog"},{label:"analytics",permalink:"/blog/tags/analytics"}],readingTime:3.15,hasTruncateMarker:!0,authors:[{name:"Evan Tay",title:"Software Engineer at Padlet",url:"https://github.com/DigiPie",imageURL:"https://avatars2.githubusercontent.com/u/13582874"}],frontMatter:{slug:"docusaurus-posthog",title:"Integrating PostHog product analytics with Docusaurus v2 on GitHub Pages",author:"Evan Tay",author_url:"https://github.com/DigiPie",author_title:"Software Engineer at Padlet",author_image_url:"https://avatars2.githubusercontent.com/u/13582874",tags:["docusaurus","posthog","analytics"]},unlisted:!1,prevItem:{title:"Why every Software Engineer should read Designing Data-Intensive Applications",permalink:"/blog/why-you-should-read-ddia"},nextItem:{title:"Top 3 reasons why you should start investing with StashAway today!",permalink:"/blog/stashaway"}},c={authorsImageUrls:[void 0]},l=[{value:"Installation Guide",id:"installation-guide",level:2}];function h(e){const t={a:"a",admonition:"admonition",code:"code",h2:"h2",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,n.M)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(t.p,{children:["I integrated ",(0,o.jsx)(t.a,{href:"https://posthog.com/",children:"PostHog"})," analytics into this website today. I decided to do so after reading Gergely Orosz's ",(0,o.jsx)(t.a,{href:"https://blog.pragmaticengineer.com/stats/",children:"Stats"})," page on his blog ",(0,o.jsx)(t.a,{href:"https://blog.pragmaticengineer.com/",children:"The Pragmatic Engineer"}),". He had installed ",(0,o.jsx)(t.a,{href:"https://plausible.io/",children:"Plausible"})," analytics and made his ",(0,o.jsx)(t.a,{href:"https://plausible.io/blog.pragmaticengineer.com?period=6mo",children:"analytics dashboard"})," public. I thought that was cool and wanted to do the same."]}),"\n",(0,o.jsxs)(t.p,{children:["I managed to find a ",(0,o.jsx)(t.a,{href:"https://github.com/infracost/docusaurus-plugin-plausible",children:"Plausible plugin"})," for ",(0,o.jsx)(t.a,{href:"https://docusaurus.io/",children:"Docusaurus v2"}),", which is what this website runs on. But I decided to use ",(0,o.jsx)(t.a,{href:"https://posthog.com/",children:"PostHog"})," instead. It also has a ",(0,o.jsx)(t.a,{href:"https://github.com/PostHog/posthog-docusaurus",children:"Docusaurus plugin"})," and a public dashboard feature. I decided so because it is free and Plausible isn't."]}),"\n",(0,o.jsx)(t.p,{children:"Plausible only offers a free 30-day trial, and would cost at least $6 monthly subsequently. In comparison, PostHog has a free non-expiring tier which provides up to 1 million events every month. It also requires no credit card and is completely self-serve. There was no need to request and wait for a free license. It took me less than 10 minutes from signing up to getting the analytics running."}),"\n",(0,o.jsx)(t.admonition,{title:"PostHog is open-source",type:"info",children:(0,o.jsx)(t.p,{children:"If you are looking for an open-source solution you can self-host, PostHog may be it."})}),"\n",(0,o.jsxs)(t.p,{children:["Despite what I have shared so far, I would still choose Plausible over PostHog if the former was free too. That's because the Plausible's dashboard interface looks much better and has more visualization options. For comparison, you can view the ",(0,o.jsx)(t.a,{href:"https://app.posthog.com/shared_dashboard/OpHsSFokK2VvhHFF-5Jn0rgVzqaMRg",children:"PostHog dashboard"})," for this site, and the ",(0,o.jsx)(t.a,{href:"https://plausible.io/blog.pragmaticengineer.com?period=6mo",children:"Plausible dashboard"})," for ",(0,o.jsx)(t.a,{href:"https://blog.pragmaticengineer.com/",children:"The Pragmatic Engineer"}),"."]}),"\n",(0,o.jsx)(t.p,{children:"If you want to integrate PostHog with your Docusaurus site, you can follow the guide below. The later steps are for deployment to GitHub Pages via GitHub Actions. But you can easily modify them for other platforms and deployment workflows. I will give some tips for doing that."}),"\n",(0,o.jsx)(t.h2,{id:"installation-guide",children:"Installation Guide"}),"\n",(0,o.jsxs)(t.ol,{children:["\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsxs)(t.p,{children:["Sign up for ",(0,o.jsx)(t.strong,{children:"PostHog Cloud"})," on ",(0,o.jsx)(t.a,{href:"https://posthog.com/",children:"posthog.com"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsxs)(t.p,{children:["Get your ",(0,o.jsx)(t.strong,{children:"Project API Key"})," from ",(0,o.jsx)(t.a,{href:"https://app.posthog.com/project/settings",children:"Project Settings"}),".\n",(0,o.jsx)(t.img,{alt:"PostHog Project API Key",src:s(6532).c+"",width:"2684",height:"350"})]}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsxs)(t.p,{children:["Install the ",(0,o.jsx)(t.code,{children:"posthog-docusaurus"})," package by running this command at your Docusaurus project root:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-zsh",children:"yarn add posthog-docusaurus\n"})}),"\n",(0,o.jsx)(t.p,{children:"or"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-zsh",children:"npm install --save posthog-docusaurus\n"})}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsxs)(t.p,{children:["Add this code block to ",(0,o.jsx)(t.code,{children:"docusaurus.config.js"}),":"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-js",children:'module.exports = {\n plugins: ["posthog-docusaurus"],\n themeConfig: {\n posthog: {\n apiKey: process.env.POSTHOG_API_KEY || "DEV",\n appUrl: "https://app.posthog.com", // optional\n enableInDevelopment: false, // optional\n },\n },\n};\n'})}),"\n",(0,o.jsx)(t.admonition,{type:"note",children:(0,o.jsxs)(t.p,{children:["The example in the official PostHog guide for ",(0,o.jsx)(t.a,{href:"https://posthog.com/docs/libraries/docusaurus",children:"Docusaurus v2 Integration"})," inserts the API key directly into the code (e.g. ",(0,o.jsx)(t.code,{children:'apiKey: "phc_fakekeyhHBZOuIq"'}),"). It is a bad idea to do so, especially if you host your code publicly (i.e. on a GitHub public repo). It is good practice to keep API keys secret and outside of application code instead. We will be using ",(0,o.jsx)(t.a,{href:"https://docs.github.com/en/actions/reference/encrypted-secrets",children:"GitHub Encrypted Secrets"})," to achieve that."]})}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsxs)(t.p,{children:["Add a ",(0,o.jsx)(t.strong,{children:"repository secret"})," to the GitHub repo hosting your site's code.\n",(0,o.jsx)(t.img,{alt:"GitHub Action Secrets",src:s(3437).c+"",width:"2566",height:"1442"})]}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:"Settings"})," > ",(0,o.jsx)(t.strong,{children:"Secrets"})," > ",(0,o.jsx)(t.strong,{children:"New repository secret"})," > ",(0,o.jsx)(t.strong,{children:"Name:"})," ",(0,o.jsx)(t.code,{children:"POSTHOG_API_KEY"})]}),"\n",(0,o.jsx)(t.admonition,{title:"If you are using another deployment platform",type:"tip",children:(0,o.jsxs)(t.p,{children:["There should be a settings panel which allows you to specify environment variables or secrets to insert into your application deployments securely. Put your ",(0,o.jsx)(t.code,{children:"POSTHOG_API_KEY"})," there. Skip the next step."]})}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsxs)(t.p,{children:["Open the GitHub Action workflow file responsible for deploying your site, and add the environment variable ",(0,o.jsx)(t.code,{children:"POSTHOG_API_KEY"})," to the Docusaurus build step:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-yml",children:"env:\n POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }}\n"})}),"\n",(0,o.jsx)(t.p,{children:"Example:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-yml",children:"# Install and build Docusaurus website\n- name: Build Docusaurus website\n run: |\n cd website\n npm install \n npm run build\n env:\n POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }}\n"})}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(t.p,{children:["That's it! Once you deploy your new changes, the plugin will automatically start tracking pageviews, clicks and more. For more customisation options, you can check out the ",(0,o.jsx)(t.a,{href:"https://github.com/PostHog/posthog-docusaurus",children:"posthog-docusaurus"})," plugin repo and the PostHog guide for ",(0,o.jsx)(t.a,{href:"https://posthog.com/docs/libraries/docusaurus",children:"Docusaurus v2 Integration"}),". You can also check out the ",(0,o.jsx)(t.a,{href:"https://github.com/DigiPie/kaya-folio/commit/fd6b029dbc0be34909cd539f2d33bac5de8209bc",children:"commit"})," I made to integrate PostHog into this website."]}),"\n",(0,o.jsxs)(t.p,{children:["If you want to deploy Docusaurus to GitHub Pages, check out my post on ",(0,o.jsx)(t.a,{href:"/blog/docusaurus-gh-action",children:"GitHub Action for Docusaurus"}),"."]})]})}function u(e={}){const{wrapper:t}={...(0,n.M)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},3437:(e,t,s)=>{s.d(t,{c:()=>o});const o=s.p+"assets/images/posthog_actions_secrets-7a037b4178c7a64a3976caf1d1a95aea.png"},6532:(e,t,s)=>{s.d(t,{c:()=>o});const o=s.p+"assets/images/posthog_api_key-fc6aa3dcbe700acaa44ac9d74e270d69.png"},2172:(e,t,s)=>{s.d(t,{I:()=>r,M:()=>i});var o=s(1504);const n={},a=o.createContext(n);function i(e){const t=o.useContext(a);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),o.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f5abd514.cd7c2368.js b/assets/js/f5abd514.cd7c2368.js new file mode 100644 index 00000000..1cc6442c --- /dev/null +++ b/assets/js/f5abd514.cd7c2368.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[3376],{6092:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>x,frontMatter:()=>i,metadata:()=>d,toc:()=>h});var n=s(7624),l=s(2172);const i={title:"iTerm2 Cheatsheet"},r=void 0,d={id:"iterm2-cheatsheet",title:"iTerm2 Cheatsheet",description:"Published on January 16, 2021",source:"@site/docs/iterm2-cheatsheet.md",sourceDirName:".",slug:"/iterm2-cheatsheet",permalink:"/docs/iterm2-cheatsheet",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{title:"iTerm2 Cheatsheet"},sidebar:"docs",previous:{title:"iTerm2 and zsh Setup",permalink:"/docs/iterm2-zsh-setup"},next:{title:"Ubuntu Cheatsheet",permalink:"/docs/os-ubuntu-cheatsheet"}},c={},h=[{value:"Windows and Tabs",id:"windows-and-tabs",level:2},{value:"Search Command History",id:"search-command-history",level:2},{value:"Resources",id:"resources",level:2}];function o(e){const t={a:"a",br:"br",code:"code",h2:"h2",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,l.M)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:["Published on January 16, 2021",(0,n.jsx)(t.br,{}),"\n","Updated on January 23, 2021"]}),"\n",(0,n.jsxs)(t.p,{children:["In this section you will find my notes on ",(0,n.jsx)(t.a,{href:"https://iterm2.com/",children:"iTerm2"}),", an awesome terminal emulator for MacOS."]}),"\n",(0,n.jsx)(t.h2,{id:"windows-and-tabs",children:"Windows and Tabs"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{style:{textAlign:"left"},children:(0,n.jsx)(t.strong,{children:"Function"})}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:(0,n.jsx)(t.strong,{children:"Shortcut"})})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Create Tab"}),(0,n.jsxs)(t.td,{style:{textAlign:"left"},children:[(0,n.jsx)(t.code,{children:"\u2318"})," + ",(0,n.jsx)(t.code,{children:"T"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Go to Tab"}),(0,n.jsxs)(t.td,{style:{textAlign:"left"},children:[(0,n.jsx)(t.code,{children:"\u2318"})," + ",(0,n.jsx)(t.code,{children:"Number Key"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Divide Window Vertically in Same Profile"}),(0,n.jsxs)(t.td,{style:{textAlign:"left"},children:[(0,n.jsx)(t.code,{children:"\u2318"})," + ",(0,n.jsx)(t.code,{children:"D"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Divide Window Horizontally in Same Profile"}),(0,n.jsxs)(t.td,{style:{textAlign:"left"},children:[(0,n.jsx)(t.code,{children:"\u2318"})," + ",(0,n.jsx)(t.code,{children:"Shift"})," + ",(0,n.jsx)(t.code,{children:"D"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Navigate through Split Windows based on Direction"}),(0,n.jsxs)(t.td,{style:{textAlign:"left"},children:[(0,n.jsx)(t.code,{children:"\u2318"})," + ",(0,n.jsx)(t.code,{children:"Option"})," + ",(0,n.jsx)(t.code,{children:"Arrow Key"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Navigate through Split Windows based on Order of Use"}),(0,n.jsxs)(t.td,{style:{textAlign:"left"},children:[(0,n.jsx)(t.code,{children:"\u2318"})," + ",(0,n.jsx)(t.code,{children:"["})," / ",(0,n.jsx)(t.code,{children:"]"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Maximise/Minimise Window in Fullscreen"}),(0,n.jsxs)(t.td,{style:{textAlign:"left"},children:[(0,n.jsx)(t.code,{children:"\u2318"}),"+ ",(0,n.jsx)(t.code,{children:"Enter"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Clear Window"}),(0,n.jsxs)(t.td,{style:{textAlign:"left"},children:[(0,n.jsx)(t.code,{children:"\u2318"}),"+ ",(0,n.jsx)(t.code,{children:"K"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Close Tab or Window"}),(0,n.jsxs)(t.td,{style:{textAlign:"left"},children:[(0,n.jsx)(t.code,{children:"\u2318"})," + ",(0,n.jsx)(t.code,{children:"W"})]})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"search-command-history",children:"Search Command History"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{style:{textAlign:"left"},children:(0,n.jsx)(t.strong,{children:"Function"})}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:(0,n.jsx)(t.strong,{children:"Shortcut"})})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Search with Autofill"}),(0,n.jsxs)(t.td,{style:{textAlign:"left"},children:[(0,n.jsx)(t.code,{children:"Ctrl"})," + ",(0,n.jsx)(t.code,{children:"R"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"End Search"}),(0,n.jsxs)(t.td,{style:{textAlign:"left"},children:[(0,n.jsx)(t.code,{children:"Ctrl"})," + ",(0,n.jsx)(t.code,{children:"Y"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Cancel Search and Restore Original Line"}),(0,n.jsxs)(t.td,{style:{textAlign:"left"},children:[(0,n.jsx)(t.code,{children:"Ctrl"})," + ",(0,n.jsx)(t.code,{children:"G"})]})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"resources",children:"Resources"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://iterm2.com/",children:"iTerm2's Landing Site"})}),"\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://iterm2.com/documentation-one-page.html",children:"iTerm's Documentation"})}),"\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://gist.github.com/squarism/ae3613daf5c01a98ba3a",children:"squarism's iTerm2 Cheatsheet"})}),"\n"]})]})}function x(e={}){const{wrapper:t}={...(0,l.M)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(o,{...e})}):o(e)}},2172:(e,t,s)=>{s.d(t,{I:()=>d,M:()=>r});var n=s(1504);const l={},i=n.createContext(l);function r(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:r(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fec9c3b1.59fc189b.js b/assets/js/fec9c3b1.59fc189b.js new file mode 100644 index 00000000..943281bf --- /dev/null +++ b/assets/js/fec9c3b1.59fc189b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[284],{9824:(s,e,a)=>{a.r(e),a.d(e,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>m,metadata:()=>t,toc:()=>r});var l=a(7624),n=a(2172);const m={title:"Network Model (CS4226)"},i=void 0,t={id:"network-model",title:"Network Model (CS4226)",description:"Published on November 30, 2020",source:"@site/docs/network-model.md",sourceDirName:".",slug:"/network-model",permalink:"/docs/network-model",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{title:"Network Model (CS4226)"},sidebar:"docs",previous:{title:"Mininet Setup",permalink:"/docs/mininet-setup"},next:{title:"Dependency management",permalink:"/docs/ruby-dependency-management"}},c={},r=[{value:"Performance metrics",id:"performance-metrics",level:2},{value:"End-to-end delay",id:"end-to-end-delay",level:2},{value:"Queueing delay",id:"queueing-delay",level:2},{value:"Little's Law",id:"littles-law",level:3},{value:"Modelling arrival time",id:"modelling-arrival-time",level:3},{value:"Merging Poisson processes",id:"merging-poisson-processes",level:3},{value:"M/M/1 queueing model",id:"mm1-queueing-model",level:2},{value:"Definitions",id:"definitions",level:3},{value:"M/M/1 Formulas",id:"mm1-formulas",level:3},{value:"Burke's Theorem",id:"burkes-theorem",level:3},{value:"Tandem queues",id:"tandem-queues",level:3},{value:"Jackson network",id:"jackson-network",level:3},{value:"Resources",id:"resources",level:2}];function h(s){const e={a:"a",admonition:"admonition",annotation:"annotation",h2:"h2",h3:"h3",li:"li",math:"math",mdxAdmonitionTitle:"mdxAdmonitionTitle",mfrac:"mfrac",mi:"mi",mn:"mn",mo:"mo",mrow:"mrow",msub:"msub",msubsup:"msubsup",msup:"msup",mtext:"mtext",ol:"ol",p:"p",semantics:"semantics",span:"span",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.M)(),...s.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(e.p,{children:"Published on November 30, 2020"}),"\n",(0,l.jsxs)(e.p,{children:["In this document, you will find my summary for the Network Performance Model and Queueing Model content covered under ",(0,l.jsx)(e.a,{href:"https://nusmods.com/modules/CS4226/internet-architecture",children:"CS4226: Internet Architecture"})," course taught by ",(0,l.jsx)(e.a,{href:"https://www.comp.nus.edu.sg/~tbma/",children:"Dr. Richard Ma"}),". I compiled this document with the help of notes written by my good friend Matthew over ",(0,l.jsx)(e.a,{href:"https://crazoter.github.io/My-Docs/docs/markdown/CS4226_summary",children:"here"}),"."]}),"\n",(0,l.jsx)(e.h2,{id:"performance-metrics",children:"Performance metrics"}),"\n",(0,l.jsxs)(e.table,{children:[(0,l.jsx)(e.thead,{children:(0,l.jsxs)(e.tr,{children:[(0,l.jsx)(e.th,{style:{textAlign:"left"},children:"Metric"}),(0,l.jsx)(e.th,{style:{textAlign:"left"},children:"Definition"})]})}),(0,l.jsxs)(e.tbody,{children:[(0,l.jsxs)(e.tr,{children:[(0,l.jsx)(e.td,{style:{textAlign:"left"},children:"Link Rate / Bandwidth"}),(0,l.jsx)(e.td,{style:{textAlign:"left"},children:"Theoretical maximum capacity; indirectly related to speed"})]}),(0,l.jsxs)(e.tr,{children:[(0,l.jsx)(e.td,{style:{textAlign:"left"},children:"Throughput / Effective bandwidth"}),(0,l.jsxs)(e.td,{style:{textAlign:"left"},children:["Actual data transfer rate between source and destination; directly related to speed; with ",(0,l.jsx)(e.strong,{children:"end-to-end delay"})," factored in"]})]})]})]}),"\n",(0,l.jsx)(e.h2,{id:"end-to-end-delay",children:"End-to-end delay"}),"\n",(0,l.jsx)(e.p,{children:"For a given packet being sent over a link, end-to-end delay is made up of:"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["Transmission delay: dependent on packet size ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"L"}),(0,l.jsx)(e.mtext,{children:"\xa0"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"("}),(0,l.jsx)(e.mi,{children:"b"}),(0,l.jsx)(e.mi,{children:"i"}),(0,l.jsx)(e.mi,{children:"t"}),(0,l.jsx)(e.mi,{children:"s"}),(0,l.jsx)(e.mo,{stretchy:"false",children:")"})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"L\\ (bits)"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"L"}),(0,l.jsx)(e.span,{className:"mspace",children:"\xa0"}),(0,l.jsx)(e.span,{className:"mopen",children:"("}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"bi"}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"t"}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"s"}),(0,l.jsx)(e.span,{className:"mclose",children:")"})]})})]})," and link rate ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"R"}),(0,l.jsx)(e.mtext,{children:"\xa0"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"("}),(0,l.jsx)(e.mi,{children:"b"}),(0,l.jsx)(e.mi,{children:"i"}),(0,l.jsx)(e.mi,{children:"t"}),(0,l.jsx)(e.mi,{children:"s"}),(0,l.jsx)(e.mi,{mathvariant:"normal",children:"/"}),(0,l.jsx)(e.mi,{children:"s"}),(0,l.jsx)(e.mo,{stretchy:"false",children:")"})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"R\\ (bits/s)"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.00773em"},children:"R"}),(0,l.jsx)(e.span,{className:"mspace",children:"\xa0"}),(0,l.jsx)(e.span,{className:"mopen",children:"("}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"bi"}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"t"}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"s"}),(0,l.jsx)(e.span,{className:"mord",children:"/"}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"s"}),(0,l.jsx)(e.span,{className:"mclose",children:")"})]})})]}),": ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"d"}),(0,l.jsx)(e.mi,{children:"T"})]}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsxs)(e.mfrac,{children:[(0,l.jsx)(e.mi,{children:"L"}),(0,l.jsx)(e.mi,{children:"R"})]})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"d_{T} = \\frac{L}{R}"})]})})}),(0,l.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.8444em",verticalAlign:"-0.15em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",children:"d"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3283em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",style:{marginRight:"0.13889em"},children:"T"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1.2173em",verticalAlign:"-0.345em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mopen nulldelimiter"}),(0,l.jsx)(e.span,{className:"mfrac",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsxs)(e.span,{className:"vlist",style:{height:"0.8723em"},children:[(0,l.jsxs)(e.span,{style:{top:"-2.655em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",style:{marginRight:"0.00773em"},children:"R"})})})]}),(0,l.jsxs)(e.span,{style:{top:"-3.23em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"frac-line",style:{borderBottomWidth:"0.04em"}})]}),(0,l.jsxs)(e.span,{style:{top:"-3.394em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"L"})})})]})]}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.345em"},children:(0,l.jsx)(e.span,{})})})]})}),(0,l.jsx)(e.span,{className:"mclose nulldelimiter"})]})]})]})]})]}),"\n",(0,l.jsx)(e.li,{children:"Propagation delay: dependent on distance and propagation speed"}),"\n",(0,l.jsxs)(e.li,{children:["Processing delay: dependent on ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsx)(e.mi,{children:"L"})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"L"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6833em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"L"})]})})]})]}),"\n",(0,l.jsxs)(e.li,{children:[(0,l.jsx)(e.strong,{children:"Queueing delay"}),": dependent on queue size and ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"d"}),(0,l.jsx)(e.mi,{children:"T"})]})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"d_{T}"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.8444em",verticalAlign:"-0.15em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",children:"d"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3283em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",style:{marginRight:"0.13889em"},children:"T"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]})]})})]})]}),"\n"]}),"\n",(0,l.jsx)(e.h2,{id:"queueing-delay",children:"Queueing delay"}),"\n",(0,l.jsx)(e.h3,{id:"littles-law",children:"Little's Law"}),"\n",(0,l.jsxs)(e.admonition,{type:"note",children:[(0,l.jsx)(e.mdxAdmonitionTitle,{children:(0,l.jsx)(e.a,{href:"https://en.wikipedia.org/wiki/Little%27s_law",children:"Wikipedia cite"})}),(0,l.jsxs)(e.p,{children:["The long-term average number ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsx)(e.mi,{children:"L"})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"L"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6833em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"L"})]})})]})," of customers in a stationary system is equal to the long-term average effective arrival rate ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsx)(e.mi,{children:"\u03bb"})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"\\lambda"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6944em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03bb"})]})})]})," multiplied by the average time ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsx)(e.mi,{children:"W"})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"W"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6833em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"W"})]})})]})," that a customer spends in the system."]})]}),"\n",(0,l.jsx)(e.p,{children:"In the context of Internet Architecture:"}),"\n",(0,l.jsx)(e.p,{children:(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"L"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsx)(e.mi,{children:"\u03bb"}),(0,l.jsx)(e.mi,{children:"W"})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"L = \\lambda W"})]})})}),(0,l.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6833em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"L"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6944em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"\u03bbW"})]})]})]})}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:[(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsx)(e.mi,{children:"L"})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"L"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6833em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"L"})]})})]}),": Average number of packets in the system","\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsx)(e.li,{children:(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"L"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsxs)(e.msub,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"lim"}),(0,l.jsx)(e.mo,{children:"\u2061"})]}),(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"t"}),(0,l.jsx)(e.mo,{children:"\u2192"}),(0,l.jsx)(e.mi,{mathvariant:"normal",children:"\u221e"})]})]}),(0,l.jsxs)(e.mfrac,{children:[(0,l.jsx)(e.mn,{children:"1"}),(0,l.jsx)(e.mi,{children:"t"})]}),(0,l.jsxs)(e.msubsup,{children:[(0,l.jsx)(e.mo,{children:"\u222b"}),(0,l.jsx)(e.mn,{children:"0"}),(0,l.jsx)(e.mi,{children:"t"})]}),(0,l.jsx)(e.mi,{children:"L"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"("}),(0,l.jsx)(e.mi,{children:"s"}),(0,l.jsx)(e.mo,{stretchy:"false",children:")"}),(0,l.jsx)(e.mi,{children:"d"}),(0,l.jsx)(e.mi,{children:"s"})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"L = \\lim_{t \\to \\infty} \\frac{1}{t} \\int^{t}_{0} L(s) ds"})]})})}),(0,l.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6833em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"L"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1.3443em",verticalAlign:"-0.3558em"}}),(0,l.jsxs)(e.span,{className:"mop",children:[(0,l.jsx)(e.span,{className:"mop",children:"lim"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.2806em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsxs)(e.span,{className:"mord mtight",children:[(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"t"}),(0,l.jsx)(e.span,{className:"mrel mtight",children:"\u2192"}),(0,l.jsx)(e.span,{className:"mord mtight",children:"\u221e"})]})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.1667em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mopen nulldelimiter"}),(0,l.jsx)(e.span,{className:"mfrac",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsxs)(e.span,{className:"vlist",style:{height:"0.8451em"},children:[(0,l.jsxs)(e.span,{style:{top:"-2.655em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"t"})})})]}),(0,l.jsxs)(e.span,{style:{top:"-3.23em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"frac-line",style:{borderBottomWidth:"0.04em"}})]}),(0,l.jsxs)(e.span,{style:{top:"-3.394em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"1"})})})]})]}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.345em"},children:(0,l.jsx)(e.span,{})})})]})}),(0,l.jsx)(e.span,{className:"mclose nulldelimiter"})]}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.1667em"}}),(0,l.jsxs)(e.span,{className:"mop",children:[(0,l.jsx)(e.span,{className:"mop op-symbol small-op",style:{marginRight:"0.19445em",position:"relative",top:"-0.0006em"},children:"\u222b"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsxs)(e.span,{className:"vlist",style:{height:"0.9885em"},children:[(0,l.jsxs)(e.span,{style:{top:"-2.3442em",marginLeft:"-0.1945em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"0"})})})]}),(0,l.jsxs)(e.span,{style:{top:"-3.2579em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"t"})})})]})]}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3558em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.1667em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"L"}),(0,l.jsx)(e.span,{className:"mopen",children:"("}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"s"}),(0,l.jsx)(e.span,{className:"mclose",children:")"}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"d"}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"s"})]})]})]})}),"\n"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:[(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsx)(e.mi,{children:"\u03bb"})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"\\lambda"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6944em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03bb"})]})})]}),": Average packet arrival rate for the system","\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:[(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"\u03bb"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsxs)(e.msub,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"lim"}),(0,l.jsx)(e.mo,{children:"\u2061"})]}),(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"t"}),(0,l.jsx)(e.mo,{children:"\u2192"}),(0,l.jsx)(e.mi,{mathvariant:"normal",children:"\u221e"})]})]}),(0,l.jsxs)(e.mfrac,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"N"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"("}),(0,l.jsx)(e.mi,{children:"t"}),(0,l.jsx)(e.mo,{stretchy:"false",children:")"})]}),(0,l.jsx)(e.mi,{children:"t"})]})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"\\lambda = \\lim_{t \\to \\infty} \\frac{N(t)}{t}"})]})})}),(0,l.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6944em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03bb"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1.355em",verticalAlign:"-0.345em"}}),(0,l.jsxs)(e.span,{className:"mop",children:[(0,l.jsx)(e.span,{className:"mop",children:"lim"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.2806em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsxs)(e.span,{className:"mord mtight",children:[(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"t"}),(0,l.jsx)(e.span,{className:"mrel mtight",children:"\u2192"}),(0,l.jsx)(e.span,{className:"mord mtight",children:"\u221e"})]})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.1667em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mopen nulldelimiter"}),(0,l.jsx)(e.span,{className:"mfrac",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsxs)(e.span,{className:"vlist",style:{height:"1.01em"},children:[(0,l.jsxs)(e.span,{style:{top:"-2.655em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"t"})})})]}),(0,l.jsxs)(e.span,{style:{top:"-3.23em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"frac-line",style:{borderBottomWidth:"0.04em"}})]}),(0,l.jsxs)(e.span,{style:{top:"-3.485em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsxs)(e.span,{className:"mord mtight",children:[(0,l.jsx)(e.span,{className:"mord mathnormal mtight",style:{marginRight:"0.10903em"},children:"N"}),(0,l.jsx)(e.span,{className:"mopen mtight",children:"("}),(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"t"}),(0,l.jsx)(e.span,{className:"mclose mtight",children:")"})]})})]})]}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.345em"},children:(0,l.jsx)(e.span,{})})})]})}),(0,l.jsx)(e.span,{className:"mclose nulldelimiter"})]})]})]})]})," where ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"N"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"("}),(0,l.jsx)(e.mi,{children:"t"}),(0,l.jsx)(e.mo,{stretchy:"false",children:")"})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"N(t)"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.10903em"},children:"N"}),(0,l.jsx)(e.span,{className:"mopen",children:"("}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"t"}),(0,l.jsx)(e.span,{className:"mclose",children:")"})]})})]})," is the number of packets which arrived up to time ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsx)(e.mi,{children:"t"})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"t"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6151em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"t"})]})})]})]}),"\n"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:[(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsx)(e.mi,{children:"W"})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"W"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6833em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"W"})]})})]}),": Average sojourn time","\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:[(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"W"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsxs)(e.msub,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"lim"}),(0,l.jsx)(e.mo,{children:"\u2061"})]}),(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"n"}),(0,l.jsx)(e.mo,{children:"\u2192"}),(0,l.jsx)(e.mi,{mathvariant:"normal",children:"\u221e"})]})]}),(0,l.jsxs)(e.mfrac,{children:[(0,l.jsx)(e.mn,{children:"1"}),(0,l.jsx)(e.mi,{children:"n"})]}),(0,l.jsxs)(e.msubsup,{children:[(0,l.jsx)(e.mo,{children:"\u2211"}),(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"i"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsx)(e.mn,{children:"1"})]}),(0,l.jsx)(e.mi,{children:"n"})]}),(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"W"}),(0,l.jsx)(e.mi,{children:"i"})]})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"W = \\lim_{n \\to \\infty} \\frac{1}{n} \\sum^{n}_{i = 1} W_{i}"})]})})}),(0,l.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6833em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"W"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1.1901em",verticalAlign:"-0.345em"}}),(0,l.jsxs)(e.span,{className:"mop",children:[(0,l.jsx)(e.span,{className:"mop",children:"lim"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.1514em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsxs)(e.span,{className:"mord mtight",children:[(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"n"}),(0,l.jsx)(e.span,{className:"mrel mtight",children:"\u2192"}),(0,l.jsx)(e.span,{className:"mord mtight",children:"\u221e"})]})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.1667em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mopen nulldelimiter"}),(0,l.jsx)(e.span,{className:"mfrac",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsxs)(e.span,{className:"vlist",style:{height:"0.8451em"},children:[(0,l.jsxs)(e.span,{style:{top:"-2.655em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"n"})})})]}),(0,l.jsxs)(e.span,{style:{top:"-3.23em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"frac-line",style:{borderBottomWidth:"0.04em"}})]}),(0,l.jsxs)(e.span,{style:{top:"-3.394em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"1"})})})]})]}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.345em"},children:(0,l.jsx)(e.span,{})})})]})}),(0,l.jsx)(e.span,{className:"mclose nulldelimiter"})]}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.1667em"}}),(0,l.jsxs)(e.span,{className:"mop",children:[(0,l.jsx)(e.span,{className:"mop op-symbol small-op",style:{position:"relative",top:"0em"},children:"\u2211"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsxs)(e.span,{className:"vlist",style:{height:"0.8043em"},children:[(0,l.jsxs)(e.span,{style:{top:"-2.4003em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsxs)(e.span,{className:"mord mtight",children:[(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"i"}),(0,l.jsx)(e.span,{className:"mrel mtight",children:"="}),(0,l.jsx)(e.span,{className:"mord mtight",children:"1"})]})})]}),(0,l.jsxs)(e.span,{style:{top:"-3.2029em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"n"})})})]})]}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.2997em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.1667em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"W"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3117em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"-0.1389em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"i"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]})]})]})]})," where n is the number of packets and ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"W"}),(0,l.jsx)(e.mi,{children:"i"})]})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"W_{i}"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.8333em",verticalAlign:"-0.15em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"W"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3117em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"-0.1389em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"i"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]})]})})]})," is the waiting/sojourn time for the ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsx)(e.mi,{children:"i"})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"i"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6595em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"i"})]})})]}),"th packet"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(e.h3,{id:"modelling-arrival-time",children:"Modelling arrival time"}),"\n",(0,l.jsx)(e.p,{children:"Given:"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:[(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"t"}),(0,l.jsx)(e.mi,{children:"i"})]})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"t_{i}"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.7651em",verticalAlign:"-0.15em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",children:"t"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3117em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"i"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]})]})})]}),": Arrival time of ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsx)(e.mi,{children:"i"})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"i"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6595em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"i"})]})})]}),"th packet"]}),"\n",(0,l.jsxs)(e.li,{children:[(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"T"}),(0,l.jsx)(e.mi,{children:"i"})]})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"T_{i}"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.8333em",verticalAlign:"-0.15em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"T"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3117em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"-0.1389em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"i"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]})]})})]}),": Inter-arrival time where ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"T"}),(0,l.jsx)(e.mi,{children:"i"})]}),(0,l.jsx)(e.mo,{children:"\u225c"}),(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"t"}),(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"i"}),(0,l.jsx)(e.mo,{children:"+"}),(0,l.jsx)(e.mn,{children:"1"})]})]}),(0,l.jsx)(e.mo,{children:"\u2212"}),(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"t"}),(0,l.jsx)(e.mi,{children:"i"})]})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"T_{i} \\triangleq t_{i + 1} - t_{i}"})]})})}),(0,l.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1.0667em",verticalAlign:"-0.15em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"T"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3117em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"-0.1389em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"i"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel amsrm",children:"\u225c"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.8234em",verticalAlign:"-0.2083em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",children:"t"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3117em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsxs)(e.span,{className:"mord mtight",children:[(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"i"}),(0,l.jsx)(e.span,{className:"mbin mtight",children:"+"}),(0,l.jsx)(e.span,{className:"mord mtight",children:"1"})]})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.2083em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,l.jsx)(e.span,{className:"mbin",children:"\u2212"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.7651em",verticalAlign:"-0.15em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",children:"t"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3117em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"i"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]})]})]})]})]}),"\n"]}),"\n",(0,l.jsxs)(e.p,{children:["Model ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"T"}),(0,l.jsx)(e.mi,{children:"i"})]})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"T_{i}"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.8333em",verticalAlign:"-0.15em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"T"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3117em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"-0.1389em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"i"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]})]})})]}),"s using independent and identically distributed ",(0,l.jsx)(e.strong,{children:"(i.i.d.)"})," random variable ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsx)(e.mi,{children:"T"})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"T"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6833em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"T"})]})})]})," which is exponentially distributed, with ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"\u03bb"}),(0,l.jsx)(e.mo,{children:"\u2265"}),(0,l.jsx)(e.mn,{children:"0"})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"\\lambda \\geq 0"})]})})}),(0,l.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.8304em",verticalAlign:"-0.136em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03bb"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"\u2265"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6444em"}}),(0,l.jsx)(e.span,{className:"mord",children:"0"})]})]})]})," condition. Exponential distribution was chosen because of its memoryless property."]}),"\n",(0,l.jsx)(e.p,{children:"Properties:"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsx)(e.li,{children:(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"P"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"("}),(0,l.jsx)(e.mi,{children:"T"}),(0,l.jsx)(e.mo,{children:">"}),(0,l.jsx)(e.mi,{children:"t"}),(0,l.jsx)(e.mo,{stretchy:"false",children:")"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsxs)(e.msup,{children:[(0,l.jsx)(e.mi,{children:"e"}),(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mo,{children:"\u2212"}),(0,l.jsx)(e.mi,{children:"\u03bb"}),(0,l.jsx)(e.mi,{children:"t"})]})]})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"P(T > t) = e^{-\\lambda t}"})]})})}),(0,l.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"P"}),(0,l.jsx)(e.span,{className:"mopen",children:"("}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"T"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:">"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"t"}),(0,l.jsx)(e.span,{className:"mclose",children:")"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.8491em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",children:"e"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsx)(e.span,{className:"vlist-t",children:(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.8491em"},children:(0,l.jsxs)(e.span,{style:{top:"-3.063em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsxs)(e.span,{className:"mord mtight",children:[(0,l.jsx)(e.span,{className:"mord mtight",children:"\u2212"}),(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"\u03bb"}),(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"t"})]})})]})})})})})]})]})]})]})}),"\n",(0,l.jsx)(e.li,{children:(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"P"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"("}),(0,l.jsx)(e.mi,{children:"T"}),(0,l.jsx)(e.mo,{children:"\u2264"}),(0,l.jsx)(e.mi,{children:"t"}),(0,l.jsx)(e.mo,{stretchy:"false",children:")"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsx)(e.mn,{children:"1"}),(0,l.jsx)(e.mo,{children:"\u2212"}),(0,l.jsxs)(e.msup,{children:[(0,l.jsx)(e.mi,{children:"e"}),(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mo,{children:"\u2212"}),(0,l.jsx)(e.mi,{children:"\u03bb"}),(0,l.jsx)(e.mi,{children:"t"})]})]})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"P(T \\leq t) = 1-e^{-\\lambda t}"})]})})}),(0,l.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"P"}),(0,l.jsx)(e.span,{className:"mopen",children:"("}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"T"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"\u2264"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"t"}),(0,l.jsx)(e.span,{className:"mclose",children:")"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.7278em",verticalAlign:"-0.0833em"}}),(0,l.jsx)(e.span,{className:"mord",children:"1"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,l.jsx)(e.span,{className:"mbin",children:"\u2212"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.8491em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",children:"e"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsx)(e.span,{className:"vlist-t",children:(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.8491em"},children:(0,l.jsxs)(e.span,{style:{top:"-3.063em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsxs)(e.span,{className:"mord mtight",children:[(0,l.jsx)(e.span,{className:"mord mtight",children:"\u2212"}),(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"\u03bb"}),(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"t"})]})})]})})})})})]})]})]})]})}),"\n",(0,l.jsx)(e.li,{children:(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"E"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"["}),(0,l.jsx)(e.mi,{children:"T"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"]"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsxs)(e.mfrac,{children:[(0,l.jsx)(e.mn,{children:"1"}),(0,l.jsx)(e.mi,{children:"\u03bb"})]})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"E[T] = \\frac{1}{\\lambda}"})]})})}),(0,l.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.05764em"},children:"E"}),(0,l.jsx)(e.span,{className:"mopen",children:"["}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"T"}),(0,l.jsx)(e.span,{className:"mclose",children:"]"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1.1901em",verticalAlign:"-0.345em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mopen nulldelimiter"}),(0,l.jsx)(e.span,{className:"mfrac",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsxs)(e.span,{className:"vlist",style:{height:"0.8451em"},children:[(0,l.jsxs)(e.span,{style:{top:"-2.655em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"\u03bb"})})})]}),(0,l.jsxs)(e.span,{style:{top:"-3.23em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"frac-line",style:{borderBottomWidth:"0.04em"}})]}),(0,l.jsxs)(e.span,{style:{top:"-3.394em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"1"})})})]})]}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.345em"},children:(0,l.jsx)(e.span,{})})})]})}),(0,l.jsx)(e.span,{className:"mclose nulldelimiter"})]})]})]})]})}),"\n",(0,l.jsxs)(e.li,{children:["Memoryless property: ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"P"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"{"}),(0,l.jsx)(e.mi,{children:"T"}),(0,l.jsx)(e.mo,{children:">"}),(0,l.jsx)(e.mi,{children:"s"}),(0,l.jsx)(e.mo,{children:"+"}),(0,l.jsx)(e.mi,{children:"t"}),(0,l.jsx)(e.mtext,{children:"\xa0"}),(0,l.jsx)(e.mi,{mathvariant:"normal",children:"\u2223"}),(0,l.jsx)(e.mtext,{children:"\xa0"}),(0,l.jsx)(e.mi,{children:"T"}),(0,l.jsx)(e.mo,{children:">"}),(0,l.jsx)(e.mi,{children:"s"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"}"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsx)(e.mi,{children:"P"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"{"}),(0,l.jsx)(e.mi,{children:"T"}),(0,l.jsx)(e.mo,{children:">"}),(0,l.jsx)(e.mi,{children:"t"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"}"})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"P\\{T > s + t\\ |\\ T > s \\} = P\\{T > t\\}"})]})})}),(0,l.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"P"}),(0,l.jsx)(e.span,{className:"mopen",children:"{"}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"T"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:">"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6667em",verticalAlign:"-0.0833em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"s"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,l.jsx)(e.span,{className:"mbin",children:"+"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"t"}),(0,l.jsx)(e.span,{className:"mspace",children:"\xa0"}),(0,l.jsx)(e.span,{className:"mord",children:"\u2223"}),(0,l.jsx)(e.span,{className:"mspace",children:"\xa0"}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"T"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:">"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"s"}),(0,l.jsx)(e.span,{className:"mclose",children:"}"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"P"}),(0,l.jsx)(e.span,{className:"mopen",children:"{"}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"T"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:">"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"t"}),(0,l.jsx)(e.span,{className:"mclose",children:"}"})]})]})]})]}),"\n"]}),"\n",(0,l.jsx)(e.h3,{id:"merging-poisson-processes",children:"Merging Poisson processes"}),"\n",(0,l.jsxs)(e.p,{children:[(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"T"}),(0,l.jsx)(e.mi,{children:"i"})]})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"T_{i}"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.8333em",verticalAlign:"-0.15em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"T"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3117em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"-0.1389em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"i"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]})]})})]}),"s are ",(0,l.jsx)(e.strong,{children:"i.i.d."})," random variables distributed as ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsx)(e.mi,{children:"T"})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"T"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6833em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"T"})]})})]})," with rate ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsx)(e.mi,{children:"\u03bb"})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"\\lambda"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6944em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03bb"})]})})]}),". This arrival pattern is called a ",(0,l.jsx)(e.strong,{children:"Poisson process"}),", in which starting time does not matter (memoryless property). Therefore, two Poisson proccesses can be merged to create a new Poisson process:"]}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsx)(e.li,{children:(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"\u03bb"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"\u03bb"}),(0,l.jsx)(e.mn,{children:"1"})]}),(0,l.jsx)(e.mo,{children:"+"}),(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"\u03bb"}),(0,l.jsx)(e.mn,{children:"2"})]})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"\\lambda = \\lambda_{1} + \\lambda_{2}"})]})})}),(0,l.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6944em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03bb"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.8444em",verticalAlign:"-0.15em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03bb"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"1"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,l.jsx)(e.span,{className:"mbin",children:"+"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.8444em",verticalAlign:"-0.15em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03bb"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"2"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]})]})]})]})}),"\n",(0,l.jsx)(e.li,{children:(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"T"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsx)(e.mi,{children:"m"}),(0,l.jsx)(e.mi,{children:"i"}),(0,l.jsx)(e.mi,{children:"n"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"{"}),(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"T"}),(0,l.jsx)(e.mn,{children:"1"})]}),(0,l.jsx)(e.mo,{separator:"true",children:","}),(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"T"}),(0,l.jsx)(e.mn,{children:"2"})]}),(0,l.jsx)(e.mo,{stretchy:"false",children:"}"})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"T = min\\{T_{1}, T_{2}\\}"})]})})}),(0,l.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6833em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"T"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"min"}),(0,l.jsx)(e.span,{className:"mopen",children:"{"}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"T"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"-0.1389em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"1"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mpunct",children:","}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.1667em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"T"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"-0.1389em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"2"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mclose",children:"}"})]})]})]})}),"\n",(0,l.jsx)(e.li,{children:(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"P"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"("}),(0,l.jsx)(e.mi,{children:"T"}),(0,l.jsx)(e.mo,{children:">"}),(0,l.jsx)(e.mi,{children:"t"}),(0,l.jsx)(e.mo,{stretchy:"false",children:")"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsx)(e.mi,{children:"P"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"("}),(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"T"}),(0,l.jsx)(e.mn,{children:"1"})]}),(0,l.jsx)(e.mo,{children:">"}),(0,l.jsx)(e.mi,{children:"t"}),(0,l.jsx)(e.mo,{children:"\u2227"}),(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"T"}),(0,l.jsx)(e.mn,{children:"2"})]}),(0,l.jsx)(e.mo,{children:">"}),(0,l.jsx)(e.mi,{children:"t"}),(0,l.jsx)(e.mo,{stretchy:"false",children:")"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsxs)(e.msup,{children:[(0,l.jsx)(e.mi,{children:"e"}),(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mo,{children:"\u2212"}),(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"\u03bb"}),(0,l.jsx)(e.mn,{children:"1"})]}),(0,l.jsx)(e.mi,{children:"t"})]})]}),(0,l.jsxs)(e.msup,{children:[(0,l.jsx)(e.mi,{children:"e"}),(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mo,{children:"\u2212"}),(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"\u03bb"}),(0,l.jsx)(e.mn,{children:"2"})]}),(0,l.jsx)(e.mi,{children:"t"})]})]}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsxs)(e.msup,{children:[(0,l.jsx)(e.mi,{children:"e"}),(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mo,{children:"\u2212"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"("}),(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"\u03bb"}),(0,l.jsx)(e.mn,{children:"1"})]}),(0,l.jsx)(e.mo,{children:"+"}),(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"\u03bb"}),(0,l.jsx)(e.mn,{children:"2"})]}),(0,l.jsx)(e.mo,{stretchy:"false",children:")"}),(0,l.jsx)(e.mi,{children:"t"})]})]})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"P(T > t) = P(T_{1} > t \\wedge T_{2} > t) = e^{-\\lambda_{1} t} e^{-\\lambda_{2} t} = e^{-(\\lambda_{1} + \\lambda_{2}) t}"})]})})}),(0,l.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"P"}),(0,l.jsx)(e.span,{className:"mopen",children:"("}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"T"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:">"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"t"}),(0,l.jsx)(e.span,{className:"mclose",children:")"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"P"}),(0,l.jsx)(e.span,{className:"mopen",children:"("}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"T"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"-0.1389em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"1"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:">"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6151em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"t"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,l.jsx)(e.span,{className:"mbin",children:"\u2227"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.8333em",verticalAlign:"-0.15em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"T"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"-0.1389em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"2"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:">"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"t"}),(0,l.jsx)(e.span,{className:"mclose",children:")"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.8491em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",children:"e"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsx)(e.span,{className:"vlist-t",children:(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.8491em"},children:(0,l.jsxs)(e.span,{style:{top:"-3.063em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsxs)(e.span,{className:"mord mtight",children:[(0,l.jsx)(e.span,{className:"mord mtight",children:"\u2212"}),(0,l.jsxs)(e.span,{className:"mord mtight",children:[(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"\u03bb"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3173em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.357em",marginLeft:"0em",marginRight:"0.0714em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.5em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size3 size1 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"1"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.143em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"t"})]})})]})})})})})]}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",children:"e"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsx)(e.span,{className:"vlist-t",children:(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.8491em"},children:(0,l.jsxs)(e.span,{style:{top:"-3.063em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsxs)(e.span,{className:"mord mtight",children:[(0,l.jsx)(e.span,{className:"mord mtight",children:"\u2212"}),(0,l.jsxs)(e.span,{className:"mord mtight",children:[(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"\u03bb"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3173em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.357em",marginLeft:"0em",marginRight:"0.0714em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.5em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size3 size1 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"2"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.143em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"t"})]})})]})})})})})]}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.888em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",children:"e"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsx)(e.span,{className:"vlist-t",children:(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.888em"},children:(0,l.jsxs)(e.span,{style:{top:"-3.063em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsxs)(e.span,{className:"mord mtight",children:[(0,l.jsx)(e.span,{className:"mord mtight",children:"\u2212"}),(0,l.jsx)(e.span,{className:"mopen mtight",children:"("}),(0,l.jsxs)(e.span,{className:"mord mtight",children:[(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"\u03bb"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3173em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.357em",marginLeft:"0em",marginRight:"0.0714em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.5em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size3 size1 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"1"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.143em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mbin mtight",children:"+"}),(0,l.jsxs)(e.span,{className:"mord mtight",children:[(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"\u03bb"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3173em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.357em",marginLeft:"0em",marginRight:"0.0714em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.5em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size3 size1 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"2"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.143em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mclose mtight",children:")"}),(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"t"})]})})]})})})})})]})]})]})]})}),"\n",(0,l.jsx)(e.li,{children:(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"E"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"["}),(0,l.jsx)(e.mi,{children:"T"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"]"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsxs)(e.mfrac,{children:[(0,l.jsx)(e.mn,{children:"1"}),(0,l.jsxs)(e.mrow,{children:[(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"\u03bb"}),(0,l.jsx)(e.mn,{children:"1"})]}),(0,l.jsx)(e.mo,{children:"+"}),(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"\u03bb"}),(0,l.jsx)(e.mn,{children:"2"})]})]})]})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"E[T] = \\frac{1}{\\lambda_1 + \\lambda_2}"})]})})}),(0,l.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.05764em"},children:"E"}),(0,l.jsx)(e.span,{className:"mopen",children:"["}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"T"}),(0,l.jsx)(e.span,{className:"mclose",children:"]"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1.2902em",verticalAlign:"-0.4451em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mopen nulldelimiter"}),(0,l.jsx)(e.span,{className:"mfrac",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsxs)(e.span,{className:"vlist",style:{height:"0.8451em"},children:[(0,l.jsxs)(e.span,{style:{top:"-2.655em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsxs)(e.span,{className:"mord mtight",children:[(0,l.jsxs)(e.span,{className:"mord mtight",children:[(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"\u03bb"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3173em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.357em",marginLeft:"0em",marginRight:"0.0714em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.5em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size3 size1 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"1"})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.143em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mbin mtight",children:"+"}),(0,l.jsxs)(e.span,{className:"mord mtight",children:[(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"\u03bb"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3173em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.357em",marginLeft:"0em",marginRight:"0.0714em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.5em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size3 size1 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"2"})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.143em"},children:(0,l.jsx)(e.span,{})})})]})})]})]})})]}),(0,l.jsxs)(e.span,{style:{top:"-3.23em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"frac-line",style:{borderBottomWidth:"0.04em"}})]}),(0,l.jsxs)(e.span,{style:{top:"-3.394em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"1"})})})]})]}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.4451em"},children:(0,l.jsx)(e.span,{})})})]})}),(0,l.jsx)(e.span,{className:"mclose nulldelimiter"})]})]})]})]})}),"\n"]}),"\n",(0,l.jsx)(e.h2,{id:"mm1-queueing-model",children:"M/M/1 queueing model"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsx)(e.li,{children:"Single server with a queue of infinite length"}),"\n",(0,l.jsxs)(e.li,{children:["Exponential i.i.d. service time with rate ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsx)(e.mi,{children:"\u03bc"})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"\\mu"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.625em",verticalAlign:"-0.1944em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03bc"})]})})]})]}),"\n"]}),"\n",(0,l.jsx)(e.h3,{id:"definitions",children:"Definitions"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:[(0,l.jsx)(e.strong,{children:"Utilization"}),": ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"\u03c1"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsxs)(e.mfrac,{children:[(0,l.jsx)(e.mi,{children:"\u03bb"}),(0,l.jsx)(e.mi,{children:"\u03bc"})]})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"\\rho = \\frac{\\lambda}{\\mu}"})]})})}),(0,l.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.625em",verticalAlign:"-0.1944em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03c1"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1.3612em",verticalAlign:"-0.4811em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mopen nulldelimiter"}),(0,l.jsx)(e.span,{className:"mfrac",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsxs)(e.span,{className:"vlist",style:{height:"0.8801em"},children:[(0,l.jsxs)(e.span,{style:{top:"-2.655em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"\u03bc"})})})]}),(0,l.jsxs)(e.span,{style:{top:"-3.23em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"frac-line",style:{borderBottomWidth:"0.04em"}})]}),(0,l.jsxs)(e.span,{style:{top:"-3.394em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"\u03bb"})})})]})]}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.4811em"},children:(0,l.jsx)(e.span,{})})})]})}),(0,l.jsx)(e.span,{className:"mclose nulldelimiter"})]})]})]})]}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["Percentage of time whereby the server is busy (1 item in server)","\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsx)(e.li,{children:"Alternatively, mean number of packets in the server"}),"\n"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:["Derived from ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"E"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"["}),(0,l.jsx)(e.mi,{children:"L"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"]"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsx)(e.mi,{children:"\u03bb"}),(0,l.jsx)(e.mi,{children:"E"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"["}),(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"W"}),(0,l.jsx)(e.mi,{children:"s"})]}),(0,l.jsx)(e.mo,{stretchy:"false",children:"]"})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"E[L] = \\lambda E[W_{s}]"})]})})}),(0,l.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.05764em"},children:"E"}),(0,l.jsx)(e.span,{className:"mopen",children:"["}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"L"}),(0,l.jsx)(e.span,{className:"mclose",children:"]"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03bb"}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.05764em"},children:"E"}),(0,l.jsx)(e.span,{className:"mopen",children:"["}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"W"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.1514em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"-0.1389em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"s"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mclose",children:"]"})]})]})]})," where average service time = ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"E"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"["}),(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"W"}),(0,l.jsx)(e.mi,{children:"s"})]}),(0,l.jsx)(e.mo,{stretchy:"false",children:"]"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsxs)(e.mfrac,{children:[(0,l.jsx)(e.mn,{children:"1"}),(0,l.jsx)(e.mi,{children:"\u03bc"})]})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"E[W_{s}] = \\frac{1}{\\mu}"})]})})}),(0,l.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.05764em"},children:"E"}),(0,l.jsx)(e.span,{className:"mopen",children:"["}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"W"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.1514em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"-0.1389em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"s"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mclose",children:"]"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1.3262em",verticalAlign:"-0.4811em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mopen nulldelimiter"}),(0,l.jsx)(e.span,{className:"mfrac",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsxs)(e.span,{className:"vlist",style:{height:"0.8451em"},children:[(0,l.jsxs)(e.span,{style:{top:"-2.655em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"\u03bc"})})})]}),(0,l.jsxs)(e.span,{style:{top:"-3.23em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"frac-line",style:{borderBottomWidth:"0.04em"}})]}),(0,l.jsxs)(e.span,{style:{top:"-3.394em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"1"})})})]})]}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.4811em"},children:(0,l.jsx)(e.span,{})})})]})}),(0,l.jsx)(e.span,{className:"mclose nulldelimiter"})]})]})]})]})]}),"\n",(0,l.jsxs)(e.li,{children:["For server to be stable, ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"\u03c1"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsxs)(e.mfrac,{children:[(0,l.jsx)(e.mi,{children:"\u03bb"}),(0,l.jsx)(e.mi,{children:"\u03bc"})]}),(0,l.jsx)(e.mo,{children:"<"}),(0,l.jsx)(e.mn,{children:"1"}),(0,l.jsx)(e.mo,{children:"\u21d2"}),(0,l.jsx)(e.mi,{children:"\u03bb"}),(0,l.jsx)(e.mo,{children:"<"}),(0,l.jsx)(e.mi,{children:"\u03bc"})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"\\rho = \\frac{\\lambda}{\\mu} < 1 \\Rightarrow \\lambda < \\mu"})]})})}),(0,l.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.625em",verticalAlign:"-0.1944em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03c1"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1.3612em",verticalAlign:"-0.4811em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mopen nulldelimiter"}),(0,l.jsx)(e.span,{className:"mfrac",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsxs)(e.span,{className:"vlist",style:{height:"0.8801em"},children:[(0,l.jsxs)(e.span,{style:{top:"-2.655em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"\u03bc"})})})]}),(0,l.jsxs)(e.span,{style:{top:"-3.23em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"frac-line",style:{borderBottomWidth:"0.04em"}})]}),(0,l.jsxs)(e.span,{style:{top:"-3.394em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"\u03bb"})})})]})]}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.4811em"},children:(0,l.jsx)(e.span,{})})})]})}),(0,l.jsx)(e.span,{className:"mclose nulldelimiter"})]}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"<"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6444em"}}),(0,l.jsx)(e.span,{className:"mord",children:"1"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"\u21d2"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.7335em",verticalAlign:"-0.0391em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03bb"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"<"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.625em",verticalAlign:"-0.1944em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03bc"})]})]})]})]}),"\n"]}),"\n"]}),"\n",(0,l.jsxs)(e.li,{children:[(0,l.jsx)(e.strong,{children:(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"\u03c0"}),(0,l.jsx)(e.mi,{children:"i"})]})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"\\pi_{i}"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.5806em",verticalAlign:"-0.15em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.03588em"},children:"\u03c0"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3117em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"-0.0359em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"i"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]})]})})]})}),": Percentage of time or probability that there are exactly ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsx)(e.mi,{children:"i"})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"i"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6595em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"i"})]})})]})," packets in the system","\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsx)(e.li,{children:(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"\u03c0"}),(0,l.jsx)(e.mi,{children:"i"})]}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsx)(e.mi,{children:"P"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"{"}),(0,l.jsx)(e.mi,{children:"L"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsx)(e.mi,{children:"i"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"}"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsxs)(e.msup,{children:[(0,l.jsx)(e.mi,{children:"\u03c1"}),(0,l.jsx)(e.mi,{children:"i"})]}),(0,l.jsx)(e.mo,{stretchy:"false",children:"("}),(0,l.jsx)(e.mn,{children:"1"}),(0,l.jsx)(e.mo,{children:"\u2212"}),(0,l.jsx)(e.mi,{children:"\u03c1"}),(0,l.jsx)(e.mo,{stretchy:"false",children:")"})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"\\pi_{i} = P\\{L = i\\} = \\rho^{i}(1 - \\rho)"})]})})}),(0,l.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.5806em",verticalAlign:"-0.15em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.03588em"},children:"\u03c0"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3117em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"-0.0359em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"i"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"P"}),(0,l.jsx)(e.span,{className:"mopen",children:"{"}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"L"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"i"}),(0,l.jsx)(e.span,{className:"mclose",children:"}"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1.0747em",verticalAlign:"-0.25em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03c1"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsx)(e.span,{className:"vlist-t",children:(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.8247em"},children:(0,l.jsxs)(e.span,{style:{top:"-3.063em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"i"})})})]})})})})})]}),(0,l.jsx)(e.span,{className:"mopen",children:"("}),(0,l.jsx)(e.span,{className:"mord",children:"1"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,l.jsx)(e.span,{className:"mbin",children:"\u2212"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03c1"}),(0,l.jsx)(e.span,{className:"mclose",children:")"})]})]})]})}),"\n",(0,l.jsx)(e.li,{children:"Follows a Geometric distribution"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(e.h3,{id:"mm1-formulas",children:"M/M/1 Formulas"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsx)(e.li,{children:(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"E"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"["}),(0,l.jsx)(e.mi,{children:"L"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"]"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsx)(e.mi,{children:"E"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"["}),(0,l.jsx)(e.mtext,{children:"packets\xa0in\xa0queue\xa0+\xa0server"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"]"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsxs)(e.mfrac,{children:[(0,l.jsx)(e.mi,{children:"\u03c1"}),(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mn,{children:"1"}),(0,l.jsx)(e.mo,{children:"\u2212"}),(0,l.jsx)(e.mi,{children:"\u03c1"})]})]}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsxs)(e.mfrac,{children:[(0,l.jsx)(e.mi,{children:"\u03bb"}),(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"\u03bc"}),(0,l.jsx)(e.mo,{children:"\u2212"}),(0,l.jsx)(e.mi,{children:"\u03bb"})]})]})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"E[L] = E[\\text{packets in queue + server}] = \\frac{\\rho}{1 - \\rho} = \\frac{\\lambda}{\\mu - \\lambda}"})]})})}),(0,l.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.05764em"},children:"E"}),(0,l.jsx)(e.span,{className:"mopen",children:"["}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"L"}),(0,l.jsx)(e.span,{className:"mclose",children:"]"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.05764em"},children:"E"}),(0,l.jsx)(e.span,{className:"mopen",children:"["}),(0,l.jsx)(e.span,{className:"mord text",children:(0,l.jsx)(e.span,{className:"mord",children:"packets\xa0in\xa0queue\xa0+\xa0server"})}),(0,l.jsx)(e.span,{className:"mclose",children:"]"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1.2286em",verticalAlign:"-0.4811em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mopen nulldelimiter"}),(0,l.jsx)(e.span,{className:"mfrac",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsxs)(e.span,{className:"vlist",style:{height:"0.7475em"},children:[(0,l.jsxs)(e.span,{style:{top:"-2.655em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsxs)(e.span,{className:"mord mtight",children:[(0,l.jsx)(e.span,{className:"mord mtight",children:"1"}),(0,l.jsx)(e.span,{className:"mbin mtight",children:"\u2212"}),(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"\u03c1"})]})})]}),(0,l.jsxs)(e.span,{style:{top:"-3.23em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"frac-line",style:{borderBottomWidth:"0.04em"}})]}),(0,l.jsxs)(e.span,{style:{top:"-3.4461em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"\u03c1"})})})]})]}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.4811em"},children:(0,l.jsx)(e.span,{})})})]})}),(0,l.jsx)(e.span,{className:"mclose nulldelimiter"})]}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1.3612em",verticalAlign:"-0.4811em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mopen nulldelimiter"}),(0,l.jsx)(e.span,{className:"mfrac",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsxs)(e.span,{className:"vlist",style:{height:"0.8801em"},children:[(0,l.jsxs)(e.span,{style:{top:"-2.655em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsxs)(e.span,{className:"mord mtight",children:[(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"\u03bc"}),(0,l.jsx)(e.span,{className:"mbin mtight",children:"\u2212"}),(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"\u03bb"})]})})]}),(0,l.jsxs)(e.span,{style:{top:"-3.23em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"frac-line",style:{borderBottomWidth:"0.04em"}})]}),(0,l.jsxs)(e.span,{style:{top:"-3.394em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"\u03bb"})})})]})]}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.4811em"},children:(0,l.jsx)(e.span,{})})})]})}),(0,l.jsx)(e.span,{className:"mclose nulldelimiter"})]})]})]})]})}),"\n",(0,l.jsx)(e.li,{children:(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"E"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"["}),(0,l.jsx)(e.mtext,{children:"packets\xa0in\xa0queue"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"]"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsx)(e.mi,{children:"E"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"["}),(0,l.jsx)(e.mi,{children:"L"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"]"}),(0,l.jsx)(e.mo,{children:"\u2212"}),(0,l.jsx)(e.mi,{children:"\u03c1"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsxs)(e.mfrac,{children:[(0,l.jsxs)(e.msup,{children:[(0,l.jsx)(e.mi,{children:"\u03c1"}),(0,l.jsx)(e.mn,{children:"2"})]}),(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mn,{children:"1"}),(0,l.jsx)(e.mo,{children:"\u2212"}),(0,l.jsx)(e.mi,{children:"\u03c1"})]})]})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"E[\\text{packets in queue}] = E[L] - \\rho = \\frac{\\rho^{2}}{1-\\rho}"})]})})}),(0,l.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.05764em"},children:"E"}),(0,l.jsx)(e.span,{className:"mopen",children:"["}),(0,l.jsx)(e.span,{className:"mord text",children:(0,l.jsx)(e.span,{className:"mord",children:"packets\xa0in\xa0queue"})}),(0,l.jsx)(e.span,{className:"mclose",children:"]"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.05764em"},children:"E"}),(0,l.jsx)(e.span,{className:"mopen",children:"["}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"L"}),(0,l.jsx)(e.span,{className:"mclose",children:"]"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,l.jsx)(e.span,{className:"mbin",children:"\u2212"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.625em",verticalAlign:"-0.1944em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03c1"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1.5511em",verticalAlign:"-0.4811em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mopen nulldelimiter"}),(0,l.jsx)(e.span,{className:"mfrac",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsxs)(e.span,{className:"vlist",style:{height:"1.07em"},children:[(0,l.jsxs)(e.span,{style:{top:"-2.655em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsxs)(e.span,{className:"mord mtight",children:[(0,l.jsx)(e.span,{className:"mord mtight",children:"1"}),(0,l.jsx)(e.span,{className:"mbin mtight",children:"\u2212"}),(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"\u03c1"})]})})]}),(0,l.jsxs)(e.span,{style:{top:"-3.23em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"frac-line",style:{borderBottomWidth:"0.04em"}})]}),(0,l.jsxs)(e.span,{style:{top:"-3.4461em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsxs)(e.span,{className:"mord mtight",children:[(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"\u03c1"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsx)(e.span,{className:"vlist-t",children:(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.8913em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.931em",marginRight:"0.0714em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.5em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size3 size1 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"2"})})})]})})})})})]})})})]})]}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.4811em"},children:(0,l.jsx)(e.span,{})})})]})}),(0,l.jsx)(e.span,{className:"mclose nulldelimiter"})]})]})]})]})}),"\n",(0,l.jsxs)(e.li,{children:[(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"E"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"["}),(0,l.jsx)(e.mi,{children:"W"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"]"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsxs)(e.mfrac,{children:[(0,l.jsx)(e.mn,{children:"1"}),(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"\u03bc"}),(0,l.jsx)(e.mo,{children:"\u2212"}),(0,l.jsx)(e.mi,{children:"\u03bb"})]})]})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"E[W] = \\frac{1}{\\mu - \\lambda}"})]})})}),(0,l.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.05764em"},children:"E"}),(0,l.jsx)(e.span,{className:"mopen",children:"["}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"W"}),(0,l.jsx)(e.span,{className:"mclose",children:"]"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1.3262em",verticalAlign:"-0.4811em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mopen nulldelimiter"}),(0,l.jsx)(e.span,{className:"mfrac",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsxs)(e.span,{className:"vlist",style:{height:"0.8451em"},children:[(0,l.jsxs)(e.span,{style:{top:"-2.655em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsxs)(e.span,{className:"mord mtight",children:[(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"\u03bc"}),(0,l.jsx)(e.span,{className:"mbin mtight",children:"\u2212"}),(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"\u03bb"})]})})]}),(0,l.jsxs)(e.span,{style:{top:"-3.23em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"frac-line",style:{borderBottomWidth:"0.04em"}})]}),(0,l.jsxs)(e.span,{style:{top:"-3.394em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"1"})})})]})]}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.4811em"},children:(0,l.jsx)(e.span,{})})})]})}),(0,l.jsx)(e.span,{className:"mclose nulldelimiter"})]})]})]})]}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["Derived from ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"L"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsx)(e.mi,{children:"\u03bb"}),(0,l.jsx)(e.mi,{children:"W"}),(0,l.jsx)(e.mo,{children:"\u21d2"}),(0,l.jsx)(e.mn,{children:"1"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsx)(e.mo,{stretchy:"false",children:"("}),(0,l.jsx)(e.mi,{children:"\u03bc"}),(0,l.jsx)(e.mo,{children:"\u2212"}),(0,l.jsx)(e.mi,{children:"\u03bb"}),(0,l.jsx)(e.mo,{stretchy:"false",children:")"}),(0,l.jsx)(e.mo,{children:"\xd7"}),(0,l.jsx)(e.mi,{children:"E"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"["}),(0,l.jsx)(e.mi,{children:"W"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"]"}),(0,l.jsx)(e.mo,{children:"\u21d2"}),(0,l.jsx)(e.mi,{children:"E"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"["}),(0,l.jsx)(e.mi,{children:"W"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"]"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsxs)(e.mfrac,{children:[(0,l.jsx)(e.mn,{children:"1"}),(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"\u03bc"}),(0,l.jsx)(e.mo,{children:"\u2212"}),(0,l.jsx)(e.mi,{children:"\u03bb"})]})]})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"L = \\lambda W \\Rightarrow 1 = (\\mu - \\lambda) \\times E[W] \\Rightarrow E[W] = \\frac{1}{\\mu - \\lambda}"})]})})}),(0,l.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6833em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"L"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6944em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"\u03bbW"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"\u21d2"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6444em"}}),(0,l.jsx)(e.span,{className:"mord",children:"1"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mopen",children:"("}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03bc"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,l.jsx)(e.span,{className:"mbin",children:"\u2212"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03bb"}),(0,l.jsx)(e.span,{className:"mclose",children:")"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,l.jsx)(e.span,{className:"mbin",children:"\xd7"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.05764em"},children:"E"}),(0,l.jsx)(e.span,{className:"mopen",children:"["}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"W"}),(0,l.jsx)(e.span,{className:"mclose",children:"]"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"\u21d2"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.05764em"},children:"E"}),(0,l.jsx)(e.span,{className:"mopen",children:"["}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"W"}),(0,l.jsx)(e.span,{className:"mclose",children:"]"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1.3262em",verticalAlign:"-0.4811em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mopen nulldelimiter"}),(0,l.jsx)(e.span,{className:"mfrac",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsxs)(e.span,{className:"vlist",style:{height:"0.8451em"},children:[(0,l.jsxs)(e.span,{style:{top:"-2.655em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsxs)(e.span,{className:"mord mtight",children:[(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"\u03bc"}),(0,l.jsx)(e.span,{className:"mbin mtight",children:"\u2212"}),(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"\u03bb"})]})})]}),(0,l.jsxs)(e.span,{style:{top:"-3.23em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"frac-line",style:{borderBottomWidth:"0.04em"}})]}),(0,l.jsxs)(e.span,{style:{top:"-3.394em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"1"})})})]})]}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.4811em"},children:(0,l.jsx)(e.span,{})})})]})}),(0,l.jsx)(e.span,{className:"mclose nulldelimiter"})]})]})]})]})]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(e.li,{children:(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"\u03bc"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsx)(e.mi,{children:"\u03bb"}),(0,l.jsx)(e.mo,{children:"+"}),(0,l.jsxs)(e.mfrac,{children:[(0,l.jsx)(e.mn,{children:"1"}),(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"E"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"["}),(0,l.jsx)(e.mi,{children:"W"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"]"})]})]})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"\\mu = \\lambda + \\frac{1}{E[W]}"})]})})}),(0,l.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.625em",verticalAlign:"-0.1944em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03bc"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.7778em",verticalAlign:"-0.0833em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03bb"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,l.jsx)(e.span,{className:"mbin",children:"+"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1.3651em",verticalAlign:"-0.52em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mopen nulldelimiter"}),(0,l.jsx)(e.span,{className:"mfrac",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsxs)(e.span,{className:"vlist",style:{height:"0.8451em"},children:[(0,l.jsxs)(e.span,{style:{top:"-2.655em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsxs)(e.span,{className:"mord mtight",children:[(0,l.jsx)(e.span,{className:"mord mathnormal mtight",style:{marginRight:"0.05764em"},children:"E"}),(0,l.jsx)(e.span,{className:"mopen mtight",children:"["}),(0,l.jsx)(e.span,{className:"mord mathnormal mtight",style:{marginRight:"0.13889em"},children:"W"}),(0,l.jsx)(e.span,{className:"mclose mtight",children:"]"})]})})]}),(0,l.jsxs)(e.span,{style:{top:"-3.23em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"frac-line",style:{borderBottomWidth:"0.04em"}})]}),(0,l.jsxs)(e.span,{style:{top:"-3.394em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"1"})})})]})]}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.52em"},children:(0,l.jsx)(e.span,{})})})]})}),(0,l.jsx)(e.span,{className:"mclose nulldelimiter"})]})]})]})]})}),"\n",(0,l.jsx)(e.li,{children:(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"\u03bb"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsx)(e.mi,{children:"\u03bc"}),(0,l.jsx)(e.mo,{children:"\u2212"}),(0,l.jsxs)(e.mfrac,{children:[(0,l.jsx)(e.mn,{children:"1"}),(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"E"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"["}),(0,l.jsx)(e.mi,{children:"W"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"]"})]})]})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"\\lambda = \\mu - \\frac{1}{E[W]}"})]})})}),(0,l.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6944em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03bb"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.7778em",verticalAlign:"-0.1944em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03bc"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,l.jsx)(e.span,{className:"mbin",children:"\u2212"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1.3651em",verticalAlign:"-0.52em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mopen nulldelimiter"}),(0,l.jsx)(e.span,{className:"mfrac",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsxs)(e.span,{className:"vlist",style:{height:"0.8451em"},children:[(0,l.jsxs)(e.span,{style:{top:"-2.655em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsxs)(e.span,{className:"mord mtight",children:[(0,l.jsx)(e.span,{className:"mord mathnormal mtight",style:{marginRight:"0.05764em"},children:"E"}),(0,l.jsx)(e.span,{className:"mopen mtight",children:"["}),(0,l.jsx)(e.span,{className:"mord mathnormal mtight",style:{marginRight:"0.13889em"},children:"W"}),(0,l.jsx)(e.span,{className:"mclose mtight",children:"]"})]})})]}),(0,l.jsxs)(e.span,{style:{top:"-3.23em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"frac-line",style:{borderBottomWidth:"0.04em"}})]}),(0,l.jsxs)(e.span,{style:{top:"-3.394em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"1"})})})]})]}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.52em"},children:(0,l.jsx)(e.span,{})})})]})}),(0,l.jsx)(e.span,{className:"mclose nulldelimiter"})]})]})]})]})}),"\n",(0,l.jsxs)(e.li,{children:[(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"E"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"["}),(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"W"}),(0,l.jsx)(e.mi,{children:"q"})]}),(0,l.jsx)(e.mo,{stretchy:"false",children:"]"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsx)(e.mi,{children:"E"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"["}),(0,l.jsx)(e.mi,{children:"W"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"]"}),(0,l.jsx)(e.mo,{children:"\u2212"}),(0,l.jsx)(e.mi,{children:"E"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"["}),(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"W"}),(0,l.jsx)(e.mi,{children:"s"})]}),(0,l.jsx)(e.mo,{stretchy:"false",children:"]"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsxs)(e.mfrac,{children:[(0,l.jsx)(e.mn,{children:"1"}),(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"\u03bc"}),(0,l.jsx)(e.mo,{children:"\u2212"}),(0,l.jsx)(e.mi,{children:"\u03bb"})]})]}),(0,l.jsx)(e.mo,{children:"\u2212"}),(0,l.jsxs)(e.mfrac,{children:[(0,l.jsx)(e.mn,{children:"1"}),(0,l.jsx)(e.mi,{children:"\u03bc"})]})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"E[W_q] = E[W] - E[W_{s}] = \\frac{1}{\\mu - \\lambda} - \\frac{1}{\\mu}"})]})})}),(0,l.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1.0361em",verticalAlign:"-0.2861em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.05764em"},children:"E"}),(0,l.jsx)(e.span,{className:"mopen",children:"["}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"W"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.1514em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"-0.1389em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",style:{marginRight:"0.03588em"},children:"q"})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.2861em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mclose",children:"]"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.05764em"},children:"E"}),(0,l.jsx)(e.span,{className:"mopen",children:"["}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"W"}),(0,l.jsx)(e.span,{className:"mclose",children:"]"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,l.jsx)(e.span,{className:"mbin",children:"\u2212"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.05764em"},children:"E"}),(0,l.jsx)(e.span,{className:"mopen",children:"["}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"W"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.1514em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"-0.1389em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"s"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mclose",children:"]"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1.3262em",verticalAlign:"-0.4811em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mopen nulldelimiter"}),(0,l.jsx)(e.span,{className:"mfrac",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsxs)(e.span,{className:"vlist",style:{height:"0.8451em"},children:[(0,l.jsxs)(e.span,{style:{top:"-2.655em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsxs)(e.span,{className:"mord mtight",children:[(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"\u03bc"}),(0,l.jsx)(e.span,{className:"mbin mtight",children:"\u2212"}),(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"\u03bb"})]})})]}),(0,l.jsxs)(e.span,{style:{top:"-3.23em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"frac-line",style:{borderBottomWidth:"0.04em"}})]}),(0,l.jsxs)(e.span,{style:{top:"-3.394em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"1"})})})]})]}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.4811em"},children:(0,l.jsx)(e.span,{})})})]})}),(0,l.jsx)(e.span,{className:"mclose nulldelimiter"})]}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,l.jsx)(e.span,{className:"mbin",children:"\u2212"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1.3262em",verticalAlign:"-0.4811em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mopen nulldelimiter"}),(0,l.jsx)(e.span,{className:"mfrac",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsxs)(e.span,{className:"vlist",style:{height:"0.8451em"},children:[(0,l.jsxs)(e.span,{style:{top:"-2.655em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"\u03bc"})})})]}),(0,l.jsxs)(e.span,{style:{top:"-3.23em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"frac-line",style:{borderBottomWidth:"0.04em"}})]}),(0,l.jsxs)(e.span,{style:{top:"-3.394em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"1"})})})]})]}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.4811em"},children:(0,l.jsx)(e.span,{})})})]})}),(0,l.jsx)(e.span,{className:"mclose nulldelimiter"})]})]})]})]}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsxs)(e.li,{children:["Derived from ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"E"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"["}),(0,l.jsx)(e.mi,{children:"W"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"]"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsx)(e.mi,{children:"E"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"["}),(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"W"}),(0,l.jsx)(e.mi,{children:"q"})]}),(0,l.jsx)(e.mo,{stretchy:"false",children:"]"}),(0,l.jsx)(e.mo,{children:"+"}),(0,l.jsx)(e.mi,{children:"E"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"["}),(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"W"}),(0,l.jsx)(e.mi,{children:"s"})]}),(0,l.jsx)(e.mo,{stretchy:"false",children:"]"}),(0,l.jsx)(e.mo,{children:"\u21d2"}),(0,l.jsx)(e.mi,{children:"E"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"["}),(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"W"}),(0,l.jsx)(e.mi,{children:"q"})]}),(0,l.jsx)(e.mo,{stretchy:"false",children:"]"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsx)(e.mi,{children:"E"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"["}),(0,l.jsx)(e.mi,{children:"W"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"]"}),(0,l.jsx)(e.mo,{children:"\u2212"}),(0,l.jsx)(e.mi,{children:"E"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"["}),(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"W"}),(0,l.jsx)(e.mi,{children:"s"})]}),(0,l.jsx)(e.mo,{stretchy:"false",children:"]"})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"E[W] = E[W_{q}] + E[W_{s}] \\Rightarrow E[W_{q}] = E[W] - E[W_{s}]"})]})})}),(0,l.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.05764em"},children:"E"}),(0,l.jsx)(e.span,{className:"mopen",children:"["}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"W"}),(0,l.jsx)(e.span,{className:"mclose",children:"]"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1.0361em",verticalAlign:"-0.2861em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.05764em"},children:"E"}),(0,l.jsx)(e.span,{className:"mopen",children:"["}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"W"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.1514em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"-0.1389em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",style:{marginRight:"0.03588em"},children:"q"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.2861em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mclose",children:"]"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,l.jsx)(e.span,{className:"mbin",children:"+"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.05764em"},children:"E"}),(0,l.jsx)(e.span,{className:"mopen",children:"["}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"W"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.1514em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"-0.1389em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"s"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mclose",children:"]"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"\u21d2"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1.0361em",verticalAlign:"-0.2861em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.05764em"},children:"E"}),(0,l.jsx)(e.span,{className:"mopen",children:"["}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"W"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.1514em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"-0.1389em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",style:{marginRight:"0.03588em"},children:"q"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.2861em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mclose",children:"]"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.05764em"},children:"E"}),(0,l.jsx)(e.span,{className:"mopen",children:"["}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"W"}),(0,l.jsx)(e.span,{className:"mclose",children:"]"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,l.jsx)(e.span,{className:"mbin",children:"\u2212"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.05764em"},children:"E"}),(0,l.jsx)(e.span,{className:"mopen",children:"["}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"W"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.1514em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"-0.1389em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"s"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mclose",children:"]"})]})]})]})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(e.h3,{id:"burkes-theorem",children:"Burke's Theorem"}),"\n",(0,l.jsxs)(e.admonition,{type:"note",children:[(0,l.jsx)(e.mdxAdmonitionTitle,{children:(0,l.jsx)(e.a,{href:"https://en.wikipedia.org/wiki/Burke%27s_theorem",children:"Wikipedia cite"})}),(0,l.jsxs)(e.p,{children:["Burke's theorem asserts that for a M/M/1 queue in the steady state with arrivals, a Poisson process with rate parameter ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsx)(e.mi,{children:"\u03bb"})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"\\lambda"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6944em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03bb"})]})})]}),":"]}),(0,l.jsxs)(e.ol,{children:["\n",(0,l.jsxs)(e.li,{children:["The departure process is a Poisson process with rate parameter ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsx)(e.mi,{children:"\u03bb"})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"\\lambda"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6944em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03bb"})]})})]}),"."]}),"\n",(0,l.jsxs)(e.li,{children:["At time ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsx)(e.mi,{children:"t"})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"t"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6151em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"t"})]})})]})," the number of packets in the queue is independent of the departure process prior to time ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsx)(e.mi,{children:"t"})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"t"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6151em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"t"})]})})]}),"."]}),"\n"]})]}),"\n",(0,l.jsx)(e.h3,{id:"tandem-queues",children:"Tandem queues"}),"\n",(0,l.jsxs)(e.p,{children:["Given ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsx)(e.mi,{children:"i"})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"i"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6595em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"i"})]})})]})," consecutive servers with queues in tandem:"]}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsx)(e.li,{children:(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"\u03c1"}),(0,l.jsx)(e.mi,{children:"i"})]}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsxs)(e.mfrac,{children:[(0,l.jsx)(e.mi,{children:"\u03bb"}),(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"\u03bc"}),(0,l.jsx)(e.mi,{children:"i"})]})]})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"\\rho_{i} = \\frac{\\lambda}{\\mu_{i}}"})]})})}),(0,l.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.625em",verticalAlign:"-0.1944em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03c1"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3117em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"i"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1.3612em",verticalAlign:"-0.4811em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mopen nulldelimiter"}),(0,l.jsx)(e.span,{className:"mfrac",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsxs)(e.span,{className:"vlist",style:{height:"0.8801em"},children:[(0,l.jsxs)(e.span,{style:{top:"-2.655em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsxs)(e.span,{className:"mord mtight",children:[(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"\u03bc"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3281em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.357em",marginLeft:"0em",marginRight:"0.0714em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.5em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size3 size1 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"i"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.143em"},children:(0,l.jsx)(e.span,{})})})]})})]})})})]}),(0,l.jsxs)(e.span,{style:{top:"-3.23em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"frac-line",style:{borderBottomWidth:"0.04em"}})]}),(0,l.jsxs)(e.span,{style:{top:"-3.394em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"\u03bb"})})})]})]}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.4811em"},children:(0,l.jsx)(e.span,{})})})]})}),(0,l.jsx)(e.span,{className:"mclose nulldelimiter"})]})]})]})]})}),"\n"]}),"\n",(0,l.jsxs)(e.p,{children:["Given 2 consecutive servers, ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"s"}),(0,l.jsx)(e.mn,{children:"1"})]})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"s_{1}"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.5806em",verticalAlign:"-0.15em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",children:"s"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"1"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]})]})})]})," and ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"s"}),(0,l.jsx)(e.mn,{children:"2"})]})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"s_{2}"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.5806em",verticalAlign:"-0.15em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",children:"s"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"2"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]})]})})]}),":"]}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsx)(e.li,{children:(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsxs)(e.mrow,{children:[(0,l.jsx)(e.mi,{children:"P"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"{"}),(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"L"}),(0,l.jsx)(e.mn,{children:"1"})]}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsx)(e.mi,{children:"j"}),(0,l.jsx)(e.mo,{separator:"true",children:","}),(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"L"}),(0,l.jsx)(e.mn,{children:"2"})]}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsx)(e.mi,{children:"k"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"}"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsx)(e.mi,{children:"P"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"{"}),(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"L"}),(0,l.jsx)(e.mn,{children:"1"})]}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsx)(e.mi,{children:"j"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"}"}),(0,l.jsx)(e.mo,{children:"\xd7"}),(0,l.jsx)(e.mi,{children:"P"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"{"}),(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"L"}),(0,l.jsx)(e.mn,{children:"2"})]}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsx)(e.mi,{children:"k"}),(0,l.jsx)(e.mo,{stretchy:"false",children:"}"}),(0,l.jsx)(e.mo,{children:"="}),(0,l.jsxs)(e.msubsup,{children:[(0,l.jsx)(e.mi,{children:"\u03c1"}),(0,l.jsx)(e.mn,{children:"1"}),(0,l.jsx)(e.mi,{children:"j"})]}),(0,l.jsx)(e.mo,{stretchy:"false",children:"("}),(0,l.jsx)(e.mn,{children:"1"}),(0,l.jsx)(e.mo,{children:"\u2212"}),(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"\u03c1"}),(0,l.jsx)(e.mn,{children:"1"})]}),(0,l.jsx)(e.mo,{stretchy:"false",children:")"}),(0,l.jsx)(e.mo,{children:"\xd7"}),(0,l.jsxs)(e.msubsup,{children:[(0,l.jsx)(e.mi,{children:"\u03c1"}),(0,l.jsx)(e.mn,{children:"2"}),(0,l.jsx)(e.mi,{children:"k"})]}),(0,l.jsx)(e.mo,{stretchy:"false",children:"("}),(0,l.jsx)(e.mn,{children:"1"}),(0,l.jsx)(e.mo,{children:"\u2212"}),(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"\u03c1"}),(0,l.jsx)(e.mn,{children:"2"})]}),(0,l.jsx)(e.mo,{stretchy:"false",children:")"})]}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"P\\{L_{1} = j, L_{2} = k\\} = P\\{L_{1} = j\\} \\times P\\{L_{2} = k\\} = \\rho^{j}_{1} (1 - \\rho_{1}) \\times \\rho^{k}_{2} (1 - \\rho_{2})"})]})})}),(0,l.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"P"}),(0,l.jsx)(e.span,{className:"mopen",children:"{"}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",children:"L"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"1"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.8778em",verticalAlign:"-0.1944em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.05724em"},children:"j"}),(0,l.jsx)(e.span,{className:"mpunct",children:","}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.1667em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",children:"L"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"2"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.03148em"},children:"k"}),(0,l.jsx)(e.span,{className:"mclose",children:"}"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"P"}),(0,l.jsx)(e.span,{className:"mopen",children:"{"}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",children:"L"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"1"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.05724em"},children:"j"}),(0,l.jsx)(e.span,{className:"mclose",children:"}"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,l.jsx)(e.span,{className:"mbin",children:"\xd7"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.13889em"},children:"P"}),(0,l.jsx)(e.span,{className:"mopen",children:"{"}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",children:"L"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"2"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.03148em"},children:"k"}),(0,l.jsx)(e.span,{className:"mclose",children:"}"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,l.jsx)(e.span,{className:"mrel",children:"="}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1.2089em",verticalAlign:"-0.2663em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03c1"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsxs)(e.span,{className:"vlist",style:{height:"0.9426em"},children:[(0,l.jsxs)(e.span,{style:{top:"-2.4337em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"1"})})})]}),(0,l.jsxs)(e.span,{style:{top:"-3.1809em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",style:{marginRight:"0.05724em"},children:"j"})})})]})]}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.2663em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mopen",children:"("}),(0,l.jsx)(e.span,{className:"mord",children:"1"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,l.jsx)(e.span,{className:"mbin",children:"\u2212"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03c1"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"1"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mclose",children:")"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,l.jsx)(e.span,{className:"mbin",children:"\xd7"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1.0991em",verticalAlign:"-0.25em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03c1"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsxs)(e.span,{className:"vlist",style:{height:"0.8491em"},children:[(0,l.jsxs)(e.span,{style:{top:"-2.4519em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"2"})})})]}),(0,l.jsxs)(e.span,{style:{top:"-3.063em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",style:{marginRight:"0.03148em"},children:"k"})})})]})]}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.2481em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mopen",children:"("}),(0,l.jsx)(e.span,{className:"mord",children:"1"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,l.jsx)(e.span,{className:"mbin",children:"\u2212"}),(0,l.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}})]}),(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03c1"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:"2"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]}),(0,l.jsx)(e.span,{className:"mclose",children:")"})]})]})]})}),"\n"]}),"\n",(0,l.jsx)(e.h3,{id:"jackson-network",children:"Jackson network"}),"\n",(0,l.jsxs)(e.p,{children:["Jackson networks have multiple sources and feedback loops. By ",(0,l.jsx)(e.a,{href:"#burkes-theorem",children:"Burke's Theorem"}),", merging and splitting of Poisson still apply to these networks."]}),"\n",(0,l.jsx)(e.p,{children:"To do so:"}),"\n",(0,l.jsxs)(e.ol,{children:["\n",(0,l.jsxs)(e.li,{children:["Determine the utilization ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsxs)(e.msub,{children:[(0,l.jsx)(e.mi,{children:"\u03c1"}),(0,l.jsx)(e.mi,{children:"i"})]})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"\\rho_{i}"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.625em",verticalAlign:"-0.1944em"}}),(0,l.jsxs)(e.span,{className:"mord",children:[(0,l.jsx)(e.span,{className:"mord mathnormal",children:"\u03c1"}),(0,l.jsx)(e.span,{className:"msupsub",children:(0,l.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,l.jsxs)(e.span,{className:"vlist-r",children:[(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.3117em"},children:(0,l.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,l.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,l.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,l.jsx)(e.span,{className:"mord mtight",children:(0,l.jsx)(e.span,{className:"mord mathnormal mtight",children:"i"})})})]})}),(0,l.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,l.jsx)(e.span,{className:"vlist-r",children:(0,l.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,l.jsx)(e.span,{})})})]})})]})]})})]})," for each server ",(0,l.jsxs)(e.span,{className:"katex",children:[(0,l.jsx)(e.span,{className:"katex-mathml",children:(0,l.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,l.jsxs)(e.semantics,{children:[(0,l.jsx)(e.mrow,{children:(0,l.jsx)(e.mi,{children:"i"})}),(0,l.jsx)(e.annotation,{encoding:"application/x-tex",children:"i"})]})})}),(0,l.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,l.jsxs)(e.span,{className:"base",children:[(0,l.jsx)(e.span,{className:"strut",style:{height:"0.6595em"}}),(0,l.jsx)(e.span,{className:"mord mathnormal",children:"i"})]})})]})]}),"\n",(0,l.jsxs)(e.li,{children:["Create product form solutions as in ",(0,l.jsx)(e.a,{href:"#tandem-queues",children:"#tandem-queues"})]}),"\n"]}),"\n",(0,l.jsx)(e.h2,{id:"resources",children:"Resources"}),"\n",(0,l.jsxs)(e.ul,{children:["\n",(0,l.jsx)(e.li,{children:(0,l.jsx)(e.a,{href:"https://crazoter.github.io/My-Docs/docs/markdown/CS4226_summary",children:"Matt's Docs: CS4226 Cheatsheet"})}),"\n"]})]})}function d(s={}){const{wrapper:e}={...(0,n.M)(),...s.components};return e?(0,l.jsx)(e,{...s,children:(0,l.jsx)(h,{...s})}):h(s)}},2172:(s,e,a)=>{a.d(e,{I:()=>t,M:()=>i});var l=a(1504);const n={},m=l.createContext(n);function i(s){const e=l.useContext(m);return l.useMemo((function(){return"function"==typeof s?s(e):{...e,...s}}),[e,s])}function t(s){let e;return e=s.disableParentContext?"function"==typeof s.components?s.components(n):s.components||n:i(s.components),l.createElement(m.Provider,{value:e},s.children)}}}]); \ No newline at end of file diff --git a/assets/js/main.10594bc9.js b/assets/js/main.10594bc9.js new file mode 100644 index 00000000..f248f411 --- /dev/null +++ b/assets/js/main.10594bc9.js @@ -0,0 +1,2 @@ +/*! For license information please see main.10594bc9.js.LICENSE.txt */ +(self.webpackChunkevantay_com=self.webpackChunkevantay_com||[]).push([[1590],{628:(e,t,n)=>{"use strict";n.d(t,{c:()=>p});n(1504);var r=n(8852),o=n.n(r),a=n(4504);const i={"01a85c17":[()=>Promise.all([n.e(2176),n.e(8412)]).then(n.bind(n,3024)),"@theme/BlogTagsListPage",3024],"0440a4a2":[()=>n.e(5104).then(n.t.bind(n,5452,19)),"~blog/default/blog-tags-gov-tech-stack-6d1.json",5452],"061a123b":[()=>n.e(1528).then(n.bind(n,6e3)),"@site/blog/2021-03-11-stashaway.md",6e3],"0d0c74f6":[()=>Promise.all([n.e(2176),n.e(7856),n.e(6220)]).then(n.bind(n,4932)),"@site/src/pages/projects/index.js",4932],17896441:[()=>Promise.all([n.e(2176),n.e(6044),n.e(6752)]).then(n.bind(n,5104)),"@theme/DocItem",5104],"1e9048c4":[()=>n.e(1880).then(n.bind(n,6248)),"@site/blog/2021-06-26-docusaurus-posthog-analytics.md?truncated=true",6248],"1fc56582":[()=>n.e(1720).then(n.t.bind(n,7384,19)),"~blog/default/blog-tags-investing-73f.json",7384],"213ccdc7":[()=>n.e(2268).then(n.bind(n,3424)),"@site/docs/ikigai.md",3424],"224a301e":[()=>n.e(8876).then(n.t.bind(n,2352,19)),"~blog/default/blog-tags-github-action-45e-list.json",2352],"2419c069":[()=>n.e(7904).then(n.bind(n,9428)),"@site/docs/mininet-setup.md",9428],"2c3dd313":[()=>n.e(3700).then(n.t.bind(n,9238,19)),"~blog/default/blog-tags-sharing-e65-list.json",9238],"2dc3d3ff":[()=>n.e(7968).then(n.bind(n,2940)),"@site/docs/contents.md",2940],"3344da23":[()=>n.e(4520).then(n.bind(n,7916)),"@site/docs/reading-list.md",7916],"3614913f":[()=>n.e(3431).then(n.t.bind(n,6254,19)),"~blog/default/blog-tags-analytics-2f4.json",6254],"3bdc16c1":[()=>n.e(7576).then(n.t.bind(n,248,19)),"~blog/default/blog-tags-sharing-e65.json",248],"3cee07f2":[()=>n.e(586).then(n.bind(n,2640)),"@site/blog/2021-09-10-why-you-should-read-ddia.md?truncated=true",2640],"3e991810":[()=>n.e(2020).then(n.t.bind(n,4656,19)),"~blog/default/blog-tags-book-review-d36.json",4656],"40e2aa62":[()=>n.e(2392).then(n.t.bind(n,7896,19)),"~blog/default/blog-tags-microservices-0a7.json",7896],"44183a86":[()=>n.e(6942).then(n.t.bind(n,680,19)),"~blog/default/blog-tags-ci-5d6-list.json",680],"462880c5":[()=>n.e(5244).then(n.bind(n,848)),"@site/docs/nodejs-auto-reload.md",848],"48332b76":[()=>n.e(8284).then(n.bind(n,9924)),"@site/docs/git-cheatsheet.md",9924],"5b2b3d99":[()=>n.e(6040).then(n.bind(n,4416)),"@site/blog/2021-09-10-why-you-should-read-ddia.md",4416],"5d92e2d4":[()=>n.e(9392).then(n.bind(n,2756)),"@site/docs/mongodb-setup.md",2756],"5e95c892":[()=>n.e(4304).then(n.bind(n,3564)),"@theme/DocsRoot",3564],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,7768)),"@generated/docusaurus.config",7768],"5fc3ba7e":[()=>n.e(2740).then(n.bind(n,8772)),"@site/docs/docker-cheatsheet.md",8772],"608ae6a4":[()=>n.e(5168).then(n.t.bind(n,3120,19)),"~blog/default/blog-tags-docusaurus-0e0-list.json",3120],"609cb24b":[()=>n.e(712).then(n.bind(n,7040)),"@site/docs/c-cheatsheet.md",7040],64285692:[()=>n.e(4936).then(n.bind(n,7215)),"@site/docs/os-ubuntu-cheatsheet.md",7215],"6855b58d":[()=>n.e(8132).then(n.bind(n,8888)),"@site/docs/reliable-scalable-maintainable.md",8888],"6875c492":[()=>Promise.all([n.e(2176),n.e(6044),n.e(606),n.e(12)]).then(n.bind(n,2948)),"@theme/BlogTagsPostsPage",2948],"6969bc8f":[()=>n.e(2960).then(n.bind(n,5588)),"@site/blog/2020-12-21-history.md",5588],"6aa6c2d1":[()=>n.e(5796).then(n.t.bind(n,6112,19)),"~blog/default/blog-tags-microservices-0a7-list.json",6112],"72403b3b":[()=>n.e(9728).then(n.bind(n,3056)),"@site/docs/js-cheatsheet.md",3056],"7550f3ec":[()=>n.e(8056).then(n.bind(n,9464)),"@site/docs/mongodb-cheatsheet.md",9464],"771f38eb":[()=>n.e(4720).then(n.t.bind(n,7840,19)),"~blog/default/blog-tags-ci-5d6.json",7840],"773806e0":[()=>n.e(4888).then(n.bind(n,3648)),"@site/blog/2020-12-03-stack-conference.md",3648],"7c5afa08":[()=>n.e(4932).then(n.bind(n,4512)),"@site/blog/2021-03-11-stashaway.md?truncated=true",4512],"814f3328":[()=>n.e(5512).then(n.t.bind(n,4352,19)),"~blog/default/blog-post-list-prop-default.json",4352],"86dbdca9":[()=>n.e(7816).then(n.t.bind(n,3512,19)),"~blog/default/blog-tags-conference-f06.json",3512],"8b28c975":[()=>n.e(3028).then(n.t.bind(n,3448,19)),"~blog/default/blog-tags-investing-73f-list.json",3448],"8bb152cf":[()=>n.e(6928).then(n.t.bind(n,6088,19)),"~blog/default/blog-tags-software-architecture-343.json",6088],"901e7e12":[()=>n.e(4500).then(n.bind(n,2652)),"@site/blog/2021-01-17-docusaurus-gh-action.md",2652],"935f2afb":[()=>n.e(5696).then(n.t.bind(n,5988,19)),"~docs/default/version-current-metadata-prop-751.json",5988],"93b82f8b":[()=>n.e(8650).then(n.t.bind(n,139,19)),"~blog/default/blog-tags-github-action-45e.json",139],"9e4087bc":[()=>n.e(7028).then(n.bind(n,6140)),"@theme/BlogArchivePage",6140],a4f77f3b:[()=>n.e(5664).then(n.bind(n,5800)),"@site/blog/2021-01-17-docusaurus-gh-action.md?truncated=true",5800],a6aa9e1f:[()=>Promise.all([n.e(2176),n.e(6044),n.e(606),n.e(4976)]).then(n.bind(n,4328)),"@theme/BlogListPage",4328],a7023ddc:[()=>n.e(9112).then(n.t.bind(n,1568,19)),"~blog/default/blog-tags-tags-4c2.json",1568],a77fb37c:[()=>n.e(2552).then(n.t.bind(n,6792,19)),"/home/runner/work/kaya-folio/kaya-folio/website/.docusaurus/docusaurus-plugin-content-blog/default/plugin-route-context-module-100.json",6792],a7bd4aaa:[()=>n.e(6500).then(n.bind(n,2e3)),"@theme/DocVersionRoot",2e3],a80da1cf:[()=>n.e(8600).then(n.t.bind(n,2338,19)),"~blog/default/blog-tags-docusaurus-0e0.json",2338],a8e7919c:[()=>n.e(7388).then(n.bind(n,9416)),"@site/blog/2020-12-21-history.md?truncated=true",9416],a94703ab:[()=>Promise.all([n.e(2176),n.e(4666)]).then(n.bind(n,996)),"@theme/DocRoot",996],ad7b700f:[()=>n.e(4048).then(n.t.bind(n,2680,19)),"~blog/default/blog-tags-posthog-256.json",2680],b1513dc1:[()=>n.e(5528).then(n.t.bind(n,2624,19)),"~blog/default/blog-tags-cloud-d01-list.json",2624],b16fdaf9:[()=>n.e(9448).then(n.bind(n,3404)),"@site/docs/gcp-gke-cheatsheet.md",3404],b2b675dd:[()=>n.e(6292).then(n.t.bind(n,6180,19)),"~blog/default/blog-c06.json",6180],b2f554cd:[()=>n.e(6880).then(n.t.bind(n,8256,19)),"~blog/default/blog-archive-80c.json",8256],b34035b6:[()=>n.e(4776).then(n.t.bind(n,6752,19)),"~blog/default/blog-tags-posthog-256-list.json",6752],b4d628d3:[()=>n.e(6764).then(n.t.bind(n,3080,19)),"~blog/default/blog-tags-software-architecture-343-list.json",3080],b99b6768:[()=>n.e(7464).then(n.bind(n,1364)),"@site/docs/scaling-memcached.md",1364],c0b1fc1a:[()=>n.e(9060).then(n.bind(n,5872)),"@site/blog/2020-12-03-stack-conference.md?truncated=true",5872],c4b0cf2f:[()=>n.e(5144).then(n.bind(n,7216)),"@site/docs/git-ignore-file.md",7216],c4f5d8e4:[()=>Promise.all([n.e(2176),n.e(7856),n.e(2632)]).then(n.bind(n,3464)),"@site/src/pages/index.js",3464],c6e1e161:[()=>n.e(3663).then(n.t.bind(n,6416,19)),"~blog/default/blog-tags-book-review-d36-list.json",6416],c933abd0:[()=>n.e(4492).then(n.t.bind(n,3552,19)),"~blog/default/blog-tags-software-engineering-146-list.json",3552],ccc49370:[()=>Promise.all([n.e(2176),n.e(6044),n.e(606),n.e(6344)]).then(n.bind(n,8320)),"@theme/BlogPostPage",8320],ce3e42ad:[()=>n.e(6664).then(n.bind(n,9292)),"@site/docs/mdx.md",9292],cfb8f5b6:[()=>n.e(7640).then(n.t.bind(n,563,19)),"~blog/default/blog-tags-software-engineering-146.json",563],cff29eac:[()=>n.e(6984).then(n.t.bind(n,3304,19)),"~blog/default/blog-tags-conference-f06-list.json",3304],dc9e9921:[()=>n.e(9372).then(n.t.bind(n,1968,19)),"~blog/default/blog-tags-gov-tech-stack-6d1-list.json",1968],e11f84c6:[()=>n.e(9311).then(n.t.bind(n,590,19)),"/home/runner/work/kaya-folio/kaya-folio/website/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",590],e25e4df4:[()=>n.e(832).then(n.bind(n,887)),"@site/docs/nodejs-set-npm-run-shell.md",887],e25ee44f:[()=>n.e(2304).then(n.bind(n,7232)),"@site/docs/iterm2-zsh-setup.md",7232],e5cc08ab:[()=>n.e(5744).then(n.t.bind(n,2080,19)),"/home/runner/work/kaya-folio/kaya-folio/website/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",2080],f026c94c:[()=>n.e(2568).then(n.t.bind(n,1912,19)),"~blog/default/blog-tags-analytics-2f4-list.json",1912],f3002ca5:[()=>n.e(588).then(n.bind(n,568)),"@site/docs/ruby-dependency-management.md",568],f3543915:[()=>n.e(6152).then(n.t.bind(n,4120,19)),"~blog/default/blog-tags-cloud-d01.json",4120],f514138b:[()=>n.e(7850).then(n.bind(n,3700)),"@site/blog/2021-06-26-docusaurus-posthog-analytics.md",3700],f5abd514:[()=>n.e(3376).then(n.bind(n,6092)),"@site/docs/iterm2-cheatsheet.md",6092],fec9c3b1:[()=>n.e(284).then(n.bind(n,9824)),"@site/docs/network-model.md",9824]};var l=n(7624);function s(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,l.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,l.jsx)("p",{children:String(t)}),(0,l.jsx)("div",{children:(0,l.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,l.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,l.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,l.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,l.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,l.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,l.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,l.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,l.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,l.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var c=n(8120),u=n(5548);function d(e,t){if("*"===e)return o()({loading:s,loader:()=>n.e(4552).then(n.bind(n,4552)),modules:["@theme/NotFound"],webpack:()=>[4552],render(e,t){const n=e.default;return(0,l.jsx)(u.Y,{value:{plugin:{name:"native",id:"default"}},children:(0,l.jsx)(n,{...t})})}});const r=a[e+"-"+t],d={},p=[],f=[],g=(0,c.c)(r);return Object.entries(g).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],p.push(r[1]),f.push(r[2]))})),o().Map({loading:s,loader:d,modules:p,webpack:()=>f,render(t,n){const o=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error("The page component at "+e+" doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.");"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let i=o;const l=n.split(".");l.slice(0,-1).forEach((e=>{i=i[e]})),i[l[l.length-1]]=a}));const a=o.__comp;delete o.__comp;const i=o.__context;return delete o.__context,(0,l.jsx)(u.Y,{value:i,children:(0,l.jsx)(a,{...o,...n})})}})}const p=[{path:"/blog",component:d("/blog","756"),exact:!0},{path:"/blog/archive",component:d("/blog/archive","2f1"),exact:!0},{path:"/blog/docusaurus-gh-action",component:d("/blog/docusaurus-gh-action","6f7"),exact:!0},{path:"/blog/docusaurus-posthog",component:d("/blog/docusaurus-posthog","3c9"),exact:!0},{path:"/blog/history",component:d("/blog/history","82f"),exact:!0},{path:"/blog/stack-2020",component:d("/blog/stack-2020","b08"),exact:!0},{path:"/blog/stashaway",component:d("/blog/stashaway","f68"),exact:!0},{path:"/blog/tags",component:d("/blog/tags","5f8"),exact:!0},{path:"/blog/tags/analytics",component:d("/blog/tags/analytics","bcd"),exact:!0},{path:"/blog/tags/book-review",component:d("/blog/tags/book-review","d18"),exact:!0},{path:"/blog/tags/ci",component:d("/blog/tags/ci","464"),exact:!0},{path:"/blog/tags/cloud",component:d("/blog/tags/cloud","551"),exact:!0},{path:"/blog/tags/conference",component:d("/blog/tags/conference","4be"),exact:!0},{path:"/blog/tags/docusaurus",component:d("/blog/tags/docusaurus","ea4"),exact:!0},{path:"/blog/tags/github-action",component:d("/blog/tags/github-action","6ab"),exact:!0},{path:"/blog/tags/gov-tech-stack",component:d("/blog/tags/gov-tech-stack","92c"),exact:!0},{path:"/blog/tags/investing",component:d("/blog/tags/investing","1bc"),exact:!0},{path:"/blog/tags/microservices",component:d("/blog/tags/microservices","add"),exact:!0},{path:"/blog/tags/posthog",component:d("/blog/tags/posthog","8ba"),exact:!0},{path:"/blog/tags/sharing",component:d("/blog/tags/sharing","930"),exact:!0},{path:"/blog/tags/software-architecture",component:d("/blog/tags/software-architecture","ce9"),exact:!0},{path:"/blog/tags/software-engineering",component:d("/blog/tags/software-engineering","e5e"),exact:!0},{path:"/blog/why-you-should-read-ddia",component:d("/blog/why-you-should-read-ddia","2a8"),exact:!0},{path:"/projects/",component:d("/projects/","924"),exact:!0},{path:"/docs",component:d("/docs","720"),routes:[{path:"/docs",component:d("/docs","1c3"),routes:[{path:"/docs",component:d("/docs","0ab"),routes:[{path:"/docs/",component:d("/docs/","328"),exact:!0,sidebar:"docs"},{path:"/docs/c-cheatsheet",component:d("/docs/c-cheatsheet","1af"),exact:!0,sidebar:"docs"},{path:"/docs/docker-cheatsheet",component:d("/docs/docker-cheatsheet","bce"),exact:!0,sidebar:"docs"},{path:"/docs/gcp-gke-cheatsheet",component:d("/docs/gcp-gke-cheatsheet","f55"),exact:!0,sidebar:"docs"},{path:"/docs/git-cheatsheet",component:d("/docs/git-cheatsheet","dd6"),exact:!0,sidebar:"docs"},{path:"/docs/git-ignore-file",component:d("/docs/git-ignore-file","ebd"),exact:!0,sidebar:"docs"},{path:"/docs/ikigai",component:d("/docs/ikigai","9ad"),exact:!0,sidebar:"docs"},{path:"/docs/iterm2-cheatsheet",component:d("/docs/iterm2-cheatsheet","895"),exact:!0,sidebar:"docs"},{path:"/docs/iterm2-zsh-setup",component:d("/docs/iterm2-zsh-setup","cff"),exact:!0,sidebar:"docs"},{path:"/docs/js-cheatsheet",component:d("/docs/js-cheatsheet","712"),exact:!0,sidebar:"docs"},{path:"/docs/mdx",component:d("/docs/mdx","955"),exact:!0},{path:"/docs/mininet-setup",component:d("/docs/mininet-setup","28a"),exact:!0,sidebar:"docs"},{path:"/docs/mongodb-cheatsheet",component:d("/docs/mongodb-cheatsheet","942"),exact:!0,sidebar:"docs"},{path:"/docs/mongodb-setup",component:d("/docs/mongodb-setup","781"),exact:!0,sidebar:"docs"},{path:"/docs/network-model",component:d("/docs/network-model","066"),exact:!0,sidebar:"docs"},{path:"/docs/nodejs-auto-reload",component:d("/docs/nodejs-auto-reload","35c"),exact:!0,sidebar:"docs"},{path:"/docs/nodejs-set-npm-run-shell",component:d("/docs/nodejs-set-npm-run-shell","5f0"),exact:!0,sidebar:"docs"},{path:"/docs/os-ubuntu-cheatsheet",component:d("/docs/os-ubuntu-cheatsheet","ad7"),exact:!0,sidebar:"docs"},{path:"/docs/reading-list",component:d("/docs/reading-list","5cb"),exact:!0,sidebar:"docs"},{path:"/docs/reliable-scalable-maintainable",component:d("/docs/reliable-scalable-maintainable","b10"),exact:!0,sidebar:"docs"},{path:"/docs/ruby-dependency-management",component:d("/docs/ruby-dependency-management","80d"),exact:!0,sidebar:"docs"},{path:"/docs/scaling-memcached",component:d("/docs/scaling-memcached","44f"),exact:!0,sidebar:"docs"}]}]}]},{path:"/",component:d("/","99f"),exact:!0},{path:"*",component:d("*")}]},240:(e,t,n)=>{"use strict";n.d(t,{e:()=>a,g:()=>i});var r=n(1504),o=n(7624);const a=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,o.jsx)(a.Provider,{value:n,children:t})}},8808:(e,t,n)=>{"use strict";var r=n(1504),o=n(8352),a=n(440),i=n(2160),l=n(8684);const s=[n(1462),n(5396),n(9596),n(1496)];var c=n(628),u=n(5592),d=n(5464),p=n(7624);function f(e){let{children:t}=e;return(0,p.jsx)(p.Fragment,{children:t})}var g=n(6952),m=n(8264),h=n(964),b=n(1824),y=n(5756),v=n(1616),w=n(204),k=n(4456),x=n(5684),S=n(8712);function E(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,m.c)(),r=(0,v.D)(),o=n[e].htmlLang,a=e=>e.replace("-","_");return(0,p.jsxs)(g.c,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,p.jsx)("meta",{property:"og:locale",content:a(o)}),Object.values(n).filter((e=>o!==e.htmlLang)).map((e=>(0,p.jsx)("meta",{property:"og:locale:alternate",content:a(e.htmlLang)},"meta-og-"+e.htmlLang)))]})}function _(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,m.c)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,m.c)(),{pathname:r}=(0,u.IT)();return e+(0,x.applyTrailingSlash)((0,h.c)(r),{trailingSlash:n,baseUrl:t})}(),o=t?""+n+t:r;return(0,p.jsxs)(g.c,{children:[(0,p.jsx)("meta",{property:"og:url",content:o}),(0,p.jsx)("link",{rel:"canonical",href:o})]})}function C(){const{i18n:{currentLocale:e}}=(0,m.c)(),{metadata:t,image:n}=(0,b.y)();return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(g.c,{children:[(0,p.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,p.jsx)("body",{className:w.m})]}),n&&(0,p.jsx)(y.U7,{image:n}),(0,p.jsx)(_,{}),(0,p.jsx)(E,{}),(0,p.jsx)(S.c,{tag:k.e6,locale:e}),(0,p.jsx)(g.c,{children:t.map(((e,t)=>(0,p.jsx)("meta",{...e},t)))})]})}const T=new Map;function j(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,d.C)(c.c,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}var A=n(240),N=n(136),L=n(5288);function R(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];const o=s.map((t=>{var r,o;const a=null!=(r=null==(o=t.default)?void 0:o[e])?r:t[e];return null==a?void 0:a(...n)}));return()=>o.forEach((e=>null==e?void 0:e()))}const P=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,L.c)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,o=t.hash===n.hash,a=t.search===n.search;if(r&&o&&!a)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);null==t||t.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),R("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function O(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.C)(c.c,e))).flat();return Promise.all(t.map((e=>null==e.route.component.preload?void 0:e.route.component.preload())))}class D extends r.Component{constructor(e){super(e),this.previousLocation=void 0,this.routeUpdateCleanupCb=void 0,this.previousLocation=null,this.routeUpdateCleanupCb=l.c.canUseDOM?R("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=R("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),O(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,p.jsx)(P,{previousLocation:this.previousLocation,location:t,children:(0,p.jsx)(u.kX,{location:t,render:()=>e})})}}const I=D,M="__docusaurus-base-url-issue-banner-container",F="__docusaurus-base-url-issue-banner",z="__docusaurus-base-url-issue-banner-suggestion-container";function B(e){return"\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '"+M+"';\n var bannerHtml = "+JSON.stringify(function(e){return'\n<div id="'+F+'" style="border: thick solid red; background-color: rgb(255, 230, 179); margin: 20px; padding: 20px; font-size: 20px;">\n <p style="font-weight: bold; font-size: 30px;">Your Docusaurus site did not load properly.</p>\n <p>A very common reason is a wrong site <a href="https://docusaurus.io/docs/docusaurus.config.js/#baseUrl" style="font-weight: bold;">baseUrl configuration</a>.</p>\n <p>Current configured baseUrl = <span style="font-weight: bold; color: red;">'+e+"</span> "+("/"===e?" (default value)":"")+'</p>\n <p>We suggest trying baseUrl = <span id="'+z+'" style="font-weight: bold; color: green;"></span></p>\n</div>\n'}(e)).replace(/</g,"\\<")+";\n bannerContainer.innerHTML = bannerHtml;\n document.body.prepend(bannerContainer);\n var suggestionContainer = document.getElementById('"+z+"');\n var actualHomePagePath = window.location.pathname;\n var suggestedBaseUrl = actualHomePagePath.substr(-1) === '/'\n ? actualHomePagePath\n : actualHomePagePath + '/';\n suggestionContainer.innerHTML = suggestedBaseUrl;\n}\n"}function U(){const{siteConfig:{baseUrl:e}}=(0,m.c)();return(0,p.jsx)(p.Fragment,{children:!l.c.canUseDOM&&(0,p.jsx)(g.c,{children:(0,p.jsx)("script",{children:B(e)})})})}function $(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,m.c)(),{pathname:n}=(0,u.IT)();return t&&n===e?(0,p.jsx)(U,{}):null}function q(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:r,localeConfigs:o}}=(0,m.c)(),a=(0,h.c)(e),{htmlLang:i,direction:l}=o[r];return(0,p.jsxs)(g.c,{children:[(0,p.jsx)("html",{lang:i,dir:l}),(0,p.jsx)("title",{children:t}),(0,p.jsx)("meta",{property:"og:title",content:t}),(0,p.jsx)("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&(0,p.jsx)("meta",{name:"robots",content:"noindex, nofollow"}),e&&(0,p.jsx)("link",{rel:"icon",href:a})]})}var H=n(5852),G=n(3664);function V(){const e=(0,G.c)();return(0,p.jsx)(g.c,{children:(0,p.jsx)("html",{"data-has-hydrated":e})})}function W(){const e=(0,d.k)(c.c),t=(0,u.IT)();return(0,p.jsx)(H.c,{children:(0,p.jsx)(N.y,{children:(0,p.jsxs)(A.g,{children:[(0,p.jsxs)(f,{children:[(0,p.jsx)(q,{}),(0,p.jsx)(C,{}),(0,p.jsx)($,{}),(0,p.jsx)(I,{location:j(t),children:e})]}),(0,p.jsx)(V,{})]})})})}var Q=n(4504);const Y=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{var r,o;if("undefined"==typeof document)return void n();const a=document.createElement("link");a.setAttribute("rel","prefetch"),a.setAttribute("href",e),a.onload=()=>t(),a.onerror=()=>n();const i=null!=(r=document.getElementsByTagName("head")[0])?r:null==(o=document.getElementsByName("script")[0])?void 0:o.parentNode;null==i||i.appendChild(a)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var K=n(8120);const X=new Set,Z=new Set,J=()=>{var e,t;return(null==(e=navigator.connection)?void 0:e.effectiveType.includes("2g"))||(null==(t=navigator.connection)?void 0:t.saveData)},ee={prefetch(e){if(!(e=>!J()&&!Z.has(e)&&!X.has(e))(e))return!1;X.add(e);const t=(0,d.C)(c.c,e).flatMap((e=>{return t=e.route.path,Object.entries(Q).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,K.c)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Y(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!J()&&!Z.has(e))(e)&&(Z.add(e),O(e))},te=Object.freeze(ee),ne=Boolean(!0);if(l.c.canUseDOM){window.docusaurus=te;const e=document.getElementById("__docusaurus"),t=(0,p.jsx)(i.EN,{children:(0,p.jsx)(a.kn,{children:(0,p.jsx)(W,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},l=()=>{if(ne)r.startTransition((()=>{o.hydrateRoot(e,t,{onRecoverableError:n})}));else{const a=o.createRoot(e,{onRecoverableError:n});r.startTransition((()=>{a.render(t)}))}};O(window.location.pathname).then(l)}},136:(e,t,n)=>{"use strict";n.d(t,{e:()=>d,y:()=>p});var r=n(1504),o=n(7768);const a=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/docs","mainDocId":"contents","docs":[{"id":"c-cheatsheet","path":"/docs/c-cheatsheet","sidebar":"docs"},{"id":"contents","path":"/docs/","sidebar":"docs"},{"id":"docker-cheatsheet","path":"/docs/docker-cheatsheet","sidebar":"docs"},{"id":"gcp-gke-cheatsheet","path":"/docs/gcp-gke-cheatsheet","sidebar":"docs"},{"id":"git-cheatsheet","path":"/docs/git-cheatsheet","sidebar":"docs"},{"id":"git-ignore-file","path":"/docs/git-ignore-file","sidebar":"docs"},{"id":"ikigai","path":"/docs/ikigai","sidebar":"docs"},{"id":"iterm2-cheatsheet","path":"/docs/iterm2-cheatsheet","sidebar":"docs"},{"id":"iterm2-zsh-setup","path":"/docs/iterm2-zsh-setup","sidebar":"docs"},{"id":"js-cheatsheet","path":"/docs/js-cheatsheet","sidebar":"docs"},{"id":"mdx","path":"/docs/mdx"},{"id":"mininet-setup","path":"/docs/mininet-setup","sidebar":"docs"},{"id":"mongodb-cheatsheet","path":"/docs/mongodb-cheatsheet","sidebar":"docs"},{"id":"mongodb-setup","path":"/docs/mongodb-setup","sidebar":"docs"},{"id":"network-model","path":"/docs/network-model","sidebar":"docs"},{"id":"nodejs-auto-reload","path":"/docs/nodejs-auto-reload","sidebar":"docs"},{"id":"nodejs-set-npm-run-shell","path":"/docs/nodejs-set-npm-run-shell","sidebar":"docs"},{"id":"os-ubuntu-cheatsheet","path":"/docs/os-ubuntu-cheatsheet","sidebar":"docs"},{"id":"reading-list","path":"/docs/reading-list","sidebar":"docs"},{"id":"reliable-scalable-maintainable","path":"/docs/reliable-scalable-maintainable","sidebar":"docs"},{"id":"ruby-dependency-management","path":"/docs/ruby-dependency-management","sidebar":"docs"},{"id":"scaling-memcached","path":"/docs/scaling-memcached","sidebar":"docs"}],"draftIds":[],"sidebars":{"docs":{"link":{"path":"/docs/","label":"contents"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var l=n(144);const s=JSON.parse('{"docusaurusVersion":"3.1.1","siteVersion":"0.0.2","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.1.1"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.1.1"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.1.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.1.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.1.1"},"docusaurus-tailwindcss":{"type":"local"}}}');var c=n(7624);const u={siteConfig:o.default,siteMetadata:s,globalData:a,i18n:i,codeTranslations:l},d=r.createContext(u);function p(e){let{children:t}=e;return(0,c.jsx)(d.Provider,{value:u,children:t})}},5852:(e,t,n)=>{"use strict";n.d(t,{c:()=>f});var r=n(1504),o=n(8684),a=n(6952),i=n(5684),l=n(9012),s=n(7624);function c(e){let{error:t,tryAgain:n}=e;return(0,s.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,s.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,s.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,s.jsx)(u,{error:t})]})}function u(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,s.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function d(e){let{error:t,tryAgain:n}=e;return(0,s.jsxs)(f,{fallback:()=>(0,s.jsx)(c,{error:t,tryAgain:n}),children:[(0,s.jsx)(a.c,{children:(0,s.jsx)("title",{children:"Page Error"})}),(0,s.jsx)(l.c,{children:(0,s.jsx)(c,{error:t,tryAgain:n})})]})}const p=e=>(0,s.jsx)(d,{...e});class f extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){o.c.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){var n;const e={error:t,tryAgain:()=>this.setState({error:null})};return(null!=(n=this.props.fallback)?n:p)(e)}return null!=e?e:null}}},8684:(e,t,n)=>{"use strict";n.d(t,{c:()=>o});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,o={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},6952:(e,t,n)=>{"use strict";n.d(t,{c:()=>a});n(1504);var r=n(2160),o=n(7624);function a(e){return(0,o.jsx)(r.So,{...e})}},867:(e,t,n)=>{"use strict";n.d(t,{c:()=>f});var r=n(1504),o=n(440),a=n(5684),i=n(8264),l=n(8136),s=n(8684),c=n(5976),u=n(964),d=n(7624);function p(e,t){var n,p;let{isNavLink:f,to:g,href:m,activeClassName:h,isActive:b,"data-noBrokenLinkCheck":y,autoAddBaseUrl:v=!0,...w}=e;const{siteConfig:{trailingSlash:k,baseUrl:x}}=(0,i.c)(),{withBaseUrl:S}=(0,u.E)(),E=(0,c.c)(),_=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>_.current));const C=g||m;const T=(0,l.c)(C),j=null==C?void 0:C.replace("pathname://","");let A=void 0!==j?(N=j,v&&(e=>e.startsWith("/"))(N)?S(N):N):void 0;var N;A&&T&&(A=(0,a.applyTrailingSlash)(A,{trailingSlash:k,baseUrl:x}));const L=(0,r.useRef)(!1),R=f?o.Af:o.cH,P=s.c.canUseIntersectionObserver,O=(0,r.useRef)(),D=()=>{L.current||null==A||(window.docusaurus.preload(A),L.current=!0)};(0,r.useEffect)((()=>(!P&&T&&null!=A&&window.docusaurus.prefetch(A),()=>{P&&O.current&&O.current.disconnect()})),[O,A,P,T]);const I=null!=(n=null==(p=A)?void 0:p.startsWith("#"))&&n,M=!w.target||"_self"===w.target,F=!A||!T||!M||I;return y||!I&&F||E.collectLink(A),w.id&&E.collectAnchor(w.id),F?(0,d.jsx)("a",{ref:_,href:A,...C&&!T&&{target:"_blank",rel:"noopener noreferrer"},...w}):(0,d.jsx)(R,{...w,onMouseEnter:D,onTouchStart:D,innerRef:e=>{_.current=e,P&&e&&T&&(O.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(O.current.unobserve(e),O.current.disconnect(),null!=A&&window.docusaurus.prefetch(A))}))})),O.current.observe(e))},to:A,...f&&{isActive:b,activeClassName:h}})}const f=r.forwardRef(p)},2944:(e,t,n)=>{"use strict";n.d(t,{c:()=>r});const r=()=>null},4357:(e,t,n)=>{"use strict";n.d(t,{c:()=>c,G:()=>s});var r=n(1504),o=n(7624);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=null==t?void 0:t[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(144);function l(e){var t,n;let{id:r,message:o}=e;if(void 0===r&&void 0===o)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return null!=(t=null!=(n=i[null!=r?r:o])?n:o)?t:r}function s(e,t){let{message:n,id:r}=e;return a(l({message:n,id:r}),t)}function c(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal <Translate> children",t),new Error("The Docusaurus <Translate> component only accept simple string values");const i=l({message:t,id:n});return(0,o.jsx)(o.Fragment,{children:a(i,r)})}},2488:(e,t,n)=>{"use strict";n.d(t,{M:()=>r});const r="default"},8136:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!r(e)}n.d(t,{_:()=>r,c:()=>o})},964:(e,t,n)=>{"use strict";n.d(t,{E:()=>i,c:()=>l});var r=n(1504),o=n(8264),a=n(8136);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,o.c)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:o=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,a._)(n))return n;if(o)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const l=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+l:l}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function l(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},5976:(e,t,n)=>{"use strict";n.d(t,{c:()=>i});var r=n(1504);n(7624);const o=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),a=()=>(0,r.useContext)(o);function i(){return a()}},8264:(e,t,n)=>{"use strict";n.d(t,{c:()=>a});var r=n(1504),o=n(136);function a(){return(0,r.useContext)(o.e)}},3664:(e,t,n)=>{"use strict";n.d(t,{c:()=>a});var r=n(1504),o=n(240);function a(){return(0,r.useContext)(o.e)}},5288:(e,t,n)=>{"use strict";n.d(t,{c:()=>o});var r=n(1504);const o=n(8684).c.canUseDOM?r.useLayoutEffect:r.useEffect},8120:(e,t,n)=>{"use strict";n.d(t,{c:()=>o});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function o(e){const t={};return function e(n,o){Object.entries(n).forEach((n=>{let[a,i]=n;const l=o?o+"."+a:a;r(i)?e(i,l):t[l]=i}))}(e),t}},5548:(e,t,n)=>{"use strict";n.d(t,{Y:()=>i,e:()=>a});var r=n(1504),o=n(7624);const a=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(a),l=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...null==n?void 0:n.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,o.jsx)(a.Provider,{value:l,children:t})}},2840:(e,t,n)=>{"use strict";n.d(t,{wB:()=>m,UF:()=>p,L0:()=>u,i8:()=>h,OK:()=>d,aA:()=>g,gN:()=>f});var r=n(5592),o=n(8264),a=n(2488);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,o.c)();return e}()[e];if(!n&&t.failfast)throw new Error('Docusaurus plugin global data not found for "'+e+'" plugin.');return n}const l=e=>e.versions.find((e=>e.isLast));function s(e,t){const n=function(e,t){const n=l(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.ot)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),o=null==n?void 0:n.docs.find((e=>!!(0,r.ot)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:o,alternateDocVersions:o?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(o.id):{}}}const c={},u=()=>{var e;return null!=(e=i("docusaurus-plugin-content-docs"))?e:c},d=e=>function(e,t,n){void 0===t&&(t=a.M),void 0===n&&(n={});const r=i(e),o=null==r?void 0:r[t];if(!o&&n.failfast)throw new Error('Docusaurus plugin global data not found for "'+e+'" plugin with id "'+t+'".');return o}("docusaurus-plugin-content-docs",e,{failfast:!0});function p(e){void 0===e&&(e={});const t=u(),{pathname:n}=(0,r.IT)();return function(e,t,n){void 0===n&&(n={});const o=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.ot)(t,{path:n.path,exact:!1,strict:!1})})),a=o?{pluginId:o[0],pluginData:o[1]}:void 0;if(!a&&n.failfast)throw new Error("Can't find active docs plugin for \""+t+'" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: '+Object.values(e).map((e=>e.path)).join(", "));return a}(t,n,e)}function f(e){return d(e).versions}function g(e){const t=d(e);return l(t)}function m(e){const t=d(e),{pathname:n}=(0,r.IT)();return s(t,n)}function h(e){const t=d(e),{pathname:n}=(0,r.IT)();return function(e,t){const n=l(e);return{latestDocSuggestion:s(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},9596:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(2272),o=n.n(r);o().configure({showSpinner:!1});const a={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{o().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){o().done()}}},5396:(e,t,n)=>{"use strict";n.r(t);var r=n(5720),o=n(7768);!function(e){const{themeConfig:{prism:t}}=o.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(1808),n(8660)("./prism-"+e)})),delete globalThis.Prism}(r.sp)},6448:(e,t,n)=>{"use strict";n.d(t,{c:()=>u});n(1504);var r=n(5456),o=n(4357),a=n(1824),i=n(867),l=n(5976);const s={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var c=n(7624);function u(e){let{as:t,id:n,...u}=e;const d=(0,l.c)(),{navbar:{hideOnScroll:p}}=(0,a.y)();if("h1"===t||!n)return(0,c.jsx)(t,{...u,id:void 0});d.collectAnchor(n);const f=(0,o.G)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return(0,c.jsxs)(t,{...u,className:(0,r.c)("anchor",p?s.anchorWithHideOnScrollNavbar:s.anchorWithStickyNavbar,u.className),id:n,children:[u.children,(0,c.jsx)(i.c,{className:"hash-link",to:"#"+n,"aria-label":f,title:f,children:"\u200b"})]})}},3232:(e,t,n)=>{"use strict";n.d(t,{c:()=>a});n(1504);const r={iconExternalLink:"iconExternalLink_nPIU"};var o=n(7624);function a(e){let{width:t=13.5,height:n=13.5}=e;return(0,o.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,o.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},9012:(e,t,n)=>{"use strict";n.d(t,{c:()=>ft});var r=n(1504),o=n(5456),a=n(5852),i=n(5756),l=n(5592),s=n(4357),c=n(7124),u=n(7624);const d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,l.Uz)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=null!=(n=document.querySelector("main:first-of-type"))?n:document.getElementById(d);var n;t&&p(t)}),[]);return(0,c.c)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const g=(0,s.G)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function m(e){var t;const n=null!=(t=e.children)?t:g,{containerRef:r,onClick:o}=f();return(0,u.jsx)("div",{ref:r,role:"region","aria-label":g,children:(0,u.jsx)("a",{...e,href:"#"+d,onClick:o,children:n})})}var h=n(5864),b=n(204);const y={skipToContent:"skipToContent_fXgn"};function v(){return(0,u.jsx)(m,{className:y.skipToContent})}var w=n(1824),k=n(3868);function x(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:o=1.2,className:a,...i}=e;return(0,u.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,u.jsx)("g",{stroke:r,strokeWidth:o,children:(0,u.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const S={closeButton:"closeButton_CVFx"};function E(e){return(0,u.jsx)("button",{type:"button","aria-label":(0,s.G)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,o.c)("clean-btn close",S.closeButton,e.className),children:(0,u.jsx)(x,{width:14,height:14,strokeWidth:3.1})})}const _={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,w.y)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,o.c)(_.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const T={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function j(){const{announcementBar:e}=(0,w.y)(),{isActive:t,close:n}=(0,k.el)();if(!t)return null;const{backgroundColor:r,textColor:o,isCloseable:a}=e;return(0,u.jsxs)("div",{className:T.announcementBar,style:{backgroundColor:r,color:o},role:"banner",children:[a&&(0,u.jsx)("div",{className:T.announcementBarPlaceholder}),(0,u.jsx)(C,{className:T.announcementBarContent}),a&&(0,u.jsx)(E,{onClick:n,className:T.announcementBarClose})]})}var A=n(1336),N=n(3943);var L=n(1100),R=n(5168);const P=r.createContext(null);function O(e){let{children:t}=e;const n=function(){const e=(0,A.q)(),t=(0,R.MF)(),[n,o]=(0,r.useState)(!1),a=null!==t.component,i=(0,L.i0)(a);return(0,r.useEffect)((()=>{a&&!i&&o(!0)}),[a,i]),(0,r.useEffect)((()=>{a?e.shown||o(!0):o(!1)}),[e.shown,a]),(0,r.useMemo)((()=>[n,o]),[n])}();return(0,u.jsx)(P.Provider,{value:n,children:t})}function D(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function I(){const e=(0,r.useContext)(P);if(!e)throw new L.AH("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)((()=>n(!1)),[n]),a=(0,R.MF)();return(0,r.useMemo)((()=>({shown:t,hide:o,content:D(a)})),[o,a,t])}function M(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:a}=I();return(0,u.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,u.jsxs)("div",{className:(0,o.c)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":a}),children:[(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var F=n(6528),z=n(3664);function B(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function U(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const $={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function q(e){let{className:t,buttonClassName:n,value:r,onChange:a}=e;const i=(0,z.c)(),l=(0,s.G)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,s.G)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,s.G)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,u.jsx)("div",{className:(0,o.c)($.toggle,t),children:(0,u.jsxs)("button",{className:(0,o.c)("clean-btn",$.toggleButton,!i&&$.toggleButtonDisabled,n),type:"button",onClick:()=>a("dark"===r?"light":"dark"),disabled:!i,title:l,"aria-label":l,"aria-live":"polite",children:[(0,u.jsx)(B,{className:(0,o.c)($.toggleIcon,$.lightToggleIcon)}),(0,u.jsx)(U,{className:(0,o.c)($.toggleIcon,$.darkToggleIcon)})]})})}const H=r.memo(q),G={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function V(e){let{className:t}=e;const n=(0,w.y)().navbar.style,r=(0,w.y)().colorMode.disableSwitch,{colorMode:o,setColorMode:a}=(0,F.U)();return r?null:(0,u.jsx)(H,{className:t,buttonClassName:"dark"===n?G.darkNavbarColorModeToggle:void 0,value:o,onChange:a})}var W=n(8164);function Q(){return(0,u.jsx)(W.c,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Y(){const e=(0,A.q)();return(0,u.jsx)("button",{type:"button","aria-label":(0,s.G)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,u.jsx)(x,{color:"var(--ifm-color-emphasis-600)"})})}function K(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(Q,{}),(0,u.jsx)(V,{className:"margin-right--md"}),(0,u.jsx)(Y,{})]})}var X=n(867),Z=n(964),J=n(8136);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(3232);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:o,label:a,html:i,isDropdownLink:l,prependBaseUrlToHref:s,...c}=e;const d=(0,Z.c)(r),p=(0,Z.c)(t),f=(0,Z.c)(o,{forcePrependBaseUrl:!0}),g=a&&o&&!(0,J.c)(o),m=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,u.jsxs)(u.Fragment,{children:[a,g&&(0,u.jsx)(te.c,{...l&&{width:12,height:12}})]})};return o?(0,u.jsx)(X.c,{href:s?f:o,...c,...m}):(0,u.jsx)(X.c,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(p)},...c,...m})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const a=(0,u.jsx)(ne,{className:(0,o.c)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,u.jsx)("li",{children:a}):a}function oe(e){let{className:t,isDropdownItem:n,...r}=e;return(0,u.jsx)("li",{className:"menu__list-item",children:(0,u.jsx)(ne,{className:(0,o.c)("menu__link",t),...r})})}function ae(e){var t;let{mobile:n=!1,position:r,...o}=e;const a=n?oe:re;return(0,u.jsx)(a,{...o,activeClassName:null!=(t=o.activeClassName)?t:n?"menu__link--active":"navbar__link--active"})}var ie=n(8448),le=n(3376),se=n(8264);const ce={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_S0Fm"};function ue(e,t){return e.some((e=>function(e,t){return!!(0,le.Sc)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){var t;let{items:n,position:a,className:i,onClick:l,...s}=e;const c=(0,r.useRef)(null),[d,p]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{c.current&&!c.current.contains(e.target)&&p(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[c]),(0,u.jsxs)("div",{ref:c,className:(0,o.c)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===a,"dropdown--show":d}),children:[(0,u.jsx)(ne,{"aria-haspopup":"true","aria-expanded":d,role:"button",href:s.to?void 0:"#",className:(0,o.c)("navbar__link",i),...s,onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),p(!d))},children:null!=(t=s.children)?t:s.label}),(0,u.jsx)("ul",{className:"dropdown__menu",children:n.map(((e,t)=>(0,r.createElement)(_e,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function pe(e){var t;let{items:n,className:a,position:i,onClick:s,...c}=e;const d=function(){const{siteConfig:{baseUrl:e}}=(0,se.c)(),{pathname:t}=(0,l.IT)();return t.replace(e,"/")}(),p=ue(n,d),{collapsed:f,toggleCollapsed:g,setCollapsed:m}=(0,ie.a)({initialState:()=>!p});return(0,r.useEffect)((()=>{p&&m(!p)}),[d,p,m]),(0,u.jsxs)("li",{className:(0,o.c)("menu__list-item",{"menu__list-item--collapsed":f}),children:[(0,u.jsx)(ne,{role:"button",className:(0,o.c)(ce.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",a),...c,onClick:e=>{e.preventDefault(),g()},children:null!=(t=c.children)?t:c.label}),(0,u.jsx)(ie.U,{lazy:!0,as:"ul",className:"menu__list",collapsed:f,children:n.map(((e,t)=>(0,r.createElement)(_e,{mobile:!0,isDropdownItem:!0,onClick:s,activeClassName:"menu__link--active",...e,key:t})))})]})}function fe(e){let{mobile:t=!1,...n}=e;const r=t?pe:de;return(0,u.jsx)(r,{...n})}var ge=n(1616);function me(e){let{width:t=20,height:n=20,...r}=e;return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const he="iconLanguage_nlXk";var be=n(2944);const ye={navbarSearchContainer:"navbarSearchContainer_Bca1"};function ve(e){let{children:t,className:n}=e;return(0,u.jsx)("div",{className:(0,o.c)(n,ye.navbarSearchContainer),children:t})}var we=n(2840),ke=n(9940);var xe=n(4592);const Se=e=>e.docs.find((t=>t.id===e.mainDocId));const Ee={default:ae,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:o="",...a}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,se.c)(),p=(0,ge.D)(),{search:f,hash:g}=(0,l.IT)(),m=[...n,...c.map((e=>{const n=""+("pathname://"+p.createUrl({locale:e,fullyQualified:!1}))+f+g+o;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],h=t?(0,s.G)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,u.jsx)(fe,{...a,mobile:t,label:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(me,{className:he}),h]}),items:m})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,u.jsx)(ve,{className:n,children:(0,u.jsx)(be.c,{})})},dropdown:fe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:a=!1}=e;const i=a?"li":"div";return(0,u.jsx)(i,{className:(0,o.c)({navbar__item:!r&&!a,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,we.wB)(r),i=(0,ke.Qf)(t,r),l=(null==a?void 0:a.path)===(null==i?void 0:i.path);return null===i||i.unlisted&&!l?null:(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>l||!(null==a||!a.sidebar)&&a.sidebar===i.sidebar,label:null!=n?n:i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,we.wB)(r),i=(0,ke.Ab)(t,r).link;if(!i)throw new Error('DocSidebarNavbarItem: Sidebar with ID "'+t+"\" doesn't have anything to be linked to.");return(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>(null==a?void 0:a.sidebar)===t,label:null!=n?n:i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...o}=e;const a=(0,ke.b7)(r)[0],i=null!=t?t:a.label,l=null!=n?n:(e=>e.docs.find((t=>t.id===e.mainDocId)))(a).path;return(0,u.jsx)(ae,{...o,label:i,to:l})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:o,dropdownItemsAfter:a,...i}=e;const{search:c,hash:d}=(0,l.IT)(),p=(0,we.wB)(n),f=(0,we.gN)(n),{savePreferredVersionName:g}=(0,xe.iy)(n),m=[...o,...f.map((e=>{var t;const n=null!=(t=p.alternateDocVersions[e.name])?t:Se(e);return{label:e.label,to:""+n.path+c+d,isActive:()=>e===p.activeVersion,onClick:()=>g(e.name)}})),...a],h=(0,ke.b7)(n)[0],b=t&&m.length>1?(0,s.G)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):h.label,y=t&&m.length>1?void 0:Se(h).path;return m.length<=1?(0,u.jsx)(ae,{...i,mobile:t,label:b,to:y,isActive:r?()=>!1:void 0}):(0,u.jsx)(fe,{...i,mobile:t,label:b,to:y,items:m,isActive:r?()=>!1:void 0})}};function _e(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=Ee[r];if(!o)throw new Error('No NavbarItem component found for type "'+t+'".');return(0,u.jsx)(o,{...n})}function Ce(){const e=(0,A.q)(),t=(0,w.y)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(_e,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Te(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(s.c,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function je(){const e=0===(0,w.y)().navbar.items.length,t=I();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(Te,{onClick:()=>t.hide()}),t.content]})}function Ae(){const e=(0,A.q)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?(0,u.jsx)(M,{header:(0,u.jsx)(K,{}),primaryMenu:(0,u.jsx)(Ce,{}),secondaryMenu:(0,u.jsx)(je,{})}):null}const Ne={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Le(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,o.c)("navbar-sidebar__backdrop",e.className)})}function Re(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:a}}=(0,w.y)(),i=(0,A.q)(),{navbarRef:l,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),o=(0,r.useRef)(!1),a=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(a.current=e.getBoundingClientRect().height)}),[]);return(0,N.SM)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i<a.current)return void n(!0);if(o.current)return void(o.current=!1);const l=null==r?void 0:r.scrollY,s=document.documentElement.scrollHeight-a.current,c=window.innerHeight;l&&i>=l?n(!1):i+c<s&&n(!0)})),(0,c.c)((t=>{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return o.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,u.jsxs)("nav",{ref:l,"aria-label":(0,s.G)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.c)("navbar","navbar--fixed-top",n&&[Ne.navbarHideable,!d&&Ne.navbarHidden],{"navbar--dark":"dark"===a,"navbar--primary":"primary"===a,"navbar-sidebar--show":i.shown}),children:[t,(0,u.jsx)(Le,{onClick:i.toggle}),(0,u.jsx)(Ae,{})]})}var Pe=n(5684);const Oe={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function De(e){return(0,u.jsx)("button",{type:"button",...e,children:(0,u.jsx)(s.c,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function Ie(e){let{error:t}=e;const n=(0,Pe.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,u.jsx)("p",{className:Oe.errorBoundaryError,children:n})}class Me extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const Fe="right";function ze(e){let{width:t=30,height:n=30,className:r,...o}=e;return(0,u.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...o,children:(0,u.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function Be(){const{toggle:e,shown:t}=(0,A.q)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,s.G)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,u.jsx)(ze,{})})}const Ue={colorModeToggle:"colorModeToggle_DEke"};function $e(e){let{items:t}=e;return(0,u.jsx)(u.Fragment,{children:t.map(((e,t)=>(0,u.jsx)(Me,{onError:t=>new Error("A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n"+JSON.stringify(e,null,2),{cause:t}),children:(0,u.jsx)(_e,{...e})},t)))})}function qe(e){let{left:t,right:n}=e;return(0,u.jsxs)("div",{className:"navbar__inner",children:[(0,u.jsx)("div",{className:"navbar__items",children:t}),(0,u.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function He(){const e=(0,A.q)(),t=(0,w.y)().navbar.items,[n,r]=function(e){function t(e){var t;return"left"===(null!=(t=e.position)?t:Fe)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return(0,u.jsx)(qe,{left:(0,u.jsxs)(u.Fragment,{children:[!e.disabled&&(0,u.jsx)(Be,{}),(0,u.jsx)(Q,{}),(0,u.jsx)($e,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)($e,{items:r}),(0,u.jsx)(V,{className:Ue.colorModeToggle}),!o&&(0,u.jsx)(ve,{children:(0,u.jsx)(be.c,{})})]})})}function Ge(){return(0,u.jsx)(Re,{children:(0,u.jsx)(He,{})})}function Ve(e){let{item:t}=e;const{to:n,href:r,label:o,prependBaseUrlToHref:a,...i}=t,l=(0,Z.c)(n),s=(0,Z.c)(r,{forcePrependBaseUrl:!0});return(0,u.jsxs)(X.c,{className:"footer__link-item",...r?{href:a?s:r}:{to:l},...i,children:[o,r&&!(0,J.c)(r)&&(0,u.jsx)(te.c,{})]})}function We(e){var t;let{item:n}=e;return n.html?(0,u.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:n.html}}):(0,u.jsx)("li",{className:"footer__item",children:(0,u.jsx)(Ve,{item:n})},null!=(t=n.href)?t:n.to)}function Qe(e){let{column:t}=e;return(0,u.jsxs)("div",{className:"col footer__col",children:[(0,u.jsx)("div",{className:"footer__title",children:t.title}),(0,u.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,u.jsx)(We,{item:e},t)))})]})}function Ye(e){let{columns:t}=e;return(0,u.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,u.jsx)(Qe,{column:e},t)))})}function Ke(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function Xe(e){let{item:t}=e;return t.html?(0,u.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)(Ve,{item:t})}function Ze(e){let{links:t}=e;return(0,u.jsx)("div",{className:"footer__links text--center",children:(0,u.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,u.jsxs)(r.Fragment,{children:[(0,u.jsx)(Xe,{item:e}),t.length!==n+1&&(0,u.jsx)(Ke,{})]},n)))})})}function Je(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,u.jsx)(Ye,{columns:t}):(0,u.jsx)(Ze,{links:t})}var et=n(1964);const tt={footerLogoLink:"footerLogoLink_BH7S"};function nt(e){var t;let{logo:n}=e;const{withBaseUrl:r}=(0,Z.E)(),a={light:r(n.src),dark:r(null!=(t=n.srcDark)?t:n.src)};return(0,u.jsx)(et.c,{className:(0,o.c)("footer__logo",n.className),alt:n.alt,sources:a,width:n.width,height:n.height,style:n.style})}function rt(e){let{logo:t}=e;return t.href?(0,u.jsx)(X.c,{href:t.href,className:tt.footerLogoLink,target:t.target,children:(0,u.jsx)(nt,{logo:t})}):(0,u.jsx)(nt,{logo:t})}function ot(e){let{copyright:t}=e;return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function at(e){let{style:t,links:n,logo:r,copyright:a}=e;return(0,u.jsx)("footer",{className:(0,o.c)("footer",{"footer--dark":"dark"===t}),children:(0,u.jsxs)("div",{className:"container container-fluid",children:[n,(r||a)&&(0,u.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,u.jsx)("div",{className:"margin-bottom--sm",children:r}),a]})]})})}function it(){const{footer:e}=(0,w.y)();if(!e)return null;const{copyright:t,links:n,logo:r,style:o}=e;return(0,u.jsx)(at,{style:o,links:n&&n.length>0&&(0,u.jsx)(Je,{links:n}),logo:r&&(0,u.jsx)(rt,{logo:r}),copyright:t&&(0,u.jsx)(ot,{copyright:t})})}const lt=r.memo(it),st=(0,L.qY)([F.C,k.qu,N.S2,xe.gc,i.w7,function(e){let{children:t}=e;return(0,u.jsx)(R.Ub,{children:(0,u.jsx)(A.y,{children:(0,u.jsx)(O,{children:t})})})}]);function ct(e){let{children:t}=e;return(0,u.jsx)(st,{children:t})}var ut=n(6448);function dt(e){let{error:t,tryAgain:n}=e;return(0,u.jsx)("main",{className:"container margin-vert--xl",children:(0,u.jsx)("div",{className:"row",children:(0,u.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,u.jsx)(ut.c,{as:"h1",className:"hero__title",children:(0,u.jsx)(s.c,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,u.jsx)("div",{className:"margin-vert--lg",children:(0,u.jsx)(De,{onClick:n,className:"button button--primary shadow--lw"})}),(0,u.jsx)("hr",{}),(0,u.jsx)("div",{className:"margin-vert--md",children:(0,u.jsx)(Ie,{error:t})})]})})})}const pt={mainWrapper:"mainWrapper_z2l0"};function ft(e){const{children:t,noFooter:n,wrapperClassName:r,title:l,description:s}=e;return(0,b.W)(),(0,u.jsxs)(ct,{children:[(0,u.jsx)(i.U7,{title:l,description:s}),(0,u.jsx)(v,{}),(0,u.jsx)(j,{}),(0,u.jsx)(Ge,{}),(0,u.jsx)("div",{id:d,className:(0,o.c)(h.W.wrapper.main,pt.mainWrapper,r),children:(0,u.jsx)(a.c,{fallback:e=>(0,u.jsx)(dt,{...e}),children:t})}),!n&&(0,u.jsx)(lt,{})]})}},8164:(e,t,n)=>{"use strict";n.d(t,{c:()=>u});n(1504);var r=n(867),o=n(964),a=n(8264),i=n(1824),l=n(1964),s=n(7624);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const a={light:(0,o.c)(t.src),dark:(0,o.c)(t.srcDark||t.src)},i=(0,s.jsx)(l.c,{className:t.className,sources:a,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,s.jsx)("div",{className:r,children:i}):i}function u(e){var t;const{siteConfig:{title:n}}=(0,a.c)(),{navbar:{title:l,logo:u}}=(0,i.y)(),{imageClassName:d,titleClassName:p,...f}=e,g=(0,o.c)((null==u?void 0:u.href)||"/"),m=l?"":n,h=null!=(t=null==u?void 0:u.alt)?t:m;return(0,s.jsxs)(r.c,{to:g,...f,...(null==u?void 0:u.target)&&{target:u.target},children:[u&&(0,s.jsx)(c,{logo:u,alt:h,imageClassName:d}),null!=l&&(0,s.jsx)("b",{className:p,children:l})]})}},8712:(e,t,n)=>{"use strict";n.d(t,{c:()=>a});n(1504);var r=n(6952),o=n(7624);function a(e){let{locale:t,version:n,tag:a}=e;const i=t;return(0,o.jsxs)(r.c,{children:[t&&(0,o.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,o.jsx)("meta",{name:"docusaurus_version",content:n}),a&&(0,o.jsx)("meta",{name:"docusaurus_tag",content:a}),i&&(0,o.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,o.jsx)("meta",{name:"docsearch:version",content:n}),a&&(0,o.jsx)("meta",{name:"docsearch:docusaurus_tag",content:a})]})}},1964:(e,t,n)=>{"use strict";n.d(t,{c:()=>u});var r=n(1504),o=n(5456),a=n(3664),i=n(6528);const l={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var s=n(7624);function c(e){let{className:t,children:n}=e;const c=(0,a.c)(),{colorMode:u}=(0,i.U)();return(0,s.jsx)(s.Fragment,{children:(c?"dark"===u?["dark"]:["light"]:["light","dark"]).map((e=>{const a=n({theme:e,className:(0,o.c)(t,l.themedComponent,l["themedComponent--"+e])});return(0,s.jsx)(r.Fragment,{children:a},e)}))})}function u(e){const{sources:t,className:n,alt:r,...o}=e;return(0,s.jsx)(c,{className:n,children:e=>{let{theme:n,className:a}=e;return(0,s.jsx)("img",{src:t[n],alt:r,className:a,...o})}})}},8448:(e,t,n)=>{"use strict";n.d(t,{U:()=>b,a:()=>c});var r=n(1504),o=n(8684),a=n(5288),i=n(3856),l=n(7624);const s="ease-in-out";function c(e){let{initialState:t}=e;const[n,o]=(0,r.useState)(null!=t&&t),a=(0,r.useCallback)((()=>{o((e=>!e))}),[]);return{collapsed:n,setCollapsed:o,toggleCollapsed:a}}const u={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function p(e,t){const n=t?u:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:o}=e;const a=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){var t,n;const r=e.scrollHeight,a=null!=(t=null==o?void 0:o.duration)?t:function(e){if((0,i.I)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(r);return{transition:"height "+a+"ms "+(null!=(n=null==o?void 0:o.easing)?n:s),height:r+"px"}}function l(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!a.current)return p(e,n),void(a.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(l(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{l()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,o])}function g(e){if(!o.c.canUseDOM)return e?u:d}function m(e){let{as:t="div",collapsed:n,children:o,animation:a,onCollapseTransitionEnd:i,className:s,disableSSRStyle:c}=e;const u=(0,r.useRef)(null);return f({collapsibleRef:u,collapsed:n,animation:a}),(0,l.jsx)(t,{ref:u,style:c?void 0:g(n),onTransitionEnd:e=>{"height"===e.propertyName&&(p(u.current,n),null==i||i(n))},className:s,children:o})}function h(e){let{collapsed:t,...n}=e;const[o,i]=(0,r.useState)(!t),[s,c]=(0,r.useState)(t);return(0,a.c)((()=>{t||i(!0)}),[t]),(0,a.c)((()=>{o&&c(t)}),[o,t]),o?(0,l.jsx)(m,{...n,collapsed:s}):null}function b(e){let{lazy:t,...n}=e;const r=t?h:m;return(0,l.jsx)(r,{...n})}},3868:(e,t,n)=>{"use strict";n.d(t,{el:()=>m,qu:()=>g});var r=n(1504),o=n(3664),a=n(1148),i=n(1100),l=n(1824),s=n(7624);const c=(0,a.GS)("docusaurus.announcement.dismiss"),u=(0,a.GS)("docusaurus.announcement.id"),d=()=>"true"===c.get(),p=e=>c.set(String(e)),f=r.createContext(null);function g(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.y)(),t=(0,o.c)(),[n,a]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{a(d())}),[]);const i=(0,r.useCallback)((()=>{p(!0),a(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&p(!1),!r&&d()||a(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,s.jsx)(f.Provider,{value:n,children:t})}function m(){const e=(0,r.useContext)(f);if(!e)throw new i.AH("AnnouncementBarProvider");return e}},6528:(e,t,n)=>{"use strict";n.d(t,{C:()=>h,U:()=>b});var r=n(1504),o=n(8684),a=n(1100),i=n(1148),l=n(1824),s=n(7624);const c=r.createContext(void 0),u="theme",d=(0,i.GS)(u),p={light:"light",dark:"dark"},f=e=>e===p.dark?p.dark:p.light,g=e=>o.c.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),m=e=>{d.set(f(e))};function h(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.y)(),[o,a]=(0,r.useState)(g(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:o=!0}=r;t?(a(t),o&&m(t)):(a(n?window.matchMedia("(prefers-color-scheme: dark)").matches?p.dark:p.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(o))}),[o]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=d.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const s=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||s.current?s.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:o,setColorMode:i,get isDarkTheme(){return o===p.dark},setLightTheme(){i(p.light)},setDarkTheme(){i(p.dark)}})),[o,i])}();return(0,s.jsx)(c.Provider,{value:n,children:t})}function b(){const e=(0,r.useContext)(c);if(null==e)throw new a.AH("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},4592:(e,t,n)=>{"use strict";n.d(t,{gc:()=>b,iy:()=>v});var r=n(1504),o=n(2840),a=n(2488),i=n(1824),l=n(9940),s=n(1100),c=n(1148),u=n(7624);const d=e=>"docs-preferred-version-"+e,p={save:(e,t,n)=>{(0,c.GS)(d(e),{persistence:t}).set(n)},read:(e,t)=>(0,c.GS)(d(e),{persistence:t}).get(),clear:(e,t)=>{(0,c.GS)(d(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const g=r.createContext(null);function m(){const e=(0,o.L0)(),t=(0,i.y)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[a,l]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function o(e){const t=p.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(p.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,o(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[a,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){p.save(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function h(e){let{children:t}=e;const n=m();return(0,u.jsx)(g.Provider,{value:n,children:t})}function b(e){let{children:t}=e;return l.c1?(0,u.jsx)(h,{children:t}):(0,u.jsx)(u.Fragment,{children:t})}function y(){const e=(0,r.useContext)(g);if(!e)throw new s.AH("DocsPreferredVersionContextProvider");return e}function v(e){var t;void 0===e&&(e=a.M);const n=(0,o.OK)(e),[i,l]=y(),{preferredVersionName:s}=i[e];return{preferredVersion:null!=(t=n.versions.find((e=>e.name===s)))?t:null,savePreferredVersionName:(0,r.useCallback)((t=>{l.savePreferredVersion(e,t)}),[l,e])}}},6192:(e,t,n)=>{"use strict";n.d(t,{m:()=>c,y:()=>s});var r=n(1504),o=n(1100),a=n(7624);const i=Symbol("EmptyContext"),l=r.createContext(i);function s(e){let{children:t,name:n,items:o}=e;const i=(0,r.useMemo)((()=>n&&o?{name:n,items:o}:null),[n,o]);return(0,a.jsx)(l.Provider,{value:i,children:t})}function c(){const e=(0,r.useContext)(l);if(e===i)throw new o.AH("DocsSidebarProvider");return e}},9920:(e,t,n)=>{"use strict";n.d(t,{E:()=>s,Q:()=>l});var r=n(1504),o=n(1100),a=n(7624);const i=r.createContext(null);function l(e){let{children:t,version:n}=e;return(0,a.jsx)(i.Provider,{value:n,children:t})}function s(){const e=(0,r.useContext)(i);if(null===e)throw new o.AH("DocsVersionProvider");return e}},1336:(e,t,n)=>{"use strict";n.d(t,{y:()=>f,q:()=>g});var r=n(1504),o=n(5168),a=n(1432),i=n(5592),l=n(1100);function s(e){!function(e){const t=(0,i.Uz)(),n=(0,l.yA)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}var c=n(1824),u=n(7624);const d=r.createContext(void 0);function p(){const e=function(){const e=(0,o.MF)(),{items:t}=(0,c.y)().navbar;return 0===t.length&&!e.component}(),t=(0,a.U)(),n=!e&&"mobile"===t,[i,l]=(0,r.useState)(!1);s((()=>{if(i)return l(!1),!1}));const u=(0,r.useCallback)((()=>{l((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&l(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:i})),[e,n,u,i])}function f(e){let{children:t}=e;const n=p();return(0,u.jsx)(d.Provider,{value:n,children:t})}function g(){const e=r.useContext(d);if(void 0===e)throw new l.AH("NavbarMobileSidebarProvider");return e}},5168:(e,t,n)=>{"use strict";n.d(t,{MF:()=>s,Mx:()=>c,Ub:()=>l});var r=n(1504),o=n(1100),a=n(7624);const i=r.createContext(null);function l(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,a.jsx)(i.Provider,{value:n,children:t})}function s(){const e=(0,r.useContext)(i);if(!e)throw new o.AH("NavbarSecondaryMenuContentProvider");return e[0]}function c(e){let{component:t,props:n}=e;const a=(0,r.useContext)(i);if(!a)throw new o.AH("NavbarSecondaryMenuContentProvider");const[,l]=a,s=(0,o.Mh)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},204:(e,t,n)=>{"use strict";n.d(t,{m:()=>o,W:()=>a});var r=n(1504);const o="navigation-with-keyboard";function a(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(o),"mousedown"===e.type&&document.body.classList.remove(o)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(o),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},1432:(e,t,n)=>{"use strict";n.d(t,{U:()=>l});var r=n(1504),o=n(8684);const a={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function l(e){let{desktopBreakpoint:t=i}=void 0===e?{}:e;const[n,l]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){l(function(e){if(!o.c.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?a.desktop:a.mobile}(t))}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[t]),n}},5864:(e,t,n)=>{"use strict";n.d(t,{W:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",admonitionType:e=>"theme-admonition-"+e},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>"theme-doc-sidebar-item-category-level-"+e,docSidebarItemLinkLevel:e=>"theme-doc-sidebar-item-link-level-"+e},blog:{}}},3856:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{I:()=>r})},9940:(e,t,n)=>{"use strict";n.d(t,{Gw:()=>f,Md:()=>h,c1:()=>p,Uj:()=>E,b7:()=>k,Qf:()=>S,Ab:()=>x,js:()=>w,mg:()=>y});var r=n(1504),o=n(5592),a=n(5464),i=n(2840),l=n(4592),s=n(9920),c=n(6192);function u(e){return Array.from(new Set(e))}var d=n(3376);const p=!!i.L0;function f(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=f(t);if(e)return e}}(e):void 0:e.href}const g=(e,t)=>void 0!==e&&(0,d.Sc)(e,t),m=(e,t)=>e.some((e=>h(e,t)));function h(e,t){return"link"===e.type?g(e.href,t):"category"===e.type&&(g(e.href,t)||m(e.items,t))}function b(e,t){switch(e.type){case"category":return h(e,t)||e.items.some((e=>b(e,t)));case"link":return!e.unlisted||h(e,t);default:return!0}}function y(e,t){return(0,r.useMemo)((()=>e.filter((e=>b(e,t)))),[e,t])}function v(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const o=[];return function e(t){for(const a of t)if("category"===a.type&&((0,d.Sc)(a.href,n)||e(a.items))||"link"===a.type&&(0,d.Sc)(a.href,n)){return r&&"category"!==a.type||o.unshift(a),!0}return!1}(t),o}function w(){var e;const t=(0,c.m)(),{pathname:n}=(0,o.IT)();return!1!==(null==(e=(0,i.UF)())?void 0:e.pluginData.breadcrumbs)&&t?v({sidebarItems:t.items,pathname:n}):null}function k(e){const{activeVersion:t}=(0,i.wB)(e),{preferredVersion:n}=(0,l.iy)(e),o=(0,i.aA)(e);return(0,r.useMemo)((()=>u([t,n,o].filter(Boolean))),[t,n,o])}function x(e,t){const n=k(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error("Can't find any sidebar with id \""+e+'" in version'+(n.length>1?"s":"")+" "+n.map((e=>e.name)).join(", ")+'".\nAvailable sidebar ids are:\n- '+t.map((e=>e[0])).join("\n- "));return r[1]}),[e,n])}function S(e,t){const n=k(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error("Couldn't find any doc with id \""+e+'" in version'+(n.length>1?"s":"")+' "'+n.map((e=>e.name)).join(", ")+'".\nAvailable doc ids are:\n- '+u(t.map((e=>e.id))).join("\n- "))}return r}),[e,n])}function E(e){let{route:t}=e;const n=(0,o.IT)(),r=(0,s.E)(),i=t.routes,l=i.find((e=>(0,o.ot)(n.pathname,e)));if(!l)return null;const c=l.sidebar,u=c?r.docsSidebars[c]:void 0;return{docElement:(0,a.k)(i),sidebarName:c,sidebarItems:u}}},5756:(e,t,n)=>{"use strict";n.d(t,{cr:()=>f,U7:()=>d,w7:()=>g});var r=n(1504),o=n(5456),a=n(6952),i=n(5548);function l(){const e=r.useContext(i.e);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(964),c=n(8264);var u=n(7624);function d(e){let{title:t,description:n,keywords:r,image:o,children:i}=e;const l=function(e){const{siteConfig:t}=(0,c.c)(),{title:n,titleDelimiter:r}=t;return null!=e&&e.trim().length?e.trim()+" "+r+" "+n:n}(t),{withBaseUrl:d}=(0,s.E)(),p=o?d(o,{absolute:!0}):void 0;return(0,u.jsxs)(a.c,{children:[t&&(0,u.jsx)("title",{children:l}),t&&(0,u.jsx)("meta",{property:"og:title",content:l}),n&&(0,u.jsx)("meta",{name:"description",content:n}),n&&(0,u.jsx)("meta",{property:"og:description",content:n}),r&&(0,u.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),p&&(0,u.jsx)("meta",{property:"og:image",content:p}),p&&(0,u.jsx)("meta",{name:"twitter:image",content:p}),i]})}const p=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(p),l=(0,o.c)(i,t);return(0,u.jsxs)(p.Provider,{value:l,children:[(0,u.jsx)(a.c,{children:(0,u.jsx)("html",{className:l})}),n]})}function g(e){let{children:t}=e;const n=l(),r="plugin-"+n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"");const a="plugin-id-"+n.plugin.id;return(0,u.jsx)(f,{className:(0,o.c)(r,a),children:t})}},1100:(e,t,n)=>{"use strict";n.d(t,{AH:()=>s,Mh:()=>c,i0:()=>l,qY:()=>u,yA:()=>i});var r=n(1504),o=n(5288),a=n(7624);function i(e){const t=(0,r.useRef)(e);return(0,o.c)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function l(e){const t=(0,r.useRef)();return(0,o.c)((()=>{t.current=e})),t.current}class s extends Error{constructor(e,t){var n,r;super(),this.name="ReactContextError",this.message="Hook "+(null!=(n=null==(r=this.stack)||null==(r=r.split("\n")[1])||null==(r=r.match(/at (?:\w+\.)?(?<name>\w+)/))?void 0:r.groups.name)?n:"")+" is called outside the <"+e+">. "+(null!=t?t:"")}}function c(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return(0,a.jsx)(a.Fragment,{children:e.reduceRight(((e,t)=>(0,a.jsx)(t,{children:e})),n)})}}},3376:(e,t,n)=>{"use strict";n.d(t,{Sc:()=>i,Y5:()=>l});var r=n(1504),o=n(628),a=n(8264);function i(e,t){const n=e=>{var t;return null==(t=!e||e.endsWith("/")?e:e+"/")?void 0:t.toLowerCase()};return n(e)===n(t)}function l(){const{baseUrl:e}=(0,a.c)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function o(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(o).flatMap((e=>{var t;return null!=(t=e.routes)?t:[]})))}(n)}({routes:o.c,baseUrl:e})),[e])}},3943:(e,t,n)=>{"use strict";n.d(t,{S2:()=>c,SM:()=>p,yI:()=>f});var r=n(1504),o=n(8684),a=n(3664),i=(n(5288),n(1100)),l=n(7624);const s=r.createContext(void 0);function c(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,l.jsx)(s.Provider,{value:n,children:t})}function u(){const e=(0,r.useContext)(s);if(null==e)throw new i.AH("ScrollControllerProvider");return e}const d=()=>o.c.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function p(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),o=(0,r.useRef)(d()),a=(0,i.yA)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=d();a(e,o.current),o.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[a,n,...t])}function f(){const e=(0,r.useRef)(null),t=(0,a.c)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const o=document.documentElement.scrollTop;(n&&o>e||!n&&o<e)&&(t=requestAnimationFrame(r),window.scrollTo(0,Math.floor(.85*(o-e))+e))}(),()=>t&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>null==e.current?void 0:e.current()}}},4456:(e,t,n)=>{"use strict";n.d(t,{SE:()=>o,e6:()=>r});n(8264);const r="default";function o(e,t){return"docs-"+e+"-"+t}},1148:(e,t,n)=>{"use strict";n.d(t,{GS:()=>s});n(1504);const r="localStorage";function o(e){let{key:t,oldValue:n,newValue:r,storage:o}=e;if(n===r)return;const a=document.createEvent("StorageEvent");a.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,o),window.dispatchEvent(a)}function a(e){if(void 0===e&&(e=r),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,i||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),i=!0),null}var t}let i=!1;const l={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function s(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error('Illegal storage API usage for storage key "'+e+'".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.')}return{get:t,set:t,del:t,listen:t}}(e);const n=a(null==t?void 0:t.persistence);return null===n?l:{get:()=>{try{return n.getItem(e)}catch(t){return console.error("Docusaurus storage error, can't get key="+e,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),o({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error("Docusaurus storage error, can't set "+e+"="+t,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),o({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error("Docusaurus storage error, can't delete key="+e,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error("Docusaurus storage error, can't listen for changes of key="+e,r),()=>{}}}}}},1616:(e,t,n)=>{"use strict";n.d(t,{D:()=>i});var r=n(8264),o=n(5592),a=n(5684);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:l}}=(0,r.c)(),{pathname:s}=(0,o.IT)(),c=(0,a.applyTrailingSlash)(s,{trailingSlash:n,baseUrl:e}),u=l===i?e:e.replace("/"+l+"/","/"),d=c.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return""+(r?t:"")+function(e){return e===i?""+u:""+u+e+"/"}(n)+d}}}},7124:(e,t,n)=>{"use strict";n.d(t,{c:()=>i});var r=n(1504),o=n(5592),a=n(1100);function i(e){const t=(0,o.IT)(),n=(0,a.i0)(t),i=(0,a.yA)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},1824:(e,t,n)=>{"use strict";n.d(t,{y:()=>o});var r=n(8264);function o(){return(0,r.c)().siteConfig.themeConfig}},1600:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[o]=e.split(/[#?]/),a="/"===o||o===r?o:(i=o,n?function(e){return e.endsWith("/")?e:e+"/"}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(o,a)}},4292:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},5684:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var o=n(1600);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(o).default}});var a=n(4292);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return a.getErrorCausalChain}})},8064:(e,t,n)=>{"use strict";n.d(t,{iU:()=>w,Yf:()=>C,gh:()=>f,Wi:()=>j,Ep:()=>p});var r=n(5072);function o(e){return"/"===e.charAt(0)}function a(e,t){for(var n=t,r=n+1,o=e.length;r<o;n+=1,r+=1)e[n]=e[r];e.pop()}const i=function(e,t){void 0===t&&(t="");var n,r=e&&e.split("/")||[],i=t&&t.split("/")||[],l=e&&o(e),s=t&&o(t),c=l||s;if(e&&o(e)?i=r:r.length&&(i.pop(),i=i.concat(r)),!i.length)return"/";if(i.length){var u=i[i.length-1];n="."===u||".."===u||""===u}else n=!1;for(var d=0,p=i.length;p>=0;p--){var f=i[p];"."===f?a(i,p):".."===f?(a(i,p),d++):d&&(a(i,p),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&o(i[0])||i.unshift("");var g=i.join("/");return n&&"/"!==g.substr(-1)&&(g+="/"),g};var l=n(4812);function s(e){return"/"===e.charAt(0)?e:"/"+e}function c(e){return"/"===e.charAt(0)?e.substr(1):e}function u(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,r=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(o+="#"===r.charAt(0)?r:"#"+r),o}function f(e,t,n,o){var a;"string"==typeof e?(a=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.substr(o),t=t.substr(0,o));var a=t.indexOf("?");return-1!==a&&(n=t.substr(a),t=t.substr(0,a)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),a.state=t):(void 0===(a=(0,r.c)({},e)).pathname&&(a.pathname=""),a.search?"?"!==a.search.charAt(0)&&(a.search="?"+a.search):a.search="",a.hash?"#"!==a.hash.charAt(0)&&(a.hash="#"+a.hash):a.hash="",void 0!==t&&void 0===a.state&&(a.state=t));try{a.pathname=decodeURI(a.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+a.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(a.key=n),o?a.pathname?"/"!==a.pathname.charAt(0)&&(a.pathname=i(a.pathname,o.pathname)):a.pathname=o.pathname:a.pathname||(a.pathname="/"),a}function g(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var a="function"==typeof e?e(t,n):e;"string"==typeof a?"function"==typeof r?r(a,o):o(!0):o(!1!==a)}else o(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];t.forEach((function(e){return e.apply(void 0,n)}))}}}var m=!("undefined"==typeof window||!window.document||!window.document.createElement);function h(e,t){t(window.confirm(e))}var b="popstate",y="hashchange";function v(){try{return window.history.state||{}}catch(e){return{}}}function w(e){void 0===e&&(e={}),m||(0,l.c)(!1);var t,n=window.history,o=(-1===(t=window.navigator.userAgent).indexOf("Android 2.")&&-1===t.indexOf("Android 4.0")||-1===t.indexOf("Mobile Safari")||-1!==t.indexOf("Chrome")||-1!==t.indexOf("Windows Phone"))&&window.history&&"pushState"in window.history,a=!(-1===window.navigator.userAgent.indexOf("Trident")),i=e,c=i.forceRefresh,w=void 0!==c&&c,k=i.getUserConfirmation,x=void 0===k?h:k,S=i.keyLength,E=void 0===S?6:S,_=e.basename?d(s(e.basename)):"";function C(e){var t=e||{},n=t.key,r=t.state,o=window.location,a=o.pathname+o.search+o.hash;return _&&(a=u(a,_)),f(a,r,n)}function T(){return Math.random().toString(36).substr(2,E)}var j=g();function A(e){(0,r.c)(U,e),U.length=n.length,j.notifyListeners(U.location,U.action)}function N(e){(function(e){return void 0===e.state&&-1===navigator.userAgent.indexOf("CriOS")})(e)||P(C(e.state))}function L(){P(C(v()))}var R=!1;function P(e){if(R)R=!1,A();else{j.confirmTransitionTo(e,"POP",x,(function(t){t?A({action:"POP",location:e}):function(e){var t=U.location,n=D.indexOf(t.key);-1===n&&(n=0);var r=D.indexOf(e.key);-1===r&&(r=0);var o=n-r;o&&(R=!0,M(o))}(e)}))}}var O=C(v()),D=[O.key];function I(e){return _+p(e)}function M(e){n.go(e)}var F=0;function z(e){1===(F+=e)&&1===e?(window.addEventListener(b,N),a&&window.addEventListener(y,L)):0===F&&(window.removeEventListener(b,N),a&&window.removeEventListener(y,L))}var B=!1;var U={length:n.length,action:"POP",location:O,createHref:I,push:function(e,t){var r="PUSH",a=f(e,t,T(),U.location);j.confirmTransitionTo(a,r,x,(function(e){if(e){var t=I(a),i=a.key,l=a.state;if(o)if(n.pushState({key:i,state:l},null,t),w)window.location.href=t;else{var s=D.indexOf(U.location.key),c=D.slice(0,s+1);c.push(a.key),D=c,A({action:r,location:a})}else window.location.href=t}}))},replace:function(e,t){var r="REPLACE",a=f(e,t,T(),U.location);j.confirmTransitionTo(a,r,x,(function(e){if(e){var t=I(a),i=a.key,l=a.state;if(o)if(n.replaceState({key:i,state:l},null,t),w)window.location.replace(t);else{var s=D.indexOf(U.location.key);-1!==s&&(D[s]=a.key),A({action:r,location:a})}else window.location.replace(t)}}))},go:M,goBack:function(){M(-1)},goForward:function(){M(1)},block:function(e){void 0===e&&(e=!1);var t=j.setPrompt(e);return B||(z(1),B=!0),function(){return B&&(B=!1,z(-1)),t()}},listen:function(e){var t=j.appendListener(e);return z(1),function(){z(-1),t()}}};return U}var k="hashchange",x={hashbang:{encodePath:function(e){return"!"===e.charAt(0)?e:"!/"+c(e)},decodePath:function(e){return"!"===e.charAt(0)?e.substr(1):e}},noslash:{encodePath:c,decodePath:s},slash:{encodePath:s,decodePath:s}};function S(e){var t=e.indexOf("#");return-1===t?e:e.slice(0,t)}function E(){var e=window.location.href,t=e.indexOf("#");return-1===t?"":e.substring(t+1)}function _(e){window.location.replace(S(window.location.href)+"#"+e)}function C(e){void 0===e&&(e={}),m||(0,l.c)(!1);var t=window.history,n=(window.navigator.userAgent.indexOf("Firefox"),e),o=n.getUserConfirmation,a=void 0===o?h:o,i=n.hashType,c=void 0===i?"slash":i,b=e.basename?d(s(e.basename)):"",y=x[c],v=y.encodePath,w=y.decodePath;function C(){var e=w(E());return b&&(e=u(e,b)),f(e)}var T=g();function j(e){(0,r.c)(B,e),B.length=t.length,T.notifyListeners(B.location,B.action)}var A=!1,N=null;function L(){var e,t,n=E(),r=v(n);if(n!==r)_(r);else{var o=C(),i=B.location;if(!A&&(t=o,(e=i).pathname===t.pathname&&e.search===t.search&&e.hash===t.hash))return;if(N===p(o))return;N=null,function(e){if(A)A=!1,j();else{var t="POP";T.confirmTransitionTo(e,t,a,(function(n){n?j({action:t,location:e}):function(e){var t=B.location,n=D.lastIndexOf(p(t));-1===n&&(n=0);var r=D.lastIndexOf(p(e));-1===r&&(r=0);var o=n-r;o&&(A=!0,I(o))}(e)}))}}(o)}}var R=E(),P=v(R);R!==P&&_(P);var O=C(),D=[p(O)];function I(e){t.go(e)}var M=0;function F(e){1===(M+=e)&&1===e?window.addEventListener(k,L):0===M&&window.removeEventListener(k,L)}var z=!1;var B={length:t.length,action:"POP",location:O,createHref:function(e){var t=document.querySelector("base"),n="";return t&&t.getAttribute("href")&&(n=S(window.location.href)),n+"#"+v(b+p(e))},push:function(e,t){var n="PUSH",r=f(e,void 0,void 0,B.location);T.confirmTransitionTo(r,n,a,(function(e){if(e){var t=p(r),o=v(b+t);if(E()!==o){N=t,function(e){window.location.hash=e}(o);var a=D.lastIndexOf(p(B.location)),i=D.slice(0,a+1);i.push(t),D=i,j({action:n,location:r})}else j()}}))},replace:function(e,t){var n="REPLACE",r=f(e,void 0,void 0,B.location);T.confirmTransitionTo(r,n,a,(function(e){if(e){var t=p(r),o=v(b+t);E()!==o&&(N=t,_(o));var a=D.indexOf(p(B.location));-1!==a&&(D[a]=t),j({action:n,location:r})}}))},go:I,goBack:function(){I(-1)},goForward:function(){I(1)},block:function(e){void 0===e&&(e=!1);var t=T.setPrompt(e);return z||(F(1),z=!0),function(){return z&&(z=!1,F(-1)),t()}},listen:function(e){var t=T.appendListener(e);return F(1),function(){F(-1),t()}}};return B}function T(e,t,n){return Math.min(Math.max(e,t),n)}function j(e){void 0===e&&(e={});var t=e,n=t.getUserConfirmation,o=t.initialEntries,a=void 0===o?["/"]:o,i=t.initialIndex,l=void 0===i?0:i,s=t.keyLength,c=void 0===s?6:s,u=g();function d(e){(0,r.c)(w,e),w.length=w.entries.length,u.notifyListeners(w.location,w.action)}function m(){return Math.random().toString(36).substr(2,c)}var h=T(l,0,a.length-1),b=a.map((function(e){return f(e,void 0,"string"==typeof e?m():e.key||m())})),y=p;function v(e){var t=T(w.index+e,0,w.entries.length-1),r=w.entries[t];u.confirmTransitionTo(r,"POP",n,(function(e){e?d({action:"POP",location:r,index:t}):d()}))}var w={length:b.length,action:"POP",location:b[h],index:h,entries:b,createHref:y,push:function(e,t){var r="PUSH",o=f(e,t,m(),w.location);u.confirmTransitionTo(o,r,n,(function(e){if(e){var t=w.index+1,n=w.entries.slice(0);n.length>t?n.splice(t,n.length-t,o):n.push(o),d({action:r,location:o,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",o=f(e,t,m(),w.location);u.confirmTransitionTo(o,r,n,(function(e){e&&(w.entries[w.index]=o,d({action:r,location:o}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=w.index+e;return t>=0&&t<w.entries.length},block:function(e){return void 0===e&&(e=!1),u.setPrompt(e)},listen:function(e){return u.appendListener(e)}};return w}},4792:(e,t,n)=>{"use strict";var r=n(2168),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||o}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,g=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(g){var o=f(n);o&&o!==g&&e(t,o,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var l=s(t),m=s(n),h=0;h<i.length;++h){var b=i[h];if(!(a[b]||r&&r[b]||m&&m[b]||l&&l[b])){var y=p(n,b);try{c(t,b,y)}catch(v){}}}}return t}},9328:e=>{"use strict";e.exports=function(e,t,n,r,o,a,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,o,a,i,l],u=0;(s=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},9600:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},1462:(e,t,n)=>{"use strict";n.r(t)},1496:(e,t,n)=>{"use strict";n.r(t)},2272:function(e,t,n){var r,o;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'<div class="bar" role="bar"><div class="peg"></div></div><div class="spinner" role="spinner"><div class="spinner-icon"></div></div>'};function o(e,t,n){return e<t?t:e>n?n:e}function a(e){return 100*(-1+e)}function i(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+a(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+a(e)+"%,0)"}:{"margin-left":a(e)+"%"}).transition="all "+t+"ms "+n,o}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=o(e,r.minimum,1),n.status=1===e?null:e;var a=n.render(!t),c=a.querySelector(r.barSelector),u=r.speed,d=r.easing;return a.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(c,i(e,u,d)),1===e?(s(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout((function(){s(a,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,i=t.querySelector(r.barSelector),l=e?"-100":a(n.status||0),c=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&f(o),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,o=e.length,a=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+a)in n)return r;return t}function o(e){return e=n(e),t[e]||(t[e]=r(e))}function a(e,t,n){t=o(t),e.style[t]=n}return function(e,t){var n,r,o=arguments;if(2==o.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&a(e,n,r);else a(e,o[1],o[2])}}();function c(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=p(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(o="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=o)},6872:(e,t,n)=>{var r=n(9600);e.exports=f,e.exports.parse=a,e.exports.compile=function(e,t){return l(a(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=p;var o=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function a(e,t){for(var n,r=[],a=0,i=0,l="",u=t&&t.delimiter||"/";null!=(n=o.exec(e));){var d=n[0],p=n[1],f=n.index;if(l+=e.slice(i,f),i=f+d.length,p)l+=p[1];else{var g=e[i],m=n[2],h=n[3],b=n[4],y=n[5],v=n[6],w=n[7];l&&(r.push(l),l="");var k=null!=m&&null!=g&&g!==m,x="+"===v||"*"===v,S="?"===v||"*"===v,E=n[2]||u,_=b||y;r.push({name:h||a++,prefix:m||"",delimiter:E,optional:S,repeat:x,partial:k,asterisk:!!w,pattern:_?c(_):w?".*":"[^"+s(E)+"]+?"})}}return i<e.length&&(l+=e.substr(i)),l&&r.push(l),r}function i(e){return encodeURI(e).replace(/[\/?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}function l(e,t){for(var n=new Array(e.length),o=0;o<e.length;o++)"object"==typeof e[o]&&(n[o]=new RegExp("^(?:"+e[o].pattern+")$",d(t)));return function(t,o){for(var a="",l=t||{},s=(o||{}).pretty?i:encodeURIComponent,c=0;c<e.length;c++){var u=e[c];if("string"!=typeof u){var d,p=l[u.name];if(null==p){if(u.optional){u.partial&&(a+=u.prefix);continue}throw new TypeError('Expected "'+u.name+'" to be defined')}if(r(p)){if(!u.repeat)throw new TypeError('Expected "'+u.name+'" to not repeat, but received `'+JSON.stringify(p)+"`");if(0===p.length){if(u.optional)continue;throw new TypeError('Expected "'+u.name+'" to not be empty')}for(var f=0;f<p.length;f++){if(d=s(p[f]),!n[c].test(d))throw new TypeError('Expected all "'+u.name+'" to match "'+u.pattern+'", but received `'+JSON.stringify(d)+"`");a+=(0===f?u.prefix:u.delimiter)+d}}else{if(d=u.asterisk?encodeURI(p).replace(/[?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})):s(p),!n[c].test(d))throw new TypeError('Expected "'+u.name+'" to match "'+u.pattern+'", but received "'+d+'"');a+=u.prefix+d}}else a+=u}return a}}function s(e){return e.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}function c(e){return e.replace(/([=!:$\/()])/g,"\\$1")}function u(e,t){return e.keys=t,e}function d(e){return e&&e.sensitive?"":"i"}function p(e,t,n){r(t)||(n=t||n,t=[]);for(var o=(n=n||{}).strict,a=!1!==n.end,i="",l=0;l<e.length;l++){var c=e[l];if("string"==typeof c)i+=s(c);else{var p=s(c.prefix),f="(?:"+c.pattern+")";t.push(c),c.repeat&&(f+="(?:"+p+f+")*"),i+=f=c.optional?c.partial?p+"("+f+")?":"(?:"+p+"("+f+"))?":p+"("+f+")"}}var g=s(n.delimiter||"/"),m=i.slice(-g.length)===g;return o||(i=(m?i.slice(0,-g.length):i)+"(?:"+g+"(?=$))?"),i+=a?"$":o&&m?"":"(?="+g+"|$)",u(new RegExp("^"+i,d(n)),t)}function f(e,t,n){return r(t)||(n=t||n,t=[]),n=n||{},e instanceof RegExp?function(e,t){var n=e.source.match(/\((?!\?)/g);if(n)for(var r=0;r<n.length;r++)t.push({name:r,prefix:null,delimiter:null,optional:!1,repeat:!1,partial:!1,asterisk:!1,pattern:null});return u(e,t)}(e,t):r(e)?function(e,t,n){for(var r=[],o=0;o<e.length;o++)r.push(f(e[o],t,n).source);return u(new RegExp("(?:"+r.join("|")+")",d(n)),t)}(e,t,n):function(e,t,n){return p(a(e,n),t,n)}(e,t,n)}},7248:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to <a href="https://webplatform.github.io/docs/">WebPlatform.org documentation</a>. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (<code>.comment</code> can become <code>.namespace--comment</code>) or replace them with your defined ones (like <code>.editor__comment</code>). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the <code>highlightAll</code> and <code>highlightAllUnder</code> methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},452:(e,t,n)=>{const r=n(7248),o=n(8284),a=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...a,...Object.keys(Prism.languages)];o(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(1976).resolve(t)],delete Prism.languages[e],n(1976)(t),a.add(e)}))}i.silent=!1,e.exports=i},1808:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,o,a){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(o,(function(e){if("function"==typeof a&&!a(e))return e;for(var o,l=i.length;-1!==n.code.indexOf(o=t(r,l));)++l;return i[l]=e,o})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var o=0,a=Object.keys(n.tokenStack);!function i(l){for(var s=0;s<l.length&&!(o>=a.length);s++){var c=l[s];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=a[o],d=n.tokenStack[u],p="string"==typeof c?c:c.content,f=t(r,u),g=p.indexOf(f);if(g>-1){++o;var m=p.substring(0,g),h=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(g+f.length),y=[];m&&y.push.apply(y,i([m])),y.push(h),b&&y.push.apply(y,i([b])),"string"==typeof c?l.splice.apply(l,[s,1].concat(y)):c.content=y}}else c.content&&i(c.content)}return l}(n.tokens)}}}})}(Prism)},8660:(e,t,n)=>{var r={"./":452};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=8660},1976:(e,t,n)=>{var r={"./":452};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=1976},8284:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n<r;n++)t[e[n]]=!0;return t}function r(e){var n={},r=[];function o(r,a){if(!(r in n)){a.push(r);var i=a.indexOf(r);if(i<a.length-1)throw new Error("Circular dependency: "+a.slice(i).join(" -> "));var l={},s=e[r];if(s){function c(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in l))for(var i in o(t,a),l[t]=!0,n[t])l[i]=!0}t(s.require,c),t(s.optional,c),t(s.modify,c)}n[r]=l,a.pop()}}return function(e){var t=n[e];return t||(o(e,r),t=n[e]),t}}function o(e){for(var t in e)return!0;return!1}return function(a,i,l){var s=function(e){var t={};for(var n in e){var r=e[n];for(var o in r)if("meta"!=o){var a=r[o];t[o]="string"==typeof a?{title:a}:a}}return t}(a),c=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var o in n={},e){var a=e[o];t(a&&a.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+o+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+o+" because it is a component.");n[t]=o}))}return n[r]||r}}(s);i=i.map(c),l=(l||[]).map(c);var u=n(i),d=n(l);i.forEach((function e(n){var r=s[n];t(r&&r.require,(function(t){t in d||(u[t]=!0,e(t))}))}));for(var p,f=r(s),g=u;o(g);){for(var m in p={},g){var h=s[m];t(h&&h.modify,(function(e){e in d&&(p[e]=!0)}))}for(var b in d)if(!(b in u))for(var y in f(b))if(y in u){p[b]=!0;break}for(var v in g=p)u[v]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,o){var a=o?o.series:void 0,i=o?o.parallel:e,l={},s={};function c(e){if(e in l)return l[e];s[e]=!0;var o,u=[];for(var d in t(e))d in n&&u.push(d);if(0===u.length)o=r(e);else{var p=i(u.map((function(e){var t=c(e);return delete s[e],t})));a?o=a(p,(function(){return r(e)})):r(e)}return l[e]=o}for(var u in n)c(u);var d=[];for(var p in s)d.push(l[p]);return i(d)}(f,u,t,n)}};return w}}();e.exports=t},9776:(e,t,n)=>{"use strict";var r=n(9143);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,i){if(i!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},3268:(e,t,n)=>{e.exports=n(9776)()},9143:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},9516:(e,t,n)=>{"use strict";var r=n(1504),o=n(4712);function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var i=new Set,l={};function s(e,t){c(e,t),c(e+"Capture",t)}function c(e,t){for(l[e]=t,e=0;e<t.length;e++)i.add(t[e])}var u=!("undefined"==typeof window||void 0===window.document||void 0===window.document.createElement),d=Object.prototype.hasOwnProperty,p=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,f={},g={};function m(e,t,n,r,o,a,i){this.acceptsBooleans=2===t||3===t||4===t,this.attributeName=r,this.attributeNamespace=o,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=a,this.removeEmptyString=i}var h={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach((function(e){h[e]=new m(e,0,!1,e,null,!1,!1)})),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach((function(e){var t=e[0];h[t]=new m(t,1,!1,e[1],null,!1,!1)})),["contentEditable","draggable","spellCheck","value"].forEach((function(e){h[e]=new m(e,2,!1,e.toLowerCase(),null,!1,!1)})),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach((function(e){h[e]=new m(e,2,!1,e,null,!1,!1)})),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach((function(e){h[e]=new m(e,3,!1,e.toLowerCase(),null,!1,!1)})),["checked","multiple","muted","selected"].forEach((function(e){h[e]=new m(e,3,!0,e,null,!1,!1)})),["capture","download"].forEach((function(e){h[e]=new m(e,4,!1,e,null,!1,!1)})),["cols","rows","size","span"].forEach((function(e){h[e]=new m(e,6,!1,e,null,!1,!1)})),["rowSpan","start"].forEach((function(e){h[e]=new m(e,5,!1,e.toLowerCase(),null,!1,!1)}));var b=/[\-:]([a-z])/g;function y(e){return e[1].toUpperCase()}function v(e,t,n,r){var o=h.hasOwnProperty(t)?h[t]:null;(null!==o?0!==o.type:r||!(2<t.length)||"o"!==t[0]&&"O"!==t[0]||"n"!==t[1]&&"N"!==t[1])&&(function(e,t,n,r){if(null==t||function(e,t,n,r){if(null!==n&&0===n.type)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return!r&&(null!==n?!n.acceptsBooleans:"data-"!==(e=e.toLowerCase().slice(0,5))&&"aria-"!==e);default:return!1}}(e,t,n,r))return!0;if(r)return!1;if(null!==n)switch(n.type){case 3:return!t;case 4:return!1===t;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}(t,n,o,r)&&(n=null),r||null===o?function(e){return!!d.call(g,e)||!d.call(f,e)&&(p.test(e)?g[e]=!0:(f[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n)):o.mustUseProperty?e[o.propertyName]=null===n?3!==o.type&&"":n:(t=o.attributeName,r=o.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(o=o.type)||4===o&&!0===n?"":""+n,r?e.setAttributeNS(r,t,n):e.setAttribute(t,n))))}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach((function(e){var t=e.replace(b,y);h[t]=new m(t,1,!1,e,null,!1,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(b,y);h[t]=new m(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(b,y);h[t]=new m(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){h[e]=new m(e,1,!1,e.toLowerCase(),null,!1,!1)})),h.xlinkHref=new m("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){h[e]=new m(e,1,!1,e.toLowerCase(),null,!0,!0)}));var w=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,k=Symbol.for("react.element"),x=Symbol.for("react.portal"),S=Symbol.for("react.fragment"),E=Symbol.for("react.strict_mode"),_=Symbol.for("react.profiler"),C=Symbol.for("react.provider"),T=Symbol.for("react.context"),j=Symbol.for("react.forward_ref"),A=Symbol.for("react.suspense"),N=Symbol.for("react.suspense_list"),L=Symbol.for("react.memo"),R=Symbol.for("react.lazy");Symbol.for("react.scope"),Symbol.for("react.debug_trace_mode");var P=Symbol.for("react.offscreen");Symbol.for("react.legacy_hidden"),Symbol.for("react.cache"),Symbol.for("react.tracing_marker");var O=Symbol.iterator;function D(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=O&&e[O]||e["@@iterator"])?e:null}var I,M=Object.assign;function F(e){if(void 0===I)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);I=t&&t[1]||""}return"\n"+I+e}var z=!1;function B(e,t){if(!e||z)return"";z=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(t,[])}catch(c){var r=c}Reflect.construct(e,[],t)}else{try{t.call()}catch(c){r=c}e.call(t.prototype)}else{try{throw Error()}catch(c){r=c}e()}}catch(c){if(c&&r&&"string"==typeof c.stack){for(var o=c.stack.split("\n"),a=r.stack.split("\n"),i=o.length-1,l=a.length-1;1<=i&&0<=l&&o[i]!==a[l];)l--;for(;1<=i&&0<=l;i--,l--)if(o[i]!==a[l]){if(1!==i||1!==l)do{if(i--,0>--l||o[i]!==a[l]){var s="\n"+o[i].replace(" at new "," at ");return e.displayName&&s.includes("<anonymous>")&&(s=s.replace("<anonymous>",e.displayName)),s}}while(1<=i&&0<=l);break}}}finally{z=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?F(e):""}function U(e){switch(e.tag){case 5:return F(e.type);case 16:return F("Lazy");case 13:return F("Suspense");case 19:return F("SuspenseList");case 0:case 2:case 15:return e=B(e.type,!1);case 11:return e=B(e.type.render,!1);case 1:return e=B(e.type,!0);default:return""}}function $(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case S:return"Fragment";case x:return"Portal";case _:return"Profiler";case E:return"StrictMode";case A:return"Suspense";case N:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case T:return(e.displayName||"Context")+".Consumer";case C:return(e._context.displayName||"Context")+".Provider";case j:var t=e.render;return(e=e.displayName)||(e=""!==(e=t.displayName||t.name||"")?"ForwardRef("+e+")":"ForwardRef"),e;case L:return null!==(t=e.displayName||null)?t:$(e.type)||"Memo";case R:t=e._payload,e=e._init;try{return $(e(t))}catch(n){}}return null}function q(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=(e=t.render).displayName||e.name||"",t.displayName||(""!==e?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return $(t);case 8:return t===E?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if("function"==typeof t)return t.displayName||t.name||null;if("string"==typeof t)return t}return null}function H(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":case"object":return e;default:return""}}function G(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function V(e){e._valueTracker||(e._valueTracker=function(e){var t=G(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var o=n.get,a=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return o.call(this)},set:function(e){r=""+e,a.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function W(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=G(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function Q(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function Y(e,t){var n=t.checked;return M({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function K(e,t){var n=null==t.defaultValue?"":t.defaultValue,r=null!=t.checked?t.checked:t.defaultChecked;n=H(null!=t.value?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}}function X(e,t){null!=(t=t.checked)&&v(e,"checked",t,!1)}function Z(e,t){X(e,t);var n=H(t.value),r=t.type;if(null!=n)"number"===r?(0===n&&""===e.value||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if("submit"===r||"reset"===r)return void e.removeAttribute("value");t.hasOwnProperty("value")?ee(e,t.type,n):t.hasOwnProperty("defaultValue")&&ee(e,t.type,H(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function J(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!("submit"!==r&&"reset"!==r||void 0!==t.value&&null!==t.value))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}""!==(n=e.name)&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,""!==n&&(e.name=n)}function ee(e,t,n){"number"===t&&Q(e.ownerDocument)===e||(null==n?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var te=Array.isArray;function ne(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o<n.length;o++)t["$"+n[o]]=!0;for(n=0;n<e.length;n++)o=t.hasOwnProperty("$"+e[n].value),e[n].selected!==o&&(e[n].selected=o),o&&r&&(e[n].defaultSelected=!0)}else{for(n=""+H(n),t=null,o=0;o<e.length;o++){if(e[o].value===n)return e[o].selected=!0,void(r&&(e[o].defaultSelected=!0));null!==t||e[o].disabled||(t=e[o])}null!==t&&(t.selected=!0)}}function re(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(a(91));return M({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function oe(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultValue,null!=n){if(null!=t)throw Error(a(92));if(te(n)){if(1<n.length)throw Error(a(93));n=n[0]}t=n}null==t&&(t=""),n=t}e._wrapperState={initialValue:H(n)}}function ae(e,t){var n=H(t.value),r=H(t.defaultValue);null!=n&&((n=""+n)!==e.value&&(e.value=n),null==t.defaultValue&&e.defaultValue!==n&&(e.defaultValue=n)),null!=r&&(e.defaultValue=""+r)}function ie(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!==t&&null!==t&&(e.value=t)}function le(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function se(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?le(t):"http://www.w3.org/2000/svg"===e&&"foreignObject"===t?"http://www.w3.org/1999/xhtml":e}var ce,ue,de=(ue=function(e,t){if("http://www.w3.org/2000/svg"!==e.namespaceURI||"innerHTML"in e)e.innerHTML=t;else{for((ce=ce||document.createElement("div")).innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=ce.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}},"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,t,n,r){MSApp.execUnsafeLocalFunction((function(){return ue(e,t)}))}:ue);function pe(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var fe={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},ge=["Webkit","ms","Moz","O"];function me(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"number"!=typeof t||0===t||fe.hasOwnProperty(e)&&fe[e]?(""+t).trim():t+"px"}function he(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),o=me(n,t[n],r);"float"===n&&(n="cssFloat"),r?e.setProperty(n,o):e[n]=o}}Object.keys(fe).forEach((function(e){ge.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),fe[t]=fe[e]}))}));var be=M({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function ye(e,t){if(t){if(be[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(a(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(a(60));if("object"!=typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(a(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(a(62))}}function ve(e,t){if(-1===e.indexOf("-"))return"string"==typeof t.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var we=null;function ke(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var xe=null,Se=null,Ee=null;function _e(e){if(e=wo(e)){if("function"!=typeof xe)throw Error(a(280));var t=e.stateNode;t&&(t=xo(t),xe(e.stateNode,e.type,t))}}function Ce(e){Se?Ee?Ee.push(e):Ee=[e]:Se=e}function Te(){if(Se){var e=Se,t=Ee;if(Ee=Se=null,_e(e),t)for(e=0;e<t.length;e++)_e(t[e])}}function je(e,t){return e(t)}function Ae(){}var Ne=!1;function Le(e,t,n){if(Ne)return e(t,n);Ne=!0;try{return je(e,t,n)}finally{Ne=!1,(null!==Se||null!==Ee)&&(Ae(),Te())}}function Re(e,t){var n=e.stateNode;if(null===n)return null;var r=xo(n);if(null===r)return null;n=r[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(r=!r.disabled)||(r=!("button"===(e=e.type)||"input"===e||"select"===e||"textarea"===e)),e=!r;break e;default:e=!1}if(e)return null;if(n&&"function"!=typeof n)throw Error(a(231,t,typeof n));return n}var Pe=!1;if(u)try{var Oe={};Object.defineProperty(Oe,"passive",{get:function(){Pe=!0}}),window.addEventListener("test",Oe,Oe),window.removeEventListener("test",Oe,Oe)}catch(ue){Pe=!1}function De(e,t,n,r,o,a,i,l,s){var c=Array.prototype.slice.call(arguments,3);try{t.apply(n,c)}catch(u){this.onError(u)}}var Ie=!1,Me=null,Fe=!1,ze=null,Be={onError:function(e){Ie=!0,Me=e}};function Ue(e,t,n,r,o,a,i,l,s){Ie=!1,Me=null,De.apply(Be,arguments)}function $e(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do{0!=(4098&(t=e).flags)&&(n=t.return),e=t.return}while(e)}return 3===t.tag?n:null}function qe(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&(null!==(e=e.alternate)&&(t=e.memoizedState)),null!==t)return t.dehydrated}return null}function He(e){if($e(e)!==e)throw Error(a(188))}function Ge(e){return null!==(e=function(e){var t=e.alternate;if(!t){if(null===(t=$e(e)))throw Error(a(188));return t!==e?null:e}for(var n=e,r=t;;){var o=n.return;if(null===o)break;var i=o.alternate;if(null===i){if(null!==(r=o.return)){n=r;continue}break}if(o.child===i.child){for(i=o.child;i;){if(i===n)return He(o),e;if(i===r)return He(o),t;i=i.sibling}throw Error(a(188))}if(n.return!==r.return)n=o,r=i;else{for(var l=!1,s=o.child;s;){if(s===n){l=!0,n=o,r=i;break}if(s===r){l=!0,r=o,n=i;break}s=s.sibling}if(!l){for(s=i.child;s;){if(s===n){l=!0,n=i,r=o;break}if(s===r){l=!0,r=i,n=o;break}s=s.sibling}if(!l)throw Error(a(189))}}if(n.alternate!==r)throw Error(a(190))}if(3!==n.tag)throw Error(a(188));return n.stateNode.current===n?e:t}(e))?Ve(e):null}function Ve(e){if(5===e.tag||6===e.tag)return e;for(e=e.child;null!==e;){var t=Ve(e);if(null!==t)return t;e=e.sibling}return null}var We=o.unstable_scheduleCallback,Qe=o.unstable_cancelCallback,Ye=o.unstable_shouldYield,Ke=o.unstable_requestPaint,Xe=o.unstable_now,Ze=o.unstable_getCurrentPriorityLevel,Je=o.unstable_ImmediatePriority,et=o.unstable_UserBlockingPriority,tt=o.unstable_NormalPriority,nt=o.unstable_LowPriority,rt=o.unstable_IdlePriority,ot=null,at=null;var it=Math.clz32?Math.clz32:function(e){return e>>>=0,0===e?32:31-(lt(e)/st|0)|0},lt=Math.log,st=Math.LN2;var ct=64,ut=4194304;function dt(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return 4194240&e;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return 130023424&e;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function pt(e,t){var n=e.pendingLanes;if(0===n)return 0;var r=0,o=e.suspendedLanes,a=e.pingedLanes,i=268435455&n;if(0!==i){var l=i&~o;0!==l?r=dt(l):0!==(a&=i)&&(r=dt(a))}else 0!==(i=n&~o)?r=dt(i):0!==a&&(r=dt(a));if(0===r)return 0;if(0!==t&&t!==r&&0==(t&o)&&((o=r&-r)>=(a=t&-t)||16===o&&0!=(4194240&a)))return t;if(0!=(4&r)&&(r|=16&n),0!==(t=e.entangledLanes))for(e=e.entanglements,t&=r;0<t;)o=1<<(n=31-it(t)),r|=e[n],t&=~o;return r}function ft(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;default:return-1}}function gt(e){return 0!==(e=-1073741825&e.pendingLanes)?e:1073741824&e?1073741824:0}function mt(){var e=ct;return 0==(4194240&(ct<<=1))&&(ct=64),e}function ht(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function bt(e,t,n){e.pendingLanes|=t,536870912!==t&&(e.suspendedLanes=0,e.pingedLanes=0),(e=e.eventTimes)[t=31-it(t)]=n}function yt(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var r=31-it(n),o=1<<r;o&t|e[r]&t&&(e[r]|=t),n&=~o}}var vt=0;function wt(e){return 1<(e&=-e)?4<e?0!=(268435455&e)?16:536870912:4:1}var kt,xt,St,Et,_t,Ct=!1,Tt=[],jt=null,At=null,Nt=null,Lt=new Map,Rt=new Map,Pt=[],Ot="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function Dt(e,t){switch(e){case"focusin":case"focusout":jt=null;break;case"dragenter":case"dragleave":At=null;break;case"mouseover":case"mouseout":Nt=null;break;case"pointerover":case"pointerout":Lt.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":Rt.delete(t.pointerId)}}function It(e,t,n,r,o,a){return null===e||e.nativeEvent!==a?(e={blockedOn:t,domEventName:n,eventSystemFlags:r,nativeEvent:a,targetContainers:[o]},null!==t&&(null!==(t=wo(t))&&xt(t)),e):(e.eventSystemFlags|=r,t=e.targetContainers,null!==o&&-1===t.indexOf(o)&&t.push(o),e)}function Mt(e){var t=vo(e.target);if(null!==t){var n=$e(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=qe(n)))return e.blockedOn=t,void _t(e.priority,(function(){St(n)}))}else if(3===t&&n.stateNode.current.memoizedState.isDehydrated)return void(e.blockedOn=3===n.tag?n.stateNode.containerInfo:null)}e.blockedOn=null}function Ft(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContainers;0<t.length;){var n=Yt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n)return null!==(t=wo(n))&&xt(t),e.blockedOn=n,!1;var r=new(n=e.nativeEvent).constructor(n.type,n);we=r,n.target.dispatchEvent(r),we=null,t.shift()}return!0}function zt(e,t,n){Ft(e)&&n.delete(t)}function Bt(){Ct=!1,null!==jt&&Ft(jt)&&(jt=null),null!==At&&Ft(At)&&(At=null),null!==Nt&&Ft(Nt)&&(Nt=null),Lt.forEach(zt),Rt.forEach(zt)}function Ut(e,t){e.blockedOn===t&&(e.blockedOn=null,Ct||(Ct=!0,o.unstable_scheduleCallback(o.unstable_NormalPriority,Bt)))}function $t(e){function t(t){return Ut(t,e)}if(0<Tt.length){Ut(Tt[0],e);for(var n=1;n<Tt.length;n++){var r=Tt[n];r.blockedOn===e&&(r.blockedOn=null)}}for(null!==jt&&Ut(jt,e),null!==At&&Ut(At,e),null!==Nt&&Ut(Nt,e),Lt.forEach(t),Rt.forEach(t),n=0;n<Pt.length;n++)(r=Pt[n]).blockedOn===e&&(r.blockedOn=null);for(;0<Pt.length&&null===(n=Pt[0]).blockedOn;)Mt(n),null===n.blockedOn&&Pt.shift()}var qt=w.ReactCurrentBatchConfig,Ht=!0;function Gt(e,t,n,r){var o=vt,a=qt.transition;qt.transition=null;try{vt=1,Wt(e,t,n,r)}finally{vt=o,qt.transition=a}}function Vt(e,t,n,r){var o=vt,a=qt.transition;qt.transition=null;try{vt=4,Wt(e,t,n,r)}finally{vt=o,qt.transition=a}}function Wt(e,t,n,r){if(Ht){var o=Yt(e,t,n,r);if(null===o)Hr(e,t,r,Qt,n),Dt(e,r);else if(function(e,t,n,r,o){switch(t){case"focusin":return jt=It(jt,e,t,n,r,o),!0;case"dragenter":return At=It(At,e,t,n,r,o),!0;case"mouseover":return Nt=It(Nt,e,t,n,r,o),!0;case"pointerover":var a=o.pointerId;return Lt.set(a,It(Lt.get(a)||null,e,t,n,r,o)),!0;case"gotpointercapture":return a=o.pointerId,Rt.set(a,It(Rt.get(a)||null,e,t,n,r,o)),!0}return!1}(o,e,t,n,r))r.stopPropagation();else if(Dt(e,r),4&t&&-1<Ot.indexOf(e)){for(;null!==o;){var a=wo(o);if(null!==a&&kt(a),null===(a=Yt(e,t,n,r))&&Hr(e,t,r,Qt,n),a===o)break;o=a}null!==o&&r.stopPropagation()}else Hr(e,t,r,null,n)}}var Qt=null;function Yt(e,t,n,r){if(Qt=null,null!==(e=vo(e=ke(r))))if(null===(t=$e(e)))e=null;else if(13===(n=t.tag)){if(null!==(e=qe(t)))return e;e=null}else if(3===n){if(t.stateNode.current.memoizedState.isDehydrated)return 3===t.tag?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null);return Qt=e,null}function Kt(e){switch(e){case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 1;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"toggle":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 4;case"message":switch(Ze()){case Je:return 1;case et:return 4;case tt:case nt:return 16;case rt:return 536870912;default:return 16}default:return 16}}var Xt=null,Zt=null,Jt=null;function en(){if(Jt)return Jt;var e,t,n=Zt,r=n.length,o="value"in Xt?Xt.value:Xt.textContent,a=o.length;for(e=0;e<r&&n[e]===o[e];e++);var i=r-e;for(t=1;t<=i&&n[r-t]===o[a-t];t++);return Jt=o.slice(e,1<t?1-t:void 0)}function tn(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,10===e&&(e=13),32<=e||13===e?e:0}function nn(){return!0}function rn(){return!1}function on(e){function t(t,n,r,o,a){for(var i in this._reactName=t,this._targetInst=r,this.type=n,this.nativeEvent=o,this.target=a,this.currentTarget=null,e)e.hasOwnProperty(i)&&(t=e[i],this[i]=t?t(o):o[i]);return this.isDefaultPrevented=(null!=o.defaultPrevented?o.defaultPrevented:!1===o.returnValue)?nn:rn,this.isPropagationStopped=rn,this}return M(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=nn)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=nn)},persist:function(){},isPersistent:nn}),t}var an,ln,sn,cn={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},un=on(cn),dn=M({},cn,{view:0,detail:0}),pn=on(dn),fn=M({},dn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:_n,button:0,buttons:0,relatedTarget:function(e){return void 0===e.relatedTarget?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==sn&&(sn&&"mousemove"===e.type?(an=e.screenX-sn.screenX,ln=e.screenY-sn.screenY):ln=an=0,sn=e),an)},movementY:function(e){return"movementY"in e?e.movementY:ln}}),gn=on(fn),mn=on(M({},fn,{dataTransfer:0})),hn=on(M({},dn,{relatedTarget:0})),bn=on(M({},cn,{animationName:0,elapsedTime:0,pseudoElement:0})),yn=M({},cn,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),vn=on(yn),wn=on(M({},cn,{data:0})),kn={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},xn={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},Sn={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function En(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=Sn[e])&&!!t[e]}function _n(){return En}var Cn=M({},dn,{key:function(e){if(e.key){var t=kn[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?13===(e=tn(e))?"Enter":String.fromCharCode(e):"keydown"===e.type||"keyup"===e.type?xn[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:_n,charCode:function(e){return"keypress"===e.type?tn(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?tn(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}}),Tn=on(Cn),jn=on(M({},fn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),An=on(M({},dn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:_n})),Nn=on(M({},cn,{propertyName:0,elapsedTime:0,pseudoElement:0})),Ln=M({},fn,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),Rn=on(Ln),Pn=[9,13,27,32],On=u&&"CompositionEvent"in window,Dn=null;u&&"documentMode"in document&&(Dn=document.documentMode);var In=u&&"TextEvent"in window&&!Dn,Mn=u&&(!On||Dn&&8<Dn&&11>=Dn),Fn=String.fromCharCode(32),zn=!1;function Bn(e,t){switch(e){case"keyup":return-1!==Pn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Un(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var $n=!1;var qn={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Hn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!qn[e.type]:"textarea"===t}function Gn(e,t,n,r){Ce(r),0<(t=Vr(t,"onChange")).length&&(n=new un("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Vn=null,Wn=null;function Qn(e){Fr(e,0)}function Yn(e){if(W(ko(e)))return e}function Kn(e,t){if("change"===e)return t}var Xn=!1;if(u){var Zn;if(u){var Jn="oninput"in document;if(!Jn){var er=document.createElement("div");er.setAttribute("oninput","return;"),Jn="function"==typeof er.oninput}Zn=Jn}else Zn=!1;Xn=Zn&&(!document.documentMode||9<document.documentMode)}function tr(){Vn&&(Vn.detachEvent("onpropertychange",nr),Wn=Vn=null)}function nr(e){if("value"===e.propertyName&&Yn(Wn)){var t=[];Gn(t,Wn,e,ke(e)),Le(Qn,t)}}function rr(e,t,n){"focusin"===e?(tr(),Wn=n,(Vn=t).attachEvent("onpropertychange",nr)):"focusout"===e&&tr()}function or(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return Yn(Wn)}function ar(e,t){if("click"===e)return Yn(t)}function ir(e,t){if("input"===e||"change"===e)return Yn(t)}var lr="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t};function sr(e,t){if(lr(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++){var o=n[r];if(!d.call(t,o)||!lr(e[o],t[o]))return!1}return!0}function cr(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function ur(e,t){var n,r=cr(e);for(e=0;r;){if(3===r.nodeType){if(n=e+r.textContent.length,e<=t&&n>=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=cr(r)}}function dr(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?dr(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function pr(){for(var e=window,t=Q();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=Q((e=t.contentWindow).document)}return t}function fr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}function gr(e){var t=pr(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&dr(n.ownerDocument.documentElement,n)){if(null!==r&&fr(n))if(t=r.start,void 0===(e=r.end)&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if((e=(t=n.ownerDocument||document)&&t.defaultView||window).getSelection){e=e.getSelection();var o=n.textContent.length,a=Math.min(r.start,o);r=void 0===r.end?a:Math.min(r.end,o),!e.extend&&a>r&&(o=r,r=a,a=o),o=ur(n,a);var i=ur(n,r);o&&i&&(1!==e.rangeCount||e.anchorNode!==o.node||e.anchorOffset!==o.offset||e.focusNode!==i.node||e.focusOffset!==i.offset)&&((t=t.createRange()).setStart(o.node,o.offset),e.removeAllRanges(),a>r?(e.addRange(t),e.extend(i.node,i.offset)):(t.setEnd(i.node,i.offset),e.addRange(t)))}for(t=[],e=n;e=e.parentNode;)1===e.nodeType&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for("function"==typeof n.focus&&n.focus(),n=0;n<t.length;n++)(e=t[n]).element.scrollLeft=e.left,e.element.scrollTop=e.top}}var mr=u&&"documentMode"in document&&11>=document.documentMode,hr=null,br=null,yr=null,vr=!1;function wr(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;vr||null==hr||hr!==Q(r)||("selectionStart"in(r=hr)&&fr(r)?r={start:r.selectionStart,end:r.selectionEnd}:r={anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},yr&&sr(yr,r)||(yr=r,0<(r=Vr(br,"onSelect")).length&&(t=new un("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=hr)))}function kr(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var xr={animationend:kr("Animation","AnimationEnd"),animationiteration:kr("Animation","AnimationIteration"),animationstart:kr("Animation","AnimationStart"),transitionend:kr("Transition","TransitionEnd")},Sr={},Er={};function _r(e){if(Sr[e])return Sr[e];if(!xr[e])return e;var t,n=xr[e];for(t in n)if(n.hasOwnProperty(t)&&t in Er)return Sr[e]=n[t];return e}u&&(Er=document.createElement("div").style,"AnimationEvent"in window||(delete xr.animationend.animation,delete xr.animationiteration.animation,delete xr.animationstart.animation),"TransitionEvent"in window||delete xr.transitionend.transition);var Cr=_r("animationend"),Tr=_r("animationiteration"),jr=_r("animationstart"),Ar=_r("transitionend"),Nr=new Map,Lr="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function Rr(e,t){Nr.set(e,t),s(t,[e])}for(var Pr=0;Pr<Lr.length;Pr++){var Or=Lr[Pr];Rr(Or.toLowerCase(),"on"+(Or[0].toUpperCase()+Or.slice(1)))}Rr(Cr,"onAnimationEnd"),Rr(Tr,"onAnimationIteration"),Rr(jr,"onAnimationStart"),Rr("dblclick","onDoubleClick"),Rr("focusin","onFocus"),Rr("focusout","onBlur"),Rr(Ar,"onTransitionEnd"),c("onMouseEnter",["mouseout","mouseover"]),c("onMouseLeave",["mouseout","mouseover"]),c("onPointerEnter",["pointerout","pointerover"]),c("onPointerLeave",["pointerout","pointerover"]),s("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),s("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),s("onBeforeInput",["compositionend","keypress","textInput","paste"]),s("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),s("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),s("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var Dr="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Ir=new Set("cancel close invalid load scroll toggle".split(" ").concat(Dr));function Mr(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,function(e,t,n,r,o,i,l,s,c){if(Ue.apply(this,arguments),Ie){if(!Ie)throw Error(a(198));var u=Me;Ie=!1,Me=null,Fe||(Fe=!0,ze=u)}}(r,t,void 0,e),e.currentTarget=null}function Fr(e,t){t=0!=(4&t);for(var n=0;n<e.length;n++){var r=e[n],o=r.event;r=r.listeners;e:{var a=void 0;if(t)for(var i=r.length-1;0<=i;i--){var l=r[i],s=l.instance,c=l.currentTarget;if(l=l.listener,s!==a&&o.isPropagationStopped())break e;Mr(o,l,c),a=s}else for(i=0;i<r.length;i++){if(s=(l=r[i]).instance,c=l.currentTarget,l=l.listener,s!==a&&o.isPropagationStopped())break e;Mr(o,l,c),a=s}}}if(Fe)throw e=ze,Fe=!1,ze=null,e}function zr(e,t){var n=t[ho];void 0===n&&(n=t[ho]=new Set);var r=e+"__bubble";n.has(r)||(qr(t,e,2,!1),n.add(r))}function Br(e,t,n){var r=0;t&&(r|=4),qr(n,e,r,t)}var Ur="_reactListening"+Math.random().toString(36).slice(2);function $r(e){if(!e[Ur]){e[Ur]=!0,i.forEach((function(t){"selectionchange"!==t&&(Ir.has(t)||Br(t,!1,e),Br(t,!0,e))}));var t=9===e.nodeType?e:e.ownerDocument;null===t||t[Ur]||(t[Ur]=!0,Br("selectionchange",!1,t))}}function qr(e,t,n,r){switch(Kt(t)){case 1:var o=Gt;break;case 4:o=Vt;break;default:o=Wt}n=o.bind(null,t,n,e),o=void 0,!Pe||"touchstart"!==t&&"touchmove"!==t&&"wheel"!==t||(o=!0),r?void 0!==o?e.addEventListener(t,n,{capture:!0,passive:o}):e.addEventListener(t,n,!0):void 0!==o?e.addEventListener(t,n,{passive:o}):e.addEventListener(t,n,!1)}function Hr(e,t,n,r,o){var a=r;if(0==(1&t)&&0==(2&t)&&null!==r)e:for(;;){if(null===r)return;var i=r.tag;if(3===i||4===i){var l=r.stateNode.containerInfo;if(l===o||8===l.nodeType&&l.parentNode===o)break;if(4===i)for(i=r.return;null!==i;){var s=i.tag;if((3===s||4===s)&&((s=i.stateNode.containerInfo)===o||8===s.nodeType&&s.parentNode===o))return;i=i.return}for(;null!==l;){if(null===(i=vo(l)))return;if(5===(s=i.tag)||6===s){r=a=i;continue e}l=l.parentNode}}r=r.return}Le((function(){var r=a,o=ke(n),i=[];e:{var l=Nr.get(e);if(void 0!==l){var s=un,c=e;switch(e){case"keypress":if(0===tn(n))break e;case"keydown":case"keyup":s=Tn;break;case"focusin":c="focus",s=hn;break;case"focusout":c="blur",s=hn;break;case"beforeblur":case"afterblur":s=hn;break;case"click":if(2===n.button)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":s=gn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":s=mn;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":s=An;break;case Cr:case Tr:case jr:s=bn;break;case Ar:s=Nn;break;case"scroll":s=pn;break;case"wheel":s=Rn;break;case"copy":case"cut":case"paste":s=vn;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":s=jn}var u=0!=(4&t),d=!u&&"scroll"===e,p=u?null!==l?l+"Capture":null:l;u=[];for(var f,g=r;null!==g;){var m=(f=g).stateNode;if(5===f.tag&&null!==m&&(f=m,null!==p&&(null!=(m=Re(g,p))&&u.push(Gr(g,m,f)))),d)break;g=g.return}0<u.length&&(l=new s(l,c,null,n,o),i.push({event:l,listeners:u}))}}if(0==(7&t)){if(s="mouseout"===e||"pointerout"===e,(!(l="mouseover"===e||"pointerover"===e)||n===we||!(c=n.relatedTarget||n.fromElement)||!vo(c)&&!c[mo])&&(s||l)&&(l=o.window===o?o:(l=o.ownerDocument)?l.defaultView||l.parentWindow:window,s?(s=r,null!==(c=(c=n.relatedTarget||n.toElement)?vo(c):null)&&(c!==(d=$e(c))||5!==c.tag&&6!==c.tag)&&(c=null)):(s=null,c=r),s!==c)){if(u=gn,m="onMouseLeave",p="onMouseEnter",g="mouse","pointerout"!==e&&"pointerover"!==e||(u=jn,m="onPointerLeave",p="onPointerEnter",g="pointer"),d=null==s?l:ko(s),f=null==c?l:ko(c),(l=new u(m,g+"leave",s,n,o)).target=d,l.relatedTarget=f,m=null,vo(o)===r&&((u=new u(p,g+"enter",c,n,o)).target=f,u.relatedTarget=d,m=u),d=m,s&&c)e:{for(p=c,g=0,f=u=s;f;f=Wr(f))g++;for(f=0,m=p;m;m=Wr(m))f++;for(;0<g-f;)u=Wr(u),g--;for(;0<f-g;)p=Wr(p),f--;for(;g--;){if(u===p||null!==p&&u===p.alternate)break e;u=Wr(u),p=Wr(p)}u=null}else u=null;null!==s&&Qr(i,l,s,u,!1),null!==c&&null!==d&&Qr(i,d,c,u,!0)}if("select"===(s=(l=r?ko(r):window).nodeName&&l.nodeName.toLowerCase())||"input"===s&&"file"===l.type)var h=Kn;else if(Hn(l))if(Xn)h=ir;else{h=or;var b=rr}else(s=l.nodeName)&&"input"===s.toLowerCase()&&("checkbox"===l.type||"radio"===l.type)&&(h=ar);switch(h&&(h=h(e,r))?Gn(i,h,n,o):(b&&b(e,l,r),"focusout"===e&&(b=l._wrapperState)&&b.controlled&&"number"===l.type&&ee(l,"number",l.value)),b=r?ko(r):window,e){case"focusin":(Hn(b)||"true"===b.contentEditable)&&(hr=b,br=r,yr=null);break;case"focusout":yr=br=hr=null;break;case"mousedown":vr=!0;break;case"contextmenu":case"mouseup":case"dragend":vr=!1,wr(i,n,o);break;case"selectionchange":if(mr)break;case"keydown":case"keyup":wr(i,n,o)}var y;if(On)e:{switch(e){case"compositionstart":var v="onCompositionStart";break e;case"compositionend":v="onCompositionEnd";break e;case"compositionupdate":v="onCompositionUpdate";break e}v=void 0}else $n?Bn(e,n)&&(v="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(v="onCompositionStart");v&&(Mn&&"ko"!==n.locale&&($n||"onCompositionStart"!==v?"onCompositionEnd"===v&&$n&&(y=en()):(Zt="value"in(Xt=o)?Xt.value:Xt.textContent,$n=!0)),0<(b=Vr(r,v)).length&&(v=new wn(v,e,null,n,o),i.push({event:v,listeners:b}),y?v.data=y:null!==(y=Un(n))&&(v.data=y))),(y=In?function(e,t){switch(e){case"compositionend":return Un(t);case"keypress":return 32!==t.which?null:(zn=!0,Fn);case"textInput":return(e=t.data)===Fn&&zn?null:e;default:return null}}(e,n):function(e,t){if($n)return"compositionend"===e||!On&&Bn(e,t)?(e=en(),Jt=Zt=Xt=null,$n=!1,e):null;switch(e){case"paste":default:return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return Mn&&"ko"!==t.locale?null:t.data}}(e,n))&&(0<(r=Vr(r,"onBeforeInput")).length&&(o=new wn("onBeforeInput","beforeinput",null,n,o),i.push({event:o,listeners:r}),o.data=y))}Fr(i,t)}))}function Gr(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Vr(e,t){for(var n=t+"Capture",r=[];null!==e;){var o=e,a=o.stateNode;5===o.tag&&null!==a&&(o=a,null!=(a=Re(e,n))&&r.unshift(Gr(e,a,o)),null!=(a=Re(e,t))&&r.push(Gr(e,a,o))),e=e.return}return r}function Wr(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag);return e||null}function Qr(e,t,n,r,o){for(var a=t._reactName,i=[];null!==n&&n!==r;){var l=n,s=l.alternate,c=l.stateNode;if(null!==s&&s===r)break;5===l.tag&&null!==c&&(l=c,o?null!=(s=Re(n,a))&&i.unshift(Gr(n,s,l)):o||null!=(s=Re(n,a))&&i.push(Gr(n,s,l))),n=n.return}0!==i.length&&e.push({event:t,listeners:i})}var Yr=/\r\n?/g,Kr=/\u0000|\uFFFD/g;function Xr(e){return("string"==typeof e?e:""+e).replace(Yr,"\n").replace(Kr,"")}function Zr(e,t,n){if(t=Xr(t),Xr(e)!==t&&n)throw Error(a(425))}function Jr(){}var eo=null,to=null;function no(e,t){return"textarea"===e||"noscript"===e||"string"==typeof t.children||"number"==typeof t.children||"object"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var ro="function"==typeof setTimeout?setTimeout:void 0,oo="function"==typeof clearTimeout?clearTimeout:void 0,ao="function"==typeof Promise?Promise:void 0,io="function"==typeof queueMicrotask?queueMicrotask:void 0!==ao?function(e){return ao.resolve(null).then(e).catch(lo)}:ro;function lo(e){setTimeout((function(){throw e}))}function so(e,t){var n=t,r=0;do{var o=n.nextSibling;if(e.removeChild(n),o&&8===o.nodeType)if("/$"===(n=o.data)){if(0===r)return e.removeChild(o),void $t(t);r--}else"$"!==n&&"$?"!==n&&"$!"!==n||r++;n=o}while(n);$t(t)}function co(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break;if(8===t){if("$"===(t=e.data)||"$!"===t||"$?"===t)break;if("/$"===t)return null}}return e}function uo(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){var n=e.data;if("$"===n||"$!"===n||"$?"===n){if(0===t)return e;t--}else"/$"===n&&t++}e=e.previousSibling}return null}var po=Math.random().toString(36).slice(2),fo="__reactFiber$"+po,go="__reactProps$"+po,mo="__reactContainer$"+po,ho="__reactEvents$"+po,bo="__reactListeners$"+po,yo="__reactHandles$"+po;function vo(e){var t=e[fo];if(t)return t;for(var n=e.parentNode;n;){if(t=n[mo]||n[fo]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=uo(e);null!==e;){if(n=e[fo])return n;e=uo(e)}return t}n=(e=n).parentNode}return null}function wo(e){return!(e=e[fo]||e[mo])||5!==e.tag&&6!==e.tag&&13!==e.tag&&3!==e.tag?null:e}function ko(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(a(33))}function xo(e){return e[go]||null}var So=[],Eo=-1;function _o(e){return{current:e}}function Co(e){0>Eo||(e.current=So[Eo],So[Eo]=null,Eo--)}function To(e,t){Eo++,So[Eo]=e.current,e.current=t}var jo={},Ao=_o(jo),No=_o(!1),Lo=jo;function Ro(e,t){var n=e.type.contextTypes;if(!n)return jo;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var o,a={};for(o in n)a[o]=t[o];return r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=a),a}function Po(e){return null!=(e=e.childContextTypes)}function Oo(){Co(No),Co(Ao)}function Do(e,t,n){if(Ao.current!==jo)throw Error(a(168));To(Ao,t),To(No,n)}function Io(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,"function"!=typeof r.getChildContext)return n;for(var o in r=r.getChildContext())if(!(o in t))throw Error(a(108,q(e)||"Unknown",o));return M({},n,r)}function Mo(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||jo,Lo=Ao.current,To(Ao,e),To(No,No.current),!0}function Fo(e,t,n){var r=e.stateNode;if(!r)throw Error(a(169));n?(e=Io(e,t,Lo),r.__reactInternalMemoizedMergedChildContext=e,Co(No),Co(Ao),To(Ao,e)):Co(No),To(No,n)}var zo=null,Bo=!1,Uo=!1;function $o(e){null===zo?zo=[e]:zo.push(e)}function qo(){if(!Uo&&null!==zo){Uo=!0;var e=0,t=vt;try{var n=zo;for(vt=1;e<n.length;e++){var r=n[e];do{r=r(!0)}while(null!==r)}zo=null,Bo=!1}catch(o){throw null!==zo&&(zo=zo.slice(e+1)),We(Je,qo),o}finally{vt=t,Uo=!1}}return null}var Ho=[],Go=0,Vo=null,Wo=0,Qo=[],Yo=0,Ko=null,Xo=1,Zo="";function Jo(e,t){Ho[Go++]=Wo,Ho[Go++]=Vo,Vo=e,Wo=t}function ea(e,t,n){Qo[Yo++]=Xo,Qo[Yo++]=Zo,Qo[Yo++]=Ko,Ko=e;var r=Xo;e=Zo;var o=32-it(r)-1;r&=~(1<<o),n+=1;var a=32-it(t)+o;if(30<a){var i=o-o%5;a=(r&(1<<i)-1).toString(32),r>>=i,o-=i,Xo=1<<32-it(t)+o|n<<o|r,Zo=a+e}else Xo=1<<a|n<<o|r,Zo=e}function ta(e){null!==e.return&&(Jo(e,1),ea(e,1,0))}function na(e){for(;e===Vo;)Vo=Ho[--Go],Ho[Go]=null,Wo=Ho[--Go],Ho[Go]=null;for(;e===Ko;)Ko=Qo[--Yo],Qo[Yo]=null,Zo=Qo[--Yo],Qo[Yo]=null,Xo=Qo[--Yo],Qo[Yo]=null}var ra=null,oa=null,aa=!1,ia=null;function la(e,t){var n=Rc(5,null,null,0);n.elementType="DELETED",n.stateNode=t,n.return=e,null===(t=e.deletions)?(e.deletions=[n],e.flags|=16):t.push(n)}function sa(e,t){switch(e.tag){case 5:var n=e.type;return null!==(t=1!==t.nodeType||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t)&&(e.stateNode=t,ra=e,oa=co(t.firstChild),!0);case 6:return null!==(t=""===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,ra=e,oa=null,!0);case 13:return null!==(t=8!==t.nodeType?null:t)&&(n=null!==Ko?{id:Xo,overflow:Zo}:null,e.memoizedState={dehydrated:t,treeContext:n,retryLane:1073741824},(n=Rc(18,null,null,0)).stateNode=t,n.return=e,e.child=n,ra=e,oa=null,!0);default:return!1}}function ca(e){return 0!=(1&e.mode)&&0==(128&e.flags)}function ua(e){if(aa){var t=oa;if(t){var n=t;if(!sa(e,t)){if(ca(e))throw Error(a(418));t=co(n.nextSibling);var r=ra;t&&sa(e,t)?la(r,n):(e.flags=-4097&e.flags|2,aa=!1,ra=e)}}else{if(ca(e))throw Error(a(418));e.flags=-4097&e.flags|2,aa=!1,ra=e}}}function da(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;ra=e}function pa(e){if(e!==ra)return!1;if(!aa)return da(e),aa=!0,!1;var t;if((t=3!==e.tag)&&!(t=5!==e.tag)&&(t="head"!==(t=e.type)&&"body"!==t&&!no(e.type,e.memoizedProps)),t&&(t=oa)){if(ca(e))throw fa(),Error(a(418));for(;t;)la(e,t),t=co(t.nextSibling)}if(da(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(a(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if("/$"===n){if(0===t){oa=co(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}oa=null}}else oa=ra?co(e.stateNode.nextSibling):null;return!0}function fa(){for(var e=oa;e;)e=co(e.nextSibling)}function ga(){oa=ra=null,aa=!1}function ma(e){null===ia?ia=[e]:ia.push(e)}var ha=w.ReactCurrentBatchConfig;function ba(e,t){if(e&&e.defaultProps){for(var n in t=M({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}return t}var ya=_o(null),va=null,wa=null,ka=null;function xa(){ka=wa=va=null}function Sa(e){var t=ya.current;Co(ya),e._currentValue=t}function Ea(e,t,n){for(;null!==e;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,null!==r&&(r.childLanes|=t)):null!==r&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function _a(e,t){va=e,ka=wa=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(0!=(e.lanes&t)&&(wl=!0),e.firstContext=null)}function Ca(e){var t=e._currentValue;if(ka!==e)if(e={context:e,memoizedValue:t,next:null},null===wa){if(null===va)throw Error(a(308));wa=e,va.dependencies={lanes:0,firstContext:e}}else wa=wa.next=e;return t}var Ta=null;function ja(e){null===Ta?Ta=[e]:Ta.push(e)}function Aa(e,t,n,r){var o=t.interleaved;return null===o?(n.next=n,ja(t)):(n.next=o.next,o.next=n),t.interleaved=n,Na(e,r)}function Na(e,t){e.lanes|=t;var n=e.alternate;for(null!==n&&(n.lanes|=t),n=e,e=e.return;null!==e;)e.childLanes|=t,null!==(n=e.alternate)&&(n.childLanes|=t),n=e,e=e.return;return 3===n.tag?n.stateNode:null}var La=!1;function Ra(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Pa(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Oa(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Da(e,t,n){var r=e.updateQueue;if(null===r)return null;if(r=r.shared,0!=(2&As)){var o=r.pending;return null===o?t.next=t:(t.next=o.next,o.next=t),r.pending=t,Na(e,n)}return null===(o=r.interleaved)?(t.next=t,ja(r)):(t.next=o.next,o.next=t),r.interleaved=t,Na(e,n)}function Ia(e,t,n){if(null!==(t=t.updateQueue)&&(t=t.shared,0!=(4194240&n))){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,yt(e,n)}}function Ma(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r.updateQueue)){var o=null,a=null;if(null!==(n=n.firstBaseUpdate)){do{var i={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};null===a?o=a=i:a=a.next=i,n=n.next}while(null!==n);null===a?o=a=t:a=a.next=t}else o=a=t;return n={baseState:r.baseState,firstBaseUpdate:o,lastBaseUpdate:a,shared:r.shared,effects:r.effects},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function Fa(e,t,n,r){var o=e.updateQueue;La=!1;var a=o.firstBaseUpdate,i=o.lastBaseUpdate,l=o.shared.pending;if(null!==l){o.shared.pending=null;var s=l,c=s.next;s.next=null,null===i?a=c:i.next=c,i=s;var u=e.alternate;null!==u&&((l=(u=u.updateQueue).lastBaseUpdate)!==i&&(null===l?u.firstBaseUpdate=c:l.next=c,u.lastBaseUpdate=s))}if(null!==a){var d=o.baseState;for(i=0,u=c=s=null,l=a;;){var p=l.lane,f=l.eventTime;if((r&p)===p){null!==u&&(u=u.next={eventTime:f,lane:0,tag:l.tag,payload:l.payload,callback:l.callback,next:null});e:{var g=e,m=l;switch(p=t,f=n,m.tag){case 1:if("function"==typeof(g=m.payload)){d=g.call(f,d,p);break e}d=g;break e;case 3:g.flags=-65537&g.flags|128;case 0:if(null==(p="function"==typeof(g=m.payload)?g.call(f,d,p):g))break e;d=M({},d,p);break e;case 2:La=!0}}null!==l.callback&&0!==l.lane&&(e.flags|=64,null===(p=o.effects)?o.effects=[l]:p.push(l))}else f={eventTime:f,lane:p,tag:l.tag,payload:l.payload,callback:l.callback,next:null},null===u?(c=u=f,s=d):u=u.next=f,i|=p;if(null===(l=l.next)){if(null===(l=o.shared.pending))break;l=(p=l).next,p.next=null,o.lastBaseUpdate=p,o.shared.pending=null}}if(null===u&&(s=d),o.baseState=s,o.firstBaseUpdate=c,o.lastBaseUpdate=u,null!==(t=o.shared.interleaved)){o=t;do{i|=o.lane,o=o.next}while(o!==t)}else null===a&&(o.shared.lanes=0);Ms|=i,e.lanes=i,e.memoizedState=d}}function za(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t<e.length;t++){var r=e[t],o=r.callback;if(null!==o){if(r.callback=null,r=n,"function"!=typeof o)throw Error(a(191,o));o.call(r)}}}var Ba=(new r.Component).refs;function Ua(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:M({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var $a={isMounted:function(e){return!!(e=e._reactInternals)&&$e(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=tc(),o=nc(e),a=Oa(r,o);a.payload=t,null!=n&&(a.callback=n),null!==(t=Da(e,a,o))&&(rc(t,e,o,r),Ia(t,e,o))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=tc(),o=nc(e),a=Oa(r,o);a.tag=1,a.payload=t,null!=n&&(a.callback=n),null!==(t=Da(e,a,o))&&(rc(t,e,o,r),Ia(t,e,o))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=tc(),r=nc(e),o=Oa(n,r);o.tag=2,null!=t&&(o.callback=t),null!==(t=Da(e,o,r))&&(rc(t,e,r,n),Ia(t,e,r))}};function qa(e,t,n,r,o,a,i){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,a,i):!t.prototype||!t.prototype.isPureReactComponent||(!sr(n,r)||!sr(o,a))}function Ha(e,t,n){var r=!1,o=jo,a=t.contextType;return"object"==typeof a&&null!==a?a=Ca(a):(o=Po(t)?Lo:Ao.current,a=(r=null!=(r=t.contextTypes))?Ro(e,o):jo),t=new t(n,a),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=$a,e.stateNode=t,t._reactInternals=e,r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=o,e.__reactInternalMemoizedMaskedChildContext=a),t}function Ga(e,t,n,r){e=t.state,"function"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,r),"function"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&$a.enqueueReplaceState(t,t.state,null)}function Va(e,t,n,r){var o=e.stateNode;o.props=n,o.state=e.memoizedState,o.refs=Ba,Ra(e);var a=t.contextType;"object"==typeof a&&null!==a?o.context=Ca(a):(a=Po(t)?Lo:Ao.current,o.context=Ro(e,a)),o.state=e.memoizedState,"function"==typeof(a=t.getDerivedStateFromProps)&&(Ua(e,t,a,n),o.state=e.memoizedState),"function"==typeof t.getDerivedStateFromProps||"function"==typeof o.getSnapshotBeforeUpdate||"function"!=typeof o.UNSAFE_componentWillMount&&"function"!=typeof o.componentWillMount||(t=o.state,"function"==typeof o.componentWillMount&&o.componentWillMount(),"function"==typeof o.UNSAFE_componentWillMount&&o.UNSAFE_componentWillMount(),t!==o.state&&$a.enqueueReplaceState(o,o.state,null),Fa(e,n,o,r),o.state=e.memoizedState),"function"==typeof o.componentDidMount&&(e.flags|=4194308)}function Wa(e,t,n){if(null!==(e=n.ref)&&"function"!=typeof e&&"object"!=typeof e){if(n._owner){if(n=n._owner){if(1!==n.tag)throw Error(a(309));var r=n.stateNode}if(!r)throw Error(a(147,e));var o=r,i=""+e;return null!==t&&null!==t.ref&&"function"==typeof t.ref&&t.ref._stringRef===i?t.ref:(t=function(e){var t=o.refs;t===Ba&&(t=o.refs={}),null===e?delete t[i]:t[i]=e},t._stringRef=i,t)}if("string"!=typeof e)throw Error(a(284));if(!n._owner)throw Error(a(290,e))}return e}function Qa(e,t){throw e=Object.prototype.toString.call(t),Error(a(31,"[object Object]"===e?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function Ya(e){return(0,e._init)(e._payload)}function Ka(e){function t(t,n){if(e){var r=t.deletions;null===r?(t.deletions=[n],t.flags|=16):r.push(n)}}function n(n,r){if(!e)return null;for(;null!==r;)t(n,r),r=r.sibling;return null}function r(e,t){for(e=new Map;null!==t;)null!==t.key?e.set(t.key,t):e.set(t.index,t),t=t.sibling;return e}function o(e,t){return(e=Oc(e,t)).index=0,e.sibling=null,e}function i(t,n,r){return t.index=r,e?null!==(r=t.alternate)?(r=r.index)<n?(t.flags|=2,n):r:(t.flags|=2,n):(t.flags|=1048576,n)}function l(t){return e&&null===t.alternate&&(t.flags|=2),t}function s(e,t,n,r){return null===t||6!==t.tag?((t=Fc(n,e.mode,r)).return=e,t):((t=o(t,n)).return=e,t)}function c(e,t,n,r){var a=n.type;return a===S?d(e,t,n.props.children,r,n.key):null!==t&&(t.elementType===a||"object"==typeof a&&null!==a&&a.$$typeof===R&&Ya(a)===t.type)?((r=o(t,n.props)).ref=Wa(e,t,n),r.return=e,r):((r=Dc(n.type,n.key,n.props,null,e.mode,r)).ref=Wa(e,t,n),r.return=e,r)}function u(e,t,n,r){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?((t=zc(n,e.mode,r)).return=e,t):((t=o(t,n.children||[])).return=e,t)}function d(e,t,n,r,a){return null===t||7!==t.tag?((t=Ic(n,e.mode,r,a)).return=e,t):((t=o(t,n)).return=e,t)}function p(e,t,n){if("string"==typeof t&&""!==t||"number"==typeof t)return(t=Fc(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case k:return(n=Dc(t.type,t.key,t.props,null,e.mode,n)).ref=Wa(e,null,t),n.return=e,n;case x:return(t=zc(t,e.mode,n)).return=e,t;case R:return p(e,(0,t._init)(t._payload),n)}if(te(t)||D(t))return(t=Ic(t,e.mode,n,null)).return=e,t;Qa(e,t)}return null}function f(e,t,n,r){var o=null!==t?t.key:null;if("string"==typeof n&&""!==n||"number"==typeof n)return null!==o?null:s(e,t,""+n,r);if("object"==typeof n&&null!==n){switch(n.$$typeof){case k:return n.key===o?c(e,t,n,r):null;case x:return n.key===o?u(e,t,n,r):null;case R:return f(e,t,(o=n._init)(n._payload),r)}if(te(n)||D(n))return null!==o?null:d(e,t,n,r,null);Qa(e,n)}return null}function g(e,t,n,r,o){if("string"==typeof r&&""!==r||"number"==typeof r)return s(t,e=e.get(n)||null,""+r,o);if("object"==typeof r&&null!==r){switch(r.$$typeof){case k:return c(t,e=e.get(null===r.key?n:r.key)||null,r,o);case x:return u(t,e=e.get(null===r.key?n:r.key)||null,r,o);case R:return g(e,t,n,(0,r._init)(r._payload),o)}if(te(r)||D(r))return d(t,e=e.get(n)||null,r,o,null);Qa(t,r)}return null}function m(o,a,l,s){for(var c=null,u=null,d=a,m=a=0,h=null;null!==d&&m<l.length;m++){d.index>m?(h=d,d=null):h=d.sibling;var b=f(o,d,l[m],s);if(null===b){null===d&&(d=h);break}e&&d&&null===b.alternate&&t(o,d),a=i(b,a,m),null===u?c=b:u.sibling=b,u=b,d=h}if(m===l.length)return n(o,d),aa&&Jo(o,m),c;if(null===d){for(;m<l.length;m++)null!==(d=p(o,l[m],s))&&(a=i(d,a,m),null===u?c=d:u.sibling=d,u=d);return aa&&Jo(o,m),c}for(d=r(o,d);m<l.length;m++)null!==(h=g(d,o,m,l[m],s))&&(e&&null!==h.alternate&&d.delete(null===h.key?m:h.key),a=i(h,a,m),null===u?c=h:u.sibling=h,u=h);return e&&d.forEach((function(e){return t(o,e)})),aa&&Jo(o,m),c}function h(o,l,s,c){var u=D(s);if("function"!=typeof u)throw Error(a(150));if(null==(s=u.call(s)))throw Error(a(151));for(var d=u=null,m=l,h=l=0,b=null,y=s.next();null!==m&&!y.done;h++,y=s.next()){m.index>h?(b=m,m=null):b=m.sibling;var v=f(o,m,y.value,c);if(null===v){null===m&&(m=b);break}e&&m&&null===v.alternate&&t(o,m),l=i(v,l,h),null===d?u=v:d.sibling=v,d=v,m=b}if(y.done)return n(o,m),aa&&Jo(o,h),u;if(null===m){for(;!y.done;h++,y=s.next())null!==(y=p(o,y.value,c))&&(l=i(y,l,h),null===d?u=y:d.sibling=y,d=y);return aa&&Jo(o,h),u}for(m=r(o,m);!y.done;h++,y=s.next())null!==(y=g(m,o,h,y.value,c))&&(e&&null!==y.alternate&&m.delete(null===y.key?h:y.key),l=i(y,l,h),null===d?u=y:d.sibling=y,d=y);return e&&m.forEach((function(e){return t(o,e)})),aa&&Jo(o,h),u}return function e(r,a,i,s){if("object"==typeof i&&null!==i&&i.type===S&&null===i.key&&(i=i.props.children),"object"==typeof i&&null!==i){switch(i.$$typeof){case k:e:{for(var c=i.key,u=a;null!==u;){if(u.key===c){if((c=i.type)===S){if(7===u.tag){n(r,u.sibling),(a=o(u,i.props.children)).return=r,r=a;break e}}else if(u.elementType===c||"object"==typeof c&&null!==c&&c.$$typeof===R&&Ya(c)===u.type){n(r,u.sibling),(a=o(u,i.props)).ref=Wa(r,u,i),a.return=r,r=a;break e}n(r,u);break}t(r,u),u=u.sibling}i.type===S?((a=Ic(i.props.children,r.mode,s,i.key)).return=r,r=a):((s=Dc(i.type,i.key,i.props,null,r.mode,s)).ref=Wa(r,a,i),s.return=r,r=s)}return l(r);case x:e:{for(u=i.key;null!==a;){if(a.key===u){if(4===a.tag&&a.stateNode.containerInfo===i.containerInfo&&a.stateNode.implementation===i.implementation){n(r,a.sibling),(a=o(a,i.children||[])).return=r,r=a;break e}n(r,a);break}t(r,a),a=a.sibling}(a=zc(i,r.mode,s)).return=r,r=a}return l(r);case R:return e(r,a,(u=i._init)(i._payload),s)}if(te(i))return m(r,a,i,s);if(D(i))return h(r,a,i,s);Qa(r,i)}return"string"==typeof i&&""!==i||"number"==typeof i?(i=""+i,null!==a&&6===a.tag?(n(r,a.sibling),(a=o(a,i)).return=r,r=a):(n(r,a),(a=Fc(i,r.mode,s)).return=r,r=a),l(r)):n(r,a)}}var Xa=Ka(!0),Za=Ka(!1),Ja={},ei=_o(Ja),ti=_o(Ja),ni=_o(Ja);function ri(e){if(e===Ja)throw Error(a(174));return e}function oi(e,t){switch(To(ni,t),To(ti,e),To(ei,Ja),e=t.nodeType){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:se(null,"");break;default:t=se(t=(e=8===e?t.parentNode:t).namespaceURI||null,e=e.tagName)}Co(ei),To(ei,t)}function ai(){Co(ei),Co(ti),Co(ni)}function ii(e){ri(ni.current);var t=ri(ei.current),n=se(t,e.type);t!==n&&(To(ti,e),To(ei,n))}function li(e){ti.current===e&&(Co(ei),Co(ti))}var si=_o(0);function ci(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||"$!"===n.data))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(0!=(128&t.flags))return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var ui=[];function di(){for(var e=0;e<ui.length;e++)ui[e]._workInProgressVersionPrimary=null;ui.length=0}var pi=w.ReactCurrentDispatcher,fi=w.ReactCurrentBatchConfig,gi=0,mi=null,hi=null,bi=null,yi=!1,vi=!1,wi=0,ki=0;function xi(){throw Error(a(321))}function Si(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!lr(e[n],t[n]))return!1;return!0}function Ei(e,t,n,r,o,i){if(gi=i,mi=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,pi.current=null===e||null===e.memoizedState?ll:sl,e=n(r,o),vi){i=0;do{if(vi=!1,wi=0,25<=i)throw Error(a(301));i+=1,bi=hi=null,t.updateQueue=null,pi.current=cl,e=n(r,o)}while(vi)}if(pi.current=il,t=null!==hi&&null!==hi.next,gi=0,bi=hi=mi=null,yi=!1,t)throw Error(a(300));return e}function _i(){var e=0!==wi;return wi=0,e}function Ci(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===bi?mi.memoizedState=bi=e:bi=bi.next=e,bi}function Ti(){if(null===hi){var e=mi.alternate;e=null!==e?e.memoizedState:null}else e=hi.next;var t=null===bi?mi.memoizedState:bi.next;if(null!==t)bi=t,hi=e;else{if(null===e)throw Error(a(310));e={memoizedState:(hi=e).memoizedState,baseState:hi.baseState,baseQueue:hi.baseQueue,queue:hi.queue,next:null},null===bi?mi.memoizedState=bi=e:bi=bi.next=e}return bi}function ji(e,t){return"function"==typeof t?t(e):t}function Ai(e){var t=Ti(),n=t.queue;if(null===n)throw Error(a(311));n.lastRenderedReducer=e;var r=hi,o=r.baseQueue,i=n.pending;if(null!==i){if(null!==o){var l=o.next;o.next=i.next,i.next=l}r.baseQueue=o=i,n.pending=null}if(null!==o){i=o.next,r=r.baseState;var s=l=null,c=null,u=i;do{var d=u.lane;if((gi&d)===d)null!==c&&(c=c.next={lane:0,action:u.action,hasEagerState:u.hasEagerState,eagerState:u.eagerState,next:null}),r=u.hasEagerState?u.eagerState:e(r,u.action);else{var p={lane:d,action:u.action,hasEagerState:u.hasEagerState,eagerState:u.eagerState,next:null};null===c?(s=c=p,l=r):c=c.next=p,mi.lanes|=d,Ms|=d}u=u.next}while(null!==u&&u!==i);null===c?l=r:c.next=s,lr(r,t.memoizedState)||(wl=!0),t.memoizedState=r,t.baseState=l,t.baseQueue=c,n.lastRenderedState=r}if(null!==(e=n.interleaved)){o=e;do{i=o.lane,mi.lanes|=i,Ms|=i,o=o.next}while(o!==e)}else null===o&&(n.lanes=0);return[t.memoizedState,n.dispatch]}function Ni(e){var t=Ti(),n=t.queue;if(null===n)throw Error(a(311));n.lastRenderedReducer=e;var r=n.dispatch,o=n.pending,i=t.memoizedState;if(null!==o){n.pending=null;var l=o=o.next;do{i=e(i,l.action),l=l.next}while(l!==o);lr(i,t.memoizedState)||(wl=!0),t.memoizedState=i,null===t.baseQueue&&(t.baseState=i),n.lastRenderedState=i}return[i,r]}function Li(){}function Ri(e,t){var n=mi,r=Ti(),o=t(),i=!lr(r.memoizedState,o);if(i&&(r.memoizedState=o,wl=!0),r=r.queue,Hi(Di.bind(null,n,r,e),[e]),r.getSnapshot!==t||i||null!==bi&&1&bi.memoizedState.tag){if(n.flags|=2048,zi(9,Oi.bind(null,n,r,o,t),void 0,null),null===Ns)throw Error(a(349));0!=(30&gi)||Pi(n,t,o)}return o}function Pi(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},null===(t=mi.updateQueue)?(t={lastEffect:null,stores:null},mi.updateQueue=t,t.stores=[e]):null===(n=t.stores)?t.stores=[e]:n.push(e)}function Oi(e,t,n,r){t.value=n,t.getSnapshot=r,Ii(t)&&Mi(e)}function Di(e,t,n){return n((function(){Ii(t)&&Mi(e)}))}function Ii(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!lr(e,n)}catch(r){return!0}}function Mi(e){var t=Na(e,1);null!==t&&rc(t,e,1,-1)}function Fi(e){var t=Ci();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:ji,lastRenderedState:e},t.queue=e,e=e.dispatch=nl.bind(null,mi,e),[t.memoizedState,e]}function zi(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null},null===(t=mi.updateQueue)?(t={lastEffect:null,stores:null},mi.updateQueue=t,t.lastEffect=e.next=e):null===(n=t.lastEffect)?t.lastEffect=e.next=e:(r=n.next,n.next=e,e.next=r,t.lastEffect=e),e}function Bi(){return Ti().memoizedState}function Ui(e,t,n,r){var o=Ci();mi.flags|=e,o.memoizedState=zi(1|t,n,void 0,void 0===r?null:r)}function $i(e,t,n,r){var o=Ti();r=void 0===r?null:r;var a=void 0;if(null!==hi){var i=hi.memoizedState;if(a=i.destroy,null!==r&&Si(r,i.deps))return void(o.memoizedState=zi(t,n,a,r))}mi.flags|=e,o.memoizedState=zi(1|t,n,a,r)}function qi(e,t){return Ui(8390656,8,e,t)}function Hi(e,t){return $i(2048,8,e,t)}function Gi(e,t){return $i(4,2,e,t)}function Vi(e,t){return $i(4,4,e,t)}function Wi(e,t){return"function"==typeof t?(e=e(),t(e),function(){t(null)}):null!=t?(e=e(),t.current=e,function(){t.current=null}):void 0}function Qi(e,t,n){return n=null!=n?n.concat([e]):null,$i(4,4,Wi.bind(null,t,e),n)}function Yi(){}function Ki(e,t){var n=Ti();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&Si(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function Xi(e,t){var n=Ti();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&Si(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)}function Zi(e,t,n){return 0==(21&gi)?(e.baseState&&(e.baseState=!1,wl=!0),e.memoizedState=n):(lr(n,t)||(n=mt(),mi.lanes|=n,Ms|=n,e.baseState=!0),t)}function Ji(e,t){var n=vt;vt=0!==n&&4>n?n:4,e(!0);var r=fi.transition;fi.transition={};try{e(!1),t()}finally{vt=n,fi.transition=r}}function el(){return Ti().memoizedState}function tl(e,t,n){var r=nc(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},rl(e))ol(t,n);else if(null!==(n=Aa(e,t,n,r))){rc(n,e,r,tc()),al(n,t,r)}}function nl(e,t,n){var r=nc(e),o={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(rl(e))ol(t,o);else{var a=e.alternate;if(0===e.lanes&&(null===a||0===a.lanes)&&null!==(a=t.lastRenderedReducer))try{var i=t.lastRenderedState,l=a(i,n);if(o.hasEagerState=!0,o.eagerState=l,lr(l,i)){var s=t.interleaved;return null===s?(o.next=o,ja(t)):(o.next=s.next,s.next=o),void(t.interleaved=o)}}catch(c){}null!==(n=Aa(e,t,o,r))&&(rc(n,e,r,o=tc()),al(n,t,r))}}function rl(e){var t=e.alternate;return e===mi||null!==t&&t===mi}function ol(e,t){vi=yi=!0;var n=e.pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function al(e,t,n){if(0!=(4194240&n)){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,yt(e,n)}}var il={readContext:Ca,useCallback:xi,useContext:xi,useEffect:xi,useImperativeHandle:xi,useInsertionEffect:xi,useLayoutEffect:xi,useMemo:xi,useReducer:xi,useRef:xi,useState:xi,useDebugValue:xi,useDeferredValue:xi,useTransition:xi,useMutableSource:xi,useSyncExternalStore:xi,useId:xi,unstable_isNewReconciler:!1},ll={readContext:Ca,useCallback:function(e,t){return Ci().memoizedState=[e,void 0===t?null:t],e},useContext:Ca,useEffect:qi,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,Ui(4194308,4,Wi.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Ui(4194308,4,e,t)},useInsertionEffect:function(e,t){return Ui(4,2,e,t)},useMemo:function(e,t){var n=Ci();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Ci();return t=void 0!==n?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=tl.bind(null,mi,e),[r.memoizedState,e]},useRef:function(e){return e={current:e},Ci().memoizedState=e},useState:Fi,useDebugValue:Yi,useDeferredValue:function(e){return Ci().memoizedState=e},useTransition:function(){var e=Fi(!1),t=e[0];return e=Ji.bind(null,e[1]),Ci().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=mi,o=Ci();if(aa){if(void 0===n)throw Error(a(407));n=n()}else{if(n=t(),null===Ns)throw Error(a(349));0!=(30&gi)||Pi(r,t,n)}o.memoizedState=n;var i={value:n,getSnapshot:t};return o.queue=i,qi(Di.bind(null,r,i,e),[e]),r.flags|=2048,zi(9,Oi.bind(null,r,i,n,t),void 0,null),n},useId:function(){var e=Ci(),t=Ns.identifierPrefix;if(aa){var n=Zo;t=":"+t+"R"+(n=(Xo&~(1<<32-it(Xo)-1)).toString(32)+n),0<(n=wi++)&&(t+="H"+n.toString(32)),t+=":"}else t=":"+t+"r"+(n=ki++).toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},sl={readContext:Ca,useCallback:Ki,useContext:Ca,useEffect:Hi,useImperativeHandle:Qi,useInsertionEffect:Gi,useLayoutEffect:Vi,useMemo:Xi,useReducer:Ai,useRef:Bi,useState:function(){return Ai(ji)},useDebugValue:Yi,useDeferredValue:function(e){return Zi(Ti(),hi.memoizedState,e)},useTransition:function(){return[Ai(ji)[0],Ti().memoizedState]},useMutableSource:Li,useSyncExternalStore:Ri,useId:el,unstable_isNewReconciler:!1},cl={readContext:Ca,useCallback:Ki,useContext:Ca,useEffect:Hi,useImperativeHandle:Qi,useInsertionEffect:Gi,useLayoutEffect:Vi,useMemo:Xi,useReducer:Ni,useRef:Bi,useState:function(){return Ni(ji)},useDebugValue:Yi,useDeferredValue:function(e){var t=Ti();return null===hi?t.memoizedState=e:Zi(t,hi.memoizedState,e)},useTransition:function(){return[Ni(ji)[0],Ti().memoizedState]},useMutableSource:Li,useSyncExternalStore:Ri,useId:el,unstable_isNewReconciler:!1};function ul(e,t){try{var n="",r=t;do{n+=U(r),r=r.return}while(r);var o=n}catch(a){o="\nError generating stack: "+a.message+"\n"+a.stack}return{value:e,source:t,stack:o,digest:null}}function dl(e,t,n){return{value:e,source:null,stack:null!=n?n:null,digest:null!=t?t:null}}function pl(e,t){try{console.error(t.value)}catch(n){setTimeout((function(){throw n}))}}var fl="function"==typeof WeakMap?WeakMap:Map;function gl(e,t,n){(n=Oa(-1,n)).tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Gs||(Gs=!0,Vs=r),pl(0,t)},n}function ml(e,t,n){(n=Oa(-1,n)).tag=3;var r=e.type.getDerivedStateFromError;if("function"==typeof r){var o=t.value;n.payload=function(){return r(o)},n.callback=function(){pl(0,t)}}var a=e.stateNode;return null!==a&&"function"==typeof a.componentDidCatch&&(n.callback=function(){pl(0,t),"function"!=typeof r&&(null===Ws?Ws=new Set([this]):Ws.add(this));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}function hl(e,t,n){var r=e.pingCache;if(null===r){r=e.pingCache=new fl;var o=new Set;r.set(t,o)}else void 0===(o=r.get(t))&&(o=new Set,r.set(t,o));o.has(n)||(o.add(n),e=Cc.bind(null,e,t,n),t.then(e,e))}function bl(e){do{var t;if((t=13===e.tag)&&(t=null===(t=e.memoizedState)||null!==t.dehydrated),t)return e;e=e.return}while(null!==e);return null}function yl(e,t,n,r,o){return 0==(1&e.mode)?(e===t?e.flags|=65536:(e.flags|=128,n.flags|=131072,n.flags&=-52805,1===n.tag&&(null===n.alternate?n.tag=17:((t=Oa(-1,1)).tag=2,Da(n,t,1))),n.lanes|=1),e):(e.flags|=65536,e.lanes=o,e)}var vl=w.ReactCurrentOwner,wl=!1;function kl(e,t,n,r){t.child=null===e?Za(t,null,n,r):Xa(t,e.child,n,r)}function xl(e,t,n,r,o){n=n.render;var a=t.ref;return _a(t,o),r=Ei(e,t,n,r,a,o),n=_i(),null===e||wl?(aa&&n&&ta(t),t.flags|=1,kl(e,t,r,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~o,Gl(e,t,o))}function Sl(e,t,n,r,o){if(null===e){var a=n.type;return"function"!=typeof a||Pc(a)||void 0!==a.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=Dc(n.type,null,r,t,t.mode,o)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=a,El(e,t,a,r,o))}if(a=e.child,0==(e.lanes&o)){var i=a.memoizedProps;if((n=null!==(n=n.compare)?n:sr)(i,r)&&e.ref===t.ref)return Gl(e,t,o)}return t.flags|=1,(e=Oc(a,r)).ref=t.ref,e.return=t,t.child=e}function El(e,t,n,r,o){if(null!==e){var a=e.memoizedProps;if(sr(a,r)&&e.ref===t.ref){if(wl=!1,t.pendingProps=r=a,0==(e.lanes&o))return t.lanes=e.lanes,Gl(e,t,o);0!=(131072&e.flags)&&(wl=!0)}}return Tl(e,t,n,r,o)}function _l(e,t,n){var r=t.pendingProps,o=r.children,a=null!==e?e.memoizedState:null;if("hidden"===r.mode)if(0==(1&t.mode))t.memoizedState={baseLanes:0,cachePool:null,transitions:null},To(Os,Ps),Ps|=n;else{if(0==(1073741824&n))return e=null!==a?a.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,To(Os,Ps),Ps|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=null!==a?a.baseLanes:n,To(Os,Ps),Ps|=r}else null!==a?(r=a.baseLanes|n,t.memoizedState=null):r=n,To(Os,Ps),Ps|=r;return kl(e,t,o,n),t.child}function Cl(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=512,t.flags|=2097152)}function Tl(e,t,n,r,o){var a=Po(n)?Lo:Ao.current;return a=Ro(t,a),_a(t,o),n=Ei(e,t,n,r,a,o),r=_i(),null===e||wl?(aa&&r&&ta(t),t.flags|=1,kl(e,t,n,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~o,Gl(e,t,o))}function jl(e,t,n,r,o){if(Po(n)){var a=!0;Mo(t)}else a=!1;if(_a(t,o),null===t.stateNode)Hl(e,t),Ha(t,n,r),Va(t,n,r,o),r=!0;else if(null===e){var i=t.stateNode,l=t.memoizedProps;i.props=l;var s=i.context,c=n.contextType;"object"==typeof c&&null!==c?c=Ca(c):c=Ro(t,c=Po(n)?Lo:Ao.current);var u=n.getDerivedStateFromProps,d="function"==typeof u||"function"==typeof i.getSnapshotBeforeUpdate;d||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(l!==r||s!==c)&&Ga(t,i,r,c),La=!1;var p=t.memoizedState;i.state=p,Fa(t,r,i,o),s=t.memoizedState,l!==r||p!==s||No.current||La?("function"==typeof u&&(Ua(t,n,u,r),s=t.memoizedState),(l=La||qa(t,n,l,r,p,s,c))?(d||"function"!=typeof i.UNSAFE_componentWillMount&&"function"!=typeof i.componentWillMount||("function"==typeof i.componentWillMount&&i.componentWillMount(),"function"==typeof i.UNSAFE_componentWillMount&&i.UNSAFE_componentWillMount()),"function"==typeof i.componentDidMount&&(t.flags|=4194308)):("function"==typeof i.componentDidMount&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=s),i.props=r,i.state=s,i.context=c,r=l):("function"==typeof i.componentDidMount&&(t.flags|=4194308),r=!1)}else{i=t.stateNode,Pa(e,t),l=t.memoizedProps,c=t.type===t.elementType?l:ba(t.type,l),i.props=c,d=t.pendingProps,p=i.context,"object"==typeof(s=n.contextType)&&null!==s?s=Ca(s):s=Ro(t,s=Po(n)?Lo:Ao.current);var f=n.getDerivedStateFromProps;(u="function"==typeof f||"function"==typeof i.getSnapshotBeforeUpdate)||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(l!==d||p!==s)&&Ga(t,i,r,s),La=!1,p=t.memoizedState,i.state=p,Fa(t,r,i,o);var g=t.memoizedState;l!==d||p!==g||No.current||La?("function"==typeof f&&(Ua(t,n,f,r),g=t.memoizedState),(c=La||qa(t,n,c,r,p,g,s)||!1)?(u||"function"!=typeof i.UNSAFE_componentWillUpdate&&"function"!=typeof i.componentWillUpdate||("function"==typeof i.componentWillUpdate&&i.componentWillUpdate(r,g,s),"function"==typeof i.UNSAFE_componentWillUpdate&&i.UNSAFE_componentWillUpdate(r,g,s)),"function"==typeof i.componentDidUpdate&&(t.flags|=4),"function"==typeof i.getSnapshotBeforeUpdate&&(t.flags|=1024)):("function"!=typeof i.componentDidUpdate||l===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||l===e.memoizedProps&&p===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=g),i.props=r,i.state=g,i.context=s,r=c):("function"!=typeof i.componentDidUpdate||l===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||l===e.memoizedProps&&p===e.memoizedState||(t.flags|=1024),r=!1)}return Al(e,t,n,r,a,o)}function Al(e,t,n,r,o,a){Cl(e,t);var i=0!=(128&t.flags);if(!r&&!i)return o&&Fo(t,n,!1),Gl(e,t,a);r=t.stateNode,vl.current=t;var l=i&&"function"!=typeof n.getDerivedStateFromError?null:r.render();return t.flags|=1,null!==e&&i?(t.child=Xa(t,e.child,null,a),t.child=Xa(t,null,l,a)):kl(e,t,l,a),t.memoizedState=r.state,o&&Fo(t,n,!0),t.child}function Nl(e){var t=e.stateNode;t.pendingContext?Do(0,t.pendingContext,t.pendingContext!==t.context):t.context&&Do(0,t.context,!1),oi(e,t.containerInfo)}function Ll(e,t,n,r,o){return ga(),ma(o),t.flags|=256,kl(e,t,n,r),t.child}var Rl,Pl,Ol,Dl,Il={dehydrated:null,treeContext:null,retryLane:0};function Ml(e){return{baseLanes:e,cachePool:null,transitions:null}}function Fl(e,t,n){var r,o=t.pendingProps,i=si.current,l=!1,s=0!=(128&t.flags);if((r=s)||(r=(null===e||null!==e.memoizedState)&&0!=(2&i)),r?(l=!0,t.flags&=-129):null!==e&&null===e.memoizedState||(i|=1),To(si,1&i),null===e)return ua(t),null!==(e=t.memoizedState)&&null!==(e=e.dehydrated)?(0==(1&t.mode)?t.lanes=1:"$!"===e.data?t.lanes=8:t.lanes=1073741824,null):(s=o.children,e=o.fallback,l?(o=t.mode,l=t.child,s={mode:"hidden",children:s},0==(1&o)&&null!==l?(l.childLanes=0,l.pendingProps=s):l=Mc(s,o,0,null),e=Ic(e,o,n,null),l.return=t,e.return=t,l.sibling=e,t.child=l,t.child.memoizedState=Ml(n),t.memoizedState=Il,e):zl(t,s));if(null!==(i=e.memoizedState)&&null!==(r=i.dehydrated))return function(e,t,n,r,o,i,l){if(n)return 256&t.flags?(t.flags&=-257,Bl(e,t,l,r=dl(Error(a(422))))):null!==t.memoizedState?(t.child=e.child,t.flags|=128,null):(i=r.fallback,o=t.mode,r=Mc({mode:"visible",children:r.children},o,0,null),(i=Ic(i,o,l,null)).flags|=2,r.return=t,i.return=t,r.sibling=i,t.child=r,0!=(1&t.mode)&&Xa(t,e.child,null,l),t.child.memoizedState=Ml(l),t.memoizedState=Il,i);if(0==(1&t.mode))return Bl(e,t,l,null);if("$!"===o.data){if(r=o.nextSibling&&o.nextSibling.dataset)var s=r.dgst;return r=s,Bl(e,t,l,r=dl(i=Error(a(419)),r,void 0))}if(s=0!=(l&e.childLanes),wl||s){if(null!==(r=Ns)){switch(l&-l){case 4:o=2;break;case 16:o=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:o=32;break;case 536870912:o=268435456;break;default:o=0}0!==(o=0!=(o&(r.suspendedLanes|l))?0:o)&&o!==i.retryLane&&(i.retryLane=o,Na(e,o),rc(r,e,o,-1))}return hc(),Bl(e,t,l,r=dl(Error(a(421))))}return"$?"===o.data?(t.flags|=128,t.child=e.child,t=jc.bind(null,e),o._reactRetry=t,null):(e=i.treeContext,oa=co(o.nextSibling),ra=t,aa=!0,ia=null,null!==e&&(Qo[Yo++]=Xo,Qo[Yo++]=Zo,Qo[Yo++]=Ko,Xo=e.id,Zo=e.overflow,Ko=t),t=zl(t,r.children),t.flags|=4096,t)}(e,t,s,o,r,i,n);if(l){l=o.fallback,s=t.mode,r=(i=e.child).sibling;var c={mode:"hidden",children:o.children};return 0==(1&s)&&t.child!==i?((o=t.child).childLanes=0,o.pendingProps=c,t.deletions=null):(o=Oc(i,c)).subtreeFlags=14680064&i.subtreeFlags,null!==r?l=Oc(r,l):(l=Ic(l,s,n,null)).flags|=2,l.return=t,o.return=t,o.sibling=l,t.child=o,o=l,l=t.child,s=null===(s=e.child.memoizedState)?Ml(n):{baseLanes:s.baseLanes|n,cachePool:null,transitions:s.transitions},l.memoizedState=s,l.childLanes=e.childLanes&~n,t.memoizedState=Il,o}return e=(l=e.child).sibling,o=Oc(l,{mode:"visible",children:o.children}),0==(1&t.mode)&&(o.lanes=n),o.return=t,o.sibling=null,null!==e&&(null===(n=t.deletions)?(t.deletions=[e],t.flags|=16):n.push(e)),t.child=o,t.memoizedState=null,o}function zl(e,t){return(t=Mc({mode:"visible",children:t},e.mode,0,null)).return=e,e.child=t}function Bl(e,t,n,r){return null!==r&&ma(r),Xa(t,e.child,null,n),(e=zl(t,t.pendingProps.children)).flags|=2,t.memoizedState=null,e}function Ul(e,t,n){e.lanes|=t;var r=e.alternate;null!==r&&(r.lanes|=t),Ea(e.return,t,n)}function $l(e,t,n,r,o){var a=e.memoizedState;null===a?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:o}:(a.isBackwards=t,a.rendering=null,a.renderingStartTime=0,a.last=r,a.tail=n,a.tailMode=o)}function ql(e,t,n){var r=t.pendingProps,o=r.revealOrder,a=r.tail;if(kl(e,t,r.children,n),0!=(2&(r=si.current)))r=1&r|2,t.flags|=128;else{if(null!==e&&0!=(128&e.flags))e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&Ul(e,n,t);else if(19===e.tag)Ul(e,n,t);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(To(si,r),0==(1&t.mode))t.memoizedState=null;else switch(o){case"forwards":for(n=t.child,o=null;null!==n;)null!==(e=n.alternate)&&null===ci(e)&&(o=n),n=n.sibling;null===(n=o)?(o=t.child,t.child=null):(o=n.sibling,n.sibling=null),$l(t,!1,o,n,a);break;case"backwards":for(n=null,o=t.child,t.child=null;null!==o;){if(null!==(e=o.alternate)&&null===ci(e)){t.child=o;break}e=o.sibling,o.sibling=n,n=o,o=e}$l(t,!0,n,null,a);break;case"together":$l(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function Hl(e,t){0==(1&t.mode)&&null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2)}function Gl(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),Ms|=t.lanes,0==(n&t.childLanes))return null;if(null!==e&&t.child!==e.child)throw Error(a(153));if(null!==t.child){for(n=Oc(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Oc(e,e.pendingProps)).return=t;n.sibling=null}return t.child}function Vl(e,t){if(!aa)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;null!==n;)null!==n.alternate&&(r=n),n=n.sibling;null===r?t||null===e.tail?e.tail=null:e.tail.sibling=null:r.sibling=null}}function Wl(e){var t=null!==e.alternate&&e.alternate.child===e.child,n=0,r=0;if(t)for(var o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=14680064&o.subtreeFlags,r|=14680064&o.flags,o.return=e,o=o.sibling;else for(o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=o.subtreeFlags,r|=o.flags,o.return=e,o=o.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function Ql(e,t,n){var r=t.pendingProps;switch(na(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Wl(t),null;case 1:case 17:return Po(t.type)&&Oo(),Wl(t),null;case 3:return r=t.stateNode,ai(),Co(No),Co(Ao),di(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),null!==e&&null!==e.child||(pa(t)?t.flags|=4:null===e||e.memoizedState.isDehydrated&&0==(256&t.flags)||(t.flags|=1024,null!==ia&&(lc(ia),ia=null))),Pl(e,t),Wl(t),null;case 5:li(t);var o=ri(ni.current);if(n=t.type,null!==e&&null!=t.stateNode)Ol(e,t,n,r,o),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!r){if(null===t.stateNode)throw Error(a(166));return Wl(t),null}if(e=ri(ei.current),pa(t)){r=t.stateNode,n=t.type;var i=t.memoizedProps;switch(r[fo]=t,r[go]=i,e=0!=(1&t.mode),n){case"dialog":zr("cancel",r),zr("close",r);break;case"iframe":case"object":case"embed":zr("load",r);break;case"video":case"audio":for(o=0;o<Dr.length;o++)zr(Dr[o],r);break;case"source":zr("error",r);break;case"img":case"image":case"link":zr("error",r),zr("load",r);break;case"details":zr("toggle",r);break;case"input":K(r,i),zr("invalid",r);break;case"select":r._wrapperState={wasMultiple:!!i.multiple},zr("invalid",r);break;case"textarea":oe(r,i),zr("invalid",r)}for(var s in ye(n,i),o=null,i)if(i.hasOwnProperty(s)){var c=i[s];"children"===s?"string"==typeof c?r.textContent!==c&&(!0!==i.suppressHydrationWarning&&Zr(r.textContent,c,e),o=["children",c]):"number"==typeof c&&r.textContent!==""+c&&(!0!==i.suppressHydrationWarning&&Zr(r.textContent,c,e),o=["children",""+c]):l.hasOwnProperty(s)&&null!=c&&"onScroll"===s&&zr("scroll",r)}switch(n){case"input":V(r),J(r,i,!0);break;case"textarea":V(r),ie(r);break;case"select":case"option":break;default:"function"==typeof i.onClick&&(r.onclick=Jr)}r=o,t.updateQueue=r,null!==r&&(t.flags|=4)}else{s=9===o.nodeType?o:o.ownerDocument,"http://www.w3.org/1999/xhtml"===e&&(e=le(n)),"http://www.w3.org/1999/xhtml"===e?"script"===n?((e=s.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):"string"==typeof r.is?e=s.createElement(n,{is:r.is}):(e=s.createElement(n),"select"===n&&(s=e,r.multiple?s.multiple=!0:r.size&&(s.size=r.size))):e=s.createElementNS(e,n),e[fo]=t,e[go]=r,Rl(e,t,!1,!1),t.stateNode=e;e:{switch(s=ve(n,r),n){case"dialog":zr("cancel",e),zr("close",e),o=r;break;case"iframe":case"object":case"embed":zr("load",e),o=r;break;case"video":case"audio":for(o=0;o<Dr.length;o++)zr(Dr[o],e);o=r;break;case"source":zr("error",e),o=r;break;case"img":case"image":case"link":zr("error",e),zr("load",e),o=r;break;case"details":zr("toggle",e),o=r;break;case"input":K(e,r),o=Y(e,r),zr("invalid",e);break;case"option":default:o=r;break;case"select":e._wrapperState={wasMultiple:!!r.multiple},o=M({},r,{value:void 0}),zr("invalid",e);break;case"textarea":oe(e,r),o=re(e,r),zr("invalid",e)}for(i in ye(n,o),c=o)if(c.hasOwnProperty(i)){var u=c[i];"style"===i?he(e,u):"dangerouslySetInnerHTML"===i?null!=(u=u?u.__html:void 0)&&de(e,u):"children"===i?"string"==typeof u?("textarea"!==n||""!==u)&&pe(e,u):"number"==typeof u&&pe(e,""+u):"suppressContentEditableWarning"!==i&&"suppressHydrationWarning"!==i&&"autoFocus"!==i&&(l.hasOwnProperty(i)?null!=u&&"onScroll"===i&&zr("scroll",e):null!=u&&v(e,i,u,s))}switch(n){case"input":V(e),J(e,r,!1);break;case"textarea":V(e),ie(e);break;case"option":null!=r.value&&e.setAttribute("value",""+H(r.value));break;case"select":e.multiple=!!r.multiple,null!=(i=r.value)?ne(e,!!r.multiple,i,!1):null!=r.defaultValue&&ne(e,!!r.multiple,r.defaultValue,!0);break;default:"function"==typeof o.onClick&&(e.onclick=Jr)}switch(n){case"button":case"input":case"select":case"textarea":r=!!r.autoFocus;break e;case"img":r=!0;break e;default:r=!1}}r&&(t.flags|=4)}null!==t.ref&&(t.flags|=512,t.flags|=2097152)}return Wl(t),null;case 6:if(e&&null!=t.stateNode)Dl(e,t,e.memoizedProps,r);else{if("string"!=typeof r&&null===t.stateNode)throw Error(a(166));if(n=ri(ni.current),ri(ei.current),pa(t)){if(r=t.stateNode,n=t.memoizedProps,r[fo]=t,(i=r.nodeValue!==n)&&null!==(e=ra))switch(e.tag){case 3:Zr(r.nodeValue,n,0!=(1&e.mode));break;case 5:!0!==e.memoizedProps.suppressHydrationWarning&&Zr(r.nodeValue,n,0!=(1&e.mode))}i&&(t.flags|=4)}else(r=(9===n.nodeType?n:n.ownerDocument).createTextNode(r))[fo]=t,t.stateNode=r}return Wl(t),null;case 13:if(Co(si),r=t.memoizedState,null===e||null!==e.memoizedState&&null!==e.memoizedState.dehydrated){if(aa&&null!==oa&&0!=(1&t.mode)&&0==(128&t.flags))fa(),ga(),t.flags|=98560,i=!1;else if(i=pa(t),null!==r&&null!==r.dehydrated){if(null===e){if(!i)throw Error(a(318));if(!(i=null!==(i=t.memoizedState)?i.dehydrated:null))throw Error(a(317));i[fo]=t}else ga(),0==(128&t.flags)&&(t.memoizedState=null),t.flags|=4;Wl(t),i=!1}else null!==ia&&(lc(ia),ia=null),i=!0;if(!i)return 65536&t.flags?t:null}return 0!=(128&t.flags)?(t.lanes=n,t):((r=null!==r)!==(null!==e&&null!==e.memoizedState)&&r&&(t.child.flags|=8192,0!=(1&t.mode)&&(null===e||0!=(1&si.current)?0===Ds&&(Ds=3):hc())),null!==t.updateQueue&&(t.flags|=4),Wl(t),null);case 4:return ai(),Pl(e,t),null===e&&$r(t.stateNode.containerInfo),Wl(t),null;case 10:return Sa(t.type._context),Wl(t),null;case 19:if(Co(si),null===(i=t.memoizedState))return Wl(t),null;if(r=0!=(128&t.flags),null===(s=i.rendering))if(r)Vl(i,!1);else{if(0!==Ds||null!==e&&0!=(128&e.flags))for(e=t.child;null!==e;){if(null!==(s=ci(e))){for(t.flags|=128,Vl(i,!1),null!==(r=s.updateQueue)&&(t.updateQueue=r,t.flags|=4),t.subtreeFlags=0,r=n,n=t.child;null!==n;)e=r,(i=n).flags&=14680066,null===(s=i.alternate)?(i.childLanes=0,i.lanes=e,i.child=null,i.subtreeFlags=0,i.memoizedProps=null,i.memoizedState=null,i.updateQueue=null,i.dependencies=null,i.stateNode=null):(i.childLanes=s.childLanes,i.lanes=s.lanes,i.child=s.child,i.subtreeFlags=0,i.deletions=null,i.memoizedProps=s.memoizedProps,i.memoizedState=s.memoizedState,i.updateQueue=s.updateQueue,i.type=s.type,e=s.dependencies,i.dependencies=null===e?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return To(si,1&si.current|2),t.child}e=e.sibling}null!==i.tail&&Xe()>qs&&(t.flags|=128,r=!0,Vl(i,!1),t.lanes=4194304)}else{if(!r)if(null!==(e=ci(s))){if(t.flags|=128,r=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),Vl(i,!0),null===i.tail&&"hidden"===i.tailMode&&!s.alternate&&!aa)return Wl(t),null}else 2*Xe()-i.renderingStartTime>qs&&1073741824!==n&&(t.flags|=128,r=!0,Vl(i,!1),t.lanes=4194304);i.isBackwards?(s.sibling=t.child,t.child=s):(null!==(n=i.last)?n.sibling=s:t.child=s,i.last=s)}return null!==i.tail?(t=i.tail,i.rendering=t,i.tail=t.sibling,i.renderingStartTime=Xe(),t.sibling=null,n=si.current,To(si,r?1&n|2:1&n),t):(Wl(t),null);case 22:case 23:return pc(),r=null!==t.memoizedState,null!==e&&null!==e.memoizedState!==r&&(t.flags|=8192),r&&0!=(1&t.mode)?0!=(1073741824&Ps)&&(Wl(t),6&t.subtreeFlags&&(t.flags|=8192)):Wl(t),null;case 24:case 25:return null}throw Error(a(156,t.tag))}function Yl(e,t){switch(na(t),t.tag){case 1:return Po(t.type)&&Oo(),65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 3:return ai(),Co(No),Co(Ao),di(),0!=(65536&(e=t.flags))&&0==(128&e)?(t.flags=-65537&e|128,t):null;case 5:return li(t),null;case 13:if(Co(si),null!==(e=t.memoizedState)&&null!==e.dehydrated){if(null===t.alternate)throw Error(a(340));ga()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 19:return Co(si),null;case 4:return ai(),null;case 10:return Sa(t.type._context),null;case 22:case 23:return pc(),null;default:return null}}Rl=function(e,t){for(var n=t.child;null!==n;){if(5===n.tag||6===n.tag)e.appendChild(n.stateNode);else if(4!==n.tag&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===t)break;for(;null===n.sibling;){if(null===n.return||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},Pl=function(){},Ol=function(e,t,n,r){var o=e.memoizedProps;if(o!==r){e=t.stateNode,ri(ei.current);var a,i=null;switch(n){case"input":o=Y(e,o),r=Y(e,r),i=[];break;case"select":o=M({},o,{value:void 0}),r=M({},r,{value:void 0}),i=[];break;case"textarea":o=re(e,o),r=re(e,r),i=[];break;default:"function"!=typeof o.onClick&&"function"==typeof r.onClick&&(e.onclick=Jr)}for(u in ye(n,r),n=null,o)if(!r.hasOwnProperty(u)&&o.hasOwnProperty(u)&&null!=o[u])if("style"===u){var s=o[u];for(a in s)s.hasOwnProperty(a)&&(n||(n={}),n[a]="")}else"dangerouslySetInnerHTML"!==u&&"children"!==u&&"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&"autoFocus"!==u&&(l.hasOwnProperty(u)?i||(i=[]):(i=i||[]).push(u,null));for(u in r){var c=r[u];if(s=null!=o?o[u]:void 0,r.hasOwnProperty(u)&&c!==s&&(null!=c||null!=s))if("style"===u)if(s){for(a in s)!s.hasOwnProperty(a)||c&&c.hasOwnProperty(a)||(n||(n={}),n[a]="");for(a in c)c.hasOwnProperty(a)&&s[a]!==c[a]&&(n||(n={}),n[a]=c[a])}else n||(i||(i=[]),i.push(u,n)),n=c;else"dangerouslySetInnerHTML"===u?(c=c?c.__html:void 0,s=s?s.__html:void 0,null!=c&&s!==c&&(i=i||[]).push(u,c)):"children"===u?"string"!=typeof c&&"number"!=typeof c||(i=i||[]).push(u,""+c):"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&(l.hasOwnProperty(u)?(null!=c&&"onScroll"===u&&zr("scroll",e),i||s===c||(i=[])):(i=i||[]).push(u,c))}n&&(i=i||[]).push("style",n);var u=i;(t.updateQueue=u)&&(t.flags|=4)}},Dl=function(e,t,n,r){n!==r&&(t.flags|=4)};var Kl=!1,Xl=!1,Zl="function"==typeof WeakSet?WeakSet:Set,Jl=null;function es(e,t){var n=e.ref;if(null!==n)if("function"==typeof n)try{n(null)}catch(r){_c(e,t,r)}else n.current=null}function ts(e,t,n){try{n()}catch(r){_c(e,t,r)}}var ns=!1;function rs(e,t,n){var r=t.updateQueue;if(null!==(r=null!==r?r.lastEffect:null)){var o=r=r.next;do{if((o.tag&e)===e){var a=o.destroy;o.destroy=void 0,void 0!==a&&ts(t,n,a)}o=o.next}while(o!==r)}}function os(e,t){if(null!==(t=null!==(t=t.updateQueue)?t.lastEffect:null)){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function as(e){var t=e.ref;if(null!==t){var n=e.stateNode;e.tag,e=n,"function"==typeof t?t(e):t.current=e}}function is(e){var t=e.alternate;null!==t&&(e.alternate=null,is(t)),e.child=null,e.deletions=null,e.sibling=null,5===e.tag&&(null!==(t=e.stateNode)&&(delete t[fo],delete t[go],delete t[ho],delete t[bo],delete t[yo])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function ls(e){return 5===e.tag||3===e.tag||4===e.tag}function ss(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||ls(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;5!==e.tag&&6!==e.tag&&18!==e.tag;){if(2&e.flags)continue e;if(null===e.child||4===e.tag)continue e;e.child.return=e,e=e.child}if(!(2&e.flags))return e.stateNode}}function cs(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?8===n.nodeType?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(8===n.nodeType?(t=n.parentNode).insertBefore(e,n):(t=n).appendChild(e),null!=(n=n._reactRootContainer)||null!==t.onclick||(t.onclick=Jr));else if(4!==r&&null!==(e=e.child))for(cs(e,t,n),e=e.sibling;null!==e;)cs(e,t,n),e=e.sibling}function us(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==r&&null!==(e=e.child))for(us(e,t,n),e=e.sibling;null!==e;)us(e,t,n),e=e.sibling}var ds=null,ps=!1;function fs(e,t,n){for(n=n.child;null!==n;)gs(e,t,n),n=n.sibling}function gs(e,t,n){if(at&&"function"==typeof at.onCommitFiberUnmount)try{at.onCommitFiberUnmount(ot,n)}catch(l){}switch(n.tag){case 5:Xl||es(n,t);case 6:var r=ds,o=ps;ds=null,fs(e,t,n),ps=o,null!==(ds=r)&&(ps?(e=ds,n=n.stateNode,8===e.nodeType?e.parentNode.removeChild(n):e.removeChild(n)):ds.removeChild(n.stateNode));break;case 18:null!==ds&&(ps?(e=ds,n=n.stateNode,8===e.nodeType?so(e.parentNode,n):1===e.nodeType&&so(e,n),$t(e)):so(ds,n.stateNode));break;case 4:r=ds,o=ps,ds=n.stateNode.containerInfo,ps=!0,fs(e,t,n),ds=r,ps=o;break;case 0:case 11:case 14:case 15:if(!Xl&&(null!==(r=n.updateQueue)&&null!==(r=r.lastEffect))){o=r=r.next;do{var a=o,i=a.destroy;a=a.tag,void 0!==i&&(0!=(2&a)||0!=(4&a))&&ts(n,t,i),o=o.next}while(o!==r)}fs(e,t,n);break;case 1:if(!Xl&&(es(n,t),"function"==typeof(r=n.stateNode).componentWillUnmount))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(l){_c(n,t,l)}fs(e,t,n);break;case 21:fs(e,t,n);break;case 22:1&n.mode?(Xl=(r=Xl)||null!==n.memoizedState,fs(e,t,n),Xl=r):fs(e,t,n);break;default:fs(e,t,n)}}function ms(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new Zl),t.forEach((function(t){var r=Ac.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))}))}}function hs(e,t){var n=t.deletions;if(null!==n)for(var r=0;r<n.length;r++){var o=n[r];try{var i=e,l=t,s=l;e:for(;null!==s;){switch(s.tag){case 5:ds=s.stateNode,ps=!1;break e;case 3:case 4:ds=s.stateNode.containerInfo,ps=!0;break e}s=s.return}if(null===ds)throw Error(a(160));gs(i,l,o),ds=null,ps=!1;var c=o.alternate;null!==c&&(c.return=null),o.return=null}catch(u){_c(o,t,u)}}if(12854&t.subtreeFlags)for(t=t.child;null!==t;)bs(t,e),t=t.sibling}function bs(e,t){var n=e.alternate,r=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(hs(t,e),ys(e),4&r){try{rs(3,e,e.return),os(3,e)}catch(h){_c(e,e.return,h)}try{rs(5,e,e.return)}catch(h){_c(e,e.return,h)}}break;case 1:hs(t,e),ys(e),512&r&&null!==n&&es(n,n.return);break;case 5:if(hs(t,e),ys(e),512&r&&null!==n&&es(n,n.return),32&e.flags){var o=e.stateNode;try{pe(o,"")}catch(h){_c(e,e.return,h)}}if(4&r&&null!=(o=e.stateNode)){var i=e.memoizedProps,l=null!==n?n.memoizedProps:i,s=e.type,c=e.updateQueue;if(e.updateQueue=null,null!==c)try{"input"===s&&"radio"===i.type&&null!=i.name&&X(o,i),ve(s,l);var u=ve(s,i);for(l=0;l<c.length;l+=2){var d=c[l],p=c[l+1];"style"===d?he(o,p):"dangerouslySetInnerHTML"===d?de(o,p):"children"===d?pe(o,p):v(o,d,p,u)}switch(s){case"input":Z(o,i);break;case"textarea":ae(o,i);break;case"select":var f=o._wrapperState.wasMultiple;o._wrapperState.wasMultiple=!!i.multiple;var g=i.value;null!=g?ne(o,!!i.multiple,g,!1):f!==!!i.multiple&&(null!=i.defaultValue?ne(o,!!i.multiple,i.defaultValue,!0):ne(o,!!i.multiple,i.multiple?[]:"",!1))}o[go]=i}catch(h){_c(e,e.return,h)}}break;case 6:if(hs(t,e),ys(e),4&r){if(null===e.stateNode)throw Error(a(162));o=e.stateNode,i=e.memoizedProps;try{o.nodeValue=i}catch(h){_c(e,e.return,h)}}break;case 3:if(hs(t,e),ys(e),4&r&&null!==n&&n.memoizedState.isDehydrated)try{$t(t.containerInfo)}catch(h){_c(e,e.return,h)}break;case 4:default:hs(t,e),ys(e);break;case 13:hs(t,e),ys(e),8192&(o=e.child).flags&&(i=null!==o.memoizedState,o.stateNode.isHidden=i,!i||null!==o.alternate&&null!==o.alternate.memoizedState||($s=Xe())),4&r&&ms(e);break;case 22:if(d=null!==n&&null!==n.memoizedState,1&e.mode?(Xl=(u=Xl)||d,hs(t,e),Xl=u):hs(t,e),ys(e),8192&r){if(u=null!==e.memoizedState,(e.stateNode.isHidden=u)&&!d&&0!=(1&e.mode))for(Jl=e,d=e.child;null!==d;){for(p=Jl=d;null!==Jl;){switch(g=(f=Jl).child,f.tag){case 0:case 11:case 14:case 15:rs(4,f,f.return);break;case 1:es(f,f.return);var m=f.stateNode;if("function"==typeof m.componentWillUnmount){r=f,n=f.return;try{t=r,m.props=t.memoizedProps,m.state=t.memoizedState,m.componentWillUnmount()}catch(h){_c(r,n,h)}}break;case 5:es(f,f.return);break;case 22:if(null!==f.memoizedState){xs(p);continue}}null!==g?(g.return=f,Jl=g):xs(p)}d=d.sibling}e:for(d=null,p=e;;){if(5===p.tag){if(null===d){d=p;try{o=p.stateNode,u?"function"==typeof(i=o.style).setProperty?i.setProperty("display","none","important"):i.display="none":(s=p.stateNode,l=null!=(c=p.memoizedProps.style)&&c.hasOwnProperty("display")?c.display:null,s.style.display=me("display",l))}catch(h){_c(e,e.return,h)}}}else if(6===p.tag){if(null===d)try{p.stateNode.nodeValue=u?"":p.memoizedProps}catch(h){_c(e,e.return,h)}}else if((22!==p.tag&&23!==p.tag||null===p.memoizedState||p===e)&&null!==p.child){p.child.return=p,p=p.child;continue}if(p===e)break e;for(;null===p.sibling;){if(null===p.return||p.return===e)break e;d===p&&(d=null),p=p.return}d===p&&(d=null),p.sibling.return=p.return,p=p.sibling}}break;case 19:hs(t,e),ys(e),4&r&&ms(e);case 21:}}function ys(e){var t=e.flags;if(2&t){try{e:{for(var n=e.return;null!==n;){if(ls(n)){var r=n;break e}n=n.return}throw Error(a(160))}switch(r.tag){case 5:var o=r.stateNode;32&r.flags&&(pe(o,""),r.flags&=-33),us(e,ss(e),o);break;case 3:case 4:var i=r.stateNode.containerInfo;cs(e,ss(e),i);break;default:throw Error(a(161))}}catch(l){_c(e,e.return,l)}e.flags&=-3}4096&t&&(e.flags&=-4097)}function vs(e,t,n){Jl=e,ws(e,t,n)}function ws(e,t,n){for(var r=0!=(1&e.mode);null!==Jl;){var o=Jl,a=o.child;if(22===o.tag&&r){var i=null!==o.memoizedState||Kl;if(!i){var l=o.alternate,s=null!==l&&null!==l.memoizedState||Xl;l=Kl;var c=Xl;if(Kl=i,(Xl=s)&&!c)for(Jl=o;null!==Jl;)s=(i=Jl).child,22===i.tag&&null!==i.memoizedState?Ss(o):null!==s?(s.return=i,Jl=s):Ss(o);for(;null!==a;)Jl=a,ws(a,t,n),a=a.sibling;Jl=o,Kl=l,Xl=c}ks(e)}else 0!=(8772&o.subtreeFlags)&&null!==a?(a.return=o,Jl=a):ks(e)}}function ks(e){for(;null!==Jl;){var t=Jl;if(0!=(8772&t.flags)){var n=t.alternate;try{if(0!=(8772&t.flags))switch(t.tag){case 0:case 11:case 15:Xl||os(5,t);break;case 1:var r=t.stateNode;if(4&t.flags&&!Xl)if(null===n)r.componentDidMount();else{var o=t.elementType===t.type?n.memoizedProps:ba(t.type,n.memoizedProps);r.componentDidUpdate(o,n.memoizedState,r.__reactInternalSnapshotBeforeUpdate)}var i=t.updateQueue;null!==i&&za(t,i,r);break;case 3:var l=t.updateQueue;if(null!==l){if(n=null,null!==t.child)switch(t.child.tag){case 5:case 1:n=t.child.stateNode}za(t,l,n)}break;case 5:var s=t.stateNode;if(null===n&&4&t.flags){n=s;var c=t.memoizedProps;switch(t.type){case"button":case"input":case"select":case"textarea":c.autoFocus&&n.focus();break;case"img":c.src&&(n.src=c.src)}}break;case 6:case 4:case 12:case 19:case 17:case 21:case 22:case 23:case 25:break;case 13:if(null===t.memoizedState){var u=t.alternate;if(null!==u){var d=u.memoizedState;if(null!==d){var p=d.dehydrated;null!==p&&$t(p)}}}break;default:throw Error(a(163))}Xl||512&t.flags&&as(t)}catch(f){_c(t,t.return,f)}}if(t===e){Jl=null;break}if(null!==(n=t.sibling)){n.return=t.return,Jl=n;break}Jl=t.return}}function xs(e){for(;null!==Jl;){var t=Jl;if(t===e){Jl=null;break}var n=t.sibling;if(null!==n){n.return=t.return,Jl=n;break}Jl=t.return}}function Ss(e){for(;null!==Jl;){var t=Jl;try{switch(t.tag){case 0:case 11:case 15:var n=t.return;try{os(4,t)}catch(s){_c(t,n,s)}break;case 1:var r=t.stateNode;if("function"==typeof r.componentDidMount){var o=t.return;try{r.componentDidMount()}catch(s){_c(t,o,s)}}var a=t.return;try{as(t)}catch(s){_c(t,a,s)}break;case 5:var i=t.return;try{as(t)}catch(s){_c(t,i,s)}}}catch(s){_c(t,t.return,s)}if(t===e){Jl=null;break}var l=t.sibling;if(null!==l){l.return=t.return,Jl=l;break}Jl=t.return}}var Es,_s=Math.ceil,Cs=w.ReactCurrentDispatcher,Ts=w.ReactCurrentOwner,js=w.ReactCurrentBatchConfig,As=0,Ns=null,Ls=null,Rs=0,Ps=0,Os=_o(0),Ds=0,Is=null,Ms=0,Fs=0,zs=0,Bs=null,Us=null,$s=0,qs=1/0,Hs=null,Gs=!1,Vs=null,Ws=null,Qs=!1,Ys=null,Ks=0,Xs=0,Zs=null,Js=-1,ec=0;function tc(){return 0!=(6&As)?Xe():-1!==Js?Js:Js=Xe()}function nc(e){return 0==(1&e.mode)?1:0!=(2&As)&&0!==Rs?Rs&-Rs:null!==ha.transition?(0===ec&&(ec=mt()),ec):0!==(e=vt)?e:e=void 0===(e=window.event)?16:Kt(e.type)}function rc(e,t,n,r){if(50<Xs)throw Xs=0,Zs=null,Error(a(185));bt(e,n,r),0!=(2&As)&&e===Ns||(e===Ns&&(0==(2&As)&&(Fs|=n),4===Ds&&sc(e,Rs)),oc(e,r),1===n&&0===As&&0==(1&t.mode)&&(qs=Xe()+500,Bo&&qo()))}function oc(e,t){var n=e.callbackNode;!function(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,o=e.expirationTimes,a=e.pendingLanes;0<a;){var i=31-it(a),l=1<<i,s=o[i];-1===s?0!=(l&n)&&0==(l&r)||(o[i]=ft(l,t)):s<=t&&(e.expiredLanes|=l),a&=~l}}(e,t);var r=pt(e,e===Ns?Rs:0);if(0===r)null!==n&&Qe(n),e.callbackNode=null,e.callbackPriority=0;else if(t=r&-r,e.callbackPriority!==t){if(null!=n&&Qe(n),1===t)0===e.tag?function(e){Bo=!0,$o(e)}(cc.bind(null,e)):$o(cc.bind(null,e)),io((function(){0==(6&As)&&qo()})),n=null;else{switch(wt(r)){case 1:n=Je;break;case 4:n=et;break;case 16:default:n=tt;break;case 536870912:n=rt}n=Nc(n,ac.bind(null,e))}e.callbackPriority=t,e.callbackNode=n}}function ac(e,t){if(Js=-1,ec=0,0!=(6&As))throw Error(a(327));var n=e.callbackNode;if(Sc()&&e.callbackNode!==n)return null;var r=pt(e,e===Ns?Rs:0);if(0===r)return null;if(0!=(30&r)||0!=(r&e.expiredLanes)||t)t=bc(e,r);else{t=r;var o=As;As|=2;var i=mc();for(Ns===e&&Rs===t||(Hs=null,qs=Xe()+500,fc(e,t));;)try{vc();break}catch(s){gc(e,s)}xa(),Cs.current=i,As=o,null!==Ls?t=0:(Ns=null,Rs=0,t=Ds)}if(0!==t){if(2===t&&(0!==(o=gt(e))&&(r=o,t=ic(e,o))),1===t)throw n=Is,fc(e,0),sc(e,r),oc(e,Xe()),n;if(6===t)sc(e,r);else{if(o=e.current.alternate,0==(30&r)&&!function(e){for(var t=e;;){if(16384&t.flags){var n=t.updateQueue;if(null!==n&&null!==(n=n.stores))for(var r=0;r<n.length;r++){var o=n[r],a=o.getSnapshot;o=o.value;try{if(!lr(a(),o))return!1}catch(l){return!1}}}if(n=t.child,16384&t.subtreeFlags&&null!==n)n.return=t,t=n;else{if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}(o)&&(2===(t=bc(e,r))&&(0!==(i=gt(e))&&(r=i,t=ic(e,i))),1===t))throw n=Is,fc(e,0),sc(e,r),oc(e,Xe()),n;switch(e.finishedWork=o,e.finishedLanes=r,t){case 0:case 1:throw Error(a(345));case 2:case 5:xc(e,Us,Hs);break;case 3:if(sc(e,r),(130023424&r)===r&&10<(t=$s+500-Xe())){if(0!==pt(e,0))break;if(((o=e.suspendedLanes)&r)!==r){tc(),e.pingedLanes|=e.suspendedLanes&o;break}e.timeoutHandle=ro(xc.bind(null,e,Us,Hs),t);break}xc(e,Us,Hs);break;case 4:if(sc(e,r),(4194240&r)===r)break;for(t=e.eventTimes,o=-1;0<r;){var l=31-it(r);i=1<<l,(l=t[l])>o&&(o=l),r&=~i}if(r=o,10<(r=(120>(r=Xe()-r)?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*_s(r/1960))-r)){e.timeoutHandle=ro(xc.bind(null,e,Us,Hs),r);break}xc(e,Us,Hs);break;default:throw Error(a(329))}}}return oc(e,Xe()),e.callbackNode===n?ac.bind(null,e):null}function ic(e,t){var n=Bs;return e.current.memoizedState.isDehydrated&&(fc(e,t).flags|=256),2!==(e=bc(e,t))&&(t=Us,Us=n,null!==t&&lc(t)),e}function lc(e){null===Us?Us=e:Us.push.apply(Us,e)}function sc(e,t){for(t&=~zs,t&=~Fs,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-it(t),r=1<<n;e[n]=-1,t&=~r}}function cc(e){if(0!=(6&As))throw Error(a(327));Sc();var t=pt(e,0);if(0==(1&t))return oc(e,Xe()),null;var n=bc(e,t);if(0!==e.tag&&2===n){var r=gt(e);0!==r&&(t=r,n=ic(e,r))}if(1===n)throw n=Is,fc(e,0),sc(e,t),oc(e,Xe()),n;if(6===n)throw Error(a(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,xc(e,Us,Hs),oc(e,Xe()),null}function uc(e,t){var n=As;As|=1;try{return e(t)}finally{0===(As=n)&&(qs=Xe()+500,Bo&&qo())}}function dc(e){null!==Ys&&0===Ys.tag&&0==(6&As)&&Sc();var t=As;As|=1;var n=js.transition,r=vt;try{if(js.transition=null,vt=1,e)return e()}finally{vt=r,js.transition=n,0==(6&(As=t))&&qo()}}function pc(){Ps=Os.current,Co(Os)}function fc(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,oo(n)),null!==Ls)for(n=Ls.return;null!==n;){var r=n;switch(na(r),r.tag){case 1:null!=(r=r.type.childContextTypes)&&Oo();break;case 3:ai(),Co(No),Co(Ao),di();break;case 5:li(r);break;case 4:ai();break;case 13:case 19:Co(si);break;case 10:Sa(r.type._context);break;case 22:case 23:pc()}n=n.return}if(Ns=e,Ls=e=Oc(e.current,null),Rs=Ps=t,Ds=0,Is=null,zs=Fs=Ms=0,Us=Bs=null,null!==Ta){for(t=0;t<Ta.length;t++)if(null!==(r=(n=Ta[t]).interleaved)){n.interleaved=null;var o=r.next,a=n.pending;if(null!==a){var i=a.next;a.next=o,r.next=i}n.pending=r}Ta=null}return e}function gc(e,t){for(;;){var n=Ls;try{if(xa(),pi.current=il,yi){for(var r=mi.memoizedState;null!==r;){var o=r.queue;null!==o&&(o.pending=null),r=r.next}yi=!1}if(gi=0,bi=hi=mi=null,vi=!1,wi=0,Ts.current=null,null===n||null===n.return){Ds=1,Is=t,Ls=null;break}e:{var i=e,l=n.return,s=n,c=t;if(t=Rs,s.flags|=32768,null!==c&&"object"==typeof c&&"function"==typeof c.then){var u=c,d=s,p=d.tag;if(0==(1&d.mode)&&(0===p||11===p||15===p)){var f=d.alternate;f?(d.updateQueue=f.updateQueue,d.memoizedState=f.memoizedState,d.lanes=f.lanes):(d.updateQueue=null,d.memoizedState=null)}var g=bl(l);if(null!==g){g.flags&=-257,yl(g,l,s,0,t),1&g.mode&&hl(i,u,t),c=u;var m=(t=g).updateQueue;if(null===m){var h=new Set;h.add(c),t.updateQueue=h}else m.add(c);break e}if(0==(1&t)){hl(i,u,t),hc();break e}c=Error(a(426))}else if(aa&&1&s.mode){var b=bl(l);if(null!==b){0==(65536&b.flags)&&(b.flags|=256),yl(b,l,s,0,t),ma(ul(c,s));break e}}i=c=ul(c,s),4!==Ds&&(Ds=2),null===Bs?Bs=[i]:Bs.push(i),i=l;do{switch(i.tag){case 3:i.flags|=65536,t&=-t,i.lanes|=t,Ma(i,gl(0,c,t));break e;case 1:s=c;var y=i.type,v=i.stateNode;if(0==(128&i.flags)&&("function"==typeof y.getDerivedStateFromError||null!==v&&"function"==typeof v.componentDidCatch&&(null===Ws||!Ws.has(v)))){i.flags|=65536,t&=-t,i.lanes|=t,Ma(i,ml(i,s,t));break e}}i=i.return}while(null!==i)}kc(n)}catch(w){t=w,Ls===n&&null!==n&&(Ls=n=n.return);continue}break}}function mc(){var e=Cs.current;return Cs.current=il,null===e?il:e}function hc(){0!==Ds&&3!==Ds&&2!==Ds||(Ds=4),null===Ns||0==(268435455&Ms)&&0==(268435455&Fs)||sc(Ns,Rs)}function bc(e,t){var n=As;As|=2;var r=mc();for(Ns===e&&Rs===t||(Hs=null,fc(e,t));;)try{yc();break}catch(o){gc(e,o)}if(xa(),As=n,Cs.current=r,null!==Ls)throw Error(a(261));return Ns=null,Rs=0,Ds}function yc(){for(;null!==Ls;)wc(Ls)}function vc(){for(;null!==Ls&&!Ye();)wc(Ls)}function wc(e){var t=Es(e.alternate,e,Ps);e.memoizedProps=e.pendingProps,null===t?kc(e):Ls=t,Ts.current=null}function kc(e){var t=e;do{var n=t.alternate;if(e=t.return,0==(32768&t.flags)){if(null!==(n=Ql(n,t,Ps)))return void(Ls=n)}else{if(null!==(n=Yl(n,t)))return n.flags&=32767,void(Ls=n);if(null===e)return Ds=6,void(Ls=null);e.flags|=32768,e.subtreeFlags=0,e.deletions=null}if(null!==(t=t.sibling))return void(Ls=t);Ls=t=e}while(null!==t);0===Ds&&(Ds=5)}function xc(e,t,n){var r=vt,o=js.transition;try{js.transition=null,vt=1,function(e,t,n,r){do{Sc()}while(null!==Ys);if(0!=(6&As))throw Error(a(327));n=e.finishedWork;var o=e.finishedLanes;if(null===n)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(a(177));e.callbackNode=null,e.callbackPriority=0;var i=n.lanes|n.childLanes;if(function(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0<n;){var o=31-it(n),a=1<<o;t[o]=0,r[o]=-1,e[o]=-1,n&=~a}}(e,i),e===Ns&&(Ls=Ns=null,Rs=0),0==(2064&n.subtreeFlags)&&0==(2064&n.flags)||Qs||(Qs=!0,Nc(tt,(function(){return Sc(),null}))),i=0!=(15990&n.flags),0!=(15990&n.subtreeFlags)||i){i=js.transition,js.transition=null;var l=vt;vt=1;var s=As;As|=4,Ts.current=null,function(e,t){if(eo=Ht,fr(e=pr())){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{var r=(n=(n=e.ownerDocument)&&n.defaultView||window).getSelection&&n.getSelection();if(r&&0!==r.rangeCount){n=r.anchorNode;var o=r.anchorOffset,i=r.focusNode;r=r.focusOffset;try{n.nodeType,i.nodeType}catch(k){n=null;break e}var l=0,s=-1,c=-1,u=0,d=0,p=e,f=null;t:for(;;){for(var g;p!==n||0!==o&&3!==p.nodeType||(s=l+o),p!==i||0!==r&&3!==p.nodeType||(c=l+r),3===p.nodeType&&(l+=p.nodeValue.length),null!==(g=p.firstChild);)f=p,p=g;for(;;){if(p===e)break t;if(f===n&&++u===o&&(s=l),f===i&&++d===r&&(c=l),null!==(g=p.nextSibling))break;f=(p=f).parentNode}p=g}n=-1===s||-1===c?null:{start:s,end:c}}else n=null}n=n||{start:0,end:0}}else n=null;for(to={focusedElem:e,selectionRange:n},Ht=!1,Jl=t;null!==Jl;)if(e=(t=Jl).child,0!=(1028&t.subtreeFlags)&&null!==e)e.return=t,Jl=e;else for(;null!==Jl;){t=Jl;try{var m=t.alternate;if(0!=(1024&t.flags))switch(t.tag){case 0:case 11:case 15:case 5:case 6:case 4:case 17:break;case 1:if(null!==m){var h=m.memoizedProps,b=m.memoizedState,y=t.stateNode,v=y.getSnapshotBeforeUpdate(t.elementType===t.type?h:ba(t.type,h),b);y.__reactInternalSnapshotBeforeUpdate=v}break;case 3:var w=t.stateNode.containerInfo;1===w.nodeType?w.textContent="":9===w.nodeType&&w.documentElement&&w.removeChild(w.documentElement);break;default:throw Error(a(163))}}catch(k){_c(t,t.return,k)}if(null!==(e=t.sibling)){e.return=t.return,Jl=e;break}Jl=t.return}m=ns,ns=!1}(e,n),bs(n,e),gr(to),Ht=!!eo,to=eo=null,e.current=n,vs(n,e,o),Ke(),As=s,vt=l,js.transition=i}else e.current=n;if(Qs&&(Qs=!1,Ys=e,Ks=o),i=e.pendingLanes,0===i&&(Ws=null),function(e){if(at&&"function"==typeof at.onCommitFiberRoot)try{at.onCommitFiberRoot(ot,e,void 0,128==(128&e.current.flags))}catch(t){}}(n.stateNode),oc(e,Xe()),null!==t)for(r=e.onRecoverableError,n=0;n<t.length;n++)o=t[n],r(o.value,{componentStack:o.stack,digest:o.digest});if(Gs)throw Gs=!1,e=Vs,Vs=null,e;0!=(1&Ks)&&0!==e.tag&&Sc(),i=e.pendingLanes,0!=(1&i)?e===Zs?Xs++:(Xs=0,Zs=e):Xs=0,qo()}(e,t,n,r)}finally{js.transition=o,vt=r}return null}function Sc(){if(null!==Ys){var e=wt(Ks),t=js.transition,n=vt;try{if(js.transition=null,vt=16>e?16:e,null===Ys)var r=!1;else{if(e=Ys,Ys=null,Ks=0,0!=(6&As))throw Error(a(331));var o=As;for(As|=4,Jl=e.current;null!==Jl;){var i=Jl,l=i.child;if(0!=(16&Jl.flags)){var s=i.deletions;if(null!==s){for(var c=0;c<s.length;c++){var u=s[c];for(Jl=u;null!==Jl;){var d=Jl;switch(d.tag){case 0:case 11:case 15:rs(8,d,i)}var p=d.child;if(null!==p)p.return=d,Jl=p;else for(;null!==Jl;){var f=(d=Jl).sibling,g=d.return;if(is(d),d===u){Jl=null;break}if(null!==f){f.return=g,Jl=f;break}Jl=g}}}var m=i.alternate;if(null!==m){var h=m.child;if(null!==h){m.child=null;do{var b=h.sibling;h.sibling=null,h=b}while(null!==h)}}Jl=i}}if(0!=(2064&i.subtreeFlags)&&null!==l)l.return=i,Jl=l;else e:for(;null!==Jl;){if(0!=(2048&(i=Jl).flags))switch(i.tag){case 0:case 11:case 15:rs(9,i,i.return)}var y=i.sibling;if(null!==y){y.return=i.return,Jl=y;break e}Jl=i.return}}var v=e.current;for(Jl=v;null!==Jl;){var w=(l=Jl).child;if(0!=(2064&l.subtreeFlags)&&null!==w)w.return=l,Jl=w;else e:for(l=v;null!==Jl;){if(0!=(2048&(s=Jl).flags))try{switch(s.tag){case 0:case 11:case 15:os(9,s)}}catch(x){_c(s,s.return,x)}if(s===l){Jl=null;break e}var k=s.sibling;if(null!==k){k.return=s.return,Jl=k;break e}Jl=s.return}}if(As=o,qo(),at&&"function"==typeof at.onPostCommitFiberRoot)try{at.onPostCommitFiberRoot(ot,e)}catch(x){}r=!0}return r}finally{vt=n,js.transition=t}}return!1}function Ec(e,t,n){e=Da(e,t=gl(0,t=ul(n,t),1),1),t=tc(),null!==e&&(bt(e,1,t),oc(e,t))}function _c(e,t,n){if(3===e.tag)Ec(e,e,n);else for(;null!==t;){if(3===t.tag){Ec(t,e,n);break}if(1===t.tag){var r=t.stateNode;if("function"==typeof t.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===Ws||!Ws.has(r))){t=Da(t,e=ml(t,e=ul(n,e),1),1),e=tc(),null!==t&&(bt(t,1,e),oc(t,e));break}}t=t.return}}function Cc(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),t=tc(),e.pingedLanes|=e.suspendedLanes&n,Ns===e&&(Rs&n)===n&&(4===Ds||3===Ds&&(130023424&Rs)===Rs&&500>Xe()-$s?fc(e,0):zs|=n),oc(e,t)}function Tc(e,t){0===t&&(0==(1&e.mode)?t=1:(t=ut,0==(130023424&(ut<<=1))&&(ut=4194304)));var n=tc();null!==(e=Na(e,t))&&(bt(e,t,n),oc(e,n))}function jc(e){var t=e.memoizedState,n=0;null!==t&&(n=t.retryLane),Tc(e,n)}function Ac(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,o=e.memoizedState;null!==o&&(n=o.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(a(314))}null!==r&&r.delete(t),Tc(e,n)}function Nc(e,t){return We(e,t)}function Lc(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Rc(e,t,n,r){return new Lc(e,t,n,r)}function Pc(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Oc(e,t){var n=e.alternate;return null===n?((n=Rc(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=14680064&e.flags,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Dc(e,t,n,r,o,i){var l=2;if(r=e,"function"==typeof e)Pc(e)&&(l=1);else if("string"==typeof e)l=5;else e:switch(e){case S:return Ic(n.children,o,i,t);case E:l=8,o|=8;break;case _:return(e=Rc(12,n,t,2|o)).elementType=_,e.lanes=i,e;case A:return(e=Rc(13,n,t,o)).elementType=A,e.lanes=i,e;case N:return(e=Rc(19,n,t,o)).elementType=N,e.lanes=i,e;case P:return Mc(n,o,i,t);default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case C:l=10;break e;case T:l=9;break e;case j:l=11;break e;case L:l=14;break e;case R:l=16,r=null;break e}throw Error(a(130,null==e?e:typeof e,""))}return(t=Rc(l,n,t,o)).elementType=e,t.type=r,t.lanes=i,t}function Ic(e,t,n,r){return(e=Rc(7,e,r,t)).lanes=n,e}function Mc(e,t,n,r){return(e=Rc(22,e,r,t)).elementType=P,e.lanes=n,e.stateNode={isHidden:!1},e}function Fc(e,t,n){return(e=Rc(6,e,null,t)).lanes=n,e}function zc(e,t,n){return(t=Rc(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Bc(e,t,n,r,o){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=ht(0),this.expirationTimes=ht(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=ht(0),this.identifierPrefix=r,this.onRecoverableError=o,this.mutableSourceEagerHydrationData=null}function Uc(e,t,n,r,o,a,i,l,s){return e=new Bc(e,t,n,l,s),1===t?(t=1,!0===a&&(t|=8)):t=0,a=Rc(3,null,null,t),e.current=a,a.stateNode=e,a.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Ra(a),e}function $c(e){if(!e)return jo;e:{if($e(e=e._reactInternals)!==e||1!==e.tag)throw Error(a(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(Po(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(null!==t);throw Error(a(171))}if(1===e.tag){var n=e.type;if(Po(n))return Io(e,n,t)}return t}function qc(e,t,n,r,o,a,i,l,s){return(e=Uc(n,r,!0,e,0,a,0,l,s)).context=$c(null),n=e.current,(a=Oa(r=tc(),o=nc(n))).callback=null!=t?t:null,Da(n,a,o),e.current.lanes=o,bt(e,o,r),oc(e,r),e}function Hc(e,t,n,r){var o=t.current,a=tc(),i=nc(o);return n=$c(n),null===t.context?t.context=n:t.pendingContext=n,(t=Oa(a,i)).payload={element:e},null!==(r=void 0===r?null:r)&&(t.callback=r),null!==(e=Da(o,t,i))&&(rc(e,o,i,a),Ia(e,o,i)),i}function Gc(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function Vc(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function Wc(e,t){Vc(e,t),(e=e.alternate)&&Vc(e,t)}Es=function(e,t,n){if(null!==e)if(e.memoizedProps!==t.pendingProps||No.current)wl=!0;else{if(0==(e.lanes&n)&&0==(128&t.flags))return wl=!1,function(e,t,n){switch(t.tag){case 3:Nl(t),ga();break;case 5:ii(t);break;case 1:Po(t.type)&&Mo(t);break;case 4:oi(t,t.stateNode.containerInfo);break;case 10:var r=t.type._context,o=t.memoizedProps.value;To(ya,r._currentValue),r._currentValue=o;break;case 13:if(null!==(r=t.memoizedState))return null!==r.dehydrated?(To(si,1&si.current),t.flags|=128,null):0!=(n&t.child.childLanes)?Fl(e,t,n):(To(si,1&si.current),null!==(e=Gl(e,t,n))?e.sibling:null);To(si,1&si.current);break;case 19:if(r=0!=(n&t.childLanes),0!=(128&e.flags)){if(r)return ql(e,t,n);t.flags|=128}if(null!==(o=t.memoizedState)&&(o.rendering=null,o.tail=null,o.lastEffect=null),To(si,si.current),r)break;return null;case 22:case 23:return t.lanes=0,_l(e,t,n)}return Gl(e,t,n)}(e,t,n);wl=0!=(131072&e.flags)}else wl=!1,aa&&0!=(1048576&t.flags)&&ea(t,Wo,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;Hl(e,t),e=t.pendingProps;var o=Ro(t,Ao.current);_a(t,n),o=Ei(null,t,r,e,o,n);var i=_i();return t.flags|=1,"object"==typeof o&&null!==o&&"function"==typeof o.render&&void 0===o.$$typeof?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Po(r)?(i=!0,Mo(t)):i=!1,t.memoizedState=null!==o.state&&void 0!==o.state?o.state:null,Ra(t),o.updater=$a,t.stateNode=o,o._reactInternals=t,Va(t,r,e,n),t=Al(null,t,r,!0,i,n)):(t.tag=0,aa&&i&&ta(t),kl(null,t,o,n),t=t.child),t;case 16:r=t.elementType;e:{switch(Hl(e,t),e=t.pendingProps,r=(o=r._init)(r._payload),t.type=r,o=t.tag=function(e){if("function"==typeof e)return Pc(e)?1:0;if(null!=e){if((e=e.$$typeof)===j)return 11;if(e===L)return 14}return 2}(r),e=ba(r,e),o){case 0:t=Tl(null,t,r,e,n);break e;case 1:t=jl(null,t,r,e,n);break e;case 11:t=xl(null,t,r,e,n);break e;case 14:t=Sl(null,t,r,ba(r.type,e),n);break e}throw Error(a(306,r,""))}return t;case 0:return r=t.type,o=t.pendingProps,Tl(e,t,r,o=t.elementType===r?o:ba(r,o),n);case 1:return r=t.type,o=t.pendingProps,jl(e,t,r,o=t.elementType===r?o:ba(r,o),n);case 3:e:{if(Nl(t),null===e)throw Error(a(387));r=t.pendingProps,o=(i=t.memoizedState).element,Pa(e,t),Fa(t,r,null,n);var l=t.memoizedState;if(r=l.element,i.isDehydrated){if(i={element:r,isDehydrated:!1,cache:l.cache,pendingSuspenseBoundaries:l.pendingSuspenseBoundaries,transitions:l.transitions},t.updateQueue.baseState=i,t.memoizedState=i,256&t.flags){t=Ll(e,t,r,n,o=ul(Error(a(423)),t));break e}if(r!==o){t=Ll(e,t,r,n,o=ul(Error(a(424)),t));break e}for(oa=co(t.stateNode.containerInfo.firstChild),ra=t,aa=!0,ia=null,n=Za(t,null,r,n),t.child=n;n;)n.flags=-3&n.flags|4096,n=n.sibling}else{if(ga(),r===o){t=Gl(e,t,n);break e}kl(e,t,r,n)}t=t.child}return t;case 5:return ii(t),null===e&&ua(t),r=t.type,o=t.pendingProps,i=null!==e?e.memoizedProps:null,l=o.children,no(r,o)?l=null:null!==i&&no(r,i)&&(t.flags|=32),Cl(e,t),kl(e,t,l,n),t.child;case 6:return null===e&&ua(t),null;case 13:return Fl(e,t,n);case 4:return oi(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=Xa(t,null,r,n):kl(e,t,r,n),t.child;case 11:return r=t.type,o=t.pendingProps,xl(e,t,r,o=t.elementType===r?o:ba(r,o),n);case 7:return kl(e,t,t.pendingProps,n),t.child;case 8:case 12:return kl(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,o=t.pendingProps,i=t.memoizedProps,l=o.value,To(ya,r._currentValue),r._currentValue=l,null!==i)if(lr(i.value,l)){if(i.children===o.children&&!No.current){t=Gl(e,t,n);break e}}else for(null!==(i=t.child)&&(i.return=t);null!==i;){var s=i.dependencies;if(null!==s){l=i.child;for(var c=s.firstContext;null!==c;){if(c.context===r){if(1===i.tag){(c=Oa(-1,n&-n)).tag=2;var u=i.updateQueue;if(null!==u){var d=(u=u.shared).pending;null===d?c.next=c:(c.next=d.next,d.next=c),u.pending=c}}i.lanes|=n,null!==(c=i.alternate)&&(c.lanes|=n),Ea(i.return,n,t),s.lanes|=n;break}c=c.next}}else if(10===i.tag)l=i.type===t.type?null:i.child;else if(18===i.tag){if(null===(l=i.return))throw Error(a(341));l.lanes|=n,null!==(s=l.alternate)&&(s.lanes|=n),Ea(l,n,t),l=i.sibling}else l=i.child;if(null!==l)l.return=i;else for(l=i;null!==l;){if(l===t){l=null;break}if(null!==(i=l.sibling)){i.return=l.return,l=i;break}l=l.return}i=l}kl(e,t,o.children,n),t=t.child}return t;case 9:return o=t.type,r=t.pendingProps.children,_a(t,n),r=r(o=Ca(o)),t.flags|=1,kl(e,t,r,n),t.child;case 14:return o=ba(r=t.type,t.pendingProps),Sl(e,t,r,o=ba(r.type,o),n);case 15:return El(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:ba(r,o),Hl(e,t),t.tag=1,Po(r)?(e=!0,Mo(t)):e=!1,_a(t,n),Ha(t,r,o),Va(t,r,o,n),Al(null,t,r,!0,e,n);case 19:return ql(e,t,n);case 22:return _l(e,t,n)}throw Error(a(156,t.tag))};var Qc="function"==typeof reportError?reportError:function(e){console.error(e)};function Yc(e){this._internalRoot=e}function Kc(e){this._internalRoot=e}function Xc(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType)}function Zc(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function Jc(){}function eu(e,t,n,r,o){var a=n._reactRootContainer;if(a){var i=a;if("function"==typeof o){var l=o;o=function(){var e=Gc(i);l.call(e)}}Hc(t,i,e,o)}else i=function(e,t,n,r,o){if(o){if("function"==typeof r){var a=r;r=function(){var e=Gc(i);a.call(e)}}var i=qc(t,r,e,0,null,!1,0,"",Jc);return e._reactRootContainer=i,e[mo]=i.current,$r(8===e.nodeType?e.parentNode:e),dc(),i}for(;o=e.lastChild;)e.removeChild(o);if("function"==typeof r){var l=r;r=function(){var e=Gc(s);l.call(e)}}var s=Uc(e,0,!1,null,0,!1,0,"",Jc);return e._reactRootContainer=s,e[mo]=s.current,$r(8===e.nodeType?e.parentNode:e),dc((function(){Hc(t,s,n,r)})),s}(n,t,e,o,r);return Gc(i)}Kc.prototype.render=Yc.prototype.render=function(e){var t=this._internalRoot;if(null===t)throw Error(a(409));Hc(e,t,null,null)},Kc.prototype.unmount=Yc.prototype.unmount=function(){var e=this._internalRoot;if(null!==e){this._internalRoot=null;var t=e.containerInfo;dc((function(){Hc(null,e,null,null)})),t[mo]=null}},Kc.prototype.unstable_scheduleHydration=function(e){if(e){var t=Et();e={blockedOn:null,target:e,priority:t};for(var n=0;n<Pt.length&&0!==t&&t<Pt[n].priority;n++);Pt.splice(n,0,e),0===n&&Mt(e)}},kt=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var n=dt(t.pendingLanes);0!==n&&(yt(t,1|n),oc(t,Xe()),0==(6&As)&&(qs=Xe()+500,qo()))}break;case 13:dc((function(){var t=Na(e,1);if(null!==t){var n=tc();rc(t,e,1,n)}})),Wc(e,1)}},xt=function(e){if(13===e.tag){var t=Na(e,134217728);if(null!==t)rc(t,e,134217728,tc());Wc(e,134217728)}},St=function(e){if(13===e.tag){var t=nc(e),n=Na(e,t);if(null!==n)rc(n,e,t,tc());Wc(e,t)}},Et=function(){return vt},_t=function(e,t){var n=vt;try{return vt=e,t()}finally{vt=n}},xe=function(e,t,n){switch(t){case"input":if(Z(e,n),t=n.name,"radio"===n.type&&null!=t){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<n.length;t++){var r=n[t];if(r!==e&&r.form===e.form){var o=xo(r);if(!o)throw Error(a(90));W(r),Z(r,o)}}}break;case"textarea":ae(e,n);break;case"select":null!=(t=n.value)&&ne(e,!!n.multiple,t,!1)}},je=uc,Ae=dc;var tu={usingClientEntryPoint:!1,Events:[wo,ko,xo,Ce,Te,uc]},nu={findFiberByHostInstance:vo,bundleType:0,version:"18.2.0",rendererPackageName:"react-dom"},ru={bundleType:nu.bundleType,version:nu.version,rendererPackageName:nu.rendererPackageName,rendererConfig:nu.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:w.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=Ge(e))?null:e.stateNode},findFiberByHostInstance:nu.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.2.0-next-9e3b772b8-20220608"};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var ou=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!ou.isDisabled&&ou.supportsFiber)try{ot=ou.inject(ru),at=ou}catch(ue){}}t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=tu,t.createPortal=function(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!Xc(t))throw Error(a(200));return function(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:x,key:null==r?null:""+r,children:e,containerInfo:t,implementation:n}}(e,t,null,n)},t.createRoot=function(e,t){if(!Xc(e))throw Error(a(299));var n=!1,r="",o=Qc;return null!=t&&(!0===t.unstable_strictMode&&(n=!0),void 0!==t.identifierPrefix&&(r=t.identifierPrefix),void 0!==t.onRecoverableError&&(o=t.onRecoverableError)),t=Uc(e,1,!1,null,0,n,0,r,o),e[mo]=t.current,$r(8===e.nodeType?e.parentNode:e),new Yc(t)},t.findDOMNode=function(e){if(null==e)return null;if(1===e.nodeType)return e;var t=e._reactInternals;if(void 0===t){if("function"==typeof e.render)throw Error(a(188));throw e=Object.keys(e).join(","),Error(a(268,e))}return e=null===(e=Ge(t))?null:e.stateNode},t.flushSync=function(e){return dc(e)},t.hydrate=function(e,t,n){if(!Zc(t))throw Error(a(200));return eu(null,e,t,!0,n)},t.hydrateRoot=function(e,t,n){if(!Xc(e))throw Error(a(405));var r=null!=n&&n.hydratedSources||null,o=!1,i="",l=Qc;if(null!=n&&(!0===n.unstable_strictMode&&(o=!0),void 0!==n.identifierPrefix&&(i=n.identifierPrefix),void 0!==n.onRecoverableError&&(l=n.onRecoverableError)),t=qc(t,null,e,1,null!=n?n:null,o,0,i,l),e[mo]=t.current,$r(e),r)for(e=0;e<r.length;e++)o=(o=(n=r[e])._getVersion)(n._source),null==t.mutableSourceEagerHydrationData?t.mutableSourceEagerHydrationData=[n,o]:t.mutableSourceEagerHydrationData.push(n,o);return new Kc(t)},t.render=function(e,t,n){if(!Zc(t))throw Error(a(200));return eu(null,e,t,!1,n)},t.unmountComponentAtNode=function(e){if(!Zc(e))throw Error(a(40));return!!e._reactRootContainer&&(dc((function(){eu(null,null,e,!1,(function(){e._reactRootContainer=null,e[mo]=null}))})),!0)},t.unstable_batchedUpdates=uc,t.unstable_renderSubtreeIntoContainer=function(e,t,n,r){if(!Zc(n))throw Error(a(200));if(null==e||void 0===e._reactInternals)throw Error(a(38));return eu(e,t,n,!1,r)},t.version="18.2.0-next-9e3b772b8-20220608"},8352:(e,t,n)=>{"use strict";var r=n(7104);t.createRoot=r.createRoot,t.hydrateRoot=r.hydrateRoot},7104:(e,t,n)=>{"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(9516)},448:e=>{var t="undefined"!=typeof Element,n="function"==typeof Map,r="function"==typeof Set,o="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function a(e,i){if(e===i)return!0;if(e&&i&&"object"==typeof e&&"object"==typeof i){if(e.constructor!==i.constructor)return!1;var l,s,c,u;if(Array.isArray(e)){if((l=e.length)!=i.length)return!1;for(s=l;0!=s--;)if(!a(e[s],i[s]))return!1;return!0}if(n&&e instanceof Map&&i instanceof Map){if(e.size!==i.size)return!1;for(u=e.entries();!(s=u.next()).done;)if(!i.has(s.value[0]))return!1;for(u=e.entries();!(s=u.next()).done;)if(!a(s.value[1],i.get(s.value[0])))return!1;return!0}if(r&&e instanceof Set&&i instanceof Set){if(e.size!==i.size)return!1;for(u=e.entries();!(s=u.next()).done;)if(!i.has(s.value[0]))return!1;return!0}if(o&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(i)){if((l=e.length)!=i.length)return!1;for(s=l;0!=s--;)if(e[s]!==i[s])return!1;return!0}if(e.constructor===RegExp)return e.source===i.source&&e.flags===i.flags;if(e.valueOf!==Object.prototype.valueOf&&"function"==typeof e.valueOf&&"function"==typeof i.valueOf)return e.valueOf()===i.valueOf();if(e.toString!==Object.prototype.toString&&"function"==typeof e.toString&&"function"==typeof i.toString)return e.toString()===i.toString();if((l=(c=Object.keys(e)).length)!==Object.keys(i).length)return!1;for(s=l;0!=s--;)if(!Object.prototype.hasOwnProperty.call(i,c[s]))return!1;if(t&&e instanceof Element)return!1;for(s=l;0!=s--;)if(("_owner"!==c[s]&&"__v"!==c[s]&&"__o"!==c[s]||!e.$$typeof)&&!a(e[c[s]],i[c[s]]))return!1;return!0}return e!=e&&i!=i}e.exports=function(e,t){try{return a(e,t)}catch(n){if((n.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw n}}},2160:(e,t,n)=>{"use strict";n.d(t,{EN:()=>G,So:()=>J});var r=n(1504),o=n(3268),a=n.n(o),i=n(448),l=n.n(i),s=n(9328),c=n.n(s),u=n(1072),d=n.n(u);function p(){return p=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},p.apply(this,arguments)}function f(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,g(e,t)}function g(e,t){return g=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},g(e,t)}function m(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)t.indexOf(n=a[r])>=0||(o[n]=e[n]);return o}var h={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title",FRAGMENT:"Symbol(react.fragment)"},b={rel:["amphtml","canonical","alternate"]},y={type:["application/ld+json"]},v={charset:"",name:["robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]},w=Object.keys(h).map((function(e){return h[e]})),k={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},x=Object.keys(k).reduce((function(e,t){return e[k[t]]=t,e}),{}),S=function(e,t){for(var n=e.length-1;n>=0;n-=1){var r=e[n];if(Object.prototype.hasOwnProperty.call(r,t))return r[t]}return null},E=function(e){var t=S(e,h.TITLE),n=S(e,"titleTemplate");if(Array.isArray(t)&&(t=t.join("")),n&&t)return n.replace(/%s/g,(function(){return t}));var r=S(e,"defaultTitle");return t||r||void 0},_=function(e){return S(e,"onChangeClientState")||function(){}},C=function(e,t){return t.filter((function(t){return void 0!==t[e]})).map((function(t){return t[e]})).reduce((function(e,t){return p({},e,t)}),{})},T=function(e,t){return t.filter((function(e){return void 0!==e[h.BASE]})).map((function(e){return e[h.BASE]})).reverse().reduce((function(t,n){if(!t.length)for(var r=Object.keys(n),o=0;o<r.length;o+=1){var a=r[o].toLowerCase();if(-1!==e.indexOf(a)&&n[a])return t.concat(n)}return t}),[])},j=function(e,t,n){var r={};return n.filter((function(t){return!!Array.isArray(t[e])||(void 0!==t[e]&&console&&"function"==typeof console.warn&&console.warn("Helmet: "+e+' should be of type "Array". Instead found type "'+typeof t[e]+'"'),!1)})).map((function(t){return t[e]})).reverse().reduce((function(e,n){var o={};n.filter((function(e){for(var n,a=Object.keys(e),i=0;i<a.length;i+=1){var l=a[i],s=l.toLowerCase();-1===t.indexOf(s)||"rel"===n&&"canonical"===e[n].toLowerCase()||"rel"===s&&"stylesheet"===e[s].toLowerCase()||(n=s),-1===t.indexOf(l)||"innerHTML"!==l&&"cssText"!==l&&"itemprop"!==l||(n=l)}if(!n||!e[n])return!1;var c=e[n].toLowerCase();return r[n]||(r[n]={}),o[n]||(o[n]={}),!r[n][c]&&(o[n][c]=!0,!0)})).reverse().forEach((function(t){return e.push(t)}));for(var a=Object.keys(o),i=0;i<a.length;i+=1){var l=a[i],s=p({},r[l],o[l]);r[l]=s}return e}),[]).reverse()},A=function(e,t){if(Array.isArray(e)&&e.length)for(var n=0;n<e.length;n+=1)if(e[n][t])return!0;return!1},N=function(e){return Array.isArray(e)?e.join(""):e},L=function(e,t){return Array.isArray(e)?e.reduce((function(e,n){return function(e,t){for(var n=Object.keys(e),r=0;r<n.length;r+=1)if(t[n[r]]&&t[n[r]].includes(e[n[r]]))return!0;return!1}(n,t)?e.priority.push(n):e.default.push(n),e}),{priority:[],default:[]}):{default:e}},R=function(e,t){var n;return p({},e,((n={})[t]=void 0,n))},P=[h.NOSCRIPT,h.SCRIPT,h.STYLE],O=function(e,t){return void 0===t&&(t=!0),!1===t?String(e):String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")},D=function(e){return Object.keys(e).reduce((function(t,n){var r=void 0!==e[n]?n+'="'+e[n]+'"':""+n;return t?t+" "+r:r}),"")},I=function(e,t){return void 0===t&&(t={}),Object.keys(e).reduce((function(t,n){return t[k[n]||n]=e[n],t}),t)},M=function(e,t){return t.map((function(t,n){var o,a=((o={key:n})["data-rh"]=!0,o);return Object.keys(t).forEach((function(e){var n=k[e]||e;"innerHTML"===n||"cssText"===n?a.dangerouslySetInnerHTML={__html:t.innerHTML||t.cssText}:a[n]=t[e]})),r.createElement(e,a)}))},F=function(e,t,n){switch(e){case h.TITLE:return{toComponent:function(){return n=t.titleAttributes,(o={key:e=t.title})["data-rh"]=!0,a=I(n,o),[r.createElement(h.TITLE,a,e)];var e,n,o,a},toString:function(){return function(e,t,n,r){var o=D(n),a=N(t);return o?"<"+e+' data-rh="true" '+o+">"+O(a,r)+"</"+e+">":"<"+e+' data-rh="true">'+O(a,r)+"</"+e+">"}(e,t.title,t.titleAttributes,n)}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return I(t)},toString:function(){return D(t)}};default:return{toComponent:function(){return M(e,t)},toString:function(){return function(e,t,n){return t.reduce((function(t,r){var o=Object.keys(r).filter((function(e){return!("innerHTML"===e||"cssText"===e)})).reduce((function(e,t){var o=void 0===r[t]?t:t+'="'+O(r[t],n)+'"';return e?e+" "+o:o}),""),a=r.innerHTML||r.cssText||"",i=-1===P.indexOf(e);return t+"<"+e+' data-rh="true" '+o+(i?"/>":">"+a+"</"+e+">")}),"")}(e,t,n)}}}},z=function(e){var t=e.baseTag,n=e.bodyAttributes,r=e.encode,o=e.htmlAttributes,a=e.noscriptTags,i=e.styleTags,l=e.title,s=void 0===l?"":l,c=e.titleAttributes,u=e.linkTags,d=e.metaTags,p=e.scriptTags,f={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var g=function(e){var t=e.linkTags,n=e.scriptTags,r=e.encode,o=L(e.metaTags,v),a=L(t,b),i=L(n,y);return{priorityMethods:{toComponent:function(){return[].concat(M(h.META,o.priority),M(h.LINK,a.priority),M(h.SCRIPT,i.priority))},toString:function(){return F(h.META,o.priority,r)+" "+F(h.LINK,a.priority,r)+" "+F(h.SCRIPT,i.priority,r)}},metaTags:o.default,linkTags:a.default,scriptTags:i.default}}(e);f=g.priorityMethods,u=g.linkTags,d=g.metaTags,p=g.scriptTags}return{priority:f,base:F(h.BASE,t,r),bodyAttributes:F("bodyAttributes",n,r),htmlAttributes:F("htmlAttributes",o,r),link:F(h.LINK,u,r),meta:F(h.META,d,r),noscript:F(h.NOSCRIPT,a,r),script:F(h.SCRIPT,p,r),style:F(h.STYLE,i,r),title:F(h.TITLE,{title:s,titleAttributes:c},r)}},B=[],U=function(e,t){var n=this;void 0===t&&(t="undefined"!=typeof document),this.instances=[],this.value={setHelmet:function(e){n.context.helmet=e},helmetInstances:{get:function(){return n.canUseDOM?B:n.instances},add:function(e){(n.canUseDOM?B:n.instances).push(e)},remove:function(e){var t=(n.canUseDOM?B:n.instances).indexOf(e);(n.canUseDOM?B:n.instances).splice(t,1)}}},this.context=e,this.canUseDOM=t,t||(e.helmet=z({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))},$=r.createContext({}),q=a().shape({setHelmet:a().func,helmetInstances:a().shape({get:a().func,add:a().func,remove:a().func})}),H="undefined"!=typeof document,G=function(e){function t(n){var r;return(r=e.call(this,n)||this).helmetData=new U(r.props.context,t.canUseDOM),r}return f(t,e),t.prototype.render=function(){return r.createElement($.Provider,{value:this.helmetData.value},this.props.children)},t}(r.Component);G.canUseDOM=H,G.propTypes={context:a().shape({helmet:a().shape()}),children:a().node.isRequired},G.defaultProps={context:{}},G.displayName="HelmetProvider";var V=function(e,t){var n,r=document.head||document.querySelector(h.HEAD),o=r.querySelectorAll(e+"[data-rh]"),a=[].slice.call(o),i=[];return t&&t.length&&t.forEach((function(t){var r=document.createElement(e);for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&("innerHTML"===o?r.innerHTML=t.innerHTML:"cssText"===o?r.styleSheet?r.styleSheet.cssText=t.cssText:r.appendChild(document.createTextNode(t.cssText)):r.setAttribute(o,void 0===t[o]?"":t[o]));r.setAttribute("data-rh","true"),a.some((function(e,t){return n=t,r.isEqualNode(e)}))?a.splice(n,1):i.push(r)})),a.forEach((function(e){return e.parentNode.removeChild(e)})),i.forEach((function(e){return r.appendChild(e)})),{oldTags:a,newTags:i}},W=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var r=n.getAttribute("data-rh"),o=r?r.split(","):[],a=[].concat(o),i=Object.keys(t),l=0;l<i.length;l+=1){var s=i[l],c=t[s]||"";n.getAttribute(s)!==c&&n.setAttribute(s,c),-1===o.indexOf(s)&&o.push(s);var u=a.indexOf(s);-1!==u&&a.splice(u,1)}for(var d=a.length-1;d>=0;d-=1)n.removeAttribute(a[d]);o.length===a.length?n.removeAttribute("data-rh"):n.getAttribute("data-rh")!==i.join(",")&&n.setAttribute("data-rh",i.join(","))}},Q=function(e,t){var n=e.baseTag,r=e.htmlAttributes,o=e.linkTags,a=e.metaTags,i=e.noscriptTags,l=e.onChangeClientState,s=e.scriptTags,c=e.styleTags,u=e.title,d=e.titleAttributes;W(h.BODY,e.bodyAttributes),W(h.HTML,r),function(e,t){void 0!==e&&document.title!==e&&(document.title=N(e)),W(h.TITLE,t)}(u,d);var p={baseTag:V(h.BASE,n),linkTags:V(h.LINK,o),metaTags:V(h.META,a),noscriptTags:V(h.NOSCRIPT,i),scriptTags:V(h.SCRIPT,s),styleTags:V(h.STYLE,c)},f={},g={};Object.keys(p).forEach((function(e){var t=p[e],n=t.newTags,r=t.oldTags;n.length&&(f[e]=n),r.length&&(g[e]=p[e].oldTags)})),t&&t(),l(e,f,g)},Y=null,K=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).rendered=!1,t}f(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!d()(e,this.props)},n.componentDidUpdate=function(){this.emitChange()},n.componentWillUnmount=function(){this.props.context.helmetInstances.remove(this),this.emitChange()},n.emitChange=function(){var e,t,n=this.props.context,r=n.setHelmet,o=null,a=(e=n.helmetInstances.get().map((function(e){var t=p({},e.props);return delete t.context,t})),{baseTag:T(["href"],e),bodyAttributes:C("bodyAttributes",e),defer:S(e,"defer"),encode:S(e,"encodeSpecialCharacters"),htmlAttributes:C("htmlAttributes",e),linkTags:j(h.LINK,["rel","href"],e),metaTags:j(h.META,["name","charset","http-equiv","property","itemprop"],e),noscriptTags:j(h.NOSCRIPT,["innerHTML"],e),onChangeClientState:_(e),scriptTags:j(h.SCRIPT,["src","innerHTML"],e),styleTags:j(h.STYLE,["cssText"],e),title:E(e),titleAttributes:C("titleAttributes",e),prioritizeSeoTags:A(e,"prioritizeSeoTags")});G.canUseDOM?(t=a,Y&&cancelAnimationFrame(Y),t.defer?Y=requestAnimationFrame((function(){Q(t,(function(){Y=null}))})):(Q(t),Y=null)):z&&(o=z(a)),r(o)},n.init=function(){this.rendered||(this.rendered=!0,this.props.context.helmetInstances.add(this),this.emitChange())},n.render=function(){return this.init(),null},t}(r.Component);K.propTypes={context:q.isRequired},K.displayName="HelmetDispatcher";var X=["children"],Z=["children"],J=function(e){function t(){return e.apply(this,arguments)||this}f(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!l()(R(this.props,"helmetData"),R(e,"helmetData"))},n.mapNestedChildrenToProps=function(e,t){if(!t)return null;switch(e.type){case h.SCRIPT:case h.NOSCRIPT:return{innerHTML:t};case h.STYLE:return{cssText:t};default:throw new Error("<"+e.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")}},n.flattenArrayTypeChildren=function(e){var t,n=e.child,r=e.arrayTypeChildren;return p({},r,((t={})[n.type]=[].concat(r[n.type]||[],[p({},e.newChildProps,this.mapNestedChildrenToProps(n,e.nestedChildren))]),t))},n.mapObjectTypeChildren=function(e){var t,n,r=e.child,o=e.newProps,a=e.newChildProps,i=e.nestedChildren;switch(r.type){case h.TITLE:return p({},o,((t={})[r.type]=i,t.titleAttributes=p({},a),t));case h.BODY:return p({},o,{bodyAttributes:p({},a)});case h.HTML:return p({},o,{htmlAttributes:p({},a)});default:return p({},o,((n={})[r.type]=p({},a),n))}},n.mapArrayTypeChildrenToProps=function(e,t){var n=p({},t);return Object.keys(e).forEach((function(t){var r;n=p({},n,((r={})[t]=e[t],r))})),n},n.warnOnInvalidChildren=function(e,t){return c()(w.some((function(t){return e.type===t})),"function"==typeof e.type?"You may be attempting to nest <Helmet> components within each other, which is not allowed. Refer to our API for more information.":"Only elements types "+w.join(", ")+" are allowed. Helmet does not support rendering <"+e.type+"> elements. Refer to our API for more information."),c()(!t||"string"==typeof t||Array.isArray(t)&&!t.some((function(e){return"string"!=typeof e})),"Helmet expects a string as a child of <"+e.type+">. Did you forget to wrap your children in braces? ( <"+e.type+">{``}</"+e.type+"> ) Refer to our API for more information."),!0},n.mapChildrenToProps=function(e,t){var n=this,o={};return r.Children.forEach(e,(function(e){if(e&&e.props){var r=e.props,a=r.children,i=m(r,X),l=Object.keys(i).reduce((function(e,t){return e[x[t]||t]=i[t],e}),{}),s=e.type;switch("symbol"==typeof s?s=s.toString():n.warnOnInvalidChildren(e,a),s){case h.FRAGMENT:t=n.mapChildrenToProps(a,t);break;case h.LINK:case h.META:case h.NOSCRIPT:case h.SCRIPT:case h.STYLE:o=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:o,newChildProps:l,nestedChildren:a});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:l,nestedChildren:a})}}})),this.mapArrayTypeChildrenToProps(o,t)},n.render=function(){var e=this.props,t=e.children,n=m(e,Z),o=p({},n),a=n.helmetData;return t&&(o=this.mapChildrenToProps(t,o)),!a||a instanceof U||(a=new U(a.context,a.instances)),a?r.createElement(K,p({},o,{context:a.value,helmetData:void 0})):r.createElement($.Consumer,null,(function(e){return r.createElement(K,p({},o,{context:e}))}))},t}(r.Component);J.propTypes={base:a().object,bodyAttributes:a().object,children:a().oneOfType([a().arrayOf(a().node),a().node]),defaultTitle:a().string,defer:a().bool,encodeSpecialCharacters:a().bool,htmlAttributes:a().object,link:a().arrayOf(a().object),meta:a().arrayOf(a().object),noscript:a().arrayOf(a().object),onChangeClientState:a().func,script:a().arrayOf(a().object),style:a().arrayOf(a().object),title:a().string,titleAttributes:a().object,titleTemplate:a().string,prioritizeSeoTags:a().bool,helmetData:a().object},J.defaultProps={defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1},J.displayName="Helmet"},9764:(e,t)=>{"use strict";var n="function"==typeof Symbol&&Symbol.for,r=n?Symbol.for("react.element"):60103,o=n?Symbol.for("react.portal"):60106,a=n?Symbol.for("react.fragment"):60107,i=n?Symbol.for("react.strict_mode"):60108,l=n?Symbol.for("react.profiler"):60114,s=n?Symbol.for("react.provider"):60109,c=n?Symbol.for("react.context"):60110,u=n?Symbol.for("react.async_mode"):60111,d=n?Symbol.for("react.concurrent_mode"):60111,p=n?Symbol.for("react.forward_ref"):60112,f=n?Symbol.for("react.suspense"):60113,g=n?Symbol.for("react.suspense_list"):60120,m=n?Symbol.for("react.memo"):60115,h=n?Symbol.for("react.lazy"):60116,b=n?Symbol.for("react.block"):60121,y=n?Symbol.for("react.fundamental"):60117,v=n?Symbol.for("react.responder"):60118,w=n?Symbol.for("react.scope"):60119;function k(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case u:case d:case a:case l:case i:case f:return e;default:switch(e=e&&e.$$typeof){case c:case p:case h:case m:case s:return e;default:return t}}case o:return t}}}function x(e){return k(e)===d}t.AsyncMode=u,t.ConcurrentMode=d,t.ContextConsumer=c,t.ContextProvider=s,t.Element=r,t.ForwardRef=p,t.Fragment=a,t.Lazy=h,t.Memo=m,t.Portal=o,t.Profiler=l,t.StrictMode=i,t.Suspense=f,t.isAsyncMode=function(e){return x(e)||k(e)===u},t.isConcurrentMode=x,t.isContextConsumer=function(e){return k(e)===c},t.isContextProvider=function(e){return k(e)===s},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===r},t.isForwardRef=function(e){return k(e)===p},t.isFragment=function(e){return k(e)===a},t.isLazy=function(e){return k(e)===h},t.isMemo=function(e){return k(e)===m},t.isPortal=function(e){return k(e)===o},t.isProfiler=function(e){return k(e)===l},t.isStrictMode=function(e){return k(e)===i},t.isSuspense=function(e){return k(e)===f},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===a||e===d||e===l||e===i||e===f||e===g||"object"==typeof e&&null!==e&&(e.$$typeof===h||e.$$typeof===m||e.$$typeof===s||e.$$typeof===c||e.$$typeof===p||e.$$typeof===y||e.$$typeof===v||e.$$typeof===w||e.$$typeof===b)},t.typeOf=k},2168:(e,t,n)=>{"use strict";e.exports=n(9764)},8852:(e,t,n)=>{"use strict";function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function o(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(){return i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i.apply(this,arguments)}var l=n(1504),s=n(3268),c=[],u=[];function d(e){var t=e(),n={loading:!0,loaded:null,error:null};return n.promise=t.then((function(e){return n.loading=!1,n.loaded=e,e})).catch((function(e){throw n.loading=!1,n.error=e,e})),n}function p(e){var t={loading:!1,loaded:{},error:null},n=[];try{Object.keys(e).forEach((function(r){var o=d(e[r]);o.loading?t.loading=!0:(t.loaded[r]=o.loaded,t.error=o.error),n.push(o.promise),o.promise.then((function(e){t.loaded[r]=e})).catch((function(e){t.error=e}))}))}catch(r){t.error=r}return t.promise=Promise.all(n).then((function(e){return t.loading=!1,e})).catch((function(e){throw t.loading=!1,e})),t}function f(e,t){return l.createElement((n=e)&&n.__esModule?n.default:n,t);var n}function g(e,t){var d,p;if(!t.loading)throw new Error("react-loadable requires a `loading` component");var g=i({loader:null,loading:null,delay:200,timeout:null,render:f,webpack:null,modules:null},t),m=null;function h(){return m||(m=e(g.loader)),m.promise}return c.push(h),"function"==typeof g.webpack&&u.push((function(){if((0,g.webpack)().every((function(e){return void 0!==e&&void 0!==n.m[e]})))return h()})),p=d=function(t){function n(n){var r;return a(o(o(r=t.call(this,n)||this)),"retry",(function(){r.setState({error:null,loading:!0,timedOut:!1}),m=e(g.loader),r._loadModule()})),h(),r.state={error:m.error,pastDelay:!1,timedOut:!1,loading:m.loading,loaded:m.loaded},r}r(n,t),n.preload=function(){return h()};var i=n.prototype;return i.UNSAFE_componentWillMount=function(){this._loadModule()},i.componentDidMount=function(){this._mounted=!0},i._loadModule=function(){var e=this;if(this.context.loadable&&Array.isArray(g.modules)&&g.modules.forEach((function(t){e.context.loadable.report(t)})),m.loading){var t=function(t){e._mounted&&e.setState(t)};"number"==typeof g.delay&&(0===g.delay?this.setState({pastDelay:!0}):this._delay=setTimeout((function(){t({pastDelay:!0})}),g.delay)),"number"==typeof g.timeout&&(this._timeout=setTimeout((function(){t({timedOut:!0})}),g.timeout));var n=function(){t({error:m.error,loaded:m.loaded,loading:m.loading}),e._clearTimeouts()};m.promise.then((function(){return n(),null})).catch((function(e){return n(),null}))}},i.componentWillUnmount=function(){this._mounted=!1,this._clearTimeouts()},i._clearTimeouts=function(){clearTimeout(this._delay),clearTimeout(this._timeout)},i.render=function(){return this.state.loading||this.state.error?l.createElement(g.loading,{isLoading:this.state.loading,pastDelay:this.state.pastDelay,timedOut:this.state.timedOut,error:this.state.error,retry:this.retry}):this.state.loaded?g.render(this.state.loaded,this.props):null},n}(l.Component),a(d,"contextTypes",{loadable:s.shape({report:s.func.isRequired})}),p}function m(e){return g(d,e)}m.Map=function(e){if("function"!=typeof e.render)throw new Error("LoadableMap requires a `render(loaded, props)` function");return g(p,e)};var h=function(e){function t(){return e.apply(this,arguments)||this}r(t,e);var n=t.prototype;return n.getChildContext=function(){return{loadable:{report:this.props.report}}},n.render=function(){return l.Children.only(this.props.children)},t}(l.Component);function b(e){for(var t=[];e.length;){var n=e.pop();t.push(n())}return Promise.all(t).then((function(){if(e.length)return b(e)}))}a(h,"propTypes",{report:s.func.isRequired}),a(h,"childContextTypes",{loadable:s.shape({report:s.func.isRequired}).isRequired}),m.Capture=h,m.preloadAll=function(){return new Promise((function(e,t){b(c).then(e,t)}))},m.preloadReady=function(){return new Promise((function(e,t){b(u).then(e,e)}))},e.exports=m},5464:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,k:()=>l});var r=n(5592),o=n(5072),a=n(1504);function i(e,t,n){return void 0===n&&(n=[]),e.some((function(e){var o=e.path?(0,r.ot)(t,e):n.length?n[n.length-1].match:r.E5.computeRootMatch(t);return o&&(n.push({route:e,match:o}),e.routes&&i(e.routes,t,n)),o})),n}function l(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),e?a.createElement(r.Wk,n,e.map((function(e,n){return a.createElement(r.kX,{key:e.key||n,path:e.path,exact:e.exact,strict:e.strict,render:function(n){return e.render?e.render((0,o.c)({},n,{},t,{route:e})):a.createElement(e.component,(0,o.c)({},n,t,{route:e}))}})}))):null}},440:(e,t,n)=>{"use strict";n.d(t,{Af:()=>v,cH:()=>h,kn:()=>u});var r=n(5592),o=n(8992),a=n(1504),i=n(8064),l=n(5072),s=n(5656),c=n(4812),u=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).history=(0,i.iU)(t.props),t}return(0,o.c)(t,e),t.prototype.render=function(){return a.createElement(r.E5,{history:this.history,children:this.props.children})},t}(a.Component);a.Component;var d=function(e,t){return"function"==typeof e?e(t):e},p=function(e,t){return"string"==typeof e?(0,i.gh)(e,null,null,t):e},f=function(e){return e},g=a.forwardRef;void 0===g&&(g=f);var m=g((function(e,t){var n=e.innerRef,r=e.navigate,o=e.onClick,i=(0,s.c)(e,["innerRef","navigate","onClick"]),c=i.target,u=(0,l.c)({},i,{onClick:function(e){try{o&&o(e)}catch(t){throw e.preventDefault(),t}e.defaultPrevented||0!==e.button||c&&"_self"!==c||function(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}(e)||(e.preventDefault(),r())}});return u.ref=f!==g&&t||n,a.createElement("a",u)}));var h=g((function(e,t){var n=e.component,o=void 0===n?m:n,u=e.replace,h=e.to,b=e.innerRef,y=(0,s.c)(e,["component","replace","to","innerRef"]);return a.createElement(r.Os.Consumer,null,(function(e){e||(0,c.c)(!1);var n=e.history,r=p(d(h,e.location),e.location),s=r?n.createHref(r):"",m=(0,l.c)({},y,{href:s,navigate:function(){var t=d(h,e.location),r=(0,i.Ep)(e.location)===(0,i.Ep)(p(t));(u||r?n.replace:n.push)(t)}});return f!==g?m.ref=t||b:m.innerRef=b,a.createElement(o,m)}))})),b=function(e){return e},y=a.forwardRef;void 0===y&&(y=b);var v=y((function(e,t){var n=e["aria-current"],o=void 0===n?"page":n,i=e.activeClassName,u=void 0===i?"active":i,f=e.activeStyle,g=e.className,m=e.exact,v=e.isActive,w=e.location,k=e.sensitive,x=e.strict,S=e.style,E=e.to,_=e.innerRef,C=(0,s.c)(e,["aria-current","activeClassName","activeStyle","className","exact","isActive","location","sensitive","strict","style","to","innerRef"]);return a.createElement(r.Os.Consumer,null,(function(e){e||(0,c.c)(!1);var n=w||e.location,i=p(d(E,n),n),s=i.pathname,T=s&&s.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1"),j=T?(0,r.ot)(n.pathname,{path:T,exact:m,sensitive:k,strict:x}):null,A=!!(v?v(j,n):j),N="function"==typeof g?g(A):g,L="function"==typeof S?S(A):S;A&&(N=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.filter((function(e){return e})).join(" ")}(N,u),L=(0,l.c)({},L,f));var R=(0,l.c)({"aria-current":A&&o||null,className:N,style:L,to:i},C);return b!==y?R.ref=t||_:R.innerRef=_,a.createElement(h,R)}))}))},5592:(e,t,n)=>{"use strict";n.d(t,{E5:()=>v,IT:()=>P,Os:()=>y,Uz:()=>R,Wk:()=>N,kX:()=>E,ot:()=>S});var r=n(8992),o=n(1504),a=n(3268),i=n.n(a),l=n(8064),s=n(4812),c=n(5072),u=n(6872),d=n.n(u),p=(n(2168),n(5656)),f=(n(4792),1073741823),g="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{};var m=o.createContext||function(e,t){var n,a,l="__create-react-context-"+function(){var e="__global_unique_id__";return g[e]=(g[e]||0)+1}()+"__",s=function(e){function n(){for(var t,n,r,o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return(t=e.call.apply(e,[this].concat(a))||this).emitter=(n=t.props.value,r=[],{on:function(e){r.push(e)},off:function(e){r=r.filter((function(t){return t!==e}))},get:function(){return n},set:function(e,t){n=e,r.forEach((function(e){return e(n,t)}))}}),t}(0,r.c)(n,e);var o=n.prototype;return o.getChildContext=function(){var e;return(e={})[l]=this.emitter,e},o.componentWillReceiveProps=function(e){if(this.props.value!==e.value){var n,r=this.props.value,o=e.value;((a=r)===(i=o)?0!==a||1/a==1/i:a!=a&&i!=i)?n=0:(n="function"==typeof t?t(r,o):f,0!==(n|=0)&&this.emitter.set(e.value,n))}var a,i},o.render=function(){return this.props.children},n}(o.Component);s.childContextTypes=((n={})[l]=i().object.isRequired,n);var c=function(t){function n(){for(var e,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(e=t.call.apply(t,[this].concat(r))||this).observedBits=void 0,e.state={value:e.getValue()},e.onUpdate=function(t,n){0!=((0|e.observedBits)&n)&&e.setState({value:e.getValue()})},e}(0,r.c)(n,t);var o=n.prototype;return o.componentWillReceiveProps=function(e){var t=e.observedBits;this.observedBits=null==t?f:t},o.componentDidMount=function(){this.context[l]&&this.context[l].on(this.onUpdate);var e=this.props.observedBits;this.observedBits=null==e?f:e},o.componentWillUnmount=function(){this.context[l]&&this.context[l].off(this.onUpdate)},o.getValue=function(){return this.context[l]?this.context[l].get():e},o.render=function(){return(e=this.props.children,Array.isArray(e)?e[0]:e)(this.state.value);var e},n}(o.Component);return c.contextTypes=((a={})[l]=i().object,a),{Provider:s,Consumer:c}},h=function(e){var t=m();return t.displayName=e,t},b=h("Router-History"),y=h("Router"),v=function(e){function t(t){var n;return(n=e.call(this,t)||this).state={location:t.history.location},n._isMounted=!1,n._pendingLocation=null,t.staticContext||(n.unlisten=t.history.listen((function(e){n._pendingLocation=e}))),n}(0,r.c)(t,e),t.computeRootMatch=function(e){return{path:"/",url:"/",params:{},isExact:"/"===e}};var n=t.prototype;return n.componentDidMount=function(){var e=this;this._isMounted=!0,this.unlisten&&this.unlisten(),this.props.staticContext||(this.unlisten=this.props.history.listen((function(t){e._isMounted&&e.setState({location:t})}))),this._pendingLocation&&this.setState({location:this._pendingLocation})},n.componentWillUnmount=function(){this.unlisten&&(this.unlisten(),this._isMounted=!1,this._pendingLocation=null)},n.render=function(){return o.createElement(y.Provider,{value:{history:this.props.history,location:this.state.location,match:t.computeRootMatch(this.state.location.pathname),staticContext:this.props.staticContext}},o.createElement(b.Provider,{children:this.props.children||null,value:this.props.history}))},t}(o.Component);o.Component;o.Component;var w={},k=1e4,x=0;function S(e,t){void 0===t&&(t={}),("string"==typeof t||Array.isArray(t))&&(t={path:t});var n=t,r=n.path,o=n.exact,a=void 0!==o&&o,i=n.strict,l=void 0!==i&&i,s=n.sensitive,c=void 0!==s&&s;return[].concat(r).reduce((function(t,n){if(!n&&""!==n)return null;if(t)return t;var r=function(e,t){var n=""+t.end+t.strict+t.sensitive,r=w[n]||(w[n]={});if(r[e])return r[e];var o=[],a={regexp:d()(e,o,t),keys:o};return x<k&&(r[e]=a,x++),a}(n,{end:a,strict:l,sensitive:c}),o=r.regexp,i=r.keys,s=o.exec(e);if(!s)return null;var u=s[0],p=s.slice(1),f=e===u;return a&&!f?null:{path:n,url:"/"===n&&""===u?"/":u,isExact:f,params:i.reduce((function(e,t,n){return e[t.name]=p[n],e}),{})}}),null)}var E=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.c)(t,e),t.prototype.render=function(){var e=this;return o.createElement(y.Consumer,null,(function(t){t||(0,s.c)(!1);var n=e.props.location||t.location,r=e.props.computedMatch?e.props.computedMatch:e.props.path?S(n.pathname,e.props):t.match,a=(0,c.c)({},t,{location:n,match:r}),i=e.props,l=i.children,u=i.component,d=i.render;return Array.isArray(l)&&function(e){return 0===o.Children.count(e)}(l)&&(l=null),o.createElement(y.Provider,{value:a},a.match?l?"function"==typeof l?l(a):l:u?o.createElement(u,a):d?d(a):null:"function"==typeof l?l(a):null)}))},t}(o.Component);function _(e){return"/"===e.charAt(0)?e:"/"+e}function C(e,t){if(!e)return t;var n=_(e);return 0!==t.pathname.indexOf(n)?t:(0,c.c)({},t,{pathname:t.pathname.substr(n.length)})}function T(e){return"string"==typeof e?e:(0,l.Ep)(e)}function j(e){return function(){(0,s.c)(!1)}}function A(){}o.Component;var N=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.c)(t,e),t.prototype.render=function(){var e=this;return o.createElement(y.Consumer,null,(function(t){t||(0,s.c)(!1);var n,r,a=e.props.location||t.location;return o.Children.forEach(e.props.children,(function(e){if(null==r&&o.isValidElement(e)){n=e;var i=e.props.path||e.props.from;r=i?S(a.pathname,(0,c.c)({},e.props,{path:i})):t.match}})),r?o.cloneElement(n,{location:a,computedMatch:r}):null}))},t}(o.Component);var L=o.useContext;function R(){return L(b)}function P(){return L(y).location}},4808:(e,t,n)=>{"use strict";var r=n(1504),o=Symbol.for("react.element"),a=Symbol.for("react.fragment"),i=Object.prototype.hasOwnProperty,l=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,s={key:!0,ref:!0,__self:!0,__source:!0};function c(e,t,n){var r,a={},c=null,u=null;for(r in void 0!==n&&(c=""+n),void 0!==t.key&&(c=""+t.key),void 0!==t.ref&&(u=t.ref),t)i.call(t,r)&&!s.hasOwnProperty(r)&&(a[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===a[r]&&(a[r]=t[r]);return{$$typeof:o,type:e,key:c,ref:u,props:a,_owner:l.current}}t.Fragment=a,t.jsx=c,t.jsxs=c},3028:(e,t)=>{"use strict";var n=Symbol.for("react.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),l=Symbol.for("react.provider"),s=Symbol.for("react.context"),c=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),p=Symbol.for("react.lazy"),f=Symbol.iterator;var g={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},m=Object.assign,h={};function b(e,t,n){this.props=e,this.context=t,this.refs=h,this.updater=n||g}function y(){}function v(e,t,n){this.props=e,this.context=t,this.refs=h,this.updater=n||g}b.prototype.isReactComponent={},b.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},b.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},y.prototype=b.prototype;var w=v.prototype=new y;w.constructor=v,m(w,b.prototype),w.isPureReactComponent=!0;var k=Array.isArray,x=Object.prototype.hasOwnProperty,S={current:null},E={key:!0,ref:!0,__self:!0,__source:!0};function _(e,t,r){var o,a={},i=null,l=null;if(null!=t)for(o in void 0!==t.ref&&(l=t.ref),void 0!==t.key&&(i=""+t.key),t)x.call(t,o)&&!E.hasOwnProperty(o)&&(a[o]=t[o]);var s=arguments.length-2;if(1===s)a.children=r;else if(1<s){for(var c=Array(s),u=0;u<s;u++)c[u]=arguments[u+2];a.children=c}if(e&&e.defaultProps)for(o in s=e.defaultProps)void 0===a[o]&&(a[o]=s[o]);return{$$typeof:n,type:e,key:i,ref:l,props:a,_owner:S.current}}function C(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var T=/\/+/g;function j(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,(function(e){return t[e]}))}(""+e.key):t.toString(36)}function A(e,t,o,a,i){var l=typeof e;"undefined"!==l&&"boolean"!==l||(e=null);var s=!1;if(null===e)s=!0;else switch(l){case"string":case"number":s=!0;break;case"object":switch(e.$$typeof){case n:case r:s=!0}}if(s)return i=i(s=e),e=""===a?"."+j(s,0):a,k(i)?(o="",null!=e&&(o=e.replace(T,"$&/")+"/"),A(i,t,o,"",(function(e){return e}))):null!=i&&(C(i)&&(i=function(e,t){return{$$typeof:n,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(i,o+(!i.key||s&&s.key===i.key?"":(""+i.key).replace(T,"$&/")+"/")+e)),t.push(i)),1;if(s=0,a=""===a?".":a+":",k(e))for(var c=0;c<e.length;c++){var u=a+j(l=e[c],c);s+=A(l,t,o,u,i)}else if(u=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=f&&e[f]||e["@@iterator"])?e:null}(e),"function"==typeof u)for(e=u.call(e),c=0;!(l=e.next()).done;)s+=A(l=l.value,t,o,u=a+j(l,c++),i);else if("object"===l)throw t=String(e),Error("Objects are not valid as a React child (found: "+("[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return s}function N(e,t,n){if(null==e)return e;var r=[],o=0;return A(e,r,"","",(function(e){return t.call(n,e,o++)})),r}function L(e){if(-1===e._status){var t=e._result;(t=t()).then((function(t){0!==e._status&&-1!==e._status||(e._status=1,e._result=t)}),(function(t){0!==e._status&&-1!==e._status||(e._status=2,e._result=t)})),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var R={current:null},P={transition:null},O={ReactCurrentDispatcher:R,ReactCurrentBatchConfig:P,ReactCurrentOwner:S};t.Children={map:N,forEach:function(e,t,n){N(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return N(e,(function(){t++})),t},toArray:function(e){return N(e,(function(e){return e}))||[]},only:function(e){if(!C(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=b,t.Fragment=o,t.Profiler=i,t.PureComponent=v,t.StrictMode=a,t.Suspense=u,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=O,t.cloneElement=function(e,t,r){if(null==e)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var o=m({},e.props),a=e.key,i=e.ref,l=e._owner;if(null!=t){if(void 0!==t.ref&&(i=t.ref,l=S.current),void 0!==t.key&&(a=""+t.key),e.type&&e.type.defaultProps)var s=e.type.defaultProps;for(c in t)x.call(t,c)&&!E.hasOwnProperty(c)&&(o[c]=void 0===t[c]&&void 0!==s?s[c]:t[c])}var c=arguments.length-2;if(1===c)o.children=r;else if(1<c){s=Array(c);for(var u=0;u<c;u++)s[u]=arguments[u+2];o.children=s}return{$$typeof:n,type:e.type,key:a,ref:i,props:o,_owner:l}},t.createContext=function(e){return(e={$$typeof:s,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null}).Provider={$$typeof:l,_context:e},e.Consumer=e},t.createElement=_,t.createFactory=function(e){var t=_.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:c,render:e}},t.isValidElement=C,t.lazy=function(e){return{$$typeof:p,_payload:{_status:-1,_result:e},_init:L}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=P.transition;P.transition={};try{e()}finally{P.transition=t}},t.unstable_act=function(){throw Error("act(...) is not supported in production builds of React.")},t.useCallback=function(e,t){return R.current.useCallback(e,t)},t.useContext=function(e){return R.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return R.current.useDeferredValue(e)},t.useEffect=function(e,t){return R.current.useEffect(e,t)},t.useId=function(){return R.current.useId()},t.useImperativeHandle=function(e,t,n){return R.current.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return R.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return R.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return R.current.useMemo(e,t)},t.useReducer=function(e,t,n){return R.current.useReducer(e,t,n)},t.useRef=function(e){return R.current.useRef(e)},t.useState=function(e){return R.current.useState(e)},t.useSyncExternalStore=function(e,t,n){return R.current.useSyncExternalStore(e,t,n)},t.useTransition=function(){return R.current.useTransition()},t.version="18.2.0"},1504:(e,t,n)=>{"use strict";e.exports=n(3028)},7624:(e,t,n)=>{"use strict";e.exports=n(4808)},8328:(e,t)=>{"use strict";function n(e,t){var n=e.length;e.push(t);e:for(;0<n;){var r=n-1>>>1,o=e[r];if(!(0<a(o,t)))break e;e[r]=t,e[n]=o,n=r}}function r(e){return 0===e.length?null:e[0]}function o(e){if(0===e.length)return null;var t=e[0],n=e.pop();if(n!==t){e[0]=n;e:for(var r=0,o=e.length,i=o>>>1;r<i;){var l=2*(r+1)-1,s=e[l],c=l+1,u=e[c];if(0>a(s,n))c<o&&0>a(u,s)?(e[r]=u,e[c]=n,r=c):(e[r]=s,e[l]=n,r=l);else{if(!(c<o&&0>a(u,n)))break e;e[r]=u,e[c]=n,r=c}}}return t}function a(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}if("object"==typeof performance&&"function"==typeof performance.now){var i=performance;t.unstable_now=function(){return i.now()}}else{var l=Date,s=l.now();t.unstable_now=function(){return l.now()-s}}var c=[],u=[],d=1,p=null,f=3,g=!1,m=!1,h=!1,b="function"==typeof setTimeout?setTimeout:null,y="function"==typeof clearTimeout?clearTimeout:null,v="undefined"!=typeof setImmediate?setImmediate:null;function w(e){for(var t=r(u);null!==t;){if(null===t.callback)o(u);else{if(!(t.startTime<=e))break;o(u),t.sortIndex=t.expirationTime,n(c,t)}t=r(u)}}function k(e){if(h=!1,w(e),!m)if(null!==r(c))m=!0,P(x);else{var t=r(u);null!==t&&O(k,t.startTime-e)}}function x(e,n){m=!1,h&&(h=!1,y(C),C=-1),g=!0;var a=f;try{for(w(n),p=r(c);null!==p&&(!(p.expirationTime>n)||e&&!A());){var i=p.callback;if("function"==typeof i){p.callback=null,f=p.priorityLevel;var l=i(p.expirationTime<=n);n=t.unstable_now(),"function"==typeof l?p.callback=l:p===r(c)&&o(c),w(n)}else o(c);p=r(c)}if(null!==p)var s=!0;else{var d=r(u);null!==d&&O(k,d.startTime-n),s=!1}return s}finally{p=null,f=a,g=!1}}"undefined"!=typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);var S,E=!1,_=null,C=-1,T=5,j=-1;function A(){return!(t.unstable_now()-j<T)}function N(){if(null!==_){var e=t.unstable_now();j=e;var n=!0;try{n=_(!0,e)}finally{n?S():(E=!1,_=null)}}else E=!1}if("function"==typeof v)S=function(){v(N)};else if("undefined"!=typeof MessageChannel){var L=new MessageChannel,R=L.port2;L.port1.onmessage=N,S=function(){R.postMessage(null)}}else S=function(){b(N,0)};function P(e){_=e,E||(E=!0,S())}function O(e,n){C=b((function(){e(t.unstable_now())}),n)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_continueExecution=function(){m||g||(m=!0,P(x))},t.unstable_forceFrameRate=function(e){0>e||125<e?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):T=0<e?Math.floor(1e3/e):5},t.unstable_getCurrentPriorityLevel=function(){return f},t.unstable_getFirstCallbackNode=function(){return r(c)},t.unstable_next=function(e){switch(f){case 1:case 2:case 3:var t=3;break;default:t=f}var n=f;f=t;try{return e()}finally{f=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=function(){},t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=f;f=e;try{return t()}finally{f=n}},t.unstable_scheduleCallback=function(e,o,a){var i=t.unstable_now();switch("object"==typeof a&&null!==a?a="number"==typeof(a=a.delay)&&0<a?i+a:i:a=i,e){case 1:var l=-1;break;case 2:l=250;break;case 5:l=1073741823;break;case 4:l=1e4;break;default:l=5e3}return e={id:d++,callback:o,priorityLevel:e,startTime:a,expirationTime:l=a+l,sortIndex:-1},a>i?(e.sortIndex=a,n(u,e),null===r(c)&&e===r(u)&&(h?(y(C),C=-1):h=!0,O(k,a-i))):(e.sortIndex=l,n(c,e),m||g||(m=!0,P(x))),e},t.unstable_shouldYield=A,t.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}},4712:(e,t,n)=>{"use strict";e.exports=n(8328)},1072:e=>{e.exports=function(e,t,n,r){var o=n?n.call(r,e,t):void 0;if(void 0!==o)return!!o;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var a=Object.keys(e),i=Object.keys(t);if(a.length!==i.length)return!1;for(var l=Object.prototype.hasOwnProperty.bind(t),s=0;s<a.length;s++){var c=a[s];if(!l(c))return!1;var u=e[c],d=t[c];if(!1===(o=n?n.call(r,u,d,c):void 0)||void 0===o&&u!==d)return!1}return!0}},7768:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={title:"Evan Tay",tagline:"I am a Software Engineer and Cloud Engineer passionate about solving meaningful problems.",url:"https://evantay.com",baseUrl:"/",onBrokenLinks:"throw",favicon:"img/logo.png",organizationName:"digipie",projectName:"kaya-folio",themeConfig:{colorMode:{defaultMode:"dark",disableSwitch:!0,respectPrefersColorScheme:!1},navbar:{hideOnScroll:!0,title:"Evan Tay",logo:{alt:"Evan Tay",src:"img/logo.png",target:"_self"},items:[{to:"blog/",label:"Blog",position:"left"},{to:"docs/",activeBasePath:"docs",label:"Docs",position:"left"},{to:"projects/",label:"Projects",position:"right"},{href:"https://evantay.com/pdf/resume.pdf",label:"Resume",position:"right"}]},footer:{links:[{title:"Connect",items:[{label:"LinkedIn",href:"https://www.linkedin.com/in/evanitsg/"},{label:"GitHub",href:"https://github.com/digipie"},{label:"Padlet",href:"https://padlet.com/about/us/wish/1072760846"},{label:"Email",href:"mailto:evan.it.sg@gmail.com"}]},{title:"Discover",items:[{label:"Blog",to:"blog"},{label:"Documentation",to:"docs"},{label:"Projects",to:"projects"},{label:"Resume",href:"https://evantay.com/pdf/resume.pdf"}]}],copyright:'<a href="https://evantay.com">Design by Evan Tay</a> \u2022 <a href="https://github.com/DigiPie/kaya-folio/commits/main">Updated 2/9/2024</a>',style:"light"},docs:{versionPersistence:"localStorage",sidebar:{hideable:!1,autoCollapseCategories:!1}},metadata:[],prism:{additionalLanguages:[],theme:{plain:{color:"#bfc7d5",backgroundColor:"#292d3e"},styles:[{types:["comment"],style:{color:"rgb(105, 112, 152)",fontStyle:"italic"}},{types:["string","inserted"],style:{color:"rgb(195, 232, 141)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation","selector"],style:{color:"rgb(199, 146, 234)"}},{types:["variable"],style:{color:"rgb(191, 199, 213)"}},{types:["class-name","attr-name"],style:{color:"rgb(255, 203, 107)"}},{types:["tag","deleted"],style:{color:"rgb(255, 85, 114)"}},{types:["operator"],style:{color:"rgb(137, 221, 255)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["keyword"],style:{fontStyle:"italic"}},{types:["doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}},{types:["url"],style:{color:"rgb(221, 221, 221)"}}]},magicComments:[{className:"theme-code-block-highlighted-line",line:"highlight-next-line",block:{start:"highlight-start",end:"highlight-end"}}]},tableOfContents:{minHeadingLevel:2,maxHeadingLevel:3}},presets:[["@docusaurus/preset-classic",{docs:{sidebarPath:"/home/runner/work/kaya-folio/kaya-folio/website/sidebars.js",disableVersioning:!1,editCurrentVersion:!1,remarkPlugins:[null],rehypePlugins:[null]},blog:{showReadingTime:!0,editUrl:"https://github.com/DigiPie/kaya-folio/tree/main/website/"},theme:{customCss:"/home/runner/work/kaya-folio/kaya-folio/website/src/css/custom.css"}}]],stylesheets:[{href:"https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.css",type:"text/css",integrity:"sha384-AfEj0r4/OFrOo5t7NnNe46zW/tFgW6x/bCJG8FqQCEo3+Aro6EYUG4+cU+KJWu/X",crossorigin:"anonymous"}],plugins:[null],baseUrlIssueBanner:!0,i18n:{defaultLocale:"en",path:"i18n",locales:["en"],localeConfigs:{}},onBrokenAnchors:"warn",onBrokenMarkdownLinks:"warn",onDuplicateRoutes:"warn",staticDirectories:["static"],customFields:{},themes:[],scripts:[],headTags:[],clientModules:[],titleDelimiter:"|",noIndex:!1,markdown:{format:"mdx",mermaid:!1,mdx1Compat:{comments:!0,admonitions:!0,headingIds:!0}}}},5072:(e,t,n)=>{"use strict";function r(){return r=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},r.apply(this,arguments)}n.d(t,{c:()=>r})},8992:(e,t,n)=>{"use strict";function r(e,t){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},r(e,t)}function o(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,r(e,t)}n.d(t,{c:()=>o})},5656:(e,t,n)=>{"use strict";function r(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}n.d(t,{c:()=>r})},5456:(e,t,n)=>{"use strict";function r(e){var t,n,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e)){var a=e.length;for(t=0;t<a;t++)e[t]&&(n=r(e[t]))&&(o&&(o+=" "),o+=n)}else for(n in e)e[n]&&(o&&(o+=" "),o+=n);return o}n.d(t,{c:()=>o});const o=function(){for(var e,t,n=0,o="",a=arguments.length;n<a;n++)(e=arguments[n])&&(t=r(e))&&(o&&(o+=" "),o+=t);return o}},5720:(e,t,n)=>{"use strict";n.d(t,{gl:()=>ee,sp:()=>T});var r,o,a,i,l,s,c,u=n(1504),d=n(5456),p=Object.create,f=Object.defineProperty,g=Object.defineProperties,m=Object.getOwnPropertyDescriptor,h=Object.getOwnPropertyDescriptors,b=Object.getOwnPropertyNames,y=Object.getOwnPropertySymbols,v=Object.getPrototypeOf,w=Object.prototype.hasOwnProperty,k=Object.prototype.propertyIsEnumerable,x=(e,t,n)=>t in e?f(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,S=(e,t)=>{for(var n in t||(t={}))w.call(t,n)&&x(e,n,t[n]);if(y)for(var n of y(t))k.call(t,n)&&x(e,n,t[n]);return e},E=(e,t)=>g(e,h(t)),_=(e,t)=>{var n={};for(var r in e)w.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&y)for(var r of y(e))t.indexOf(r)<0&&k.call(e,r)&&(n[r]=e[r]);return n},C=(r={"../../node_modules/.pnpm/prismjs@1.29.0_patch_hash=vrxx3pzkik6jpmgpayxfjunetu/node_modules/prismjs/prism.js"(e,t){var n=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof o?new o(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function e(t,n){var o,a;switch(n=n||{},r.util.type(t)){case"Object":if(a=r.util.objId(t),n[a])return n[a];for(var i in o={},n[a]=o,t)t.hasOwnProperty(i)&&(o[i]=e(t[i],n));return o;case"Array":return a=r.util.objId(t),n[a]?n[a]:(o=[],n[a]=o,t.forEach((function(t,r){o[r]=e(t,n)})),o);default:return t}},getLanguage:function(t){for(;t;){var n=e.exec(t.className);if(n)return n[1].toLowerCase();t=t.parentElement}return"none"},setLanguage:function(t,n){t.className=t.className.replace(RegExp(e,"gi"),""),t.classList.add("language-"+n)},isActive:function(e,t,n){for(var r="no-"+t;e;){var o=e.classList;if(o.contains(t))return!0;if(o.contains(r))return!1;e=e.parentElement}return!!n}},languages:{plain:n,plaintext:n,text:n,txt:n,extend:function(e,t){var n=r.util.clone(r.languages[e]);for(var o in t)n[o]=t[o];return n},insertBefore:function(e,t,n,o){var a=(o=o||r.languages)[e],i={};for(var l in a)if(a.hasOwnProperty(l)){if(l==t)for(var s in n)n.hasOwnProperty(s)&&(i[s]=n[s]);n.hasOwnProperty(l)||(i[l]=a[l])}var c=o[e];return o[e]=i,r.languages.DFS(r.languages,(function(t,n){n===c&&t!=e&&(this[t]=i)})),i},DFS:function e(t,n,o,a){a=a||{};var i=r.util.objId;for(var l in t)if(t.hasOwnProperty(l)){n.call(t,l,t[l],o||l);var s=t[l],c=r.util.type(s);"Object"!==c||a[i(s)]?"Array"!==c||a[i(s)]||(a[i(s)]=!0,e(s,n,l,a)):(a[i(s)]=!0,e(s,n,null,a))}}},plugins:{},highlight:function(e,t,n){var a={code:e,grammar:t,language:n};if(r.hooks.run("before-tokenize",a),!a.grammar)throw new Error('The language "'+a.language+'" has no grammar.');return a.tokens=r.tokenize(a.code,a.grammar),r.hooks.run("after-tokenize",a),o.stringify(r.util.encode(a.tokens),a.language)},tokenize:function(e,t){var n=t.rest;if(n){for(var r in n)t[r]=n[r];delete t.rest}var o=new l;return s(o,o.head,e),i(e,o,t,o.head,0),function(e){for(var t=[],n=e.head.next;n!==e.tail;)t.push(n.value),n=n.next;return t}(o)},hooks:{all:{},add:function(e,t){var n=r.hooks.all;n[e]=n[e]||[],n[e].push(t)},run:function(e,t){var n=r.hooks.all[e];if(n&&n.length)for(var o,a=0;o=n[a++];)o(t)}},Token:o};function o(e,t,n,r){this.type=e,this.content=t,this.alias=n,this.length=0|(r||"").length}function a(e,t,n,r){e.lastIndex=t;var o=e.exec(n);if(o&&r&&o[1]){var a=o[1].length;o.index+=a,o[0]=o[0].slice(a)}return o}function i(e,t,n,l,u,d){for(var p in n)if(n.hasOwnProperty(p)&&n[p]){var f=n[p];f=Array.isArray(f)?f:[f];for(var g=0;g<f.length;++g){if(d&&d.cause==p+","+g)return;var m=f[g],h=m.inside,b=!!m.lookbehind,y=!!m.greedy,v=m.alias;if(y&&!m.pattern.global){var w=m.pattern.toString().match(/[imsuy]*$/)[0];m.pattern=RegExp(m.pattern.source,w+"g")}for(var k=m.pattern||m,x=l.next,S=u;x!==t.tail&&!(d&&S>=d.reach);S+=x.value.length,x=x.next){var E=x.value;if(t.length>e.length)return;if(!(E instanceof o)){var _,C=1;if(y){if(!(_=a(k,S,e,b))||_.index>=e.length)break;var T=_.index,j=_.index+_[0].length,A=S;for(A+=x.value.length;T>=A;)A+=(x=x.next).value.length;if(S=A-=x.value.length,x.value instanceof o)continue;for(var N=x;N!==t.tail&&(A<j||"string"==typeof N.value);N=N.next)C++,A+=N.value.length;C--,E=e.slice(S,A),_.index-=S}else if(!(_=a(k,0,E,b)))continue;T=_.index;var L=_[0],R=E.slice(0,T),P=E.slice(T+L.length),O=S+E.length;d&&O>d.reach&&(d.reach=O);var D=x.prev;if(R&&(D=s(t,D,R),S+=R.length),c(t,D,C),x=s(t,D,new o(p,h?r.tokenize(L,h):L,v,L)),P&&s(t,x,P),C>1){var I={cause:p+","+g,reach:O};i(e,t,n,x.prev,S,I),d&&I.reach>d.reach&&(d.reach=I.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function s(e,t,n){var r=t.next,o={value:n,prev:t,next:r};return t.next=o,r.prev=o,e.length++,o}function c(e,t,n){for(var r=t.next,o=0;o<n&&r!==e.tail;o++)r=r.next;t.next=r,r.prev=t,e.length-=o}return o.stringify=function e(t,n){if("string"==typeof t)return t;if(Array.isArray(t)){var o="";return t.forEach((function(t){o+=e(t,n)})),o}var a={type:t.type,content:e(t.content,n),tag:"span",classes:["token",t.type],attributes:{},language:n},i=t.alias;i&&(Array.isArray(i)?Array.prototype.push.apply(a.classes,i):a.classes.push(i)),r.hooks.run("wrap",a);var l="";for(var s in a.attributes)l+=" "+s+'="'+(a.attributes[s]||"").replace(/"/g,""")+'"';return"<"+a.tag+' class="'+a.classes.join(" ")+'"'+l+">"+a.content+"</"+a.tag+">"},r}();t.exports=n,n.default=n}},function(){return o||(0,r[b(r)[0]])((o={exports:{}}).exports,o),o.exports}),T=((e,t,n)=>(n=null!=e?p(v(e)):{},((e,t,n,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let o of b(t))w.call(e,o)||o===n||f(e,o,{get:()=>t[o],enumerable:!(r=m(t,o))||r.enumerable});return e})(!t&&e&&e.__esModule?n:f(n,"default",{value:e,enumerable:!0}),e)))(C());T.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},T.languages.markup.tag.inside["attr-value"].inside.entity=T.languages.markup.entity,T.languages.markup.doctype.inside["internal-subset"].inside=T.languages.markup,T.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(T.languages.markup.tag,"addInlined",{value:function(e,t){var n;(t=((n=((n={})["language-"+t]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:T.languages[t]},n.cdata=/^<!\[CDATA\[|\]\]>$/i,{"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:n}}))["language-"+t]={pattern:/[\s\S]+/,inside:T.languages[t]},{}))[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:n},T.languages.insertBefore("markup","cdata",t)}}),Object.defineProperty(T.languages.markup.tag,"addAttribute",{value:function(e,t){T.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:T.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),T.languages.html=T.languages.markup,T.languages.mathml=T.languages.markup,T.languages.svg=T.languages.markup,T.languages.xml=T.languages.extend("markup",{}),T.languages.ssml=T.languages.xml,T.languages.atom=T.languages.xml,T.languages.rss=T.languages.xml,a=T,i={pattern:/\\[\\(){}[\]^$+*?|.]/,alias:"escape"},s="(?:[^\\\\-]|"+(l=/\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/).source+")",s=RegExp(s+"-"+s),c={pattern:/(<|')[^<>']+(?=[>']$)/,lookbehind:!0,alias:"variable"},a.languages.regex={"char-class":{pattern:/((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,lookbehind:!0,inside:{"char-class-negation":{pattern:/(^\[)\^/,lookbehind:!0,alias:"operator"},"char-class-punctuation":{pattern:/^\[|\]$/,alias:"punctuation"},range:{pattern:s,inside:{escape:l,"range-punctuation":{pattern:/-/,alias:"operator"}}},"special-escape":i,"char-set":{pattern:/\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},escape:l}},"special-escape":i,"char-set":{pattern:/\.|\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},backreference:[{pattern:/\\(?![123][0-7]{2})[1-9]/,alias:"keyword"},{pattern:/\\k<[^<>']+>/,alias:"keyword",inside:{"group-name":c}}],anchor:{pattern:/[$^]|\\[ABbGZz]/,alias:"function"},escape:l,group:[{pattern:/\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|<?[=!]|[idmnsuxU]+(?:-[idmnsuxU]+)?:?))?/,alias:"punctuation",inside:{"group-name":c}},{pattern:/\)/,alias:"punctuation"}],quantifier:{pattern:/(?:[+*?]|\{\d+(?:,\d*)?\})[?+]?/,alias:"number"},alternation:{pattern:/\|/,alias:"keyword"}},T.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},T.languages.javascript=T.languages.extend("clike",{"class-name":[T.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),T.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,T.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:T.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:T.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:T.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:T.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:T.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),T.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:T.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),T.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),T.languages.markup&&(T.languages.markup.tag.addInlined("script","javascript"),T.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),T.languages.js=T.languages.javascript,T.languages.actionscript=T.languages.extend("javascript",{keyword:/\b(?:as|break|case|catch|class|const|default|delete|do|dynamic|each|else|extends|final|finally|for|function|get|if|implements|import|in|include|instanceof|interface|internal|is|namespace|native|new|null|override|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|use|var|void|while|with)\b/,operator:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<<?|>>?>?|[!=]=?)=?|[~?@]/}),T.languages.actionscript["class-name"].alias="function",delete T.languages.actionscript.parameter,delete T.languages.actionscript["literal-property"],T.languages.markup&&T.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:T.languages.markup}}),function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(T),function(e){var t=e.languages.javadoclike={parameter:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(t,"addSupport",{value:function(t,n){(t="string"==typeof t?[t]:t).forEach((function(t){var r=function(e){e.inside||(e.inside={}),e.inside.rest=n},o="doc-comment";if(a=e.languages[t]){var a,i=a[o];if((i=i||(a=e.languages.insertBefore(t,"comment",{"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}}))[o])instanceof RegExp&&(i=a[o]={pattern:i}),Array.isArray(i))for(var l=0,s=i.length;l<s;l++)i[l]instanceof RegExp&&(i[l]={pattern:i[l]}),r(i[l]);else r(i)}}))}}),t.addSupport(["java","javascript","php"],t)}(T),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;(t=(e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+t.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css,e.languages.markup))&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(T),function(e){var t=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,n=(t=(e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+t.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[t,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}}),{pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0}),{pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0});e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|RebeccaPurple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,number:n})}(T),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",o=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-]<PLAIN>)(?:[ \t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*/.source.replace(/<PLAIN>/g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),a=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<<prop>>[ \t]+)?)(?:<<value>>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<<prop>>/g,(function(){return r})).replace(/<<value>>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<<prop>>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<<prop>>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<<prop>>[ \t]+)?)<<key>>(?=\s*:\s)/.source.replace(/<<prop>>/g,(function(){return r})).replace(/<<key>>/g,(function(){return"(?:"+o+"|"+a+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(a),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(T),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(/<inner>/g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,o=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),a=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source,i=(e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+o+a+"(?:"+o+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+o+a+")(?:"+o+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+o+")"+a+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+o+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)<inner>|_(?:(?!_)<inner>)+_)+__\b|\*\*(?:(?!\*)<inner>|\*(?:(?!\*)<inner>)+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)<inner>|__(?:(?!_)<inner>)+__)+_\b|\*(?:(?!\*)<inner>|\*\*(?:(?!\*)<inner>)+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~)<inner>)+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\])<inner>)+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\])<inner>)+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n<r;n++){var o,a=t[n];"code"!==a.type?e(a.content):(o=a.content[1],a=a.content[3],o&&a&&"code-language"===o.type&&"code-block"===a.type&&"string"==typeof o.content&&(o=o.content.replace(/\b#/g,"sharp").replace(/\b\+\+/g,"pp"),o="language-"+(o=(/[a-z][\w-]*/i.exec(o)||[""])[0].toLowerCase()),a.alias?"string"==typeof a.alias?a.alias=[a.alias,o]:a.alias.push(o):a.alias=[o]))}}(e.tokens)})),e.hooks.add("wrap",(function(t){if("code-block"===t.type){for(var n="",r=0,o=t.classes.length;r<o;r++){var a=t.classes[r];if(a=/language-(.+)/.exec(a)){n=a[1];break}}var c,u=e.languages[n];u?t.content=e.highlight(t.content.replace(i,"").replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi,(function(e,t){var n;return"#"===(t=t.toLowerCase())[0]?(n="x"===t[1]?parseInt(t.slice(2),16):Number(t.slice(1)),s(n)):l[t]||e})),u,n):n&&"none"!==n&&e.plugins.autoloader&&(c="md-"+(new Date).valueOf()+"-"+Math.floor(1e16*Math.random()),t.attributes.id=c,e.plugins.autoloader.loadLanguages(n,(function(){var t=document.getElementById(c);t&&(t.innerHTML=e.highlight(t.textContent,e.languages[n],n))})))}})),RegExp(e.languages.markup.tag.pattern.source,"gi")),l={amp:"&",lt:"<",gt:">",quot:'"'},s=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(T),T.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:T.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},T.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n<t.length;){var r=t[n++];if("keyword"===r.type&&"mutation"===r.content){var o=[];if(d(["definition-mutation","punctuation"])&&"("===u(1).content){n+=2;var a=p(/^\($/,/^\)$/);if(-1===a)continue;for(;n<a;n++){var i=u(0);"variable"===i.type&&(f(i,"variable-input"),o.push(i.content))}n=a+1}if(d(["punctuation","property-query"])&&"{"===u(0).content&&(n++,f(u(0),"property-mutation"),0<o.length)){var l=p(/^\{$/,/^\}$/);if(-1!==l)for(var s=n;s<l;s++){var c=t[s];"variable"===c.type&&0<=o.indexOf(c.content)&&f(c,"variable-input")}}}}function u(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n<e.length;n++){var r=u(n+t);if(!r||r.type!==e[n])return}return 1}function p(e,r){for(var o=1,a=n;a<t.length;a++){var i=t[a],l=i.content;if("punctuation"===i.type&&"string"==typeof l)if(e.test(l))o++;else if(r.test(l)&&0==--o)return a}return-1}function f(e,t){var n=e.alias;n?Array.isArray(n)||(e.alias=n=[n]):e.alias=n=[],n.push(t)}})),T.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,o=r.inside["interpolation-punctuation"],a=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function l(t,n,r){return t={code:t,grammar:n,language:r},e.hooks.run("before-tokenize",t),t.tokens=e.tokenize(t.code,t.grammar),e.hooks.run("after-tokenize",t),t.tokens}function s(t,n,i){var s=e.tokenize(t,{interpolation:{pattern:RegExp(a),lookbehind:!0}}),c=0,u={},d=(s=l(s.map((function(e){if("string"==typeof e)return e;var n,r;for(e=e.content;-1!==t.indexOf((r=c++,n="___"+i.toUpperCase()+"_"+r+"___")););return u[n]=e,n})).join(""),n,i),Object.keys(u));return c=0,function t(n){for(var a=0;a<n.length;a++){if(c>=d.length)return;var i,s,p,f,g,m,h,b=n[a];"string"==typeof b||"string"==typeof b.content?(i=d[c],-1!==(h=(m="string"==typeof b?b:b.content).indexOf(i))&&(++c,s=m.substring(0,h),g=u[i],p=void 0,(f={})["interpolation-punctuation"]=o,3===(f=e.tokenize(g,f)).length&&((p=[1,1]).push.apply(p,l(f[1],e.languages.javascript,"javascript")),f.splice.apply(f,p)),p=new e.Token("interpolation",f,r.alias,g),f=m.substring(h+i.length),g=[],s&&g.push(s),g.push(p),f&&(t(m=[f]),g.push.apply(g,m)),"string"==typeof b?(n.splice.apply(n,[a,1].concat(g)),a+=g.length-1):b.content=g)):(h=b.content,Array.isArray(h)?t(h):t([h]))}}(s),new e.Token(i,s,"language-"+i,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var c={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function u(e){return"string"==typeof e?e:Array.isArray(e)?e.map(u).join(""):u(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in c&&function t(n){for(var r=0,o=n.length;r<o;r++){var a,i,l,c=n[r];"string"!=typeof c&&(a=c.content,Array.isArray(a)?"template-string"===c.type?(c=a[1],3===a.length&&"string"!=typeof c&&"embedded-code"===c.type&&(i=u(c),c=c.alias,c=Array.isArray(c)?c[0]:c,l=e.languages[c])&&(a[1]=s(i,l,c))):t(a):"string"!=typeof a&&t([a]))}}(t.tokens)}))}(T),function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(T),function(e){var t=e.languages.javascript,n=/\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})+\}/.source,r="(@(?:arg|argument|param|property)\\s+(?:"+n+"\\s+)?)";e.languages.jsdoc=e.languages.extend("javadoclike",{parameter:{pattern:RegExp(r+/(?:(?!\s)[$\w\xA0-\uFFFF.])+(?=\s|$)/.source),lookbehind:!0,inside:{punctuation:/\./}}}),e.languages.insertBefore("jsdoc","keyword",{"optional-parameter":{pattern:RegExp(r+/\[(?:(?!\s)[$\w\xA0-\uFFFF.])+(?:=[^[\]]+)?\](?=\s|$)/.source),lookbehind:!0,inside:{parameter:{pattern:/(^\[)[$\w\xA0-\uFFFF\.]+/,lookbehind:!0,inside:{punctuation:/\./}},code:{pattern:/(=)[\s\S]*(?=\]$)/,lookbehind:!0,inside:t,alias:"language-javascript"},punctuation:/[=[\]]/}},"class-name":[{pattern:RegExp(/(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\s+(?:<TYPE>\s+)?)[A-Z]\w*(?:\.[A-Z]\w*)*/.source.replace(/<TYPE>/g,(function(){return n}))),lookbehind:!0,inside:{punctuation:/\./}},{pattern:RegExp("(@[a-z]+\\s+)"+n),lookbehind:!0,inside:{string:t.string,number:t.number,boolean:t.boolean,keyword:e.languages.typescript.keyword,operator:/=>|\.\.\.|[&|?:*]/,punctuation:/[.,;=<>{}()[\]]/}}],example:{pattern:/(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^([\t ]*(?:\*\s*)?)\S.*$/m,lookbehind:!0,inside:t,alias:"language-javascript"}}}}),e.languages.javadoclike.addSupport("javascript",e.languages.jsdoc)}(T),function(e){e.languages.flow=e.languages.extend("javascript",{}),e.languages.insertBefore("flow","keyword",{type:[{pattern:/\b(?:[Bb]oolean|Function|[Nn]umber|[Ss]tring|[Ss]ymbol|any|mixed|null|void)\b/,alias:"class-name"}]}),e.languages.flow["function-variable"].pattern=/(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i,delete e.languages.flow.parameter,e.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(e.languages.flow.keyword)||(e.languages.flow.keyword=[e.languages.flow.keyword]),e.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,lookbehind:!0})}(T),T.languages.n4js=T.languages.extend("javascript",{keyword:/\b(?:Array|any|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/}),T.languages.insertBefore("n4js","constant",{annotation:{pattern:/@+\w+/,alias:"operator"}}),T.languages.n4jsd=T.languages.n4js,function(e){function t(e,t){return RegExp(e.replace(/<ID>/g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:<ID>(?:\s*,\s*(?:\*\s*as\s+<ID>|\{[^{}]*\}))?|\*\s*as\s+<ID>|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+<ID>)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?<ID>/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r<n.length;r++){var o=n[r],a=e.languages.javascript[o];o=(a="RegExp"===e.util.type(a)?e.languages.javascript[o]={pattern:a}:a).inside||{};(a.inside=o)["maybe-class-name"]=/^[A-Z][\s\S]*/}}(T),function(e){var t=e.util.clone(e.languages.javascript),n=/(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source,r=/(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source,o=/(?:\{<S>*\.{3}(?:[^{}]|<BRACES>)*\})/.source;function a(e,t){return e=e.replace(/<S>/g,(function(){return n})).replace(/<BRACES>/g,(function(){return r})).replace(/<SPREAD>/g,(function(){return o})),RegExp(e,t)}function i(t){for(var n=[],r=0;r<t.length;r++){var o=t[r],a=!1;"string"!=typeof o&&("tag"===o.type&&o.content[0]&&"tag"===o.content[0].type?"</"===o.content[0].content[0].content?0<n.length&&n[n.length-1].tagName===l(o.content[0].content[1])&&n.pop():"/>"!==o.content[o.content.length-1].content&&n.push({tagName:l(o.content[0].content[1]),openedBraces:0}):0<n.length&&"punctuation"===o.type&&"{"===o.content?n[n.length-1].openedBraces++:0<n.length&&0<n[n.length-1].openedBraces&&"punctuation"===o.type&&"}"===o.content?n[n.length-1].openedBraces--:a=!0),(a||"string"==typeof o)&&0<n.length&&0===n[n.length-1].openedBraces&&(a=l(o),r<t.length-1&&("string"==typeof t[r+1]||"plain-text"===t[r+1].type)&&(a+=l(t[r+1]),t.splice(r+1,1)),0<r&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(a=l(t[r-1])+a,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",a,null,a)),o.content&&"string"!=typeof o.content&&i(o.content)}}o=a(o).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=a(/<\/?(?:[\w.:-]+(?:<S>+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|<BRACES>))?|<SPREAD>))*<S>*\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:a(/<SPREAD>/.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:a(/=<BRACES>/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var l=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(l).join(""):""};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||i(e.tokens)}))}(T),function(e){var t=e.util.clone(e.languages.typescript);(t=(e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"],e.languages.tsx.tag)).pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+t.pattern.source+")",t.pattern.flags),t.lookbehind=!0}(T),T.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp(/(^|[^"#])/.source+"(?:"+/"(?:\\(?:\((?:[^()]|\([^()]*\))*\)|\r\n|[^(])|[^\\\r\n"])*"/.source+"|"+/"""(?:\\(?:\((?:[^()]|\([^()]*\))*\)|[^(])|[^\\"]|"(?!""))*"""/.source+")"+/(?!["#])/.source),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp(/(^|[^"#])(#+)/.source+"(?:"+/"(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|\r\n|[^#])|[^\\\r\n])*?"/.source+"|"+/"""(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|[^#])|[^\\])*?"""/.source+")\\2"),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp(/#/.source+"(?:"+/(?:elseif|if)\b/.source+"(?:[ \t]*"+/(?:![ \t]*)?(?:\b\w+\b(?:[ \t]*\((?:[^()]|\([^()]*\))*\))?|\((?:[^()]|\([^()]*\))*\))(?:[ \t]*(?:&&|\|\|))?/.source+")+|"+/(?:else|endif)\b/.source+")"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},T.languages.swift["string-literal"].forEach((function(e){e.inside.interpolation.inside=T.languages.swift})),function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"];var t={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:e.languages.kotlin}};e.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:t},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:t},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete e.languages.kotlin.string,e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(T),T.languages.c=T.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),T.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),T.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},T.languages.c.string],char:T.languages.c.char,comment:T.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:T.languages.c}}}}),T.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete T.languages.c.boolean,T.languages.objectivec=T.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete T.languages.objectivec["class-name"],T.languages.objc=T.languages.objectivec,T.languages.reason=T.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),T.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete T.languages.reason.function,function(e){for(var t=/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|<self>)*\*\//.source,n=0;n<2;n++)t=t.replace(/<self>/g,(function(){return t}));t=t.replace(/<self>/g,(function(){return/[^\s\S]/.source})),e.languages.rust={comment:[{pattern:RegExp(/(^|[^\\])/.source+t),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<<?=?|>>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(T),T.languages.go=T.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),T.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete T.languages.go["class-name"],function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!<keyword>)\w+(?:\s*\.\s*\w+)*\b/.source.replace(/<keyword>/g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!<keyword>)\w+/.source.replace(/<keyword>/g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/<mod-name>(?:\s*:\s*<mod-name>)?|:\s*<mod-name>/.source.replace(/<mod-name>/g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(T),T.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},T.languages.python["string-interpolation"].inside.interpolation.inside.rest=T.languages.python,T.languages.py=T.languages.python;((e,t)=>{for(var n in t)f(e,n,{get:t[n],enumerable:!0})})({},{dracula:()=>j,duotoneDark:()=>A,duotoneLight:()=>N,github:()=>L,jettwaveDark:()=>H,jettwaveLight:()=>G,nightOwl:()=>R,nightOwlLight:()=>P,oceanicNext:()=>I,okaidia:()=>M,oneDark:()=>V,oneLight:()=>W,palenight:()=>F,shadesOfPurple:()=>z,synthwave84:()=>B,ultramin:()=>U,vsDark:()=>$,vsLight:()=>q});var j={plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},A={plain:{backgroundColor:"#2a2734",color:"#9a86fd"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#6c6783"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#e09142"}},{types:["property","function"],style:{color:"#9a86fd"}},{types:["tag-id","selector","atrule-id"],style:{color:"#eeebff"}},{types:["attr-name"],style:{color:"#c4b9fe"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule","placeholder","variable"],style:{color:"#ffcc99"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#c4b9fe"}}]},N={plain:{backgroundColor:"#faf8f5",color:"#728fcb"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#b6ad9a"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#063289"}},{types:["property","function"],style:{color:"#b29762"}},{types:["tag-id","selector","atrule-id"],style:{color:"#2d2006"}},{types:["attr-name"],style:{color:"#896724"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule"],style:{color:"#728fcb"}},{types:["placeholder","variable"],style:{color:"#93abdc"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#896724"}}]},L={plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},R={plain:{color:"#d6deeb",backgroundColor:"#011627"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"}},{types:["inserted","attr-name"],style:{color:"rgb(173, 219, 103)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(99, 119, 119)",fontStyle:"italic"}},{types:["string","url"],style:{color:"rgb(173, 219, 103)"}},{types:["variable"],style:{color:"rgb(214, 222, 235)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation"],style:{color:"rgb(199, 146, 234)"}},{types:["selector","doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["class-name"],style:{color:"rgb(255, 203, 139)"}},{types:["tag","operator","keyword"],style:{color:"rgb(127, 219, 202)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["property"],style:{color:"rgb(128, 203, 196)"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}}]},P={plain:{color:"#403f53",backgroundColor:"#FBFBFB"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"}},{types:["inserted","attr-name"],style:{color:"rgb(72, 118, 214)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(152, 159, 177)",fontStyle:"italic"}},{types:["string","builtin","char","constant","url"],style:{color:"rgb(72, 118, 214)"}},{types:["variable"],style:{color:"rgb(201, 103, 101)"}},{types:["number"],style:{color:"rgb(170, 9, 130)"}},{types:["punctuation"],style:{color:"rgb(153, 76, 195)"}},{types:["function","selector","doctype"],style:{color:"rgb(153, 76, 195)",fontStyle:"italic"}},{types:["class-name"],style:{color:"rgb(17, 17, 17)"}},{types:["tag"],style:{color:"rgb(153, 76, 195)"}},{types:["operator","property","keyword","namespace"],style:{color:"rgb(12, 150, 155)"}},{types:["boolean"],style:{color:"rgb(188, 84, 84)"}}]},O="#c5a5c5",D="#8dc891",I={plain:{backgroundColor:"#282c34",color:"#ffffff"},styles:[{types:["attr-name"],style:{color:O}},{types:["attr-value"],style:{color:D}},{types:["comment","block-comment","prolog","doctype","cdata","shebang"],style:{color:"#999999"}},{types:["property","number","function-name","constant","symbol","deleted"],style:{color:"#5a9bcf"}},{types:["boolean"],style:{color:"#ff8b50"}},{types:["tag"],style:{color:"#fc929e"}},{types:["string"],style:{color:D}},{types:["punctuation"],style:{color:D}},{types:["selector","char","builtin","inserted"],style:{color:"#D8DEE9"}},{types:["function"],style:{color:"#79b6f2"}},{types:["operator","entity","url","variable"],style:{color:"#d7deea"}},{types:["keyword"],style:{color:O}},{types:["atrule","class-name"],style:{color:"#FAC863"}},{types:["important"],style:{fontWeight:"400"}},{types:["bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}}]},M={plain:{color:"#f8f8f2",backgroundColor:"#272822"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"#f92672",fontStyle:"italic"}},{types:["inserted"],style:{color:"rgb(173, 219, 103)",fontStyle:"italic"}},{types:["comment"],style:{color:"#8292a2",fontStyle:"italic"}},{types:["string","url"],style:{color:"#a6e22e"}},{types:["variable"],style:{color:"#f8f8f2"}},{types:["number"],style:{color:"#ae81ff"}},{types:["builtin","char","constant","function","class-name"],style:{color:"#e6db74"}},{types:["punctuation"],style:{color:"#f8f8f2"}},{types:["selector","doctype"],style:{color:"#a6e22e",fontStyle:"italic"}},{types:["tag","operator","keyword"],style:{color:"#66d9ef"}},{types:["boolean"],style:{color:"#ae81ff"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)",opacity:.7}},{types:["tag","property"],style:{color:"#f92672"}},{types:["attr-name"],style:{color:"#a6e22e !important"}},{types:["doctype"],style:{color:"#8292a2"}},{types:["rule"],style:{color:"#e6db74"}}]},F={plain:{color:"#bfc7d5",backgroundColor:"#292d3e"},styles:[{types:["comment"],style:{color:"rgb(105, 112, 152)",fontStyle:"italic"}},{types:["string","inserted"],style:{color:"rgb(195, 232, 141)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation","selector"],style:{color:"rgb(199, 146, 234)"}},{types:["variable"],style:{color:"rgb(191, 199, 213)"}},{types:["class-name","attr-name"],style:{color:"rgb(255, 203, 107)"}},{types:["tag","deleted"],style:{color:"rgb(255, 85, 114)"}},{types:["operator"],style:{color:"rgb(137, 221, 255)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["keyword"],style:{fontStyle:"italic"}},{types:["doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}},{types:["url"],style:{color:"rgb(221, 221, 221)"}}]},z={plain:{color:"#9EFEFF",backgroundColor:"#2D2A55"},styles:[{types:["changed"],style:{color:"rgb(255, 238, 128)"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)"}},{types:["inserted"],style:{color:"rgb(173, 219, 103)"}},{types:["comment"],style:{color:"rgb(179, 98, 255)",fontStyle:"italic"}},{types:["punctuation"],style:{color:"rgb(255, 255, 255)"}},{types:["constant"],style:{color:"rgb(255, 98, 140)"}},{types:["string","url"],style:{color:"rgb(165, 255, 144)"}},{types:["variable"],style:{color:"rgb(255, 238, 128)"}},{types:["number","boolean"],style:{color:"rgb(255, 98, 140)"}},{types:["attr-name"],style:{color:"rgb(255, 180, 84)"}},{types:["keyword","operator","property","namespace","tag","selector","doctype"],style:{color:"rgb(255, 157, 0)"}},{types:["builtin","char","constant","function","class-name"],style:{color:"rgb(250, 208, 0)"}}]},B={plain:{backgroundColor:"linear-gradient(to bottom, #2a2139 75%, #34294f)",backgroundImage:"#34294f",color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"},styles:[{types:["comment","block-comment","prolog","doctype","cdata"],style:{color:"#495495",fontStyle:"italic"}},{types:["punctuation"],style:{color:"#ccc"}},{types:["tag","attr-name","namespace","number","unit","hexcode","deleted"],style:{color:"#e2777a"}},{types:["property","selector"],style:{color:"#72f1b8",textShadow:"0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475"}},{types:["function-name"],style:{color:"#6196cc"}},{types:["boolean","selector-id","function"],style:{color:"#fdfdfd",textShadow:"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975"}},{types:["class-name","maybe-class-name","builtin"],style:{color:"#fff5f6",textShadow:"0 0 2px #000, 0 0 10px #fc1f2c75, 0 0 5px #fc1f2c75, 0 0 25px #fc1f2c75"}},{types:["constant","symbol"],style:{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"}},{types:["important","atrule","keyword","selector-class"],style:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"}},{types:["string","char","attr-value","regex","variable"],style:{color:"#f87c32"}},{types:["parameter"],style:{fontStyle:"italic"}},{types:["entity","url"],style:{color:"#67cdcc"}},{types:["operator"],style:{color:"ffffffee"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["entity"],style:{cursor:"help"}},{types:["inserted"],style:{color:"green"}}]},U={plain:{color:"#282a2e",backgroundColor:"#ffffff"},styles:[{types:["comment"],style:{color:"rgb(197, 200, 198)"}},{types:["string","number","builtin","variable"],style:{color:"rgb(150, 152, 150)"}},{types:["class-name","function","tag","attr-name"],style:{color:"rgb(40, 42, 46)"}}]},$={plain:{color:"#9CDCFE",backgroundColor:"#1E1E1E"},styles:[{types:["prolog"],style:{color:"rgb(0, 0, 128)"}},{types:["comment"],style:{color:"rgb(106, 153, 85)"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"rgb(86, 156, 214)"}},{types:["number","inserted"],style:{color:"rgb(181, 206, 168)"}},{types:["constant"],style:{color:"rgb(100, 102, 149)"}},{types:["attr-name","variable"],style:{color:"rgb(156, 220, 254)"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"rgb(206, 145, 120)"}},{types:["selector"],style:{color:"rgb(215, 186, 125)"}},{types:["tag"],style:{color:"rgb(78, 201, 176)"}},{types:["tag"],languages:["markup"],style:{color:"rgb(86, 156, 214)"}},{types:["punctuation","operator"],style:{color:"rgb(212, 212, 212)"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"rgb(220, 220, 170)"}},{types:["class-name"],style:{color:"rgb(78, 201, 176)"}},{types:["char"],style:{color:"rgb(209, 105, 105)"}}]},q={plain:{color:"#000000",backgroundColor:"#ffffff"},styles:[{types:["comment"],style:{color:"rgb(0, 128, 0)"}},{types:["builtin"],style:{color:"rgb(0, 112, 193)"}},{types:["number","variable","inserted"],style:{color:"rgb(9, 134, 88)"}},{types:["operator"],style:{color:"rgb(0, 0, 0)"}},{types:["constant","char"],style:{color:"rgb(129, 31, 63)"}},{types:["tag"],style:{color:"rgb(128, 0, 0)"}},{types:["attr-name"],style:{color:"rgb(255, 0, 0)"}},{types:["deleted","string"],style:{color:"rgb(163, 21, 21)"}},{types:["changed","punctuation"],style:{color:"rgb(4, 81, 165)"}},{types:["function","keyword"],style:{color:"rgb(0, 0, 255)"}},{types:["class-name"],style:{color:"rgb(38, 127, 153)"}}]},H={plain:{color:"#f8fafc",backgroundColor:"#011627"},styles:[{types:["prolog"],style:{color:"#000080"}},{types:["comment"],style:{color:"#6A9955"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"#569CD6"}},{types:["number","inserted"],style:{color:"#B5CEA8"}},{types:["constant"],style:{color:"#f8fafc"}},{types:["attr-name","variable"],style:{color:"#9CDCFE"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"#cbd5e1"}},{types:["selector"],style:{color:"#D7BA7D"}},{types:["tag"],style:{color:"#0ea5e9"}},{types:["tag"],languages:["markup"],style:{color:"#0ea5e9"}},{types:["punctuation","operator"],style:{color:"#D4D4D4"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"#7dd3fc"}},{types:["class-name"],style:{color:"#0ea5e9"}},{types:["char"],style:{color:"#D16969"}}]},G={plain:{color:"#0f172a",backgroundColor:"#f1f5f9"},styles:[{types:["prolog"],style:{color:"#000080"}},{types:["comment"],style:{color:"#6A9955"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"#0c4a6e"}},{types:["number","inserted"],style:{color:"#B5CEA8"}},{types:["constant"],style:{color:"#0f172a"}},{types:["attr-name","variable"],style:{color:"#0c4a6e"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"#64748b"}},{types:["selector"],style:{color:"#D7BA7D"}},{types:["tag"],style:{color:"#0ea5e9"}},{types:["tag"],languages:["markup"],style:{color:"#0ea5e9"}},{types:["punctuation","operator"],style:{color:"#475569"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"#0e7490"}},{types:["class-name"],style:{color:"#0ea5e9"}},{types:["char"],style:{color:"#D16969"}}]},V={plain:{backgroundColor:"hsl(220, 13%, 18%)",color:"hsl(220, 14%, 71%)",textShadow:"0 1px rgba(0, 0, 0, 0.3)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(220, 10%, 40%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(220, 14%, 71%)"}},{types:["attr-name","class-name","maybe-class-name","boolean","constant","number","atrule"],style:{color:"hsl(29, 54%, 61%)"}},{types:["keyword"],style:{color:"hsl(286, 60%, 67%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(355, 65%, 65%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value"],style:{color:"hsl(95, 38%, 62%)"}},{types:["variable","operator","function"],style:{color:"hsl(207, 82%, 66%)"}},{types:["url"],style:{color:"hsl(187, 47%, 55%)"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"hsl(220, 14%, 71%)"}}]},W={plain:{backgroundColor:"hsl(230, 1%, 98%)",color:"hsl(230, 8%, 24%)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(230, 4%, 64%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(230, 8%, 24%)"}},{types:["attr-name","class-name","boolean","constant","number","atrule"],style:{color:"hsl(35, 99%, 36%)"}},{types:["keyword"],style:{color:"hsl(301, 63%, 40%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(5, 74%, 59%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value","punctuation"],style:{color:"hsl(119, 34%, 47%)"}},{types:["variable","operator","function"],style:{color:"hsl(221, 87%, 60%)"}},{types:["url"],style:{color:"hsl(198, 99%, 37%)"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"hsl(230, 8%, 24%)"}}]},Q=(e,t)=>{const{plain:n}=e,r=e.styles.reduce(((e,n)=>{const{languages:r,style:o}=n;return r&&!r.includes(t)||n.types.forEach((t=>{const n=S(S({},e[t]),o);e[t]=n})),e}),{});return r.root=n,r.plain=E(S({},n),{backgroundColor:void 0}),r},Y=/\r\n|\r|\n/,K=e=>{0===e.length?e.push({types:["plain"],content:"\n",empty:!0}):1===e.length&&""===e[0].content&&(e[0].content="\n",e[0].empty=!0)},X=(e,t)=>{const n=e.length;return n>0&&e[n-1]===t?e:e.concat(t)},Z=e=>{const t=[[]],n=[e],r=[0],o=[e.length];let a=0,i=0,l=[];const s=[l];for(;i>-1;){for(;(a=r[i]++)<o[i];){let e,c=t[i];const u=n[i][a];if("string"==typeof u?(c=i>0?c:["plain"],e=u):(c=X(c,u.type),u.alias&&(c=X(c,u.alias)),e=u.content),"string"!=typeof e){i++,t.push(c),n.push(e),r.push(0),o.push(e.length);continue}const d=e.split(Y),p=d.length;l.push({types:c,content:d[0]});for(let t=1;t<p;t++)K(l),s.push(l=[]),l.push({types:c,content:d[t]})}i--,t.pop(),n.pop(),r.pop(),o.pop()}return K(l),s},J=({children:e,language:t,code:n,theme:r,prism:o})=>{const a=t.toLowerCase(),i=((e,t)=>{const[n,r]=(0,u.useState)(Q(t,e)),o=(0,u.useRef)(),a=(0,u.useRef)();return(0,u.useEffect)((()=>{t===o.current&&e===a.current||(o.current=t,a.current=e,r(Q(t,e)))}),[e,t]),n})(a,r),l=(e=>(0,u.useCallback)((t=>{var n=t,{className:r,style:o,line:a}=n,i=_(n,["className","style","line"]);const l=E(S({},i),{className:(0,d.c)("token-line",r)});return"object"==typeof e&&"plain"in e&&(l.style=e.plain),"object"==typeof o&&(l.style=S(S({},l.style||{}),o)),l}),[e]))(i),s=(e=>{const t=(0,u.useCallback)((({types:t,empty:n})=>{if(null!=e)return 1===t.length&&"plain"===t[0]?null!=n?{display:"inline-block"}:void 0:1===t.length&&null!=n?e[t[0]]:Object.assign(null!=n?{display:"inline-block"}:{},...t.map((t=>e[t])))}),[e]);return(0,u.useCallback)((e=>{var n=e,{token:r,className:o,style:a}=n,i=_(n,["token","className","style"]);const l=E(S({},i),{className:(0,d.c)("token",...r.types,o),children:r.content,style:t(r)});return null!=a&&(l.style=S(S({},l.style||{}),a)),l}),[t])})(i),c=(({prism:e,code:t,grammar:n,language:r})=>{const o=(0,u.useRef)(e);return(0,u.useMemo)((()=>{if(null==n)return Z([t]);const e={code:t,grammar:n,language:r,tokens:[]};return o.current.hooks.run("before-tokenize",e),e.tokens=o.current.tokenize(t,n),o.current.hooks.run("after-tokenize",e),Z(e.tokens)}),[t,n,r])})({prism:o,language:a,code:n,grammar:o.languages[a]});return e({tokens:c,className:`prism-code language-${a}`,style:null!=i?i.root:{},getLineProps:l,getTokenProps:s})},ee=e=>(0,u.createElement)(J,E(S({},e),{prism:e.prism||T,theme:e.theme||$,code:e.code,language:e.language}))},4812:(e,t,n)=>{"use strict";n.d(t,{c:()=>a});var r=!0,o="Invariant failed";function a(e,t){if(!e){if(r)throw new Error(o);var n="function"==typeof t?t():t,a=n?"".concat(o,": ").concat(n):o;throw new Error(a)}}},144:e=>{"use strict";e.exports={}},4504:e=>{"use strict";e.exports=JSON.parse('{"/blog-756":{"__comp":"a6aa9e1f","__context":{"plugin":"a77fb37c"},"sidebar":"814f3328","items":[{"content":"3cee07f2"},{"content":"1e9048c4"},{"content":"7c5afa08"},{"content":"a4f77f3b"},{"content":"a8e7919c"},{"content":"c0b1fc1a"}],"metadata":"b2b675dd"},"/blog/archive-2f1":{"__comp":"9e4087bc","__context":{"plugin":"a77fb37c"},"archive":"b2f554cd"},"/blog/docusaurus-gh-action-6f7":{"__comp":"ccc49370","__context":{"plugin":"a77fb37c"},"sidebar":"814f3328","content":"901e7e12"},"/blog/docusaurus-posthog-3c9":{"__comp":"ccc49370","__context":{"plugin":"a77fb37c"},"sidebar":"814f3328","content":"f514138b"},"/blog/history-82f":{"__comp":"ccc49370","__context":{"plugin":"a77fb37c"},"sidebar":"814f3328","content":"6969bc8f"},"/blog/stack-2020-b08":{"__comp":"ccc49370","__context":{"plugin":"a77fb37c"},"sidebar":"814f3328","content":"773806e0"},"/blog/stashaway-f68":{"__comp":"ccc49370","__context":{"plugin":"a77fb37c"},"sidebar":"814f3328","content":"061a123b"},"/blog/tags-5f8":{"__comp":"01a85c17","__context":{"plugin":"a77fb37c"},"sidebar":"814f3328","tags":"a7023ddc"},"/blog/tags/analytics-bcd":{"__comp":"6875c492","__context":{"plugin":"a77fb37c"},"sidebar":"814f3328","items":[{"content":"1e9048c4"}],"tag":"3614913f","listMetadata":"f026c94c"},"/blog/tags/book-review-d18":{"__comp":"6875c492","__context":{"plugin":"a77fb37c"},"sidebar":"814f3328","items":[{"content":"3cee07f2"}],"tag":"3e991810","listMetadata":"c6e1e161"},"/blog/tags/ci-464":{"__comp":"6875c492","__context":{"plugin":"a77fb37c"},"sidebar":"814f3328","items":[{"content":"a4f77f3b"}],"tag":"771f38eb","listMetadata":"44183a86"},"/blog/tags/cloud-551":{"__comp":"6875c492","__context":{"plugin":"a77fb37c"},"sidebar":"814f3328","items":[{"content":"c0b1fc1a"}],"tag":"f3543915","listMetadata":"b1513dc1"},"/blog/tags/conference-4be":{"__comp":"6875c492","__context":{"plugin":"a77fb37c"},"sidebar":"814f3328","items":[{"content":"c0b1fc1a"}],"tag":"86dbdca9","listMetadata":"cff29eac"},"/blog/tags/docusaurus-ea4":{"__comp":"6875c492","__context":{"plugin":"a77fb37c"},"sidebar":"814f3328","items":[{"content":"1e9048c4"},{"content":"a4f77f3b"}],"tag":"a80da1cf","listMetadata":"608ae6a4"},"/blog/tags/github-action-6ab":{"__comp":"6875c492","__context":{"plugin":"a77fb37c"},"sidebar":"814f3328","items":[{"content":"a4f77f3b"}],"tag":"93b82f8b","listMetadata":"224a301e"},"/blog/tags/gov-tech-stack-92c":{"__comp":"6875c492","__context":{"plugin":"a77fb37c"},"sidebar":"814f3328","items":[{"content":"c0b1fc1a"}],"tag":"0440a4a2","listMetadata":"dc9e9921"},"/blog/tags/investing-1bc":{"__comp":"6875c492","__context":{"plugin":"a77fb37c"},"sidebar":"814f3328","items":[{"content":"7c5afa08"}],"tag":"1fc56582","listMetadata":"8b28c975"},"/blog/tags/microservices-add":{"__comp":"6875c492","__context":{"plugin":"a77fb37c"},"sidebar":"814f3328","items":[{"content":"c0b1fc1a"}],"tag":"40e2aa62","listMetadata":"6aa6c2d1"},"/blog/tags/posthog-8ba":{"__comp":"6875c492","__context":{"plugin":"a77fb37c"},"sidebar":"814f3328","items":[{"content":"1e9048c4"}],"tag":"ad7b700f","listMetadata":"b34035b6"},"/blog/tags/sharing-930":{"__comp":"6875c492","__context":{"plugin":"a77fb37c"},"sidebar":"814f3328","items":[{"content":"7c5afa08"},{"content":"a8e7919c"}],"tag":"3bdc16c1","listMetadata":"2c3dd313"},"/blog/tags/software-architecture-ce9":{"__comp":"6875c492","__context":{"plugin":"a77fb37c"},"sidebar":"814f3328","items":[{"content":"3cee07f2"}],"tag":"8bb152cf","listMetadata":"b4d628d3"},"/blog/tags/software-engineering-e5e":{"__comp":"6875c492","__context":{"plugin":"a77fb37c"},"sidebar":"814f3328","items":[{"content":"3cee07f2"}],"tag":"cfb8f5b6","listMetadata":"c933abd0"},"/blog/why-you-should-read-ddia-2a8":{"__comp":"ccc49370","__context":{"plugin":"a77fb37c"},"sidebar":"814f3328","content":"5b2b3d99"},"/projects/-924":{"__comp":"0d0c74f6","__context":{"plugin":"e11f84c6"},"config":"5e9f5e1a"},"/docs-720":{"__comp":"5e95c892","__context":{"plugin":"e5cc08ab"}},"/docs-1c3":{"__comp":"a7bd4aaa","version":"935f2afb"},"/docs-0ab":{"__comp":"a94703ab"},"/docs/-328":{"__comp":"17896441","content":"2dc3d3ff"},"/docs/c-cheatsheet-1af":{"__comp":"17896441","content":"609cb24b"},"/docs/docker-cheatsheet-bce":{"__comp":"17896441","content":"5fc3ba7e"},"/docs/gcp-gke-cheatsheet-f55":{"__comp":"17896441","content":"b16fdaf9"},"/docs/git-cheatsheet-dd6":{"__comp":"17896441","content":"48332b76"},"/docs/git-ignore-file-ebd":{"__comp":"17896441","content":"c4b0cf2f"},"/docs/ikigai-9ad":{"__comp":"17896441","content":"213ccdc7"},"/docs/iterm2-cheatsheet-895":{"__comp":"17896441","content":"f5abd514"},"/docs/iterm2-zsh-setup-cff":{"__comp":"17896441","content":"e25ee44f"},"/docs/js-cheatsheet-712":{"__comp":"17896441","content":"72403b3b"},"/docs/mdx-955":{"__comp":"17896441","content":"ce3e42ad"},"/docs/mininet-setup-28a":{"__comp":"17896441","content":"2419c069"},"/docs/mongodb-cheatsheet-942":{"__comp":"17896441","content":"7550f3ec"},"/docs/mongodb-setup-781":{"__comp":"17896441","content":"5d92e2d4"},"/docs/network-model-066":{"__comp":"17896441","content":"fec9c3b1"},"/docs/nodejs-auto-reload-35c":{"__comp":"17896441","content":"462880c5"},"/docs/nodejs-set-npm-run-shell-5f0":{"__comp":"17896441","content":"e25e4df4"},"/docs/os-ubuntu-cheatsheet-ad7":{"__comp":"17896441","content":"64285692"},"/docs/reading-list-5cb":{"__comp":"17896441","content":"3344da23"},"/docs/reliable-scalable-maintainable-b10":{"__comp":"17896441","content":"6855b58d"},"/docs/ruby-dependency-management-80d":{"__comp":"17896441","content":"f3002ca5"},"/docs/scaling-memcached-44f":{"__comp":"17896441","content":"b99b6768"},"/-99f":{"__comp":"c4f5d8e4","__context":{"plugin":"e11f84c6"},"config":"5e9f5e1a"}}')}},e=>{e.O(0,[2176],(()=>{return t=8808,e(e.s=t);var t}));e.O()}]); \ No newline at end of file diff --git a/assets/js/main.10594bc9.js.LICENSE.txt b/assets/js/main.10594bc9.js.LICENSE.txt new file mode 100644 index 00000000..91dc8949 --- /dev/null +++ b/assets/js/main.10594bc9.js.LICENSE.txt @@ -0,0 +1,64 @@ +/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress + * @license MIT */ + +/*! Bundled license information: + +prismjs/prism.js: + (** + * Prism: Lightweight, robust, elegant syntax highlighting + * + * @license MIT <https://opensource.org/licenses/MIT> + * @author Lea Verou <https://lea.verou.me> + * @namespace + * @public + *) +*/ + +/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * @license React + * react-jsx-runtime.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * @license React + * scheduler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v16.13.1 + * react-is.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ diff --git a/assets/js/runtime~main.61db446f.js b/assets/js/runtime~main.61db446f.js new file mode 100644 index 00000000..7fbce175 --- /dev/null +++ b/assets/js/runtime~main.61db446f.js @@ -0,0 +1 @@ +(()=>{"use strict";var e,a,c,f,b,d={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var c=t[e]={id:e,loaded:!1,exports:{}};return d[e].call(c.exports,c,c.exports,r),c.loaded=!0,c.exports}r.m=d,r.c=t,e=[],r.O=(a,c,f,b)=>{if(!c){var d=1/0;for(i=0;i<e.length;i++){c=e[i][0],f=e[i][1],b=e[i][2];for(var t=!0,o=0;o<c.length;o++)(!1&b||d>=b)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,b<d&&(d=b));if(t){e.splice(i--,1);var n=f();void 0!==n&&(a=n)}}return a}b=b||0;for(var i=e.length;i>0&&e[i-1][2]>b;i--)e[i]=e[i-1];e[i]=[c,f,b]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var b=Object.create(null);r.r(b);var d={};a=a||[null,c({}),c([]),c(c)];for(var t=2&f&&e;"object"==typeof t&&!~a.indexOf(t);t=c(t))Object.getOwnPropertyNames(t).forEach((a=>d[a]=()=>e[a]));return d.default=()=>e,r.d(b,d),b},r.d=(e,a)=>{for(var c in a)r.o(a,c)&&!r.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,c)=>(r.f[c](e,a),a)),[])),r.u=e=>"assets/js/"+({12:"6875c492",284:"fec9c3b1",586:"3cee07f2",588:"f3002ca5",712:"609cb24b",832:"e25e4df4",1528:"061a123b",1720:"1fc56582",1880:"1e9048c4",2020:"3e991810",2268:"213ccdc7",2304:"e25ee44f",2392:"40e2aa62",2552:"a77fb37c",2568:"f026c94c",2632:"c4f5d8e4",2740:"5fc3ba7e",2960:"6969bc8f",3028:"8b28c975",3376:"f5abd514",3431:"3614913f",3663:"c6e1e161",3700:"2c3dd313",4048:"ad7b700f",4304:"5e95c892",4492:"c933abd0",4500:"901e7e12",4520:"3344da23",4666:"a94703ab",4720:"771f38eb",4776:"b34035b6",4888:"773806e0",4932:"7c5afa08",4936:"64285692",4976:"a6aa9e1f",5104:"0440a4a2",5144:"c4b0cf2f",5168:"608ae6a4",5244:"462880c5",5512:"814f3328",5528:"b1513dc1",5664:"a4f77f3b",5696:"935f2afb",5744:"e5cc08ab",5796:"6aa6c2d1",6040:"5b2b3d99",6152:"f3543915",6220:"0d0c74f6",6292:"b2b675dd",6344:"ccc49370",6500:"a7bd4aaa",6664:"ce3e42ad",6752:"17896441",6764:"b4d628d3",6880:"b2f554cd",6928:"8bb152cf",6942:"44183a86",6984:"cff29eac",7028:"9e4087bc",7388:"a8e7919c",7464:"b99b6768",7576:"3bdc16c1",7640:"cfb8f5b6",7816:"86dbdca9",7850:"f514138b",7904:"2419c069",7968:"2dc3d3ff",8056:"7550f3ec",8132:"6855b58d",8284:"48332b76",8412:"01a85c17",8600:"a80da1cf",8650:"93b82f8b",8876:"224a301e",9060:"c0b1fc1a",9112:"a7023ddc",9311:"e11f84c6",9372:"dc9e9921",9392:"5d92e2d4",9448:"b16fdaf9",9728:"72403b3b"}[e]||e)+"."+{12:"94f18b0f",284:"59fc189b",586:"fac10c02",588:"c956b0ba",606:"b5950734",712:"aa8f2289",832:"5022d22c",1528:"434244cb",1720:"8476b124",1880:"4490369d",2020:"0bcc367f",2268:"0c630abc",2304:"2849761a",2392:"e3cff75d",2552:"345b470a",2568:"d2959846",2632:"2ebf0493",2740:"fb19b323",2960:"1cbf14a5",3028:"aedb13d2",3376:"cd7c2368",3431:"b2521fee",3663:"d3305235",3700:"22495fc8",4048:"ebef52ac",4304:"a288ae67",4492:"aa85ab53",4500:"d2454f63",4520:"3551f293",4552:"03f91008",4666:"2e2cf1b9",4720:"673356af",4776:"50f8bcf2",4888:"c63e41b6",4932:"0e9ac1eb",4936:"61bea2e5",4976:"766c90f3",5104:"b8f030b0",5144:"0db9cb40",5168:"6187c8c9",5244:"2d4747f6",5512:"e531b803",5528:"c10e4a59",5664:"4a76b647",5696:"8b594ff5",5744:"1f68d4af",5796:"8690593b",6040:"0bdc5dcc",6044:"a57e0516",6152:"825b1ba9",6220:"2f4c9065",6292:"faff854d",6344:"601110a2",6500:"b6181012",6664:"0827cfdc",6752:"787ce50c",6764:"fb33a989",6880:"b8ce89aa",6928:"5951aad0",6942:"7ee83ca2",6984:"7eb7c113",7028:"53ec5649",7388:"cc4d0793",7464:"f7c9ceec",7576:"8a645b01",7640:"670c2124",7816:"89cf8c3d",7850:"76d472ed",7856:"6c03dd8c",7904:"5affec2c",7968:"a2932b09",8056:"05f2a3e5",8132:"4222be59",8284:"befa346d",8412:"222e58b9",8600:"9e317cba",8650:"d3db5731",8876:"34b00daf",9060:"302f7e9c",9112:"6616f8ea",9311:"b71818cf",9372:"629d8f89",9392:"3d0fc586",9448:"74b4136a",9728:"c5b37b80"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),f={},b="evantay.com:",r.l=(e,a,c,d)=>{if(f[e])f[e].push(a);else{var t,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i<n.length;i++){var u=n[i];if(u.getAttribute("src")==e||u.getAttribute("data-webpack")==b+c){t=u;break}}t||(o=!0,(t=document.createElement("script")).charset="utf-8",t.timeout=120,r.nc&&t.setAttribute("nonce",r.nc),t.setAttribute("data-webpack",b+c),t.src=e),f[e]=[a];var l=(a,c)=>{t.onerror=t.onload=null,clearTimeout(s);var b=f[e];if(delete f[e],t.parentNode&&t.parentNode.removeChild(t),b&&b.forEach((e=>e(c))),a)return a(c)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={17896441:"6752",64285692:"4936","6875c492":"12",fec9c3b1:"284","3cee07f2":"586",f3002ca5:"588","609cb24b":"712",e25e4df4:"832","061a123b":"1528","1fc56582":"1720","1e9048c4":"1880","3e991810":"2020","213ccdc7":"2268",e25ee44f:"2304","40e2aa62":"2392",a77fb37c:"2552",f026c94c:"2568",c4f5d8e4:"2632","5fc3ba7e":"2740","6969bc8f":"2960","8b28c975":"3028",f5abd514:"3376","3614913f":"3431",c6e1e161:"3663","2c3dd313":"3700",ad7b700f:"4048","5e95c892":"4304",c933abd0:"4492","901e7e12":"4500","3344da23":"4520",a94703ab:"4666","771f38eb":"4720",b34035b6:"4776","773806e0":"4888","7c5afa08":"4932",a6aa9e1f:"4976","0440a4a2":"5104",c4b0cf2f:"5144","608ae6a4":"5168","462880c5":"5244","814f3328":"5512",b1513dc1:"5528",a4f77f3b:"5664","935f2afb":"5696",e5cc08ab:"5744","6aa6c2d1":"5796","5b2b3d99":"6040",f3543915:"6152","0d0c74f6":"6220",b2b675dd:"6292",ccc49370:"6344",a7bd4aaa:"6500",ce3e42ad:"6664",b4d628d3:"6764",b2f554cd:"6880","8bb152cf":"6928","44183a86":"6942",cff29eac:"6984","9e4087bc":"7028",a8e7919c:"7388",b99b6768:"7464","3bdc16c1":"7576",cfb8f5b6:"7640","86dbdca9":"7816",f514138b:"7850","2419c069":"7904","2dc3d3ff":"7968","7550f3ec":"8056","6855b58d":"8132","48332b76":"8284","01a85c17":"8412",a80da1cf:"8600","93b82f8b":"8650","224a301e":"8876",c0b1fc1a:"9060",a7023ddc:"9112",e11f84c6:"9311",dc9e9921:"9372","5d92e2d4":"9392",b16fdaf9:"9448","72403b3b":"9728"}[e]||e,r.p+r.u(e)},(()=>{var e={296:0,2176:0};r.f.j=(a,c)=>{var f=r.o(e,a)?e[a]:void 0;if(0!==f)if(f)c.push(f[2]);else if(/^2(17|9)6$/.test(a))e[a]=0;else{var b=new Promise(((c,b)=>f=e[a]=[c,b]));c.push(f[2]=b);var d=r.p+r.u(a),t=new Error;r.l(d,(c=>{if(r.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var b=c&&("load"===c.type?"missing":c.type),d=c&&c.target&&c.target.src;t.message="Loading chunk "+a+" failed.\n("+b+": "+d+")",t.name="ChunkLoadError",t.type=b,t.request=d,f[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,c)=>{var f,b,d=c[0],t=c[1],o=c[2],n=0;if(d.some((a=>0!==e[a]))){for(f in t)r.o(t,f)&&(r.m[f]=t[f]);if(o)var i=o(r)}for(a&&a(c);n<d.length;n++)b=d[n],r.o(e,b)&&e[b]&&e[b][0](),e[b]=0;return r.O(i)},c=self.webpackChunkevantay_com=self.webpackChunkevantay_com||[];c.forEach(a.bind(null,0)),c.push=a.bind(null,c.push.bind(c))})()})(); \ No newline at end of file diff --git a/blog/archive/index.html b/blog/archive/index.html new file mode 100644 index 00000000..ce47c328 --- /dev/null +++ b/blog/archive/index.html @@ -0,0 +1,19 @@ +<!doctype html> +<html lang="en" dir="ltr" class="plugin-blog plugin-id-default" data-has-hydrated="false"> +<head> +<meta charset="UTF-8"> +<meta name="generator" content="Docusaurus v3.1.1"> +<title data-rh="true">Archive | Evan Tay + + + + + + + + + + + + + \ No newline at end of file diff --git a/blog/atom.xml b/blog/atom.xml new file mode 100644 index 00000000..c00a36db --- /dev/null +++ b/blog/atom.xml @@ -0,0 +1,458 @@ + + + https://evantay.com/blog + Evan Tay Blog + 2021-09-10T00:00:00.000Z + https://github.com/jpmonette/feed + + Evan Tay Blog + https://evantay.com/img/logo.png + + <![CDATA[Why every Software Engineer should read Designing Data-Intensive Applications]]> + https://evantay.com/blog/why-you-should-read-ddia + + 2021-09-10T00:00:00.000Z + + Picking up this book was one of the best decisions I made for my fledgling software engineering career. Its insights enabled me to make well-reasoned software design decisions, and confidently communicate them, in spite of my relative professional inexperience. Given how helpful it has been, I’m here today to share more about the impression it has left on me, and convince you that it is a must-read if you are a software engineer.

+

Designing Data-Intensive Applications

+

I kickstarted my engineering career back in January 2021, as a full stack engineer at Padlet. During the onboarding process, my (amazing) mentor, Brian, imparted a great deal of guidance to me. One of his tips was that I should take a look at Kleppman’s Designing Data-Intensive Applications. Thankfully, we had two copies of the book in the office, purchased by my (also amazing) boss, Shu Yang, who recommended me to read it too. I’m thankful I ended up taking their advice, because I was able to glean so much insights from Kleppman, which happened to be highly applicable to the infrastructure and full stack projects I was developing.

+
+

"This book should be required reading for software engineers." - Kevin Scott, Chief Technology Officer at Microsoft

+
+

Like Brian, Shu Yang and Kevin, I now also believe all software engineers working on a distributed, cloud or data-intensive system will greatly benefit from reading the book. It provides the fundamental framework for thinking about these systems, and also the vocabulary to communicate such thoughts. Coupled together, these insights will empower you to make better design decisions and effectively convey them, even if you lack prior experience in the problem domain.

+

Kleppman also compared the key fundamental ideas behind the broad range of popular data systems out there today, by discussing their advantages, limitations and trade-offs, rather than diving deep into the intricacies of each tool. This was ideal given that the book's objective was to help us choose the right tool for the right occasion, which these characteristics will be more relevant for.

+

If you lack the time (or will) to pour over the entire book, you should at least check out the opening chapter. In it, Kleppman gives a comprehensive yet succinct overview of what I mentioned above, and provides a clear, detailed explanation of the three key principles in designing data-intensive system architecture: Reliability, Scalability and Maintainability. Just reading this first chapter alone was beneficial to me, as I was now able to better understand and discuss architectural concerns with my team.

+

If you're still not convinced whether to invest your time into this book, you can check out a summary I've written for the first chapter, where I’ve condensed Kleppman’s opening discourse on Reliability, Scalability and Maintainability. I’m certain it’ll provide a glimpse into the many lessons that Designing Data-Intensive Applications has to share, and if you do read the book, definitely let me know what you think!

+

Special thanks to Vanessa Tay for editing this!

]]>
+ + Evan Tay + https://github.com/DigiPie + + + + +
+ + <![CDATA[Integrating PostHog product analytics with Docusaurus v2 on GitHub Pages]]> + https://evantay.com/blog/docusaurus-posthog + + 2021-06-26T00:00:00.000Z + + I integrated PostHog analytics into this website today. I decided to do so after reading Gergely Orosz's Stats page on his blog The Pragmatic Engineer. He had installed Plausible analytics and made his analytics dashboard public. I thought that was cool and wanted to do the same.

+

I managed to find a Plausible plugin for Docusaurus v2, which is what this website runs on. But I decided to use PostHog instead. It also has a Docusaurus plugin and a public dashboard feature. I decided so because it is free and Plausible isn't.

+

Plausible only offers a free 30-day trial, and would cost at least $6 monthly subsequently. In comparison, PostHog has a free non-expiring tier which provides up to 1 million events every month. It also requires no credit card and is completely self-serve. There was no need to request and wait for a free license. It took me less than 10 minutes from signing up to getting the analytics running.

+
PostHog is open-source

If you are looking for an open-source solution you can self-host, PostHog may be it.

+

Despite what I have shared so far, I would still choose Plausible over PostHog if the former was free too. That's because the Plausible's dashboard interface looks much better and has more visualization options. For comparison, you can view the PostHog dashboard for this site, and the Plausible dashboard for The Pragmatic Engineer.

+

If you want to integrate PostHog with your Docusaurus site, you can follow the guide below. The later steps are for deployment to GitHub Pages via GitHub Actions. But you can easily modify them for other platforms and deployment workflows. I will give some tips for doing that.

+

Installation Guide

+
    +
  1. +

    Sign up for PostHog Cloud on posthog.com.

    +
  2. +
  3. +

    Get your Project API Key from Project Settings. +PostHog Project API Key

    +
  4. +
  5. +

    Install the posthog-docusaurus package by running this command at your Docusaurus project root:

    +
    yarn add posthog-docusaurus
    +

    or

    +
    npm install --save posthog-docusaurus
    +
  6. +
  7. +

    Add this code block to docusaurus.config.js:

    +
    module.exports = {
    plugins: ["posthog-docusaurus"],
    themeConfig: {
    posthog: {
    apiKey: process.env.POSTHOG_API_KEY || "DEV",
    appUrl: "https://app.posthog.com", // optional
    enableInDevelopment: false, // optional
    },
    },
    };
    +
    note

    The example in the official PostHog guide for Docusaurus v2 Integration inserts the API key directly into the code (e.g. apiKey: "phc_fakekeyhHBZOuIq"). It is a bad idea to do so, especially if you host your code publicly (i.e. on a GitHub public repo). It is good practice to keep API keys secret and outside of application code instead. We will be using GitHub Encrypted Secrets to achieve that.

    +
  8. +
  9. +

    Add a repository secret to the GitHub repo hosting your site's code. +GitHub Action Secrets

    +

    Settings > Secrets > New repository secret > Name: POSTHOG_API_KEY

    +
    If you are using another deployment platform

    There should be a settings panel which allows you to specify environment variables or secrets to insert into your application deployments securely. Put your POSTHOG_API_KEY there. Skip the next step.

    +
  10. +
  11. +

    Open the GitHub Action workflow file responsible for deploying your site, and add the environment variable POSTHOG_API_KEY to the Docusaurus build step:

    +
    env:
    POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }}
    +

    Example:

    +
    # Install and build Docusaurus website
    - name: Build Docusaurus website
    run: |
    cd website
    npm install
    npm run build
    env:
    POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }}
    +
  12. +
+

That's it! Once you deploy your new changes, the plugin will automatically start tracking pageviews, clicks and more. For more customisation options, you can check out the posthog-docusaurus plugin repo and the PostHog guide for Docusaurus v2 Integration. You can also check out the commit I made to integrate PostHog into this website.

+

If you want to deploy Docusaurus to GitHub Pages, check out my post on GitHub Action for Docusaurus.

]]>
+ + Evan Tay + https://github.com/DigiPie + + + + +
+ + <![CDATA[Top 3 reasons why you should start investing with StashAway today!]]> + https://evantay.com/blog/stashaway + + 2021-03-11T00:00:00.000Z + +
Deprecated

This article was posted sometime back in early 2021 and may be outdated. Refer to SingSaver instead for updated information.

+
Disclaimer

This post is not sponsored, and does not constitute financial advice of any form (I bet you know better than me). Read at your own discretion.

+

Signing up on StashAway (a robo-advisor platform) back in the early 2020s was the first step in taking control of my financial health. Before that, 100% of my cash was just sitting in a POSB Savings account, growing at an incredibly pointless rate of 0.05% per annum. I might as well have kept the money under my mattress.

+

Backstory

+

I was hesitant to invest for years because I used to think any form of investment was risky. Like most some Singaporeans, I am was kiasi. I was afraid of the unknown. What eventually changed my mind was chancing upon this article: The big problem (of) playing it too safe with money in our 20s by thewokesalaryman, and the following quote:

+
Quote of the Day

Ironically, by not taking any risks and letting all your money get eroded by certain inflation, you are actually doing the riskiest thing.

+

This quote was the wake-up call for me to start investing, and could be yours too if you are someone who is privileged enough to start doing the same (i.e. you have the financial ability to buy bubble tea at least once a week).

+

Milksha&#39;s Bubble Tea

+

Photo by my bubble-tea buddy Elsie Lee
+Pictured (from left): Milksha's Fresh Milk, and Izumo Matcha Milk with Honey Pearls
+Is Milksha a buy? Milksha isn't cheap by any stretch but you can't put a price tag on happiness

+
Pro Tip from fellow bubble-tea enthusiast Freda

Buy Milksha coupons from Shopee beforehand to get massive discounts!

+

Anyhow, I reasoned the best way to kick-start my investment journey would be with a robo-advisor platform, given how beginner-friendly it is, how low the commission fees are, and how lazy I am given the passive and minimal-effort investment a robo-advisor offers.

+

You can check out this page by dollarsandsense giving an introduction to robo-advisors for more reasons why you should or should not invest with a robo-advisor platform.

+

I ended up choosing StashAway as my platform of choice, and here are the top 3 reasons why!

+

1. StashAway's all-star C-suite

+

StashAway is led by an "Expert Investment Team" (their words not mine) made up of the following co-founders:

+
    +
  • Chief Executive Officer Michele Ferrario, a former CEO of Zalora Group and the co-founder of Rocket Internet
  • +
  • Chief Investment Officer Freddy Lim, a former Managing Director and Global Head of Derivatives Strategy at Nomura
  • +
  • Chief Technology Officer Nino Ulsamer, the co-founder and former CTO of a now-defunct (oops) software solution company for e-commerce analytics
  • +
+

These guys have real, solid credentials. They are far more experienced in investing than an amateur like me (surprise surprise), and this assured me that my investments in StashAway would be handled by well-informed and secure hands.

+

Credentials aside, they also have a proven track record of high returns for most of their portfolios. Despite how volatile and uncertain 2020 was, I achieved an impressive 19.59% time-weighted return for my portfolio of StashAway Risk Index 22%, between 3rd of February 2020, and 10th of March, 2021.

+

Evan&#39;s StashAway returns

+

To find out how well StashAway's portfolios performed at other risk-levels, check out their article: Our Returns in 2020.

+

2. No minimum amount at all

+

Another robo-advisor platform I was considering at the time was EndowUs. However, I ultimately went with StashAway because while EndowUs had a minimum investment amount of $10,000.00 (added cents for emphasis), StashAway had no minimum amount at all. This is still the case as of 11 March 2021.

+

As someone new to investing, the decision to invest $10,000 all at once was too intimidating for me to make. More importantly, I was still a student back then, one who did not have that many digits in his bank account. Therefore, StashAway was a natural choice for its low entry barrier!

+

3. My money is safe

+

Naturally, I was concerned about how safe using StashAway would be. More specifically, I was worried about losing my initial investment of $100 in StashAway, in the event of StashAway filing for bankruptcy. As it turned out, it was an unfound concern given that:

+
Quote

Your money is kept entirely separate from StashAway's finances. To ensure that we never touch your money, we use custodian banks that hold your money, whether it's in cash or in securities.

In these custodian institutions, your assets are always in a segregated account-- one that is separate from StashAway's operations and assets. This means that you will always have full access and claim to your assets no matter what happens to StashAway.

+

You can read more about StashAway's Frequently Asked Questions here. Do your own research hor!

+

Closing note

+

I hope you found this post/rambling/thing (*gestures wildly at everything) insightful in any way. If you are still interested in StashAway, but not entirely convinced by me (I’ll try not to take it personally), you can check out this video by Kevin Learns Investing. All the best with getting financially fit!

+

Special thanks to Vanessa Tay for editing this!

]]>
+ + Evan Tay + https://github.com/DigiPie + + + +
+ + <![CDATA[GitHub Action for Docusaurus]]> + https://evantay.com/blog/docusaurus-gh-action + + 2021-01-17T00:00:00.000Z + + I got tired of deploying my Docusaurus website to GitHub Pages manually, and decided to do something about it using GitHub Action.

+

Initially, I was planning to follow the official guide on doing so. However, it was actually much more complicated than I liked. I did not really want to generate and store a SSH key on GitHub. Too much effort man.

+

I decided it was better off for me to write my own script. Here it is:

+

deploy-docusaurus.yml

+
caution

The script below assumes that your Docusaurus website resides at /website of your repo. If that is not the case for you, you will need to:

    +
  • Change cd website to cd <docu_site_root>, or delete the entire line if your Docusaurus website is at the root of your repo /
  • +
  • Change build_dir's value from website/build to <docu_site_root>/build, or build if your Docusaurus website is at the root of your repo /
  • +
+
name: deploy-docusaurus

on:
push:
branches: [main]
pull_request:
branches: [main]

# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
publish:
runs-on: ubuntu-latest
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- name: Check out repo
uses: actions/checkout@v2
# Node is required for npm
- name: Set up Node
uses: actions/setup-node@v2
with:
node-version: "12"
# Install and build Docusaurus website
- name: Build Docusaurus website
run: |
cd website
npm install
npm run build
- name: Deploy to GitHub Pages
if: success()
uses: crazy-max/ghaction-github-pages@v2
with:
target_branch: gh-pages
build_dir: website/build
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
note

GitHub will automatically add GITHUB_TOKEN to Secrets. You need not do so. See this for more information.

+

To see this script in action, visit my personal website repo.

]]>
+ + Evan Tay + https://github.com/DigiPie + + + + +
+ + <![CDATA[History of EvanTay.com]]> + https://evantay.com/blog/history + + 2020-12-21T00:00:00.000Z + + Established in 2013

+

I first bought my personal domain www.evantay.com way back in 2013. Younger me thought it would be cool and fun to run my own website, and it still is. 😎

+

To be honest, I can't even remember what my very first website looked like, but I am quite sure it was built using vanilla HTML and CSS, something unthinkable in this day and age.

+

Move to Grav CMS in 2017

+

Given that I was building everything from the ground up, maintainability became problematic. In 2017, older younger me decided it wasn't worth the effort to do it myself, and I started shopping for a framework to adopt. I eventually settled on using Grav, a flat-file Content Management System (CMS) powered by PHP. I chose it because I was familiar and interested in PHP at the time.

+

To get started on building my second site quickly, I used a one-page Grav theme Ceevee.

+

Ceevee

+

However, I still wanted to add my personal touch to my portfolio website. This led me to heavily modifying the theme numerous times over the years, from 2017 up until 2020. It was a really fun journey while it lasted.

+

EvanTay.com v1 site

+

Move to Cloud in 2017

+

About the same time, I also moved from using a website host to DigitalOcean. I hosted my website on the cheapest droplet (VM) I could find (the 5 bucks one). I ran CentOS on the VM, and used an Nginx web server to serve the Grav website. Pretty old-school right?

+

Start of DigiDocs in 2019

+

Last year, during January 2019, I also started working on a separate pet project called DigiDocs, my personal documentation website. I was motivated to do so because I wanted to consolidate useful knowledge gained from attending university classes, and my own self-directed learning. I kept the site updated up until October 2020.

+

Back then, DigiDocs lived at www.evantay.com/docs, and was served by the same Nginx server which served my main portfolio website.

+

Move to Docusaurus v2 in 2020

+

More recently, in October 2020, I decided to replace both documentation and portfolio site with a single Docusaurus v2 website (which you're looking at right now).

+

I did so because I wanted to:

+
    +
  1. Keep up with the latest technologies: I wanted to learn more about Docusaurus v2 and also ReactJS, which is what Docusaurus is built upon. It was about time to move on from PHP.
  2. +
  3. Reduce operating costs by moving from a dynamic to static website 💸 : Given that all of my content are static, it did not make sense that I was using a dynamic PHP site generator such as Grav. By moving to a static website, I will be able to host my site at a cheaper cost or even for free! I am planning to achieve the latter by using GitHub pages.
  4. +
+

So far, the experience of using Docusaurus v2 has been great! I am glad I started on this migration journey, despite feeling sentimental about my old portfolio and documentation websites.

]]>
+ + Evan Tay + https://github.com/DigiPie + + +
+ + <![CDATA[STACK 2020 Developers Conference]]> + https://evantay.com/blog/stack-2020 + + 2020-12-03T00:00:00.000Z + + STACK 2020 Developers Conference is GovTech’s flagship conference and the largest government-led developers event in Singapore that connects government, industry and the tech community.

+

In this post, you will find my key takeaways for some of the sessions I attended during the conference. I chose to attend these sessions based on my interests in Cloud and Microservices.

+

Day 1:

+ +

Day 2:

+ +

Opening note

+

Speaker(s)

+ +

Key takeaways

+

The government believes openness is the way to building a smart nation.

+

On that note, they believe in:

+
    +
  • Adopting the best solutions there are, including those from the industry, instead of doing everything in-house + +
  • +
  • Collaborating with industry developers via open-source + +
  • +
  • Providing transparency to citizens and industry professionals +
      +
    • TraceTogether: Transparent and open collaboration with the industry
    • +
    +
  • +
+

Rethink, Reinvent, Rebuild

+

Speaker(s)

+
    +
  • Jeff Barr: Vice President & Chief Evangelist at Amazon Web Services
  • +
+

Key takeaways

+
    +
  • Rethink - Take a good look at where we are +
      +
    • Everything has changed due to COVID-19, Quarantine, WFH
    • +
    • No firm ground and constants are now variables
    • +
    • People are more receptive to change and invention right now
    • +
    • Good time for innovation and progress
    • +
    +
  • +
  • Reinvent - Solve challenges in a new way +
      +
    • Dream big dreams, address these challenges, change the world
    • +
    • Share what you learn to reinforce what you learned +
        +
      • Content creation / video streaming possibilities
      • +
      +
    • +
    +
  • +
  • Rebuild - Put what you have learned to work +
      +
    • Take what you learn, do something awesome, and remember to share it!
    • +
    +
  • +
+

Seeding the Cloud: Engineering Solutions for Cloud Adoption

+

Speaker(s)

+ +

Key takeaways

+

Hunter shared about how GovTech uses Infrastructure-as-Code (IaC) and Policy-as-Code (PaC) to accelerate cloud operations. Read #devops-cloud-and-back-again by Hashicorp CTO Mitchell for more information.

+
    +
  • Establishing a Landing Zone +
      +
    • A repeatable configuration across multiple Cloud Service Providers (CSP)
    • +
    • The foundation of any cloud environment at scale
    • +
    • Serves as a consistent platform for governance, onboarding, networking and security
    • +
    +
  • +
  • Accelerating deployment with Infrastructure-as-Code (IaC) +
      +
    • Code and configuration to provision cloud resources and Landing Zones
    • +
    • Develop common templates for consistency and familiarity
    • +
    • Get feedback on pain points faced by "customers" while using said templates
    • +
    +
  • +
  • Consistent audit and reporting with Policy-as-Code (PaC) +
      +
    • Code and configuration to test and validate cloud infrastructure deployed by IaC
    • +
    • Reduce need for manual audits and speed up auditing process
    • +
    +
  • +
+

Six Principles for Refactoring a Monolith to Microservices

+

Speaker(s)

+ +

Key takeaways

+
Quote

"A Microservice application is structured as a set of loosely coupled services that can be independently deployed." - Chris Richardson

+

Chris shared 6 principles to follow when moving from a Monolith to a Microservice architecture.

+

Here are 5 of them 😉 :

+
    +
  • Adopt Microservice architecture for the right reasons +
      +
    • Monolith architecture is not necessary bad (an anti-pattern), it has its valid use-cases
    • +
    • Adopt Microservice architecture because it allows you to deliver software rapidly, frequently and sustainability, with small, autonomous teams working on the different microservices
    • +
    +
  • +
  • Migrate to Microservice architecture incrementally rather than via Big Bang rewrite +
      +
    • Strangler Application: Incrementally migrate functionality from existing Monolith application to new Strangler Microservice application +
        +
      • Extract existing code modules and database tables out into microservices
      • +
      • Implement new features as microservices
      • +
      +
    • +
    +
  • +
  • Consider Return-on-Investment when deciding which modules to convert into microservices +
      +
    • Consider benefit of decoupling said module
    • +
    • Consider cost of decoupling +
        +
      • How difficult it is to do so
      • +
      • How many inbound dependencies it has +
          +
        • If module A is depended upon by module B, consider extracting module B first
        • +
        +
      • +
      +
    • +
    +
  • +
  • Define the service boundaries correctly +
      +
    • Avoid Runtime Coupling +
        +
      • Reduced availability due to reliance of a given microservice on another for serving a given request +
          +
        • For example, microservice A receives an API request which it can only respond to when its own API request to microservice B is answered first
        • +
        +
      • +
      • Make microservices as self-contained as possible +
          +
        • Able to respond to a request without making follow-up requests to other microservices
        • +
        +
      • +
      +
    • +
    • Avoid Design-Time Coupling +
        +
      • Similar to Open-Closed Principle
      • +
      • Avoid having to modify other microservices when modifying a given microservice
      • +
      • Must be able to modify or exend a given microservice independently as much as possible +
          +
        • Have small and stable API which hides as much implementation complexity as possible
        • +
        • Hide what you can, not only code but also database schemas, so you can change them without affecting other microservices
        • +
        +
      • +
      +
    • +
    +
  • +
  • Measuring success +
      +
    • Improved metrics: Reduced lead time, deployment frequency, failure rate, etc.
    • +
    • Improvements in other '-ilities': Availability, Reliability and Scalability
    • +
    +
  • +
+

You Won’t BELIEVE This HACK to Improve Your Technical Communication!

+

Speaker(s)

+ +

Key takeaways

+

When introducing non-technical folks to coding, keep in mind that the most important objective is to convey understanding of core programming concepts.

+

On that note, here are some tips Nikhil shared:

+
    +
  • Forgo coding best practices if doing so make it easier for the audience to understand +
      +
    • Reduce surface area to increase accessibility, even if it is not good coding practice +
        +
      • Collapse all HTML, JS and CSS into a single file so students can view everything in one place
      • +
      • Collapse all functions into one for the same reason as the previous line
      • +
      • Combine program lines if it makes things clearer
      • +
      +
    • +
    +
  • +
  • Use real-world examples to explain technical concepts +
      +
    • For example, use a restaurant scenario to explain async
    • +
    +
  • +
  • Enable students in sharing their joy/achievement +
      +
    • Make deploying their application easy +
        +
      • Can use Netlify Drop: Simply drag and drop your HTML, JS, CSS files and Netlify Drop will do the rest for deployments
      • +
      +
    • +
    +
  • +
  • Practise empathy consciously throughout teaching process to identify ways you can make learning easier for your students
  • +
+

DevOps: Cloud and Back Again

+

Speaker(s)

+ +

Key takeaways

+

Mitchell shared more about the Cloud Operating Model during this session.

+

"The Cloud Operating Model is a new approach for IT operations that organizations need to use to be successful with cloud adoption and thrive in an era of multi-cloud architecture." - Hashicorp

+
StaticDynamic
RunDedicated infrastructure to run app onScheduled automatically across a fleet (e.g. AWS Auto-Scaling Group, Hashicorp Nomad)
ConnectHost-based, static IP-addressingService-based, dynamic IP addresses due to dynamic provisioning
SecureHigh-trust environment which is IP-address-based, with clear network perimeterLow-trust environment with no clear perimeter given multi-tenancy and nature of the Cloud
ProvisionDedicated resources - Physical servers, routers and switchesCapacity on-demand, provision VMs, Containers and other managed services, or simply use Serverless services
+
    +
  • Infrastructure operations on the Cloud must follow the Dynamic Cloud Operating Model fully +
      +
    • Pointless if you provision infrastructure in minutes using Infrastructure-as-Code (IaC), but still manually handle connectivity and security review using tickets
    • +
    • Have to adopt dynamic cloud operating tools for all 4 layers
    • +
    +
  • +
  • Why use IaC for provisioning +
      +
    • Split Execution from Definition
    • +
    • Execution can be automated and carried out via API, UI or automatically through Continuous-Integration (CI) tools
    • +
    +
  • +
  • How can teams use IaC +
      +
    • Operations team still necessary, focus on creating and improving blueprints and handling edge-cases when doing so
    • +
    • Development team creates infrastructure in a self-service manner, using the blueprints created by the Operations team +separating buzz words from crucial tech
    • +
    +
  • +
+

Read up on Hashicorp's white paper on Cloud Operating Model for more information.

]]>
+ + Evan Tay + https://github.com/DigiPie + + + + + +
+
\ No newline at end of file diff --git a/blog/docusaurus-gh-action/index.html b/blog/docusaurus-gh-action/index.html new file mode 100644 index 00000000..26b8a68a --- /dev/null +++ b/blog/docusaurus-gh-action/index.html @@ -0,0 +1,29 @@ + + + + + +GitHub Action for Docusaurus | Evan Tay + + + + + + + + + + +

GitHub Action for Docusaurus

· 2 min read
Evan Tay

I got tired of deploying my Docusaurus website to GitHub Pages manually, and decided to do something about it using GitHub Action.

+

Initially, I was planning to follow the official guide on doing so. However, it was actually much more complicated than I liked. I did not really want to generate and store a SSH key on GitHub. Too much effort man.

+

I decided it was better off for me to write my own script. Here it is:

+

deploy-docusaurus.yml

+
caution

The script below assumes that your Docusaurus website resides at /website of your repo. If that is not the case for you, you will need to:

    +
  • Change cd website to cd <docu_site_root>, or delete the entire line if your Docusaurus website is at the root of your repo /
  • +
  • Change build_dir's value from website/build to <docu_site_root>/build, or build if your Docusaurus website is at the root of your repo /
  • +
+
name: deploy-docusaurus

on:
push:
branches: [main]
pull_request:
branches: [main]

# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
publish:
runs-on: ubuntu-latest
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- name: Check out repo
uses: actions/checkout@v2
# Node is required for npm
- name: Set up Node
uses: actions/setup-node@v2
with:
node-version: "12"
# Install and build Docusaurus website
- name: Build Docusaurus website
run: |
cd website
npm install
npm run build
- name: Deploy to GitHub Pages
if: success()
uses: crazy-max/ghaction-github-pages@v2
with:
target_branch: gh-pages
build_dir: website/build
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
note

GitHub will automatically add GITHUB_TOKEN to Secrets. You need not do so. See this for more information.

+

To see this script in action, visit my personal website repo.

+ + \ No newline at end of file diff --git a/blog/docusaurus-posthog/index.html b/blog/docusaurus-posthog/index.html new file mode 100644 index 00000000..7754fdb9 --- /dev/null +++ b/blog/docusaurus-posthog/index.html @@ -0,0 +1,59 @@ + + + + + +Integrating PostHog product analytics with Docusaurus v2 on GitHub Pages | Evan Tay + + + + + + + + + + +

Integrating PostHog product analytics with Docusaurus v2 on GitHub Pages

· 4 min read
Evan Tay

I integrated PostHog analytics into this website today. I decided to do so after reading Gergely Orosz's Stats page on his blog The Pragmatic Engineer. He had installed Plausible analytics and made his analytics dashboard public. I thought that was cool and wanted to do the same.

+

I managed to find a Plausible plugin for Docusaurus v2, which is what this website runs on. But I decided to use PostHog instead. It also has a Docusaurus plugin and a public dashboard feature. I decided so because it is free and Plausible isn't.

+

Plausible only offers a free 30-day trial, and would cost at least $6 monthly subsequently. In comparison, PostHog has a free non-expiring tier which provides up to 1 million events every month. It also requires no credit card and is completely self-serve. There was no need to request and wait for a free license. It took me less than 10 minutes from signing up to getting the analytics running.

+
PostHog is open-source

If you are looking for an open-source solution you can self-host, PostHog may be it.

+

Despite what I have shared so far, I would still choose Plausible over PostHog if the former was free too. That's because the Plausible's dashboard interface looks much better and has more visualization options. For comparison, you can view the PostHog dashboard for this site, and the Plausible dashboard for The Pragmatic Engineer.

+

If you want to integrate PostHog with your Docusaurus site, you can follow the guide below. The later steps are for deployment to GitHub Pages via GitHub Actions. But you can easily modify them for other platforms and deployment workflows. I will give some tips for doing that.

+

Installation Guide

+
    +
  1. +

    Sign up for PostHog Cloud on posthog.com.

    +
  2. +
  3. +

    Get your Project API Key from Project Settings. +PostHog Project API Key

    +
  4. +
  5. +

    Install the posthog-docusaurus package by running this command at your Docusaurus project root:

    +
    yarn add posthog-docusaurus
    +

    or

    +
    npm install --save posthog-docusaurus
    +
  6. +
  7. +

    Add this code block to docusaurus.config.js:

    +
    module.exports = {
    plugins: ["posthog-docusaurus"],
    themeConfig: {
    posthog: {
    apiKey: process.env.POSTHOG_API_KEY || "DEV",
    appUrl: "https://app.posthog.com", // optional
    enableInDevelopment: false, // optional
    },
    },
    };
    +
    note

    The example in the official PostHog guide for Docusaurus v2 Integration inserts the API key directly into the code (e.g. apiKey: "phc_fakekeyhHBZOuIq"). It is a bad idea to do so, especially if you host your code publicly (i.e. on a GitHub public repo). It is good practice to keep API keys secret and outside of application code instead. We will be using GitHub Encrypted Secrets to achieve that.

    +
  8. +
  9. +

    Add a repository secret to the GitHub repo hosting your site's code. +GitHub Action Secrets

    +

    Settings > Secrets > New repository secret > Name: POSTHOG_API_KEY

    +
    If you are using another deployment platform

    There should be a settings panel which allows you to specify environment variables or secrets to insert into your application deployments securely. Put your POSTHOG_API_KEY there. Skip the next step.

    +
  10. +
  11. +

    Open the GitHub Action workflow file responsible for deploying your site, and add the environment variable POSTHOG_API_KEY to the Docusaurus build step:

    +
    env:
    POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }}
    +

    Example:

    +
    # Install and build Docusaurus website
    - name: Build Docusaurus website
    run: |
    cd website
    npm install
    npm run build
    env:
    POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }}
    +
  12. +
+

That's it! Once you deploy your new changes, the plugin will automatically start tracking pageviews, clicks and more. For more customisation options, you can check out the posthog-docusaurus plugin repo and the PostHog guide for Docusaurus v2 Integration. You can also check out the commit I made to integrate PostHog into this website.

+

If you want to deploy Docusaurus to GitHub Pages, check out my post on GitHub Action for Docusaurus.

+ + \ No newline at end of file diff --git a/blog/history/index.html b/blog/history/index.html new file mode 100644 index 00000000..084c11d3 --- /dev/null +++ b/blog/history/index.html @@ -0,0 +1,40 @@ + + + + + +History of EvanTay.com | Evan Tay + + + + + + + + + + +

History of EvanTay.com

· 3 min read
Evan Tay

Established in 2013

+

I first bought my personal domain www.evantay.com way back in 2013. Younger me thought it would be cool and fun to run my own website, and it still is. 😎

+

To be honest, I can't even remember what my very first website looked like, but I am quite sure it was built using vanilla HTML and CSS, something unthinkable in this day and age.

+

Move to Grav CMS in 2017

+

Given that I was building everything from the ground up, maintainability became problematic. In 2017, older younger me decided it wasn't worth the effort to do it myself, and I started shopping for a framework to adopt. I eventually settled on using Grav, a flat-file Content Management System (CMS) powered by PHP. I chose it because I was familiar and interested in PHP at the time.

+

To get started on building my second site quickly, I used a one-page Grav theme Ceevee.

+

Ceevee

+

However, I still wanted to add my personal touch to my portfolio website. This led me to heavily modifying the theme numerous times over the years, from 2017 up until 2020. It was a really fun journey while it lasted.

+

EvanTay.com v1 site

+

Move to Cloud in 2017

+

About the same time, I also moved from using a website host to DigitalOcean. I hosted my website on the cheapest droplet (VM) I could find (the 5 bucks one). I ran CentOS on the VM, and used an Nginx web server to serve the Grav website. Pretty old-school right?

+

Start of DigiDocs in 2019

+

Last year, during January 2019, I also started working on a separate pet project called DigiDocs, my personal documentation website. I was motivated to do so because I wanted to consolidate useful knowledge gained from attending university classes, and my own self-directed learning. I kept the site updated up until October 2020.

+

Back then, DigiDocs lived at www.evantay.com/docs, and was served by the same Nginx server which served my main portfolio website.

+

Move to Docusaurus v2 in 2020

+

More recently, in October 2020, I decided to replace both documentation and portfolio site with a single Docusaurus v2 website (which you're looking at right now).

+

I did so because I wanted to:

+
    +
  1. Keep up with the latest technologies: I wanted to learn more about Docusaurus v2 and also ReactJS, which is what Docusaurus is built upon. It was about time to move on from PHP.
  2. +
  3. Reduce operating costs by moving from a dynamic to static website 💸 : Given that all of my content are static, it did not make sense that I was using a dynamic PHP site generator such as Grav. By moving to a static website, I will be able to host my site at a cheaper cost or even for free! I am planning to achieve the latter by using GitHub pages.
  4. +
+

So far, the experience of using Docusaurus v2 has been great! I am glad I started on this migration journey, despite feeling sentimental about my old portfolio and documentation websites.

+ + \ No newline at end of file diff --git a/blog/index.html b/blog/index.html new file mode 100644 index 00000000..e949f551 --- /dev/null +++ b/blog/index.html @@ -0,0 +1,27 @@ + + + + + +Blog | Evan Tay + + + + + + + + + + +

· 3 min read
Evan Tay

Picking up this book was one of the best decisions I made for my fledgling software engineering career. Its insights enabled me to make well-reasoned software design decisions, and confidently communicate them, in spite of my relative professional inexperience. Given how helpful it has been, I’m here today to share more about the impression it has left on me, and convince you that it is a must-read if you are a software engineer.

· 4 min read
Evan Tay

I integrated PostHog analytics into this website today. I decided to do so after reading Gergely Orosz's Stats page on his blog The Pragmatic Engineer. He had installed Plausible analytics and made his analytics dashboard public. I thought that was cool and wanted to do the same.

+

I managed to find a Plausible plugin for Docusaurus v2, which is what this website runs on. But I decided to use PostHog instead. It also has a Docusaurus plugin and a public dashboard feature. I decided so because it is free and Plausible isn't.

· 5 min read
Evan Tay
Deprecated

This article was posted sometime back in early 2021 and may be outdated. Refer to SingSaver instead for updated information.

+
Disclaimer

This post is not sponsored, and does not constitute financial advice of any form (I bet you know better than me). Read at your own discretion.

+

Signing up on StashAway (a robo-advisor platform) back in the early 2020s was the first step in taking control of my financial health. Before that, 100% of my cash was just sitting in a POSB Savings account, growing at an incredibly pointless rate of 0.05% per annum. I might as well have kept the money under my mattress.

· 2 min read
Evan Tay

I got tired of deploying my Docusaurus website to GitHub Pages manually, and decided to do something about it using GitHub Action.

+

Initially, I was planning to follow the official guide on doing so. However, it was actually much more complicated than I liked. I did not really want to generate and store a SSH key on GitHub. Too much effort man.

+

I decided it was better off for me to write my own script. Here it is:

· 3 min read
Evan Tay

Established in 2013

+

I first bought my personal domain www.evantay.com way back in 2013. Younger me thought it would be cool and fun to run my own website, and it still is. 😎

+

To be honest, I can't even remember what my very first website looked like, but I am quite sure it was built using vanilla HTML and CSS, something unthinkable in this day and age.

· 8 min read
Evan Tay

STACK 2020 Developers Conference is GovTech’s flagship conference and the largest government-led developers event in Singapore that connects government, industry and the tech community.

+

In this post, you will find my key takeaways for some of the sessions I attended during the conference. I chose to attend these sessions based on my interests in Cloud and Microservices.

+ + \ No newline at end of file diff --git a/blog/rss.xml b/blog/rss.xml new file mode 100644 index 00000000..91c3db88 --- /dev/null +++ b/blog/rss.xml @@ -0,0 +1,436 @@ + + + + Evan Tay Blog + https://evantay.com/blog + Evan Tay Blog + Fri, 10 Sep 2021 00:00:00 GMT + https://validator.w3.org/feed/docs/rss2.html + https://github.com/jpmonette/feed + en + + <![CDATA[Why every Software Engineer should read Designing Data-Intensive Applications]]> + https://evantay.com/blog/why-you-should-read-ddia + https://evantay.com/blog/why-you-should-read-ddia + Fri, 10 Sep 2021 00:00:00 GMT + + Picking up this book was one of the best decisions I made for my fledgling software engineering career. Its insights enabled me to make well-reasoned software design decisions, and confidently communicate them, in spite of my relative professional inexperience. Given how helpful it has been, I’m here today to share more about the impression it has left on me, and convince you that it is a must-read if you are a software engineer.

+

Designing Data-Intensive Applications

+

I kickstarted my engineering career back in January 2021, as a full stack engineer at Padlet. During the onboarding process, my (amazing) mentor, Brian, imparted a great deal of guidance to me. One of his tips was that I should take a look at Kleppman’s Designing Data-Intensive Applications. Thankfully, we had two copies of the book in the office, purchased by my (also amazing) boss, Shu Yang, who recommended me to read it too. I’m thankful I ended up taking their advice, because I was able to glean so much insights from Kleppman, which happened to be highly applicable to the infrastructure and full stack projects I was developing.

+
+

"This book should be required reading for software engineers." - Kevin Scott, Chief Technology Officer at Microsoft

+
+

Like Brian, Shu Yang and Kevin, I now also believe all software engineers working on a distributed, cloud or data-intensive system will greatly benefit from reading the book. It provides the fundamental framework for thinking about these systems, and also the vocabulary to communicate such thoughts. Coupled together, these insights will empower you to make better design decisions and effectively convey them, even if you lack prior experience in the problem domain.

+

Kleppman also compared the key fundamental ideas behind the broad range of popular data systems out there today, by discussing their advantages, limitations and trade-offs, rather than diving deep into the intricacies of each tool. This was ideal given that the book's objective was to help us choose the right tool for the right occasion, which these characteristics will be more relevant for.

+

If you lack the time (or will) to pour over the entire book, you should at least check out the opening chapter. In it, Kleppman gives a comprehensive yet succinct overview of what I mentioned above, and provides a clear, detailed explanation of the three key principles in designing data-intensive system architecture: Reliability, Scalability and Maintainability. Just reading this first chapter alone was beneficial to me, as I was now able to better understand and discuss architectural concerns with my team.

+

If you're still not convinced whether to invest your time into this book, you can check out a summary I've written for the first chapter, where I’ve condensed Kleppman’s opening discourse on Reliability, Scalability and Maintainability. I’m certain it’ll provide a glimpse into the many lessons that Designing Data-Intensive Applications has to share, and if you do read the book, definitely let me know what you think!

+

Special thanks to Vanessa Tay for editing this!

]]>
+ book-review + software-engineering + software-architecture +
+ + <![CDATA[Integrating PostHog product analytics with Docusaurus v2 on GitHub Pages]]> + https://evantay.com/blog/docusaurus-posthog + https://evantay.com/blog/docusaurus-posthog + Sat, 26 Jun 2021 00:00:00 GMT + + I integrated PostHog analytics into this website today. I decided to do so after reading Gergely Orosz's Stats page on his blog The Pragmatic Engineer. He had installed Plausible analytics and made his analytics dashboard public. I thought that was cool and wanted to do the same.

+

I managed to find a Plausible plugin for Docusaurus v2, which is what this website runs on. But I decided to use PostHog instead. It also has a Docusaurus plugin and a public dashboard feature. I decided so because it is free and Plausible isn't.

+

Plausible only offers a free 30-day trial, and would cost at least $6 monthly subsequently. In comparison, PostHog has a free non-expiring tier which provides up to 1 million events every month. It also requires no credit card and is completely self-serve. There was no need to request and wait for a free license. It took me less than 10 minutes from signing up to getting the analytics running.

+
PostHog is open-source

If you are looking for an open-source solution you can self-host, PostHog may be it.

+

Despite what I have shared so far, I would still choose Plausible over PostHog if the former was free too. That's because the Plausible's dashboard interface looks much better and has more visualization options. For comparison, you can view the PostHog dashboard for this site, and the Plausible dashboard for The Pragmatic Engineer.

+

If you want to integrate PostHog with your Docusaurus site, you can follow the guide below. The later steps are for deployment to GitHub Pages via GitHub Actions. But you can easily modify them for other platforms and deployment workflows. I will give some tips for doing that.

+

Installation Guide

+
    +
  1. +

    Sign up for PostHog Cloud on posthog.com.

    +
  2. +
  3. +

    Get your Project API Key from Project Settings. +PostHog Project API Key

    +
  4. +
  5. +

    Install the posthog-docusaurus package by running this command at your Docusaurus project root:

    +
    yarn add posthog-docusaurus
    +

    or

    +
    npm install --save posthog-docusaurus
    +
  6. +
  7. +

    Add this code block to docusaurus.config.js:

    +
    module.exports = {
    plugins: ["posthog-docusaurus"],
    themeConfig: {
    posthog: {
    apiKey: process.env.POSTHOG_API_KEY || "DEV",
    appUrl: "https://app.posthog.com", // optional
    enableInDevelopment: false, // optional
    },
    },
    };
    +
    note

    The example in the official PostHog guide for Docusaurus v2 Integration inserts the API key directly into the code (e.g. apiKey: "phc_fakekeyhHBZOuIq"). It is a bad idea to do so, especially if you host your code publicly (i.e. on a GitHub public repo). It is good practice to keep API keys secret and outside of application code instead. We will be using GitHub Encrypted Secrets to achieve that.

    +
  8. +
  9. +

    Add a repository secret to the GitHub repo hosting your site's code. +GitHub Action Secrets

    +

    Settings > Secrets > New repository secret > Name: POSTHOG_API_KEY

    +
    If you are using another deployment platform

    There should be a settings panel which allows you to specify environment variables or secrets to insert into your application deployments securely. Put your POSTHOG_API_KEY there. Skip the next step.

    +
  10. +
  11. +

    Open the GitHub Action workflow file responsible for deploying your site, and add the environment variable POSTHOG_API_KEY to the Docusaurus build step:

    +
    env:
    POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }}
    +

    Example:

    +
    # Install and build Docusaurus website
    - name: Build Docusaurus website
    run: |
    cd website
    npm install
    npm run build
    env:
    POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }}
    +
  12. +
+

That's it! Once you deploy your new changes, the plugin will automatically start tracking pageviews, clicks and more. For more customisation options, you can check out the posthog-docusaurus plugin repo and the PostHog guide for Docusaurus v2 Integration. You can also check out the commit I made to integrate PostHog into this website.

+

If you want to deploy Docusaurus to GitHub Pages, check out my post on GitHub Action for Docusaurus.

]]>
+ docusaurus + posthog + analytics +
+ + <![CDATA[Top 3 reasons why you should start investing with StashAway today!]]> + https://evantay.com/blog/stashaway + https://evantay.com/blog/stashaway + Thu, 11 Mar 2021 00:00:00 GMT + +
Deprecated

This article was posted sometime back in early 2021 and may be outdated. Refer to SingSaver instead for updated information.

+
Disclaimer

This post is not sponsored, and does not constitute financial advice of any form (I bet you know better than me). Read at your own discretion.

+

Signing up on StashAway (a robo-advisor platform) back in the early 2020s was the first step in taking control of my financial health. Before that, 100% of my cash was just sitting in a POSB Savings account, growing at an incredibly pointless rate of 0.05% per annum. I might as well have kept the money under my mattress.

+

Backstory

+

I was hesitant to invest for years because I used to think any form of investment was risky. Like most some Singaporeans, I am was kiasi. I was afraid of the unknown. What eventually changed my mind was chancing upon this article: The big problem (of) playing it too safe with money in our 20s by thewokesalaryman, and the following quote:

+
Quote of the Day

Ironically, by not taking any risks and letting all your money get eroded by certain inflation, you are actually doing the riskiest thing.

+

This quote was the wake-up call for me to start investing, and could be yours too if you are someone who is privileged enough to start doing the same (i.e. you have the financial ability to buy bubble tea at least once a week).

+

Milksha&#39;s Bubble Tea

+

Photo by my bubble-tea buddy Elsie Lee
+Pictured (from left): Milksha's Fresh Milk, and Izumo Matcha Milk with Honey Pearls
+Is Milksha a buy? Milksha isn't cheap by any stretch but you can't put a price tag on happiness

+
Pro Tip from fellow bubble-tea enthusiast Freda

Buy Milksha coupons from Shopee beforehand to get massive discounts!

+

Anyhow, I reasoned the best way to kick-start my investment journey would be with a robo-advisor platform, given how beginner-friendly it is, how low the commission fees are, and how lazy I am given the passive and minimal-effort investment a robo-advisor offers.

+

You can check out this page by dollarsandsense giving an introduction to robo-advisors for more reasons why you should or should not invest with a robo-advisor platform.

+

I ended up choosing StashAway as my platform of choice, and here are the top 3 reasons why!

+

1. StashAway's all-star C-suite

+

StashAway is led by an "Expert Investment Team" (their words not mine) made up of the following co-founders:

+
    +
  • Chief Executive Officer Michele Ferrario, a former CEO of Zalora Group and the co-founder of Rocket Internet
  • +
  • Chief Investment Officer Freddy Lim, a former Managing Director and Global Head of Derivatives Strategy at Nomura
  • +
  • Chief Technology Officer Nino Ulsamer, the co-founder and former CTO of a now-defunct (oops) software solution company for e-commerce analytics
  • +
+

These guys have real, solid credentials. They are far more experienced in investing than an amateur like me (surprise surprise), and this assured me that my investments in StashAway would be handled by well-informed and secure hands.

+

Credentials aside, they also have a proven track record of high returns for most of their portfolios. Despite how volatile and uncertain 2020 was, I achieved an impressive 19.59% time-weighted return for my portfolio of StashAway Risk Index 22%, between 3rd of February 2020, and 10th of March, 2021.

+

Evan&#39;s StashAway returns

+

To find out how well StashAway's portfolios performed at other risk-levels, check out their article: Our Returns in 2020.

+

2. No minimum amount at all

+

Another robo-advisor platform I was considering at the time was EndowUs. However, I ultimately went with StashAway because while EndowUs had a minimum investment amount of $10,000.00 (added cents for emphasis), StashAway had no minimum amount at all. This is still the case as of 11 March 2021.

+

As someone new to investing, the decision to invest $10,000 all at once was too intimidating for me to make. More importantly, I was still a student back then, one who did not have that many digits in his bank account. Therefore, StashAway was a natural choice for its low entry barrier!

+

3. My money is safe

+

Naturally, I was concerned about how safe using StashAway would be. More specifically, I was worried about losing my initial investment of $100 in StashAway, in the event of StashAway filing for bankruptcy. As it turned out, it was an unfound concern given that:

+
Quote

Your money is kept entirely separate from StashAway's finances. To ensure that we never touch your money, we use custodian banks that hold your money, whether it's in cash or in securities.

In these custodian institutions, your assets are always in a segregated account-- one that is separate from StashAway's operations and assets. This means that you will always have full access and claim to your assets no matter what happens to StashAway.

+

You can read more about StashAway's Frequently Asked Questions here. Do your own research hor!

+

Closing note

+

I hope you found this post/rambling/thing (*gestures wildly at everything) insightful in any way. If you are still interested in StashAway, but not entirely convinced by me (I’ll try not to take it personally), you can check out this video by Kevin Learns Investing. All the best with getting financially fit!

+

Special thanks to Vanessa Tay for editing this!

]]>
+ investing + sharing +
+ + <![CDATA[GitHub Action for Docusaurus]]> + https://evantay.com/blog/docusaurus-gh-action + https://evantay.com/blog/docusaurus-gh-action + Sun, 17 Jan 2021 00:00:00 GMT + + I got tired of deploying my Docusaurus website to GitHub Pages manually, and decided to do something about it using GitHub Action.

+

Initially, I was planning to follow the official guide on doing so. However, it was actually much more complicated than I liked. I did not really want to generate and store a SSH key on GitHub. Too much effort man.

+

I decided it was better off for me to write my own script. Here it is:

+

deploy-docusaurus.yml

+
caution

The script below assumes that your Docusaurus website resides at /website of your repo. If that is not the case for you, you will need to:

    +
  • Change cd website to cd <docu_site_root>, or delete the entire line if your Docusaurus website is at the root of your repo /
  • +
  • Change build_dir's value from website/build to <docu_site_root>/build, or build if your Docusaurus website is at the root of your repo /
  • +
+
name: deploy-docusaurus

on:
push:
branches: [main]
pull_request:
branches: [main]

# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
publish:
runs-on: ubuntu-latest
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- name: Check out repo
uses: actions/checkout@v2
# Node is required for npm
- name: Set up Node
uses: actions/setup-node@v2
with:
node-version: "12"
# Install and build Docusaurus website
- name: Build Docusaurus website
run: |
cd website
npm install
npm run build
- name: Deploy to GitHub Pages
if: success()
uses: crazy-max/ghaction-github-pages@v2
with:
target_branch: gh-pages
build_dir: website/build
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
note

GitHub will automatically add GITHUB_TOKEN to Secrets. You need not do so. See this for more information.

+

To see this script in action, visit my personal website repo.

]]>
+ docusaurus + github-action + ci +
+ + <![CDATA[History of EvanTay.com]]> + https://evantay.com/blog/history + https://evantay.com/blog/history + Mon, 21 Dec 2020 00:00:00 GMT + + Established in 2013

+

I first bought my personal domain www.evantay.com way back in 2013. Younger me thought it would be cool and fun to run my own website, and it still is. 😎

+

To be honest, I can't even remember what my very first website looked like, but I am quite sure it was built using vanilla HTML and CSS, something unthinkable in this day and age.

+

Move to Grav CMS in 2017

+

Given that I was building everything from the ground up, maintainability became problematic. In 2017, older younger me decided it wasn't worth the effort to do it myself, and I started shopping for a framework to adopt. I eventually settled on using Grav, a flat-file Content Management System (CMS) powered by PHP. I chose it because I was familiar and interested in PHP at the time.

+

To get started on building my second site quickly, I used a one-page Grav theme Ceevee.

+

Ceevee

+

However, I still wanted to add my personal touch to my portfolio website. This led me to heavily modifying the theme numerous times over the years, from 2017 up until 2020. It was a really fun journey while it lasted.

+

EvanTay.com v1 site

+

Move to Cloud in 2017

+

About the same time, I also moved from using a website host to DigitalOcean. I hosted my website on the cheapest droplet (VM) I could find (the 5 bucks one). I ran CentOS on the VM, and used an Nginx web server to serve the Grav website. Pretty old-school right?

+

Start of DigiDocs in 2019

+

Last year, during January 2019, I also started working on a separate pet project called DigiDocs, my personal documentation website. I was motivated to do so because I wanted to consolidate useful knowledge gained from attending university classes, and my own self-directed learning. I kept the site updated up until October 2020.

+

Back then, DigiDocs lived at www.evantay.com/docs, and was served by the same Nginx server which served my main portfolio website.

+

Move to Docusaurus v2 in 2020

+

More recently, in October 2020, I decided to replace both documentation and portfolio site with a single Docusaurus v2 website (which you're looking at right now).

+

I did so because I wanted to:

+
    +
  1. Keep up with the latest technologies: I wanted to learn more about Docusaurus v2 and also ReactJS, which is what Docusaurus is built upon. It was about time to move on from PHP.
  2. +
  3. Reduce operating costs by moving from a dynamic to static website 💸 : Given that all of my content are static, it did not make sense that I was using a dynamic PHP site generator such as Grav. By moving to a static website, I will be able to host my site at a cheaper cost or even for free! I am planning to achieve the latter by using GitHub pages.
  4. +
+

So far, the experience of using Docusaurus v2 has been great! I am glad I started on this migration journey, despite feeling sentimental about my old portfolio and documentation websites.

]]>
+ sharing +
+ + <![CDATA[STACK 2020 Developers Conference]]> + https://evantay.com/blog/stack-2020 + https://evantay.com/blog/stack-2020 + Thu, 03 Dec 2020 00:00:00 GMT + + STACK 2020 Developers Conference is GovTech’s flagship conference and the largest government-led developers event in Singapore that connects government, industry and the tech community.

+

In this post, you will find my key takeaways for some of the sessions I attended during the conference. I chose to attend these sessions based on my interests in Cloud and Microservices.

+

Day 1:

+ +

Day 2:

+ +

Opening note

+

Speaker(s)

+ +

Key takeaways

+

The government believes openness is the way to building a smart nation.

+

On that note, they believe in:

+
    +
  • Adopting the best solutions there are, including those from the industry, instead of doing everything in-house + +
  • +
  • Collaborating with industry developers via open-source + +
  • +
  • Providing transparency to citizens and industry professionals +
      +
    • TraceTogether: Transparent and open collaboration with the industry
    • +
    +
  • +
+

Rethink, Reinvent, Rebuild

+

Speaker(s)

+
    +
  • Jeff Barr: Vice President & Chief Evangelist at Amazon Web Services
  • +
+

Key takeaways

+
    +
  • Rethink - Take a good look at where we are +
      +
    • Everything has changed due to COVID-19, Quarantine, WFH
    • +
    • No firm ground and constants are now variables
    • +
    • People are more receptive to change and invention right now
    • +
    • Good time for innovation and progress
    • +
    +
  • +
  • Reinvent - Solve challenges in a new way +
      +
    • Dream big dreams, address these challenges, change the world
    • +
    • Share what you learn to reinforce what you learned +
        +
      • Content creation / video streaming possibilities
      • +
      +
    • +
    +
  • +
  • Rebuild - Put what you have learned to work +
      +
    • Take what you learn, do something awesome, and remember to share it!
    • +
    +
  • +
+

Seeding the Cloud: Engineering Solutions for Cloud Adoption

+

Speaker(s)

+ +

Key takeaways

+

Hunter shared about how GovTech uses Infrastructure-as-Code (IaC) and Policy-as-Code (PaC) to accelerate cloud operations. Read #devops-cloud-and-back-again by Hashicorp CTO Mitchell for more information.

+
    +
  • Establishing a Landing Zone +
      +
    • A repeatable configuration across multiple Cloud Service Providers (CSP)
    • +
    • The foundation of any cloud environment at scale
    • +
    • Serves as a consistent platform for governance, onboarding, networking and security
    • +
    +
  • +
  • Accelerating deployment with Infrastructure-as-Code (IaC) +
      +
    • Code and configuration to provision cloud resources and Landing Zones
    • +
    • Develop common templates for consistency and familiarity
    • +
    • Get feedback on pain points faced by "customers" while using said templates
    • +
    +
  • +
  • Consistent audit and reporting with Policy-as-Code (PaC) +
      +
    • Code and configuration to test and validate cloud infrastructure deployed by IaC
    • +
    • Reduce need for manual audits and speed up auditing process
    • +
    +
  • +
+

Six Principles for Refactoring a Monolith to Microservices

+

Speaker(s)

+ +

Key takeaways

+
Quote

"A Microservice application is structured as a set of loosely coupled services that can be independently deployed." - Chris Richardson

+

Chris shared 6 principles to follow when moving from a Monolith to a Microservice architecture.

+

Here are 5 of them 😉 :

+
    +
  • Adopt Microservice architecture for the right reasons +
      +
    • Monolith architecture is not necessary bad (an anti-pattern), it has its valid use-cases
    • +
    • Adopt Microservice architecture because it allows you to deliver software rapidly, frequently and sustainability, with small, autonomous teams working on the different microservices
    • +
    +
  • +
  • Migrate to Microservice architecture incrementally rather than via Big Bang rewrite +
      +
    • Strangler Application: Incrementally migrate functionality from existing Monolith application to new Strangler Microservice application +
        +
      • Extract existing code modules and database tables out into microservices
      • +
      • Implement new features as microservices
      • +
      +
    • +
    +
  • +
  • Consider Return-on-Investment when deciding which modules to convert into microservices +
      +
    • Consider benefit of decoupling said module
    • +
    • Consider cost of decoupling +
        +
      • How difficult it is to do so
      • +
      • How many inbound dependencies it has +
          +
        • If module A is depended upon by module B, consider extracting module B first
        • +
        +
      • +
      +
    • +
    +
  • +
  • Define the service boundaries correctly +
      +
    • Avoid Runtime Coupling +
        +
      • Reduced availability due to reliance of a given microservice on another for serving a given request +
          +
        • For example, microservice A receives an API request which it can only respond to when its own API request to microservice B is answered first
        • +
        +
      • +
      • Make microservices as self-contained as possible +
          +
        • Able to respond to a request without making follow-up requests to other microservices
        • +
        +
      • +
      +
    • +
    • Avoid Design-Time Coupling +
        +
      • Similar to Open-Closed Principle
      • +
      • Avoid having to modify other microservices when modifying a given microservice
      • +
      • Must be able to modify or exend a given microservice independently as much as possible +
          +
        • Have small and stable API which hides as much implementation complexity as possible
        • +
        • Hide what you can, not only code but also database schemas, so you can change them without affecting other microservices
        • +
        +
      • +
      +
    • +
    +
  • +
  • Measuring success +
      +
    • Improved metrics: Reduced lead time, deployment frequency, failure rate, etc.
    • +
    • Improvements in other '-ilities': Availability, Reliability and Scalability
    • +
    +
  • +
+

You Won’t BELIEVE This HACK to Improve Your Technical Communication!

+

Speaker(s)

+ +

Key takeaways

+

When introducing non-technical folks to coding, keep in mind that the most important objective is to convey understanding of core programming concepts.

+

On that note, here are some tips Nikhil shared:

+
    +
  • Forgo coding best practices if doing so make it easier for the audience to understand +
      +
    • Reduce surface area to increase accessibility, even if it is not good coding practice +
        +
      • Collapse all HTML, JS and CSS into a single file so students can view everything in one place
      • +
      • Collapse all functions into one for the same reason as the previous line
      • +
      • Combine program lines if it makes things clearer
      • +
      +
    • +
    +
  • +
  • Use real-world examples to explain technical concepts +
      +
    • For example, use a restaurant scenario to explain async
    • +
    +
  • +
  • Enable students in sharing their joy/achievement +
      +
    • Make deploying their application easy +
        +
      • Can use Netlify Drop: Simply drag and drop your HTML, JS, CSS files and Netlify Drop will do the rest for deployments
      • +
      +
    • +
    +
  • +
  • Practise empathy consciously throughout teaching process to identify ways you can make learning easier for your students
  • +
+

DevOps: Cloud and Back Again

+

Speaker(s)

+ +

Key takeaways

+

Mitchell shared more about the Cloud Operating Model during this session.

+

"The Cloud Operating Model is a new approach for IT operations that organizations need to use to be successful with cloud adoption and thrive in an era of multi-cloud architecture." - Hashicorp

+
StaticDynamic
RunDedicated infrastructure to run app onScheduled automatically across a fleet (e.g. AWS Auto-Scaling Group, Hashicorp Nomad)
ConnectHost-based, static IP-addressingService-based, dynamic IP addresses due to dynamic provisioning
SecureHigh-trust environment which is IP-address-based, with clear network perimeterLow-trust environment with no clear perimeter given multi-tenancy and nature of the Cloud
ProvisionDedicated resources - Physical servers, routers and switchesCapacity on-demand, provision VMs, Containers and other managed services, or simply use Serverless services
+
    +
  • Infrastructure operations on the Cloud must follow the Dynamic Cloud Operating Model fully +
      +
    • Pointless if you provision infrastructure in minutes using Infrastructure-as-Code (IaC), but still manually handle connectivity and security review using tickets
    • +
    • Have to adopt dynamic cloud operating tools for all 4 layers
    • +
    +
  • +
  • Why use IaC for provisioning +
      +
    • Split Execution from Definition
    • +
    • Execution can be automated and carried out via API, UI or automatically through Continuous-Integration (CI) tools
    • +
    +
  • +
  • How can teams use IaC +
      +
    • Operations team still necessary, focus on creating and improving blueprints and handling edge-cases when doing so
    • +
    • Development team creates infrastructure in a self-service manner, using the blueprints created by the Operations team +separating buzz words from crucial tech
    • +
    +
  • +
+

Read up on Hashicorp's white paper on Cloud Operating Model for more information.

]]>
+ conference + cloud + microservices + GovTechSTACK +
+
+
\ No newline at end of file diff --git a/blog/stack-2020/index.html b/blog/stack-2020/index.html new file mode 100644 index 00000000..820bb068 --- /dev/null +++ b/blog/stack-2020/index.html @@ -0,0 +1,263 @@ + + + + + +STACK 2020 Developers Conference | Evan Tay + + + + + + + + + + +

STACK 2020 Developers Conference

· 8 min read
Evan Tay

STACK 2020 Developers Conference is GovTech’s flagship conference and the largest government-led developers event in Singapore that connects government, industry and the tech community.

+

In this post, you will find my key takeaways for some of the sessions I attended during the conference. I chose to attend these sessions based on my interests in Cloud and Microservices.

+

Day 1:

+ +

Day 2:

+ +

Opening note

+

Speaker(s)

+ +

Key takeaways

+

The government believes openness is the way to building a smart nation.

+

On that note, they believe in:

+
    +
  • Adopting the best solutions there are, including those from the industry, instead of doing everything in-house + +
  • +
  • Collaborating with industry developers via open-source + +
  • +
  • Providing transparency to citizens and industry professionals +
      +
    • TraceTogether: Transparent and open collaboration with the industry
    • +
    +
  • +
+

Rethink, Reinvent, Rebuild

+

Speaker(s)

+
    +
  • Jeff Barr: Vice President & Chief Evangelist at Amazon Web Services
  • +
+

Key takeaways

+
    +
  • Rethink - Take a good look at where we are +
      +
    • Everything has changed due to COVID-19, Quarantine, WFH
    • +
    • No firm ground and constants are now variables
    • +
    • People are more receptive to change and invention right now
    • +
    • Good time for innovation and progress
    • +
    +
  • +
  • Reinvent - Solve challenges in a new way +
      +
    • Dream big dreams, address these challenges, change the world
    • +
    • Share what you learn to reinforce what you learned +
        +
      • Content creation / video streaming possibilities
      • +
      +
    • +
    +
  • +
  • Rebuild - Put what you have learned to work +
      +
    • Take what you learn, do something awesome, and remember to share it!
    • +
    +
  • +
+

Seeding the Cloud: Engineering Solutions for Cloud Adoption

+

Speaker(s)

+ +

Key takeaways

+

Hunter shared about how GovTech uses Infrastructure-as-Code (IaC) and Policy-as-Code (PaC) to accelerate cloud operations. Read #devops-cloud-and-back-again by Hashicorp CTO Mitchell for more information.

+
    +
  • Establishing a Landing Zone +
      +
    • A repeatable configuration across multiple Cloud Service Providers (CSP)
    • +
    • The foundation of any cloud environment at scale
    • +
    • Serves as a consistent platform for governance, onboarding, networking and security
    • +
    +
  • +
  • Accelerating deployment with Infrastructure-as-Code (IaC) +
      +
    • Code and configuration to provision cloud resources and Landing Zones
    • +
    • Develop common templates for consistency and familiarity
    • +
    • Get feedback on pain points faced by "customers" while using said templates
    • +
    +
  • +
  • Consistent audit and reporting with Policy-as-Code (PaC) +
      +
    • Code and configuration to test and validate cloud infrastructure deployed by IaC
    • +
    • Reduce need for manual audits and speed up auditing process
    • +
    +
  • +
+

Six Principles for Refactoring a Monolith to Microservices

+

Speaker(s)

+ +

Key takeaways

+
Quote

"A Microservice application is structured as a set of loosely coupled services that can be independently deployed." - Chris Richardson

+

Chris shared 6 principles to follow when moving from a Monolith to a Microservice architecture.

+

Here are 5 of them 😉 :

+
    +
  • Adopt Microservice architecture for the right reasons +
      +
    • Monolith architecture is not necessary bad (an anti-pattern), it has its valid use-cases
    • +
    • Adopt Microservice architecture because it allows you to deliver software rapidly, frequently and sustainability, with small, autonomous teams working on the different microservices
    • +
    +
  • +
  • Migrate to Microservice architecture incrementally rather than via Big Bang rewrite +
      +
    • Strangler Application: Incrementally migrate functionality from existing Monolith application to new Strangler Microservice application +
        +
      • Extract existing code modules and database tables out into microservices
      • +
      • Implement new features as microservices
      • +
      +
    • +
    +
  • +
  • Consider Return-on-Investment when deciding which modules to convert into microservices +
      +
    • Consider benefit of decoupling said module
    • +
    • Consider cost of decoupling +
        +
      • How difficult it is to do so
      • +
      • How many inbound dependencies it has +
          +
        • If module A is depended upon by module B, consider extracting module B first
        • +
        +
      • +
      +
    • +
    +
  • +
  • Define the service boundaries correctly +
      +
    • Avoid Runtime Coupling +
        +
      • Reduced availability due to reliance of a given microservice on another for serving a given request +
          +
        • For example, microservice A receives an API request which it can only respond to when its own API request to microservice B is answered first
        • +
        +
      • +
      • Make microservices as self-contained as possible +
          +
        • Able to respond to a request without making follow-up requests to other microservices
        • +
        +
      • +
      +
    • +
    • Avoid Design-Time Coupling +
        +
      • Similar to Open-Closed Principle
      • +
      • Avoid having to modify other microservices when modifying a given microservice
      • +
      • Must be able to modify or exend a given microservice independently as much as possible +
          +
        • Have small and stable API which hides as much implementation complexity as possible
        • +
        • Hide what you can, not only code but also database schemas, so you can change them without affecting other microservices
        • +
        +
      • +
      +
    • +
    +
  • +
  • Measuring success +
      +
    • Improved metrics: Reduced lead time, deployment frequency, failure rate, etc.
    • +
    • Improvements in other '-ilities': Availability, Reliability and Scalability
    • +
    +
  • +
+

You Won’t BELIEVE This HACK to Improve Your Technical Communication!

+

Speaker(s)

+ +

Key takeaways

+

When introducing non-technical folks to coding, keep in mind that the most important objective is to convey understanding of core programming concepts.

+

On that note, here are some tips Nikhil shared:

+
    +
  • Forgo coding best practices if doing so make it easier for the audience to understand +
      +
    • Reduce surface area to increase accessibility, even if it is not good coding practice +
        +
      • Collapse all HTML, JS and CSS into a single file so students can view everything in one place
      • +
      • Collapse all functions into one for the same reason as the previous line
      • +
      • Combine program lines if it makes things clearer
      • +
      +
    • +
    +
  • +
  • Use real-world examples to explain technical concepts +
      +
    • For example, use a restaurant scenario to explain async
    • +
    +
  • +
  • Enable students in sharing their joy/achievement +
      +
    • Make deploying their application easy +
        +
      • Can use Netlify Drop: Simply drag and drop your HTML, JS, CSS files and Netlify Drop will do the rest for deployments
      • +
      +
    • +
    +
  • +
  • Practise empathy consciously throughout teaching process to identify ways you can make learning easier for your students
  • +
+

DevOps: Cloud and Back Again

+

Speaker(s)

+ +

Key takeaways

+

Mitchell shared more about the Cloud Operating Model during this session.

+

"The Cloud Operating Model is a new approach for IT operations that organizations need to use to be successful with cloud adoption and thrive in an era of multi-cloud architecture." - Hashicorp

+
StaticDynamic
RunDedicated infrastructure to run app onScheduled automatically across a fleet (e.g. AWS Auto-Scaling Group, Hashicorp Nomad)
ConnectHost-based, static IP-addressingService-based, dynamic IP addresses due to dynamic provisioning
SecureHigh-trust environment which is IP-address-based, with clear network perimeterLow-trust environment with no clear perimeter given multi-tenancy and nature of the Cloud
ProvisionDedicated resources - Physical servers, routers and switchesCapacity on-demand, provision VMs, Containers and other managed services, or simply use Serverless services
+
    +
  • Infrastructure operations on the Cloud must follow the Dynamic Cloud Operating Model fully +
      +
    • Pointless if you provision infrastructure in minutes using Infrastructure-as-Code (IaC), but still manually handle connectivity and security review using tickets
    • +
    • Have to adopt dynamic cloud operating tools for all 4 layers
    • +
    +
  • +
  • Why use IaC for provisioning +
      +
    • Split Execution from Definition
    • +
    • Execution can be automated and carried out via API, UI or automatically through Continuous-Integration (CI) tools
    • +
    +
  • +
  • How can teams use IaC +
      +
    • Operations team still necessary, focus on creating and improving blueprints and handling edge-cases when doing so
    • +
    • Development team creates infrastructure in a self-service manner, using the blueprints created by the Operations team +separating buzz words from crucial tech
    • +
    +
  • +
+

Read up on Hashicorp's white paper on Cloud Operating Model for more information.

+ + \ No newline at end of file diff --git a/blog/stashaway/index.html b/blog/stashaway/index.html new file mode 100644 index 00000000..6cb4d727 --- /dev/null +++ b/blog/stashaway/index.html @@ -0,0 +1,54 @@ + + + + + +Top 3 reasons why you should start investing with StashAway today! | Evan Tay + + + + + + + + + + +

Top 3 reasons why you should start investing with StashAway today!

· 5 min read
Evan Tay
Deprecated

This article was posted sometime back in early 2021 and may be outdated. Refer to SingSaver instead for updated information.

+
Disclaimer

This post is not sponsored, and does not constitute financial advice of any form (I bet you know better than me). Read at your own discretion.

+

Signing up on StashAway (a robo-advisor platform) back in the early 2020s was the first step in taking control of my financial health. Before that, 100% of my cash was just sitting in a POSB Savings account, growing at an incredibly pointless rate of 0.05% per annum. I might as well have kept the money under my mattress.

+

Backstory

+

I was hesitant to invest for years because I used to think any form of investment was risky. Like most some Singaporeans, I am was kiasi. I was afraid of the unknown. What eventually changed my mind was chancing upon this article: The big problem (of) playing it too safe with money in our 20s by thewokesalaryman, and the following quote:

+
Quote of the Day

Ironically, by not taking any risks and letting all your money get eroded by certain inflation, you are actually doing the riskiest thing.

+

This quote was the wake-up call for me to start investing, and could be yours too if you are someone who is privileged enough to start doing the same (i.e. you have the financial ability to buy bubble tea at least once a week).

+

Milksha&#39;s Bubble Tea

+

Photo by my bubble-tea buddy Elsie Lee
+Pictured (from left): Milksha's Fresh Milk, and Izumo Matcha Milk with Honey Pearls
+Is Milksha a buy? Milksha isn't cheap by any stretch but you can't put a price tag on happiness

+
Pro Tip from fellow bubble-tea enthusiast Freda

Buy Milksha coupons from Shopee beforehand to get massive discounts!

+

Anyhow, I reasoned the best way to kick-start my investment journey would be with a robo-advisor platform, given how beginner-friendly it is, how low the commission fees are, and how lazy I am given the passive and minimal-effort investment a robo-advisor offers.

+

You can check out this page by dollarsandsense giving an introduction to robo-advisors for more reasons why you should or should not invest with a robo-advisor platform.

+

I ended up choosing StashAway as my platform of choice, and here are the top 3 reasons why!

+

1. StashAway's all-star C-suite

+

StashAway is led by an "Expert Investment Team" (their words not mine) made up of the following co-founders:

+
    +
  • Chief Executive Officer Michele Ferrario, a former CEO of Zalora Group and the co-founder of Rocket Internet
  • +
  • Chief Investment Officer Freddy Lim, a former Managing Director and Global Head of Derivatives Strategy at Nomura
  • +
  • Chief Technology Officer Nino Ulsamer, the co-founder and former CTO of a now-defunct (oops) software solution company for e-commerce analytics
  • +
+

These guys have real, solid credentials. They are far more experienced in investing than an amateur like me (surprise surprise), and this assured me that my investments in StashAway would be handled by well-informed and secure hands.

+

Credentials aside, they also have a proven track record of high returns for most of their portfolios. Despite how volatile and uncertain 2020 was, I achieved an impressive 19.59% time-weighted return for my portfolio of StashAway Risk Index 22%, between 3rd of February 2020, and 10th of March, 2021.

+

Evan&#39;s StashAway returns

+

To find out how well StashAway's portfolios performed at other risk-levels, check out their article: Our Returns in 2020.

+

2. No minimum amount at all

+

Another robo-advisor platform I was considering at the time was EndowUs. However, I ultimately went with StashAway because while EndowUs had a minimum investment amount of $10,000.00 (added cents for emphasis), StashAway had no minimum amount at all. This is still the case as of 11 March 2021.

+

As someone new to investing, the decision to invest $10,000 all at once was too intimidating for me to make. More importantly, I was still a student back then, one who did not have that many digits in his bank account. Therefore, StashAway was a natural choice for its low entry barrier!

+

3. My money is safe

+

Naturally, I was concerned about how safe using StashAway would be. More specifically, I was worried about losing my initial investment of $100 in StashAway, in the event of StashAway filing for bankruptcy. As it turned out, it was an unfound concern given that:

+
Quote

Your money is kept entirely separate from StashAway's finances. To ensure that we never touch your money, we use custodian banks that hold your money, whether it's in cash or in securities.

In these custodian institutions, your assets are always in a segregated account-- one that is separate from StashAway's operations and assets. This means that you will always have full access and claim to your assets no matter what happens to StashAway.

+

You can read more about StashAway's Frequently Asked Questions here. Do your own research hor!

+

Closing note

+

I hope you found this post/rambling/thing (*gestures wildly at everything) insightful in any way. If you are still interested in StashAway, but not entirely convinced by me (I’ll try not to take it personally), you can check out this video by Kevin Learns Investing. All the best with getting financially fit!

+

Special thanks to Vanessa Tay for editing this!

+ + \ No newline at end of file diff --git a/blog/tags/analytics/index.html b/blog/tags/analytics/index.html new file mode 100644 index 00000000..a2376287 --- /dev/null +++ b/blog/tags/analytics/index.html @@ -0,0 +1,20 @@ + + + + + +One post tagged with "analytics" | Evan Tay + + + + + + + + + + +

One post tagged with "analytics"

View All Tags

· 4 min read
Evan Tay

I integrated PostHog analytics into this website today. I decided to do so after reading Gergely Orosz's Stats page on his blog The Pragmatic Engineer. He had installed Plausible analytics and made his analytics dashboard public. I thought that was cool and wanted to do the same.

+

I managed to find a Plausible plugin for Docusaurus v2, which is what this website runs on. But I decided to use PostHog instead. It also has a Docusaurus plugin and a public dashboard feature. I decided so because it is free and Plausible isn't.

+ + \ No newline at end of file diff --git a/blog/tags/book-review/index.html b/blog/tags/book-review/index.html new file mode 100644 index 00000000..747e0040 --- /dev/null +++ b/blog/tags/book-review/index.html @@ -0,0 +1,19 @@ + + + + + +One post tagged with "book-review" | Evan Tay + + + + + + + + + + +

One post tagged with "book-review"

View All Tags

· 3 min read
Evan Tay

Picking up this book was one of the best decisions I made for my fledgling software engineering career. Its insights enabled me to make well-reasoned software design decisions, and confidently communicate them, in spite of my relative professional inexperience. Given how helpful it has been, I’m here today to share more about the impression it has left on me, and convince you that it is a must-read if you are a software engineer.

+ + \ No newline at end of file diff --git a/blog/tags/ci/index.html b/blog/tags/ci/index.html new file mode 100644 index 00000000..d3495477 --- /dev/null +++ b/blog/tags/ci/index.html @@ -0,0 +1,21 @@ + + + + + +One post tagged with "ci" | Evan Tay + + + + + + + + + + +

One post tagged with "ci"

View All Tags

· 2 min read
Evan Tay

I got tired of deploying my Docusaurus website to GitHub Pages manually, and decided to do something about it using GitHub Action.

+

Initially, I was planning to follow the official guide on doing so. However, it was actually much more complicated than I liked. I did not really want to generate and store a SSH key on GitHub. Too much effort man.

+

I decided it was better off for me to write my own script. Here it is:

+ + \ No newline at end of file diff --git a/blog/tags/cloud/index.html b/blog/tags/cloud/index.html new file mode 100644 index 00000000..6248cad9 --- /dev/null +++ b/blog/tags/cloud/index.html @@ -0,0 +1,20 @@ + + + + + +One post tagged with "cloud" | Evan Tay + + + + + + + + + + +

One post tagged with "cloud"

View All Tags

· 8 min read
Evan Tay

STACK 2020 Developers Conference is GovTech’s flagship conference and the largest government-led developers event in Singapore that connects government, industry and the tech community.

+

In this post, you will find my key takeaways for some of the sessions I attended during the conference. I chose to attend these sessions based on my interests in Cloud and Microservices.

+ + \ No newline at end of file diff --git a/blog/tags/conference/index.html b/blog/tags/conference/index.html new file mode 100644 index 00000000..5239468a --- /dev/null +++ b/blog/tags/conference/index.html @@ -0,0 +1,20 @@ + + + + + +One post tagged with "conference" | Evan Tay + + + + + + + + + + +

One post tagged with "conference"

View All Tags

· 8 min read
Evan Tay

STACK 2020 Developers Conference is GovTech’s flagship conference and the largest government-led developers event in Singapore that connects government, industry and the tech community.

+

In this post, you will find my key takeaways for some of the sessions I attended during the conference. I chose to attend these sessions based on my interests in Cloud and Microservices.

+ + \ No newline at end of file diff --git a/blog/tags/docusaurus/index.html b/blog/tags/docusaurus/index.html new file mode 100644 index 00000000..9a7c9931 --- /dev/null +++ b/blog/tags/docusaurus/index.html @@ -0,0 +1,22 @@ + + + + + +2 posts tagged with "docusaurus" | Evan Tay + + + + + + + + + + +

2 posts tagged with "docusaurus"

View All Tags

· 4 min read
Evan Tay

I integrated PostHog analytics into this website today. I decided to do so after reading Gergely Orosz's Stats page on his blog The Pragmatic Engineer. He had installed Plausible analytics and made his analytics dashboard public. I thought that was cool and wanted to do the same.

+

I managed to find a Plausible plugin for Docusaurus v2, which is what this website runs on. But I decided to use PostHog instead. It also has a Docusaurus plugin and a public dashboard feature. I decided so because it is free and Plausible isn't.

· 2 min read
Evan Tay

I got tired of deploying my Docusaurus website to GitHub Pages manually, and decided to do something about it using GitHub Action.

+

Initially, I was planning to follow the official guide on doing so. However, it was actually much more complicated than I liked. I did not really want to generate and store a SSH key on GitHub. Too much effort man.

+

I decided it was better off for me to write my own script. Here it is:

+ + \ No newline at end of file diff --git a/blog/tags/github-action/index.html b/blog/tags/github-action/index.html new file mode 100644 index 00000000..2050272b --- /dev/null +++ b/blog/tags/github-action/index.html @@ -0,0 +1,21 @@ + + + + + +One post tagged with "github-action" | Evan Tay + + + + + + + + + + +

One post tagged with "github-action"

View All Tags

· 2 min read
Evan Tay

I got tired of deploying my Docusaurus website to GitHub Pages manually, and decided to do something about it using GitHub Action.

+

Initially, I was planning to follow the official guide on doing so. However, it was actually much more complicated than I liked. I did not really want to generate and store a SSH key on GitHub. Too much effort man.

+

I decided it was better off for me to write my own script. Here it is:

+ + \ No newline at end of file diff --git a/blog/tags/gov-tech-stack/index.html b/blog/tags/gov-tech-stack/index.html new file mode 100644 index 00000000..6a905158 --- /dev/null +++ b/blog/tags/gov-tech-stack/index.html @@ -0,0 +1,20 @@ + + + + + +One post tagged with "GovTechSTACK" | Evan Tay + + + + + + + + + + +

One post tagged with "GovTechSTACK"

View All Tags

· 8 min read
Evan Tay

STACK 2020 Developers Conference is GovTech’s flagship conference and the largest government-led developers event in Singapore that connects government, industry and the tech community.

+

In this post, you will find my key takeaways for some of the sessions I attended during the conference. I chose to attend these sessions based on my interests in Cloud and Microservices.

+ + \ No newline at end of file diff --git a/blog/tags/index.html b/blog/tags/index.html new file mode 100644 index 00000000..4dbfebd0 --- /dev/null +++ b/blog/tags/index.html @@ -0,0 +1,19 @@ + + + + + +Tags | Evan Tay + + + + + + + + + + + + + \ No newline at end of file diff --git a/blog/tags/investing/index.html b/blog/tags/investing/index.html new file mode 100644 index 00000000..9b106460 --- /dev/null +++ b/blog/tags/investing/index.html @@ -0,0 +1,21 @@ + + + + + +One post tagged with "investing" | Evan Tay + + + + + + + + + + +

One post tagged with "investing"

View All Tags

· 5 min read
Evan Tay
Deprecated

This article was posted sometime back in early 2021 and may be outdated. Refer to SingSaver instead for updated information.

+
Disclaimer

This post is not sponsored, and does not constitute financial advice of any form (I bet you know better than me). Read at your own discretion.

+

Signing up on StashAway (a robo-advisor platform) back in the early 2020s was the first step in taking control of my financial health. Before that, 100% of my cash was just sitting in a POSB Savings account, growing at an incredibly pointless rate of 0.05% per annum. I might as well have kept the money under my mattress.

+ + \ No newline at end of file diff --git a/blog/tags/microservices/index.html b/blog/tags/microservices/index.html new file mode 100644 index 00000000..5637350f --- /dev/null +++ b/blog/tags/microservices/index.html @@ -0,0 +1,20 @@ + + + + + +One post tagged with "microservices" | Evan Tay + + + + + + + + + + +

One post tagged with "microservices"

View All Tags

· 8 min read
Evan Tay

STACK 2020 Developers Conference is GovTech’s flagship conference and the largest government-led developers event in Singapore that connects government, industry and the tech community.

+

In this post, you will find my key takeaways for some of the sessions I attended during the conference. I chose to attend these sessions based on my interests in Cloud and Microservices.

+ + \ No newline at end of file diff --git a/blog/tags/posthog/index.html b/blog/tags/posthog/index.html new file mode 100644 index 00000000..57a53d1d --- /dev/null +++ b/blog/tags/posthog/index.html @@ -0,0 +1,20 @@ + + + + + +One post tagged with "posthog" | Evan Tay + + + + + + + + + + +

One post tagged with "posthog"

View All Tags

· 4 min read
Evan Tay

I integrated PostHog analytics into this website today. I decided to do so after reading Gergely Orosz's Stats page on his blog The Pragmatic Engineer. He had installed Plausible analytics and made his analytics dashboard public. I thought that was cool and wanted to do the same.

+

I managed to find a Plausible plugin for Docusaurus v2, which is what this website runs on. But I decided to use PostHog instead. It also has a Docusaurus plugin and a public dashboard feature. I decided so because it is free and Plausible isn't.

+ + \ No newline at end of file diff --git a/blog/tags/sharing/index.html b/blog/tags/sharing/index.html new file mode 100644 index 00000000..1f71d4e2 --- /dev/null +++ b/blog/tags/sharing/index.html @@ -0,0 +1,23 @@ + + + + + +2 posts tagged with "sharing" | Evan Tay + + + + + + + + + + +

2 posts tagged with "sharing"

View All Tags

· 5 min read
Evan Tay
Deprecated

This article was posted sometime back in early 2021 and may be outdated. Refer to SingSaver instead for updated information.

+
Disclaimer

This post is not sponsored, and does not constitute financial advice of any form (I bet you know better than me). Read at your own discretion.

+

Signing up on StashAway (a robo-advisor platform) back in the early 2020s was the first step in taking control of my financial health. Before that, 100% of my cash was just sitting in a POSB Savings account, growing at an incredibly pointless rate of 0.05% per annum. I might as well have kept the money under my mattress.

· 3 min read
Evan Tay

Established in 2013

+

I first bought my personal domain www.evantay.com way back in 2013. Younger me thought it would be cool and fun to run my own website, and it still is. 😎

+

To be honest, I can't even remember what my very first website looked like, but I am quite sure it was built using vanilla HTML and CSS, something unthinkable in this day and age.

+ + \ No newline at end of file diff --git a/blog/tags/software-architecture/index.html b/blog/tags/software-architecture/index.html new file mode 100644 index 00000000..7d9d1509 --- /dev/null +++ b/blog/tags/software-architecture/index.html @@ -0,0 +1,19 @@ + + + + + +One post tagged with "software-architecture" | Evan Tay + + + + + + + + + + +

One post tagged with "software-architecture"

View All Tags

· 3 min read
Evan Tay

Picking up this book was one of the best decisions I made for my fledgling software engineering career. Its insights enabled me to make well-reasoned software design decisions, and confidently communicate them, in spite of my relative professional inexperience. Given how helpful it has been, I’m here today to share more about the impression it has left on me, and convince you that it is a must-read if you are a software engineer.

+ + \ No newline at end of file diff --git a/blog/tags/software-engineering/index.html b/blog/tags/software-engineering/index.html new file mode 100644 index 00000000..d42f98c8 --- /dev/null +++ b/blog/tags/software-engineering/index.html @@ -0,0 +1,19 @@ + + + + + +One post tagged with "software-engineering" | Evan Tay + + + + + + + + + + +

One post tagged with "software-engineering"

View All Tags

· 3 min read
Evan Tay

Picking up this book was one of the best decisions I made for my fledgling software engineering career. Its insights enabled me to make well-reasoned software design decisions, and confidently communicate them, in spite of my relative professional inexperience. Given how helpful it has been, I’m here today to share more about the impression it has left on me, and convince you that it is a must-read if you are a software engineer.

+ + \ No newline at end of file diff --git a/blog/why-you-should-read-ddia/index.html b/blog/why-you-should-read-ddia/index.html new file mode 100644 index 00000000..845b7466 --- /dev/null +++ b/blog/why-you-should-read-ddia/index.html @@ -0,0 +1,29 @@ + + + + + +Why every Software Engineer should read Designing Data-Intensive Applications | Evan Tay + + + + + + + + + + +

Why every Software Engineer should read Designing Data-Intensive Applications

· 3 min read
Evan Tay

Picking up this book was one of the best decisions I made for my fledgling software engineering career. Its insights enabled me to make well-reasoned software design decisions, and confidently communicate them, in spite of my relative professional inexperience. Given how helpful it has been, I’m here today to share more about the impression it has left on me, and convince you that it is a must-read if you are a software engineer.

+

Designing Data-Intensive Applications

+

I kickstarted my engineering career back in January 2021, as a full stack engineer at Padlet. During the onboarding process, my (amazing) mentor, Brian, imparted a great deal of guidance to me. One of his tips was that I should take a look at Kleppman’s Designing Data-Intensive Applications. Thankfully, we had two copies of the book in the office, purchased by my (also amazing) boss, Shu Yang, who recommended me to read it too. I’m thankful I ended up taking their advice, because I was able to glean so much insights from Kleppman, which happened to be highly applicable to the infrastructure and full stack projects I was developing.

+
+

"This book should be required reading for software engineers." - Kevin Scott, Chief Technology Officer at Microsoft

+
+

Like Brian, Shu Yang and Kevin, I now also believe all software engineers working on a distributed, cloud or data-intensive system will greatly benefit from reading the book. It provides the fundamental framework for thinking about these systems, and also the vocabulary to communicate such thoughts. Coupled together, these insights will empower you to make better design decisions and effectively convey them, even if you lack prior experience in the problem domain.

+

Kleppman also compared the key fundamental ideas behind the broad range of popular data systems out there today, by discussing their advantages, limitations and trade-offs, rather than diving deep into the intricacies of each tool. This was ideal given that the book's objective was to help us choose the right tool for the right occasion, which these characteristics will be more relevant for.

+

If you lack the time (or will) to pour over the entire book, you should at least check out the opening chapter. In it, Kleppman gives a comprehensive yet succinct overview of what I mentioned above, and provides a clear, detailed explanation of the three key principles in designing data-intensive system architecture: Reliability, Scalability and Maintainability. Just reading this first chapter alone was beneficial to me, as I was now able to better understand and discuss architectural concerns with my team.

+

If you're still not convinced whether to invest your time into this book, you can check out a summary I've written for the first chapter, where I’ve condensed Kleppman’s opening discourse on Reliability, Scalability and Maintainability. I’m certain it’ll provide a glimpse into the many lessons that Designing Data-Intensive Applications has to share, and if you do read the book, definitely let me know what you think!

+

Special thanks to Vanessa Tay for editing this!

+ + \ No newline at end of file diff --git a/docs/c-cheatsheet/index.html b/docs/c-cheatsheet/index.html new file mode 100644 index 00000000..1d616617 --- /dev/null +++ b/docs/c-cheatsheet/index.html @@ -0,0 +1,40 @@ + + + + + +C Cheatsheet | Evan Tay + + + + + + + + + + +

C Cheatsheet

Published on December 23, 2020

+

This document was migrated from DigiDocs

+ +

The example program below prints out all command line arguments passed into the main() function.

+

print-arguments.c

+
#include <stdio.h>

int main(int argc, char **argv) {
for (int i = 0; i < argc; i++) {
printf("%s\n", argv[i]);
}
}
+

Key details:

+
    +
  • argc - the number of arguments passed into the program
  • +
  • argv - the array of character pointers (strings) containing all arguments
  • +
  • argv[0] - the first argument which is also the name of the program
  • +
+

To use:

+
    +
  • Enter the above code into a file (e.g. print-arguments.c).
  • +
  • Compile the code with gcc print-arguments.c -o print-arguments.
  • +
  • Run the executable with ./print-arguments test or ./print-arguments $USER.
  • +
+

Resources

+
+ + \ No newline at end of file diff --git a/docs/docker-cheatsheet/index.html b/docs/docker-cheatsheet/index.html new file mode 100644 index 00000000..66a36b41 --- /dev/null +++ b/docs/docker-cheatsheet/index.html @@ -0,0 +1,60 @@ + + + + + +Docker Cheatsheet | Evan Tay + + + + + + + + + + +

Docker Cheatsheet

Published on December 24, 2020

+

This document was migrated from DigiDocs

+

In this section you will find my notes on using Docker for the deployment of Git projects.

+

Useful Docker commands

+
tip

You do not have to write out the CONTAINER_ID in full. The partial CONTAINER_ID specified need only uniquely identify the container. Given a container 'aa151b912448' and 'aa153cd14238', docker logs aa15 will not work, but docker logs aa151 will.

+

Starting an interactive shell

+
docker exec -it [CONTAINER_ID] bash
+

Stopping and removing containers

+
docker stop $(docker ps -q)
docker rm $(docker ps -aq)
+

docker ps options:

+
    +
  • -q: Only display numeric IDs
  • +
  • -a: Show all containers (default shows just running)
  • +
+

Inspecting container metadata

+
docker inspect [CONTAINER_ID]
+

Viewing container logs

+

Typical command:

+
docker logs [CONTAINER_ID]
+

Follow log output for a specified duration:

+
docker logs -f --until=[TIME]
+

TIME can be a TIMESTAMP or relative (e.g. '10m' or '5s')

+

Docker and Github

+

Deploy script

+

This script assumes that the working directory contains a .git directory, Dockerfile and package.json. A .gitignore and a .dockerignore file may be useful too. It is also assumed that the project dependencies have been installed using npm install.

+

deploy.sh

+
IMAGE_NAME=""
VERSION="" # Can be left blank
CONTAINER_NAME=""
CONTAINER_PORT="" # To be mapped to HOST_PORT
HOST_PORT="" # The port clients will access

docker stop $CONTAINER_NAME # Stop the running container
docker system prune -af # Removes the container and all unused images
git pull origin master # Pulls latest source files and image
docker build -t $IMAGE_NAME .
docker run --name $CONTAINER_NAME -p $CONTAINER_PORT:$HOST_PORT -d $IMAGE_NAME:$VERSION
+

Before the script can be used, replace the following placeholders:

+
    +
  • IMAGE_NAME : The name of your image.
  • +
  • VERSION : The version of your image. Can be left blank.
  • +
  • CONTAINER_NAME : The desired name of your container.
  • +
  • CONTAINER_PORT : The port of your container which your application is running on.
  • +
  • HOST_PORT : The host port your container port will be mapped to. This is the port that is exposed on the host system.
  • +
+

Resources

+
+ + \ No newline at end of file diff --git a/docs/gcp-gke-cheatsheet/index.html b/docs/gcp-gke-cheatsheet/index.html new file mode 100644 index 00000000..ed306e67 --- /dev/null +++ b/docs/gcp-gke-cheatsheet/index.html @@ -0,0 +1,106 @@ + + + + + +GKE Cheatsheet | Evan Tay + + + + + + + + + + +

GKE Cheatsheet

Published on December 24, 2020

+

This document was migrated from DigiDocs

+

In this section, you will find my notes on using Kubernetes on Google Cloud Platform's Kubernetes Engine (GKE). It covers a typical workflow for starting a Kubernetes cluster and deploying an application on it.

+

Clusters

+

Creating a cluster

+

Typical command:

+
gcloud container clusters create $C_NAME --zone $ZONE --num-nodes $NUM
+

Shorter command:

+
gcloud container clusters create $C_NAME
+

With auto-scaling

+
gcloud container clusters create $C_NAME --enable-autoscaling --min-nodes $MIN --max-nodes $MAX
+
note

The default value for --num-nodes is 3

+
tip

You can set the default zone for Kubernetes Engine using the following:

    +
  • For zonal clusters: gcloud config set compute/zone $ZONE
  • +
  • For regional clusters: gcloud config set compute/region $REGION
  • +
+

Deleting a cluster

+

Typical command

+
gcloud container clusters delete $C_NAME
+

Getting cluster info

+

Get all pods running in the cluster

+
kubectl get pods
+

Get all services running in the cluster

+
kubectl get services
+

Get credentials for cluster

+
gcloud container clusters get-credentials $C_NAME
+
Cite

This command enables switching to a specific cluster, when working with multiple clusters. It can also be used to access a previously created cluster from a new workstation.

+

Deployments

+

Creating a deployment

+

To create a deployment, you need to have your Docker image prepared beforehand. This image must be built and uploaded to the Container Registry before you can deploy it on your GKE cluster.

+
tip

Before you proceed, you need to configure Docker to authenticate to the Container Registry: gcloud auth configure-docker

+
    +
  1. Build your image:
    +docker build -t gcr.io/$PROJECT_ID/$NAME:$VER .
  2. +
  3. Verify it was built:
    +docker images
  4. +
  5. Upload your image to the registry:
    +docker push gcr.io/$PROJECT_ID/$NAME:$VER
  6. +
  7. Verify it was uploaded:
    +docker run --rm -p $CONT_PORT:$HOST_PORT gcr.io/$PROJECT_ID/$NAME:$VER
  8. +
  9. Create your deployment:
    +kubectl create deployment $D_NAME --image=gcr.io/$PROJECT_ID/$NAME:$VER
  10. +
  11. Verify it was deployed:
    +kubectl get pods
  12. +
  13. Expose the deployment to the Internet via a Service resource:
    +kubectl expose deployment $D_NAME --type=LoadBalancer --port $EXPOSED_PORT --target-port $HOST_PORT
  14. +
  15. Verify the service is running:
    +kubectl get service
  16. +
+

Deleting a deployment

+
    +
  1. Delete the Service resource:
    +kubectl delete service $D_NAME
  2. +
  3. Delete the cluster:
    +gcloud container clusters delete $C_NAME
  4. +
+

Updating your deployment

+

To update your deployment with a new Docker image, you have to upload it to the Cloud Registry. Next, you can apply a rolling update of your deployment's Docker image.

+
    +
  1. Build your new image (remember to update $VER):
    +docker build -t gcr.io/$PROJECT_ID/$I_NAME:$VER .
  2. +
  3. Verify it was built:
    +docker images
  4. +
  5. Upload your image to the registry:
    +docker push gcr.io/$PROJECT_ID/$I_NAME:$VER
  6. +
  7. Verify it was uploaded:
    +docker run --rm -p $CONT_PORT:$HOST_PORT gcr.io/$PROJECT_ID/$I_NAME:$VER
  8. +
  9. Apply a rolling image update:
    +kubectl set image deployment/$D_NAME $I_NAME=gcr.io/$PROJECT_ID/$I_NAME:$VER
  10. +
+

Scaling a deployment

+

Typical example

+
kubectl scale deployment $D_NAME --replicas $NUM
+

With auto-scaling

+
kubectl autoscale deployment $D_NAME --max $MAX --min $MIN --cpu-percent $PERCENT
+

Getting deployment info

+

Typical example

+
kubectl get deployment $D_NAME
+

Resources

+
+ + \ No newline at end of file diff --git a/docs/git-cheatsheet/index.html b/docs/git-cheatsheet/index.html new file mode 100644 index 00000000..1bdd507f --- /dev/null +++ b/docs/git-cheatsheet/index.html @@ -0,0 +1,77 @@ + + + + + +Git Cheatsheet | Evan Tay + + + + + + + + + + +

Git Cheatsheet

Published on December 24, 2020

+

This document was migrated from DigiDocs

+
tip

Basic knowledge of Git is assumed in this tutorial. If you are new to Git, visit http://rogerdudler.github.io/git-guide/ to learn the basics first.

+

Get branch information

+

I want to find out what branches I have locally:

+
git branch
+

I want to find out what is the upstream branch for a given branch:

+
git branch -v
+

Even more verbose information:

+
git branch -vv
+

Delete local and remote branches

+

Example scenario:
+I have merged my development branch feat/new-feature into develop and wish to delete the local and remote branch of feat/new-feature now.

+

The solution:

+
    +
  • Delete the local branch: +
      +
    • git branch -d feat/new-feature
    • +
    • or with --force: git branch -D feat/new-feature
    • +
    +
  • +
  • Delete the remote branch: git push <remote> -d <branch>
  • +
+

The general command format it is based on:

+
    +
  • Delete a local branch: +
      +
    • git branch -d|--delete <branch>
    • +
    • or with --force: git branch -D <branch>
    • +
    +
  • +
  • Delete a remote branch: git push <remote> -d|--delete <branch>
  • +
+

Reset a branch

+

Example scenario:
+I messed up my local master branch. I want to reset it such that it will revert to being the same as origin/master.

+

The one-line solution:
+git checkout -B master origin/master

+

The general command format it is based on:
+git checkout -b|-B <new_branch> [<start point>]

+

How does it work?

+

git checkout -b|-B <new_branch> is typically used to create and switch to a new branch. However, if <new_branch> already exists, it will be reset instead.

+
Cite

If -B is given, <new_branch> is created if it doesn’t exist; otherwise, it is reset.

+

Ignore a file's changes temporarily

+

Example scenario:
+I want to stop tracking changes for a given file temporarily, as I am still editing it and do not want an incomplete copy of it to be added to staging when I do git add * (to add all changes in the current path).

+

The solution:

+

To temporarily ignore (stop tracking) a file:

+
git update-index --assume-unchanged <file>
+

To start tracking a file again:

+
git update-index --no-assume-unchanged <file>
+

See Git Ignore file for more information.

+

Resources

+
+ + \ No newline at end of file diff --git a/docs/git-ignore-file/index.html b/docs/git-ignore-file/index.html new file mode 100644 index 00000000..cae66e59 --- /dev/null +++ b/docs/git-ignore-file/index.html @@ -0,0 +1,63 @@ + + + + + +Git Ignore file | Evan Tay + + + + + + + + + + +

Git Ignore file

Published on December 24, 2020

+

This document was migrated from DigiDocs

+

This section covers how to tell Git to ignore certain files and directories by using .gitignore files or the git update-index commands.

+
tip

Basic knowledge of Git is assumed in this tutorial. If you are new to Git, visit http://rogerdudler.github.io/git-guide/ to learn the basics first.

+

If you want a certain file or directory to be ignored for the long-term, you should choose to do so using .gitignore files. Otherwise, if you only want Git to ignore a certain file temporarily, before committing it at a later time, you should do so using the git update-index commands.

+

Using .gitignore files

+

Git uses .gitignore files to decide which files and directories to ignore before you commit. Files and directories specified in .gitignore will not be tracked nor staged when git add * or git commit -a commands are used.

+

To ignore a file or directory using .gitignore:

+
    +
  1. Create a .gitignore file in the desired location (e.g. the project's root directory). +
      +
    • The .gitignore file affects all files and sub-directories in its directory. +
        +
      • It recursively affects all files and directories in its sub-directories.
      • +
      • Sub-directories with their own .gitignore file use their own .gitignore instead.
      • +
      +
    • +
    +
  2. +
  3. Open the file and enter the filename or directory to be ignored (e.g. secret.txt). See example below.
  4. +
  5. Save the file and commit it. +
      +
    • Commit it to share the ignore rules with other users using the same repository and also to version-control it.
    • +
    +
  6. +
+

Example .gitignore file:

+
# Ignore specific file
plaintext_password.txt

# Ignore specific file type using wildcards
*.html

# Ignore specific directory
site/
+
caution

If a file is already being tracked, adding it to .gitignore will not stop Git from tracking it. You will need to remove the file from the Git cache using the git rm --cached <file> command. After doing this, the file will no longer be tracked provided it is specified in .gitignore.

+

Using 'git update-index'

+

If you want Git to temporarily ignore a file which you will commit at a later time, you can do so easily by using the git update-index commands to tell Git to stop and start tracking the file.

+

To temporarily ignore (stop tracking) a file:

+
git update-index --assume-unchanged <file>
+

To start tracking a file again:

+
git update-index --no-assume-unchanged <file>
+
tip

Read the man page to find out more about git update-index rules.

+

Resources

+
+ + \ No newline at end of file diff --git a/docs/ikigai/index.html b/docs/ikigai/index.html new file mode 100644 index 00000000..9b858f5c --- /dev/null +++ b/docs/ikigai/index.html @@ -0,0 +1,112 @@ + + + + + +Ikigai | Evan Tay + + + + + + + + + + +

Ikigai

Published on May 16, 2021

+

Personal thoughts for Ikigai: The Japanese Secret to a Long and Happy Life

+

Review

+

Ikigai

+

I found the book's cover illustration captivating. Sadly, I can't say I felt the same for the rest of the book. While the authors did introduce numerous interesting concepts, they did not explore the concepts in a depth which was meaningful. Instead, they jumped far too quickly from one concept to another, covering each concept superficially. As such, the book felt like a list of fun facts. It was a pity given how many concepts introduced could have been starters for insightful discourse.

+

That being said, I still penned a personal reflection on the book. That's because parts of it were still thought provoking for me. In this document, you'll find some of these thoughts. They are the ones I am comfortable sharing. They are also my biggest takeaways from the book.

+

Reason for being

+
    +
  • In Okinawa, a blue zone, there is no word for retirement.
  • +
+
+

"Blue Zones are regions of the world where a higher than usual number of people live much longer than average." - Wikipedia

+
+
    +
  • Instead, they have Ikigai which loosely translates to the reason for which you wake up in the morning.
  • +
  • Ikigai is at the intersection of what you love, what the world needs, what you can be paid for, and what you are good at.
  • +
  • I am grateful I found my Ikigai - writing software for computers, early in my life, back when I was 14.
  • +
  • I am also thankful I get to develop my other passion - which is to write for humans, on this website.
  • +
  • Having an Ikigai, a reason for being, a why for living, is parmount in living a meaningful life:
  • +
+
+

"He who has a why to live for can bear with almost any how." - Friedrich Nietzsche, a German philosopher who has a profound influence on modern intellectual history

+
+
    +
  • If we ever feel overwhelmed, chances are we might have lost sight of our why.
  • +
+
+

"Why do you not commit suicide?" - Viktor Frankl, an Austrian neurologist, psychiatrist, philosopher, author, and Holocaust survivor who founded logotherapy

+
+
    +
  • It is also important to always be conscious about why we choose to live day after day.
  • +
  • Reading this reminded me of the following quote:
  • +
+
+

"Memento Mori" - Latin for "remember you must die"

+
+
    +
  • Knowing that we must die one day, why do we still do what we do?
  • +
+

Living in the present

+
    +
  • We should enjoy the present, and not lose ourselves in worries about the past or the future.
  • +
+
+

“Yesterday is history, tomorrow is a mystery, and today is a gift… that’s why they call it the present.” – Master Oogway from Kungfu Panda

+

"The only moment in which you can be truly alive is the present moment." - Thich Nhat Hanh, a Buddhist monk

+

"一期一会/Ichi-go ichi-e" - Japanese for "one time, one meeting" or "this moment exists only now and won't come again"

+
+
    +
  • We should embrace our feelings: we don't create them; they simply come to us; and we have to accept them.
  • +
+
+

"Hello, solitude. How are you today? Come, sit with me, and I will care for you." - Thich Nhat Hanh.

+
+
    +
  • We must avoid attempting to eliminate negative feelings; instead, we should focus on the present moment, as recovery will come on its own eventually.
  • +
  • But we must be mindful to not let negative thoughts spiral out of control.
  • +
  • Reading that reminded me of Mark Manson's Feedback Loop from Hell.
  • +
+

Having the right attitude

+
    +
  • We should live like the locals in Ogimi, a village in Okinawa known as the Village of Longevity - they are always busy with meaningful tasks but did everything with a sense of calm, and never in a rush.
  • +
  • We all have to face difficult times in life, we don't get a say in that, but we can choose what attitude we have and what we do in those moments.
  • +
  • We also need to remember that this too shall pass, and sometimes all we have to do is persevere a little longer.
  • +
+
+

"This too shall pass." - A Persian adage which reflects on the temporary nature of all things human

+

"頑張る/Ganbaru." - Japanese for "to persevere" and "to stand firm"

+
+
    +
  • Resilience isn't just about the ability to persevere, but also to stay focused on the important things in life.
  • +
  • It is important not to get swept up with negative emotions and lose sight of what truly matters.
  • +
+

Discipline over motivation

+
    +
  • Shoma Morita, a psychotherapist who founded Morita therapy - a branch of clinical psychology strongly influenced by Zen Buddhism, believes that feelings will change as a result of your actions.
  • +
  • This is echoed in Mark Manson's How to Get Motivated and Take Action too:
  • +
+
+

"Action isn’t just the effect of motivation, but also the cause of it." - Mark Manson, an American self-help author and blogger

+
+
    +
  • It is important that we rely on discipline rather than motivation. We have control over the former, but never the latter.
  • +
+

Life is not a solvable problem

+
    +
  • The concluding paragraph of the book resonated deeply with me. It embodies what I want to live by moving forward:
  • +
+
+

"Life is not a problem to be solved. Just remember to have something that keeps you busy doing what you love while being surrounded by the people who love you."

+
+
    +
  • Being able to pursue my Ikigai while surrounded by cherished ones is really all I need in this life, besides the lowest tiers of Maslow's hierarchy of needs.
  • +
+ + \ No newline at end of file diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 00000000..10767295 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,36 @@ + + + + + +Contents | Evan Tay + + + + + + + + + + +

Contents

Published on January 23, 2021
+Updated on October 24, 2021

+

Reading List

+

Here, you will find my thoughts on articles, books, videos and other forms of media. I also maintain a Reading List of articles, books, videos, and more which I think are meaningful and insightful.

+

Article Summaries

+
TopicDate Last Updated
1Lessons Learnt from Scaling Memcached in ProductionApril 14, 2021
+

Book Summaries

+ +

Documentation

+

Here, you will find a collection of concise notes on full-stack software engineering and cloud operations. These notes are filed under their respective topic, with related topics are categorised under the same chapter.

+

Cloud and Networking

+
TopicDate Last Updated
1DockerDecember 24, 2020
2GCP GKEDecember 24, 2020
3MininetDecember 27, 2020
4Network ModelNovember 30, 2020
+

Programming

+
TopicDate Last Updated
1CDecember 23, 2020
2JavascriptAugust 1, 2021
3RubyOctober 23, 2021
+

Tooling and OS

+
TopicDate Last Updated
1GitDecember 23, 2020
2iTerm2January 23, 2021
3UbuntuDecember 23, 2020
+

Web Development

+
TopicDate Last Updated
1MongoDBDecember 23, 2020
2NodeJSDecember 23, 2020
+ + \ No newline at end of file diff --git a/docs/iterm2-cheatsheet/index.html b/docs/iterm2-cheatsheet/index.html new file mode 100644 index 00000000..e8c968be --- /dev/null +++ b/docs/iterm2-cheatsheet/index.html @@ -0,0 +1,31 @@ + + + + + +iTerm2 Cheatsheet | Evan Tay + + + + + + + + + + +

iTerm2 Cheatsheet

Published on January 16, 2021
+Updated on January 23, 2021

+

In this section you will find my notes on iTerm2, an awesome terminal emulator for MacOS.

+

Windows and Tabs

+
FunctionShortcut
Create Tab + T
Go to Tab + Number Key
Divide Window Vertically in Same Profile + D
Divide Window Horizontally in Same Profile + Shift + D
Navigate through Split Windows based on Direction + Option + Arrow Key
Navigate through Split Windows based on Order of Use + [ / ]
Maximise/Minimise Window in Fullscreen+ Enter
Clear Window+ K
Close Tab or Window + W
+

Search Command History

+
FunctionShortcut
Search with AutofillCtrl + R
End SearchCtrl + Y
Cancel Search and Restore Original LineCtrl + G
+

Resources

+
+ + \ No newline at end of file diff --git a/docs/iterm2-zsh-setup/index.html b/docs/iterm2-zsh-setup/index.html new file mode 100644 index 00000000..3084df57 --- /dev/null +++ b/docs/iterm2-zsh-setup/index.html @@ -0,0 +1,91 @@ + + + + + +iTerm2 and zsh Setup | Evan Tay + + + + + + + + + + +

iTerm2 and zsh Setup

Published on January 16, 2021
+Updated on January 23, 2021

+

In this section you will find my notes on setting up iTerm2, an awesome terminal emulator for MacOS, and ohmyzsh, an amazing open-source framework for managing your zsh configuration.

+

Install

+
    +
  1. +

    Install iTerm2:

    +
    brew install --cask iterm2
    +
  2. +
  3. +

    Install zsh:

    +
    brew install zsh
    +
  4. +
  5. +

    Install ohmyzsh:

    +
    sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
    +
  6. +
  7. +

    Update ohmyzsh:

    +
    omz update
    +
  8. +
  9. +

    Exit Terminal and open iTerm2: + Space Bar > Search 'iTerm'

    +
  10. +
  11. +

    You are done setting up iTerm2 and ohmyzsh!

    +
  12. +
+

Change theme

+
tip

To configure ohmyzsh, you will almost always be doing so by opening ~/.zshrc.

+
    +
  1. +

    Open the ~/.zshrc configuration file:

    +
    open ~/.zshrc
    +
  2. +
  3. +

    Change your theme by updating ZSH_THEME="robbyrussell" accordingly.

    +
  4. +
  5. +

    Find a theme you like here and follow the install instructions in the theme repositories.

    +
  6. +
  7. +

    Run exec zsh to reload your new configuration:

    +
    exec zsh
    +
  8. +
+

You should see your new theme in action.

+

Add an alias

+

Aliases are useful shorcuts you set to reduce the time spent on typing commands you often use. For example, if you often type:

+
cd /Users/evantay/Documents/Git
+

or even worse:

+
cd /Users/
cd evantay
cd Documents/Git
+

You should add an alias for cd /Users/evantay/Documents/Git:

+
    +
  1. +

    Open the ~/.zshrc configuration file:

    +
    open ~/.zshrc
    +
  2. +
  3. +

    Add a new alias at the bottom of the file:

    +
    # Example aliases
    # alias zshconfig="mate ~/.zshrc"
    # alias ohmyzsh="mate ~/.oh-my-zsh"
    alias repo="/Users/evantay/Documents/Git"
    +
  4. +
  5. +

    Reload zsh:

    +
    exec zsh
    +
  6. +
+

You can now type repo whenever you want to cd /Users/evantay/Documents/Git.

+

Resources

+
+ + \ No newline at end of file diff --git a/docs/js-cheatsheet/index.html b/docs/js-cheatsheet/index.html new file mode 100644 index 00000000..3893fac5 --- /dev/null +++ b/docs/js-cheatsheet/index.html @@ -0,0 +1,29 @@ + + + + + +JS Cheatsheet | Evan Tay + + + + + + + + + + +

JS Cheatsheet

Published on August 1, 2021

+

Var, Let and Const

+

Javascript ES6 introduced two new keywords to define variables, let and const. Previously, the keyword var was the only way to do so. let and const were introduced because there were issues with var which made it error-prone and hard to debug.

+
varletconst
ScopeGlobal or FunctionBlock scope {}Block scope {}
Must be initialized when declaredNoNoYes
Can use before initializationYesNoNo
Can be redeclaredYesNoNo
Can be updatedYesYesNo
Hoisted to start of scopeYesYesYes
+

Avoid using var because it is either global or function scope, and a declaration and assignment of a var can easily be redeclared or updated unknowingly in another function. Furthermore, a var is initialized with undefined and can be used even before being assigned a value.

+

On the other hand, let and const are block scope, and cannot be redeclared. Additionally, const cannot be updated. Both let and const also cannot be used before initialization, and will throw Reference error rather than return undefined like var.

+
Quote

"Hoisting is a JavaScript mechanism where variables and function declarations are moved to the top of their scope before code execution." - Sarah Chima Atuonwu, Var, Let, and Const – What's the Difference?

+

Resources

+
+ + \ No newline at end of file diff --git a/docs/mdx/index.html b/docs/mdx/index.html new file mode 100644 index 00000000..aa5c53d8 --- /dev/null +++ b/docs/mdx/index.html @@ -0,0 +1,22 @@ + + + + + +Powered by MDX | Evan Tay + + + + + + + + + + +

Powered by MDX

You can write JSX and use React components within your Markdown thanks to MDX.

+ +

Docusaurus green and Facebook blue are my favorite colors.

+

I can write Markdown alongside my JSX!

+ + \ No newline at end of file diff --git a/docs/mininet-setup/index.html b/docs/mininet-setup/index.html new file mode 100644 index 00000000..b2497426 --- /dev/null +++ b/docs/mininet-setup/index.html @@ -0,0 +1,141 @@ + + + + + +Mininet Setup | Evan Tay + + + + + + + + + + +

Mininet Setup

Published on December 21, 2020
+Updated on December 27, 2020

+

This document was migrated from DigiDocs

+

Mininet diagram

+

In this section you will find my notes on:

+
    +
  1. Setting up and running Mininet VM on a virtualization program.
  2. +
  3. Setting up and running NOX/POX controller on your local machine.
  4. +
  5. Connecting your POX controller to your Mininet application (and troubleshooting).
  6. +
+
note

I wrote this setup guide using MacOS, POX using Python3, and VMware Fusion. However, the setup flow and troubleshooting should be similar for Linux/Window and other virtualization programs.

+

Set up Mininet VM

+
    +
  1. Download, setup and launch the latest Mininet VM here. +
      +
    • For virtualization program, try VirtualBox first given that it is free and open-source.
    • +
    • If you do use VirtualBox, remember to add a Host-only network adapter to your VM under
      +Select VM > Settings > Network
    • +
    • If you are on MacOS, and the Mininet VM aborts when you launch it (as it does for me), you may have to consider using VMware Fusion instead.
    • +
    • If you do use VMware Fusion, change your network adapter:
      +Virtual Machine > Network Adapter > Bridged (Autodetect)
    • +
    +
  2. +
  3. Log into the VM using mininet as both username and password.
  4. +
+

Before setting up the NOX/POX on your local machine, it would be best to familiarise and verify that your Mininet setup is working fine. Try out a few of the commands in #mininet-cheat-sheet such as pingall.

+

Set up POX

+

You will be setting up the NOX/POX controller on your local machine, and linking it up with the Mininet application in your VM.

+

Verify that your POX installation is working:

+
git clone https://github.com/noxrepo/pox
cd pox
./pox.py log.level --DEBUG
+
    +
  1. Verify that you see:
    +INFO:core:POX 0.7.0 (gar) is up.
  2. +
  3. You can terminate POX after step 1.
  4. +
  5. If it does not work, it is likely because you do not have Python3 installed. You can git checkout master to change to the Python2 version for POX. See this for more information.
  6. +
+

Connecting POX to Mininet VM

+

Next, we will set up a Mininet network (on your Mininet VM) with the remote controller set to the POX controller (on your local machine). To do so, you will need to open two terminals, one on your local machine where POX is at, and another terminal in your Mininet VM.

+

Verify POX is reachable by VM

+

On your local machine, at the pox/ directory:

+
./pox.py log.level --DEBUG forwarding.l2_learning
+
    +
  1. Verify that you see something similar to:
    +DEBUG:openflow.of_01:Listening on 0.0.0.0:6633
  2. +
+

On your Mininet VM, check if your VM can reach the POX controller at the port it is listening on:

+
nc -zvw10 0.0.0.0 6633
+
    +
  1. Replace the IP address and port with what you see after Listening on in the previous step.
  2. +
  3. Verify that you see something similar to:
    +Connection to 127.0.0.1 port 6633 [tcp/*] succeeded!
  4. +
  5. If you see something like:
    +nc: connectx to 127.0.0.1 port 6633 (tcp) failed: Connection refused,
    +it is probably because your VM cannot access your host machine. See #troubleshoot-connectivity.
  6. +
+

Verify Mininet uses remote POX

+

Next, start Mininet with the controller set to your POX controller on your local machine:

+
sudo mn --controller=remote,ip=0.0.0.0,port=6633
+
    +
  1. Replace the IP address and port accordingly.
  2. +
+

Lastly, check if your POX remote controller is connected:

+
h1 ping h2
+
    +
  1. Verify that h1 is able to ping h2. If not, your remote controller is not connected.
  2. +
  3. You should also see output in the POX window similar to:
    +DEBUG:forwarding.l2_learning:installing flow for 52:1e:48:64:23:43.2 -> 02:07:aa:33:88:e5.1
  4. +
+

If you are able to make it to this point, your setup for Mininet VM and remote POX is completed. See #resources for more information on what you can do next with Mininet!

+

Mininet Cheat-sheet

+

Enter Mininet

+
sudo mn
+

Display

+

Display all Mininet commands:

+
help
+

Display all nodes:

+
nodes
+

Display all links:

+
net
+

Display information on everything:

+
dump
+

Test connectivity

+

This command tests the connectivity between all hosts:

+
pingall
+

Exit Mininet

+
exit
sudo mn –c
+
    +
  1. sudo mn -c is used to clean up Mininet.
  2. +
+

Troubleshoot connectivity

+

If you are unable to connect to the POX controller from your VM, it could be one of the following problems:

+
    +
  1. Firewall rules are blocking it.
  2. +
  3. Incorrect IP address or port.
  4. +
+

If you are certain you are specifiying the correct IP address and port, and that your firewall is off or allowing traffic in for the port POX is listening on, attempt the fix in #vm-host-connectivity.

+

VM-Host connectivity

+

The instructions here are for VMware Fusion and MacOS, but you can use it as a guide for solving connectivity issues between Windows/Linux and VirtualBox/other virtualization programs too. See this for more information.

+

On your local machine:

+
    +
  1. Turn off your Mininet VM:
    +Virtual Machine > Shutdown (for VMware Fusion)
  2. +
  3. Change your network adapter to Bridged (Autodetect) if you have not done so yet:
    +Virtual Machine > Network Adapter > Bridged (Autodetect)
  4. +
  5. Turn on your Mininet VM.
  6. +
  7. Find out your local machine's IP address:
    +System Preferences > Network > Wi-Fi
  8. +
  9. Look out for something similar to:
    +Wi-Fi is connected to YourWifi and has the IP address 192.168.0.152
  10. +
+

On your Mininet VM:

+

Use your local machine's IP address for the nc command:

+
nc -zvw10 192.168.0.152 6633
+

If this works, use this address instead of 127.0.0.1 or 0.0.0.0 whenever you are specifying the remote controller's IP address for Mininet.

+
sudo mn --controller=remote,ip=192.168.0.152,port=6633
+

Resources

+
+ + \ No newline at end of file diff --git a/docs/mongodb-cheatsheet/index.html b/docs/mongodb-cheatsheet/index.html new file mode 100644 index 00000000..4c08afe1 --- /dev/null +++ b/docs/mongodb-cheatsheet/index.html @@ -0,0 +1,31 @@ + + + + + +MongoDB Cheatsheet | Evan Tay + + + + + + + + + + +

MongoDB Cheatsheet

Published on December 23, 2020

+

This document was migrated from DigiDocs

+

The purpose of this page is to summarise key mongodb commands you will often use.

+ +
# Select the database
show dbs
use <db-name>

# Show all collections in the database
show collections

# Print out all documents in the database
db.<collection-name>.find()

# Print out in an easy-to-read but less compact format
db.<collection-name>.find().pretty()
+

Delete documents

+
show dbs
use <db-name>

# Show all collections in the database
show collections

# Remove all documents in the collection
db.<collection-name>.remove( { } )

# See reference for more information
+

Resources

+
+ + \ No newline at end of file diff --git a/docs/mongodb-setup/index.html b/docs/mongodb-setup/index.html new file mode 100644 index 00000000..7723f203 --- /dev/null +++ b/docs/mongodb-setup/index.html @@ -0,0 +1,61 @@ + + + + + +MongoDB Setup | Evan Tay + + + + + + + + + + +

MongoDB Setup

Published on December 23, 2020

+

This document was migrated from DigiDocs

+

The purpose of this guide is to quickly set up a local copy of MongoDB on Windows for local development purposes. Authentication will not be enabled or covered in this tutorial.

+

Installation and config

+
    +
  1. Install MongoDB Community Edition, the standard configuration is fine.
  2. +
  3. Take note of where your installation's bin folder is at, it should be at C:\Program Files\MongoDB\Server\4.2\bin by default.
  4. +
  5. Add it to your environment variables. See guide here.
  6. +
  7. Open your terminal - if you already have it opened, exit and re-open it to reload the enviroment variables.
  8. +
  9. Enter mongo to access MongoDB.
  10. +
+

Create a new collection

+
    +
  1. Next, create a new collection, use the use command:
  2. +
+
# To display the database you are using
db

# To switch databases use `use <database>`
# To create a new database, switch to a non-existing database
use dev

# Template
use <database>
+
tip

Read https://docs.mongodb.com/manual/mongo/ for more information.

+

Create a new user

+
    +
  1. Next, create a user with readWrite and dbAdmin roles, using the db.createUser() command:
  2. +
+
# Switch to the database you want to add the user to
use dev

# Create the user with `readWrite` and `dbAdmin` rights
db.createUser(
{
user: "devadmin",
pwd: passwordPrompt(),
roles: [ "readWrite", "dbAdmin" ]
}
)

# Template
db.createUser(
{
user: <username>,
pwd: <password>,
roles: [ "readWrite", "dbAdmin" ]
}
)
+
tip

Read https://docs.mongodb.com/manual/mongo/ for more information.

+

connection-string format

+

The connection-string is used to access the MongoDB instance from your applications (i.e. MongooseJS). The format of your connection-string is as follows:

+
mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[database][?options]]
# Parts in [ and ] are optional

# Example, without authentication
mongodb://localhost:27017/dev

# Example, with authentication
mongodb://devadmin:<password>@localhost:27017/dev
# Replace the <password> with your actual password
+
caution

If the username or password includes the at sign @, colon :, slash /, or the percent sign % character, use percent encoding. See https://docs.mongodb.com/manual/reference/connection-string/#examples for more information.

+

Authentication

+

Given that we are not enabling authentication, you can use either of the above connection-string URI formats.

+ +

Verify connection-string

+

To verify your connection-string, simply use mongo <mongoURI>:

+
# Example, without authentication
mongo mongodb://localhost:27017/dev

# Example, with authentication
mongo mongodb://devadmin:<password>@localhost:27017/dev
+

Resources

+
+ + \ No newline at end of file diff --git a/docs/network-model/index.html b/docs/network-model/index.html new file mode 100644 index 00000000..3c35a4d4 --- /dev/null +++ b/docs/network-model/index.html @@ -0,0 +1,141 @@ + + + + + +Network Model (CS4226) | Evan Tay + + + + + + + + + + +

Network Model (CS4226)

Published on November 30, 2020

+

In this document, you will find my summary for the Network Performance Model and Queueing Model content covered under CS4226: Internet Architecture course taught by Dr. Richard Ma. I compiled this document with the help of notes written by my good friend Matthew over here.

+

Performance metrics

+
MetricDefinition
Link Rate / BandwidthTheoretical maximum capacity; indirectly related to speed
Throughput / Effective bandwidthActual data transfer rate between source and destination; directly related to speed; with end-to-end delay factored in
+

End-to-end delay

+

For a given packet being sent over a link, end-to-end delay is made up of:

+
    +
  • Transmission delay: dependent on packet size L (bits)L\ (bits) and link rate R (bits/s)R\ (bits/s): dT=LRd_{T} = \frac{L}{R}
  • +
  • Propagation delay: dependent on distance and propagation speed
  • +
  • Processing delay: dependent on LL
  • +
  • Queueing delay: dependent on queue size and dTd_{T}
  • +
+

Queueing delay

+

Little's Law

+

The long-term average number LL of customers in a stationary system is equal to the long-term average effective arrival rate λ\lambda multiplied by the average time WW that a customer spends in the system.

+

In the context of Internet Architecture:

+

L=λWL = \lambda W

+
    +
  • LL: Average number of packets in the system +
      +
    • L=limt1t0tL(s)dsL = \lim_{t \to \infty} \frac{1}{t} \int^{t}_{0} L(s) ds
    • +
    +
  • +
  • λ\lambda: Average packet arrival rate for the system +
      +
    • λ=limtN(t)t\lambda = \lim_{t \to \infty} \frac{N(t)}{t} where N(t)N(t) is the number of packets which arrived up to time tt
    • +
    +
  • +
  • WW: Average sojourn time +
      +
    • W=limn1ni=1nWiW = \lim_{n \to \infty} \frac{1}{n} \sum^{n}_{i = 1} W_{i} where n is the number of packets and WiW_{i} is the waiting/sojourn time for the iith packet
    • +
    +
  • +
+

Modelling arrival time

+

Given:

+
    +
  • tit_{i}: Arrival time of iith packet
  • +
  • TiT_{i}: Inter-arrival time where Titi+1tiT_{i} \triangleq t_{i + 1} - t_{i}
  • +
+

Model TiT_{i}s using independent and identically distributed (i.i.d.) random variable TT which is exponentially distributed, with λ0\lambda \geq 0 condition. Exponential distribution was chosen because of its memoryless property.

+

Properties:

+
    +
  • P(T>t)=eλtP(T > t) = e^{-\lambda t}
  • +
  • P(Tt)=1eλtP(T \leq t) = 1-e^{-\lambda t}
  • +
  • E[T]=1λE[T] = \frac{1}{\lambda}
  • +
  • Memoryless property: P{T>s+t  T>s}=P{T>t}P\{T > s + t\ |\ T > s \} = P\{T > t\}
  • +
+

Merging Poisson processes

+

TiT_{i}s are i.i.d. random variables distributed as TT with rate λ\lambda. This arrival pattern is called a Poisson process, in which starting time does not matter (memoryless property). Therefore, two Poisson proccesses can be merged to create a new Poisson process:

+
    +
  • λ=λ1+λ2\lambda = \lambda_{1} + \lambda_{2}
  • +
  • T=min{T1,T2}T = min\{T_{1}, T_{2}\}
  • +
  • P(T>t)=P(T1>tT2>t)=eλ1teλ2t=e(λ1+λ2)tP(T > t) = P(T_{1} > t \wedge T_{2} > t) = e^{-\lambda_{1} t} e^{-\lambda_{2} t} = e^{-(\lambda_{1} + \lambda_{2}) t}
  • +
  • E[T]=1λ1+λ2E[T] = \frac{1}{\lambda_1 + \lambda_2}
  • +
+

M/M/1 queueing model

+
    +
  • Single server with a queue of infinite length
  • +
  • Exponential i.i.d. service time with rate μ\mu
  • +
+

Definitions

+
    +
  • Utilization: ρ=λμ\rho = \frac{\lambda}{\mu} +
      +
    • Percentage of time whereby the server is busy (1 item in server) +
        +
      • Alternatively, mean number of packets in the server
      • +
      +
    • +
    • Derived from E[L]=λE[Ws]E[L] = \lambda E[W_{s}] where average service time = E[Ws]=1μE[W_{s}] = \frac{1}{\mu}
    • +
    • For server to be stable, ρ=λμ<1λ<μ\rho = \frac{\lambda}{\mu} < 1 \Rightarrow \lambda < \mu
    • +
    +
  • +
  • πi\pi_{i}: Percentage of time or probability that there are exactly ii packets in the system +
      +
    • πi=P{L=i}=ρi(1ρ)\pi_{i} = P\{L = i\} = \rho^{i}(1 - \rho)
    • +
    • Follows a Geometric distribution
    • +
    +
  • +
+

M/M/1 Formulas

+
    +
  • E[L]=E[packets in queue + server]=ρ1ρ=λμλE[L] = E[\text{packets in queue + server}] = \frac{\rho}{1 - \rho} = \frac{\lambda}{\mu - \lambda}
  • +
  • E[packets in queue]=E[L]ρ=ρ21ρE[\text{packets in queue}] = E[L] - \rho = \frac{\rho^{2}}{1-\rho}
  • +
  • E[W]=1μλE[W] = \frac{1}{\mu - \lambda} +
      +
    • Derived from L=λW1=(μλ)×E[W]E[W]=1μλL = \lambda W \Rightarrow 1 = (\mu - \lambda) \times E[W] \Rightarrow E[W] = \frac{1}{\mu - \lambda}
    • +
    +
  • +
  • μ=λ+1E[W]\mu = \lambda + \frac{1}{E[W]}
  • +
  • λ=μ1E[W]\lambda = \mu - \frac{1}{E[W]}
  • +
  • E[Wq]=E[W]E[Ws]=1μλ1μE[W_q] = E[W] - E[W_{s}] = \frac{1}{\mu - \lambda} - \frac{1}{\mu} +
      +
    • Derived from E[W]=E[Wq]+E[Ws]E[Wq]=E[W]E[Ws]E[W] = E[W_{q}] + E[W_{s}] \Rightarrow E[W_{q}] = E[W] - E[W_{s}]
    • +
    +
  • +
+

Burke's Theorem

+

Burke's theorem asserts that for a M/M/1 queue in the steady state with arrivals, a Poisson process with rate parameter λ\lambda:

    +
  1. The departure process is a Poisson process with rate parameter λ\lambda.
  2. +
  3. At time tt the number of packets in the queue is independent of the departure process prior to time tt.
  4. +
+

Tandem queues

+

Given ii consecutive servers with queues in tandem:

+
    +
  • ρi=λμi\rho_{i} = \frac{\lambda}{\mu_{i}}
  • +
+

Given 2 consecutive servers, s1s_{1} and s2s_{2}:

+
    +
  • P{L1=j,L2=k}=P{L1=j}×P{L2=k}=ρ1j(1ρ1)×ρ2k(1ρ2)P\{L_{1} = j, L_{2} = k\} = P\{L_{1} = j\} \times P\{L_{2} = k\} = \rho^{j}_{1} (1 - \rho_{1}) \times \rho^{k}_{2} (1 - \rho_{2})
  • +
+

Jackson network

+

Jackson networks have multiple sources and feedback loops. By Burke's Theorem, merging and splitting of Poisson still apply to these networks.

+

To do so:

+
    +
  1. Determine the utilization ρi\rho_{i} for each server ii
  2. +
  3. Create product form solutions as in #tandem-queues
  4. +
+

Resources

+
+ + \ No newline at end of file diff --git a/docs/nodejs-auto-reload/index.html b/docs/nodejs-auto-reload/index.html new file mode 100644 index 00000000..e5e6a532 --- /dev/null +++ b/docs/nodejs-auto-reload/index.html @@ -0,0 +1,39 @@ + + + + + +NodeJS Auto-reload server | Evan Tay + + + + + + + + + + +

NodeJS Auto-reload server

Published on December 23, 2020

+

This document was migrated from DigiDocs

+

Problem: Manually reloading the NodeJS server by hitting Ctrl + C and entering npm start repeatedly in development is exhausting.

+

Solution: Automatically reload the server each time there is a change!

+

Nodemon

+
Cite

Nodemon is a utility that will monitor for any changes in your source and automatically restart your server.

+

How-to-use

+
npm i -g nodemon
+
    +
  1. Install nodemon: npm i -g nodemon.
  2. +
  3. Replace node with nodemon in your command. For example, change node index.js to nodemon index.js. That's it.
  4. +
+

Add to npm scripts

+

You can also add it to npm scripts to make life even easier.

+
{
"scripts": {
"start": "node index.js",
"dev": "nodemon index.js"
}
}
+

After doing so, you can enter npm run dev subsequently, which will resolve to nodemon index.js.

+

Resources

+
+ + \ No newline at end of file diff --git a/docs/nodejs-set-npm-run-shell/index.html b/docs/nodejs-set-npm-run-shell/index.html new file mode 100644 index 00000000..6952bc69 --- /dev/null +++ b/docs/nodejs-set-npm-run-shell/index.html @@ -0,0 +1,33 @@ + + + + + +NodeJS Set npm run shell | Evan Tay + + + + + + + + + + +

NodeJS Set npm run shell

Published on December 23, 2020

+

This document was migrated from DigiDocs

+

This article covers how you can set the shell used when you run the npm run scripts.

+

Example scenario

+

You are a Windows user who just started working on a new NodeJS project. While following through the "Getting Started" guide, you were instructed to run one or more npm run scripts such as npm run dev. These commands fail with errors.

+

Upon checking, you realise that the reason why these commands fail is because they contains Bash (shell) commands not available to your Windows shell. You proceed to install Git Bash for Windows, and then re-run the command again using Git Bash instead. It still fails. It seems like npm run scripts still uses your Windows shell for execution.

+

The one-line solution

+

Tell npm config what shell you want your npm run scripts to be executed with (in this case, the Git Bash shell):

+

npm config set script-shell "C:\\Program Files\\git\\bin\\bash.exe"

+
note

It is assumed that your Git Bash executable file is located at "C:\Program Files\git\bin\bash.exe", which is the default installation location. If it is not, amend the path accordingly.

+

Resources

+
+ + \ No newline at end of file diff --git a/docs/os-ubuntu-cheatsheet/index.html b/docs/os-ubuntu-cheatsheet/index.html new file mode 100644 index 00000000..84383e4c --- /dev/null +++ b/docs/os-ubuntu-cheatsheet/index.html @@ -0,0 +1,80 @@ + + + + + +Ubuntu Cheatsheet | Evan Tay + + + + + + + + + + +

Ubuntu Cheatsheet

Published on December 24, 2020

+

This document was migrated from DigiDocs

+

In this section you will find my notes on setting up and securing Ubuntu 18.04. Vim knowledge is assumed.

+

Creating a new non-root Sudo user

+

It is recommended to avoid using the root user account on a regular basis as it compromises security and is risky. Instead, create a new user account and add it to the sudo group.

+

Add a new user

+
adduser evan
+

Add user to sudo group

+
usermod -aG sudo evan
+

Log in to user

+
su evan
+

Only allow Key Authentication

+

Password-based authentication is susceptible to brute-force attacks. Thus, it is good practice to disable it and only allow key-based authentication.

+

Add Public Key to User

+

As mentioned, usage of the root user account should be avoided. Hence, it is advisable that you add your public key to the user account you created earlier on. It is assumed that you logged into your root account using SSH key.

+
    +
  1. Create a authorized_keys file:
  2. +
+
su evan
cd ~
mkdir .ssh
vim .ssh/authorized_keys
+
    +
  1. Insert your public key and save the file with :wq!. You can copy this from the authorized_keys file under the root account's directory. You can find the file using the following commands:
  2. +
+
su root
cd ~
vim .ssh/authorized_keys
+
tip

Toggle visual mode by pressing v at the start of the line for the public key you wish to copy over. Press $ to move the cursor to the end of the line; doing so highlights the entire line. Press y to yank (copy). Then exit the file using :q!.

Enter the destination authorized_keys file. Press p to paste what you yanked.

+

Disable Password Authentication

+

As it is assumed that you logged into your root account using SSH key, this step could be unnecessary. However, do still perform a check to verify that PasswordAuthentication no is in place.

+
    +
  1. Open sshd_config with Vim:
  2. +
+
sudo vim /etc/ssh/sshd_config
+
    +
  1. Add PasswordAuthentication no. It might be commented out as #PasswordAuthentication no or written as PasswordAuthentication yes. If you find either, replace with PasswordAuthentication no. Else just add it in.
  2. +
+
tip

Use :/PasswordAuthentication to find #PasswordAuthentication no.

+
    +
  1. +

    Save the file with :wq!.

    +
  2. +
  3. +

    Restart ssh to implement this change:

    +
  4. +
+
sudo systemctl restart ssh
+

Basic Firewall

+
    +
  1. List application profiles registered with ufw firewall:
  2. +
+
sudo ufw app list
+

You should see

+
Available applications:
OpenSSH
+
    +
  1. Ensure the firewall allows SSH connections:
  2. +
+
sudo ufw allow OpenSSH
sudo ufw enable # Enable firewall
sudo ufw status # Check if OpenSSH is allowed
+

You should see the following after executing sudo ufw status:

+
To                         Action      From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
+

Resources

+
+ + \ No newline at end of file diff --git a/docs/reading-list/index.html b/docs/reading-list/index.html new file mode 100644 index 00000000..6e3cd060 --- /dev/null +++ b/docs/reading-list/index.html @@ -0,0 +1,46 @@ + + + + + +Reading List | Evan Tay + + + + + + + + + + +

Reading List

Published on December 23, 2020
+Updated on July 3, 2021

+

This is a collection of software engineering-related articles, books and videos I have read or watch and recommend to others.

+

2021

+

Articles 2021

+ +

Books 2021

+
    +
  • Martin Kleppmann: Designing Data-Intensive Applications: Reading this book was one of the best decisions I ever made as a fledgling software engineer. It enlightens readers on the fundamental ideas behind the broad range of popular data systems out there today. It also discusses the key trade-offs between these systems, so readers can make better-informed decisions about which to use given the constraints and context.
  • +
+

2020

+

Articles 2020

+
    +
  • Github: Why Write ADRs: Architecture Decision Records (ADRs) are a great way to document how and why a decision was reached within a codebase. ADRs discuss the problem context, concerns, outcomes, alternative options and accepted trade-offs.
  • +
+

Conferences 2020

+ +

Papers 2020

+
+ + \ No newline at end of file diff --git a/docs/reliable-scalable-maintainable/index.html b/docs/reliable-scalable-maintainable/index.html new file mode 100644 index 00000000..86fe7a6c --- /dev/null +++ b/docs/reliable-scalable-maintainable/index.html @@ -0,0 +1,151 @@ + + + + + +Reliable, Scalable, and Maintainable Applications | Evan Tay + + + + + + + + + + +

Reliable, Scalable, and Maintainable Applications

Published on July 31, 2021
+Updated on January 3, 2022
+Edited by Vanessa Tay

+

The opening chapter of Kleppman’s Designing Data-Intensive Applications book: Reliable, Scalable, and Maintainable Applications, addresses key concerns you should consider when designing distributed and data-intensive systems, in an insightful way. I believe anyone working on a distributed system will benefit from reading it. However, as not all of us may have the time (or will) to pour over the book, I’ve decided to share a quick summary of the key points Kleppman raises, as well as to offer some of my personal inputs with references to other literature and experts.

+

Reliability, Scalability, and Maintainability

+

Designing Data-Intensive Applications

+

Reliability, Scalability, and Maintainability, the three characteristics that Kleppman opens with, are terms you might come across often. If you're not familiar with them, you may wonder: what are they and why are they important?

+

Reliability

+

When building an application, we want it to work correctly, even when things go wrong.

+
+

"Anything that can go wrong will go wrong." - Murphy's law

+
+

The adage above can be applied to just about anything in life and applications are no exception. If we want our applications to be resilient during adverse conditions, we will have to design them with the expectation that things will go wrong. We can't blindly hope they won't.

+
+

"Hope is not a strategy." - Traditional SRE saying, found in Google's Site Reliability Engineering book

+
+

Working correctly

+

When we declare an application system as working correctly, we typically mean that it is able to:

+
    +
  1. Perform the expected functionality,
  2. +
  3. With good enough performance under the expected load,
  4. +
  5. And can tolerate unintended user behaviour or mistakes,
  6. +
  7. And also prevent unauthorized access and abuse.
  8. +
+

Fault-tolerance

+
    +
  • Reliability: A reliable system continues to work correctly, even when things go wrong.
  • +
  • Fault: A fault is typically defined as an individual component of the system deviating from its spec, when it performs in an unexpected way.
  • +
  • Failure: The entire system failing as a whole, and being unable to deliver the required service to its users.
  • +
  • Fault-tolerant/Resilient: If a system anticipates and prevents faults from causing failures, it is fault-tolerant.
  • +
+
note

As it is impossible to design a zero-fault system, we should focus on preventing faults from causing failures instead. We do so by implementing fault-tolerance mechanisms.

+

Human (un)reliability

+

When we design a fault-tolerant system, we will naturally consider how we can build it to tolerate hardware and software errors. We introduce hardware redundancy, such that if a hard disk fails, there's a backup which will take its place. We also write fault-tolerant code, such that a software fault would not cause the server to fail.

+

These errors aren't the only ones we should consider. We should also consider how we can prevent human errors. After all, we humans design, create and operate these systems.

+
+

"Even when they have the best intentions, humans are known to be unreliable." - Found on Page 9 of the book

+
+

We humans write the code, and decide what hardware to run our code on. We are responsible for all bugs and mistakes within our systems. Given that, it is important we ask ourselves often:

+
+

"How do we make our systems reliable, in spite of unreliable humans?" - Found on Page 9 of the book

+
+

To achieve that, we will need to design the system such that it:

+
    +
  • Minimizes opportunities for introducing errors: We should design abstractions, APIs and administrator interfaces which make it easy to do the right thing, and hard to do the wrong thing.
  • +
  • Mitigates impact of failures by allowing quick and easy recovery: We should provide a fast and easy way for developers to roll back a failure-inducing deployment, and for operators to undo accidental changes in the administrator interface.
  • +
  • Reduces delay in diagnosing errors through detailed monitoring: We should set up clear and detailed monitoring which could provide early warning signals, and also insights into what went wrong so we can better triage errors.
  • +
+

Scalability

+

As the load on our system increases, we want it to continue working correctly. To achieve that, we will have to design it such that it is scalable. Scalability describes a system's ability to deliver its expected functionality in spite of increased load. Given that there are many different types of load a system can have, it is meaningless to discuss whether the system is scalable or not. It is more productive to talk about whether it is scalable in a specific manner:

+
+

"If the system grows in a particular way, what are our options for coping with the growth?" - Found on Page 11 of the book

+
+

Before we can describe scalability, we will first need to define load. We can do so numerically by using load parameters.

+

Load parameter

+

A load parameter is a metric you can use to describe a particular load for a given system. Examples include requests per second for a web application, and the ratio of cache hits to misses. The load parameters you should focus on depends on the architecture of your system and your user requirements.

+
+

"An architecture that scales well for a particular application is built around assumptions of which operations will be common and which will be rare - the load parameters." - Page 18 of the book

+
+

Performance

+

After defining the load parameters of your system, you can now describe how increases in load affect the system:

+
    +
  • When a load parameter increases, how is the system performance affected if you keep the system resources constant?
  • +
  • When a load parameter increases, how much do you need to increase the resources by to keep the system performance constant?
  • +
+

To answer these questions, you would need to define performance metrics. Examples of such metrics include the throughput of a network protocol, and the response time of a web service.

+

Response time

+

Response time is a common and important performance metrics for online, distributed systems. There are many different definitions for it out there. In the context of online systems, it is typically defined as the time between a client sending a request to the system and receiving a response from it.

+

When you consider a system's response time, it is important to consider it not as a single value, the average (mean), but as a distribution of values, the percentiles. That's because the response time for requests varies a lot, and there are many outliers which are much slower. There are many reasons why this is so, here are some:

+
    +
  • Different types of requests have different processing time: An online system handles many different types of requests which take varying amounts of time to process.
  • +
  • Caching reduces response time for common requests: Common requests are often cached for high-traffic systems, and responded to much faster than those which are not.
  • +
+

Given these reasons, the distribution of response time is asymmetric and significant outliers are common. This makes the mean much less representative of the response time than the median, also known as the 50th percentile.

+

The median also provides information about the distribution which the mean does not - if the median response time is 80ms, you can infer that half of the requests have a response time faster than 80ms, and also that the other half would be slower than that. You can't infer the same from an average response time, as it is not a middle value like the median.

+

You can check out the article Michael Kopp: Why Averages Suck and Percentiles are Great for more information on why the average response time is an inadequate performance metric.

+

Tail latencies

+

You should also consider how slow the outliers are, by looking at higher percentiles such as the 95th and 99th percentile. These are the thresholds at which 95% or 99% of the requests are faster than that particular threshold. They're also commonly called tail latencies. It is important you consider these, because the users with the slowest response time are often those who have used the system most extensively.

+

Amazon uses the 99.9th percentile for internal service response time requirements. They do so even though only 0.1% of requests are slower, because the customers with these requests are often the most valuable customers. They experience longer response time because they have more data. They have more data because they made many more purchases than typical customers, thus making them more valuable.

+

Scaling to cope with increased load

+
+

"An architecture that is appropriate for one level of load is unlikely to cope with 10 times that load." - Found on Page 17 of the book

+
+

If you want to maintain good system performance, when the load parameters increase, you would need to increase the resources. There are two ways of doing so:

+
    +
  • Vertical scaling: Scaling up by adding more power - adding more CPU or RAM to your virtual machine instance.
  • +
  • Horizontal scaling: Scaling out by adding more machines - adding more instances to your instance group.
  • +
+

There are tradeoffs between both approaches. A system running on a single, powerful machine is much simpler to develop and maintain than one on multiple machines. However, as you scale up a machine, it gets increasingly costly to do so, and scaling out becomes inevitable. You would need to find the right balance between both approaches if you want to achieve the most cost-effective and efficient outcome.

+

Maintainability

+

When building a system, we want to build it such that it is as easy to maintain as possible.

+
+

"It is well known that the majority of the cost of software is not in its initial development, but in its ongoing maintenance - fixing bugs, investigating failures, modifying it for new use cases, and adding new features." - Found on Page 18 of the book

+
+

We should design systems which are easy to operate, understand and evolve. To achieve that, we should follow these three principles when designing a system:

+
    +
  • Operability: We should make it easy for operators to keep the system running smoothly.
  • +
  • Simplicity: We should make it easy for engineers to understand the system by reducing as much system complexity as possible.
  • +
  • Evolvability: We should make it easy for engineers to change the system in future, adapting it for unanticipated use cases to match requirement changes.
  • +
+

Operability

+

A system with good operability makes routine maintenance tasks easy, allowing the operations team to focus on higher-value contributions. We can achieve that by designing a system with:

+
    +
  • Good telemetry: Set up informative and usable monitoring and logging of the system's runtime behaviour and health.
  • +
  • Good documentation: Document in an easy-to-understand manner such that operators are clear on what they can do and what is the outcome - e.g. "If I do X, Y will happen".
  • +
  • Good default behaviour: Supply default values and settings for operational/internal tools, but allow operators to override defaults when needed for edge cases.
  • +
+

Simplicity

+

As a system grows larger, so does its complexity. This makes the system harder to understand by those working on it, which is problematic in many ways, such as:

+
    +
  • Lower productivity: Engineers will take longer to complete tasks because they will have to spend more time understanding what they are working on
  • +
  • Higher risk of introducing bugs: Engineers are more likely to overlook hidden assumptions and unintended side effects which will cause faults.
  • +
+

Moseley and Marks define two types of complexity in their paper Out of the Tar Pit:

+
    +
  • Essential Complexity: inherent in the essence of the problem
  • +
  • Accidental Complexity: anything else which the development team would not have to deal with ideally (e.g. complexity arising from suboptimal language and infrastructure)
  • +
+

While it is inevitable that a system becomes more complex as it grows, we can mitigate it by reducing accidental complexity. We can do so by keeping simplicity in mind when working on the system. One of the best and most common approaches to doing so is by implementing abstractions, which can hide a ton of implementation detail behind a simple-to-understand facade.

+

Evolvability

+

It is likely your system's requirements will change due to reasons such as:

+
    +
  • An unanticipated use case emerging
  • +
  • Business priorities changing
  • +
  • User requesting new features
  • +
+

The ease at which you evolve your system to meet the new requirements depends heavily on its simplicity. The easier it is to understand your system, the easier it would be to modify it.

+

Resources

+
+ + \ No newline at end of file diff --git a/docs/ruby-dependency-management/index.html b/docs/ruby-dependency-management/index.html new file mode 100644 index 00000000..74d7fde5 --- /dev/null +++ b/docs/ruby-dependency-management/index.html @@ -0,0 +1,30 @@ + + + + + +Dependency management | Evan Tay + + + + + + + + + + +

Dependency management

Published on October 24, 2021

+

Why do we use bundler?

+

Why do we use bundle install rather than gem install?

+

Bundler installs the exact gems and versions that are needed. It resolves all dependency conflicts for you automatically, which you would have to manually resolve if you had used gem install instead.

+

For example, if you have two gems requiring different versions of the same gem nokogiri:

+
sunspot_rails
nokogiri (>= 1.2.0)

webrat
nokogiri (>= 1.3)
+

If you use gem install to install sunspot_rails and webrat, it might install both 1.2.0 and 1.3.0 nokogiri versions or even complain about version conflicts. If you use bundle install instead, Bundler will resolve this dependency conflict by installing the right nokogiri version, which is 1.3 in this example.

+

Resources

+
+ + \ No newline at end of file diff --git a/docs/scaling-memcached/index.html b/docs/scaling-memcached/index.html new file mode 100644 index 00000000..8e9d5804 --- /dev/null +++ b/docs/scaling-memcached/index.html @@ -0,0 +1,77 @@ + + + + + +Scaling Memcached | Evan Tay + + + + + + + + + + +

Scaling Memcached

Published on April 14, 2021

+

Article review for Melodies Sim's Medium Article: Lessons Learnt from Scaling Memcached in Production

+

Context

+

Memcached is a(n):

+
    +
  • In-memory cache typically used for look-aside caching +
      +
    • Look-aside versus look-through caching: see slides 14 and 15 of Princeton COS 316 Intro to Caching
    • +
    • Look-aside caching: client requests item from backing store (database) on cache miss; simpler implementation, more flexible, slower on misses
    • +
    • Look-through caching: cache requests item from backing store on cache miss; harder implementation, less flexible, better consistency
    • +
    +
  • +
  • Simple implementation without built-in high availability features
  • +
  • Used by planet-scale companies such as Facebook and Twitter
  • +
+

The article discusses strategies for building caches with high availability and strong data consistency.

+

Key takeaways

+
    +
  • Trade-off between ACID (C stands for consistency) properties and availability
  • +
  • Memcached can be used as Authoritative Storage via Remote Marker mechanism +
      +
    • Mechanism used to minimize probability of reading stale data in DB replicas
    • +
    • When the client writes to the master DB, there is a replication delay between it and its replicas
    • +
    • The client will write a marker to Memcached after writing to the master DB
    • +
    • Marker will have a short TTL - duration depending on DB replication delay
    • +
    • If marker exists, read from the master DB; otherwise read from DB replica
    • +
    +
  • +
  • Writes are not idempotent nor commutative; deletes are. +
      +
    • If we write to DB then write to cache naively, race conditions will arise when there are concurrent writes as writes are non-commutative +
        +
      • Leads to infinitely stale data given writes and no eventual data consistency
      • +
      +
    • +
    • To avoid this issue, use delete instead: after writing to DB, do cache invalidation by deleting the data item from the cache +
        +
      • Multiple deletes sent to the cache would not matter as you can only delete something once; ordering of delete doesn't matter too
      • +
      • Client will fetch the data item from the database on cache miss and update the most recent value to Memcached instead
      • +
      +
    • +
    • There is still a small risk of stale data, if a delete occurs between a cache read and set (see Melodies's article for illustration) +
        +
      • Facebook deals with it using a check-and-set approach via a lease mechanism
      • +
      • On cache miss, client receives a lease token for the requested key
      • +
      • On cache set, client verifies the lease token before setting the key
      • +
      • If Memcached receive a delete request for the key, the lease is invalidated
      • +
      +
    • +
    +
  • +
+

References

+
+ + \ No newline at end of file diff --git a/img/blog/bubbletea.jpg b/img/blog/bubbletea.jpg new file mode 100644 index 00000000..62eed38c Binary files /dev/null and b/img/blog/bubbletea.jpg differ diff --git a/img/blog/ceevee.png b/img/blog/ceevee.png new file mode 100644 index 00000000..2f8cc20e Binary files /dev/null and b/img/blog/ceevee.png differ diff --git a/img/blog/ddia.png b/img/blog/ddia.png new file mode 100644 index 00000000..4b53850f Binary files /dev/null and b/img/blog/ddia.png differ diff --git a/img/blog/evantay_v1.png b/img/blog/evantay_v1.png new file mode 100644 index 00000000..e58cb52d Binary files /dev/null and b/img/blog/evantay_v1.png differ diff --git a/img/blog/posthog_actions_secrets.png b/img/blog/posthog_actions_secrets.png new file mode 100644 index 00000000..0fab36c8 Binary files /dev/null and b/img/blog/posthog_actions_secrets.png differ diff --git a/img/blog/posthog_api_key.png b/img/blog/posthog_api_key.png new file mode 100644 index 00000000..6755392e Binary files /dev/null and b/img/blog/posthog_api_key.png differ diff --git a/img/blog/stashaway_returns.png b/img/blog/stashaway_returns.png new file mode 100644 index 00000000..56fc96d7 Binary files /dev/null and b/img/blog/stashaway_returns.png differ diff --git a/img/docs/ddia.png b/img/docs/ddia.png new file mode 100644 index 00000000..9f314d37 Binary files /dev/null and b/img/docs/ddia.png differ diff --git a/img/docs/ikigai.jpeg b/img/docs/ikigai.jpeg new file mode 100644 index 00000000..99729cc1 Binary files /dev/null and b/img/docs/ikigai.jpeg differ diff --git a/img/docs/mininet.png b/img/docs/mininet.png new file mode 100644 index 00000000..766f936f Binary files /dev/null and b/img/docs/mininet.png differ diff --git a/img/logo.png b/img/logo.png new file mode 100644 index 00000000..5823a1fb Binary files /dev/null and b/img/logo.png differ diff --git a/img/profilepic.jpg b/img/profilepic.jpg new file mode 100644 index 00000000..3d8c7248 Binary files /dev/null and b/img/profilepic.jpg differ diff --git a/img/projects/braintrain.png b/img/projects/braintrain.png new file mode 100644 index 00000000..96ee95f1 Binary files /dev/null and b/img/projects/braintrain.png differ diff --git a/img/projects/digicourse.png b/img/projects/digicourse.png new file mode 100644 index 00000000..c452b863 Binary files /dev/null and b/img/projects/digicourse.png differ diff --git a/img/projects/dscnustech.png b/img/projects/dscnustech.png new file mode 100644 index 00000000..0ef6f6f4 Binary files /dev/null and b/img/projects/dscnustech.png differ diff --git a/img/projects/dynalite.png b/img/projects/dynalite.png new file mode 100644 index 00000000..7af6bd0a Binary files /dev/null and b/img/projects/dynalite.png differ diff --git a/img/projects/glory.png b/img/projects/glory.png new file mode 100644 index 00000000..77dc5bef Binary files /dev/null and b/img/projects/glory.png differ diff --git a/img/projects/kayafolio.png b/img/projects/kayafolio.png new file mode 100644 index 00000000..0ece2d61 Binary files /dev/null and b/img/projects/kayafolio.png differ diff --git a/img/projects/mochai.png b/img/projects/mochai.png new file mode 100644 index 00000000..60f2c5bd Binary files /dev/null and b/img/projects/mochai.png differ diff --git a/img/projects/mongo-action.png b/img/projects/mongo-action.png new file mode 100644 index 00000000..7ccc6844 Binary files /dev/null and b/img/projects/mongo-action.png differ diff --git a/index.html b/index.html new file mode 100644 index 00000000..1380e67a --- /dev/null +++ b/index.html @@ -0,0 +1,776 @@ + + + + + +Home | Evan Tay + + + + + + + + + + +

Who am I

Hi

🇸🇬 I am Evan, a Full Stack Software Engineer and Certified Cloud Engineer based in Singapore.

🚀 I love building cool and meaningful things with tech like websites, applications or games.

🌏 To me, coding is the closest thing to magic we have on Earth.

👨‍💻 I have been writing beautiful code at Padlet since 2021.

🎒 I was a Computer Science major at the National University of Singapore from 2017 to 2020.

🧑‍🏫 Back then, I was a Teaching Assistant for Programming Methodology and Networking courses.

🛼 I was also Deputy Head of Technology for the NUS Google Developer Student Club, and President of the NUS Skating Club.

+ + \ No newline at end of file diff --git a/pdf/cert_distributed_systems.pdf b/pdf/cert_distributed_systems.pdf new file mode 100644 index 00000000..680416b8 Binary files /dev/null and b/pdf/cert_distributed_systems.pdf differ diff --git a/pdf/cert_software_engineering.pdf b/pdf/cert_software_engineering.pdf new file mode 100644 index 00000000..7fb2e65e Binary files /dev/null and b/pdf/cert_software_engineering.pdf differ diff --git a/pdf/dynalite.pdf b/pdf/dynalite.pdf new file mode 100644 index 00000000..ac183046 Binary files /dev/null and b/pdf/dynalite.pdf differ diff --git a/pdf/resume.pdf b/pdf/resume.pdf new file mode 100644 index 00000000..b7a769be Binary files /dev/null and b/pdf/resume.pdf differ diff --git a/projects/index.html b/projects/index.html new file mode 100644 index 00000000..d0804a36 --- /dev/null +++ b/projects/index.html @@ -0,0 +1,19 @@ + + + + + +Projects | Evan Tay + + + + + + + + + + + + + \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 00000000..5fe3707a --- /dev/null +++ b/sitemap.xml @@ -0,0 +1 @@ +https://evantay.com/blogweekly0.5https://evantay.com/blog/archiveweekly0.5https://evantay.com/blog/docusaurus-gh-actionweekly0.5https://evantay.com/blog/docusaurus-posthogweekly0.5https://evantay.com/blog/historyweekly0.5https://evantay.com/blog/stack-2020weekly0.5https://evantay.com/blog/stashawayweekly0.5https://evantay.com/blog/tagsweekly0.5https://evantay.com/blog/tags/analyticsweekly0.5https://evantay.com/blog/tags/book-reviewweekly0.5https://evantay.com/blog/tags/ciweekly0.5https://evantay.com/blog/tags/cloudweekly0.5https://evantay.com/blog/tags/conferenceweekly0.5https://evantay.com/blog/tags/docusaurusweekly0.5https://evantay.com/blog/tags/github-actionweekly0.5https://evantay.com/blog/tags/gov-tech-stackweekly0.5https://evantay.com/blog/tags/investingweekly0.5https://evantay.com/blog/tags/microservicesweekly0.5https://evantay.com/blog/tags/posthogweekly0.5https://evantay.com/blog/tags/sharingweekly0.5https://evantay.com/blog/tags/software-architectureweekly0.5https://evantay.com/blog/tags/software-engineeringweekly0.5https://evantay.com/blog/why-you-should-read-ddiaweekly0.5https://evantay.com/projects/weekly0.5https://evantay.com/docs/weekly0.5https://evantay.com/docs/c-cheatsheetweekly0.5https://evantay.com/docs/docker-cheatsheetweekly0.5https://evantay.com/docs/gcp-gke-cheatsheetweekly0.5https://evantay.com/docs/git-cheatsheetweekly0.5https://evantay.com/docs/git-ignore-fileweekly0.5https://evantay.com/docs/ikigaiweekly0.5https://evantay.com/docs/iterm2-cheatsheetweekly0.5https://evantay.com/docs/iterm2-zsh-setupweekly0.5https://evantay.com/docs/js-cheatsheetweekly0.5https://evantay.com/docs/mdxweekly0.5https://evantay.com/docs/mininet-setupweekly0.5https://evantay.com/docs/mongodb-cheatsheetweekly0.5https://evantay.com/docs/mongodb-setupweekly0.5https://evantay.com/docs/network-modelweekly0.5https://evantay.com/docs/nodejs-auto-reloadweekly0.5https://evantay.com/docs/nodejs-set-npm-run-shellweekly0.5https://evantay.com/docs/os-ubuntu-cheatsheetweekly0.5https://evantay.com/docs/reading-listweekly0.5https://evantay.com/docs/reliable-scalable-maintainableweekly0.5https://evantay.com/docs/ruby-dependency-managementweekly0.5https://evantay.com/docs/scaling-memcachedweekly0.5https://evantay.com/weekly0.5 \ No newline at end of file