diff --git a/404.html b/404.html index e5e0dfcc..3e7dc36e 100644 --- a/404.html +++ b/404.html @@ -2,13 +2,13 @@ - + Page Not Found | LmcRbacMvc - - - + + + -
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.

+
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/assets/css/styles.4572b7ed.css b/assets/css/styles.4572b7ed.css deleted file mode 100644 index 53a3e65c..00000000 --- a/assets/css/styles.4572b7ed.css +++ /dev/null @@ -1 +0,0 @@ -.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.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}.clean-list,.containsTaskList_mC6p,.details_lb9f>summary,.dropdown__menu,.menu__list{list-style:none}: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;--docusaurus-progress-bar-color:var(--ifm-color-primary);--ifm-color-primary:#2e8555;--ifm-color-primary-dark:#29784c;--ifm-color-primary-darker:#277148;--ifm-color-primary-darkest:#205d3b;--ifm-color-primary-light:#33925d;--ifm-color-primary-lighter:#359962;--ifm-color-primary-lightest:#3cad6e;--ifm-code-font-size:95%;--docusaurus-highlighted-code-line-bg:#0000001a;--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)}.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{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);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;text-size-adjust:100%}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)}.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}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}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)}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}.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{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)}.card--full-height,.navbar__logo img,body,html{height:100%}.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{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__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;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)}.sidebar_re4s,.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem)}.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{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: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}.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{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{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}.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{display:grid;grid-gap:var(--ifm-spacing-horizontal);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,.sidebarItemTitle_pO2u,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;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);cursor:pointer;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}#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}[data-theme=dark]{--ifm-color-primary:#25c2a0;--ifm-color-primary-dark:#21af90;--ifm-color-primary-darker:#1fa588;--ifm-color-primary-darkest:#1a8870;--ifm-color-primary-light:#29d5b0;--ifm-color-primary-lighter:#32d8b4;--ifm-color-primary-lightest:#4fddbf;--docusaurus-highlighted-code-line-bg:#0000004d}.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)}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_YfHR,.navbarSearchContainer_Bca1:empty,.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}.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}.dropdownNavbarItemMobile_S0Fm{cursor:pointer}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.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{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 2rem)}.sidebarItemTitle_pO2u{font-size:var(--ifm-h3-font-size)}.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}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.authorCol_Hf19{flex-grow:1!important;max-width:inherit!important}.imageOnlyAuthorRow_pa_O{display:flex;flex-flow:row wrap}.buttons_AeoN,.features_t9lD{align-items:center;display:flex}.imageOnlyAuthorCol_G86a{margin-left:.3rem;margin-right:.3rem}.features_t9lD{padding:2rem 0;width:100%}.featureSvg_GfXr{height:200px;width:200px}.heroBanner_qdFl{overflow:hidden;padding:4rem 0;position:relative;text-align:center}.buttons_AeoN{justify-content:center}.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}: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:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{left:0;position:absolute;top:0;fill:currentColor;height:inherit;opacity:inherit;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}.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}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.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;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}.lastUpdated_JAkA{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}.tocCollapsibleContent_vkbj a{display:block}.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)}.img_ev3q{height:auto}.tableOfContents_bqdL{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.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{display:inline-block;height:1.6em;width:1.6em;fill:var(--ifm-alert-foreground-color)}.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}.mdxPageWrapper_j9I6{justify-content:center}@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: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);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: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_JAkA{text-align:right}.tocMobile_ITEo{display:none}.docItemCol_VOVn{max-width:75%!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@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:996px){.heroBanner_qdFl{padding:2rem}}@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/css/styles.5aea94bc.css b/assets/css/styles.5aea94bc.css new file mode 100644 index 00000000..aebf1cfb --- /dev/null +++ b/assets/css/styles.5aea94bc.css @@ -0,0 +1 @@ +.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.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}.authorSocials_rSDt,.authorTitle_nd0D{-webkit-box-orient:vertical;overflow:hidden}.clean-list,.containsTaskList_mC6p,.details_lb9f>summary,.dropdown__menu,.menu__list{list-style:none}: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;--docusaurus-progress-bar-color:var(--ifm-color-primary);--ifm-color-primary:#2e8555;--ifm-color-primary-dark:#29784c;--ifm-color-primary-darker:#277148;--ifm-color-primary-darkest:#205d3b;--ifm-color-primary-light:#33925d;--ifm-color-primary-lighter:#359962;--ifm-color-primary-lightest:#3cad6e;--ifm-code-font-size:95%;--docusaurus-highlighted-code-line-bg:#0000001a;--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-blog-social-icon-size:1rem;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300)}.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{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);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;text-size-adjust:100%}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)}.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}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}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)}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}.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{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)}.card--full-height,.navbar__logo img,body,html{height:100%}.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{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__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;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)}.sidebar_re4s,.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem)}.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{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{height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;content:"";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: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}.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{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{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:1rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.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{display:grid;grid-gap:var(--ifm-spacing-horizontal);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,.sidebarItemTitle_pO2u,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;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}.header-github-link:before,.tabs__item{transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.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);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal)}.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}#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}[data-theme=dark]{--ifm-color-primary:#25c2a0;--ifm-color-primary-dark:#21af90;--ifm-color-primary-darker:#1fa588;--ifm-color-primary-darkest:#1a8870;--ifm-color-primary-light:#29d5b0;--ifm-color-primary-lighter:#32d8b4;--ifm-color-primary-lightest:#4fddbf;--docusaurus-highlighted-code-line-bg:#0000004d}.header-github-link:before{background-color:var(--ifm-navbar-link-color);content:"";display:flex;height:24px;-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E");width:24px}.header-github-link:hover:before{background-color:var(--ifm-navbar-link-hover-color)}.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)}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_YfHR,.navbarSearchContainer_Bca1:empty,.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}.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%}.authorSocialIcon_XYv3,.authorSocialLink_owbf,.authorSocials_rSDt{height:var(--docusaurus-blog-social-icon-size)}.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%}.authorSocialIcon_XYv3,.authorSocialLink_owbf{width:var(--docusaurus-blog-social-icon-size)}.docsWrapper_hBAB{display:flex;flex:1 0 auto}.dropdownNavbarItemMobile_S0Fm{cursor:pointer}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.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{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 2rem)}.sidebarItemTitle_pO2u{font-size:var(--ifm-h3-font-size)}.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}.yearGroupHeading_rMGB{margin-bottom:.4rem;margin-top:1.6rem}.yearGroupHeading_QT03{margin:1rem .75rem .5rem}[data-theme=dark] .githubSvg_Uu4N,[data-theme=dark] .xSvg_y3PF{fill:var(--light)}[data-theme=light] .githubSvg_Uu4N,[data-theme=light] .xSvg_y3PF{fill:var(--dark)}.authorSocials_rSDt{align-items:center;display:flex;flex-wrap:wrap;line-clamp:1;-webkit-line-clamp:1}.authorSocialLink_owbf,.authorSocials_rSDt{line-height:0}.authorSocialLink_owbf{margin-right:.4rem}.authorImage_XqGP{--ifm-avatar-photo-size:3.6rem}.author-as-h1_n9oJ .authorImage_XqGP{--ifm-avatar-photo-size:7rem}.author-as-h2_gXvM .authorImage_XqGP{--ifm-avatar-photo-size:5.4rem}.authorDetails_lV9A{align-items:flex-start;display:flex;flex-direction:column;justify-content:space-around}.authorName_yefp{display:flex;flex-direction:row;font-size:1.1rem;line-height:1.1rem}.author-as-h1_n9oJ .authorName_yefp{display:inline;font-size:2.4rem;line-height:2.4rem}.author-as-h2_gXvM .authorName_yefp{display:inline;font-size:1.4rem;line-height:1.4rem}.authorTitle_nd0D{display:-webkit-box;font-size:.8rem;line-height:1rem;line-clamp:1;-webkit-line-clamp:1}.author-as-h1_n9oJ .authorTitle_nd0D{font-size:1.2rem;line-height:1.6rem}.author-as-h2_gXvM .authorTitle_nd0D{font-size:1rem;line-height:1.3rem}.authorBlogPostCount_iiJ5{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.8rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.authorListItem_n3yI{list-style-type:none;margin-bottom:2rem}.authorCol_Hf19{max-width:inherit!important}.imageOnlyAuthorRow_pa_O{display:flex;flex-flow:row wrap}.buttons_AeoN,.features_t9lD{align-items:center;display:flex}.imageOnlyAuthorCol_G86a{margin-left:.3rem;margin-right:.3rem}.features_t9lD{padding:2rem 0;width:100%}.featureSvg_GfXr{height:200px;width:200px}.heroBanner_qdFl{overflow:hidden;padding:4rem 0;position:relative;text-align:center}.buttons_AeoN{justify-content:center}.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}: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:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{left:0;position:absolute;top:0;fill:currentColor;height:inherit;opacity:inherit;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}.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}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.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;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}.lastUpdated_JAkA{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}.tocCollapsibleContent_vkbj a{display:block}.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)}.img_ev3q{height:auto}.tableOfContents_bqdL{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.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{display:inline-block;height:1.6em;width:1.6em;fill:var(--ifm-alert-foreground-color)}.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}.mdxPageWrapper_j9I6{justify-content:center}@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: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);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: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_JAkA{text-align:right}.tocMobile_ITEo{display:none}.docItemCol_VOVn{max-width:75%!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@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:996px){.heroBanner_qdFl{padding:2rem}}@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/guards-bebe9254cc00bef48fb2532cbc931891.png b/assets/images/guards-bebe9254cc00bef48fb2532cbc931891.png new file mode 100644 index 00000000..c008496e Binary files /dev/null and b/assets/images/guards-bebe9254cc00bef48fb2532cbc931891.png differ diff --git a/assets/images/roles-7b31412c689086807f6c9c1e354f23c1.png b/assets/images/roles-7b31412c689086807f6c9c1e354f23c1.png new file mode 100644 index 00000000..559a4709 Binary files /dev/null and b/assets/images/roles-7b31412c689086807f6c9c1e354f23c1.png differ diff --git a/assets/images/settings-de6e02e7515b826a7e9faadc1713deee.png b/assets/images/settings-de6e02e7515b826a7e9faadc1713deee.png new file mode 100644 index 00000000..bdefb23f Binary files /dev/null and b/assets/images/settings-de6e02e7515b826a7e9faadc1713deee.png differ diff --git a/assets/js/01a85c17.80194efd.js b/assets/js/01a85c17.80194efd.js deleted file mode 100644 index 1c29e139..00000000 --- a/assets/js/01a85c17.80194efd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[209],{6535:(e,s,t)=>{t.d(s,{A:()=>v});var a=t(6540),i=t(4164),r=t(781),l=t(4581),n=t(8774),c=t(1312),o=t(6347),d=t(9169);function m(e){const{pathname:s}=(0,o.zy)();return(0,a.useMemo)((()=>e.filter((e=>function(e,s){return!(e.unlisted&&!(0,d.ys)(e.permalink,s))}(e,s)))),[e,s])}const u={sidebar:"sidebar_re4s",sidebarItemTitle:"sidebarItemTitle_pO2u",sidebarItemList:"sidebarItemList_Yudw",sidebarItem:"sidebarItem__DBe",sidebarItemLink:"sidebarItemLink_mo7H",sidebarItemLinkActive:"sidebarItemLinkActive_I1ZP"};var b=t(4848);function g(e){let{sidebar:s}=e;const t=m(s.items);return(0,b.jsx)("aside",{className:"col col--3",children:(0,b.jsxs)("nav",{className:(0,i.A)(u.sidebar,"thin-scrollbar"),"aria-label":(0,c.T)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"}),children:[(0,b.jsx)("div",{className:(0,i.A)(u.sidebarItemTitle,"margin-bottom--md"),children:s.title}),(0,b.jsx)("ul",{className:(0,i.A)(u.sidebarItemList,"clean-list"),children:t.map((e=>(0,b.jsx)("li",{className:u.sidebarItem,children:(0,b.jsx)(n.A,{isNavLink:!0,to:e.permalink,className:u.sidebarItemLink,activeClassName:u.sidebarItemLinkActive,children:e.title})},e.permalink)))})]})})}var h=t(5600);function j(e){let{sidebar:s}=e;const t=m(s.items);return(0,b.jsx)("ul",{className:"menu__list",children:t.map((e=>(0,b.jsx)("li",{className:"menu__list-item",children:(0,b.jsx)(n.A,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active",children:e.title})},e.permalink)))})}function p(e){return(0,b.jsx)(h.GX,{component:j,props:e})}function x(e){let{sidebar:s}=e;const t=(0,l.l)();return s?.items.length?"mobile"===t?(0,b.jsx)(p,{sidebar:s}):(0,b.jsx)(g,{sidebar:s}):null}function v(e){const{sidebar:s,toc:t,children:a,...l}=e,n=s&&s.items.length>0;return(0,b.jsx)(r.A,{...l,children:(0,b.jsx)("div",{className:"container margin-vert--lg",children:(0,b.jsxs)("div",{className:"row",children:[(0,b.jsx)(x,{sidebar:s}),(0,b.jsx)("main",{className:(0,i.A)("col",{"col--7":n,"col--9 col--offset-1":!n}),children:a}),t&&(0,b.jsx)("div",{className:"col col--2",children:t})]})})})}},9158:(e,s,t)=>{t.r(s),t.d(s,{default:()=>j});t(6540);var a=t(4164),i=t(1312);const r=()=>(0,i.T)({id:"theme.tags.tagsPageTitle",message:"Tags",description:"The title of the tag list page"});var l=t(1213),n=t(7559),c=t(6535),o=t(6133),d=t(1107);const m={tag:"tag_Nnez"};var u=t(4848);function b(e){let{letterEntry:s}=e;return(0,u.jsxs)("article",{children:[(0,u.jsx)(d.A,{as:"h2",id:s.letter,children:s.letter}),(0,u.jsx)("ul",{className:"padding--none",children:s.tags.map((e=>(0,u.jsx)("li",{className:m.tag,children:(0,u.jsx)(o.A,{...e})},e.permalink)))}),(0,u.jsx)("hr",{})]})}function g(e){let{tags:s}=e;const t=function(e){const s={};return Object.values(e).forEach((e=>{const t=function(e){return e[0].toUpperCase()}(e.label);s[t]??=[],s[t].push(e)})),Object.entries(s).sort(((e,s)=>{let[t]=e,[a]=s;return t.localeCompare(a)})).map((e=>{let[s,t]=e;return{letter:s,tags:t.sort(((e,s)=>e.label.localeCompare(s.label)))}}))}(s);return(0,u.jsx)("section",{className:"margin-vert--lg",children:t.map((e=>(0,u.jsx)(b,{letterEntry:e},e.letter)))})}var h=t(1463);function j(e){let{tags:s,sidebar:t}=e;const i=r();return(0,u.jsxs)(l.e3,{className:(0,a.A)(n.G.wrapper.blogPages,n.G.page.blogTagsListPage),children:[(0,u.jsx)(l.be,{title:i}),(0,u.jsx)(h.A,{tag:"blog_tags_list"}),(0,u.jsxs)(c.A,{sidebar:t,children:[(0,u.jsx)(d.A,{as:"h1",children:i}),(0,u.jsx)(g,{tags:s})]})]})}},6133:(e,s,t)=>{t.d(s,{A:()=>n});t(6540);var a=t(4164),i=t(8774);const r={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var l=t(4848);function n(e){let{permalink:s,label:t,count:n,description:c}=e;return(0,l.jsxs)(i.A,{href:s,title:c,className:(0,a.A)(r.tag,n?r.tagWithCount:r.tagRegular),children:[t,n&&(0,l.jsx)("span",{children:n})]})}}}]); \ No newline at end of file diff --git a/assets/js/01a85c17.e660fcd3.js b/assets/js/01a85c17.e660fcd3.js new file mode 100644 index 00000000..3131ded8 --- /dev/null +++ b/assets/js/01a85c17.e660fcd3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8209],{4096:(e,t,a)=>{a.d(t,{in:()=>c,OU:()=>P,Ki:()=>A,kJ:()=>b,x:()=>l,e7:()=>m,J_:()=>f,Gx:()=>y});var s=a(6540),n=a(9532),i=a(6803),r=a(4848);function l(){const e=(0,i.A)(),t=e?.data?.blogMetadata;if(!t)throw new Error("useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context");return t}const o=s.createContext(null);function c(e){let{children:t,content:a,isBlogPostPage:n=!1}=e;const i=function(e){let{content:t,isBlogPostPage:a}=e;return(0,s.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:a})),[t,a])}({content:a,isBlogPostPage:n});return(0,r.jsx)(o.Provider,{value:i,children:t})}function m(){const e=(0,s.useContext)(o);if(null===e)throw new n.dV("BlogPostProvider");return e}var d=a(6025),u=a(4586);const g=e=>new Date(e).toISOString();function h(e){const t=e.map(x);return{author:1===t.length?t[0]:t}}function p(e,t,a){return e?{image:j({imageUrl:t(e,{absolute:!0}),caption:`title image for the blog post: ${a}`})}:{}}function b(e){const{siteConfig:t}=(0,u.A)(),{withBaseUrl:a}=(0,d.hH)(),{metadata:{blogDescription:s,blogTitle:n,permalink:i}}=e,r=`${t.url}${i}`;return{"@context":"https://schema.org","@type":"Blog","@id":r,mainEntityOfPage:r,headline:n,description:s,blogPost:e.items.map((e=>function(e,t,a){const{assets:s,frontMatter:n,metadata:i}=e,{date:r,title:l,description:o,lastUpdatedAt:c}=i,m=s.image??n.image,d=n.keywords??[],u=`${t.url}${i.permalink}`,b=c?g(c):void 0;return{"@type":"BlogPosting","@id":u,mainEntityOfPage:u,url:u,headline:l,name:l,description:o,datePublished:r,...b?{dateModified:b}:{},...h(i.authors),...p(m,a,l),...d?{keywords:d}:{}}}(e.content,t,a)))}}function f(){const e=l(),{assets:t,metadata:a}=m(),{siteConfig:s}=(0,u.A)(),{withBaseUrl:n}=(0,d.hH)(),{date:i,title:r,description:o,frontMatter:c,lastUpdatedAt:b}=a,f=t.image??c.image,x=c.keywords??[],j=b?g(b):void 0,N=`${s.url}${a.permalink}`;return{"@context":"https://schema.org","@type":"BlogPosting","@id":N,mainEntityOfPage:N,url:N,headline:r,name:r,description:o,datePublished:i,...j?{dateModified:j}:{},...h(a.authors),...p(f,n,r),...x?{keywords:x}:{},isPartOf:{"@type":"Blog","@id":`${s.url}${e.blogBasePath}`,name:e.blogTitle}}}function x(e){return{"@type":"Person",...e.name?{name:e.name}:{},...e.title?{description:e.title}:{},...e.url?{url:e.url}:{},...e.email?{email:e.email}:{},...e.imageURL?{image:e.imageURL}:{}}}function j(e){let{imageUrl:t,caption:a}=e;return{"@type":"ImageObject","@id":t,url:t,contentUrl:t,caption:a}}var N=a(6347),v=a(8774),C=a(1682),k=a(9169);function y(e){const{pathname:t}=(0,N.zy)();return(0,s.useMemo)((()=>e.filter((e=>function(e,t){return!(e.unlisted&&!(0,k.ys)(e.permalink,t))}(e,t)))),[e,t])}function A(e){const t=(0,C.$z)(e,(e=>`${new Date(e.date).getFullYear()}`)),a=Object.entries(t);return a.reverse(),a}function P(e){let{items:t,ulClassName:a,liClassName:s,linkClassName:n,linkActiveClassName:i}=e;return(0,r.jsx)("ul",{className:a,children:t.map((e=>(0,r.jsx)("li",{className:s,children:(0,r.jsx)(v.A,{isNavLink:!0,to:e.permalink,className:n,activeClassName:i,children:e.title})},e.permalink)))})}},8027:(e,t,a)=>{a.d(t,{A:()=>O});var s=a(6540),n=a(4164),i=a(781),r=a(4581),l=a(1312),o=a(4096),c=a(6342),m=a(1107),d=a(4848);function u(e){let{year:t,yearGroupHeadingClassName:a,children:s}=e;return(0,d.jsxs)("div",{role:"group",children:[(0,d.jsx)(m.A,{as:"h3",className:a,children:t}),s]})}function g(e){let{items:t,yearGroupHeadingClassName:a,ListComponent:s}=e;if((0,c.p)().blog.sidebar.groupByYear){const e=(0,o.Ki)(t);return(0,d.jsx)(d.Fragment,{children:e.map((e=>{let[t,n]=e;return(0,d.jsx)(u,{year:t,yearGroupHeadingClassName:a,children:(0,d.jsx)(s,{items:n})},t)}))})}return(0,d.jsx)(s,{items:t})}const h=(0,s.memo)(g),p="sidebar_re4s",b="sidebarItemTitle_pO2u",f="sidebarItemList_Yudw",x="sidebarItem__DBe",j="sidebarItemLink_mo7H",N="sidebarItemLinkActive_I1ZP",v="yearGroupHeading_rMGB",C=e=>{let{items:t}=e;return(0,d.jsx)(o.OU,{items:t,ulClassName:(0,n.A)(f,"clean-list"),liClassName:x,linkClassName:j,linkActiveClassName:N})};function k(e){let{sidebar:t}=e;const a=(0,o.Gx)(t.items);return(0,d.jsx)("aside",{className:"col col--3",children:(0,d.jsxs)("nav",{className:(0,n.A)(p,"thin-scrollbar"),"aria-label":(0,l.T)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"}),children:[(0,d.jsx)("div",{className:(0,n.A)(b,"margin-bottom--md"),children:t.title}),(0,d.jsx)(h,{items:a,ListComponent:C,yearGroupHeadingClassName:v})]})})}const y=(0,s.memo)(k);var A=a(5600);const P={yearGroupHeading:"yearGroupHeading_QT03"},_=e=>{let{items:t}=e;return(0,d.jsx)(o.OU,{items:t,ulClassName:"menu__list",liClassName:"menu__list-item",linkClassName:"menu__link",linkActiveClassName:"menu__link--active"})};function w(e){let{sidebar:t}=e;const a=(0,o.Gx)(t.items);return(0,d.jsx)(h,{items:a,ListComponent:_,yearGroupHeadingClassName:P.yearGroupHeading})}function B(e){return(0,d.jsx)(A.GX,{component:w,props:e})}const G=(0,s.memo)(B);function H(e){let{sidebar:t}=e;const a=(0,r.l)();return t?.items.length?"mobile"===a?(0,d.jsx)(G,{sidebar:t}):(0,d.jsx)(y,{sidebar:t}):null}function O(e){const{sidebar:t,toc:a,children:s,...r}=e,l=t&&t.items.length>0;return(0,d.jsx)(i.A,{...r,children:(0,d.jsx)("div",{className:"container margin-vert--lg",children:(0,d.jsxs)("div",{className:"row",children:[(0,d.jsx)(H,{sidebar:t}),(0,d.jsx)("main",{className:(0,n.A)("col",{"col--7":l,"col--9 col--offset-1":!l}),children:s}),a&&(0,d.jsx)("div",{className:"col col--2",children:a})]})})})}},9158:(e,t,a)=>{a.r(t),a.d(t,{default:()=>b});a(6540);var s=a(4164),n=a(1312);const i=()=>(0,n.T)({id:"theme.tags.tagsPageTitle",message:"Tags",description:"The title of the tag list page"});var r=a(1213),l=a(7559),o=a(8027),c=a(6133),m=a(1107);const d={tag:"tag_Nnez"};var u=a(4848);function g(e){let{letterEntry:t}=e;return(0,u.jsxs)("article",{children:[(0,u.jsx)(m.A,{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)(c.A,{...e})},e.permalink)))}),(0,u.jsx)("hr",{})]})}function h(e){let{tags:t}=e;const a=function(e){const t={};return Object.values(e).forEach((e=>{const a=function(e){return e[0].toUpperCase()}(e.label);t[a]??=[],t[a].push(e)})),Object.entries(t).sort(((e,t)=>{let[a]=e,[s]=t;return a.localeCompare(s)})).map((e=>{let[t,a]=e;return{letter:t,tags:a.sort(((e,t)=>e.label.localeCompare(t.label)))}}))}(t);return(0,u.jsx)("section",{className:"margin-vert--lg",children:a.map((e=>(0,u.jsx)(g,{letterEntry:e},e.letter)))})}var p=a(1463);function b(e){let{tags:t,sidebar:a}=e;const n=i();return(0,u.jsxs)(r.e3,{className:(0,s.A)(l.G.wrapper.blogPages,l.G.page.blogTagsListPage),children:[(0,u.jsx)(r.be,{title:n}),(0,u.jsx)(p.A,{tag:"blog_tags_list"}),(0,u.jsxs)(o.A,{sidebar:a,children:[(0,u.jsx)(m.A,{as:"h1",children:n}),(0,u.jsx)(h,{tags:t})]})]})}},6133:(e,t,a)=>{a.d(t,{A:()=>l});a(6540);var s=a(4164),n=a(8774);const i={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var r=a(4848);function l(e){let{permalink:t,label:a,count:l,description:o}=e;return(0,r.jsxs)(n.A,{href:t,title:o,className:(0,s.A)(i.tag,l?i.tagWithCount:i.tagRegular),children:[a,l&&(0,r.jsx)("span",{children:l})]})}}}]); \ No newline at end of file diff --git a/assets/js/036cfcc4.98f88a4b.js b/assets/js/036cfcc4.98f88a4b.js new file mode 100644 index 00000000..15a645e6 --- /dev/null +++ b/assets/js/036cfcc4.98f88a4b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5997],{1854:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>i,contentTitle:()=>a,default:()=>d,frontMatter:()=>t,metadata:()=>l,toc:()=>A});var s=r(4848),o=r(8453);const t={sidebar_position:5},a="Guards",l={id:"guards",title:"Guards",description:"In this section, you will learn:",source:"@site/versioned_docs/version-3.4/guards.md",sourceDirName:".",slug:"/guards",permalink:"/LmcRbacMvc/docs/guards",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/versioned_docs/version-3.4/guards.md",tags:[],version:"3.4",sidebarPosition:5,frontMatter:{sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"Role providers",permalink:"/LmcRbacMvc/docs/role-providers"},next:{title:"Strategies",permalink:"/LmcRbacMvc/docs/strategies"}},i={},A=[{value:"What are guards and when should you use them?",id:"what-are-guards-and-when-should-you-use-them",level:2},{value:"Protection policy",id:"protection-policy",level:3},{value:"Built-in guards",id:"built-in-guards",level:2},{value:"RouteGuard",id:"routeguard",level:3},{value:"RoutePermissionsGuard",id:"routepermissionsguard",level:3},{value:"ControllerGuard",id:"controllerguard",level:3},{value:"ControllerPermissionsGuard",id:"controllerpermissionsguard",level:3},{value:"Security notice",id:"security-notice",level:3},{value:"Creating custom guards",id:"creating-custom-guards",level:2}];function c(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"guards",children:"Guards"})}),"\n",(0,s.jsx)(n.p,{children:"In this section, you will learn:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"What guards are"}),"\n",(0,s.jsx)(n.li,{children:"How to use and configure built-in guards"}),"\n",(0,s.jsx)(n.li,{children:"How to create custom guards"}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"what-are-guards-and-when-should-you-use-them",children:"What are guards and when should you use them?"}),"\n",(0,s.jsx)(n.p,{children:"Guards are listeners that are registered on a specific event of\nthe MVC workflow. They allow your application to quickly mark a request as unauthorized."}),"\n",(0,s.jsx)(n.p,{children:"Here is a simple workflow without guards:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Laminas Framework workflow without guards",src:r(1605).A+"",width:"920",height:"200"})}),"\n",(0,s.jsx)(n.p,{children:"And here is a simple workflow with a route guard:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Laminas Framework workflow with guards",src:r(7671).A+"",width:"1120",height:"1600"})}),"\n",(0,s.jsx)(n.p,{children:'RouteGuard and ControllerGuard are not aware of permissions but rather only think about "roles". For\ninstance, you may want to refuse access to each routes that begin by "admin/*" to all users that do not have the\n"admin" role.'}),"\n",(0,s.jsx)(n.p,{children:'If you want to protect a route for a set of permissions, you must use RoutePermissionsGuard. For instance,\nyou may want to grant access to a route "post/delete" only to roles having the "delete" permission.\nNote that in a RBAC system, a permission is linked to a role, not to a user.'}),"\n",(0,s.jsx)(n.p,{children:"Albeit simple to use, guards should not be the only protection in your application, and you should always\nprotect your services as well. The reason is that your business logic should be handled by your service. Protecting a given\nroute or controller does not mean that the service cannot be access from elsewhere (another action for instance)."}),"\n",(0,s.jsx)(n.h3,{id:"protection-policy",children:"Protection policy"}),"\n",(0,s.jsx)(n.p,{children:'By default, when a guard is added, it will perform a check only on the specified guard rules. Any route or controller\nthat is not specified in the rules will be "granted" by default. Therefore, the default is a "blacklist"\nmechanism.'}),"\n",(0,s.jsx)(n.p,{children:'However, you may want a more restrictive approach (also called "whitelist"). In this mode, once a guard is added,\nanything that is not explicitly added will be refused by default.'}),"\n",(0,s.jsx)(n.p,{children:'For instance, let\'s say you have two routes: "index" and "login". If you specify a route guard rule to allow "index"\nroute to "member" role, your "login" route will become defacto unauthorized to anyone, unless you add a new rule for\nallowing the route "login" to "member" role.'}),"\n",(0,s.jsx)(n.p,{children:"You can change it in LmcRbacMvc config, as follows:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"use LmcRbacMvc\\Guard\\GuardInterface;\n\nreturn [\n 'lmc_rbac' => [\n 'protection_policy' => GuardInterface::POLICY_DENY\n ]\n];\n"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"NOTE: this policy will block ANY route/controller (so it will also block any console routes or controllers). The\ndeny policy is much more secure, but it needs much more configuration to work with."}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"built-in-guards",children:"Built-in guards"}),"\n",(0,s.jsx)(n.p,{children:"LmcRbacMvc comes with four guards, in order of priority :"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"RouteGuard : protect a set of routes based on the identity roles"}),"\n",(0,s.jsx)(n.li,{children:"RoutePermissionsGuard : protect a set of routes based on roles permissions"}),"\n",(0,s.jsx)(n.li,{children:"ControllerGuard : protect a controllers and/or actions based on the identity roles"}),"\n",(0,s.jsx)(n.li,{children:"ControllerPermissionsGuard : protect a controllers and/or actions based on roles permissions"}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["All guards must be added in the ",(0,s.jsx)(n.code,{children:"guards"})," subkey:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n // Guards config here!\n ]\n ]\n];\n"})}),"\n",(0,s.jsx)(n.p,{children:"Because of the way Laminas Framework handles config, you can without problem define some rules in one module, and\nmore rules in another module. All the rules will be automatically merged."}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:'For your mental health, I recommend you to use either the route guard OR the controller guard, but not both. If\nyou decide to use both conjointly, I recommend you to set the protection policy to "allow" (otherwise, you will\nneed to define rules for every routes AND every controller, which can become quite frustrating!).'}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Please note that if your application uses both route and controller guards, route guards are always executed\n",(0,s.jsx)(n.strong,{children:"before"})," controller guards (they have a higher priority)."]}),"\n",(0,s.jsx)(n.h3,{id:"routeguard",children:"RouteGuard"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["The RouteGuard listens to the ",(0,s.jsx)(n.code,{children:"MvcEvent::EVENT_ROUTE"})," event with a priority of -5."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:'The RouteGuard allows your application to protect a route or a hierarchy of routes. You must provide an array of "key" => "value",\nwhere the key is a route pattern and the value is an array of role names:'}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\RouteGuard' => [\n 'admin*' => ['admin'],\n 'login' => ['guest']\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"Only one role in a rule needs to be matched (it is an OR condition)."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:'Those rules grant access to all admin routes to users that have the "admin" role, and grant access to the "login"\nroute to users that have the "guest" role (eg.: most likely unauthenticated users).'}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"The route pattern is not a regex. It only supports the wildcard (*) character, that replaces any segment."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"You can also use the wildcard character * for roles:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\RouteGuard' => [\n 'home' => ['*']\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsx)(n.p,{children:'This rule grants access to the "home" route to anyone.'}),"\n",(0,s.jsx)(n.p,{children:"Finally, you can also omit the roles array to completely block a route, for maintenance purpose for example :"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\RouteGuard' => [\n 'route_under_construction'\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsx)(n.p,{children:"This rule will be inaccessible."}),"\n",(0,s.jsx)(n.p,{children:"Note : this last example could be (and should be) written in a more explicit way :"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\RouteGuard' => [\n 'route_under_construction' => []\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsx)(n.h3,{id:"routepermissionsguard",children:"RoutePermissionsGuard"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["The RoutePermissionsGuard listens to the ",(0,s.jsx)(n.code,{children:"MvcEvent::EVENT_ROUTE"})," event with a priority of -8."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:'The RoutePermissionsGuard allows your application to protect a route or a hierarchy of routes. You must provide an array of "key" => "value",\nwhere the key is a route pattern and the value is an array of permission names:'}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\RoutePermissionsGuard' => [\n 'admin*' => ['admin'],\n 'post/manage' => ['post.update', 'post.delete']\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"By default, all permissions in a rule must be matched (an AND condition)."}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["In the previous example, one must have ",(0,s.jsx)(n.code,{children:"post.update"})," ",(0,s.jsx)(n.strong,{children:"AND"})," ",(0,s.jsx)(n.code,{children:"post.delete"})," permissions\nto access the ",(0,s.jsx)(n.code,{children:"post/manage"})," route. You can also specify an OR condition like so:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"use LmcRbacMvc\\Guard\\GuardInterface;\n\nreturn [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\RoutePermissionsGuard' => [\n 'post/manage' => [\n 'permissions' => ['post.update', 'post.delete'],\n 'condition' => GuardInterface::CONDITION_OR\n ]\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"Permissions are linked to roles, not to users"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:'Those rules grant access to all admin routes to roles that have the "admin" permission, and grant access to the\n"post/delete" route to roles that have the "post.delete" or "admin" permissions.'}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"The route pattern is not a regex. It only supports the wildcard (*) character, that replaces any segment."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"You can also use the wildcard character * for permissions:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\RoutePermissionsGuard' => [\n 'home' => ['*']\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsx)(n.p,{children:'This rule grants access to the "home" route to anyone.'}),"\n",(0,s.jsx)(n.p,{children:"Finally, you can also use an empty array to completly block a route, for maintenance purpose for example :"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\RoutePermissionsGuard' => [\n 'route_under_construction' => []\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsx)(n.p,{children:"This route will be inaccessible."}),"\n",(0,s.jsx)(n.h3,{id:"controllerguard",children:"ControllerGuard"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["The ControllerGuard listens to the ",(0,s.jsx)(n.code,{children:"MvcEvent::EVENT_ROUTE"})," event with a priority of -10."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"The ControllerGuard allows your application to protect a controller. You must provide an array of arrays:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\ControllerGuard' => [\n [\n 'controller' => 'MyController',\n 'roles' => ['guest', 'member']\n ]\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"Only one role in a rule need to be matched (it is an OR condition)."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:'Those rules grant access to each actions of the MyController controller to users that have either the "guest" or\n"member" roles.'}),"\n",(0,s.jsx)(n.p,{children:"As for RouteGuard, you can use a wildcard (*) character for roles."}),"\n",(0,s.jsx)(n.p,{children:"You can also specify optional actions, so that the rule only apply to one or several actions:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\ControllerGuard' => [\n [\n 'controller' => 'MyController',\n 'actions' => ['read', 'edit'],\n 'roles' => ['guest', 'member']\n ]\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsx)(n.p,{children:"You can combine a generic rule and a specific action rule for the same controller, as follows:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\ControllerGuard' => [\n [\n 'controller' => 'PostController',\n 'roles' => ['member']\n ],\n [\n 'controller' => 'PostController',\n 'actions' => ['delete'],\n 'roles' => ['admin']\n ]\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsx)(n.p,{children:'These rules grant access to each controller action to users that have the "member" role, but restrict the\n"delete" action to "admin" only.'}),"\n",(0,s.jsx)(n.h3,{id:"controllerpermissionsguard",children:"ControllerPermissionsGuard"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["The ControllerPermissionsGuard listens to the ",(0,s.jsx)(n.code,{children:"MvcEvent::EVENT_ROUTE"})," event with a priority of -13."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"The ControllerPermissionsGuard allows your application to protect a controller using permissions. You must provide an array of arrays:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\ControllerPermissionsGuard' => [\n [\n 'controller' => 'MyController',\n 'permissions' => ['post.update', 'post.delete']\n ]\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"All permissions in a rule must be matched (it is an AND condition)."}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["In the previous example, the user must have ",(0,s.jsx)(n.code,{children:"post.update"})," ",(0,s.jsx)(n.strong,{children:"AND"})," ",(0,s.jsx)(n.code,{children:"post.delete"})," permissions\nto access each action of the MyController controller."]}),"\n",(0,s.jsx)(n.p,{children:"As for all other guards, you can use a wildcard (*) character for permissions."}),"\n",(0,s.jsx)(n.p,{children:"The configuration rules are the same as for ControllerGuard."}),"\n",(0,s.jsx)(n.h3,{id:"security-notice",children:"Security notice"}),"\n",(0,s.jsxs)(n.p,{children:["RouteGuard and ControllerGuard listen to the ",(0,s.jsx)(n.code,{children:"MvcEvent::EVENT_ROUTE"})," event. Therefore, if you use the\n",(0,s.jsx)(n.code,{children:"forward"})," method in your controller, those guards will not intercept and check requests (because internally\nLaminas MVC does not trigger again a new MVC loop)."]}),"\n",(0,s.jsx)(n.p,{children:"Most of the time, this is not an issue, but you must be aware of it, and this is an additional reason why you\nshould always protect your services too."}),"\n",(0,s.jsx)(n.h2,{id:"creating-custom-guards",children:"Creating custom guards"}),"\n",(0,s.jsx)(n.p,{children:"LmcRbacMvc is flexible enough to allow you to create custom guards. Let's say we want to create a guard that will\nrefuse access based on an IP addresses blacklist."}),"\n",(0,s.jsx)(n.p,{children:"First create the guard:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"namespace Application\\Guard;\n\nuse Laminas\\Http\\Request as HttpRequest;\nuse Laminas\\Mvc\\MvcEvent;\nuse LmcRbacMvc\\Guard\\AbstractGuard;\n\nclass IpGuard extends AbstractGuard\n{\n const EVENT_PRIORITY = 100;\n\n /**\n * List of IPs to blacklist\n */\n protected $ipAddresses = [];\n\n /**\n * @param array $ipAddresses\n */\n public function __construct(array $ipAddresses)\n {\n $this->ipAddresses = $ipAddresses;\n }\n\n /**\n * @param MvcEvent $event\n * @return bool\n */\n public function isGranted(MvcEvent $event)\n {\n $request = $event->getRequest();\n\n if (!$request instanceof HttpRequest) {\n return true;\n }\n\n $clientIp = $_SERVER['REMOTE_ADDR'];\n\n return !in_array($clientIp, $this->ipAddresses);\n }\n}\n"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["Guards must implement ",(0,s.jsx)(n.code,{children:"LmcRbacMvc\\Guard\\GuardInterface"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["By default, guards are listening to the event ",(0,s.jsx)(n.code,{children:"MvcEvent::EVENT_ROUTE"})," with a priority of -5 (you can change the default\nevent to listen by overriding the ",(0,s.jsx)(n.code,{children:"EVENT_NAME"})," constant in your guard subclass). However, in this case, we don't\neven need to wait for the route to be matched, so we overload the ",(0,s.jsx)(n.code,{children:"EVENT_PRIORITY"})," constant to be executed earlier."]}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"isGranted"})," method simply retrieves the client IP address, and checks it against the blacklist."]}),"\n",(0,s.jsx)(n.p,{children:"However, for this to work, we must register the newly created guard with the guard plugin manager. To do so, add the\nfollowing code in your config:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guard_manager' => [\n 'factories' => [\n 'Application\\Guard\\IpGuard' => 'Application\\Factory\\IpGuardFactory'\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"guard_manager"})," config follows a conventional service manager configuration format."]}),"\n",(0,s.jsx)(n.p,{children:"Now, let's create the factory:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"namespace Application\\Factory;\n\nuse Application\\Guard\\IpGuard;\nuse Laminas\\ServiceManager\\Factory\\FactoryInterface;\nuse Laminas\\ServiceManager\\ServiceLocatorInterface;\n\nclass IpGuardFactory implements FactoryInterface\n{\n /**\n * {@inheritDoc}\n */\n public function __invoke(ContainerInterface $container, $requestedName, array $options = null)\n {\n if (null === $options) {\n $options = [];\n }\n return new IpGuard($options);\n }\n}\n"})}),"\n",(0,s.jsx)(n.p,{children:"In a real use case, you would likely fetched the blacklist from a database."}),"\n",(0,s.jsxs)(n.p,{children:["Now we just need to add the guard to the ",(0,s.jsx)(n.code,{children:"guards"})," option, so that LmcRbacMvc can execute the logic behind this guard. In\nyour config, add the following code:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'Application\\Guard\\IpGuard' => [\n '87.45.66.46',\n '65.87.35.43'\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The array of IP addresses will be passed to ",(0,s.jsx)(n.code,{children:"IpGuardFactory::__invoke"})," in the ",(0,s.jsx)(n.code,{children:"$options"})," parameter."]})]})}function d(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},7671:(e,n,r)=>{r.d(n,{A:()=>s});const s=r.p+"assets/images/workflow-with-guards-9421d2ccbded4218039d3c55d9e07d64.png"},1605:(e,n,r)=>{r.d(n,{A:()=>s});const s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA5gAAADICAYAAACNrk7XAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAABIAAAASABGyWs+AAAiB0lEQVR42u3df2hb98Hv8U/3qHCpeiFrp/SMJosaPCgpPt3DNgJxSm+pusuSQDo6MuSEQskKLWvd2+2PsY4nRb2so3+UkfjpNuhKYVQ2KylNIMrWJ+6TOyqHhSbcWaZueXAjjwysWnRLQdo/0u65f8hHleUjW5aO9D1Her/ggGUfSV/Z0sff7/n+kgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIBBE1k9ACDoyCsAQ+sm0wUAMHTikv67pNHV23slxVa/vkeS3eHj5iR9sPr1R5IWV7++JKksqWj6hQMInbjIKwDYEhqYAHohImmHpH2SRiTdLSlpulCSCpIuqlaJuyZpQdKS6UIBMIq8AgAf0cAE4IeYpG9K+p+S/ofauKqfSCQUi8UUi8W0d+9eSdK2bdu0Z8+ejgpw6dKl+teXL19WsVjUBx98oFwu187dZySdlfR/Jf1ZtR4EAIOJvAKAHqKBCaATbgXtmDa40m/btu655x4dOnRIu3bt0p133qkdO3YoEunv1KRyuaxisaiFhQVdu3ZNly5d0sWLF1UoFFrdJSfpLUnvSrosqdrXAgPwE3kFAH1EAxNAu0YlfUfSI/K44m9Zlo4cOaK9e/dq3759RipmW1Uul3Xt2jXNz8/r3Llzmp6ebnXqjKRfSPqj6C0AwoC8Iq8AAEAAjUo6IWlZktN4WJblpFIpJ5vNOqVSyRkU+XzeSafTTjKZdJpf8+pxQdIBSVHTfxwAa5BX5BUAAAigqKSn5FFJSyQSTjqddlZWVkzXq/qiUqk42WzWSaVSjmVZXpW3KUljYjsCwBTyirwCAAABNaZaBWRdJS2TyQzUVf9O5XK5VpW3ZdV6TuglAPqDvCKvAABAAEUkjUuaU9NwssnJyaG58t+JbDbrTExMtOoliJv+wwIDiLzqEHkFAAB6LapaRW3NsLJkMulks1nTdaFQKZVKTjqd9uoluKBaLwuA7pBXPiGvAACA39wegDWVi1QqxdV/H2SzWce27eaK25youAGdIK96iLwCAADdcCtq9R4Ad1gZc5X8l8/nvVZ1ZCga0B7yqo/IKwAAsFVjapqzlE6nnUqlYrpeM/BaVNxOisU1gFbIK0PIKwAAsJmYmlZZTKVS9AAYkMvlvIaijYvtAgAXeRUQ5BUAAPCyZt5SMplkzlIAZDKZ5sU15sQwNIC8CiDyCgAASLVegAtqmLfEKovBUqlUnFQq1dw78JToHcDwIa8CjrwCAGC4HVBDJWBiYoJ5SwGWz+ebh6HNqVbhBoYBeRUi5BUAAMMlooa5S5ZlOblcznR9BG2oVCrO5ORkc+/AAdNvKKCHyKuQIq8AABgOMTWsuEgvQDjl8/nmuU4nxRA0DB7yagCQVwAADK4xNVxJzmQypusd6EKlUmneIuCCGIKGwUFeDRDyCgCAwVNfddGyLCefz5uub8An6XS6sdK2LCptCD/yakCRVwAADIYTWv2HnkgkGGI2gLLZbPMQtDHTbzqgQ+TVgCOvAAAIt3plLZlMUlkbYCsrK1TaEHbk1ZAgrwAACJ81Ky+mUinT9Qn0QalUchKJBJU2hA15NYTIKwAAwoXK2pCqVCpU2hA25NWQIq8AAAiH+jAzKmvDiUobQoS8GnLkFQAAwUZlDY7jUGlDKJBXcByHvAIAIKgOiMoaGnhU2tgSAEFBXmEN8goYXjeZLgAAT6OScpKUSCR04cIF0+VBQJTLZY2MjKhQKEhSQdKIpLLpcmGokVfwRF4Bw+kLpgsAYJ2opP+QapW13//+96bLgwCJRqPK5XKyLEuSLElnVFu1EzCBvEJL5BUwnGhgAsFzRpJlWZampqYUifC/GGvFYjGdPn3avZmQ9JzpMmFonRF5hQ2QV8Dw+RfTBQCwxlOrh/7whz/o7rvvNl0eBNRXvvIVfelLX3J7jB6QNCPpuulyYaiQV2gLeQUAgBlxsUgGtqhhEY1l1YYrAv0QF3mFLSKvgOHAIj9AMEQkXZVk27atq1evMtQMbWlaRGNa0rjpMmHgkVfoCHkFDAfmYALBcESSLUlnz56lsoa2RaNRvfbaa+7NpNhvDr1HXqEj5BUwHGhgAuZFJaUlaXJyUvF43HR5EDIHDhxQMpl0b54WqzSid8grdIW8AgYfQ2QB86YkJS3L0vXr1+kNQEeKxaK2b9/u3nxa0r+bLhMGEnmFrpFXwGCjBxMwK67aMCGdPn2ayho6FovFlE6n3ZuTYgEN+C8u8go+IK+AwUYPJmDWlKSkbduam5szXRaEXLVa1c6dO90FNJ6X9ILpMmGgkFfwDXkFDK5h68GMiLH+CI64VnsDfvnLX5ouCwZAJBLRyy+/7N5MiV4B+Ccu8go+Iq8wRIau/TGoPZgRSXslPSjpbtU29bWazilIuijpI0nvSrosqWq64Bgq9AbAd/QKoEfIK/iOvMKAof0xoMYkndTq5s8dHCfFktnoj6hW33fZbNb03tcYMOl0ujHXhuqqKXqCvELPkFcYALQ/mgxKD2Zc0quSEj493oykxyUtmX5hGFgnJKUsy9Ly8rLpsmDANPUKHFWt9wnoFHmFniGvEGJxebQ/EomEHnvsMW3btk179uxZc4eFhQXduHFDr7/+umZmZpofj/ZHQERUC6JOrxhsdkyJq2nojWVJzuTkpOmLxxhQqVTKzTHGM6Jb5BV6irxCyKxrfySTSSebzTqVSqXt932lUnGy2ayTTCYHrv0R5h7MmKSc1o9t9ltBki2paPoFY2CMqvbeValUUjTKugbwX9M+c3eJK6LoDHmFniOvECJr2h+2beuNN97Q6OhoVw86Pz+vY8eOKZfLud8KdfsjrKvIjkmaV+8bl1p9jnkN2NhoGPV9qTaEgsoaeiUWi8m2bffmo6bLg9Air9Bz5BVCYkwNjctMJqO5ubmuG5eSNDo6qrm5OWUyGfdb1upz0f7okzH1bkjsZgd/ZPhhWZKTyWRMj0rCgGtYPIOJc+gUeYW+IK8QcPX2h2VZTj6f79lnIZ/PO5Zlhbr9EbYhsjHVehPvMPT8n6g2XCiU3dUIBIaboW+ahp1tF9mFrSGv0DfkFQKsPiw2kUjozJkzW8rDarW2C0kk0v60ynK5rIcffthdCCh0w2XDNEQ2otof11TjUqvPnVPIJ97CqPul2ph9KmvotaZhZw+ZLg9Ch7xC35BXCCi3/WFZlrVp47JcLmt+fl5TU1MaHx/Xvffeq5tvvlk333yz7r33Xj3zzDOamprS0tLShk8ajUZ15swZWZYlfT5clvZHD/RytdhOVpcFOjElVmNEHzWszkhuYavIK/QVeYUAqrc/NhsWm8lkmoe2bngkEglnZWVlw8fM5/O0P3ooLvONyuYjbvqXglBis3L0VTabbcwtYCvIK/QVeYWAiWv1/bjRPPRSqeS11UjbRzqd3vBzkclkQtf+CMsczAtq2sQ0AGbEEA5sTVxSXgr3fKalpSVdunTJ82e7du3S3r17N5xn4N5/cXFRkjQyMqJ9+/YpHo+vO3d2dlZ/+ctfdOTIEc/HLJfLOnv2rHbt2qWxsbH6+ZvZyvnuuWFVLpd16623ujdZ/h/tiqtHeVUul/XnP/9Z7777rm677Tbdf//92r1794bP0UlujI6Oeq7u2MvcaPWcrmq1qg8//FDz8/O6fPmyvvrVr2r37t365je/qVgs1vK1jI+Pb1i2rZ7Xzuvc7PzNXmsnyCsEzAVJCdu2NTfnvUXr7OysHnnkEX3yySddPdFmczvvvfdedwsT2h8+MblqLKvKwk9jWl19LMwaVvrzPCzLclKp1Lr7raysOIlEouX9ksmkUyqV1tzHvSLYijt0JJlMrjl/s2Mr57vnhpnILGxdT/KqYQhkW5+1bnJDkufws17nhm3bnr0d+XzesW275f0mJibWbdK+WQZ2el47r7Ob19oNkVcIhnr7I5fLeb5XS6WSc8cdd/jWrtiovpHL5fhs+OykzDckWx0nTf9yECrjGoAGi9vAbJ6LUCqV1sw/aKzYlUql+vcty3ImJyedUqnkrKysOKlUas3PGitYW21grqysOPl8vn64ldlUKrXm+27Z3MfPZDJrfu51bpg1VBLHO3zvYvj4nlfu59G9CFUqlZxSqeRks9l6I7Lx4lS3udGq/H7lhlcGTk5O1p+7sUyN86hs23bS6bRTKpXWPJ9Um5Pl9dlt9zPe7nmt8q4581o97srKSv21Nv/+u0VeISBOapMM7GZYbKtjo+GyDc9H+6NLEZlvRG52sKLTcBlT53/zgVgwo1UD0+XOFWisKE5MTNSv0HupVCr1Cmbj72erDcxWZW0V2K0qioOGhTOGVmDyyv0sJpNJz8aI25i0bbveI9ltbrj3b+5h63VuuJ+3xuf1akA3vxa3d7Pxfr1qYLZrs/Pd1+rnPF3yCj7pJv/q7Y9W7+2meZG+Hq2ypWmOcqDbH0HfpmSv6QIMSBnhn6ykimpXjzoKr9tuu830a+ipnTt3SpI+/fTT+vdOnTolSTpy5IjnfSKRiJ599llJ0s9+9jPTL2HgjIyMmC4CzAhMXp07d06SdOzYMc/51NFoVNevX9fc3Fx9DlK3ufHiiy/KsiwdP368vg9dP3zjG9+QJF27dk1SbX/H1b3s9OSTT7Z8LY888ogk6Y033uhbWbvlvj8+++wz3x6TvIJPusm/et1+79711fxyuazjx4/3rOCHDx/2LtTasgS6/RH0BuaDpgvQhmdNFwBGTGjr4fW922+/faD/eVarVf385z+X9HmlsFj8fF9gr6B23X///ZKkQqHQ93IvLCxoaWnJ8+hnxbRXdu3apdtvv12SvmO6LDDCeF5NT09L+vxz7qWx4elHbkSjUb322msqFAr60Y9+5Ofvs6Vyuayf/OQntV/g975X/55U20/UayEf13e+U/t4Xrx4seflbJV3W8m8crmsV199VdLGf9etIq/gs07y73/fcssteuKJJzwviF27dq2ndZVcLue5T2YkElEiUV/zNNBtpEB3r0q623QB2vAN0wWAcROrhySdkvSmpMuSmv9Lf+HTTz/V9u3bTZfXF7/97W81MjKiv/3tb/VVZd1KpG3b9UqhW7lKJpMbri4bjUZl23Y9WL1Wh+yVgwcPtvxZPp/va1l64c4773R7lP+b6bLAuL7nldtYTCQSba9G61duHDhwQIlEQqdOndKzzz6reDzu2+fZzcDFxUV99NFHkj7PwEQiUW9Muvno9lC24q7I2o+LbHfddVfLn3ll3tRUbbSq12udmJjwdZVh8go91G7+7f7HP/6h++67z/NB5ufne17QhYUFz6x67LHH3BERgW4jBb2B+YDpArRhp+kCIFDaDa/Qe/755z2/n81mPbf1+OCDDzZ9zJWVFUna8Cp/L6RSqZY9Nf0uC9BHfcmrW265RZLqw0S3wo/cmJqa0vbt23X48GFdvXp1wwbrVnhloGVZOn369JoM3LVrl6S10wa8uI3qfkin0y1/5vV7PHr06Lrv2bats2fPhv4CHIbWRvm3U5K2bdvmeUd3yH8vXblyRQcOHFj3/YYyBbqNFPQGpmW6AG0I+jBjmNMcXgOl+Sr3+Pi4pqen183F2bFjh6TakI9isdiyEri0tFS/ct98NXx+ft5zv7WFhQVJ3TcCH330USpJGHY9y6vGz3Orz3IzP3LDFYvFNDk5qaefflpvvvnmpntFtqsxA6vVqr7+9a8rl8vpzjvvXHOee/vUqVN6+eWXWzZw//jHP0pS4xC4ntnq78BxnPrX1WpVO3fudPfkAwZBc/59QZL27NnjeXI7F7669dZbb+nEiRPrvt9QpkC3kYLcOAp647eR6ZVsOfp3dGqii/uGwsmTtVWzjx8/vuZKfCQSkWXVcvD9999veX/3imBj5erYsWOSpLffftvzPr/4xS8kbTxHC+uY/gxxDGFeTUzUHrLVZ1mq9TSOj4+rWCx2lRtennjiCdm2raNHj66Z3+mXSCRSX5zn8OHDa+Yxuo1lSfrwww9bPsY777wjqXWlNigikYhOnz4tSXr88cd7/XSmP0Mc4T06tWH+VavVvlxcyeVy7cyHDmxbKcgNTAAhEovFlE6nVSgU1lU63MrI8ePHNTs7uy40i8VifRVId9EISfrWt74lqXYlr7lSuLS0VB9yt2/fPtMvH8AG3NVef/WrX+n8+fPrMmB+fl5Hjx7VxYsX60NqO80NL40NwGeeeaYnr3F0dFQTExPK5XL69a9/vea53SGpP/zhDzU7O7vuvvPz8/VVc1988cWelM9PY2NjSiaTmpmZqc/PBABXYFu+CtectZtMFwB908lVsZyktySlTBe+144cOaKXXnpJ09PT+sEPflCfh+RWRqanp7V//35ZlqWf/vSnuu2227S4uFify5RKpdYMVY1EIkqlUnr++ee1fft2JZNJHTp0SC+99FL9CuLExETXw1vdxTpaOXz4sK+LWBhGXg2PwORVPB6vf5YPHjwoy7L05JNPamRkRK+//nr9YlEul6t/1jrNjVbcBqDbkOuFF198UW+++aaefvppHTp0qF4uNxtnZmY0MzMj27b14x//WJJ0+fLlepkymYxn1rRqxDVnU7fntTrfy6uvvqqLFy/q6NGjeuihh3o1X528Qqd6kn+RSKS+sFgvJRKJduaLh6mtFCjLMt/FvtnxT9O/JPRVO++JZX2+FHa0+b6tNtANC3cT8lavw93E3LKsdRuqZzIZx7Ksdb8zy7KcXC7n+XilUsnJZDL1jcobj3Q67blpe3NZN9swfbMj7H8z92+i7oYNIXwCl1fZbHZdBliW5aRSqZYZsNXccD/XXkqlUv2xksmk5znt5kar3427Abtt22vyqVKpOJOTk55/B9u2PR9vs4xy7+PXea3Ob8X9XSUSCd/eI+QVfNJN/v1TkpPJZDzfoxMTEz1vX6RSqQ3zZbXsgRX0K0NTkpKmC7GJv0iKmy4E+qbVP7xpSW9Iel9ScaP7hn3bi3K5rGKxqB07drS8ulYsFlUul1ueU61W9de//lWSNnycVs8tqa3foXt+LBbzvBrvlnMzWyljEC0tLTVuSxD03Id/AptXbgZEo9G2e77azQ33c92q3O7PWz13u7mxURncPexandNulm2WUe7j+3Veq/M3KqP7Wv16n5BX8Ek3+bckaVc6nfZcEGtqaspzZWU/tVqRv+G5pyX5s2LZEDoh8z2Umx3/afqXhL5y/+4XJD2lrV1c+Kck509/+pNvV3qBdmQyGeeLX/wiIy6GD3mF0CGv4JNu8u8/JTnf//73Pd+jTb3sPTlKpZLnczeM5jrR5msxIuiL/LxrugBt+DfTBUBf2ZJulvSQpH9X7SpXu34nSR9//LHp14Ahc+PGDf3973+XVt+DGBrkFUKHvIJPusm/f5Ok3/zmN54rucbj8Z5uJ5RKpTxHT1Sr1cb9hAPdRgp6A/Oy6QIMSBnhn3l1Oal6cXHR9GvAkGl4z/m/PwOCjLxC6JBX8Ek3+Vev21++7F3N79XqybZt67nnnvMu1NqyBLr9EfQGZlXB3qD+lFjBCe07J0kfffSR6XJgyLz33nvul4H+h4RAIa9gBHmFAKi3P1555RXPE9yt2fx29uzZlnO7G8oS+PZHGCZPj0nKmi5EC/slzXb9KBgW9fey47A4HvrnppvqUW+rdlUX2Ax5BSPIKwREPQNzuZxGR0c9T3rooYcah612pdWiQlJtr1zbtt2bgW9/BL0HU6r9Av35y/lrRgH/4yJw/sv9wl09EOi1pvdawXR5EBrkFfqOvEKA1Nsfx44da3nSmTNnlEx2v+HFRo3LpjKEov0RhgamJD1uugAhKROCrajVf5jvv/++6bJgSDS81wpiThPaR16h78grBMzjUq0H8/z5854nRKNRTU1NdTxc1rZt5fP5DRuX58+fVy6XW1OmoAtLA3NJtf1egmJaW1uNCnBdlKQrV66YLgeGxDvvvON++abpsiB0yCv0FXmFgFnSavvj4MGD9T1fvYyPjyufzzcOY91UKpXS1atXN91n9uDBg+7N0LQ/wjAH0xWRdF2SZbgcBUk7FfDJtQisA5IylmVpeXnZdFkwBL785S+rUChI0kFJ57t8OAwX8gp9RV4hgOrtD8uytLi46LmFSKOlpSUtLCzoypUreuutt+q9j4lEQvfdd58efPBBfe1rX9v0ccrlskZGRtzPRKjaH2FqYEpSTLUJ33cYev5PJI2KYRvoXEzSiiStrKwoFouZLg8GWNOiALdKKpsuE0KFvELfkFcIsJiknCQrkUjozJkzmzYOG7l7abZaHdZLuVzWww8/7C4gVFBt0avQtD/CMkTWVZT0iMHnf0Qh+uMikIqqhZR+9zv2kEZvvf322+6XM6Kyhq0jr9A35BUCrCjpu5I0MzOjkZGRDYfLNotEIltqXC4tLWlkZKRxddrvivZHX4yp1pp3+nQUVp8T8MNTkhzbth2gVyqVimNZlpth412+ZzG8yCv0HHmFkBiTtKzV9kEmk/H9s5DJZBrbH8ui/dF3MTX8kXt4LK8+F+CXmFbfX7lczvT/dQyobDbbmGPtj+UB1iKv0HPkFUJkTfvDtm1fsjGXyzm2bQ9M+yNsQ2QbFVWb7NrL1WWnV5+Dbmn4qajVvZUahgQBvnrllVfcL6fFcDN0jrxCz5FXCJE17Y9cLifbtjU+Pq7Z2dn6fMt2VKtVzc7Oanx8XLZtN25FEvr2R9gW+WklLulVSQmfHm9GtX1mlky/MAysA5IyklQqlbY0WRzYzNLSku666y735n6FYFNmBBp5hZ4hrxBicXm0PxKJhB577DFt27ZNe/bsWXOHhYUF3bhxQ6+//nrjHEsX7Y+AGpN0Up0Phz0pxjqjPyJaHWIxOTlpenQSBkwqlXIzbc70Gx0DgbxCz5BXGAC0P5oMSg9ms4ikvZIelHS3pAe0fv/MgmqbSH8k6V1JlxWSvWUwMJ6SNGlZlq5fv76lFcaAVsrlsm699Vb3JnvJwS/kFXxHXmHA0P4YUpHVAwiCqFavXqXTadMXkTEgJiYmGhcIIO/gF/IKviOvMCSGrv0xqD2YQFiMS0pLzG1C95rmMtEbAL+RV/ANeQUMrjCvIgsMgjdVGy6h5557znRZEHKPP/64+2VOVNbgP/IKviGvgMFFDyZgXr1XIJ/PKx6Pmy4PQuj8+fM6ePCge9OWNG+6TBhI5BW6Rl4Bg40GJhAMc5LsRCKhCxcumC4LQqZarWrnzp0qFApSbf+scdNlwkAjr9Ax8goYfAyRBYLhsCTNzMxoamrKdFkQMo8++qhbWSuotocW0EvkFTpGXgGDjx5MIDhOSEpJ0srKimKxmOnyIASahpqxUAb6hbzClpFXwHCggQkER0TSVUm2bdu6evUqe81hQ8ViUbZtM9QMJpBX2BLyChge/2K6AADq/p+kP0j6X5988ok+++wzffvb3zZdJgRUtVrV/v379fHHH0u1oWYPSaqYLheGBnmFtpFXAACYNa7VDc0zmYzpfbARUA0blDuSRk2/aTG0yCtsirwCAMC8Ka3+M85ms6brBgiYVCrVWFljmBlMI6/QEnkFDB/mYALBFJH0e0kJy7KUy+VYRAOSpNnZWe3fv9+9+bykF0yXCUOPvIIn8goYTjQwgeCKScpJsqi0QVpXWZuR9G1JVdPlAkReoQl5BQwvGphAsK2ptC0uLioajZouEwygsoYQIK8gibwCht0XTBcAwIaKkr4rSYVCQQ8//LDK5bLpMqHPmiprBVFZQzCRVyCvANCDCYTEmKSsJDH8bLh4VNZs1SryQFCRV0OKvAIg0YMJhMWspP1SrWfAtm0Vi/zPHnRNlbWcqKwhHMirIUReAXDRwATCY12lbX5+3nSZ0CMvvPBC8xymr4vKGsKDvBoi5BUAAOEWk7Qs9p0bSJVKpXlT8guqbQMBhBF5NcDIKwAABkdM0pxW/6mnUimnUqmYrmugSysrK04ikWisrJ0QlTWEH3k1gMgrAAAGT0S1q8WOJCeRSDilUsl0nQMdymazjmVZjZW1cdNvMMBH5NUAIa8AABhsJ7T6T96yLIaghUylUnFSqVRjRW1Z0qjpNxXQI+RViJFXAAAMjzE1zHOamJhgCFoI5PN5x7bt5vlL7EyPQUdehRB5BQDA8ImqYQiaZVlOLpczXSeBh0ql4kxOTjZW1BhihmFDXoUEeQUAAMbVUBGYmJhgrlOA5HK55l6AOUlx028awBDyKsDIKwAA4IqpqXcgnU6brqsMtVKp5CSTyeZegKfEqosAeRUw5BUAAGhlXA1znWzbZlGNPiuVSs2LYjiSplSrVAP4HHllGHkFAADaEVHDyo1arbjl83nTdZmBVqlUnHQ63byU/7JqC5wA8EZeGUBeAQCATsRVuxJdr0AkEgl6CHy2QUVtXAwvA9oVF3nVc+QVAADwQ1xNFTd3KBpbBXSuxdAyR7XeGCpqQGfiIq98R14BAIBeiKup4mZZljM5OckqjluQy+W8FsNYVq2ixh5xgD/iIq+6Rl4BAIB+iEs6qaYr2clkkuFoLZRKJWdycrJ5+X6GlgG9Fxd5tSXkFQAAMCWq2jL09VUctdpLkEqlhn4T9FKp5GQyGSeRSHgNK7sgFsMA+om8Iq8AAECIjKlpOJoaKm/DMv9pZWVlo0rasmoVXJbvB8wir8grAAAQElFJB9SwCbqahqWl0+mB2UKgVCo52WzWSaVSXsPJGucqjZr+wwBYh7wirwAEwE2mCwAgNKKS7pd0TFLS64RkMqlDhw5pdHRUu3fvVjQa7DUjisWi3n//fV25ckXvvfeeZmZmvE4rSPqVpHclXZZUNV1uAJsir8grAIbQwATQiYikvZIelPSIJNvrJMuy9MADD2jfvn3avXu39uzZo1gs1veKXLFYVLlc1qVLl7S4uLhR5cw1Lemcaj0hxb4WFoDfyCsA6CMamAD8EJX0NUn/KumwpMRmd7BtW/fcc49isZj27t1b//6+ffs6KsClS5fqX587d06SdPHiRRUKhc3uWpB0UbUK2vzqAWBwkVcA0EM0MAH0SlzSnapV4vZJekCSZbhMOUn/R7WhY/OqVda44g8gLvIKAHxBAxNAv8VU60FwL/2PSLp79et71GL4Whtm9Hnl65Kkv0m6IWlh9ftl0y8cQOiQVwAAAAMqIjYEBxAO5BUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwqf8PNaKebFevR6UAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTMtMTEtMjRUMTQ6NDM6MzUrMDA6MDArZv70AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDEzLTExLTI0VDE0OjQzOjM1KzAwOjAwWjtGSAAAAABJRU5ErkJggg=="},8453:(e,n,r)=>{r.d(n,{R:()=>a,x:()=>l});var s=r(6540);const o={},t=s.createContext(o);function a(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(o):e.components||o:a(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/07642c9c.9ced579e.js b/assets/js/07642c9c.9ced579e.js new file mode 100644 index 00000000..089239ca --- /dev/null +++ b/assets/js/07642c9c.9ced579e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3555],{145:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>d,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var i=t(4848),o=t(8453);const s={title:"A Real World Example",sidebar_position:1},r=void 0,a={id:"Guides/example",title:"A Real World Example",description:"In this example we are going to create a very little real world application. We will create a controller",source:"@site/docs/Guides/example.md",sourceDirName:"Guides",slug:"/Guides/example",permalink:"/LmcRbacMvc/docs/next/Guides/example",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/docs/Guides/example.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"A Real World Example",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Plugins and Helpers",permalink:"/LmcRbacMvc/docs/next/plugins"},next:{title:"Custom Identity Providers",permalink:"/LmcRbacMvc/docs/next/Guides/identity-providers"}},c={},l=[{value:"Best practices",id:"best-practices",level:2},{value:"When using guards then?",id:"when-using-guards-then",level:3},{value:"A Real World Application Part 2 - Only delete your own Posts",id:"a-real-world-application-part-2---only-delete-your-own-posts",level:2},{value:"A Real World Application Part 3 - Admins can delete everything",id:"a-real-world-application-part-3---admins-can-delete-everything",level:2},{value:"A Real World Application Part 4 - Checking permissions in the view",id:"a-real-world-application-part-4---checking-permissions-in-the-view",level:2},{value:"Using LmcRbacMvc with Doctrine ORM",id:"using-lmcrbacmvc-with-doctrine-orm",level:2},{value:"How to deal with roles with lot of permissions?",id:"how-to-deal-with-roles-with-lot-of-permissions",level:2}];function h(e){const n={a:"a",blockquote:"blockquote",code:"code",h2:"h2",h3:"h3",p:"p",pre:"pre",strong:"strong",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.p,{children:["In this example we are going to create a very little real world application. We will create a controller\n",(0,i.jsx)(n.code,{children:"PostController"})," that interacts with a service called ",(0,i.jsx)(n.code,{children:"PostService"}),". For the sake of simplicity we will only\ncover the ",(0,i.jsx)(n.code,{children:"delete"}),"-methods of both parts."]}),"\n",(0,i.jsxs)(n.p,{children:["Let's start by creating a controller that has the ",(0,i.jsx)(n.code,{children:"PostService"})," as dependency:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"class PostController extends \\Laminas\\Mvc\\Controller\\AbstractActionController\n{\n protected PostService $postService;\n\n public function __construct(PostService $postService)\n {\n $this->postService = $postService;\n }\n\n // addAction(), editAction(), etc...\n\n public function deleteAction()\n {\n $id = $this->params()->fromRoute('id');\n\n $this->postService->deletePost($id);\n\n return $this->redirect()->toRoute('posts');\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Since we have a dependency, let's inject it using the ",(0,i.jsx)(n.code,{children:"ControllerManager"}),", we will do this inside our ",(0,i.jsx)(n.code,{children:"Module"})," class"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"class Module\n{\n public function getConfig()\n {\n return [\n 'controllers' => [\n 'factories' => [\n 'PostController' => function ($container) {\n return new PostController(\n $container->get('PostService')\n );\n },\n ],\n ],\n ];\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Now that we have this in place let us quickly define our ",(0,i.jsx)(n.code,{children:"PostService"}),". We will be using a Service that makes use\nof Doctrine, so we require a ",(0,i.jsx)(n.code,{children:"Doctrine\\Persistence\\ObjectManager"})," as dependency."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"use Doctrine\\Persistence\\ObjectManager;\n\nclass PostService\n{\n protected $objectManager;\n\n public function __construct(ObjectManager $objectManager)\n {\n $this->objectManager = $objectManager;\n }\n\n public function deletePost($id)\n {\n $post = $this->objectManager->find('Post', $id);\n $this->objectManager->remove($post);\n $this->objectManager->flush();\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["And for this one, too, let's quickly create the factory, again within our ",(0,i.jsx)(n.code,{children:"Module"})," class."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"class Module\n{\n // getAutoloaderConfig(), getConfig(), etc...\n\n public function getServiceConfig()\n {\n return [\n 'factories' => [\n 'PostService' => function($container) {\n return new PostService(\n $container->get('doctrine.entitymanager.orm_default')\n );\n }\n ]\n ];\n }\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"With this set up we can now cover some best practices."}),"\n",(0,i.jsx)(n.h2,{id:"best-practices",children:"Best practices"}),"\n",(0,i.jsx)(n.p,{children:"Ideally, you should not protect your applications using only guards (Route or Controller guards).\nThis leaves your application open for some undesired side-effects.\nAs a best practice you should protect all your services or controllers by injecting the authorization service.\nBut let's go step by step:"}),"\n",(0,i.jsx)(n.p,{children:"Assuming the application example above we can easily use LmcRbacMvc to protect our route using the following guard:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n \\Lmc\\Rbac\\Mvc\\Guard\\RouteGuard::class => [\n 'post/delete' => ['admin']\n ]\n ]\n ]\n];\n"})}),"\n",(0,i.jsx)(n.p,{children:'Now, any users that do not have the "admin" role will receive a 403 error (unauthorized) when trying to access\nthe "post/delete" route. However, this does not prevent the service (which should contain the actual logic in a properly\ndesign application) to be injected and used elsewhere in your code. For instance:'}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"class PostController\n{\n protected $postService;\n\n public function createAction()\n {\n // this action may have been reached through the \"forward\" method, hence bypassing guards\n $this->postService->deletePost('2');\n }\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"You see the issue!"}),"\n",(0,i.jsxs)(n.p,{children:["The solution is to inject the ",(0,i.jsx)(n.code,{children:"AuthorizationService"})," into your services and check for the\npermissions before doing anything wrong. So let's modify our previously created ",(0,i.jsx)(n.code,{children:"PostService"})," class"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"use Doctrine\\Persistence\\ObjectManager;\nuse Lmc\\Rbac\\Mvc\\Service\\AuthorizationService;\n\nclass PostService\n{\n protected $objectManager;\n\n protected $authorizationService;\n\n public function __construct(\n ObjectManager $objectManager,\n AuthorizationService $authorizationService\n ) {\n $this->objectManager = $objectManager;\n $this->authorizationService = $authorizationService;\n }\n\n public function deletePost($id)\n {\n // First check permission\n if (!$this->authorizationService->isGranted('deletePost')) {\n throw new UnauthorizedException('You are not allowed !');\n }\n\n $post = $this->objectManager->find('Post', $id);\n $this->objectManager->remove($post);\n $this->objectManager->flush();\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Since we now have an additional dependency we should inject it through our factory, again within our ",(0,i.jsx)(n.code,{children:"Module"})," class."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"class Module\n{\n // getAutoloaderConfig(), getConfig(), etc...\n\n public function getServiceConfig()\n {\n return [\n 'factories' => [\n 'PostService' => function($sm) {\n return new PostService(\n $sm->get('doctrine.entitymanager.orm_default'),\n $sm->get('Lmc\\Rbac\\Mvc\\Service\\AuthorizationService') // This is new!\n );\n }\n ]\n ];\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Alternatively, you can also protect your controllers using the ",(0,i.jsx)(n.code,{children:"isGranted"})," helper (you do not need to inject\nthe AuthorizationService then):"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"class PostController\n{\n protected $postService;\n\n public function createAction()\n {\n if (!$this->isGranted('deletePost')) {\n throw new UnauthorizedException('You are not allowed !');\n }\n\n $this->postService->deletePost('2');\n }\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"While protecting services is the more defensive way (because services are usually the last part of the logic flow),\nit is often complicated to deal with.\nIf your application is architectured correctly, it is often simpler to protect your controllers."}),"\n",(0,i.jsx)(n.h3,{id:"when-using-guards-then",children:"When using guards then?"}),"\n",(0,i.jsx)(n.p,{children:"In fact, you should see guards as a very efficient way to quickly reject access to a hierarchy of routes or a\nwhole controller. For instance, assuming you have the following route config:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"return [\n 'router' => [\n 'routes' => [\n 'admin' => [\n 'type' => 'Literal',\n 'options' => [\n 'route' => '/admin'\n ],\n 'may_terminate' => true,\n 'child_routes' => [\n 'users' => [\n 'type' => 'Literal',\n 'options' => [\n 'route' => '/users'\n ]\n ],\n 'invoices' => [\n 'type' => 'Literal',\n 'options' => [\n 'route' => '/invoices'\n ]\n ]\n ]\n ]\n ]\n ]\n};\n"})}),"\n",(0,i.jsx)(n.p,{children:"You can quickly reject access to all admin routes using the following guard:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'Lmc\\Rbac\\Mvc\\Guard\\RouteGuard' => [\n 'admin*' => ['admin']\n ]\n ]\n ]\n];\n"})}),"\n",(0,i.jsx)(n.h2,{id:"a-real-world-application-part-2---only-delete-your-own-posts",children:"A Real World Application Part 2 - Only delete your own Posts"}),"\n",(0,i.jsxs)(n.p,{children:["If you jumped straight to this section please notice that we assume you have the knowledge that we presented in the\nprevious example. In here we will cover a very common use case. Users of our Application should only have delete\npermissions to their own content. So let's quickly refresh our ",(0,i.jsx)(n.code,{children:"PostService"})," class:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"use Doctrine\\Persistence\\ObjectManager;\n\nclass PostService\n{\n protected $objectManager;\n\n protected $authorizationService;\n\n public function __construct(\n ObjectManager $objectManager,\n AuthorizationService $authorizationService\n ) {\n $this->objectManager = $objectManager;\n $this->authorizationService = $authorizationService;\n }\n\n public function deletePost($id)\n {\n // First check permission\n if (!$this->authorizationService->isGranted('deletePost')) {\n throw new UnauthorizedException('You are not allowed !');\n }\n\n $post = $this->objectManager->find('Post', $id);\n $this->objectManager->remove($post);\n $this->objectManager->flush();\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["As we can see, we check within our Service if the User of our Application is allowed to delete the post with a check\nagainst the ",(0,i.jsx)(n.code,{children:"deletePost"})," permission. Now how can we achieve that only a user who is the owner of the Post to be able to\ndelete his own post, but other users can't? We do not want to change our Service with more complex logic because this\nis not the task of such service. The Permission-System should handle this. And we can, for this we have the\n",(0,i.jsx)(n.code,{children:"AssertionPluginManager"})," and here is how to do it:"]}),"\n",(0,i.jsx)(n.p,{children:"First of all we need to write an Assertion. The Assertion will return a boolean statement about the current\nidentity being the owner of the post."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"namespace Your\\Namespace;\n\nuse Lmc\\Rbac\\Mvc\\Assertion\\AssertionInterface;\nuse Lmc\\Rbac\\Mvc\\Service\\AuthorizationService;\n\nclass MustBeAuthorAssertion implements AssertionInterface\n{\n /**\n * Check if this assertion is true\n *\n * @param AuthorizationService $authorization\n * @param mixed $post\n *\n * @return bool\n */\n public function assert(AuthorizationService $authorization, $post = null)\n {\n return $authorization->getIdentity() === $post->getAuthor();\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["This simple ",(0,i.jsx)(n.code,{children:"MustBeAuthorAssertion"})," will check against the current ",(0,i.jsx)(n.code,{children:"$authorization"}),' if it equals the identity of the\ncurrent context Author. The second parameter is called the "context". A context can be anything (an object, a scalar,\nan array...) and only makes sense in the context of the assertion.']}),"\n",(0,i.jsxs)(n.p,{children:["Imagine a user calls ",(0,i.jsx)(n.code,{children:"http://my.dom/post/delete/42"}),", so obviously he wants to delete the Post-Entity with ID#42. In\nthis case Entity#42 is our Context! If you're wondering how the context gets there, bare with me. We will get to\nthis later."]}),"\n",(0,i.jsxs)(n.p,{children:["Now that we have written the Assertion, we want to make sure that this assertion will always be called, whenever we\ncheck for the ",(0,i.jsx)(n.code,{children:"deletePost"})," permission. We don't want others to delete our previous content! For this we have the so\ncalled ",(0,i.jsx)(n.code,{children:"assertion_map"}),". In this map we glue ",(0,i.jsx)(n.code,{children:"assertions"})," and ",(0,i.jsx)(n.code,{children:"permissions"})," together."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"// config/autoload/lmc_rbac.global.php or wherever your LmcRbac configuration file is\nreturn [\n 'lmc_rbac' => [\n 'assertion_map' => [\n 'deletePost' => 'Your\\Namespace\\MustBeAuthorAssertion'\n ]\n ]\n];\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Now, whenever some test the ",(0,i.jsx)(n.code,{children:"deletePost"})," permission, it will automatically call the ",(0,i.jsx)(n.code,{children:"MustBeAuthorAssertion"})," from\nthe ",(0,i.jsx)(n.code,{children:"AssertionPluginManager"}),". This plugin manager is configured to automatically add unknown classes to an invokable.\nHowever, some assertions may need dependencies. You can manually configure the assertion plugin manager as\nshown below:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"// config/autoload/lmc_rbac.global.php or wherever your LmcRbac configuration file is\nreturn [\n 'lmc_rbac' => [\n // ... other rbac stuff\n 'assertion_manager' => [\n 'factories' => [\n 'AssertionWithDependency' => 'Your\\Namespace\\AssertionWithDependencyFactory'\n ]\n ]\n ]\n];\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Now we need to remember about the ",(0,i.jsx)(n.strong,{children:"context"}),". Somehow we need to let the ",(0,i.jsx)(n.code,{children:"AssertionPluginManager"})," know about our\ncontext. This is done by simply passing it to the ",(0,i.jsx)(n.code,{children:"isGranted()"})," method. For this we need to modify our Service\none last time."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"use Doctrine\\Persistence\\ObjectManager;\n\nclass PostService\n{\n protected $objectManager;\n\n protected $authorizationService;\n\n public function __construct(\n ObjectManager $objectManager,\n AuthorizationService $autorizationService\n ) {\n $this->objectManager = $objectManager;\n $this->authorizationService = $autorizationService;\n }\n\n public function deletePost($id)\n {\n // Note, we now need to query for the post of interest first!\n $post = $this->objectManager->find('Post', $id);\n\n // Check the permission now with a given context\n if (!$this->authorizationService->isGranted('deletePost', $post)) {\n throw new UnauthorizedException('You are not allowed !');\n }\n\n $this->objectManager->remove($post);\n $this->objectManager->flush();\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["And there you have it. The context is injected into the ",(0,i.jsx)(n.code,{children:"isGranted()"})," method and now the ",(0,i.jsx)(n.code,{children:"AssertionPluginManager"})," knows\nabout it and can do its thing. Note that in reality, after you have queried for the ",(0,i.jsx)(n.code,{children:"$post"})," you would check if ",(0,i.jsx)(n.code,{children:"$post"}),"\nis actually a real post. Because if it is an empty return value then you should throw an exception earlier without\nneeding to check against the permission."]}),"\n",(0,i.jsx)(n.h2,{id:"a-real-world-application-part-3---admins-can-delete-everything",children:"A Real World Application Part 3 - Admins can delete everything"}),"\n",(0,i.jsx)(n.p,{children:"Often, you want users with a specific role to be able to have full access to everything. For instance, admins could\ndelete all the posts, even if they don't own it."}),"\n",(0,i.jsxs)(n.p,{children:["However, with the previous assertion, even if the admin has the permission ",(0,i.jsx)(n.code,{children:"deletePost"}),", it won't work because\nthe assertion will evaluate to false."]}),"\n",(0,i.jsxs)(n.p,{children:["Actually, the answer is quite simple: deleting my own posts and deleting others' posts should be treated like\ntwo different permissions (it makes sense if you think about it). Therefore, admins will have the permission\n",(0,i.jsx)(n.code,{children:"deleteOthersPost"})," (as well as the permission ",(0,i.jsx)(n.code,{children:"deletePost"}),", because admin could write posts, too)."]}),"\n",(0,i.jsx)(n.p,{children:"The assertion must therefore be modified like this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"namespace Your\\Namespace;\n\nuse Lmc\\Rbac\\Mvc\\Assertion\\AssertionInterface;\nuse Lmc\\Rbac\\Mvc\\Service\\AuthorizationService;\n\nclass MustBeAuthorAssertion implements AssertionInterface\n{\n /**\n * Check if this assertion is true\n *\n * @param AuthorizationService $authorization\n * @param mixed $context\n *\n * @return bool\n */\n public function assert(AuthorizationService $authorization, $context = null)\n {\n if ($authorization->getIdentity() === $context->getAuthor()) {\n return true;\n }\n\n return $authorization->isGranted('deleteOthersPost');\n }\n}\n"})}),"\n",(0,i.jsx)(n.h2,{id:"a-real-world-application-part-4---checking-permissions-in-the-view",children:"A Real World Application Part 4 - Checking permissions in the view"}),"\n",(0,i.jsxs)(n.p,{children:["If some part of the view needs to be protected, you can use the shipped ",(0,i.jsx)(n.code,{children:"isGranted"})," view helper."]}),"\n",(0,i.jsxs)(n.p,{children:["For example, lets's say that only users with the permissions ",(0,i.jsx)(n.code,{children:"post.manage"})," will have a menu item to acces\nthe adminsitration panel :"]}),"\n",(0,i.jsx)(n.p,{children:"In your template post-index.phtml"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:'\n'})}),"\n",(0,i.jsxs)(n.p,{children:["You can even protect your menu item regarding a role, by using the ",(0,i.jsx)(n.code,{children:"hasRole"})," view helper :"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:'\n'})}),"\n",(0,i.jsxs)(n.p,{children:["In this last example, the menu item will be hidden for users who don't have the ",(0,i.jsx)(n.code,{children:"admin"})," role."]}),"\n",(0,i.jsx)(n.h2,{id:"using-lmcrbacmvc-with-doctrine-orm",children:"Using LmcRbacMvc with Doctrine ORM"}),"\n",(0,i.jsxs)(n.p,{children:["First your User entity class must implement ",(0,i.jsx)(n.code,{children:"Lmc\\Rbac\\Mvc\\Identity\\IdentityInterface"})," :"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:'use LmccUser\\Entity\\User as LmcUserEntity;\nuse Lmc\\Rbac\\Mvc\\Identity\\IdentityInterface;\nuse Doctrine\\ORM\\Mapping as ORM;\nuse Doctrine\\Common\\Collections\\ArrayCollection;\nuse Doctrine\\Common\\Collections\\Collection;\n\n/**\n * @ORM\\Entity\n * @ORM\\Table(name="user")\n */\nclass User extends LmcUserEntity implements IdentityInterface\n{\n /**\n * @var Collection\n * @ORM\\ManyToMany(targetEntity="HierarchicalRole")\n */\n private $roles;\n\n public function __construct()\n {\n $this->roles = new ArrayCollection();\n }\n\n /**\n * {@inheritDoc}\n */\n public function getRoles()\n {\n return $this->roles->toArray();\n }\n\n /**\n * Set the list of roles\n * @param Collection $roles\n */\n public function setRoles(Collection $roles)\n {\n $this->roles->clear();\n foreach ($roles as $role) {\n $this->roles[] = $role;\n }\n }\n\n /**\n * Add one role to roles list\n * @param \\Rbac\\Role\\RoleInterface $role\n */\n public function addRole(RoleInterface $role)\n {\n $this->roles[] = $role;\n }\n}\n'})}),"\n",(0,i.jsxs)(n.p,{children:["For this example we will use a more complex situation by using ",(0,i.jsx)(n.code,{children:"Rbac\\Role\\HierarchicalRoleInterface"})," so the second step is to create HierarchicalRole entity class"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:'class HierarchicalRole implements HierarchicalRoleInterface\n{\n /**\n * @var HierarchicalRoleInterface[]|\\Doctrine\\Common\\Collections\\Collection\n *\n * @ORM\\ManyToMany(targetEntity="HierarchicalRole")\n */\n protected $children;\n\n /**\n * @var PermissionInterface[]|\\Doctrine\\Common\\Collections\\Collection\n *\n * @ORM\\ManyToMany(targetEntity="Permission", indexBy="name", fetch="EAGER", cascade={"persist"})\n */\n protected $permissions;\n\n /**\n * Init the Doctrine collection\n */\n public function __construct()\n {\n $this->children = new ArrayCollection();\n $this->permissions = new ArrayCollection();\n }\n\n /**\n * {@inheritDoc}\n */\n public function addChild(HierarchicalRoleInterface $child)\n {\n $this->children[] = $child;\n }\n\n /*\n * Set the list of permission\n * @param Collection $permissions\n */\n public function setPermissions(Collection $permissions)\n {\n $this->permissions->clear();\n foreach ($permissions as $permission) {\n $this->permissions[] = $permission;\n }\n }\n\n /**\n * {@inheritDoc}\n */\n public function addPermission($permission)\n {\n if (is_string($permission)) {\n $permission = new Permission($permission);\n }\n\n $this->permissions[(string) $permission] = $permission;\n }\n\n /**\n * {@inheritDoc}\n */\n public function hasPermission($permission)\n {\n // This can be a performance problem if your role has a lot of permissions. Please refer\n // to the cookbook to an elegant way to solve this issue\n\n return isset($this->permissions[(string) $permission]);\n }\n\n /**\n * {@inheritDoc}\n */\n public function getChildren()\n {\n return $this->children->toArray();\n }\n\n /**\n * {@inheritDoc}\n */\n public function hasChildren()\n {\n return !$this->children->isEmpty();\n }\n}\n'})}),"\n",(0,i.jsx)(n.p,{children:"And the last step is to create a Permission entity class which is a very simple entity class. You don't have to do specific things!"}),"\n",(0,i.jsxs)(n.p,{children:["You can find all entity examples in this folder : ",(0,i.jsx)(n.a,{href:"https://github.com/LM-Commons/LmcRbacMvc/tree/master/data",children:"Example"})]}),"\n",(0,i.jsxs)(n.p,{children:["You need one more configuration step. Indeed, how can the RoleProvider retrieve your role and permissions? For this you need to configure ",(0,i.jsx)(n.code,{children:"LmcRbacMvc\\Role\\ObjectRepositoryRoleProvider"})," in your ",(0,i.jsx)(n.code,{children:"lmc_rbac.global.php"})," file :"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:" /**\n * Configuration for role provider\n */\n 'role_provider' => [\n 'LmcRbacMvc\\Role\\ObjectRepositoryRoleProvider' => [\n 'object_manager' => 'doctrine.entitymanager.orm_default', // alias for doctrine ObjectManager\n 'class_name' => 'User\\Entity\\HierarchicalRole', // FQCN for your role entity class\n 'role_name_property' => 'name', // Name to show\n ],\n ],\n"})}),"\n",(0,i.jsx)(n.p,{children:"Using DoctrineORM with LmcRbacMvc is very simple. You need to be aware of performance where there is a lot of permissions for roles."}),"\n",(0,i.jsx)(n.h2,{id:"how-to-deal-with-roles-with-lot-of-permissions",children:"How to deal with roles with lot of permissions?"}),"\n",(0,i.jsxs)(n.p,{children:["In very complex applications, your roles may have dozens of permissions. In the [/data/FlatRole.php.dist] entity\nwe provide, we configure the permissions association so that whenever a role is loaded, all of its permissions are also\nloaded in one query (notice the ",(0,i.jsx)(n.code,{children:'fetch="EAGER"'}),"):"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:'/**\n * @ORM\\ManyToMany(targetEntity="Permission", indexBy="name", fetch="EAGER")\n */\nprotected $permissions;\n'})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"hasPermission"})," method is therefore really simple:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"public function hasPermission($permission)\n{\n return isset($this->permissions[(string) $permission]);\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"However, with a lot of permissions, this method will quickly kill your database. What you can do is modfiy the Doctrine\nmapping so that the collection is not actually loaded:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:'/**\n * @ORM\\ManyToMany(targetEntity="Permission", indexBy="name", fetch="LAZY")\n */\nprotected $permissions;\n'})}),"\n",(0,i.jsxs)(n.p,{children:["Then, modify the ",(0,i.jsx)(n.code,{children:"hasPermission"})," method to use the Criteria API. The Criteria API is a Doctrine 2.2+ API that allows\nyour application to efficiently filter a collection without loading the whole collection:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"use Doctrine\\Common\\Collections\\Criteria;\n\npublic function hasPermission($permission)\n{\n $criteria = Criteria::create()->where(Criteria::expr()->eq('name', (string) $permission));\n $result = $this->permissions->matching($criteria);\n\n return count($result) > 0;\n}\n"})}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"NOTE: This is only supported starting from Doctrine ORM 2.5!"}),"\n"]})]})}function d(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>a});var i=t(6540);const o={},s=i.createContext(o);function r(e){const n=i.useContext(s);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(o):e.components||o:r(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0e384e19.07fd4970.js b/assets/js/0e384e19.07fd4970.js new file mode 100644 index 00000000..b5a14b79 --- /dev/null +++ b/assets/js/0e384e19.07fd4970.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3976],{619:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var i=t(4848),c=t(8453);const r={title:"Getting Started",sidebar_label:"Getting Started",sidebar_position:1},o=void 0,a={id:"intro",title:"Getting Started",description:"LmcRbacMvc is a companion component that extends the functionality of LmcRbac to provide Role-based Access Control",source:"@site/docs/intro.md",sourceDirName:".",slug:"/intro",permalink:"/LmcRbacMvc/docs/next/intro",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/docs/intro.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Getting Started",sidebar_label:"Getting Started",sidebar_position:1},sidebar:"tutorialSidebar",next:{title:"Guards",permalink:"/LmcRbacMvc/docs/next/guards"}},s={},d=[{value:"Extending LmcRbac",id:"extending-lmcrbac",level:2},{value:"Requirements",id:"requirements",level:2},{value:"Optional requirements",id:"optional-requirements",level:3},{value:"Installation",id:"installation",level:2},{value:"Quick Start",id:"quick-start",level:2},{value:"Specifying an identity provider",id:"specifying-an-identity-provider",level:3},{value:"Adding a guard",id:"adding-a-guard",level:2},{value:"Registering a strategy",id:"registering-a-strategy",level:2},{value:"Using the authorization service",id:"using-the-authorization-service",level:2}];function l(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,c.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"LmcRbacMvc is a companion component that extends the functionality of LmcRbac to provide Role-based Access Control\n(RBAC) for Laminas MVC applications."}),"\n",(0,i.jsx)(n.p,{children:"LmcRbacMvc provides additional features on top of LmcRbac that are suitable for a Laminas MVC application:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Guards that acts like a firewall allowing access to routes, controllers and actions to authorized users."}),"\n",(0,i.jsx)(n.li,{children:"Strategies to execute when unauthorized access occurs such as redirection and error responses"}),"\n",(0,i.jsx)(n.li,{children:"Extensions to LmcRbac Authorization service such as controller and view plugins"}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{title:"Important Note:",type:"tip",children:(0,i.jsxs)(n.p,{children:["If you are migrating from v3, there are breaking changes to take into account. See the ",(0,i.jsx)(n.a,{href:"/LmcRbacMvc/docs/next/Upgrading/upgrade",children:"Upgrading"})," section for details."]})}),"\n",(0,i.jsx)(n.h2,{id:"extending-lmcrbac",children:"Extending LmcRbac"}),"\n",(0,i.jsx)(n.p,{children:"LmcRbacMvc extends the functionality of LmcRbac to support Laminas MVC applications."}),"\n",(0,i.jsx)(n.p,{children:"It is highly recommended to first go through the concepts and usage of LmcRbac before using the functionalities of\nLmcRbacMvc."}),"\n",(0,i.jsx)(n.h2,{id:"requirements",children:"Requirements"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"PHP 8.1 or higher"}),"\n",(0,i.jsx)(n.li,{children:"LmcRbac v2 (installed by default)"}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"optional-requirements",children:"Optional requirements"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://github.com/LM-Commons/LmcRbacMvcDeveloperTools",children:"LmcRbacMvcDeveloperTools"}),": a companion component to Laminas Developer Tools to collect and display LmcRbcMvc data"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,i.jsx)(n.p,{children:"Install the module using Composer:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"$ composer require lm-commons/lmc-rbac-mvc:^4.0\n"})}),"\n",(0,i.jsxs)(n.p,{children:["You will be prompted by the ",(0,i.jsx)(n.code,{children:"laminas-component-installer"})," plugin to inject LM-Commons\\LmcRbacMvc."]}),"\n",(0,i.jsx)(n.admonition,{title:"Manual installation",type:"note",children:(0,i.jsxs)(n.p,{children:["Enable the module by adding ",(0,i.jsx)(n.code,{children:"Lmc\\Rbac\\Mvc"})," key to your ",(0,i.jsx)(n.code,{children:"application.config.php"})," or ",(0,i.jsx)(n.code,{children:"modules.config.php"})," file."]})}),"\n",(0,i.jsxs)(n.p,{children:["Customize the module by copy-pasting the ",(0,i.jsx)(n.code,{children:"lmc_rbac.global.php.dist"})," file to your ",(0,i.jsx)(n.code,{children:"config/autoload"})," folder."]}),"\n",(0,i.jsxs)(n.admonition,{type:"warning",children:[(0,i.jsxs)(n.p,{children:["LmcRbac and LmcRbacMvc share the same config key ",(0,i.jsx)(n.code,{children:"'lmc_rbac'"}),". Be careful when creating configuration files to avoid\noverriding configuration."]}),(0,i.jsx)(n.p,{children:"It is recommended that have one configuration file containing both LmcRbac and LmcRbacMvc configuration. This makes it\neasier to keep all configuration in one place."})]}),"\n",(0,i.jsx)(n.h2,{id:"quick-start",children:"Quick Start"}),"\n",(0,i.jsxs)(n.p,{children:["Before you start configuring LmcRbacMvc, you must set up LmcRbac first. Please follow the ",(0,i.jsx)(n.a,{href:"https://lm-commons.github.io/LmcRbac/docs/gettingstarted",children:"instructions"})," in LmcRbac\ndocumentation."]}),"\n",(0,i.jsx)(n.h3,{id:"specifying-an-identity-provider",children:"Specifying an identity provider"}),"\n",(0,i.jsxs)(n.p,{children:["By default, LmcRbacMvc internally uses the ",(0,i.jsx)(n.code,{children:"Laminas\\Authentication\\AuthenticationService"})," service key to retrieve the user (logged or\nnot). Therefore, you must implement and register this service in your application by providing a factory on your configuration."]}),"\n",(0,i.jsxs)(n.p,{children:["For example, in ",(0,i.jsx)(n.code,{children:"module.config.php"})," file:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"return [\n 'service_manager' => [\n 'factories' => [\n\t \\Laminas\\Authentication\\AuthenticationService::class => function($container) {\n\t // Create your authentication service!\n\t }\n\t ]\n ]\n];\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The identity given by ",(0,i.jsx)(n.code,{children:"Laminas\\Authentication\\AuthenticationService"})," must implement ",(0,i.jsx)(n.code,{children:"Lmc\\Rbac\\Identity\\IdentityInterface"}),"."]}),"\n",(0,i.jsx)(n.admonition,{type:"warning",children:(0,i.jsx)(n.p,{children:"Note that the default identity provided with Laminas does not implement this interface."})}),"\n",(0,i.jsxs)(n.admonition,{type:"tip",children:[(0,i.jsxs)(n.p,{children:["If you are also using the ",(0,i.jsx)(n.a,{href:"https://github.com/lm-commons/lmcuser",children:"LmcUser"})," package, then the ",(0,i.jsx)(n.code,{children:"Laminas\\Authentication\\AuthenticationService"})," will be\nprovided for you and there is no need to implement your own."]}),(0,i.jsx)(n.admonition,{type:"warning",children:(0,i.jsxs)(n.p,{children:["LmcUser's default User entity does not implement the ",(0,i.jsx)(n.code,{children:"IdentityInteface"})," that is required\nby LmcRbac."]})})]}),"\n",(0,i.jsxs)(n.p,{children:["LmcRbacMvc is flexible enough to use something other than the built-in ",(0,i.jsx)(n.code,{children:"AuthenticationService"}),", by specifying custom\nidentity providers. For more information, refer to the ",(0,i.jsx)(n.a,{href:"/LmcRbacMvc/docs/next/Guides/identity-providers",children:"Create a custom identity provider"}),"\nsection."]}),"\n",(0,i.jsx)(n.h2,{id:"adding-a-guard",children:"Adding a guard"}),"\n",(0,i.jsxs)(n.p,{children:["A guard allows your application to block access to routes and/or controllers using a simple syntax. For instance, this configuration\ngrants access to any route that begins with ",(0,i.jsx)(n.code,{children:"admin"})," (or is exactly ",(0,i.jsx)(n.code,{children:"admin"}),") to the ",(0,i.jsx)(n.code,{children:"admin"})," role only:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n\t 'Lmc\\Rbac\\Mvc\\Guard\\RouteGuard' => [\n 'admin*' => ['admin']\n\t ]\n ]\n ]\n];\n"})}),"\n",(0,i.jsxs)(n.p,{children:["LmcRbacMvc has several built-in guards, and you can also register your own guards. For more information, refer\n",(0,i.jsx)(n.a,{href:"/LmcRbacMvc/docs/next/guards#built-in-guards",children:"to this section"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"registering-a-strategy",children:"Registering a strategy"}),"\n",(0,i.jsxs)(n.p,{children:["When a guard blocks access to a route/controller, or if you throw the ",(0,i.jsx)(n.code,{children:"Lmc\\Rbac\\Mvc\\Exception\\UnauthorizedException"}),"\nexception in your service, LmcRbacMvc automatically performs some logic for you depending on the view strategy used."]}),"\n",(0,i.jsxs)(n.p,{children:['For instance, if you want LmcRbacMvc to automatically redirect all unauthorized requests to the "login" route,\nadd\nthe following code in the ',(0,i.jsx)(n.code,{children:"onBootstrap"})," method of your ",(0,i.jsx)(n.code,{children:"Module.php"})," class:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"public function onBootstrap(MvcEvent $event)\n{\n $app = $event->getApplication();\n $sm = $app->getServiceManager();\n $em = $app->getEventManager();\n \n $listener = $sm->get(\\Lmc\\Rbac\\Mvc\\View\\Strategy\\RedirectStrategy::class);\n $listener->attach($em);\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"or add the listener to 'listeners' config key in a configuration file:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"return [\n // other configs...\n \n 'listeners' => [\n \\Lmc\\Rbac\\Mvc\\View\\Strategy\\RedirectStrategy::class\n ],\n];\n"})}),"\n",(0,i.jsxs)(n.p,{children:["By default, ",(0,i.jsx)(n.code,{children:"RedirectStrategy"}),' redirects all unauthorized requests to a route named "login" when the user is not connected\nand to a route named "home" when the user is connected. This is entirely configurable.']}),"\n",(0,i.jsx)(n.admonition,{type:"warning",children:(0,i.jsxs)(n.p,{children:["For flexibility purposes, LmcRbacMvc ",(0,i.jsx)(n.strong,{children:"does not"})," register any strategy for you by default!"]})}),"\n",(0,i.jsxs)(n.p,{children:["For more information about built-in strategies, refer ",(0,i.jsx)(n.a,{href:"/LmcRbacMvc/docs/next/strategies#built-in-strategies",children:"to this section"}),"\nin the ",(0,i.jsx)(n.a,{href:"/LmcRbacMvc/docs/next/strategies",children:"Strategies"})," section."]}),"\n",(0,i.jsx)(n.h2,{id:"using-the-authorization-service",children:"Using the authorization service"}),"\n",(0,i.jsx)(n.p,{children:"With LmcRbac and LmcRbacMvc properly configured, you can inject the authorization service into any class and use it to\ncheck if the current identity is granted to do something."}),"\n",(0,i.jsx)(n.p,{children:"The LmcRbacMvc Authorization Service is a wrapper to the LmcRbac Authorization Service."}),"\n",(0,i.jsxs)(n.p,{children:["The difference is in the ",(0,i.jsx)(n.code,{children:"isGranted"})," method:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"public function isGranted(string $permission, mixed $context = null): bool;\n"})}),"\n",(0,i.jsx)(n.p,{children:"where the service will get the identity from the identity provider and there is no need to get it separately."}),"\n",(0,i.jsxs)(n.p,{children:["The authorization service can be retrieved from the container using the key ",(0,i.jsx)(n.code,{children:"Lmc\\Rbac\\Mvc\\Service\\AuthorizationServiceInterface"}),".\nOnce injected, you can use it as follows:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"use Lmc\\Rbac\\Mvc\\Exception\\UnauthorizedException;\n\nclass ActionController extends \\Laminas\\Mvc\\Controller\\AbstractActionController {\npublic function delete()\n{\n if (!$this->authorizationService->isGranted('delete')) {\n throw new UnauthorizedException();\n }\n\n // Delete the post\n}\n}\n"})})]})}function h(e={}){const{wrapper:n}={...(0,c.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>a});var i=t(6540);const c={},r=i.createContext(c);function o(e){const n=i.useContext(r);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(c):e.components||c:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0e384e19.bd8a3694.js b/assets/js/0e384e19.bd8a3694.js deleted file mode 100644 index fa4f9d07..00000000 --- a/assets/js/0e384e19.bd8a3694.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[976],{619:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>r,toc:()=>l});var o=i(4848),s=i(8453);const t={sidebar_position:1},a="Introduction",r={id:"intro",title:"Introduction",description:"LmcRbacMvc is a role-based access control Laminas MVC module to provide additional features on top of Laminas\\Permissions\\Rbac",source:"@site/docs/intro.md",sourceDirName:".",slug:"/intro",permalink:"/LmcRbacMvc/docs/intro",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/docs/intro.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",next:{title:"Requirements and Installation",permalink:"/LmcRbacMvc/docs/installation"}},c={},l=[{value:"Why should I use an authorization module?",id:"why-should-i-use-an-authorization-module",level:2},{value:"What is the Rbac model?",id:"what-is-the-rbac-model",level:2},{value:"How can I integrate LmcRbacMvc into my application?",id:"how-can-i-integrate-lmcrbacmvc-into-my-application",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"introduction",children:"Introduction"}),"\n",(0,o.jsx)(n.p,{children:"LmcRbacMvc is a role-based access control Laminas MVC module to provide additional features on top of Laminas\\Permissions\\Rbac"}),"\n",(0,o.jsxs)(n.p,{children:["LmcRbacMvc is part of the ",(0,o.jsx)(n.a,{href:"https://lm-commons.github.io",children:"LM-Commons"})," series of community developed packages for Laminas."]}),"\n",(0,o.jsx)(n.p,{children:"LM-Commons is a GitHub organization dedicated to the collaborative\nand community-driven long-term maintenance of packages & libraries based on the Laminas MVC and Components."}),"\n",(0,o.jsxs)(n.admonition,{type:"tip",children:[(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Important Note:"})}),(0,o.jsxs)(n.p,{children:["If you are migrating from ZfcRbac v2, there are breaking changes to take into account. See the ",(0,o.jsx)(n.a,{href:"/LmcRbacMvc/docs/installation#upgrade",children:"Upgrade"})," section for details."]})]}),"\n",(0,o.jsx)(n.h2,{id:"why-should-i-use-an-authorization-module",children:"Why should I use an authorization module?"}),"\n",(0,o.jsxs)(n.p,{children:["The authorization part of an application is an essential aspect of securing your application.\nWhile the ",(0,o.jsx)(n.em,{children:"authentication"})," part tells you who is using your website, the ",(0,o.jsx)(n.em,{children:"authorization"})," answers if the given identity has the permission to\nperform specific actions."]}),"\n",(0,o.jsx)(n.h2,{id:"what-is-the-rbac-model",children:"What is the Rbac model?"}),"\n",(0,o.jsxs)(n.p,{children:["Rbac stands for ",(0,o.jsx)(n.strong,{children:"role-based access control"}),". We use a very simple (albeit powerful) implementation of this model\nthrough the use of the ",(0,o.jsx)(n.a,{href:"https://github.com/zf-fr/rbac",children:"zf-fr/rbac"})," library."]}),"\n",(0,o.jsx)(n.p,{children:"The basic idea of Rbac is to use roles and permissions:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Users"})," can have one or many ",(0,o.jsx)(n.strong,{children:"Roles"})]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Roles"})," request access to ",(0,o.jsx)(n.strong,{children:"Permissions"})]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Permissions"})," are granted to ",(0,o.jsx)(n.strong,{children:"Roles"})]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"By default, LmcRbacMvc can be used for two kinds of Rbac model:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Flat RBAC model: in this model, roles cannot have children. This is ideal for smaller applications, as it is easier\nto understand, and the database design is simpler (no need for a join table)."}),"\n",(0,o.jsx)(n.li,{children:"Hierarchical RBAC model: in this model, roles can have child roles. When evaluating if a given role has a\npermission, this model also checks recursively if any of its child roles also have the permission."}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"how-can-i-integrate-lmcrbacmvc-into-my-application",children:"How can I integrate LmcRbacMvc into my application?"}),"\n",(0,o.jsx)(n.p,{children:"LmcRbacMvc offers multiple ways to protect your application:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Using ",(0,o.jsx)(n.strong,{children:"Guards"}),': these classes act as "firewalls" that block access to routes and/or controllers. Guards are usually\nconfigured using PHP arrays, and are executed early in the MVC dispatch process. Typically this happens right after\nthe route has been matched.']}),"\n",(0,o.jsxs)(n.li,{children:["Using ",(0,o.jsx)(n.strong,{children:"AuthorizationService"}),": a complementary method is to use the ",(0,o.jsx)(n.code,{children:"AuthorizationService"})," class and inject it into your\nservice classes to protect them from unwanted access."]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"While it is advised to use both methods to make your application even more secure, this is completely optional and you\ncan choose either of them independently."}),"\n",(0,o.jsx)(n.p,{children:"To find out about how you can easily make your existing application more secure, please refer to the following section:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"/LmcRbacMvc/docs/cookbook#a-real-world-application",children:"Cookbook: A real world example"})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>a,x:()=>r});var o=i(6540);const s={},t=o.createContext(s);function a(e){const n=o.useContext(t);return o.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:a(e.components),o.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1538.a265ec9d.js b/assets/js/1538.a265ec9d.js new file mode 100644 index 00000000..6a545fea --- /dev/null +++ b/assets/js/1538.a265ec9d.js @@ -0,0 +1 @@ +(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1538],{7293:(e,t,n)=>{"use strict";n.d(t,{A:()=>L});var s=n(6540),o=n(4848);function a(e){const{mdxAdmonitionTitle:t,rest:n}=function(e){const t=s.Children.toArray(e),n=t.find((e=>s.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),a=t.filter((e=>e!==n)),c=n?.props.children;return{mdxAdmonitionTitle:c,rest:a.length>0?(0,o.jsx)(o.Fragment,{children:a}):null}}(e.children),a=e.title??t;return{...e,...a&&{title:a},children:n}}var c=n(4164),r=n(1312),i=n(7559);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,o.jsx)("div",{className:(0,c.A)(i.G.common.admonition,i.G.common.admonitionType(t),l.admonition,n),children:s})}function u(e){let{icon:t,title:n}=e;return(0,o.jsxs)("div",{className:l.admonitionHeading,children:[(0,o.jsx)("span",{className:l.admonitionIcon,children:t}),n]})}function m(e){let{children:t}=e;return t?(0,o.jsx)("div",{className:l.admonitionContent,children:t}):null}function h(e){const{type:t,icon:n,title:s,children:a,className:c}=e;return(0,o.jsxs)(d,{type:t,className:c,children:[s||n?(0,o.jsx)(u,{title:s,icon:n}):null,(0,o.jsx)(m,{children:a})]})}function p(e){return(0,o.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,o.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,o.jsx)(p,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function x(e){return(0,o.jsx)(h,{...f,...e,className:(0,c.A)("alert alert--secondary",e.className),children:e.children})}function b(e){return(0,o.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,o.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 j={icon:(0,o.jsx)(b,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function g(e){return(0,o.jsx)(h,{...j,...e,className:(0,c.A)("alert alert--success",e.className),children:e.children})}function v(e){return(0,o.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,o.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 y={icon:(0,o.jsx)(v,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function N(e){return(0,o.jsx)(h,{...y,...e,className:(0,c.A)("alert alert--info",e.className),children:e.children})}function A(e){return(0,o.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,o.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 B={icon:(0,o.jsx)(A,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function k(e){return(0,o.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,o.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,o.jsx)(k,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const C={icon:(0,o.jsx)(A,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const E={...{note:x,tip:g,info:N,warning:function(e){return(0,o.jsx)(h,{...B,...e,className:(0,c.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,o.jsx)(h,{...w,...e,className:(0,c.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,o.jsx)(x,{title:"secondary",...e}),important:e=>(0,o.jsx)(N,{title:"important",...e}),success:e=>(0,o.jsx)(g,{title:"success",...e}),caution:function(e){return(0,o.jsx)(h,{...C,...e,className:(0,c.A)("alert alert--warning",e.className),children:e.children})}}};function L(e){const t=a(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,o.jsx)(n,{...t})}},4336:(e,t,n)=>{"use strict";n.d(t,{A:()=>x});n(6540);var s=n(4164),o=n(1312),a=n(7559),c=n(8774);const r={iconEdit:"iconEdit_Z9Sw"};var i=n(4848);function l(e){let{className:t,...n}=e;return(0,i.jsx)("svg",{fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,s.A)(r.iconEdit,t),"aria-hidden":"true",...n,children:(0,i.jsx)("g",{children:(0,i.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,i.jsxs)(c.A,{to:t,className:a.G.common.editThisPage,children:[(0,i.jsx)(l,{}),(0,i.jsx)(o.A,{id:"theme.common.editThisPage",description:"The link label to edit the current page",children:"Edit this page"})]})}var u=n(6266);function m(e){let{lastUpdatedAt:t}=e;const n=new Date(t),s=(0,u.i)({day:"numeric",month:"short",year:"numeric",timeZone:"UTC"}).format(n);return(0,i.jsx)(o.A,{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:n.toISOString(),itemProp:"dateModified",children:s})})},children:" on {date}"})}function h(e){let{lastUpdatedBy:t}=e;return(0,i.jsx)(o.A,{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 p(e){let{lastUpdatedAt:t,lastUpdatedBy:n}=e;return(0,i.jsxs)("span",{className:a.G.common.lastUpdated,children:[(0,i.jsx)(o.A,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t?(0,i.jsx)(m,{lastUpdatedAt:t}):"",byUser:n?(0,i.jsx)(h,{lastUpdatedBy:n}):""},children:"Last updated{atDate}{byUser}"}),!1]})}const f={lastUpdated:"lastUpdated_JAkA"};function x(e){let{className:t,editUrl:n,lastUpdatedAt:o,lastUpdatedBy:a}=e;return(0,i.jsxs)("div",{className:(0,s.A)("row",t),children:[(0,i.jsx)("div",{className:"col",children:n&&(0,i.jsx)(d,{editUrl:n})}),(0,i.jsx)("div",{className:(0,s.A)("col",f.lastUpdated),children:(o||a)&&(0,i.jsx)(p,{lastUpdatedAt:o,lastUpdatedBy:a})})]})}},5533:(e,t,n)=>{"use strict";n.d(t,{A:()=>ie});var s=n(6540),o=n(8453),a=n(5260),c=n(2303),r=n(4164),i=n(5293),l=n(6342);function d(){const{prism:e}=(0,l.p)(),{colorMode:t}=(0,i.G)(),n=e.theme,s=e.darkTheme||n;return"dark"===t?s:n}var u=n(7559),m=n(8426),h=n.n(m);const p=/title=(?["'])(?.*?)\1/,f=/\{(?<range>[\d,-]+)\}/,x={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}},b={...x,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:""}},j=Object.keys(x);function g(e,t){const n=e.map((e=>{const{start:n,end:s}=b[e];return`(?:${n}\\s*(${t.flatMap((e=>[e.line,e.block?.start,e.block?.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:o,metastring:a}=t;if(a&&f.test(a)){const e=a.match(f).groups.range;if(0===o.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${a}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const t=o[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 c=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return g(["js","jsBlock"],t);case"jsx":case"tsx":return g(["js","jsBlock","jsx"],t);case"html":return g(["js","jsBlock","html"],t);case"python":case"py":case"bash":return g(["bash"],t);case"markdown":case"md":return g(["html","jsx","bash"],t);case"tex":case"latex":case"matlab":return g(["tex"],t);case"lua":case"haskell":case"sql":return g(["lua"],t);case"wasm":return g(["wasm"],t);case"vb":case"vba":case"visual-basic":return g(["vb","rem"],t);case"vbnet":return g(["vbnet","rem"],t);case"batch":return g(["rem"],t);case"basic":return g(["rem","f90"],t);case"fsharp":return g(["js","ml"],t);case"ocaml":case"sml":return g(["ml"],t);case"fortran":return g(["f90"],t);case"cobol":return g(["cobol"],t);default:return g(j,t)}}(s,o),r=n.split("\n"),i=Object.fromEntries(o.map((e=>[e.className,{start:0,range:""}]))),l=Object.fromEntries(o.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),d=Object.fromEntries(o.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),u=Object.fromEntries(o.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let h=0;h<r.length;){const e=r[h].match(c);if(!e){h+=1;continue}const t=e.slice(1).find((e=>void 0!==e));l[t]?i[l[t]].range+=`${h},`:d[t]?i[d[t]].start=h:u[t]&&(i[u[t]].range+=`${i[u[t]].start}-${h-1},`),r.splice(h,1)}n=r.join("\n");const m={};return Object.entries(i).forEach((e=>{let[t,{range:n}]=e;h()(n).forEach((e=>{m[e]??=[],m[e].push(t)}))})),{lineClassNames:m,code:n}}const y={codeBlockContainer:"codeBlockContainer_Ckt0"};var N=n(4848);function A(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,o]=e;const a=t[s];a&&"string"==typeof o&&(n[a]=o)})),n}(d());return(0,N.jsx)(t,{...n,style:s,className:(0,r.A)(n.className,y.codeBlockContainer,u.G.common.codeBlock)})}const B={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function k(e){let{children:t,className:n}=e;return(0,N.jsx)(A,{as:"pre",tabIndex:0,className:(0,r.A)(B.codeBlockStandalone,"thin-scrollbar",n),children:(0,N.jsx)("code",{className:B.codeBlockLines,children:t})})}var w=n(9532);const C={attributes:!0,characterData:!0,childList:!0,subtree:!0};function E(e,t){const[n,o]=(0,s.useState)(),a=(0,s.useCallback)((()=>{o(e.current?.closest("[role=tabpanel][hidden]"))}),[e,o]);(0,s.useEffect)((()=>{a()}),[a]),function(e,t,n){void 0===n&&(n=C);const o=(0,w._q)(t),a=(0,w.Be)(n);(0,s.useEffect)((()=>{const t=new MutationObserver(o);return e&&t.observe(e,a),()=>t.disconnect()}),[e,o,a])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),a())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}var L=n(1765);const T={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function _(e){let{line:t,classNames:n,showLineNumbers:s,getLineProps:o,getTokenProps:a}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const c=o({line:t,className:(0,r.A)(n,s&&T.codeLine)}),i=t.map(((e,t)=>(0,N.jsx)("span",{...a({token:e})},t)));return(0,N.jsxs)("span",{...c,children:[s?(0,N.jsxs)(N.Fragment,{children:[(0,N.jsx)("span",{className:T.codeLineNumber}),(0,N.jsx)("span",{className:T.codeLineContent,children:i})]}):i,(0,N.jsx)("br",{})]})}var S=n(1312);function U(e){return(0,N.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,N.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 M(e){return(0,N.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,N.jsx)("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"})})}const z={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function I(e){let{code:t,className:n}=e;const[o,a]=(0,s.useState)(!1),c=(0,s.useRef)(void 0),i=(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"),o=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 a=document.getSelection(),c=a.rangeCount>0&&a.getRangeAt(0);n.append(s),s.select(),s.selectionStart=0,s.selectionEnd=e.length;let r=!1;try{r=document.execCommand("copy")}catch{}s.remove(),c&&(a.removeAllRanges(),a.addRange(c)),o&&o.focus()}(t),a(!0),c.current=window.setTimeout((()=>{a(!1)}),1e3)}),[t]);return(0,s.useEffect)((()=>()=>window.clearTimeout(c.current)),[]),(0,N.jsx)("button",{type:"button","aria-label":o?(0,S.T)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,S.T)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,S.T)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,r.A)("clean-btn",n,z.copyButton,o&&z.copyButtonCopied),onClick:i,children:(0,N.jsxs)("span",{className:z.copyButtonIcons,"aria-hidden":"true",children:[(0,N.jsx)(U,{className:z.copyButtonIcon}),(0,N.jsx)(M,{className:z.copyButtonSuccessIcon})]})})}function H(e){return(0,N.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,N.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 R={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function V(e){let{className:t,onClick:n,isEnabled:s}=e;const o=(0,S.T)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return(0,N.jsx)("button",{type:"button",onClick:n,className:(0,r.A)("clean-btn",t,s&&R.wordWrapButtonEnabled),"aria-label":o,title:o,children:(0,N.jsx)(H,{className:R.wordWrapButtonIcon,"aria-hidden":"true"})})}function $(e){let{children:t,className:n="",metastring:o,title:a,showLineNumbers:c,language:i}=e;const{prism:{defaultLanguage:u,magicComments:m}}=(0,l.p)(),h=function(e){return e?.toLowerCase()}(i??function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return t?.replace(/language-/,"")}(n)??u),f=d(),x=function(){const[e,t]=(0,s.useState)(!1),[n,o]=(0,s.useState)(!1),a=(0,s.useRef)(null),c=(0,s.useCallback)((()=>{const n=a.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[a,e]),r=(0,s.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=a.current,n=e>t||a.current.querySelector("code").hasAttribute("style");o(n)}),[a]);return E(a,r),(0,s.useEffect)((()=>{r()}),[e,r]),(0,s.useEffect)((()=>(window.addEventListener("resize",r,{passive:!0}),()=>{window.removeEventListener("resize",r)})),[r]),{codeBlockRef:a,isEnabled:e,isCodeScrollable:n,toggle:c}}(),b=function(e){return e?.match(p)?.groups.title??""}(o)||a,{lineClassNames:j,code:g}=v(t,{metastring:o,language:h,magicComments:m}),y=c??function(e){return Boolean(e?.includes("showLineNumbers"))}(o);return(0,N.jsxs)(A,{as:"div",className:(0,r.A)(n,h&&!n.includes(`language-${h}`)&&`language-${h}`),children:[b&&(0,N.jsx)("div",{className:B.codeBlockTitle,children:b}),(0,N.jsxs)("div",{className:B.codeBlockContent,children:[(0,N.jsx)(L.f4,{theme:f,code:g,language:h??"text",children:e=>{let{className:t,style:n,tokens:s,getLineProps:o,getTokenProps:a}=e;return(0,N.jsx)("pre",{tabIndex:0,ref:x.codeBlockRef,className:(0,r.A)(t,B.codeBlock,"thin-scrollbar"),style:n,children:(0,N.jsx)("code",{className:(0,r.A)(B.codeBlockLines,y&&B.codeBlockLinesWithNumbering),children:s.map(((e,t)=>(0,N.jsx)(_,{line:e,getLineProps:o,getTokenProps:a,classNames:j[t],showLineNumbers:y},t)))})})}}),(0,N.jsxs)("div",{className:B.buttonGroup,children:[(x.isEnabled||x.isCodeScrollable)&&(0,N.jsx)(V,{className:B.codeButton,onClick:()=>x.toggle(),isEnabled:x.isEnabled}),(0,N.jsx)(I,{className:B.codeButton,code:g})]})]})]})}function W(e){let{children:t,...n}=e;const o=(0,c.A)(),a=function(e){return s.Children.toArray(e).some((e=>(0,s.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),r="string"==typeof a?$:k;return(0,N.jsx)(r,{...n,children:a},String(o))}function D(e){return(0,N.jsx)("code",{...e})}var P=n(8774);var q=n(3427),G=n(1422);const O={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};function F(e){return!!e&&("SUMMARY"===e.tagName||F(e.parentElement))}function Z(e,t){return!!e&&(e===t||Z(e.parentElement,t))}function J(e){let{summary:t,children:n,...o}=e;(0,q.A)().collectAnchor(o.id);const a=(0,c.A)(),i=(0,s.useRef)(null),{collapsed:l,setCollapsed:d}=(0,G.u)({initialState:!o.open}),[u,m]=(0,s.useState)(o.open),h=s.isValidElement(t)?t:(0,N.jsx)("summary",{children:t??"Details"});return(0,N.jsxs)("details",{...o,ref:i,open:u,"data-collapsed":l,className:(0,r.A)(O.details,a&&O.isBrowser,o.className),onMouseDown:e=>{F(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const t=e.target;F(t)&&Z(t,i.current)&&(e.preventDefault(),l?(d(!1),m(!0)):d(!0))},children:[h,(0,N.jsx)(G.N,{lazy:!1,collapsed:l,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{d(e),m(!e)},children:(0,N.jsx)("div",{className:O.collapsibleContent,children:n})})]})}const Y={details:"details_b_Ee"},K="alert alert--info";function Q(e){let{...t}=e;return(0,N.jsx)(J,{...t,className:(0,r.A)(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)),o=(0,N.jsx)(N.Fragment,{children:t.filter((e=>e!==n))});return(0,N.jsx)(Q,{...e,summary:n,children:o})}var ee=n(1107);function te(e){return(0,N.jsx)(ee.A,{...e})}const ne={containsTaskList:"containsTaskList_mC6p"};function se(e){if(void 0!==e)return(0,r.A)(e,e?.includes("contains-task-list")&&ne.containsTaskList)}const oe={img:"img_ev3q"};var ae=n(7293),ce=n(418);const re={Head:a.A,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,N.jsx)(D,{...e}):(0,N.jsx)(W,{...e})},a:function(e){return(0,N.jsx)(P.A,{...e})},pre:function(e){return(0,N.jsx)(N.Fragment,{children:e.children})},ul:function(e){return(0,N.jsx)("ul",{...e,className:se(e.className)})},li:function(e){return(0,q.A)().collectAnchor(e.id),(0,N.jsx)("li",{...e})},img:function(e){return(0,N.jsx)("img",{decoding:"async",loading:"lazy",...e,className:(t=e.className,(0,r.A)(t,oe.img))});var t},h1:e=>(0,N.jsx)(te,{as:"h1",...e}),h2:e=>(0,N.jsx)(te,{as:"h2",...e}),h3:e=>(0,N.jsx)(te,{as:"h3",...e}),h4:e=>(0,N.jsx)(te,{as:"h4",...e}),h5:e=>(0,N.jsx)(te,{as:"h5",...e}),h6:e=>(0,N.jsx)(te,{as:"h6",...e}),admonition:ae.A,mermaid:ce.A};function ie(e){let{children:t}=e;return(0,N.jsx)(o.x,{components:re,children:t})}},6266:(e,t,n)=>{"use strict";n.d(t,{i:()=>o});var s=n(4586);function o(e){void 0===e&&(e={});const{i18n:{currentLocale:t}}=(0,s.A)(),n=function(){const{i18n:{currentLocale:e,localeConfigs:t}}=(0,s.A)();return t[e].calendar}();return new Intl.DateTimeFormat(t,{calendar:n,...e})}},8426:(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,o,a]=t;if(s&&a){s=parseInt(s),a=parseInt(a);const e=s<a?1:-1;"-"!==o&&".."!==o&&"\u2025"!==o||(a+=e);for(let t=s;t!==a;t+=e)n.push(t)}}return n}t.default=n,e.exports=n},8453:(e,t,n)=>{"use strict";n.d(t,{R:()=>c,x:()=>r});var s=n(6540);const o={},a=s.createContext(o);function c(e){const t=s.useContext(a);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(o):e.components||o:c(e.components),s.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/17896441.241f5da3.js b/assets/js/17896441.241f5da3.js deleted file mode 100644 index d30a326f..00000000 --- a/assets/js/17896441.241f5da3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[401],{2447:(e,n,t)=>{t.r(n),t.d(n,{default:()=>ae});var s=t(6540),a=t(1213),i=t(9532),l=t(4848);const o=s.createContext(null);function r(e){let{children:n,content:t}=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])}(t);return(0,l.jsx)(o.Provider,{value:a,children:n})}function c(){const e=(0,s.useContext)(o);if(null===e)throw new i.dV("DocProvider");return e}function d(){const{metadata:e,frontMatter:n,assets:t}=c();return(0,l.jsx)(a.be,{title:e.title,description:e.description,keywords:n.keywords,image:t.image??n.image})}var u=t(4164),m=t(4581),h=t(1312),v=t(9022);function b(e){const{previous:n,next:t}=e;return(0,l.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,h.T)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[n&&(0,l.jsx)(v.A,{...n,subLabel:(0,l.jsx)(h.A,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),t&&(0,l.jsx)(v.A,{...t,subLabel:(0,l.jsx)(h.A,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}function x(){const{metadata:e}=c();return(0,l.jsx)(b,{previous:e.previous,next:e.next})}var g=t(4586),p=t(8774),f=t(4070),j=t(7559),A=t(5597),C=t(2252);const L={unreleased:function(e){let{siteTitle:n,versionMetadata:t}=e;return(0,l.jsx)(h.A,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:n,versionLabel:(0,l.jsx)("b",{children:t.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function(e){let{siteTitle:n,versionMetadata:t}=e;return(0,l.jsx)(h.A,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:n,versionLabel:(0,l.jsx)("b",{children:t.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function N(e){const n=L[e.versionMetadata.banner];return(0,l.jsx)(n,{...e})}function _(e){let{versionLabel:n,to:t,onClick:s}=e;return(0,l.jsx)(h.A,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:n,latestVersionLink:(0,l.jsx)("b",{children:(0,l.jsx)(p.A,{to:t,onClick:s,children:(0,l.jsx)(h.A,{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 k(e){let{className:n,versionMetadata:t}=e;const{siteConfig:{title:s}}=(0,g.A)(),{pluginId:a}=(0,f.vT)({failfast:!0}),{savePreferredVersionName:i}=(0,A.g1)(a),{latestDocSuggestion:o,latestVersionSuggestion:r}=(0,f.HW)(a),c=o??(d=r).docs.find((e=>e.id===d.mainDocId));var d;return(0,l.jsxs)("div",{className:(0,u.A)(n,j.G.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,l.jsx)("div",{children:(0,l.jsx)(N,{siteTitle:s,versionMetadata:t})}),(0,l.jsx)("div",{className:"margin-top--md",children:(0,l.jsx)(_,{versionLabel:r.label,to:c.path,onClick:()=>i(r.name)})})]})}function T(e){let{className:n}=e;const t=(0,C.r)();return t.banner?(0,l.jsx)(k,{className:n,versionMetadata:t}):null}function H(e){let{className:n}=e;const t=(0,C.r)();return t.badge?(0,l.jsx)("span",{className:(0,u.A)(n,j.G.docs.docVersionBadge,"badge badge--secondary"),children:(0,l.jsx)(h.A,{id:"theme.docs.versionBadge.label",values:{versionLabel:t.label},children:"Version: {versionLabel}"})}):null}var M=t(2053),y=t(4336);function I(){const{metadata:e}=c(),{editUrl:n,lastUpdatedAt:t,lastUpdatedBy:s,tags:a}=e,i=a.length>0,o=!!(n||t||s);return i||o?(0,l.jsxs)("footer",{className:(0,u.A)(j.G.docs.docFooter,"docusaurus-mt-lg"),children:[i&&(0,l.jsx)("div",{className:(0,u.A)("row margin-top--sm",j.G.docs.docFooterTagsRow),children:(0,l.jsx)("div",{className:"col",children:(0,l.jsx)(M.A,{tags:a})})}),o&&(0,l.jsx)(y.A,{className:(0,u.A)("margin-top--sm",j.G.docs.docFooterEditMetaRow),editUrl:n,lastUpdatedAt:t,lastUpdatedBy:s})]}):null}var w=t(1422),E=t(5195);const B={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function O(e){let{collapsed:n,...t}=e;return(0,l.jsx)("button",{type:"button",...t,className:(0,u.A)("clean-btn",B.tocCollapsibleButton,!n&&B.tocCollapsibleButtonExpanded,t.className),children:(0,l.jsx)(h.A,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component",children:"On this page"})})}const V={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function G(e){let{toc:n,className:t,minHeadingLevel:s,maxHeadingLevel:a}=e;const{collapsed:i,toggleCollapsed:o}=(0,w.u)({initialState:!0});return(0,l.jsxs)("div",{className:(0,u.A)(V.tocCollapsible,!i&&V.tocCollapsibleExpanded,t),children:[(0,l.jsx)(O,{collapsed:i,onClick:o}),(0,l.jsx)(w.N,{lazy:!0,className:V.tocCollapsibleContent,collapsed:i,children:(0,l.jsx)(E.A,{toc:n,minHeadingLevel:s,maxHeadingLevel:a})})]})}const R={tocMobile:"tocMobile_ITEo"};function S(){const{toc:e,frontMatter:n}=c();return(0,l.jsx)(G,{toc:e,minHeadingLevel:n.toc_min_heading_level,maxHeadingLevel:n.toc_max_heading_level,className:(0,u.A)(j.G.docs.docTocMobile,R.tocMobile)})}var P=t(7763);function F(){const{toc:e,frontMatter:n}=c();return(0,l.jsx)(P.A,{toc:e,minHeadingLevel:n.toc_min_heading_level,maxHeadingLevel:n.toc_max_heading_level,className:j.G.docs.docTocDesktop})}var U=t(1107),D=t(5533);function z(e){let{children:n}=e;const t=function(){const{metadata:e,frontMatter:n,contentTitle:t}=c();return n.hide_title||void 0!==t?null:e.title}();return(0,l.jsxs)("div",{className:(0,u.A)(j.G.docs.docMarkdown,"markdown"),children:[t&&(0,l.jsx)("header",{children:(0,l.jsx)(U.A,{as:"h1",children:t})}),(0,l.jsx)(D.A,{children:n})]})}var W=t(1754),q=t(9169),$=t(6025);function Q(e){return(0,l.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,l.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 X={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function Y(){const e=(0,$.Ay)("/");return(0,l.jsx)("li",{className:"breadcrumbs__item",children:(0,l.jsx)(p.A,{"aria-label":(0,h.T)({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,l.jsx)(Q,{className:X.breadcrumbHomeIcon})})})}const Z={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function J(e){let{children:n,href:t,isLast:s}=e;const a="breadcrumbs__link";return s?(0,l.jsx)("span",{className:a,itemProp:"name",children:n}):t?(0,l.jsx)(p.A,{className:a,href:t,itemProp:"item",children:(0,l.jsx)("span",{itemProp:"name",children:n})}):(0,l.jsx)("span",{className:a,children:n})}function K(e){let{children:n,active:t,index:s,addMicrodata:a}=e;return(0,l.jsxs)("li",{...a&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},className:(0,u.A)("breadcrumbs__item",{"breadcrumbs__item--active":t}),children:[n,(0,l.jsx)("meta",{itemProp:"position",content:String(s+1)})]})}function ee(){const e=(0,W.OF)(),n=(0,q.Dt)();return e?(0,l.jsx)("nav",{className:(0,u.A)(j.G.docs.docBreadcrumbs,Z.breadcrumbsContainer),"aria-label":(0,h.T)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,l.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[n&&(0,l.jsx)(Y,{}),e.map(((n,t)=>{const s=t===e.length-1,a="category"===n.type&&n.linkUnlisted?void 0:n.href;return(0,l.jsx)(K,{active:s,index:t,addMicrodata:!!a,children:(0,l.jsx)(J,{href:a,isLast:s,children:n.label})},t)}))]})}):null}var ne=t(996);const te={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function se(e){let{children:n}=e;const t=function(){const{frontMatter:e,toc:n}=c(),t=(0,m.l)(),s=e.hide_table_of_contents,a=!s&&n.length>0;return{hidden:s,mobile:a?(0,l.jsx)(S,{}):void 0,desktop:!a||"desktop"!==t&&"ssr"!==t?void 0:(0,l.jsx)(F,{})}}(),{metadata:{unlisted:s}}=c();return(0,l.jsxs)("div",{className:"row",children:[(0,l.jsxs)("div",{className:(0,u.A)("col",!t.hidden&&te.docItemCol),children:[s&&(0,l.jsx)(ne.A,{}),(0,l.jsx)(T,{}),(0,l.jsxs)("div",{className:te.docItemContainer,children:[(0,l.jsxs)("article",{children:[(0,l.jsx)(ee,{}),(0,l.jsx)(H,{}),t.mobile,(0,l.jsx)(z,{children:n}),(0,l.jsx)(I,{})]}),(0,l.jsx)(x,{})]})]}),t.desktop&&(0,l.jsx)("div",{className:"col col--3",children:t.desktop})]})}function ae(e){const n=`docs-doc-id-${e.content.metadata.id}`,t=e.content;return(0,l.jsx)(r,{content:e.content,children:(0,l.jsxs)(a.e3,{className:n,children:[(0,l.jsx)(d,{}),(0,l.jsx)(se,{children:(0,l.jsx)(t,{})})]})})}},9022:(e,n,t)=>{t.d(n,{A:()=>l});t(6540);var s=t(4164),a=t(8774),i=t(4848);function l(e){const{permalink:n,title:t,subLabel:l,isNext:o}=e;return(0,i.jsxs)(a.A,{className:(0,s.A)("pagination-nav__link",o?"pagination-nav__link--next":"pagination-nav__link--prev"),to:n,children:[l&&(0,i.jsx)("div",{className:"pagination-nav__sublabel",children:l}),(0,i.jsx)("div",{className:"pagination-nav__label",children:t})]})}},7763:(e,n,t)=>{t.d(n,{A:()=>c});t(6540);var s=t(4164),a=t(5195);const i={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var l=t(4848);const o="table-of-contents__link toc-highlight",r="table-of-contents__link--active";function c(e){let{className:n,...t}=e;return(0,l.jsx)("div",{className:(0,s.A)(i.tableOfContents,"thin-scrollbar",n),children:(0,l.jsx)(a.A,{...t,linkClassName:o,linkActiveClassName:r})})}},5195:(e,n,t)=>{t.d(n,{A:()=>b});var s=t(6540),a=t(6342);function i(e){const n=e.map((e=>({...e,parentIndex:-1,children:[]}))),t=Array(7).fill(-1);n.forEach(((e,n)=>{const s=t.slice(2,e.level);e.parentIndex=Math.max(...s),t[e.level]=n}));const s=[];return n.forEach((e=>{const{parentIndex:t,...a}=e;t>=0?n[t].children.push(a):s.push(a)})),s}function l(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:s}=e;return n.flatMap((e=>{const n=l({toc:e.children,minHeadingLevel:t,maxHeadingLevel:s});return function(e){return e.level>=t&&e.level<=s}(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){let{anchorTopOffset:t}=n;const s=e.find((e=>o(e).top>=t));if(s){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(o(s))?s:e[e.indexOf(s)-1]??null}return e[e.length-1]??null}function c(){const e=(0,s.useRef)(0),{navbar:{hideOnScroll:n}}=(0,a.p)();return(0,s.useEffect)((()=>{e.current=n?0:document.querySelector(".navbar").clientHeight}),[n]),e}function d(e){const n=(0,s.useRef)(void 0),t=c();(0,s.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:s,linkActiveClassName:a,minHeadingLevel:i,maxHeadingLevel:l}=e;function o(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(s),o=function(e){let{minHeadingLevel:n,maxHeadingLevel:t}=e;const s=[];for(let a=n;a<=t;a+=1)s.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(s.join()))}({minHeadingLevel:i,maxHeadingLevel:l}),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(a),e.classList.add(a),n.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,t])}var u=t(8774),m=t(4848);function h(e){let{toc:n,className:t,linkClassName:s,isChild:a}=e;return n.length?(0,m.jsx)("ul",{className:a?void 0:t,children:n.map((e=>(0,m.jsxs)("li",{children:[(0,m.jsx)(u.A,{to:`#${e.id}`,className:s??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,m.jsx)(h,{isChild:!0,toc:e.children,className:t,linkClassName:s})]},e.id)))}):null}const v=s.memo(h);function b(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,...h}=e;const b=(0,a.p)(),x=c??b.tableOfContents.minHeadingLevel,g=u??b.tableOfContents.maxHeadingLevel,p=function(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:a}=e;return(0,s.useMemo)((()=>l({toc:i(n),minHeadingLevel:t,maxHeadingLevel:a})),[n,t,a])}({toc:n,minHeadingLevel:x,maxHeadingLevel:g});return d((0,s.useMemo)((()=>{if(o&&r)return{linkClassName:o,linkActiveClassName:r,minHeadingLevel:x,maxHeadingLevel:g}}),[o,r,x,g])),(0,m.jsx)(v,{toc:p,className:t,linkClassName:o,...h})}},6133:(e,n,t)=>{t.d(n,{A:()=>o});t(6540);var s=t(4164),a=t(8774);const i={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var l=t(4848);function o(e){let{permalink:n,label:t,count:o,description:r}=e;return(0,l.jsxs)(a.A,{href:n,title:r,className:(0,s.A)(i.tag,o?i.tagWithCount:i.tagRegular),children:[t,o&&(0,l.jsx)("span",{children:o})]})}},2053:(e,n,t)=>{t.d(n,{A:()=>r});t(6540);var s=t(4164),a=t(1312),i=t(6133);const l={tags:"tags_jXut",tag:"tag_QGVx"};var o=t(4848);function r(e){let{tags:n}=e;return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("b",{children:(0,o.jsx)(a.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,o.jsx)("ul",{className:(0,s.A)(l.tags,"padding--none","margin-left--sm"),children:n.map((e=>(0,o.jsx)("li",{className:l.tag,children:(0,o.jsx)(i.A,{...e})},e.permalink)))})]})}},996:(e,n,t)=>{t.d(n,{A:()=>h});t(6540);var s=t(4164),a=t(1312),i=t(5260),l=t(4848);function o(){return(0,l.jsx)(a.A,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function r(){return(0,l.jsx)(a.A,{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,l.jsx)(i.A,{children:(0,l.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}var d=t(7559),u=t(7293);function m(e){let{className:n}=e;return(0,l.jsx)(u.A,{type:"caution",title:(0,l.jsx)(o,{}),className:(0,s.A)(n,d.G.common.unlistedBanner),children:(0,l.jsx)(r,{})})}function h(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(c,{}),(0,l.jsx)(m,{...e})]})}}}]); \ No newline at end of file diff --git a/assets/js/17896441.f73ac772.js b/assets/js/17896441.f73ac772.js new file mode 100644 index 00000000..354feae9 --- /dev/null +++ b/assets/js/17896441.f73ac772.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8401],{2234:(e,t,n)=>{n.d(t,{A:()=>c});n(6540);var s=n(4164),a=n(4084),i=n(7559),l=n(7293),o=n(4848);function r(e){let{className:t}=e;return(0,o.jsx)(l.A,{type:"caution",title:(0,o.jsx)(a.Rc,{}),className:(0,s.A)(t,i.G.common.unlistedBanner),children:(0,o.jsx)(a.Uh,{})})}function c(e){return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(a.AE,{}),(0,o.jsx)(r,{...e})]})}},1689:(e,t,n)=>{n.d(t,{A:()=>d});n(6540);var s=n(4164),a=n(4084),i=n(7559),l=n(7293),o=n(4848);function r(e){let{className:t}=e;return(0,o.jsx)(l.A,{type:"caution",title:(0,o.jsx)(a.Yh,{}),className:(0,s.A)(t,i.G.common.draftBanner),children:(0,o.jsx)(a.TT,{})})}var c=n(2234);function d(e){let{metadata:t}=e;const{unlisted:n,frontMatter:s}=t;return(0,o.jsxs)(o.Fragment,{children:[(n||s.unlisted)&&(0,o.jsx)(c.A,{}),s.draft&&(0,o.jsx)(r,{})]})}},575:(e,t,n)=>{n.r(t),n.d(t,{default:()=>ae});var s=n(6540),a=n(1213),i=n(9532),l=n(4848);const o=s.createContext(null);function r(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,l.jsx)(o.Provider,{value:a,children:t})}function c(){const e=(0,s.useContext)(o);if(null===e)throw new i.dV("DocProvider");return e}function d(){const{metadata:e,frontMatter:t,assets:n}=c();return(0,l.jsx)(a.be,{title:e.title,description:e.description,keywords:t.keywords,image:n.image??t.image})}var u=n(4164),m=n(4581),h=n(1312),v=n(9022);function b(e){const{previous:t,next:n}=e;return(0,l.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,h.T)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[t&&(0,l.jsx)(v.A,{...t,subLabel:(0,l.jsx)(h.A,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),n&&(0,l.jsx)(v.A,{...n,subLabel:(0,l.jsx)(h.A,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}function x(){const{metadata:e}=c();return(0,l.jsx)(b,{previous:e.previous,next:e.next})}var g=n(4586),f=n(8774),p=n(4070),j=n(7559),A=n(3886),N=n(3025);const L={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,l.jsx)(h.A,{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,l.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,l.jsx)(h.A,{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,l.jsx)("b",{children:n.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function C(e){const t=L[e.versionMetadata.banner];return(0,l.jsx)(t,{...e})}function _(e){let{versionLabel:t,to:n,onClick:s}=e;return(0,l.jsx)(h.A,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:(0,l.jsx)("b",{children:(0,l.jsx)(f.A,{to:n,onClick:s,children:(0,l.jsx)(h.A,{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 T(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:s}}=(0,g.A)(),{pluginId:a}=(0,p.vT)({failfast:!0}),{savePreferredVersionName:i}=(0,A.g1)(a),{latestDocSuggestion:o,latestVersionSuggestion:r}=(0,p.HW)(a),c=o??(d=r).docs.find((e=>e.id===d.mainDocId));var d;return(0,l.jsxs)("div",{className:(0,u.A)(t,j.G.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,l.jsx)("div",{children:(0,l.jsx)(C,{siteTitle:s,versionMetadata:n})}),(0,l.jsx)("div",{className:"margin-top--md",children:(0,l.jsx)(_,{versionLabel:r.label,to:c.path,onClick:()=>i(r.name)})})]})}function k(e){let{className:t}=e;const n=(0,N.r)();return n.banner?(0,l.jsx)(T,{className:t,versionMetadata:n}):null}function H(e){let{className:t}=e;const n=(0,N.r)();return n.badge?(0,l.jsx)("span",{className:(0,u.A)(t,j.G.docs.docVersionBadge,"badge badge--secondary"),children:(0,l.jsx)(h.A,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label},children:"Version: {versionLabel}"})}):null}var M=n(2053),y=n(4336);function B(){const{metadata:e}=c(),{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s,tags:a}=e,i=a.length>0,o=!!(t||n||s);return i||o?(0,l.jsxs)("footer",{className:(0,u.A)(j.G.docs.docFooter,"docusaurus-mt-lg"),children:[i&&(0,l.jsx)("div",{className:(0,u.A)("row margin-top--sm",j.G.docs.docFooterTagsRow),children:(0,l.jsx)("div",{className:"col",children:(0,l.jsx)(M.A,{tags:a})})}),o&&(0,l.jsx)(y.A,{className:(0,u.A)("margin-top--sm",j.G.docs.docFooterEditMetaRow),editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s})]}):null}var I=n(1422),w=n(5195);const E={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function V(e){let{collapsed:t,...n}=e;return(0,l.jsx)("button",{type:"button",...n,className:(0,u.A)("clean-btn",E.tocCollapsibleButton,!t&&E.tocCollapsibleButtonExpanded,n.className),children:(0,l.jsx)(h.A,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component",children:"On this page"})})}const O={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function R(e){let{toc:t,className:n,minHeadingLevel:s,maxHeadingLevel:a}=e;const{collapsed:i,toggleCollapsed:o}=(0,I.u)({initialState:!0});return(0,l.jsxs)("div",{className:(0,u.A)(O.tocCollapsible,!i&&O.tocCollapsibleExpanded,n),children:[(0,l.jsx)(V,{collapsed:i,onClick:o}),(0,l.jsx)(I.N,{lazy:!0,className:O.tocCollapsibleContent,collapsed:i,children:(0,l.jsx)(w.A,{toc:t,minHeadingLevel:s,maxHeadingLevel:a})})]})}const G={tocMobile:"tocMobile_ITEo"};function S(){const{toc:e,frontMatter:t}=c();return(0,l.jsx)(R,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,u.A)(j.G.docs.docTocMobile,G.tocMobile)})}var F=n(7763);function P(){const{toc:e,frontMatter:t}=c();return(0,l.jsx)(F.A,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:j.G.docs.docTocDesktop})}var U=n(1107),D=n(5533);function z(e){let{children:t}=e;const n=function(){const{metadata:e,frontMatter:t,contentTitle:n}=c();return t.hide_title||void 0!==n?null:e.title}();return(0,l.jsxs)("div",{className:(0,u.A)(j.G.docs.docMarkdown,"markdown"),children:[n&&(0,l.jsx)("header",{children:(0,l.jsx)(U.A,{as:"h1",children:n})}),(0,l.jsx)(D.A,{children:t})]})}var W=n(6972),q=n(9169),Y=n(6025);function $(e){return(0,l.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,l.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 Q={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function X(){const e=(0,Y.Ay)("/");return(0,l.jsx)("li",{className:"breadcrumbs__item",children:(0,l.jsx)(f.A,{"aria-label":(0,h.T)({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,l.jsx)($,{className:Q.breadcrumbHomeIcon})})})}const Z={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function J(e){let{children:t,href:n,isLast:s}=e;const a="breadcrumbs__link";return s?(0,l.jsx)("span",{className:a,itemProp:"name",children:t}):n?(0,l.jsx)(f.A,{className:a,href:n,itemProp:"item",children:(0,l.jsx)("span",{itemProp:"name",children:t})}):(0,l.jsx)("span",{className:a,children:t})}function K(e){let{children:t,active:n,index:s,addMicrodata:a}=e;return(0,l.jsxs)("li",{...a&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},className:(0,u.A)("breadcrumbs__item",{"breadcrumbs__item--active":n}),children:[t,(0,l.jsx)("meta",{itemProp:"position",content:String(s+1)})]})}function ee(){const e=(0,W.OF)(),t=(0,q.Dt)();return e?(0,l.jsx)("nav",{className:(0,u.A)(j.G.docs.docBreadcrumbs,Z.breadcrumbsContainer),"aria-label":(0,h.T)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,l.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[t&&(0,l.jsx)(X,{}),e.map(((t,n)=>{const s=n===e.length-1,a="category"===t.type&&t.linkUnlisted?void 0:t.href;return(0,l.jsx)(K,{active:s,index:n,addMicrodata:!!a,children:(0,l.jsx)(J,{href:a,isLast:s,children:t.label})},n)}))]})}):null}var te=n(1689);const ne={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function se(e){let{children:t}=e;const n=function(){const{frontMatter:e,toc:t}=c(),n=(0,m.l)(),s=e.hide_table_of_contents,a=!s&&t.length>0;return{hidden:s,mobile:a?(0,l.jsx)(S,{}):void 0,desktop:!a||"desktop"!==n&&"ssr"!==n?void 0:(0,l.jsx)(P,{})}}(),{metadata:s}=c();return(0,l.jsxs)("div",{className:"row",children:[(0,l.jsxs)("div",{className:(0,u.A)("col",!n.hidden&&ne.docItemCol),children:[(0,l.jsx)(te.A,{metadata:s}),(0,l.jsx)(k,{}),(0,l.jsxs)("div",{className:ne.docItemContainer,children:[(0,l.jsxs)("article",{children:[(0,l.jsx)(ee,{}),(0,l.jsx)(H,{}),n.mobile,(0,l.jsx)(z,{children:t}),(0,l.jsx)(B,{})]}),(0,l.jsx)(x,{})]})]}),n.desktop&&(0,l.jsx)("div",{className:"col col--3",children:n.desktop})]})}function ae(e){const t=`docs-doc-id-${e.content.metadata.id}`,n=e.content;return(0,l.jsx)(r,{content:e.content,children:(0,l.jsxs)(a.e3,{className:t,children:[(0,l.jsx)(d,{}),(0,l.jsx)(se,{children:(0,l.jsx)(n,{})})]})})}},9022:(e,t,n)=>{n.d(t,{A:()=>l});n(6540);var s=n(4164),a=n(8774),i=n(4848);function l(e){const{permalink:t,title:n,subLabel:l,isNext:o}=e;return(0,i.jsxs)(a.A,{className:(0,s.A)("pagination-nav__link",o?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[l&&(0,i.jsx)("div",{className:"pagination-nav__sublabel",children:l}),(0,i.jsx)("div",{className:"pagination-nav__label",children:n})]})}},7763:(e,t,n)=>{n.d(t,{A:()=>c});n(6540);var s=n(4164),a=n(5195);const i={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var l=n(4848);const o="table-of-contents__link toc-highlight",r="table-of-contents__link--active";function c(e){let{className:t,...n}=e;return(0,l.jsx)("div",{className:(0,s.A)(i.tableOfContents,"thin-scrollbar",t),children:(0,l.jsx)(a.A,{...n,linkClassName:o,linkActiveClassName:r})})}},5195:(e,t,n)=>{n.d(t,{A:()=>b});var s=n(6540),a=n(6342);function i(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 l(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:s}=e;return t.flatMap((e=>{const t=l({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 r(e,t){let{anchorTopOffset:n}=t;const s=e.find((e=>o(e).top>=n));if(s){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(o(s))?s:e[e.indexOf(s)-1]??null}return e[e.length-1]??null}function c(){const e=(0,s.useRef)(0),{navbar:{hideOnScroll:t}}=(0,a.p)();return(0,s.useEffect)((()=>{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function d(e){const t=(0,s.useRef)(void 0),n=c();(0,s.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:s,linkActiveClassName:a,minHeadingLevel:i,maxHeadingLevel:l}=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:i,maxHeadingLevel:l}),c=r(o,{anchorTopOffset:n.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,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(8774),m=n(4848);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.A,{to:`#${e.id}`,className: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:r,minHeadingLevel:c,maxHeadingLevel:u,...h}=e;const b=(0,a.p)(),x=c??b.tableOfContents.minHeadingLevel,g=u??b.tableOfContents.maxHeadingLevel,f=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,s.useMemo)((()=>l({toc:i(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:x,maxHeadingLevel:g});return d((0,s.useMemo)((()=>{if(o&&r)return{linkClassName:o,linkActiveClassName:r,minHeadingLevel:x,maxHeadingLevel:g}}),[o,r,x,g])),(0,m.jsx)(v,{toc:f,className:n,linkClassName:o,...h})}},6133:(e,t,n)=>{n.d(t,{A:()=>o});n(6540);var s=n(4164),a=n(8774);const i={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var l=n(4848);function o(e){let{permalink:t,label:n,count:o,description:r}=e;return(0,l.jsxs)(a.A,{href:t,title:r,className:(0,s.A)(i.tag,o?i.tagWithCount:i.tagRegular),children:[n,o&&(0,l.jsx)("span",{children:o})]})}},2053:(e,t,n)=>{n.d(t,{A:()=>r});n(6540);var s=n(4164),a=n(1312),i=n(6133);const l={tags:"tags_jXut",tag:"tag_QGVx"};var o=n(4848);function r(e){let{tags:t}=e;return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("b",{children:(0,o.jsx)(a.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,o.jsx)("ul",{className:(0,s.A)(l.tags,"padding--none","margin-left--sm"),children:t.map((e=>(0,o.jsx)("li",{className:l.tag,children:(0,o.jsx)(i.A,{...e})},e.permalink)))})]})}},4084:(e,t,n)=>{n.d(t,{AE:()=>r,Rc:()=>l,TT:()=>d,Uh:()=>o,Yh:()=>c});n(6540);var s=n(1312),a=n(5260),i=n(4848);function l(){return(0,i.jsx)(s.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function o(){return(0,i.jsx)(s.A,{id:"theme.contentVisibility.unlistedBanner.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)(a.A,{children:(0,i.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function c(){return(0,i.jsx)(s.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function d(){return(0,i.jsx)(s.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}}}]); \ No newline at end of file diff --git a/assets/js/19e40cbb.3433c7a4.js b/assets/js/19e40cbb.3433c7a4.js new file mode 100644 index 00000000..565d75c5 --- /dev/null +++ b/assets/js/19e40cbb.3433c7a4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5937],{7086:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var s=i(4848),t=i(8453);const r={sidebar_position:7},o="Using the Authorization Service",a={id:"using-the-authorization-service",title:"Using the Authorization Service",description:"This section will teach you how to use the AuthorizationService to its full extent.",source:"@site/versioned_docs/version-3.4/using-the-authorization-service.md",sourceDirName:".",slug:"/using-the-authorization-service",permalink:"/LmcRbacMvc/docs/using-the-authorization-service",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/versioned_docs/version-3.4/using-the-authorization-service.md",tags:[],version:"3.4",sidebarPosition:7,frontMatter:{sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"Strategies",permalink:"/LmcRbacMvc/docs/strategies"},next:{title:"Cookbook",permalink:"/LmcRbacMvc/docs/cookbook"}},c={},l=[{value:"Injecting the Authorization Service",id:"injecting-the-authorization-service",level:2},{value:"Using initializers",id:"using-initializers",level:3},{value:"Using delegator factory",id:"using-delegator-factory",level:3},{value:"Using Factories",id:"using-factories",level:3},{value:"Permissions and Assertions",id:"permissions-and-assertions",level:2},{value:"Defining assertions",id:"defining-assertions",level:3},{value:"Defining the assertion map",id:"defining-the-assertion-map",level:3},{value:"Checking permissions in a service",id:"checking-permissions-in-a-service",level:3},{value:"Checking permissions in controllers and views",id:"checking-permissions-in-controllers-and-views",level:3},{value:"In a controller :",id:"in-a-controller-",level:4},{value:"In a view :",id:"in-a-view-",level:4},{value:"Defining additional permissions",id:"defining-additional-permissions",level:3}];function h(e){const n={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",p:"p",pre:"pre",strong:"strong",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"using-the-authorization-service",children:"Using the Authorization Service"})}),"\n",(0,s.jsx)(n.p,{children:"This section will teach you how to use the AuthorizationService to its full extent."}),"\n",(0,s.jsx)(n.h2,{id:"injecting-the-authorization-service",children:"Injecting the Authorization Service"}),"\n",(0,s.jsx)(n.h3,{id:"using-initializers",children:"Using initializers"}),"\n",(0,s.jsxs)(n.p,{children:["To automatically inject the authorization service into your classes, you can implement the\n",(0,s.jsx)(n.code,{children:"AuthorizationServiceAwareInterface"})," and use the trait, as shown below:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"namespace YourModule;\n\nuse LmcRbacMvc\\Service\\AuthorizationServiceAwareInterface;\nuse LmcRbacMvc\\Service\\AuthorizationServiceAwareTrait;\n\nclass MyClass implements AuthorizationServiceAwareInterface\n{\n use AuthorizationServiceAwareTrait;\n\n public function doSomethingThatRequiresAuth()\n {\n if (! $this->getAuthorizationService()->isGranted('deletePost')) {\n throw new UnauthorizedException('You are not allowed !');\n }\n\n return true;\n }\n}\n"})}),"\n",(0,s.jsx)(n.p,{children:"Then, register the initializer in your config (it is not registered by default):"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"class Module\n{\n // ...\n\n public function getServiceConfig()\n {\n return [\n 'initializers' => [\n 'LmcRbacMvc\\Initializer\\AuthorizationServiceInitializer'\n ]\n ];\n }\n}\n"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"While initializers allow rapid prototyping, their use can lead to more fragile code. We'd suggest using factories."}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"using-delegator-factory",children:"Using delegator factory"}),"\n",(0,s.jsxs)(n.p,{children:["LmcRbacMvc is shipped with a ",(0,s.jsx)(n.code,{children:"LmcRbacMvc\\Factory\\AuthorizationServiceDelegatorFactory"})," ",(0,s.jsx)(n.a,{href:"https://docs.laminas.dev/laminas-servicemanager/delegators/",children:"delegator factory"}),"\nto automatically inject the authorization service into your classes."]}),"\n",(0,s.jsxs)(n.p,{children:["As for the initializer, the class must implement the ",(0,s.jsx)(n.code,{children:"AuthorizationServiceAwareInterface"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"You just have to add your classes to the right delegator :"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"class Module\n{\n // ...\n\n public function getServiceConfig()\n {\n return [\n 'invokables' => [\n 'Application\\Service\\MyClass' => 'Application\\Service\\MyClassService',\n ],\n 'delegators' => [\n 'Application\\Service\\MyClass' => [\n 'LmcRbacMvc\\Factory\\AuthorizationServiceDelegatorFactory',\n // eventually add more delegators here\n ],\n ],\n ];\n }\n}\n"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"While they need a little more configuration, delegator factories have better performances than initializers."}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"using-factories",children:"Using Factories"}),"\n",(0,s.jsxs)(n.p,{children:["You can inject the AuthorizationService into your factories by using Laminas' ServiceManager. The AuthorizationService\nis known to the ServiceManager as ",(0,s.jsx)(n.code,{children:"'LmcRbacMvc\\Service\\AuthorizationService'"}),". Here is a classic example for injecting\nthe AuthorizationService:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.em,{children:"YourModule/Module.php"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"class Module\n{\n // getAutoloaderConfig(), etc...\n\n public function getServiceConfig()\n {\n return [\n 'factories' => [\n 'MyService' => function($sm) {\n $authService = $sm->get('LmcRbacMvc\\Service\\AuthorizationService');\n return new MyService($authService);\n }\n ]\n ];\n }\n}\n"})}),"\n",(0,s.jsx)(n.h2,{id:"permissions-and-assertions",children:"Permissions and Assertions"}),"\n",(0,s.jsx)(n.p,{children:"Since you now know how to inject the AuthorizationService, let's use it!"}),"\n",(0,s.jsxs)(n.p,{children:["One of the great things the AuthorizationService brings are ",(0,s.jsx)(n.strong,{children:"assertions"}),". Assertions get executed ",(0,s.jsx)(n.em,{children:"if the identity\nin fact holds the permission you are requesting"}),". A common example is a blog post, which only the author can edit. In\nthis case, you have a ",(0,s.jsx)(n.code,{children:"post.edit"})," permission and run an assertion checking the author afterwards."]}),"\n",(0,s.jsx)(n.h3,{id:"defining-assertions",children:"Defining assertions"}),"\n",(0,s.jsxs)(n.p,{children:["The AssertionPluginManager is a great way for you to use assertions and IOC. You can add new assertions quite easily\nby adding this to your ",(0,s.jsx)(n.code,{children:"module.config.php"})," file:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'assertion_manager' => [\n 'factories' => [\n 'MyAssertion' => 'MyAssertionFactory'\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsx)(n.h3,{id:"defining-the-assertion-map",children:"Defining the assertion map"}),"\n",(0,s.jsxs)(n.p,{children:["The assertion map can automatically map permissions to assertions. This means that every time you check for a\npermission with an assertion map, you'll include the assertion in your check. You can define the assertion map by\nadding this to your ",(0,s.jsx)(n.code,{children:"module.config.php"})," file:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'assertion_map' => [\n 'myPermission' => 'myAssertion'\n ]\n ]\n];\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Now, every time you check for ",(0,s.jsx)(n.code,{children:"myPermission"}),", ",(0,s.jsx)(n.code,{children:"myAssertion"})," will be checked as well."]}),"\n",(0,s.jsx)(n.h3,{id:"checking-permissions-in-a-service",children:"Checking permissions in a service"}),"\n",(0,s.jsx)(n.p,{children:"So let's check for a permission, shall we?"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"$authorizationService->isGranted('myPermission');\n"})}),"\n",(0,s.jsx)(n.p,{children:"That was easy, wasn't it?"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"isGranted"})," checks if the current identity is granted the permission and additionally runs the assertion that is\nprovided by the assertion map."]}),"\n",(0,s.jsx)(n.h3,{id:"checking-permissions-in-controllers-and-views",children:"Checking permissions in controllers and views"}),"\n",(0,s.jsx)(n.p,{children:"LmcRbacMvc comes with both a controller plugin and a view helper to check permissions."}),"\n",(0,s.jsx)(n.h4,{id:"in-a-controller-",children:"In a controller :"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:" public function doSomethingAction()\n {\n if (!$this->isGranted('myPermission')) {\n // redirect if not granted for example\n }\n }\n"})}),"\n",(0,s.jsx)(n.h4,{id:"in-a-view-",children:"In a view :"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:" <?php if ($this->isGranted('myPermission')): ?>\n <div>\n <p>Display only if granted</p>\n </div>\n <?php endif ?>\n"})}),"\n",(0,s.jsx)(n.h3,{id:"defining-additional-permissions",children:"Defining additional permissions"}),"\n",(0,s.jsx)(n.p,{children:"But what if you don't want to use the assertion map? That's quite easy as well!"}),"\n",(0,s.jsx)(n.p,{children:"Here are four examples of how to run an assertion without using the assertion map:"}),"\n",(0,s.jsx)(n.p,{children:"Disable the assertion:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"$authorizationService->setAssertion('myPermission', null);\n$authorizationService->isGranted('myPermission');\n"})}),"\n",(0,s.jsx)(n.p,{children:"Callback assertion:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"$something = true;\n\n$authorizationService->setAssertion(\n 'myPermission',\n function(AuthorizationService $authorization, $context = true) use ($something) {\n return $something === $context\n }\n);\n\n$authorizationService->isGranted('myPermission'); // returns true, when the identity holds the permission `myPermission`\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Object implementing ",(0,s.jsx)(n.code,{children:"AssertionInterface"}),":"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"$context = true;\n\n$authorizationService->setAssertion('myPermission', new MyAssertion($foo, $bar));\n$authorizationService->isGranted('myPermission', $context);\n"})}),"\n",(0,s.jsx)(n.p,{children:"Using the AssertionPluginManager:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"$context = true;\n$authorizationService->setAssertion('myPermission', 'MyAssertion');\n$authorizationService->isGranted('myPermission', $context);\n"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.em,{children:"Please note: The context parameter is optional!"})})]})}function d(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>a});var s=i(6540);const t={},r=s.createContext(t);function o(e){const n=s.useContext(r);return s.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(t):e.components||t:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1f391b9e.6f467a80.js b/assets/js/1f391b9e.6f467a80.js new file mode 100644 index 00000000..5b2912f1 --- /dev/null +++ b/assets/js/1f391b9e.6f467a80.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6061],{2234:(e,n,t)=>{t.d(n,{A:()=>o});t(6540);var a=t(4164),i=t(4084),s=t(7559),l=t(7293),r=t(4848);function c(e){let{className:n}=e;return(0,r.jsx)(l.A,{type:"caution",title:(0,r.jsx)(i.Rc,{}),className:(0,a.A)(n,s.G.common.unlistedBanner),children:(0,r.jsx)(i.Uh,{})})}function o(e){return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.AE,{}),(0,r.jsx)(c,{...e})]})}},1689:(e,n,t)=>{t.d(n,{A:()=>d});t(6540);var a=t(4164),i=t(4084),s=t(7559),l=t(7293),r=t(4848);function c(e){let{className:n}=e;return(0,r.jsx)(l.A,{type:"caution",title:(0,r.jsx)(i.Yh,{}),className:(0,a.A)(n,s.G.common.draftBanner),children:(0,r.jsx)(i.TT,{})})}var o=t(2234);function d(e){let{metadata:n}=e;const{unlisted:t,frontMatter:a}=n;return(0,r.jsxs)(r.Fragment,{children:[(t||a.unlisted)&&(0,r.jsx)(o.A,{}),a.draft&&(0,r.jsx)(c,{})]})}},7973:(e,n,t)=>{t.r(n),t.d(n,{default:()=>f});t(6540);var a=t(4164),i=t(1213),s=t(7559),l=t(781),r=t(5533),c=t(7763),o=t(1689),d=t(4336);const m={mdxPageWrapper:"mdxPageWrapper_j9I6"};var u=t(4848);function f(e){const{content:n}=e,{metadata:t,assets:f}=n,{title:h,editUrl:v,description:x,frontMatter:g,lastUpdatedBy:p,lastUpdatedAt:j}=t,{keywords:A,wrapperClassName:b,hide_table_of_contents:L}=g,N=f.image??g.image,C=!!(v||j||p);return(0,u.jsx)(i.e3,{className:(0,a.A)(b??s.G.wrapper.mdxPages,s.G.page.mdxPage),children:(0,u.jsxs)(l.A,{children:[(0,u.jsx)(i.be,{title:h,description:x,keywords:A,image:N}),(0,u.jsx)("main",{className:"container container--fluid margin-vert--lg",children:(0,u.jsxs)("div",{className:(0,a.A)("row",m.mdxPageWrapper),children:[(0,u.jsxs)("div",{className:(0,a.A)("col",!L&&"col--8"),children:[(0,u.jsx)(o.A,{metadata:t}),(0,u.jsx)("article",{children:(0,u.jsx)(r.A,{children:(0,u.jsx)(n,{})})}),C&&(0,u.jsx)(d.A,{className:(0,a.A)("margin-top--sm",s.G.pages.pageFooterEditMetaRow),editUrl:v,lastUpdatedAt:j,lastUpdatedBy:p})]}),!L&&n.toc.length>0&&(0,u.jsx)("div",{className:"col col--2",children:(0,u.jsx)(c.A,{toc:n.toc,minHeadingLevel:g.toc_min_heading_level,maxHeadingLevel:g.toc_max_heading_level})})]})})]})})}},7763:(e,n,t)=>{t.d(n,{A:()=>o});t(6540);var a=t(4164),i=t(5195);const s={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var l=t(4848);const r="table-of-contents__link toc-highlight",c="table-of-contents__link--active";function o(e){let{className:n,...t}=e;return(0,l.jsx)("div",{className:(0,a.A)(s.tableOfContents,"thin-scrollbar",n),children:(0,l.jsx)(i.A,{...t,linkClassName:r,linkActiveClassName:c})})}},5195:(e,n,t)=>{t.d(n,{A:()=>v});var a=t(6540),i=t(6342);function s(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 l(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:a}=e;return n.flatMap((e=>{const n=l({toc:e.children,minHeadingLevel:t,maxHeadingLevel:a});return function(e){return e.level>=t&&e.level<=a}(e)?[{...e,children:n}]:n}))}function r(e){const n=e.getBoundingClientRect();return n.top===n.bottom?r(e.parentNode):n}function c(e,n){let{anchorTopOffset:t}=n;const a=e.find((e=>r(e).top>=t));if(a){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(r(a))?a:e[e.indexOf(a)-1]??null}return e[e.length-1]??null}function o(){const e=(0,a.useRef)(0),{navbar:{hideOnScroll:n}}=(0,i.p)();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=o();(0,a.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:a,linkActiveClassName:i,minHeadingLevel:s,maxHeadingLevel:l}=e;function r(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(a),r=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:s,maxHeadingLevel:l}),o=c(r,{anchorTopOffset:t.current}),d=e.find((e=>o&&o.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",r),document.addEventListener("resize",r),r(),()=>{document.removeEventListener("scroll",r),document.removeEventListener("resize",r)}}),[e,t])}var m=t(8774),u=t(4848);function f(e){let{toc:n,className:t,linkClassName:a,isChild:i}=e;return n.length?(0,u.jsx)("ul",{className:i?void 0:t,children:n.map((e=>(0,u.jsxs)("li",{children:[(0,u.jsx)(m.A,{to:`#${e.id}`,className:a??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,u.jsx)(f,{isChild:!0,toc:e.children,className:t,linkClassName:a})]},e.id)))}):null}const h=a.memo(f);function v(e){let{toc:n,className:t="table-of-contents table-of-contents__left-border",linkClassName:r="table-of-contents__link",linkActiveClassName:c,minHeadingLevel:o,maxHeadingLevel:m,...f}=e;const v=(0,i.p)(),x=o??v.tableOfContents.minHeadingLevel,g=m??v.tableOfContents.maxHeadingLevel,p=function(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:i}=e;return(0,a.useMemo)((()=>l({toc:s(n),minHeadingLevel:t,maxHeadingLevel:i})),[n,t,i])}({toc:n,minHeadingLevel:x,maxHeadingLevel:g});return d((0,a.useMemo)((()=>{if(r&&c)return{linkClassName:r,linkActiveClassName:c,minHeadingLevel:x,maxHeadingLevel:g}}),[r,c,x,g])),(0,u.jsx)(h,{toc:p,className:t,linkClassName:r,...f})}},4084:(e,n,t)=>{t.d(n,{AE:()=>c,Rc:()=>l,TT:()=>d,Uh:()=>r,Yh:()=>o});t(6540);var a=t(1312),i=t(5260),s=t(4848);function l(){return(0,s.jsx)(a.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function r(){return(0,s.jsx)(a.A,{id:"theme.contentVisibility.unlistedBanner.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)(i.A,{children:(0,s.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function o(){return(0,s.jsx)(a.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function d(){return(0,s.jsx)(a.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}}}]); \ No newline at end of file diff --git a/assets/js/1f391b9e.afd6222f.js b/assets/js/1f391b9e.afd6222f.js deleted file mode 100644 index 618d1031..00000000 --- a/assets/js/1f391b9e.afd6222f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[61],{7973:(e,n,t)=>{t.r(n),t.d(n,{default:()=>f});t(6540);var a=t(4164),s=t(1213),i=t(7559),l=t(781),r=t(5533),c=t(7763),o=t(996),d=t(4336);const m={mdxPageWrapper:"mdxPageWrapper_j9I6"};var u=t(4848);function f(e){const{content:n}=e,{metadata:{title:t,editUrl:f,description:v,frontMatter:h,unlisted:g,lastUpdatedBy:x,lastUpdatedAt:p},assets:L}=n,{keywords:j,wrapperClassName:A,hide_table_of_contents:N}=h,C=L.image??h.image,H=!!(f||p||x);return(0,u.jsx)(s.e3,{className:(0,a.A)(A??i.G.wrapper.mdxPages,i.G.page.mdxPage),children:(0,u.jsxs)(l.A,{children:[(0,u.jsx)(s.be,{title:t,description:v,keywords:j,image:C}),(0,u.jsx)("main",{className:"container container--fluid margin-vert--lg",children:(0,u.jsxs)("div",{className:(0,a.A)("row",m.mdxPageWrapper),children:[(0,u.jsxs)("div",{className:(0,a.A)("col",!N&&"col--8"),children:[g&&(0,u.jsx)(o.A,{}),(0,u.jsx)("article",{children:(0,u.jsx)(r.A,{children:(0,u.jsx)(n,{})})}),H&&(0,u.jsx)(d.A,{className:(0,a.A)("margin-top--sm",i.G.pages.pageFooterEditMetaRow),editUrl:f,lastUpdatedAt:p,lastUpdatedBy:x})]}),!N&&n.toc.length>0&&(0,u.jsx)("div",{className:"col col--2",children:(0,u.jsx)(c.A,{toc:n.toc,minHeadingLevel:h.toc_min_heading_level,maxHeadingLevel:h.toc_max_heading_level})})]})})]})})}},7763:(e,n,t)=>{t.d(n,{A:()=>o});t(6540);var a=t(4164),s=t(5195);const i={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var l=t(4848);const r="table-of-contents__link toc-highlight",c="table-of-contents__link--active";function o(e){let{className:n,...t}=e;return(0,l.jsx)("div",{className:(0,a.A)(i.tableOfContents,"thin-scrollbar",n),children:(0,l.jsx)(s.A,{...t,linkClassName:r,linkActiveClassName:c})})}},5195:(e,n,t)=>{t.d(n,{A:()=>h});var a=t(6540),s=t(6342);function i(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,...s}=e;t>=0?n[t].children.push(s):a.push(s)})),a}function l(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:a}=e;return n.flatMap((e=>{const n=l({toc:e.children,minHeadingLevel:t,maxHeadingLevel:a});return function(e){return e.level>=t&&e.level<=a}(e)?[{...e,children:n}]:n}))}function r(e){const n=e.getBoundingClientRect();return n.top===n.bottom?r(e.parentNode):n}function c(e,n){let{anchorTopOffset:t}=n;const a=e.find((e=>r(e).top>=t));if(a){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(r(a))?a:e[e.indexOf(a)-1]??null}return e[e.length-1]??null}function o(){const e=(0,a.useRef)(0),{navbar:{hideOnScroll:n}}=(0,s.p)();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=o();(0,a.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:a,linkActiveClassName:s,minHeadingLevel:i,maxHeadingLevel:l}=e;function r(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(a),r=function(e){let{minHeadingLevel:n,maxHeadingLevel:t}=e;const a=[];for(let s=n;s<=t;s+=1)a.push(`h${s}.anchor`);return Array.from(document.querySelectorAll(a.join()))}({minHeadingLevel:i,maxHeadingLevel:l}),o=c(r,{anchorTopOffset:t.current}),d=e.find((e=>o&&o.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(s),e.classList.add(s),n.current=e):e.classList.remove(s)}(e,e===d)}))}return document.addEventListener("scroll",r),document.addEventListener("resize",r),r(),()=>{document.removeEventListener("scroll",r),document.removeEventListener("resize",r)}}),[e,t])}var m=t(8774),u=t(4848);function f(e){let{toc:n,className:t,linkClassName:a,isChild:s}=e;return n.length?(0,u.jsx)("ul",{className:s?void 0:t,children:n.map((e=>(0,u.jsxs)("li",{children:[(0,u.jsx)(m.A,{to:`#${e.id}`,className:a??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,u.jsx)(f,{isChild:!0,toc:e.children,className:t,linkClassName:a})]},e.id)))}):null}const v=a.memo(f);function h(e){let{toc:n,className:t="table-of-contents table-of-contents__left-border",linkClassName:r="table-of-contents__link",linkActiveClassName:c,minHeadingLevel:o,maxHeadingLevel:m,...f}=e;const h=(0,s.p)(),g=o??h.tableOfContents.minHeadingLevel,x=m??h.tableOfContents.maxHeadingLevel,p=function(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:s}=e;return(0,a.useMemo)((()=>l({toc:i(n),minHeadingLevel:t,maxHeadingLevel:s})),[n,t,s])}({toc:n,minHeadingLevel:g,maxHeadingLevel:x});return d((0,a.useMemo)((()=>{if(r&&c)return{linkClassName:r,linkActiveClassName:c,minHeadingLevel:g,maxHeadingLevel:x}}),[r,c,g,x])),(0,u.jsx)(v,{toc:p,className:t,linkClassName:r,...f})}},996:(e,n,t)=>{t.d(n,{A:()=>f});t(6540);var a=t(4164),s=t(1312),i=t(5260),l=t(4848);function r(){return(0,l.jsx)(s.A,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function c(){return(0,l.jsx)(s.A,{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 o(){return(0,l.jsx)(i.A,{children:(0,l.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}var d=t(7559),m=t(7293);function u(e){let{className:n}=e;return(0,l.jsx)(m.A,{type:"caution",title:(0,l.jsx)(r,{}),className:(0,a.A)(n,d.G.common.unlistedBanner),children:(0,l.jsx)(c,{})})}function f(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(o,{}),(0,l.jsx)(u,{...e})]})}}}]); \ No newline at end of file diff --git a/assets/js/2237.fe867cfb.js b/assets/js/2237.fe867cfb.js new file mode 100644 index 00000000..71f58020 --- /dev/null +++ b/assets/js/2237.fe867cfb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2237],{3363:(e,t,n)=>{n.d(t,{A:()=>a});n(6540);var i=n(4164),o=n(1312),s=n(1107),r=n(4848);function a(e){let{className:t}=e;return(0,r.jsx)("main",{className:(0,i.A)("container margin-vert--xl",t),children:(0,r.jsx)("div",{className:"row",children:(0,r.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,r.jsx)(s.A,{as:"h1",className:"hero__title",children:(0,r.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,r.jsx)("p",{children:(0,r.jsx)(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,r.jsx)("p",{children:(0,r.jsx)(o.A,{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."})})]})})})}},2237:(e,t,n)=>{n.r(t),n.d(t,{default:()=>d});n(6540);var i=n(1312),o=n(1213),s=n(781),r=n(3363),a=n(4848);function d(){const e=(0,i.T)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(o.be,{title:e}),(0,a.jsx)(s.A,{children:(0,a.jsx)(r.A,{})})]})}}}]); \ No newline at end of file diff --git a/assets/js/22465cd7.685bf539.js b/assets/js/22465cd7.685bf539.js deleted file mode 100644 index 4367e9ac..00000000 --- a/assets/js/22465cd7.685bf539.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[166],{6066:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>t,metadata:()=>c,toc:()=>d});var o=n(4848),i=n(8453);const t={sidebar_position:4},s="Role providers",c={id:"role-providers",title:"Role providers",description:"In this section, you will learn:",source:"@site/docs/role-providers.md",sourceDirName:".",slug:"/role-providers",permalink:"/LmcRbacMvc/docs/role-providers",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/docs/role-providers.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"Quick Start",permalink:"/LmcRbacMvc/docs/quick-start"},next:{title:"Guards",permalink:"/LmcRbacMvc/docs/guards"}},l={},d=[{value:"What are role providers?",id:"what-are-role-providers",level:2},{value:"Identity providers?",id:"identity-providers",level:2},{value:"Create your own identity provider",id:"create-your-own-identity-provider",level:3},{value:"Built-in role providers",id:"built-in-role-providers",level:2},{value:"InMemoryRoleProvider",id:"inmemoryroleprovider",level:3},{value:"ObjectRepositoryRoleProvider",id:"objectrepositoryroleprovider",level:3},{value:"Creating custom role providers",id:"creating-custom-role-providers",level:2}];function a(e){const r={code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(r.h1,{id:"role-providers",children:"Role providers"}),"\n",(0,o.jsx)(r.p,{children:"In this section, you will learn:"}),"\n",(0,o.jsxs)(r.ul,{children:["\n",(0,o.jsx)(r.li,{children:"What are role providers"}),"\n",(0,o.jsx)(r.li,{children:"What are identity providers"}),"\n",(0,o.jsx)(r.li,{children:"How to use and configure built-in providers"}),"\n",(0,o.jsx)(r.li,{children:"How to create custom role providers"}),"\n"]}),"\n",(0,o.jsx)(r.h2,{id:"what-are-role-providers",children:"What are role providers?"}),"\n",(0,o.jsxs)(r.p,{children:["A role provider is an object that returns a list of roles. Each role provider must implement the\n",(0,o.jsx)(r.code,{children:"LmcRbacMvc\\Role\\RoleProviderInterface"})," interface. The only required method is ",(0,o.jsx)(r.code,{children:"getRoles"}),", and must return an array\nof ",(0,o.jsx)(r.code,{children:"Rbac\\Role\\RoleInterface"})," objects."]}),"\n",(0,o.jsx)(r.p,{children:"Roles can come from one of many sources: in memory, from a file, from a database... However, please note that\nyou can specify only one role provider per application. The reason is that having multiple role providers makes\nthe workflow harder and can lead to security problems that are very hard to spot."}),"\n",(0,o.jsx)(r.h2,{id:"identity-providers",children:"Identity providers?"}),"\n",(0,o.jsxs)(r.p,{children:["Identity providers return the current identity. Most of the time, this means the logged in user. LmcRbacMvc comes with a\ndefault identity provider (",(0,o.jsx)(r.code,{children:"LmcRbacMvc\\Identity\\AuthenticationIdentityProvider"}),") that uses the\n",(0,o.jsx)(r.code,{children:"Laminas\\Authentication\\AuthenticationService"})," service."]}),"\n",(0,o.jsx)(r.h3,{id:"create-your-own-identity-provider",children:"Create your own identity provider"}),"\n",(0,o.jsxs)(r.p,{children:["If you want to implement your own identity provider, create a new class that implements\n",(0,o.jsx)(r.code,{children:"LmcRbacMvc\\Identity\\IdentityProviderInterface"})," class. Then, change the ",(0,o.jsx)(r.code,{children:"identity_provider"})," option in LmcRbacMvc config,\nas shown below:"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'identity_provider' => 'MyCustomIdentityProvider'\n ]\n];\n"})}),"\n",(0,o.jsx)(r.p,{children:"The identity provider is automatically pulled from the service manager."}),"\n",(0,o.jsx)(r.h2,{id:"built-in-role-providers",children:"Built-in role providers"}),"\n",(0,o.jsxs)(r.p,{children:["LmcRbacMvc comes with two built-in role providers: ",(0,o.jsx)(r.code,{children:"InMemoryRoleProvider"})," and ",(0,o.jsx)(r.code,{children:"ObjectRepositoryRoleProvider"}),". A role\nprovider must be added to the ",(0,o.jsx)(r.code,{children:"role_provider"})," subkey:"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'role_provider' => [\n // Role provider config here!\n ]\n ]\n];\n"})}),"\n",(0,o.jsx)(r.h3,{id:"inmemoryroleprovider",children:"InMemoryRoleProvider"}),"\n",(0,o.jsx)(r.p,{children:"This provider is ideal for small/medium sites with few roles/permissions. All the data is specified in a simple\nPHP file, so you never hit a database."}),"\n",(0,o.jsx)(r.p,{children:"Here is an example of the format you need to use:"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'role_provider' => [\n 'LmcRbacMvc\\Role\\InMemoryRoleProvider' => [\n 'admin' => [\n 'children' => ['member'],\n 'permissions' => ['article.delete']\n ],\n 'member' => [\n 'children' => ['guest'],\n 'permissions' => ['article.edit', 'article.archive']\n ],\n 'guest' => [\n 'permissions' => ['article.read']\n ]\n ]\n ]\n ]\n];\n"})}),"\n",(0,o.jsxs)(r.p,{children:["The ",(0,o.jsx)(r.code,{children:"children"})," and ",(0,o.jsx)(r.code,{children:"permissions"})," subkeys are entirely optional. Internally, the ",(0,o.jsx)(r.code,{children:"InMemoryRoleProvider"})," creates\neither a ",(0,o.jsx)(r.code,{children:"Rbac\\Role\\Role"})," object if the role does not have any children, or a ",(0,o.jsx)(r.code,{children:"Rbac\\Role\\HierarchicalRole"})," if\nthe role has at least one child."]}),"\n",(0,o.jsx)(r.p,{children:"If you are more confident with flat RBAC, the previous config can be re-written to remove any inheritence between roles:"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'role_provider' => [\n 'LmcRbacMvc\\Role\\InMemoryRoleProvider' => [\n 'admin' => [\n 'permissions' => [\n 'article.delete',\n 'article.edit',\n 'article.archive',\n 'article.read'\n ]\n ],\n 'member' => [\n 'permissions' => [\n 'article.edit',\n 'article.archive',\n 'article.read'\n ]\n ],\n 'guest' => [\n 'permissions' => ['article.read']\n ]\n ]\n ]\n ]\n];\n"})}),"\n",(0,o.jsx)(r.h3,{id:"objectrepositoryroleprovider",children:"ObjectRepositoryRoleProvider"}),"\n",(0,o.jsxs)(r.p,{children:["This provider fetches roles from the database using ",(0,o.jsx)(r.code,{children:"Doctrine\\Common\\Persistence\\ObjectRepository"})," interface."]}),"\n",(0,o.jsxs)(r.p,{children:["You can configure this provider by giving an object repository service name that is fetched from the service manager\nusing the ",(0,o.jsx)(r.code,{children:"object_repository"})," key:"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'role_provider' => [\n 'LmcRbacMvc\\Role\\ObjectRepositoryRoleProvider' => [\n 'object_repository' => 'App\\Repository\\RoleRepository',\n 'role_name_property' => 'name'\n ]\n ]\n ]\n];\n"})}),"\n",(0,o.jsxs)(r.p,{children:["Or you can specify the ",(0,o.jsx)(r.code,{children:"object_manager"})," and ",(0,o.jsx)(r.code,{children:"class_name"})," options:"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'role_provider' => [\n 'LmcRbacMvc\\Role\\ObjectRepositoryRoleProvider' => [\n 'object_manager' => 'doctrine.entitymanager.orm_default',\n 'class_name' => 'App\\Entity\\Role',\n 'role_name_property' => 'name'\n ]\n ]\n ]\n];\n"})}),"\n",(0,o.jsxs)(r.p,{children:["In both cases, you need to specify the ",(0,o.jsx)(r.code,{children:"role_name_property"})," value, which is the name of the entity's property\nthat holds the actual role name. This is used internally to only load the identity roles, instead of loading\nthe whole table every time."]}),"\n",(0,o.jsxs)(r.p,{children:["Please note that your entity fetched from the table MUST implement the ",(0,o.jsx)(r.code,{children:"Rbac\\Role\\RoleInterface"})," interface."]}),"\n",(0,o.jsx)(r.h2,{id:"creating-custom-role-providers",children:"Creating custom role providers"}),"\n",(0,o.jsxs)(r.p,{children:["To create a custom role provider, you first need to create a class that implements the ",(0,o.jsx)(r.code,{children:"LmcRbacMvc\\Role\\RoleProviderInterface"}),"\ninterface."]}),"\n",(0,o.jsx)(r.p,{children:"Then, you need to add it to the role provider manager:"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'role_provider_manager' => [\n 'factories' => [\n 'Application\\Role\\CustomRoleProvider' => 'Application\\Factory\\CustomRoleProviderFactory'\n ]\n ] \n ]\n];\n"})}),"\n",(0,o.jsx)(r.p,{children:"You can now use it like any other role provider:"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'role_provider' => [\n 'Application\\Role\\CustomRoleProvider' => [\n // Options\n ]\n ]\n ]\n];\n"})})]})}function h(e={}){const{wrapper:r}={...(0,i.R)(),...e.components};return r?(0,o.jsx)(r,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}},8453:(e,r,n)=>{n.d(r,{R:()=>s,x:()=>c});var o=n(6540);const i={},t=o.createContext(i);function s(e){const r=o.useContext(t);return o.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function c(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(t.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/237.02cb92cf.js b/assets/js/237.02cb92cf.js deleted file mode 100644 index 0d12f6d6..00000000 --- a/assets/js/237.02cb92cf.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[237],{3363:(e,t,n)=>{n.d(t,{A:()=>a});n(6540);var i=n(4164),o=n(1312),s=n(1107),r=n(4848);function a(e){let{className:t}=e;return(0,r.jsx)("main",{className:(0,i.A)("container margin-vert--xl",t),children:(0,r.jsx)("div",{className:"row",children:(0,r.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,r.jsx)(s.A,{as:"h1",className:"hero__title",children:(0,r.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,r.jsx)("p",{children:(0,r.jsx)(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,r.jsx)("p",{children:(0,r.jsx)(o.A,{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."})})]})})})}},2237:(e,t,n)=>{n.r(t),n.d(t,{default:()=>d});n(6540);var i=n(1312),o=n(1213),s=n(781),r=n(3363),a=n(4848);function d(){const e=(0,i.T)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(o.be,{title:e}),(0,a.jsx)(s.A,{children:(0,a.jsx)(r.A,{})})]})}}}]); \ No newline at end of file diff --git a/assets/js/242.8f375f31.js b/assets/js/242.8f375f31.js deleted file mode 100644 index 26c8c8ab..00000000 --- a/assets/js/242.8f375f31.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[242],{6535:(e,t,a)=>{a.d(t,{A:()=>b});var s=a(6540),n=a(4164),r=a(781),l=a(4581),i=a(8774),o=a(1312),c=a(6347),d=a(9169);function m(e){const{pathname:t}=(0,c.zy)();return(0,s.useMemo)((()=>e.filter((e=>function(e,t){return!(e.unlisted&&!(0,d.ys)(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=a(4848);function g(e){let{sidebar:t}=e;const a=m(t.items);return(0,h.jsx)("aside",{className:"col col--3",children:(0,h.jsxs)("nav",{className:(0,n.A)(u.sidebar,"thin-scrollbar"),"aria-label":(0,o.T)({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,n.A)(u.sidebarItemTitle,"margin-bottom--md"),children:t.title}),(0,h.jsx)("ul",{className:(0,n.A)(u.sidebarItemList,"clean-list"),children:a.map((e=>(0,h.jsx)("li",{className:u.sidebarItem,children:(0,h.jsx)(i.A,{isNavLink:!0,to:e.permalink,className:u.sidebarItemLink,activeClassName:u.sidebarItemLinkActive,children:e.title})},e.permalink)))})]})})}var x=a(5600);function j(e){let{sidebar:t}=e;const a=m(t.items);return(0,h.jsx)("ul",{className:"menu__list",children:a.map((e=>(0,h.jsx)("li",{className:"menu__list-item",children:(0,h.jsx)(i.A,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active",children:e.title})},e.permalink)))})}function p(e){return(0,h.jsx)(x.GX,{component:j,props:e})}function f(e){let{sidebar:t}=e;const a=(0,l.l)();return t?.items.length?"mobile"===a?(0,h.jsx)(p,{sidebar:t}):(0,h.jsx)(g,{sidebar:t}):null}function b(e){const{sidebar:t,toc:a,children:s,...l}=e,i=t&&t.items.length>0;return(0,h.jsx)(r.A,{...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,n.A)("col",{"col--7":i,"col--9 col--offset-1":!i}),children:s}),a&&(0,h.jsx)("div",{className:"col col--2",children:a})]})})})}},4651:(e,t,a)=>{a.d(t,{A:()=>R});a(6540);var s=a(4164),n=a(7131),r=a(4848);function l(e){let{children:t,className:a}=e;return(0,r.jsx)("article",{className:a,children:t})}var i=a(8774);const o={title:"title_f1Hy"};function c(e){let{className:t}=e;const{metadata:a,isBlogPostPage:l}=(0,n.e)(),{permalink:c,title:d}=a,m=l?"h1":"h2";return(0,r.jsx)(m,{className:(0,s.A)(o.title,t),children:l?d:(0,r.jsx)(i.A,{to:c,children:d})})}var d=a(1312),m=a(5846),u=a(6266);const h={container:"container_mt6G"};function g(e){let{readingTime:t}=e;const a=function(){const{selectMessage:e}=(0,m.W)();return t=>{const a=Math.ceil(t);return e(a,(0,d.T)({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:a}))}}();return(0,r.jsx)(r.Fragment,{children:a(t)})}function x(e){let{date:t,formattedDate:a}=e;return(0,r.jsx)("time",{dateTime:t,children:a})}function j(){return(0,r.jsx)(r.Fragment,{children:" \xb7 "})}function p(e){let{className:t}=e;const{metadata:a}=(0,n.e)(),{date:l,readingTime:i}=a,o=(0,u.i)({day:"numeric",month:"long",year:"numeric",timeZone:"UTC"});return(0,r.jsxs)("div",{className:(0,s.A)(h.container,"margin-vert--md",t),children:[(0,r.jsx)(x,{date:l,formattedDate:(c=l,o.format(new Date(c)))}),void 0!==i&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(j,{}),(0,r.jsx)(g,{readingTime:i})]})]});var c}function f(e){return e.href?(0,r.jsx)(i.A,{...e}):(0,r.jsx)(r.Fragment,{children:e.children})}function b(e){let{author:t,className:a}=e;const{name:n,title:l,url:i,imageURL:o,email:c}=t,d=i||c&&`mailto:${c}`||void 0;return(0,r.jsxs)("div",{className:(0,s.A)("avatar margin-bottom--sm",a),children:[o&&(0,r.jsx)(f,{href:d,className:"avatar__photo-link",children:(0,r.jsx)("img",{className:"avatar__photo",src:o,alt:n})}),n&&(0,r.jsxs)("div",{className:"avatar__intro",children:[(0,r.jsx)("div",{className:"avatar__name",children:(0,r.jsx)(f,{href:d,children:(0,r.jsx)("span",{children:n})})}),l&&(0,r.jsx)("small",{className:"avatar__subtitle",children:l})]})]})}const v={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function A(e){let{className:t}=e;const{metadata:{authors:a},assets:l}=(0,n.e)();if(0===a.length)return null;const i=a.every((e=>{let{name:t}=e;return!t}));return(0,r.jsx)("div",{className:(0,s.A)("margin-top--md margin-bottom--sm",i?v.imageOnlyAuthorRow:"row",t),children:a.map(((e,t)=>(0,r.jsx)("div",{className:(0,s.A)(!i&&"col col--6",i?v.imageOnlyAuthorCol:v.authorCol),children:(0,r.jsx)(b,{author:{...e,imageURL:l.authorsImageUrls[t]??e.imageURL}})},t)))})}function N(){return(0,r.jsxs)("header",{children:[(0,r.jsx)(c,{}),(0,r.jsx)(p,{}),(0,r.jsx)(A,{})]})}var _=a(440),k=a(5533);function P(e){let{children:t,className:a}=e;const{isBlogPostPage:l}=(0,n.e)();return(0,r.jsx)("div",{id:l?_.blogPostContainerID:void 0,className:(0,s.A)("markdown",a),children:(0,r.jsx)(k.A,{children:t})})}var w=a(7559),T=a(4336),I=a(2053);function L(){return(0,r.jsx)("b",{children:(0,r.jsx)(d.A,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts",children:"Read More"})})}function y(e){const{blogPostTitle:t,...a}=e;return(0,r.jsx)(i.A,{"aria-label":(0,d.T)({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}),...a,children:(0,r.jsx)(L,{})})}function C(){const{metadata:e,isBlogPostPage:t}=(0,n.e)(),{tags:a,title:l,editUrl:i,hasTruncateMarker:o,lastUpdatedBy:c,lastUpdatedAt:d}=e,m=!t&&o,u=a.length>0;if(!(u||m||i))return null;if(t){const e=!!(i||d||c);return(0,r.jsxs)("footer",{className:"docusaurus-mt-lg",children:[u&&(0,r.jsx)("div",{className:(0,s.A)("row","margin-top--sm",w.G.blog.blogFooterEditMetaRow),children:(0,r.jsx)("div",{className:"col",children:(0,r.jsx)(I.A,{tags:a})})}),e&&(0,r.jsx)(T.A,{className:(0,s.A)("margin-top--sm",w.G.blog.blogFooterEditMetaRow),editUrl:i,lastUpdatedAt:d,lastUpdatedBy:c})]})}return(0,r.jsxs)("footer",{className:"row docusaurus-mt-lg",children:[u&&(0,r.jsx)("div",{className:(0,s.A)("col",{"col--9":m}),children:(0,r.jsx)(I.A,{tags:a})}),m&&(0,r.jsx)("div",{className:(0,s.A)("col text--right",{"col--3":u}),children:(0,r.jsx)(y,{blogPostTitle:l,to:e.permalink})})]})}function R(e){let{children:t,className:a}=e;const i=function(){const{isBlogPostPage:e}=(0,n.e)();return e?void 0:"margin-bottom--xl"}();return(0,r.jsxs)(l,{className:(0,s.A)(i,a),children:[(0,r.jsx)(N,{}),(0,r.jsx)(P,{children:t}),(0,r.jsx)(C,{})]})}},9022:(e,t,a)=>{a.d(t,{A:()=>l});a(6540);var s=a(4164),n=a(8774),r=a(4848);function l(e){const{permalink:t,title:a,subLabel:l,isNext:i}=e;return(0,r.jsxs)(n.A,{className:(0,s.A)("pagination-nav__link",i?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[l&&(0,r.jsx)("div",{className:"pagination-nav__sublabel",children:l}),(0,r.jsx)("div",{className:"pagination-nav__label",children:a})]})}},6133:(e,t,a)=>{a.d(t,{A:()=>i});a(6540);var s=a(4164),n=a(8774);const r={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var l=a(4848);function i(e){let{permalink:t,label:a,count:i,description:o}=e;return(0,l.jsxs)(n.A,{href:t,title:o,className:(0,s.A)(r.tag,i?r.tagWithCount:r.tagRegular),children:[a,i&&(0,l.jsx)("span",{children:i})]})}},2053:(e,t,a)=>{a.d(t,{A:()=>o});a(6540);var s=a(4164),n=a(1312),r=a(6133);const l={tags:"tags_jXut",tag:"tag_QGVx"};var i=a(4848);function o(e){let{tags:t}=e;return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("b",{children:(0,i.jsx)(n.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,i.jsx)("ul",{className:(0,s.A)(l.tags,"padding--none","margin-left--sm"),children:t.map((e=>(0,i.jsx)("li",{className:l.tag,children:(0,i.jsx)(r.A,{...e})},e.permalink)))})]})}},7131:(e,t,a)=>{a.d(t,{e:()=>o,i:()=>i});var s=a(6540),n=a(9532),r=a(4848);const l=s.createContext(null);function i(e){let{children:t,content:a,isBlogPostPage:n=!1}=e;const i=function(e){let{content:t,isBlogPostPage:a}=e;return(0,s.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:a})),[t,a])}({content:a,isBlogPostPage:n});return(0,r.jsx)(l.Provider,{value:i,children:t})}function o(){const e=(0,s.useContext)(l);if(null===e)throw new n.dV("BlogPostProvider");return e}},5846:(e,t,a)=>{a.d(t,{W:()=>c});var s=a(6540),n=a(4586);const r=["zero","one","two","few","many","other"];function l(e){return r.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,n.A)();return(0,s.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,a)=>function(e,t,a){const s=e.split("|");if(1===s.length)return s[0];s.length>a.pluralForms.length&&console.error(`For locale=${a.locale}, a maximum of ${a.pluralForms.length} plural forms are expected (${a.pluralForms.join(",")}), but the message contains ${s.length}: ${e}`);const n=a.select(t),r=a.pluralForms.indexOf(n);return s[Math.min(r,s.length-1)]}(a,t,e)}}}}]); \ No newline at end of file diff --git a/assets/js/294ac9d5.7144cbd3.js b/assets/js/294ac9d5.7144cbd3.js new file mode 100644 index 00000000..a0df1b8b --- /dev/null +++ b/assets/js/294ac9d5.7144cbd3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8744],{7077:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>p,frontMatter:()=>r,metadata:()=>t,toc:()=>a});var o=i(4848),s=i(8453);const r={sidebar_position:5},l="Plugins and Helpers",t={id:"plugins",title:"Plugins and Helpers",description:"LmcRbacMvc provides a controller plugin and view helpers to check authorization.",source:"@site/docs/plugins.md",sourceDirName:".",slug:"/plugins",permalink:"/LmcRbacMvc/docs/next/plugins",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/docs/plugins.md",tags:[],version:"current",sidebarPosition:5,frontMatter:{sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"Configuration",permalink:"/LmcRbacMvc/docs/next/configuration"},next:{title:"A Real World Example",permalink:"/LmcRbacMvc/docs/next/Guides/example"}},c={},a=[{value:"Controller plugins",id:"controller-plugins",level:2},{value:"<code>isGranted(string $permission, $context=null): bool</code>",id:"isgrantedstring-permission-contextnull-bool",level:4},{value:"View Helpers",id:"view-helpers",level:2},{value:"<code>isGranted(string $permission, $context=null): bool</code>",id:"isgrantedstring-permission-contextnull-bool-1",level:4},{value:"<code>hasRole(array $roleOrRoles): bool</code>",id:"hasrolearray-roleorroles-bool",level:4}];function d(e){const n={code:"code",h1:"h1",h2:"h2",h4:"h4",header:"header",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"plugins-and-helpers",children:"Plugins and Helpers"})}),"\n",(0,o.jsx)(n.p,{children:"LmcRbacMvc provides a controller plugin and view helpers to check authorization."}),"\n",(0,o.jsx)(n.h2,{id:"controller-plugins",children:"Controller plugins"}),"\n",(0,o.jsx)(n.h4,{id:"isgrantedstring-permission-contextnull-bool",children:(0,o.jsx)(n.code,{children:"isGranted(string $permission, $context=null): bool"})}),"\n",(0,o.jsx)(n.p,{children:"Basic usage:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-php",children:" public function doSomethingAction()\n {\n if (!$this->isGranted('myPermission', $context)) {\n // redirect if not granted for example\n }\n }\n"})}),"\n",(0,o.jsx)(n.h2,{id:"view-helpers",children:"View Helpers"}),"\n",(0,o.jsx)(n.h4,{id:"isgrantedstring-permission-contextnull-bool-1",children:(0,o.jsx)(n.code,{children:"isGranted(string $permission, $context=null): bool"})}),"\n",(0,o.jsx)(n.p,{children:"Basic usage:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-php",children:" <?php if ($this->isGranted('myPermission', $myContext)): ?>\n <div>\n <p>Display only if granted</p>\n </div>\n <?php endif ?>\n"})}),"\n",(0,o.jsx)(n.h4,{id:"hasrolearray-roleorroles-bool",children:(0,o.jsx)(n.code,{children:"hasRole(array $roleOrRoles): bool"})}),"\n",(0,o.jsx)(n.p,{children:"Basic usage:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-php",children:" <?php if ($this->hasRole(['admin'])): ?>\n <div>\n <p>Display only if user has the admin role</p>\n </div>\n <?php endif ?>\n"})})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>l,x:()=>t});var o=i(6540);const s={},r=o.createContext(s);function l(e){const n=o.useContext(r);return o.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(s):e.components||s:l(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3275e2b8.c0d8267a.js b/assets/js/3275e2b8.c0d8267a.js deleted file mode 100644 index 3f90923e..00000000 --- a/assets/js/3275e2b8.c0d8267a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[63],{8478:a=>{a.exports=JSON.parse('{"tag":{"label":"laminas","permalink":"/LmcRbacMvc/blog/tags/laminas","allTagsPath":"/LmcRbacMvc/blog/tags","count":2,"unlisted":false},"listMetadata":{"permalink":"/LmcRbacMvc/blog/tags/laminas","page":1,"postsPerPage":10,"totalPages":1,"totalCount":2,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/3275e2b8.edaaaf30.js b/assets/js/3275e2b8.edaaaf30.js new file mode 100644 index 00000000..41ce30df --- /dev/null +++ b/assets/js/3275e2b8.edaaaf30.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8063],{8478:a=>{a.exports=JSON.parse('{"tag":{"label":"laminas","permalink":"/LmcRbacMvc/blog/tags/laminas","allTagsPath":"/LmcRbacMvc/blog/tags","count":2,"unlisted":false},"listMetadata":{"permalink":"/LmcRbacMvc/blog/tags/laminas","page":1,"postsPerPage":10,"totalPages":1,"totalCount":2,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/3347.6b0bf050.js b/assets/js/3347.6b0bf050.js new file mode 100644 index 00000000..81460770 --- /dev/null +++ b/assets/js/3347.6b0bf050.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3347],{4096:(e,t,a)=>{a.d(t,{in:()=>c,OU:()=>_,Ki:()=>M,kJ:()=>f,x:()=>i,e7:()=>u,J_:()=>x,Gx:()=>A});var n=a(6540),s=a(9532),r=a(6803),l=a(4848);function i(){const e=(0,r.A)(),t=e?.data?.blogMetadata;if(!t)throw new Error("useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context");return t}const o=n.createContext(null);function c(e){let{children:t,content:a,isBlogPostPage:s=!1}=e;const r=function(e){let{content:t,isBlogPostPage:a}=e;return(0,n.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:a})),[t,a])}({content:a,isBlogPostPage:s});return(0,l.jsx)(o.Provider,{value:r,children:t})}function u(){const e=(0,n.useContext)(o);if(null===e)throw new s.dV("BlogPostProvider");return e}var m=a(6025),h=a(4586);const d=e=>new Date(e).toISOString();function g(e){const t=e.map(v);return{author:1===t.length?t[0]:t}}function p(e,t,a){return e?{image:j({imageUrl:t(e,{absolute:!0}),caption:`title image for the blog post: ${a}`})}:{}}function f(e){const{siteConfig:t}=(0,h.A)(),{withBaseUrl:a}=(0,m.hH)(),{metadata:{blogDescription:n,blogTitle:s,permalink:r}}=e,l=`${t.url}${r}`;return{"@context":"https://schema.org","@type":"Blog","@id":l,mainEntityOfPage:l,headline:s,description:n,blogPost:e.items.map((e=>function(e,t,a){const{assets:n,frontMatter:s,metadata:r}=e,{date:l,title:i,description:o,lastUpdatedAt:c}=r,u=n.image??s.image,m=s.keywords??[],h=`${t.url}${r.permalink}`,f=c?d(c):void 0;return{"@type":"BlogPosting","@id":h,mainEntityOfPage:h,url:h,headline:i,name:i,description:o,datePublished:l,...f?{dateModified:f}:{},...g(r.authors),...p(u,a,i),...m?{keywords:m}:{}}}(e.content,t,a)))}}function x(){const e=i(),{assets:t,metadata:a}=u(),{siteConfig:n}=(0,h.A)(),{withBaseUrl:s}=(0,m.hH)(),{date:r,title:l,description:o,frontMatter:c,lastUpdatedAt:f}=a,x=t.image??c.image,v=c.keywords??[],j=f?d(f):void 0,b=`${n.url}${a.permalink}`;return{"@context":"https://schema.org","@type":"BlogPosting","@id":b,mainEntityOfPage:b,url:b,headline:l,name:l,description:o,datePublished:r,...j?{dateModified:j}:{},...g(a.authors),...p(x,s,l),...v?{keywords:v}:{},isPartOf:{"@type":"Blog","@id":`${n.url}${e.blogBasePath}`,name:e.blogTitle}}}function v(e){return{"@type":"Person",...e.name?{name:e.name}:{},...e.title?{description:e.title}:{},...e.url?{url:e.url}:{},...e.email?{email:e.email}:{},...e.imageURL?{image:e.imageURL}:{}}}function j(e){let{imageUrl:t,caption:a}=e;return{"@type":"ImageObject","@id":t,url:t,contentUrl:t,caption:a}}var b=a(6347),w=a(8774),N=a(1682),k=a(9169);function A(e){const{pathname:t}=(0,b.zy)();return(0,n.useMemo)((()=>e.filter((e=>function(e,t){return!(e.unlisted&&!(0,k.ys)(e.permalink,t))}(e,t)))),[e,t])}function M(e){const t=(0,N.$z)(e,(e=>`${new Date(e.date).getFullYear()}`)),a=Object.entries(t);return a.reverse(),a}function _(e){let{items:t,ulClassName:a,liClassName:n,linkClassName:s,linkActiveClassName:r}=e;return(0,l.jsx)("ul",{className:a,children:t.map((e=>(0,l.jsx)("li",{className:n,children:(0,l.jsx)(w.A,{isNavLink:!0,to:e.permalink,className:s,activeClassName:r,children:e.title})},e.permalink)))})}},6913:(e,t,a)=>{a.d(t,{A:()=>j});a(6540);var n=a(4164),s=a(8774),r=a(4848);const l="githubSvg_Uu4N";const i="xSvg_y3PF";const o=function(e){return(0,r.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",...e,children:[(0,r.jsx)("path",{stroke:"none",d:"M0 0h24v24H0z",fill:"none"}),(0,r.jsx)("path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0"}),(0,r.jsx)("path",{d:"M3.6 9h16.8"}),(0,r.jsx)("path",{d:"M3.6 15h16.8"}),(0,r.jsx)("path",{d:"M11.5 3a17 17 0 0 0 0 18"}),(0,r.jsx)("path",{d:"M12.5 3a17 17 0 0 1 0 18"})]})},c={authorSocials:"authorSocials_rSDt",authorSocialLink:"authorSocialLink_owbf",authorSocialIcon:"authorSocialIcon_XYv3"},u={twitter:{Icon:function(e){return(0,r.jsx)("svg",{viewBox:"0 0 256 209",width:"1em",height:"1em",xmlns:"http://www.w3.org/2000/svg",preserveAspectRatio:"xMidYMid",...e,children:(0,r.jsx)("path",{d:"M256 25.45c-9.42 4.177-19.542 7-30.166 8.27 10.845-6.5 19.172-16.793 23.093-29.057a105.183 105.183 0 0 1-33.351 12.745C205.995 7.201 192.346.822 177.239.822c-29.006 0-52.523 23.516-52.523 52.52 0 4.117.465 8.125 1.36 11.97-43.65-2.191-82.35-23.1-108.255-54.876-4.52 7.757-7.11 16.78-7.11 26.404 0 18.222 9.273 34.297 23.365 43.716a52.312 52.312 0 0 1-23.79-6.57c-.003.22-.003.44-.003.661 0 25.447 18.104 46.675 42.13 51.5a52.592 52.592 0 0 1-23.718.9c6.683 20.866 26.08 36.05 49.062 36.475-17.975 14.086-40.622 22.483-65.228 22.483-4.24 0-8.42-.249-12.529-.734 23.243 14.902 50.85 23.597 80.51 23.597 96.607 0 149.434-80.031 149.434-149.435 0-2.278-.05-4.543-.152-6.795A106.748 106.748 0 0 0 256 25.45",fill:"#55acee"})})},label:"Twitter"},github:{Icon:function(e){return(0,r.jsx)("svg",{viewBox:"0 0 256 250",width:"1em",height:"1em",...e,className:(0,n.A)(e.className,l),xmlns:"http://www.w3.org/2000/svg",style:{"--dark":"#000","--light":"#fff"},preserveAspectRatio:"xMidYMid",children:(0,r.jsx)("path",{d:"M128.001 0C57.317 0 0 57.307 0 128.001c0 56.554 36.676 104.535 87.535 121.46 6.397 1.185 8.746-2.777 8.746-6.158 0-3.052-.12-13.135-.174-23.83-35.61 7.742-43.124-15.103-43.124-15.103-5.823-14.795-14.213-18.73-14.213-18.73-11.613-7.944.876-7.78.876-7.78 12.853.902 19.621 13.19 19.621 13.19 11.417 19.568 29.945 13.911 37.249 10.64 1.149-8.272 4.466-13.92 8.127-17.116-28.431-3.236-58.318-14.212-58.318-63.258 0-13.975 5-25.394 13.188-34.358-1.329-3.224-5.71-16.242 1.24-33.874 0 0 10.749-3.44 35.21 13.121 10.21-2.836 21.16-4.258 32.038-4.307 10.878.049 21.837 1.47 32.066 4.307 24.431-16.56 35.165-13.12 35.165-13.12 6.967 17.63 2.584 30.65 1.255 33.873 8.207 8.964 13.173 20.383 13.173 34.358 0 49.163-29.944 59.988-58.447 63.157 4.591 3.972 8.682 11.762 8.682 23.704 0 17.126-.148 30.91-.148 35.126 0 3.407 2.304 7.398 8.792 6.14C219.37 232.5 256 184.537 256 128.002 256 57.307 198.691 0 128.001 0Zm-80.06 182.34c-.282.636-1.283.827-2.194.39-.929-.417-1.45-1.284-1.15-1.922.276-.655 1.279-.838 2.205-.399.93.418 1.46 1.293 1.139 1.931Zm6.296 5.618c-.61.566-1.804.303-2.614-.591-.837-.892-.994-2.086-.375-2.66.63-.566 1.787-.301 2.626.591.838.903 1 2.088.363 2.66Zm4.32 7.188c-.785.545-2.067.034-2.86-1.104-.784-1.138-.784-2.503.017-3.05.795-.547 2.058-.055 2.861 1.075.782 1.157.782 2.522-.019 3.08Zm7.304 8.325c-.701.774-2.196.566-3.29-.49-1.119-1.032-1.43-2.496-.726-3.27.71-.776 2.213-.558 3.315.49 1.11 1.03 1.45 2.505.701 3.27Zm9.442 2.81c-.31 1.003-1.75 1.459-3.199 1.033-1.448-.439-2.395-1.613-2.103-2.626.301-1.01 1.747-1.484 3.207-1.028 1.446.436 2.396 1.602 2.095 2.622Zm10.744 1.193c.036 1.055-1.193 1.93-2.715 1.95-1.53.034-2.769-.82-2.786-1.86 0-1.065 1.202-1.932 2.733-1.958 1.522-.03 2.768.818 2.768 1.868Zm10.555-.405c.182 1.03-.875 2.088-2.387 2.37-1.485.271-2.861-.365-3.05-1.386-.184-1.056.893-2.114 2.376-2.387 1.514-.263 2.868.356 3.061 1.403Z"})})},label:"GitHub"},stackoverflow:{Icon:function(e){return(0,r.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 169.61 200",width:"1em",height:"1em",...e,children:[(0,r.jsx)("path",{d:"M140.44 178.38v-48.65h21.61V200H0v-70.27h21.61v48.65z",fill:"#bcbbbb"}),(0,r.jsx)("path",{d:"M124.24 140.54l4.32-16.22-86.97-17.83-3.78 17.83zM49.7 82.16L130.72 120l7.56-16.22-81.02-37.83zm22.68-40l68.06 57.3 11.35-13.51-68.6-57.3-11.35 13.51zM116.14 0l-14.59 10.81 53.48 71.89 14.58-10.81zM37.81 162.16h86.43v-16.21H37.81z",fill:"#f48024"})]})},label:"Stack Overflow"},linkedin:{Icon:function(e){return(0,r.jsx)("svg",{width:"1em",height:"1em",xmlns:"http://www.w3.org/2000/svg",preserveAspectRatio:"xMidYMid",viewBox:"0 0 256 256",...e,children:(0,r.jsx)("path",{d:"M218.123 218.127h-37.931v-59.403c0-14.165-.253-32.4-19.728-32.4-19.756 0-22.779 15.434-22.779 31.369v60.43h-37.93V95.967h36.413v16.694h.51a39.907 39.907 0 0 1 35.928-19.733c38.445 0 45.533 25.288 45.533 58.186l-.016 67.013ZM56.955 79.27c-12.157.002-22.014-9.852-22.016-22.009-.002-12.157 9.851-22.014 22.008-22.016 12.157-.003 22.014 9.851 22.016 22.008A22.013 22.013 0 0 1 56.955 79.27m18.966 138.858H37.95V95.967h37.97v122.16ZM237.033.018H18.89C8.58-.098.125 8.161-.001 18.471v219.053c.122 10.315 8.576 18.582 18.89 18.474h218.144c10.336.128 18.823-8.139 18.966-18.474V18.454c-.147-10.33-8.635-18.588-18.966-18.453",fill:"#0A66C2"})})},label:"LinkedIn"},x:{Icon:function(e){return(0,r.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",fill:"none",viewBox:"0 0 1200 1227",...e,className:(0,n.A)(e.className,i),style:{"--dark":"#000","--light":"#fff"},children:(0,r.jsx)("path",{d:"M714.163 519.284 1160.89 0h-105.86L667.137 450.887 357.328 0H0l468.492 681.821L0 1226.37h105.866l409.625-476.152 327.181 476.152H1200L714.137 519.284h.026ZM569.165 687.828l-47.468-67.894-377.686-540.24h162.604l304.797 435.991 47.468 67.894 396.2 566.721H892.476L569.165 687.854v-.026Z"})})},label:"X"}};function m(e){let{platform:t,link:a}=e;const{Icon:l,label:i}=u[m=t]??{Icon:o,label:m};var m;return(0,r.jsx)(s.A,{className:c.authorSocialLink,href:a,title:i,children:(0,r.jsx)(l,{className:(0,n.A)(c.authorSocialLink)})})}function h(e){let{author:t}=e;const a=Object.entries(t.socials??{});return(0,r.jsx)("div",{className:c.authorSocials,children:a.map((e=>{let[t,a]=e;return(0,r.jsx)(m,{platform:t,link:a},t)}))})}var d=a(1107);const g={authorImage:"authorImage_XqGP","author-as-h1":"author-as-h1_n9oJ","author-as-h2":"author-as-h2_gXvM",authorDetails:"authorDetails_lV9A",authorName:"authorName_yefp",authorTitle:"authorTitle_nd0D",authorBlogPostCount:"authorBlogPostCount_iiJ5"};function p(e){return e.href?(0,r.jsx)(s.A,{...e}):(0,r.jsx)(r.Fragment,{children:e.children})}function f(e){let{title:t}=e;return(0,r.jsx)("small",{className:g.authorTitle,title:t,children:t})}function x(e){let{name:t,as:a}=e;return a?(0,r.jsx)(d.A,{as:a,className:g.authorName,children:t}):(0,r.jsx)("span",{className:g.authorName,children:t})}function v(e){let{count:t}=e;return(0,r.jsx)("span",{className:(0,n.A)(g.authorBlogPostCount),children:t})}function j(e){let{as:t,author:a,className:s,count:l}=e;const{name:i,title:o,url:c,imageURL:u,email:m,page:d}=a,j=d?.permalink||c||m&&`mailto:${m}`||void 0;return(0,r.jsxs)("div",{className:(0,n.A)("avatar margin-bottom--sm",s,g[`author-as-${t}`]),children:[u&&(0,r.jsx)(p,{href:j,className:"avatar__photo-link",children:(0,r.jsx)("img",{className:(0,n.A)("avatar__photo",g.authorImage),src:u,alt:i})}),(i||o)&&(0,r.jsxs)("div",{className:(0,n.A)("avatar__intro",g.authorDetails),children:[(0,r.jsxs)("div",{className:"avatar__name",children:[i&&(0,r.jsx)(p,{href:j,children:(0,r.jsx)(x,{name:i,as:t})}),l&&(0,r.jsx)(v,{count:l})]}),!!o&&(0,r.jsx)(f,{title:o}),(0,r.jsx)(h,{author:a})]})]})}},8027:(e,t,a)=>{a.d(t,{A:()=>L});var n=a(6540),s=a(4164),r=a(781),l=a(4581),i=a(1312),o=a(4096),c=a(6342),u=a(1107),m=a(4848);function h(e){let{year:t,yearGroupHeadingClassName:a,children:n}=e;return(0,m.jsxs)("div",{role:"group",children:[(0,m.jsx)(u.A,{as:"h3",className:a,children:t}),n]})}function d(e){let{items:t,yearGroupHeadingClassName:a,ListComponent:n}=e;if((0,c.p)().blog.sidebar.groupByYear){const e=(0,o.Ki)(t);return(0,m.jsx)(m.Fragment,{children:e.map((e=>{let[t,s]=e;return(0,m.jsx)(h,{year:t,yearGroupHeadingClassName:a,children:(0,m.jsx)(n,{items:s})},t)}))})}return(0,m.jsx)(n,{items:t})}const g=(0,n.memo)(d),p="sidebar_re4s",f="sidebarItemTitle_pO2u",x="sidebarItemList_Yudw",v="sidebarItem__DBe",j="sidebarItemLink_mo7H",b="sidebarItemLinkActive_I1ZP",w="yearGroupHeading_rMGB",N=e=>{let{items:t}=e;return(0,m.jsx)(o.OU,{items:t,ulClassName:(0,s.A)(x,"clean-list"),liClassName:v,linkClassName:j,linkActiveClassName:b})};function k(e){let{sidebar:t}=e;const a=(0,o.Gx)(t.items);return(0,m.jsx)("aside",{className:"col col--3",children:(0,m.jsxs)("nav",{className:(0,s.A)(p,"thin-scrollbar"),"aria-label":(0,i.T)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"}),children:[(0,m.jsx)("div",{className:(0,s.A)(f,"margin-bottom--md"),children:t.title}),(0,m.jsx)(g,{items:a,ListComponent:N,yearGroupHeadingClassName:w})]})})}const A=(0,n.memo)(k);var M=a(5600);const _={yearGroupHeading:"yearGroupHeading_QT03"},C=e=>{let{items:t}=e;return(0,m.jsx)(o.OU,{items:t,ulClassName:"menu__list",liClassName:"menu__list-item",linkClassName:"menu__link",linkActiveClassName:"menu__link--active"})};function y(e){let{sidebar:t}=e;const a=(0,o.Gx)(t.items);return(0,m.jsx)(g,{items:a,ListComponent:C,yearGroupHeadingClassName:_.yearGroupHeading})}function P(e){return(0,m.jsx)(M.GX,{component:y,props:e})}const B=(0,n.memo)(P);function I(e){let{sidebar:t}=e;const a=(0,l.l)();return t?.items.length?"mobile"===a?(0,m.jsx)(B,{sidebar:t}):(0,m.jsx)(A,{sidebar:t}):null}function L(e){const{sidebar:t,toc:a,children:n,...l}=e,i=t&&t.items.length>0;return(0,m.jsx)(r.A,{...l,children:(0,m.jsx)("div",{className:"container margin-vert--lg",children:(0,m.jsxs)("div",{className:"row",children:[(0,m.jsx)(I,{sidebar:t}),(0,m.jsx)("main",{className:(0,s.A)("col",{"col--7":i,"col--9 col--offset-1":!i}),children:n}),a&&(0,m.jsx)("div",{className:"col col--2",children:a})]})})})}},5846:(e,t,a)=>{a.d(t,{W:()=>c});var n=a(6540),s=a(4586);const r=["zero","one","two","few","many","other"];function l(e){return r.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,s.A)();return(0,n.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,a)=>function(e,t,a){const n=e.split("|");if(1===n.length)return n[0];n.length>a.pluralForms.length&&console.error(`For locale=${a.locale}, a maximum of ${a.pluralForms.length} plural forms are expected (${a.pluralForms.join(",")}), but the message contains ${n.length}: ${e}`);const s=a.select(t),r=a.pluralForms.indexOf(s);return n[Math.min(r,n.length-1)]}(a,t,e)}}}}]); \ No newline at end of file diff --git a/assets/js/36994c47.337a7516.js b/assets/js/36994c47.337a7516.js new file mode 100644 index 00000000..ede64387 --- /dev/null +++ b/assets/js/36994c47.337a7516.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9858],{5516:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-blog","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/36994c47.5b43e344.js b/assets/js/36994c47.5b43e344.js deleted file mode 100644 index 338074c4..00000000 --- a/assets/js/36994c47.5b43e344.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[858],{5516:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-blog","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/378f56c0.2d553100.js b/assets/js/378f56c0.2d553100.js new file mode 100644 index 00000000..ca25158e --- /dev/null +++ b/assets/js/378f56c0.2d553100.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5639],{6060:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>r,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>m,toc:()=>s});var c=n(4848),o=n(8453);const a={slug:"new-documentation",title:"New documentation",authors:["ericr"],tags:["laminas","PHP","lmcrbacmvc"]},i=void 0,m={permalink:"/LmcRbacMvc/blog/new-documentation",editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/blog/2024-02-22-New-documentation.md",source:"@site/blog/2024-02-22-New-documentation.md",title:"New documentation",description:"This the new documentation site dedicated to the LmcRbacMvc module.",date:"2024-02-22T00:00:00.000Z",tags:[{inline:!0,label:"laminas",permalink:"/LmcRbacMvc/blog/tags/laminas"},{inline:!0,label:"PHP",permalink:"/LmcRbacMvc/blog/tags/php"},{inline:!0,label:"lmcrbacmvc",permalink:"/LmcRbacMvc/blog/tags/lmcrbacmvc"}],readingTime:.11,hasTruncateMarker:!1,authors:[{name:"Eric Richer",title:"LM-Commons Administrator",url:"https://github.com/visto9259",imageURL:"https://github.com/visto9259.png",key:"ericr",page:null}],frontMatter:{slug:"new-documentation",title:"New documentation",authors:["ericr"],tags:["laminas","PHP","lmcrbacmvc"]},unlisted:!1,nextItem:{title:"Welcome",permalink:"/LmcRbacMvc/blog/welcome"}},r={authorsImageUrls:[void 0]},s=[];function l(e){const t={p:"p",...(0,o.R)(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(t.p,{children:"This the new documentation site dedicated to the LmcRbacMvc module."}),"\n",(0,c.jsx)(t.p,{children:"There are no changes to the code, just improvements in the documentation."})]})}function u(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,c.jsx)(t,{...e,children:(0,c.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>m});var c=n(6540);const o={},a=c.createContext(o);function i(e){const t=c.useContext(a);return c.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function m(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),c.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/378f56c0.ceb7f922.js b/assets/js/378f56c0.ceb7f922.js deleted file mode 100644 index e62f205d..00000000 --- a/assets/js/378f56c0.ceb7f922.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[639],{6060:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>r,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>m,toc:()=>s});var c=n(4848),o=n(8453);const a={slug:"new-documentation",title:"New documentation",authors:["ericr"],tags:["laminas","PHP","lmcrbacmvc"]},i=void 0,m={permalink:"/LmcRbacMvc/blog/new-documentation",editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/blog/2024-02-22-New-documentation.md",source:"@site/blog/2024-02-22-New-documentation.md",title:"New documentation",description:"This the new documentation site dedicated to the LmcRbacMvc module.",date:"2024-02-22T00:00:00.000Z",tags:[{inline:!0,label:"laminas",permalink:"/LmcRbacMvc/blog/tags/laminas"},{inline:!0,label:"PHP",permalink:"/LmcRbacMvc/blog/tags/php"},{inline:!0,label:"lmcrbacmvc",permalink:"/LmcRbacMvc/blog/tags/lmcrbacmvc"}],readingTime:.11,hasTruncateMarker:!1,authors:[{name:"Eric Richer",title:"LM-Commons Administrator",url:"https://github.com/visto9259",imageURL:"https://github.com/visto9259.png",key:"ericr"}],frontMatter:{slug:"new-documentation",title:"New documentation",authors:["ericr"],tags:["laminas","PHP","lmcrbacmvc"]},unlisted:!1,nextItem:{title:"Welcome",permalink:"/LmcRbacMvc/blog/welcome"}},r={authorsImageUrls:[void 0]},s=[];function l(e){const t={p:"p",...(0,o.R)(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(t.p,{children:"This the new documentation site dedicated to the LmcRbacMvc module."}),"\n",(0,c.jsx)(t.p,{children:"There are no changes to the code, just improvements in the documentation."})]})}function u(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,c.jsx)(t,{...e,children:(0,c.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>m});var c=n(6540);const o={},a=c.createContext(o);function i(e){const t=c.useContext(a);return c.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function m(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),c.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/393be207.1a944186.js b/assets/js/393be207.1a944186.js new file mode 100644 index 00000000..0499c1ba --- /dev/null +++ b/assets/js/393be207.1a944186.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4134],{633:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>c,toc:()=>d});var o=t(4848),a=t(8453);const r={title:"Markdown page example"},s="Markdown page example",c={type:"mdx",permalink:"/LmcRbacMvc/markdown-page",source:"@site/src/pages/markdown-page.md",title:"Markdown page example",description:"You don't need React to write simple standalone pages.",frontMatter:{title:"Markdown page example"},unlisted:!1},p={},d=[];function i(e){const n={h1:"h1",header:"header",p:"p",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"markdown-page-example",children:"Markdown page example"})}),"\n",(0,o.jsx)(n.p,{children:"You don't need React to write simple standalone pages."})]})}function l(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(i,{...e})}):i(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>c});var o=t(6540);const a={},r=o.createContext(a);function s(e){const n=o.useContext(r);return o.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(a):e.components||a:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/393be207.b3cf2c30.js b/assets/js/393be207.b3cf2c30.js deleted file mode 100644 index 01074d04..00000000 --- a/assets/js/393be207.b3cf2c30.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[134],{633:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>c,toc:()=>d});var o=t(4848),a=t(8453);const r={title:"Markdown page example"},s="Markdown page example",c={type:"mdx",permalink:"/LmcRbacMvc/markdown-page",source:"@site/src/pages/markdown-page.md",title:"Markdown page example",description:"You don't need React to write simple standalone pages.",frontMatter:{title:"Markdown page example"},unlisted:!1},p={},d=[];function i(e){const n={h1:"h1",p:"p",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"markdown-page-example",children:"Markdown page example"}),"\n",(0,o.jsx)(n.p,{children:"You don't need React to write simple standalone pages."})]})}function l(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(i,{...e})}):i(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>c});var o=t(6540);const a={},r=o.createContext(a);function s(e){const n=o.useContext(r);return o.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(a):e.components||a:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3af849c7.e8dc50a7.js b/assets/js/3af849c7.e8dc50a7.js new file mode 100644 index 00000000..03bcf8be --- /dev/null +++ b/assets/js/3af849c7.e8dc50a7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9926],{6087:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":"unreleased","badge":true,"noIndex":false,"className":"docs-version-current","isLast":false,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Getting Started","href":"/LmcRbacMvc/docs/next/intro","docId":"intro","unlisted":false},{"type":"link","label":"Guards","href":"/LmcRbacMvc/docs/next/guards","docId":"guards","unlisted":false},{"type":"link","label":"Strategies","href":"/LmcRbacMvc/docs/next/strategies","docId":"strategies","unlisted":false},{"type":"link","label":"Authorization Service","href":"/LmcRbacMvc/docs/next/using-the-authorization-service","docId":"using-the-authorization-service","unlisted":false},{"type":"link","label":"Configuration","href":"/LmcRbacMvc/docs/next/configuration","docId":"configuration","unlisted":false},{"type":"link","label":"Plugins and Helpers","href":"/LmcRbacMvc/docs/next/plugins","docId":"plugins","unlisted":false},{"type":"category","label":"Guides","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"A Real World Example","href":"/LmcRbacMvc/docs/next/Guides/example","docId":"Guides/example","unlisted":false},{"type":"link","label":"Custom Identity Providers","href":"/LmcRbacMvc/docs/next/Guides/identity-providers","docId":"Guides/identity-providers","unlisted":false},{"type":"link","label":"Using LmcRbacMvc and LmcUser","href":"/LmcRbacMvc/docs/next/Guides/lmcuser","docId":"Guides/lmcuser","unlisted":false},{"type":"link","label":"Debugging Tools","href":"/LmcRbacMvc/docs/next/Guides/debugging","docId":"Guides/debugging","unlisted":false}]},{"type":"category","label":"Upgrading","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"From v3 to v4","href":"/LmcRbacMvc/docs/next/Upgrading/upgrade","docId":"Upgrading/upgrade","unlisted":false}]}]},"docs":{"configuration":{"id":"configuration","title":"Configuring LmcRbacMvc","description":"LmcRbacMvc is configured via the lmc_rbac key in the application config.","sidebar":"tutorialSidebar"},"guards":{"id":"guards","title":"Guards","description":"In this section, you will learn:","sidebar":"tutorialSidebar"},"Guides/debugging":{"id":"Guides/debugging","title":"Debugging Tools","description":"LmcRbacMvcDeveloperTools is an extension","sidebar":"tutorialSidebar"},"Guides/example":{"id":"Guides/example","title":"A Real World Example","description":"In this example we are going to create a very little real world application. We will create a controller","sidebar":"tutorialSidebar"},"Guides/identity-providers":{"id":"Guides/identity-providers","title":"Create a custom identity provider","description":"Identity providers return the current identity. Most of the time, this means the logged in user. LmcRbacMvc comes with a","sidebar":"tutorialSidebar"},"Guides/lmcuser":{"id":"Guides/lmcuser","title":"Using LmcRbacMvc and LmcUser","description":"To use the authentication service from LmcUser, there are a few actions to take:","sidebar":"tutorialSidebar"},"intro":{"id":"intro","title":"Getting Started","description":"LmcRbacMvc is a companion component that extends the functionality of LmcRbac to provide Role-based Access Control","sidebar":"tutorialSidebar"},"plugins":{"id":"plugins","title":"Plugins and Helpers","description":"LmcRbacMvc provides a controller plugin and view helpers to check authorization.","sidebar":"tutorialSidebar"},"strategies":{"id":"strategies","title":"Strategies","description":"What are strategies?","sidebar":"tutorialSidebar"},"Upgrading/upgrade":{"id":"Upgrading/upgrade","title":"Upgrading from v3 to v4","description":"","sidebar":"tutorialSidebar"},"using-the-authorization-service":{"id":"using-the-authorization-service","title":"Using the Authorization Service","description":"The LmcRbacMvc Authorization service is a wrapper for the LmcRbac Authorization service.","sidebar":"tutorialSidebar"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/3b8c55ea.3149f13b.js b/assets/js/3b8c55ea.3149f13b.js deleted file mode 100644 index a48c6840..00000000 --- a/assets/js/3b8c55ea.3149f13b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[803],{6845:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>s,metadata:()=>r,toc:()=>c});var t=i(4848),o=i(8453);const s={sidebar_position:2,sidebar_label:"Requirements and Installation"},l="Requirements and Installation",r={id:"installation",title:"Requirements and Installation",description:"Requirements",source:"@site/docs/installation.md",sourceDirName:".",slug:"/installation",permalink:"/LmcRbacMvc/docs/installation",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/docs/installation.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2,sidebar_label:"Requirements and Installation"},sidebar:"tutorialSidebar",previous:{title:"Introduction",permalink:"/LmcRbacMvc/docs/intro"},next:{title:"Quick Start",permalink:"/LmcRbacMvc/docs/quick-start"}},a={},c=[{value:"Requirements",id:"requirements",level:2},{value:"Optional",id:"optional",level:2},{value:"Installation",id:"installation",level:2},{value:"Upgrade",id:"upgrade",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"requirements-and-installation",children:"Requirements and Installation"}),"\n",(0,t.jsx)(n.h2,{id:"requirements",children:"Requirements"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"PHP 8.0 or higher"}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://github.com/zf-fr/rbac",children:"lm-commons/rbac component v1"}),": this is actually a prototype for the ZF3 Rbac component."]}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"http://www.github.com/laminas",children:"Laminas Components 2.x | 3.x or higher"})}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"optional",children:"Optional"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://github.com/doctrine/DoctrineModule",children:"DoctrineModule"}),": if you want to use some built-in role and permission providers."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://github.com/laminas/Laminas%5CDeveloperTools",children:"Laminas\\DeveloperTools"}),": if you want to have useful stats added to\nthe Laminas Developer toolbar."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,t.jsxs)(n.p,{children:["LmcRbacMvc only officially supports installation through Composer. For Composer documentation, please refer to\n",(0,t.jsx)(n.a,{href:"http://getcomposer.org/",children:"getcomposer.org"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"Install the module:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"$ composer require lm-commons/lmc-rbac-mvc:^3.0\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Enable the module by adding ",(0,t.jsx)(n.code,{children:"LmcRbacMvc"})," key to your ",(0,t.jsx)(n.code,{children:"application.config.php"})," or ",(0,t.jsx)(n.code,{children:"modules.config.php"})," file. Customize the module by copy-pasting\nthe ",(0,t.jsx)(n.code,{children:"lmc_rbac.global.php.dist"})," file to your ",(0,t.jsx)(n.code,{children:"config/autoload"})," folder."]}),"\n",(0,t.jsx)(n.h2,{id:"upgrade",children:"Upgrade"}),"\n",(0,t.jsx)(n.p,{children:"LmcRbacMvc introduces breaking changes from zfcrbac v2:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["[BC] The namespace has been changed from ",(0,t.jsx)(n.code,{children:"ZfcRbac"})," to ",(0,t.jsx)(n.code,{children:"LmcRbacMvc"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["[BC] The key ",(0,t.jsx)(n.code,{children:"zfc_rbac"})," in autoload and module config files has been replaced\nby the ",(0,t.jsx)(n.code,{children:"lmc_rbac"})," key."]}),"\n",(0,t.jsx)(n.li,{children:"Requires PHP 8.0 or later"}),"\n",(0,t.jsx)(n.li,{children:"Requires Laminas MVC components 3.x or later"}),"\n",(0,t.jsx)(n.li,{children:"Uses PSR-4 autoload"}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>l,x:()=>r});var t=i(6540);const o={},s=t.createContext(o);function l(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(o):e.components||o:l(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4e6224b1.163e7fc5.js b/assets/js/4e6224b1.163e7fc5.js new file mode 100644 index 00000000..b8534657 --- /dev/null +++ b/assets/js/4e6224b1.163e7fc5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4107],{6441:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>a,contentTitle:()=>o,default:()=>u,frontMatter:()=>c,metadata:()=>s,toc:()=>h});var n=t(4848),r=t(8453);const c={sidebar_position:4,sidebar_label:"Authorization Service"},o="Using the Authorization Service",s={id:"using-the-authorization-service",title:"Using the Authorization Service",description:"The LmcRbacMvc Authorization service is a wrapper for the LmcRbac Authorization service.",source:"@site/docs/using-the-authorization-service.md",sourceDirName:".",slug:"/using-the-authorization-service",permalink:"/LmcRbacMvc/docs/next/using-the-authorization-service",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/docs/using-the-authorization-service.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{sidebar_position:4,sidebar_label:"Authorization Service"},sidebar:"tutorialSidebar",previous:{title:"Strategies",permalink:"/LmcRbacMvc/docs/next/strategies"},next:{title:"Configuration",permalink:"/LmcRbacMvc/docs/next/configuration"}},a={},h=[{value:"Injecting the Authorization Service",id:"injecting-the-authorization-service",level:2},{value:"Permissions and Assertions",id:"permissions-and-assertions",level:2}];function d(e){const i={admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"using-the-authorization-service",children:"Using the Authorization Service"})}),"\n",(0,n.jsx)(i.p,{children:"The LmcRbacMvc Authorization service is a wrapper for the LmcRbac Authorization service."}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.code,{children:"\\Lmc\\Rbac\\Mvc\\Service\\AuthorizationService"})," provides the same methods as ",(0,n.jsx)(i.code,{children:"\\Lmc\\Rbac\\Service\\AuthorizationService"}),"\nexcept for the ",(0,n.jsx)(i.code,{children:"isGranted()"})," method which does not required an identity parameter."]}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.code,{children:"\\Lmc\\Rbac\\Mvc\\Service\\AuthorizationService::isGranted()"})," will get the identity from the\nLaminas Authentication Service directly."]}),"\n",(0,n.jsx)(i.h2,{id:"injecting-the-authorization-service",children:"Injecting the Authorization Service"}),"\n",(0,n.jsx)(i.p,{children:"Different techniques for injecting the Authorization Service are described in LmcRbac. The same techniques apply\nto LmcRbacMvc using the equivalent wrapper classes and trait:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.code,{children:"\\Lmc\\Rbac\\Mvc\\Service\\AuthorizationServiceAwareInterface"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.code,{children:"\\Lmc\\Rbac\\Mvc\\Service\\AuthorizationServiceAwareTrait"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.code,{children:"\\Lmc\\Rbac\\Mvc\\Service\\AuthorizationServiceDelegatorFactory"})}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:"Refer to this section in LmcRbac on how to inject the Authorization Service."}),"\n",(0,n.jsx)(i.h2,{id:"permissions-and-assertions",children:"Permissions and Assertions"}),"\n",(0,n.jsx)(i.p,{children:"Assertions are provided by LmcRbac. Refer to the Assertion section in LmcRbac on how to configure assertions."}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.code,{children:"\\Lmc\\Rbac\\Mvc\\Service\\AuthorizationService"})," provides the same methods as ",(0,n.jsx)(i.code,{children:"\\Lmc\\Rbac\\Service\\AuthorizationService"})," to\noverride assertions at run-time."]}),"\n",(0,n.jsxs)(i.admonition,{type:"warning",children:[(0,n.jsxs)(i.p,{children:["If you are upgrading from v3, please not that assertions must now implement the\n",(0,n.jsx)(i.code,{children:"Lmc\\Rbac\\Assertion\\AssertionInterface"})," interface which has a different signature for the ",(0,n.jsx)(i.code,{children:"assert()"})," method."]}),(0,n.jsxs)(i.p,{children:["Make sure to update your assertions to follow the ",(0,n.jsx)(i.code,{children:"Lmc\\Rbac\\Assertion\\AssertionInterface"})," interface."]})]})]})}function u(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>o,x:()=>s});var n=t(6540);const r={},c=n.createContext(r);function o(e){const i=n.useContext(c);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function s(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),n.createElement(c.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4e6224b1.497eb0d7.js b/assets/js/4e6224b1.497eb0d7.js deleted file mode 100644 index 4eba28b2..00000000 --- a/assets/js/4e6224b1.497eb0d7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[107],{6441:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var s=i(4848),t=i(8453);const r={sidebar_position:7},o="Using the Authorization Service",a={id:"using-the-authorization-service",title:"Using the Authorization Service",description:"This section will teach you how to use the AuthorizationService to its full extent.",source:"@site/docs/using-the-authorization-service.md",sourceDirName:".",slug:"/using-the-authorization-service",permalink:"/LmcRbacMvc/docs/using-the-authorization-service",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/docs/using-the-authorization-service.md",tags:[],version:"current",sidebarPosition:7,frontMatter:{sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"Strategies",permalink:"/LmcRbacMvc/docs/strategies"},next:{title:"Cookbook",permalink:"/LmcRbacMvc/docs/cookbook"}},c={},l=[{value:"Injecting the Authorization Service",id:"injecting-the-authorization-service",level:2},{value:"Using initializers",id:"using-initializers",level:3},{value:"Using delegator factory",id:"using-delegator-factory",level:3},{value:"Using Factories",id:"using-factories",level:3},{value:"Permissions and Assertions",id:"permissions-and-assertions",level:2},{value:"Defining assertions",id:"defining-assertions",level:3},{value:"Defining the assertion map",id:"defining-the-assertion-map",level:3},{value:"Checking permissions in a service",id:"checking-permissions-in-a-service",level:3},{value:"Checking permissions in controllers and views",id:"checking-permissions-in-controllers-and-views",level:3},{value:"In a controller :",id:"in-a-controller-",level:4},{value:"In a view :",id:"in-a-view-",level:4},{value:"Defining additional permissions",id:"defining-additional-permissions",level:3}];function h(e){const n={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",p:"p",pre:"pre",strong:"strong",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"using-the-authorization-service",children:"Using the Authorization Service"}),"\n",(0,s.jsx)(n.p,{children:"This section will teach you how to use the AuthorizationService to its full extent."}),"\n",(0,s.jsx)(n.h2,{id:"injecting-the-authorization-service",children:"Injecting the Authorization Service"}),"\n",(0,s.jsx)(n.h3,{id:"using-initializers",children:"Using initializers"}),"\n",(0,s.jsxs)(n.p,{children:["To automatically inject the authorization service into your classes, you can implement the\n",(0,s.jsx)(n.code,{children:"AuthorizationServiceAwareInterface"})," and use the trait, as shown below:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"namespace YourModule;\n\nuse LmcRbacMvc\\Service\\AuthorizationServiceAwareInterface;\nuse LmcRbacMvc\\Service\\AuthorizationServiceAwareTrait;\n\nclass MyClass implements AuthorizationServiceAwareInterface\n{\n use AuthorizationServiceAwareTrait;\n\n public function doSomethingThatRequiresAuth()\n {\n if (! $this->getAuthorizationService()->isGranted('deletePost')) {\n throw new UnauthorizedException('You are not allowed !');\n }\n\n return true;\n }\n}\n"})}),"\n",(0,s.jsx)(n.p,{children:"Then, register the initializer in your config (it is not registered by default):"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"class Module\n{\n // ...\n\n public function getServiceConfig()\n {\n return [\n 'initializers' => [\n 'LmcRbacMvc\\Initializer\\AuthorizationServiceInitializer'\n ]\n ];\n }\n}\n"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"While initializers allow rapid prototyping, their use can lead to more fragile code. We'd suggest using factories."}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"using-delegator-factory",children:"Using delegator factory"}),"\n",(0,s.jsxs)(n.p,{children:["LmcRbacMvc is shipped with a ",(0,s.jsx)(n.code,{children:"LmcRbacMvc\\Factory\\AuthorizationServiceDelegatorFactory"})," ",(0,s.jsx)(n.a,{href:"https://docs.laminas.dev/laminas-servicemanager/delegators/",children:"delegator factory"}),"\nto automatically inject the authorization service into your classes."]}),"\n",(0,s.jsxs)(n.p,{children:["As for the initializer, the class must implement the ",(0,s.jsx)(n.code,{children:"AuthorizationServiceAwareInterface"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"You just have to add your classes to the right delegator :"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"class Module\n{\n // ...\n\n public function getServiceConfig()\n {\n return [\n 'invokables' => [\n 'Application\\Service\\MyClass' => 'Application\\Service\\MyClassService',\n ],\n 'delegators' => [\n 'Application\\Service\\MyClass' => [\n 'LmcRbacMvc\\Factory\\AuthorizationServiceDelegatorFactory',\n // eventually add more delegators here\n ],\n ],\n ];\n }\n}\n"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"While they need a little more configuration, delegator factories have better performances than initializers."}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"using-factories",children:"Using Factories"}),"\n",(0,s.jsxs)(n.p,{children:["You can inject the AuthorizationService into your factories by using Laminas' ServiceManager. The AuthorizationService\nis known to the ServiceManager as ",(0,s.jsx)(n.code,{children:"'LmcRbacMvc\\Service\\AuthorizationService'"}),". Here is a classic example for injecting\nthe AuthorizationService:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.em,{children:"YourModule/Module.php"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"class Module\n{\n // getAutoloaderConfig(), etc...\n\n public function getServiceConfig()\n {\n return [\n 'factories' => [\n 'MyService' => function($sm) {\n $authService = $sm->get('LmcRbacMvc\\Service\\AuthorizationService');\n return new MyService($authService);\n }\n ]\n ];\n }\n}\n"})}),"\n",(0,s.jsx)(n.h2,{id:"permissions-and-assertions",children:"Permissions and Assertions"}),"\n",(0,s.jsx)(n.p,{children:"Since you now know how to inject the AuthorizationService, let's use it!"}),"\n",(0,s.jsxs)(n.p,{children:["One of the great things the AuthorizationService brings are ",(0,s.jsx)(n.strong,{children:"assertions"}),". Assertions get executed ",(0,s.jsx)(n.em,{children:"if the identity\nin fact holds the permission you are requesting"}),". A common example is a blog post, which only the author can edit. In\nthis case, you have a ",(0,s.jsx)(n.code,{children:"post.edit"})," permission and run an assertion checking the author afterwards."]}),"\n",(0,s.jsx)(n.h3,{id:"defining-assertions",children:"Defining assertions"}),"\n",(0,s.jsxs)(n.p,{children:["The AssertionPluginManager is a great way for you to use assertions and IOC. You can add new assertions quite easily\nby adding this to your ",(0,s.jsx)(n.code,{children:"module.config.php"})," file:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'assertion_manager' => [\n 'factories' => [\n 'MyAssertion' => 'MyAssertionFactory'\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsx)(n.h3,{id:"defining-the-assertion-map",children:"Defining the assertion map"}),"\n",(0,s.jsxs)(n.p,{children:["The assertion map can automatically map permissions to assertions. This means that every time you check for a\npermission with an assertion map, you'll include the assertion in your check. You can define the assertion map by\nadding this to your ",(0,s.jsx)(n.code,{children:"module.config.php"})," file:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'assertion_map' => [\n 'myPermission' => 'myAssertion'\n ]\n ]\n];\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Now, every time you check for ",(0,s.jsx)(n.code,{children:"myPermission"}),", ",(0,s.jsx)(n.code,{children:"myAssertion"})," will be checked as well."]}),"\n",(0,s.jsx)(n.h3,{id:"checking-permissions-in-a-service",children:"Checking permissions in a service"}),"\n",(0,s.jsx)(n.p,{children:"So let's check for a permission, shall we?"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"$authorizationService->isGranted('myPermission');\n"})}),"\n",(0,s.jsx)(n.p,{children:"That was easy, wasn't it?"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"isGranted"})," checks if the current identity is granted the permission and additionally runs the assertion that is\nprovided by the assertion map."]}),"\n",(0,s.jsx)(n.h3,{id:"checking-permissions-in-controllers-and-views",children:"Checking permissions in controllers and views"}),"\n",(0,s.jsx)(n.p,{children:"LmcRbacMvc comes with both a controller plugin and a view helper to check permissions."}),"\n",(0,s.jsx)(n.h4,{id:"in-a-controller-",children:"In a controller :"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:" public function doSomethingAction()\n {\n if (!$this->isGranted('myPermission')) {\n // redirect if not granted for example\n }\n }\n"})}),"\n",(0,s.jsx)(n.h4,{id:"in-a-view-",children:"In a view :"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:" <?php if ($this->isGranted('myPermission')): ?>\n <div>\n <p>Display only if granted</p>\n </div>\n <?php endif ?>\n"})}),"\n",(0,s.jsx)(n.h3,{id:"defining-additional-permissions",children:"Defining additional permissions"}),"\n",(0,s.jsx)(n.p,{children:"But what if you don't want to use the assertion map? That's quite easy as well!"}),"\n",(0,s.jsx)(n.p,{children:"Here are four examples of how to run an assertion without using the assertion map:"}),"\n",(0,s.jsx)(n.p,{children:"Disable the assertion:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"$authorizationService->setAssertion('myPermission', null);\n$authorizationService->isGranted('myPermission');\n"})}),"\n",(0,s.jsx)(n.p,{children:"Callback assertion:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"$something = true;\n\n$authorizationService->setAssertion(\n 'myPermission',\n function(AuthorizationService $authorization, $context = true) use ($something) {\n return $something === $context\n }\n);\n\n$authorizationService->isGranted('myPermission'); // returns true, when the identity holds the permission `myPermission`\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Object implementing ",(0,s.jsx)(n.code,{children:"AssertionInterface"}),":"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"$context = true;\n\n$authorizationService->setAssertion('myPermission', new MyAssertion($foo, $bar));\n$authorizationService->isGranted('myPermission', $context);\n"})}),"\n",(0,s.jsx)(n.p,{children:"Using the AssertionPluginManager:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"$context = true;\n$authorizationService->setAssertion('myPermission', 'MyAssertion');\n$authorizationService->isGranted('myPermission', $context);\n"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.em,{children:"Please note: The context parameter is optional!"})})]})}function d(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>a});var s=i(6540);const t={},r=s.createContext(t);function o(e){const n=s.useContext(r);return s.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(t):e.components||t:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/538.3a792d77.js b/assets/js/538.3a792d77.js deleted file mode 100644 index f798a1cc..00000000 --- a/assets/js/538.3a792d77.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[538],{7293:(e,t,n)=>{"use strict";n.d(t,{A:()=>L});var s=n(6540),o=n(4848);function a(e){const{mdxAdmonitionTitle:t,rest:n}=function(e){const t=s.Children.toArray(e),n=t.find((e=>s.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),a=t.filter((e=>e!==n)),c=n?.props.children;return{mdxAdmonitionTitle:c,rest:a.length>0?(0,o.jsx)(o.Fragment,{children:a}):null}}(e.children),a=e.title??t;return{...e,...a&&{title:a},children:n}}var c=n(4164),r=n(1312),i=n(7559);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,o.jsx)("div",{className:(0,c.A)(i.G.common.admonition,i.G.common.admonitionType(t),l.admonition,n),children:s})}function u(e){let{icon:t,title:n}=e;return(0,o.jsxs)("div",{className:l.admonitionHeading,children:[(0,o.jsx)("span",{className:l.admonitionIcon,children:t}),n]})}function m(e){let{children:t}=e;return t?(0,o.jsx)("div",{className:l.admonitionContent,children:t}):null}function h(e){const{type:t,icon:n,title:s,children:a,className:c}=e;return(0,o.jsxs)(d,{type:t,className:c,children:[s||n?(0,o.jsx)(u,{title:s,icon:n}):null,(0,o.jsx)(m,{children:a})]})}function p(e){return(0,o.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,o.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,o.jsx)(p,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function x(e){return(0,o.jsx)(h,{...f,...e,className:(0,c.A)("alert alert--secondary",e.className),children:e.children})}function b(e){return(0,o.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,o.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 j={icon:(0,o.jsx)(b,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function g(e){return(0,o.jsx)(h,{...j,...e,className:(0,c.A)("alert alert--success",e.className),children:e.children})}function v(e){return(0,o.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,o.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 y={icon:(0,o.jsx)(v,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function N(e){return(0,o.jsx)(h,{...y,...e,className:(0,c.A)("alert alert--info",e.className),children:e.children})}function A(e){return(0,o.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,o.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 B={icon:(0,o.jsx)(A,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function k(e){return(0,o.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,o.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,o.jsx)(k,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const C={icon:(0,o.jsx)(A,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const E={...{note:x,tip:g,info:N,warning:function(e){return(0,o.jsx)(h,{...B,...e,className:(0,c.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,o.jsx)(h,{...w,...e,className:(0,c.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,o.jsx)(x,{title:"secondary",...e}),important:e=>(0,o.jsx)(N,{title:"important",...e}),success:e=>(0,o.jsx)(g,{title:"success",...e}),caution:function(e){return(0,o.jsx)(h,{...C,...e,className:(0,c.A)("alert alert--warning",e.className),children:e.children})}}};function L(e){const t=a(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,o.jsx)(n,{...t})}},4336:(e,t,n)=>{"use strict";n.d(t,{A:()=>x});n(6540);var s=n(4164),o=n(1312),a=n(7559),c=n(8774);const r={iconEdit:"iconEdit_Z9Sw"};var i=n(4848);function l(e){let{className:t,...n}=e;return(0,i.jsx)("svg",{fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,s.A)(r.iconEdit,t),"aria-hidden":"true",...n,children:(0,i.jsx)("g",{children:(0,i.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,i.jsxs)(c.A,{to:t,className:a.G.common.editThisPage,children:[(0,i.jsx)(l,{}),(0,i.jsx)(o.A,{id:"theme.common.editThisPage",description:"The link label to edit the current page",children:"Edit this page"})]})}var u=n(6266);function m(e){let{lastUpdatedAt:t}=e;const n=new Date(t),s=(0,u.i)({day:"numeric",month:"short",year:"numeric",timeZone:"UTC"}).format(n);return(0,i.jsx)(o.A,{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:n.toISOString(),itemProp:"dateModified",children:s})})},children:" on {date}"})}function h(e){let{lastUpdatedBy:t}=e;return(0,i.jsx)(o.A,{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 p(e){let{lastUpdatedAt:t,lastUpdatedBy:n}=e;return(0,i.jsxs)("span",{className:a.G.common.lastUpdated,children:[(0,i.jsx)(o.A,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t?(0,i.jsx)(m,{lastUpdatedAt:t}):"",byUser:n?(0,i.jsx)(h,{lastUpdatedBy:n}):""},children:"Last updated{atDate}{byUser}"}),!1]})}const f={lastUpdated:"lastUpdated_JAkA"};function x(e){let{className:t,editUrl:n,lastUpdatedAt:o,lastUpdatedBy:a}=e;return(0,i.jsxs)("div",{className:(0,s.A)("row",t),children:[(0,i.jsx)("div",{className:"col",children:n&&(0,i.jsx)(d,{editUrl:n})}),(0,i.jsx)("div",{className:(0,s.A)("col",f.lastUpdated),children:(o||a)&&(0,i.jsx)(p,{lastUpdatedAt:o,lastUpdatedBy:a})})]})}},5533:(e,t,n)=>{"use strict";n.d(t,{A:()=>ie});var s=n(6540),o=n(8453),a=n(5260),c=n(2303),r=n(4164),i=n(5293),l=n(6342);function d(){const{prism:e}=(0,l.p)(),{colorMode:t}=(0,i.G)(),n=e.theme,s=e.darkTheme||n;return"dark"===t?s:n}var u=n(7559),m=n(8426),h=n.n(m);const p=/title=(?<quote>["'])(?<title>.*?)\1/,f=/\{(?<range>[\d,-]+)\}/,x={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}},b={...x,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:""}},j=Object.keys(x);function g(e,t){const n=e.map((e=>{const{start:n,end:s}=b[e];return`(?:${n}\\s*(${t.flatMap((e=>[e.line,e.block?.start,e.block?.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:o,metastring:a}=t;if(a&&f.test(a)){const e=a.match(f).groups.range;if(0===o.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${a}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const t=o[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 c=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return g(["js","jsBlock"],t);case"jsx":case"tsx":return g(["js","jsBlock","jsx"],t);case"html":return g(["js","jsBlock","html"],t);case"python":case"py":case"bash":return g(["bash"],t);case"markdown":case"md":return g(["html","jsx","bash"],t);case"tex":case"latex":case"matlab":return g(["tex"],t);case"lua":case"haskell":case"sql":return g(["lua"],t);case"wasm":return g(["wasm"],t);case"vb":case"vba":case"visual-basic":return g(["vb","rem"],t);case"vbnet":return g(["vbnet","rem"],t);case"batch":return g(["rem"],t);case"basic":return g(["rem","f90"],t);case"fsharp":return g(["js","ml"],t);case"ocaml":case"sml":return g(["ml"],t);case"fortran":return g(["f90"],t);case"cobol":return g(["cobol"],t);default:return g(j,t)}}(s,o),r=n.split("\n"),i=Object.fromEntries(o.map((e=>[e.className,{start:0,range:""}]))),l=Object.fromEntries(o.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),d=Object.fromEntries(o.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),u=Object.fromEntries(o.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let h=0;h<r.length;){const e=r[h].match(c);if(!e){h+=1;continue}const t=e.slice(1).find((e=>void 0!==e));l[t]?i[l[t]].range+=`${h},`:d[t]?i[d[t]].start=h:u[t]&&(i[u[t]].range+=`${i[u[t]].start}-${h-1},`),r.splice(h,1)}n=r.join("\n");const m={};return Object.entries(i).forEach((e=>{let[t,{range:n}]=e;h()(n).forEach((e=>{m[e]??=[],m[e].push(t)}))})),{lineClassNames:m,code:n}}const y={codeBlockContainer:"codeBlockContainer_Ckt0"};var N=n(4848);function A(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,o]=e;const a=t[s];a&&"string"==typeof o&&(n[a]=o)})),n}(d());return(0,N.jsx)(t,{...n,style:s,className:(0,r.A)(n.className,y.codeBlockContainer,u.G.common.codeBlock)})}const B={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function k(e){let{children:t,className:n}=e;return(0,N.jsx)(A,{as:"pre",tabIndex:0,className:(0,r.A)(B.codeBlockStandalone,"thin-scrollbar",n),children:(0,N.jsx)("code",{className:B.codeBlockLines,children:t})})}var w=n(9532);const C={attributes:!0,characterData:!0,childList:!0,subtree:!0};function E(e,t){const[n,o]=(0,s.useState)(),a=(0,s.useCallback)((()=>{o(e.current?.closest("[role=tabpanel][hidden]"))}),[e,o]);(0,s.useEffect)((()=>{a()}),[a]),function(e,t,n){void 0===n&&(n=C);const o=(0,w._q)(t),a=(0,w.Be)(n);(0,s.useEffect)((()=>{const t=new MutationObserver(o);return e&&t.observe(e,a),()=>t.disconnect()}),[e,o,a])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),a())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}var L=n(1765);const T={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function _(e){let{line:t,classNames:n,showLineNumbers:s,getLineProps:o,getTokenProps:a}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const c=o({line:t,className:(0,r.A)(n,s&&T.codeLine)}),i=t.map(((e,t)=>(0,N.jsx)("span",{...a({token:e})},t)));return(0,N.jsxs)("span",{...c,children:[s?(0,N.jsxs)(N.Fragment,{children:[(0,N.jsx)("span",{className:T.codeLineNumber}),(0,N.jsx)("span",{className:T.codeLineContent,children:i})]}):i,(0,N.jsx)("br",{})]})}var S=n(1312);function U(e){return(0,N.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,N.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 M(e){return(0,N.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,N.jsx)("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"})})}const z={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function I(e){let{code:t,className:n}=e;const[o,a]=(0,s.useState)(!1),c=(0,s.useRef)(void 0),i=(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"),o=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 a=document.getSelection(),c=a.rangeCount>0&&a.getRangeAt(0);n.append(s),s.select(),s.selectionStart=0,s.selectionEnd=e.length;let r=!1;try{r=document.execCommand("copy")}catch{}s.remove(),c&&(a.removeAllRanges(),a.addRange(c)),o&&o.focus()}(t),a(!0),c.current=window.setTimeout((()=>{a(!1)}),1e3)}),[t]);return(0,s.useEffect)((()=>()=>window.clearTimeout(c.current)),[]),(0,N.jsx)("button",{type:"button","aria-label":o?(0,S.T)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,S.T)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,S.T)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,r.A)("clean-btn",n,z.copyButton,o&&z.copyButtonCopied),onClick:i,children:(0,N.jsxs)("span",{className:z.copyButtonIcons,"aria-hidden":"true",children:[(0,N.jsx)(U,{className:z.copyButtonIcon}),(0,N.jsx)(M,{className:z.copyButtonSuccessIcon})]})})}function H(e){return(0,N.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,N.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 R={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function V(e){let{className:t,onClick:n,isEnabled:s}=e;const o=(0,S.T)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return(0,N.jsx)("button",{type:"button",onClick:n,className:(0,r.A)("clean-btn",t,s&&R.wordWrapButtonEnabled),"aria-label":o,title:o,children:(0,N.jsx)(H,{className:R.wordWrapButtonIcon,"aria-hidden":"true"})})}function $(e){let{children:t,className:n="",metastring:o,title:a,showLineNumbers:c,language:i}=e;const{prism:{defaultLanguage:u,magicComments:m}}=(0,l.p)(),h=function(e){return e?.toLowerCase()}(i??function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return t?.replace(/language-/,"")}(n)??u),f=d(),x=function(){const[e,t]=(0,s.useState)(!1),[n,o]=(0,s.useState)(!1),a=(0,s.useRef)(null),c=(0,s.useCallback)((()=>{const n=a.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[a,e]),r=(0,s.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=a.current,n=e>t||a.current.querySelector("code").hasAttribute("style");o(n)}),[a]);return E(a,r),(0,s.useEffect)((()=>{r()}),[e,r]),(0,s.useEffect)((()=>(window.addEventListener("resize",r,{passive:!0}),()=>{window.removeEventListener("resize",r)})),[r]),{codeBlockRef:a,isEnabled:e,isCodeScrollable:n,toggle:c}}(),b=function(e){return e?.match(p)?.groups.title??""}(o)||a,{lineClassNames:j,code:g}=v(t,{metastring:o,language:h,magicComments:m}),y=c??function(e){return Boolean(e?.includes("showLineNumbers"))}(o);return(0,N.jsxs)(A,{as:"div",className:(0,r.A)(n,h&&!n.includes(`language-${h}`)&&`language-${h}`),children:[b&&(0,N.jsx)("div",{className:B.codeBlockTitle,children:b}),(0,N.jsxs)("div",{className:B.codeBlockContent,children:[(0,N.jsx)(L.f4,{theme:f,code:g,language:h??"text",children:e=>{let{className:t,style:n,tokens:s,getLineProps:o,getTokenProps:a}=e;return(0,N.jsx)("pre",{tabIndex:0,ref:x.codeBlockRef,className:(0,r.A)(t,B.codeBlock,"thin-scrollbar"),style:n,children:(0,N.jsx)("code",{className:(0,r.A)(B.codeBlockLines,y&&B.codeBlockLinesWithNumbering),children:s.map(((e,t)=>(0,N.jsx)(_,{line:e,getLineProps:o,getTokenProps:a,classNames:j[t],showLineNumbers:y},t)))})})}}),(0,N.jsxs)("div",{className:B.buttonGroup,children:[(x.isEnabled||x.isCodeScrollable)&&(0,N.jsx)(V,{className:B.codeButton,onClick:()=>x.toggle(),isEnabled:x.isEnabled}),(0,N.jsx)(I,{className:B.codeButton,code:g})]})]})]})}function W(e){let{children:t,...n}=e;const o=(0,c.A)(),a=function(e){return s.Children.toArray(e).some((e=>(0,s.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),r="string"==typeof a?$:k;return(0,N.jsx)(r,{...n,children:a},String(o))}function D(e){return(0,N.jsx)("code",{...e})}var P=n(8774);var q=n(3427),G=n(1422);const O={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};function F(e){return!!e&&("SUMMARY"===e.tagName||F(e.parentElement))}function Z(e,t){return!!e&&(e===t||Z(e.parentElement,t))}function J(e){let{summary:t,children:n,...o}=e;(0,q.A)().collectAnchor(o.id);const a=(0,c.A)(),i=(0,s.useRef)(null),{collapsed:l,setCollapsed:d}=(0,G.u)({initialState:!o.open}),[u,m]=(0,s.useState)(o.open),h=s.isValidElement(t)?t:(0,N.jsx)("summary",{children:t??"Details"});return(0,N.jsxs)("details",{...o,ref:i,open:u,"data-collapsed":l,className:(0,r.A)(O.details,a&&O.isBrowser,o.className),onMouseDown:e=>{F(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const t=e.target;F(t)&&Z(t,i.current)&&(e.preventDefault(),l?(d(!1),m(!0)):d(!0))},children:[h,(0,N.jsx)(G.N,{lazy:!1,collapsed:l,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{d(e),m(!e)},children:(0,N.jsx)("div",{className:O.collapsibleContent,children:n})})]})}const Y={details:"details_b_Ee"},K="alert alert--info";function Q(e){let{...t}=e;return(0,N.jsx)(J,{...t,className:(0,r.A)(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)),o=(0,N.jsx)(N.Fragment,{children:t.filter((e=>e!==n))});return(0,N.jsx)(Q,{...e,summary:n,children:o})}var ee=n(1107);function te(e){return(0,N.jsx)(ee.A,{...e})}const ne={containsTaskList:"containsTaskList_mC6p"};function se(e){if(void 0!==e)return(0,r.A)(e,e?.includes("contains-task-list")&&ne.containsTaskList)}const oe={img:"img_ev3q"};var ae=n(7293),ce=n(418);const re={Head:a.A,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,N.jsx)(D,{...e}):(0,N.jsx)(W,{...e})},a:function(e){return(0,N.jsx)(P.A,{...e})},pre:function(e){return(0,N.jsx)(N.Fragment,{children:e.children})},ul:function(e){return(0,N.jsx)("ul",{...e,className:se(e.className)})},li:function(e){return(0,q.A)().collectAnchor(e.id),(0,N.jsx)("li",{...e})},img:function(e){return(0,N.jsx)("img",{decoding:"async",loading:"lazy",...e,className:(t=e.className,(0,r.A)(t,oe.img))});var t},h1:e=>(0,N.jsx)(te,{as:"h1",...e}),h2:e=>(0,N.jsx)(te,{as:"h2",...e}),h3:e=>(0,N.jsx)(te,{as:"h3",...e}),h4:e=>(0,N.jsx)(te,{as:"h4",...e}),h5:e=>(0,N.jsx)(te,{as:"h5",...e}),h6:e=>(0,N.jsx)(te,{as:"h6",...e}),admonition:ae.A,mermaid:ce.A};function ie(e){let{children:t}=e;return(0,N.jsx)(o.x,{components:re,children:t})}},6266:(e,t,n)=>{"use strict";n.d(t,{i:()=>o});var s=n(4586);function o(e){void 0===e&&(e={});const{i18n:{currentLocale:t}}=(0,s.A)(),n=function(){const{i18n:{currentLocale:e,localeConfigs:t}}=(0,s.A)();return t[e].calendar}();return new Intl.DateTimeFormat(t,{calendar:n,...e})}},8426:(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,o,a]=t;if(s&&a){s=parseInt(s),a=parseInt(a);const e=s<a?1:-1;"-"!==o&&".."!==o&&"\u2025"!==o||(a+=e);for(let t=s;t!==a;t+=e)n.push(t)}}return n}t.default=n,e.exports=n},8453:(e,t,n)=>{"use strict";n.d(t,{R:()=>c,x:()=>r});var s=n(6540);const o={},a=s.createContext(o);function c(e){const t=s.useContext(a);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(o):e.components||o:c(e.components),s.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/57a1fbff.be0d9c8e.js b/assets/js/57a1fbff.be0d9c8e.js new file mode 100644 index 00000000..fa81118b --- /dev/null +++ b/assets/js/57a1fbff.be0d9c8e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2417],{6160:e=>{e.exports=JSON.parse('{"metadata":{"permalink":"/LmcRbacMvc/blog","page":1,"postsPerPage":10,"totalPages":1,"totalCount":2,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/57a1fbff.c104b4f4.js b/assets/js/57a1fbff.c104b4f4.js deleted file mode 100644 index 472fa1cc..00000000 --- a/assets/js/57a1fbff.c104b4f4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[417],{6160:e=>{e.exports=JSON.parse('{"metadata":{"permalink":"/LmcRbacMvc/blog","page":1,"postsPerPage":10,"totalPages":1,"totalCount":2,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/5e95c892.3d1fe17f.js b/assets/js/5e95c892.3d1fe17f.js new file mode 100644 index 00000000..ce6156be --- /dev/null +++ b/assets/js/5e95c892.3d1fe17f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9647],{7121:(e,s,r)=>{r.r(s),r.d(s,{default:()=>l});r(6540);var c=r(4164),u=r(1213),a=r(7559),d=r(2831),n=r(781),t=r(4848);function l(e){return(0,t.jsx)(u.e3,{className:(0,c.A)(a.G.wrapper.docsPages),children:(0,t.jsx)(n.A,{children:(0,d.v)(e.route.routes)})})}}}]); \ No newline at end of file diff --git a/assets/js/5e95c892.4bba8c03.js b/assets/js/5e95c892.4bba8c03.js deleted file mode 100644 index 4058442f..00000000 --- a/assets/js/5e95c892.4bba8c03.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[647],{7121:(e,s,r)=>{r.r(s),r.d(s,{default:()=>l});r(6540);var c=r(4164),u=r(1213),a=r(7559),d=r(2831),n=r(781),t=r(4848);function l(e){return(0,t.jsx)(u.e3,{className:(0,c.A)(a.G.wrapper.docsPages),children:(0,t.jsx)(n.A,{children:(0,d.v)(e.route.routes)})})}}}]); \ No newline at end of file diff --git a/assets/js/621db11d.4117d741.js b/assets/js/621db11d.4117d741.js new file mode 100644 index 00000000..a1769a7e --- /dev/null +++ b/assets/js/621db11d.4117d741.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4212],{3250:(t,e,s)=>{s.r(e),s.d(e,{default:()=>m});s(6540);var a=s(4164),o=s(1213),r=s(7559),l=s(6461),u=s(8027),n=s(1463),i=s(1107),c=s(6913);const h={authorListItem:"authorListItem_n3yI"};var g=s(4848);function p(t){let{author:e}=t;return(0,g.jsx)("li",{className:h.authorListItem,children:(0,g.jsx)(c.A,{as:"h2",author:e,count:e.count})})}function d(t){let{authors:e}=t;return(0,g.jsx)("section",{className:(0,a.A)("margin-vert--lg",h.authorsListSection),children:(0,g.jsx)("ul",{children:e.map((t=>(0,g.jsx)(p,{author:t},t.key)))})})}function m(t){let{authors:e,sidebar:s}=t;const c=(0,l.uz)();return(0,g.jsxs)(o.e3,{className:(0,a.A)(r.G.wrapper.blogPages,r.G.page.blogAuthorsListPage),children:[(0,g.jsx)(o.be,{title:c}),(0,g.jsx)(n.A,{tag:"blog_authors_list"}),(0,g.jsxs)(u.A,{sidebar:s,children:[(0,g.jsx)(i.A,{as:"h1",children:c}),(0,g.jsx)(d,{authors:e})]})]})}},6461:(t,e,s)=>{s.d(e,{ZD:()=>l,uz:()=>u});s(6540);var a=s(1312),o=s(5846);s(4848);function r(){const{selectMessage:t}=(0,o.W)();return e=>t(e,(0,a.T)({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:e}))}function l(t){const e=r();return(0,a.T)({id:"theme.blog.tagTitle",description:"The title of the page for a blog tag",message:'{nPosts} tagged with "{tagName}"'},{nPosts:e(t.count),tagName:t.label})}const u=()=>(0,a.T)({id:"theme.blog.authorsList.pageTitle",message:"Authors",description:"The title of the authors page"})}}]); \ No newline at end of file diff --git a/assets/js/633f8beb.55fa4972.js b/assets/js/633f8beb.55fa4972.js new file mode 100644 index 00000000..6d613528 --- /dev/null +++ b/assets/js/633f8beb.55fa4972.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8102],{8169:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>c,default:()=>g,frontMatter:()=>a,metadata:()=>i,toc:()=>d});var r=n(4848),o=n(8453);const a={title:"Upgrading from v3 to v4",sidebar_label:"From v3 to v4"},c=void 0,i={id:"Upgrading/upgrade",title:"Upgrading from v3 to v4",description:"",source:"@site/docs/Upgrading/upgrade.md",sourceDirName:"Upgrading",slug:"/Upgrading/upgrade",permalink:"/LmcRbacMvc/docs/next/Upgrading/upgrade",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/docs/Upgrading/upgrade.md",tags:[],version:"current",frontMatter:{title:"Upgrading from v3 to v4",sidebar_label:"From v3 to v4"},sidebar:"tutorialSidebar",previous:{title:"Debugging Tools",permalink:"/LmcRbacMvc/docs/next/Guides/debugging"}},s={},d=[];function u(e){return(0,r.jsx)(r.Fragment,{})}function g(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(u,{...e})}):u()}},8453:(e,t,n)=>{n.d(t,{R:()=>c,x:()=>i});var r=n(6540);const o={},a=r.createContext(o);function c(e){const t=r.useContext(a);return r.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(o):e.components||o:c(e.components),r.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6875c492.0d9791f6.js b/assets/js/6875c492.0d9791f6.js new file mode 100644 index 00000000..1c5ac62d --- /dev/null +++ b/assets/js/6875c492.0d9791f6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4813],{7713:(e,t,a)=>{a.d(t,{A:()=>r});a(6540);var n=a(1312),s=a(9022),i=a(4848);function r(e){const{metadata:t}=e,{previousPage:a,nextPage:r}=t;return(0,i.jsxs)("nav",{className:"pagination-nav","aria-label":(0,n.T)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[a&&(0,i.jsx)(s.A,{permalink:a,title:(0,i.jsx)(n.A,{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)(s.A,{permalink:r,title:(0,i.jsx)(n.A,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older entries"}),isNext:!0})]})}},2907:(e,t,a)=>{a.d(t,{A:()=>B});a(6540);var n=a(4164),s=a(4096),i=a(4848);function r(e){let{children:t,className:a}=e;return(0,i.jsx)("article",{className:a,children:t})}var l=a(8774);const o={title:"title_f1Hy"};function c(e){let{className:t}=e;const{metadata:a,isBlogPostPage:r}=(0,s.e7)(),{permalink:c,title:d}=a,g=r?"h1":"h2";return(0,i.jsx)(g,{className:(0,n.A)(o.title,t),children:r?d:(0,i.jsx)(l.A,{to:c,children:d})})}var d=a(1312),g=a(5846),u=a(6266);const m={container:"container_mt6G"};function h(e){let{readingTime:t}=e;const a=function(){const{selectMessage:e}=(0,g.W)();return t=>{const a=Math.ceil(t);return e(a,(0,d.T)({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:a}))}}();return(0,i.jsx)(i.Fragment,{children:a(t)})}function p(e){let{date:t,formattedDate:a}=e;return(0,i.jsx)("time",{dateTime:t,children:a})}function x(){return(0,i.jsx)(i.Fragment,{children:" \xb7 "})}function j(e){let{className:t}=e;const{metadata:a}=(0,s.e7)(),{date:r,readingTime:l}=a,o=(0,u.i)({day:"numeric",month:"long",year:"numeric",timeZone:"UTC"});return(0,i.jsxs)("div",{className:(0,n.A)(m.container,"margin-vert--md",t),children:[(0,i.jsx)(p,{date:r,formattedDate:(c=r,o.format(new Date(c)))}),void 0!==l&&(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(x,{}),(0,i.jsx)(h,{readingTime:l})]})]});var c}var b=a(6913);const A={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function f(e){let{className:t}=e;const{metadata:{authors:a},assets:r}=(0,s.e7)();if(0===a.length)return null;const l=a.every((e=>{let{name:t}=e;return!t})),o=1===a.length;return(0,i.jsx)("div",{className:(0,n.A)("margin-top--md margin-bottom--sm",l?A.imageOnlyAuthorRow:"row",t),children:a.map(((e,t)=>(0,i.jsx)("div",{className:(0,n.A)(!l&&(o?"col col--12":"col col--6"),l?A.imageOnlyAuthorCol:A.authorCol),children:(0,i.jsx)(b.A,{author:{...e,imageURL:r.authorsImageUrls[t]??e.imageURL}})},t)))})}function v(){return(0,i.jsxs)("header",{children:[(0,i.jsx)(c,{}),(0,i.jsx)(j,{}),(0,i.jsx)(f,{})]})}var T=a(440),N=a(5533);function w(e){let{children:t,className:a}=e;const{isBlogPostPage:r}=(0,s.e7)();return(0,i.jsx)("div",{id:r?T.LU:void 0,className:(0,n.A)("markdown",a),children:(0,i.jsx)(N.A,{children:t})})}var _=a(7559),k=a(4336),y=a(2053);function P(){return(0,i.jsx)("b",{children:(0,i.jsx)(d.A,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts",children:"Read more"})})}function R(e){const{blogPostTitle:t,...a}=e;return(0,i.jsx)(l.A,{"aria-label":(0,d.T)({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}),...a,children:(0,i.jsx)(P,{})})}function U(){const{metadata:e,isBlogPostPage:t}=(0,s.e7)(),{tags:a,title:r,editUrl:l,hasTruncateMarker:o,lastUpdatedBy:c,lastUpdatedAt:d}=e,g=!t&&o,u=a.length>0;if(!(u||g||l))return null;if(t){const e=!!(l||d||c);return(0,i.jsxs)("footer",{className:"docusaurus-mt-lg",children:[u&&(0,i.jsx)("div",{className:(0,n.A)("row","margin-top--sm",_.G.blog.blogFooterEditMetaRow),children:(0,i.jsx)("div",{className:"col",children:(0,i.jsx)(y.A,{tags:a})})}),e&&(0,i.jsx)(k.A,{className:(0,n.A)("margin-top--sm",_.G.blog.blogFooterEditMetaRow),editUrl:l,lastUpdatedAt:d,lastUpdatedBy:c})]})}return(0,i.jsxs)("footer",{className:"row docusaurus-mt-lg",children:[u&&(0,i.jsx)("div",{className:(0,n.A)("col",{"col--9":g}),children:(0,i.jsx)(y.A,{tags:a})}),g&&(0,i.jsx)("div",{className:(0,n.A)("col text--right",{"col--3":u}),children:(0,i.jsx)(R,{blogPostTitle:r,to:e.permalink})})]})}function B(e){let{children:t,className:a}=e;const l=function(){const{isBlogPostPage:e}=(0,s.e7)();return e?void 0:"margin-bottom--xl"}();return(0,i.jsxs)(r,{className:(0,n.A)(l,a),children:[(0,i.jsx)(v,{}),(0,i.jsx)(w,{children:t}),(0,i.jsx)(U,{})]})}},3892:(e,t,a)=>{a.d(t,{A:()=>r});a(6540);var n=a(4096),s=a(2907),i=a(4848);function r(e){let{items:t,component:a=s.A}=e;return(0,i.jsx)(i.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,i.jsx)(n.in,{content:t,children:(0,i.jsx)(a,{children:(0,i.jsx)(t,{})})},t.metadata.permalink)}))})}},3069:(e,t,a)=>{a.r(t),a.d(t,{default:()=>b});a(6540);var n=a(4164),s=a(1312),i=a(1213),r=a(7559),l=a(6461),o=a(8774),c=a(8027),d=a(7713),g=a(1463),u=a(3892),m=a(2234),h=a(1107),p=a(4848);function x(e){let{tag:t}=e;const a=(0,l.ZD)(t);return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(i.be,{title:a,description:t.description}),(0,p.jsx)(g.A,{tag:"blog_tags_posts"})]})}function j(e){let{tag:t,items:a,sidebar:n,listMetadata:i}=e;const r=(0,l.ZD)(t);return(0,p.jsxs)(c.A,{sidebar:n,children:[t.unlisted&&(0,p.jsx)(m.A,{}),(0,p.jsxs)("header",{className:"margin-bottom--xl",children:[(0,p.jsx)(h.A,{as:"h1",children:r}),t.description&&(0,p.jsx)("p",{children:t.description}),(0,p.jsx)(o.A,{href:t.allTagsPath,children:(0,p.jsx)(s.A,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page",children:"View All Tags"})})]}),(0,p.jsx)(u.A,{items:a}),(0,p.jsx)(d.A,{metadata:i})]})}function b(e){return(0,p.jsxs)(i.e3,{className:(0,n.A)(r.G.wrapper.blogPages,r.G.page.blogTagPostListPage),children:[(0,p.jsx)(x,{...e}),(0,p.jsx)(j,{...e})]})}},2234:(e,t,a)=>{a.d(t,{A:()=>c});a(6540);var n=a(4164),s=a(4084),i=a(7559),r=a(7293),l=a(4848);function o(e){let{className:t}=e;return(0,l.jsx)(r.A,{type:"caution",title:(0,l.jsx)(s.Rc,{}),className:(0,n.A)(t,i.G.common.unlistedBanner),children:(0,l.jsx)(s.Uh,{})})}function c(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(s.AE,{}),(0,l.jsx)(o,{...e})]})}},9022:(e,t,a)=>{a.d(t,{A:()=>r});a(6540);var n=a(4164),s=a(8774),i=a(4848);function r(e){const{permalink:t,title:a,subLabel:r,isNext:l}=e;return(0,i.jsxs)(s.A,{className:(0,n.A)("pagination-nav__link",l?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[r&&(0,i.jsx)("div",{className:"pagination-nav__sublabel",children:r}),(0,i.jsx)("div",{className:"pagination-nav__label",children:a})]})}},6133:(e,t,a)=>{a.d(t,{A:()=>l});a(6540);var n=a(4164),s=a(8774);const i={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var r=a(4848);function l(e){let{permalink:t,label:a,count:l,description:o}=e;return(0,r.jsxs)(s.A,{href:t,title:o,className:(0,n.A)(i.tag,l?i.tagWithCount:i.tagRegular),children:[a,l&&(0,r.jsx)("span",{children:l})]})}},2053:(e,t,a)=>{a.d(t,{A:()=>o});a(6540);var n=a(4164),s=a(1312),i=a(6133);const r={tags:"tags_jXut",tag:"tag_QGVx"};var l=a(4848);function o(e){let{tags:t}=e;return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("b",{children:(0,l.jsx)(s.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,l.jsx)("ul",{className:(0,n.A)(r.tags,"padding--none","margin-left--sm"),children:t.map((e=>(0,l.jsx)("li",{className:r.tag,children:(0,l.jsx)(i.A,{...e})},e.permalink)))})]})}},6461:(e,t,a)=>{a.d(t,{ZD:()=>r,uz:()=>l});a(6540);var n=a(1312),s=a(5846);a(4848);function i(){const{selectMessage:e}=(0,s.W)();return t=>e(t,(0,n.T)({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}))}function r(e){const t=i();return(0,n.T)({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})}const l=()=>(0,n.T)({id:"theme.blog.authorsList.pageTitle",message:"Authors",description:"The title of the authors page"})},4084:(e,t,a)=>{a.d(t,{AE:()=>o,Rc:()=>r,TT:()=>d,Uh:()=>l,Yh:()=>c});a(6540);var n=a(1312),s=a(5260),i=a(4848);function r(){return(0,i.jsx)(n.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function l(){return(0,i.jsx)(n.A,{id:"theme.contentVisibility.unlistedBanner.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 o(){return(0,i.jsx)(s.A,{children:(0,i.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function c(){return(0,i.jsx)(n.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function d(){return(0,i.jsx)(n.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}}}]); \ No newline at end of file diff --git a/assets/js/6875c492.3f033c5c.js b/assets/js/6875c492.3f033c5c.js deleted file mode 100644 index caa60266..00000000 --- a/assets/js/6875c492.3f033c5c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[813],{7713:(e,t,n)=>{n.d(t,{A:()=>r});n(6540);var s=n(1312),a=n(9022),i=n(4848);function r(e){const{metadata:t}=e,{previousPage:n,nextPage:r}=t;return(0,i.jsxs)("nav",{className:"pagination-nav","aria-label":(0,s.T)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[n&&(0,i.jsx)(a.A,{permalink:n,title:(0,i.jsx)(s.A,{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.A,{permalink:r,title:(0,i.jsx)(s.A,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older Entries"}),isNext:!0})]})}},3892:(e,t,n)=>{n.d(t,{A:()=>r});n(6540);var s=n(7131),a=n(4651),i=n(4848);function r(e){let{items:t,component:n=a.A}=e;return(0,i.jsx)(i.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,i.jsx)(s.i,{content:t,children:(0,i.jsx)(n,{children:(0,i.jsx)(t,{})})},t.metadata.permalink)}))})}},3069:(e,t,n)=>{n.r(t),n.d(t,{default:()=>A});n(6540);var s=n(4164),a=n(1312),i=n(5846),r=n(1213),l=n(7559),o=n(8774),c=n(6535),d=n(7713),g=n(1463),u=n(3892),p=n(996),h=n(1107),m=n(4848);function x(e){const t=function(){const{selectMessage:e}=(0,i.W)();return t=>e(t,(0,a.T)({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.T)({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.be,{title:n,description:t.description}),(0,m.jsx)(g.A,{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.A,{sidebar:s,children:[t.unlisted&&(0,m.jsx)(p.A,{}),(0,m.jsxs)("header",{className:"margin-bottom--xl",children:[(0,m.jsx)(h.A,{as:"h1",children:r}),t.description&&(0,m.jsx)("p",{children:t.description}),(0,m.jsx)(o.A,{href:t.allTagsPath,children:(0,m.jsx)(a.A,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page",children:"View All Tags"})})]}),(0,m.jsx)(u.A,{items:n}),(0,m.jsx)(d.A,{metadata:i})]})}function A(e){return(0,m.jsxs)(r.e3,{className:(0,s.A)(l.G.wrapper.blogPages,l.G.page.blogTagPostListPage),children:[(0,m.jsx)(j,{...e}),(0,m.jsx)(b,{...e})]})}},996:(e,t,n)=>{n.d(t,{A:()=>p});n(6540);var s=n(4164),a=n(1312),i=n(5260),r=n(4848);function l(){return(0,r.jsx)(a.A,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function o(){return(0,r.jsx)(a.A,{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.A,{children:(0,r.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}var d=n(7559),g=n(7293);function u(e){let{className:t}=e;return(0,r.jsx)(g.A,{type:"caution",title:(0,r.jsx)(l,{}),className:(0,s.A)(t,d.G.common.unlistedBanner),children:(0,r.jsx)(o,{})})}function p(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/712eb253.32121b00.js b/assets/js/712eb253.32121b00.js new file mode 100644 index 00000000..0bb0dd3f --- /dev/null +++ b/assets/js/712eb253.32121b00.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7784],{8657:e=>{e.exports=JSON.parse('{"archive":{"blogPosts":[{"id":"new-documentation","metadata":{"permalink":"/LmcRbacMvc/blog/new-documentation","editUrl":"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/blog/2024-02-22-New-documentation.md","source":"@site/blog/2024-02-22-New-documentation.md","title":"New documentation","description":"This the new documentation site dedicated to the LmcRbacMvc module.","date":"2024-02-22T00:00:00.000Z","tags":[{"inline":true,"label":"laminas","permalink":"/LmcRbacMvc/blog/tags/laminas"},{"inline":true,"label":"PHP","permalink":"/LmcRbacMvc/blog/tags/php"},{"inline":true,"label":"lmcrbacmvc","permalink":"/LmcRbacMvc/blog/tags/lmcrbacmvc"}],"readingTime":0.11,"hasTruncateMarker":false,"authors":[{"name":"Eric Richer","title":"LM-Commons Administrator","url":"https://github.com/visto9259","imageURL":"https://github.com/visto9259.png","key":"ericr","page":null}],"frontMatter":{"slug":"new-documentation","title":"New documentation","authors":["ericr"],"tags":["laminas","PHP","lmcrbacmvc"]},"unlisted":false,"nextItem":{"title":"Welcome","permalink":"/LmcRbacMvc/blog/welcome"}},"content":"This the new documentation site dedicated to the LmcRbacMvc module.\\n\\nThere are no changes to the code, just improvements in the documentation."},{"id":"welcome","metadata":{"permalink":"/LmcRbacMvc/blog/welcome","editUrl":"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/blog/2022-08-02-welcome.md","source":"@site/blog/2022-08-02-welcome.md","title":"Welcome","description":"Welcome to the new documentation website for the LM-Commons organization.","date":"2022-08-02T00:00:00.000Z","tags":[{"inline":true,"label":"laminas","permalink":"/LmcRbacMvc/blog/tags/laminas"},{"inline":true,"label":"PHP","permalink":"/LmcRbacMvc/blog/tags/php"}],"readingTime":0.155,"hasTruncateMarker":false,"authors":[{"name":"Eric Richer","title":"LM-Commons Administrator","url":"https://github.com/visto9259","imageURL":"https://github.com/visto9259.png","key":"ericr","page":null}],"frontMatter":{"slug":"welcome","title":"Welcome","authors":["ericr"],"tags":["laminas","PHP"]},"unlisted":false,"prevItem":{"title":"New documentation","permalink":"/LmcRbacMvc/blog/new-documentation"}},"content":"Welcome to the new documentation website for the LM-Commons organization.\\n\\nThis site is work in progress and the intent is obviously to keep it current with updates to the LM-Commons packages."}]}}')}}]); \ No newline at end of file diff --git a/assets/js/712eb253.dbb8ddea.js b/assets/js/712eb253.dbb8ddea.js deleted file mode 100644 index 47747798..00000000 --- a/assets/js/712eb253.dbb8ddea.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[784],{8657:e=>{e.exports=JSON.parse('{"archive":{"blogPosts":[{"id":"new-documentation","metadata":{"permalink":"/LmcRbacMvc/blog/new-documentation","editUrl":"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/blog/2024-02-22-New-documentation.md","source":"@site/blog/2024-02-22-New-documentation.md","title":"New documentation","description":"This the new documentation site dedicated to the LmcRbacMvc module.","date":"2024-02-22T00:00:00.000Z","tags":[{"inline":true,"label":"laminas","permalink":"/LmcRbacMvc/blog/tags/laminas"},{"inline":true,"label":"PHP","permalink":"/LmcRbacMvc/blog/tags/php"},{"inline":true,"label":"lmcrbacmvc","permalink":"/LmcRbacMvc/blog/tags/lmcrbacmvc"}],"readingTime":0.11,"hasTruncateMarker":false,"authors":[{"name":"Eric Richer","title":"LM-Commons Administrator","url":"https://github.com/visto9259","imageURL":"https://github.com/visto9259.png","key":"ericr"}],"frontMatter":{"slug":"new-documentation","title":"New documentation","authors":["ericr"],"tags":["laminas","PHP","lmcrbacmvc"]},"unlisted":false,"nextItem":{"title":"Welcome","permalink":"/LmcRbacMvc/blog/welcome"}},"content":"This the new documentation site dedicated to the LmcRbacMvc module.\\n\\nThere are no changes to the code, just improvements in the documentation."},{"id":"welcome","metadata":{"permalink":"/LmcRbacMvc/blog/welcome","editUrl":"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/blog/2022-08-02-welcome.md","source":"@site/blog/2022-08-02-welcome.md","title":"Welcome","description":"Welcome to the new documentation website for the LM-Commons organization.","date":"2022-08-02T00:00:00.000Z","tags":[{"inline":true,"label":"laminas","permalink":"/LmcRbacMvc/blog/tags/laminas"},{"inline":true,"label":"PHP","permalink":"/LmcRbacMvc/blog/tags/php"}],"readingTime":0.155,"hasTruncateMarker":false,"authors":[{"name":"Eric Richer","title":"LM-Commons Administrator","url":"https://github.com/visto9259","imageURL":"https://github.com/visto9259.png","key":"ericr"}],"frontMatter":{"slug":"welcome","title":"Welcome","authors":["ericr"],"tags":["laminas","PHP"]},"unlisted":false,"prevItem":{"title":"New documentation","permalink":"/LmcRbacMvc/blog/new-documentation"}},"content":"Welcome to the new documentation website for the LM-Commons organization.\\n\\nThis site is work in progress and the intent is obviously to keep it current with updates to the LM-Commons packages."}]}}')}}]); \ No newline at end of file diff --git a/assets/js/72e14192.3a5f0d69.js b/assets/js/72e14192.3a5f0d69.js deleted file mode 100644 index b49199d0..00000000 --- a/assets/js/72e14192.3a5f0d69.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[814],{6711:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>d});var t=i(4848),r=i(8453);const o={sidebar_position:3},s="Quick Start",c={id:"quick-start",title:"Quick Start",description:"In this section, you will learn:",source:"@site/docs/quick-start.md",sourceDirName:".",slug:"/quick-start",permalink:"/LmcRbacMvc/docs/quick-start",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/docs/quick-start.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Requirements and Installation",permalink:"/LmcRbacMvc/docs/installation"},next:{title:"Role providers",permalink:"/LmcRbacMvc/docs/role-providers"}},a={},d=[{value:"Specifying an identity provider",id:"specifying-an-identity-provider",level:2},{value:"Adding a guard",id:"adding-a-guard",level:2},{value:"Adding a role provider",id:"adding-a-role-provider",level:2},{value:"Registering a strategy",id:"registering-a-strategy",level:2},{value:"Using the authorization service",id:"using-the-authorization-service",level:2}];function l(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"quick-start",children:"Quick Start"}),"\n",(0,t.jsx)(n.p,{children:"In this section, you will learn:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"How to set up the module"}),"\n",(0,t.jsx)(n.li,{children:"How to specify an identity provider"}),"\n",(0,t.jsx)(n.li,{children:"How to add a simple role provider"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Before starting the quick start, make sure you have properly installed the module by following the instructions in\nthe README file."}),"\n",(0,t.jsx)(n.h2,{id:"specifying-an-identity-provider",children:"Specifying an identity provider"}),"\n",(0,t.jsxs)(n.p,{children:["By default, LmcRbacMvc internally uses the ",(0,t.jsx)(n.code,{children:"Laminas\\Authentication\\AuthenticationService"})," service key to retrieve the user (logged or\nnot). Therefore, you must implement and register this service in your application by adding these lines in your ",(0,t.jsx)(n.code,{children:"module.config.php"})," file:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:"return [\n 'service_manager' => [\n 'factories' => [\n\t 'Laminas\\Authentication\\AuthenticationService' => function($sm) {\n\t // Create your authentication service!\n\t }\n\t ]\n ]\n];\n"})}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["If you are also using the ",(0,t.jsx)(n.a,{href:"https://github.com/lm-commons/lmcuser",children:"LmcUser"})," package, then the ",(0,t.jsx)(n.code,{children:"Laminas\\Authentication\\AuthenticationService"})," will be provided for you and there is no need to implement your own."]})}),"\n",(0,t.jsxs)(n.p,{children:["The identity given by ",(0,t.jsx)(n.code,{children:"Laminas\\Authentication\\AuthenticationService"})," must implement ",(0,t.jsx)(n.code,{children:"LmcRbacMvc\\Identity\\IdentityInterface"}),"."]}),"\n",(0,t.jsx)(n.admonition,{type:"warning",children:(0,t.jsx)(n.p,{children:"Note that the default identity provided with Laminas does not implement this interface, neither does the LmcUser suite."})}),"\n",(0,t.jsxs)(n.p,{children:["LmcRbacMvc is flexible enough to use something other than the built-in ",(0,t.jsx)(n.code,{children:"AuthenticationService"}),", by specifying custom\nidentity providers. For more information, refer ",(0,t.jsx)(n.a,{href:"/LmcRbacMvc/docs/role-providers#identity-providers",children:"to this section"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"adding-a-guard",children:"Adding a guard"}),"\n",(0,t.jsxs)(n.p,{children:["A guard allows your application to block access to routes and/or controllers using a simple syntax. For instance, this configuration\ngrants access to any route that begins with ",(0,t.jsx)(n.code,{children:"admin"})," (or is exactly ",(0,t.jsx)(n.code,{children:"admin"}),") to the ",(0,t.jsx)(n.code,{children:"admin"})," role only:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n\t 'LmcRbacMvc\\Guard\\RouteGuard' => [\n 'admin*' => ['admin']\n\t ]\n ]\n ]\n];\n"})}),"\n",(0,t.jsxs)(n.p,{children:["LmcRbacMvc has several built-in guards, and you can also register your own guards. For more information, refer\n",(0,t.jsx)(n.a,{href:"/LmcRbacMvc/docs/guards#built-in-guards",children:"to this section"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"adding-a-role-provider",children:"Adding a role provider"}),"\n",(0,t.jsx)(n.p,{children:"RBAC model is based on roles. Therefore, for LmcRbacMvc to work properly, it must be aware of all the roles that are\nused inside your application."}),"\n",(0,t.jsxs)(n.p,{children:["This configuration creates an ",(0,t.jsx)(n.em,{children:"admin"})," role that has a child role called ",(0,t.jsx)(n.em,{children:"member"}),". The ",(0,t.jsx)(n.em,{children:"admin"})," role automatically\ninherits the ",(0,t.jsx)(n.em,{children:"member"})," permissions."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'role_provider' => [\n\t 'LmcRbacMvc\\Role\\InMemoryRoleProvider' => [\n\t 'admin' => [\n\t 'children' => ['member'],\n\t 'permissions' => ['delete']\n\t ],\n\t\t 'member' => [\n\t\t 'permissions' => ['edit']\n\t\t ]\n\t ]\n\t ]\n ]\n];\n"})}),"\n",(0,t.jsxs)(n.p,{children:["In this example, the ",(0,t.jsx)(n.em,{children:"admin"})," role has two permissions: ",(0,t.jsx)(n.code,{children:"delete"})," and ",(0,t.jsx)(n.code,{children:"edit"})," (because it inherits the permissions from\nits child), while the ",(0,t.jsx)(n.em,{children:"member"})," role only has the ",(0,t.jsx)(n.code,{children:"edit"})," permission."]}),"\n",(0,t.jsxs)(n.p,{children:["LmcRbacMvc has several built-in role providers, and you can also register your own role providers. For more information,\nrefer ",(0,t.jsx)(n.a,{href:"/LmcRbacMvc/docs/role-providers#built-in-role-providers",children:"to this section"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"registering-a-strategy",children:"Registering a strategy"}),"\n",(0,t.jsxs)(n.p,{children:["When a guard blocks access to a route/controller, or if you throw the ",(0,t.jsx)(n.code,{children:"LmcRbacMvc\\Exception\\UnauthorizedException"}),"\nexception in your service, LmcRbacMvc automatically performs some logic for you depending on the view strategy used."]}),"\n",(0,t.jsxs)(n.p,{children:['For instance, if you want LmcRbacMvc to automatically redirect all unauthorized requests to the "login" route, add\nthe following code in the ',(0,t.jsx)(n.code,{children:"onBootstrap"})," method of your ",(0,t.jsx)(n.code,{children:"Module.php"})," class:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:"public function onBootstrap(MvcEvent $e)\n{\n $app = $e->getApplication();\n $sm = $app->getServiceManager();\n $em = $app->getEventManager();\n \n $listener = $sm->get(\\LmcRbacMvc\\View\\Strategy\\RedirectStrategy::class);\n $listener->attach($em);\n}\n"})}),"\n",(0,t.jsxs)(n.p,{children:["By default, ",(0,t.jsx)(n.code,{children:"RedirectStrategy"}),' redirects all unauthorized requests to a route named "login" when the user is not connected\nand to a route named "home" when the user is connected. This is, of course, entirely configurable.']}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["For flexibility purposes, LmcRbacMvc ",(0,t.jsx)(n.strong,{children:"does not"})," register any strategy for you by default!"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["For more information about built-in strategies, refer ",(0,t.jsx)(n.a,{href:"/LmcRbacMvc/docs/strategies#built-in-strategies",children:"to this section"}),".\n",(0,t.jsx)(n.a,{href:"/LmcRbacMvc/docs/strategies",children:"to this section"})]}),"\n",(0,t.jsx)(n.h2,{id:"using-the-authorization-service",children:"Using the authorization service"}),"\n",(0,t.jsx)(n.p,{children:"Now that LmcRbacMvc is properly configured, you can inject the authorization service into any class and use it to check\nif the current identity is granted to do something."}),"\n",(0,t.jsxs)(n.p,{children:["The authorization service is registered inside the service manager using the following key: ",(0,t.jsx)(n.code,{children:"LmcRbacMvc\\Service\\AuthorizationService"}),".\nOnce injected, you can use it as follows:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:"use LmcRbacMvc\\Exception\\UnauthorizedException;\n\nclass ActionController extends \\Laminas\\Mvc\\Controller\\AbstractActionController {\npublic function delete()\n{\n if (!$this->authorizationService->isGranted('delete')) {\n throw new UnauthorizedException();\n }\n\n // Delete the post\n}\n}\n"})})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>c});var t=i(6540);const r={},o=t.createContext(r);function s(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7543bdb1.8fc45892.js b/assets/js/7543bdb1.8fc45892.js new file mode 100644 index 00000000..6145a256 --- /dev/null +++ b/assets/js/7543bdb1.8fc45892.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1745],{9852:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>d});var t=i(4848),r=i(8453);const o={sidebar_position:3},s="Quick Start",c={id:"quick-start",title:"Quick Start",description:"In this section, you will learn:",source:"@site/versioned_docs/version-3.4/quick-start.md",sourceDirName:".",slug:"/quick-start",permalink:"/LmcRbacMvc/docs/quick-start",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/versioned_docs/version-3.4/quick-start.md",tags:[],version:"3.4",sidebarPosition:3,frontMatter:{sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Requirements and Installation",permalink:"/LmcRbacMvc/docs/installation"},next:{title:"Role providers",permalink:"/LmcRbacMvc/docs/role-providers"}},a={},d=[{value:"Specifying an identity provider",id:"specifying-an-identity-provider",level:2},{value:"Adding a guard",id:"adding-a-guard",level:2},{value:"Adding a role provider",id:"adding-a-role-provider",level:2},{value:"Registering a strategy",id:"registering-a-strategy",level:2},{value:"Using the authorization service",id:"using-the-authorization-service",level:2}];function l(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"quick-start",children:"Quick Start"})}),"\n",(0,t.jsx)(n.p,{children:"In this section, you will learn:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"How to set up the module"}),"\n",(0,t.jsx)(n.li,{children:"How to specify an identity provider"}),"\n",(0,t.jsx)(n.li,{children:"How to add a simple role provider"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Before starting the quick start, make sure you have properly installed the module by following the instructions in\nthe README file."}),"\n",(0,t.jsx)(n.h2,{id:"specifying-an-identity-provider",children:"Specifying an identity provider"}),"\n",(0,t.jsxs)(n.p,{children:["By default, LmcRbacMvc internally uses the ",(0,t.jsx)(n.code,{children:"Laminas\\Authentication\\AuthenticationService"})," service key to retrieve the user (logged or\nnot). Therefore, you must implement and register this service in your application by adding these lines in your ",(0,t.jsx)(n.code,{children:"module.config.php"})," file:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:"return [\n 'service_manager' => [\n 'factories' => [\n\t 'Laminas\\Authentication\\AuthenticationService' => function($sm) {\n\t // Create your authentication service!\n\t }\n\t ]\n ]\n];\n"})}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["If you are also using the ",(0,t.jsx)(n.a,{href:"https://github.com/lm-commons/lmcuser",children:"LmcUser"})," package, then the ",(0,t.jsx)(n.code,{children:"Laminas\\Authentication\\AuthenticationService"})," will be provided for you and there is no need to implement your own."]})}),"\n",(0,t.jsxs)(n.p,{children:["The identity given by ",(0,t.jsx)(n.code,{children:"Laminas\\Authentication\\AuthenticationService"})," must implement ",(0,t.jsx)(n.code,{children:"LmcRbacMvc\\Identity\\IdentityInterface"}),"."]}),"\n",(0,t.jsx)(n.admonition,{type:"warning",children:(0,t.jsx)(n.p,{children:"Note that the default identity provided with Laminas does not implement this interface, neither does the LmcUser suite."})}),"\n",(0,t.jsxs)(n.p,{children:["LmcRbacMvc is flexible enough to use something other than the built-in ",(0,t.jsx)(n.code,{children:"AuthenticationService"}),", by specifying custom\nidentity providers. For more information, refer ",(0,t.jsx)(n.a,{href:"/LmcRbacMvc/docs/role-providers#identity-providers",children:"to this section"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"adding-a-guard",children:"Adding a guard"}),"\n",(0,t.jsxs)(n.p,{children:["A guard allows your application to block access to routes and/or controllers using a simple syntax. For instance, this configuration\ngrants access to any route that begins with ",(0,t.jsx)(n.code,{children:"admin"})," (or is exactly ",(0,t.jsx)(n.code,{children:"admin"}),") to the ",(0,t.jsx)(n.code,{children:"admin"})," role only:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n\t 'LmcRbacMvc\\Guard\\RouteGuard' => [\n 'admin*' => ['admin']\n\t ]\n ]\n ]\n];\n"})}),"\n",(0,t.jsxs)(n.p,{children:["LmcRbacMvc has several built-in guards, and you can also register your own guards. For more information, refer\n",(0,t.jsx)(n.a,{href:"/LmcRbacMvc/docs/guards#built-in-guards",children:"to this section"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"adding-a-role-provider",children:"Adding a role provider"}),"\n",(0,t.jsx)(n.p,{children:"RBAC model is based on roles. Therefore, for LmcRbacMvc to work properly, it must be aware of all the roles that are\nused inside your application."}),"\n",(0,t.jsxs)(n.p,{children:["This configuration creates an ",(0,t.jsx)(n.em,{children:"admin"})," role that has a child role called ",(0,t.jsx)(n.em,{children:"member"}),". The ",(0,t.jsx)(n.em,{children:"admin"})," role automatically\ninherits the ",(0,t.jsx)(n.em,{children:"member"})," permissions."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'role_provider' => [\n\t 'LmcRbacMvc\\Role\\InMemoryRoleProvider' => [\n\t 'admin' => [\n\t 'children' => ['member'],\n\t 'permissions' => ['delete']\n\t ],\n\t\t 'member' => [\n\t\t 'permissions' => ['edit']\n\t\t ]\n\t ]\n\t ]\n ]\n];\n"})}),"\n",(0,t.jsxs)(n.p,{children:["In this example, the ",(0,t.jsx)(n.em,{children:"admin"})," role has two permissions: ",(0,t.jsx)(n.code,{children:"delete"})," and ",(0,t.jsx)(n.code,{children:"edit"})," (because it inherits the permissions from\nits child), while the ",(0,t.jsx)(n.em,{children:"member"})," role only has the ",(0,t.jsx)(n.code,{children:"edit"})," permission."]}),"\n",(0,t.jsxs)(n.p,{children:["LmcRbacMvc has several built-in role providers, and you can also register your own role providers. For more information,\nrefer ",(0,t.jsx)(n.a,{href:"/LmcRbacMvc/docs/role-providers#built-in-role-providers",children:"to this section"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"registering-a-strategy",children:"Registering a strategy"}),"\n",(0,t.jsxs)(n.p,{children:["When a guard blocks access to a route/controller, or if you throw the ",(0,t.jsx)(n.code,{children:"LmcRbacMvc\\Exception\\UnauthorizedException"}),"\nexception in your service, LmcRbacMvc automatically performs some logic for you depending on the view strategy used."]}),"\n",(0,t.jsxs)(n.p,{children:['For instance, if you want LmcRbacMvc to automatically redirect all unauthorized requests to the "login" route, add\nthe following code in the ',(0,t.jsx)(n.code,{children:"onBootstrap"})," method of your ",(0,t.jsx)(n.code,{children:"Module.php"})," class:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:"public function onBootstrap(MvcEvent $e)\n{\n $app = $e->getApplication();\n $sm = $app->getServiceManager();\n $em = $app->getEventManager();\n \n $listener = $sm->get(\\LmcRbacMvc\\View\\Strategy\\RedirectStrategy::class);\n $listener->attach($em);\n}\n"})}),"\n",(0,t.jsxs)(n.p,{children:["By default, ",(0,t.jsx)(n.code,{children:"RedirectStrategy"}),' redirects all unauthorized requests to a route named "login" when the user is not connected\nand to a route named "home" when the user is connected. This is, of course, entirely configurable.']}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["For flexibility purposes, LmcRbacMvc ",(0,t.jsx)(n.strong,{children:"does not"})," register any strategy for you by default!"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["For more information about built-in strategies, refer ",(0,t.jsx)(n.a,{href:"/LmcRbacMvc/docs/strategies#built-in-strategies",children:"to this section"}),".\n",(0,t.jsx)(n.a,{href:"/LmcRbacMvc/docs/strategies",children:"to this section"})]}),"\n",(0,t.jsx)(n.h2,{id:"using-the-authorization-service",children:"Using the authorization service"}),"\n",(0,t.jsx)(n.p,{children:"Now that LmcRbacMvc is properly configured, you can inject the authorization service into any class and use it to check\nif the current identity is granted to do something."}),"\n",(0,t.jsxs)(n.p,{children:["The authorization service is registered inside the service manager using the following key: ",(0,t.jsx)(n.code,{children:"LmcRbacMvc\\Service\\AuthorizationService"}),".\nOnce injected, you can use it as follows:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:"use LmcRbacMvc\\Exception\\UnauthorizedException;\n\nclass ActionController extends \\Laminas\\Mvc\\Controller\\AbstractActionController {\npublic function delete()\n{\n if (!$this->authorizationService->isGranted('delete')) {\n throw new UnauthorizedException();\n }\n\n // Delete the post\n}\n}\n"})})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>c});var t=i(6540);const r={},o=t.createContext(r);function s(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/778c4758.a73e0da4.js b/assets/js/778c4758.a73e0da4.js new file mode 100644 index 00000000..4f14af51 --- /dev/null +++ b/assets/js/778c4758.a73e0da4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5946],{5539:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>t,metadata:()=>c,toc:()=>d});var o=n(4848),i=n(8453);const t={sidebar_position:4},s="Role providers",c={id:"role-providers",title:"Role providers",description:"In this section, you will learn:",source:"@site/versioned_docs/version-3.4/role-providers.md",sourceDirName:".",slug:"/role-providers",permalink:"/LmcRbacMvc/docs/role-providers",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/versioned_docs/version-3.4/role-providers.md",tags:[],version:"3.4",sidebarPosition:4,frontMatter:{sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"Quick Start",permalink:"/LmcRbacMvc/docs/quick-start"},next:{title:"Guards",permalink:"/LmcRbacMvc/docs/guards"}},l={},d=[{value:"What are role providers?",id:"what-are-role-providers",level:2},{value:"Identity providers?",id:"identity-providers",level:2},{value:"Create your own identity provider",id:"create-your-own-identity-provider",level:3},{value:"Built-in role providers",id:"built-in-role-providers",level:2},{value:"InMemoryRoleProvider",id:"inmemoryroleprovider",level:3},{value:"ObjectRepositoryRoleProvider",id:"objectrepositoryroleprovider",level:3},{value:"Creating custom role providers",id:"creating-custom-role-providers",level:2}];function a(e){const r={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(r.header,{children:(0,o.jsx)(r.h1,{id:"role-providers",children:"Role providers"})}),"\n",(0,o.jsx)(r.p,{children:"In this section, you will learn:"}),"\n",(0,o.jsxs)(r.ul,{children:["\n",(0,o.jsx)(r.li,{children:"What are role providers"}),"\n",(0,o.jsx)(r.li,{children:"What are identity providers"}),"\n",(0,o.jsx)(r.li,{children:"How to use and configure built-in providers"}),"\n",(0,o.jsx)(r.li,{children:"How to create custom role providers"}),"\n"]}),"\n",(0,o.jsx)(r.h2,{id:"what-are-role-providers",children:"What are role providers?"}),"\n",(0,o.jsxs)(r.p,{children:["A role provider is an object that returns a list of roles. Each role provider must implement the\n",(0,o.jsx)(r.code,{children:"LmcRbacMvc\\Role\\RoleProviderInterface"})," interface. The only required method is ",(0,o.jsx)(r.code,{children:"getRoles"}),", and must return an array\nof ",(0,o.jsx)(r.code,{children:"Rbac\\Role\\RoleInterface"})," objects."]}),"\n",(0,o.jsx)(r.p,{children:"Roles can come from one of many sources: in memory, from a file, from a database... However, please note that\nyou can specify only one role provider per application. The reason is that having multiple role providers makes\nthe workflow harder and can lead to security problems that are very hard to spot."}),"\n",(0,o.jsx)(r.h2,{id:"identity-providers",children:"Identity providers?"}),"\n",(0,o.jsxs)(r.p,{children:["Identity providers return the current identity. Most of the time, this means the logged in user. LmcRbacMvc comes with a\ndefault identity provider (",(0,o.jsx)(r.code,{children:"LmcRbacMvc\\Identity\\AuthenticationIdentityProvider"}),") that uses the\n",(0,o.jsx)(r.code,{children:"Laminas\\Authentication\\AuthenticationService"})," service."]}),"\n",(0,o.jsx)(r.h3,{id:"create-your-own-identity-provider",children:"Create your own identity provider"}),"\n",(0,o.jsxs)(r.p,{children:["If you want to implement your own identity provider, create a new class that implements\n",(0,o.jsx)(r.code,{children:"LmcRbacMvc\\Identity\\IdentityProviderInterface"})," class. Then, change the ",(0,o.jsx)(r.code,{children:"identity_provider"})," option in LmcRbacMvc config,\nas shown below:"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'identity_provider' => 'MyCustomIdentityProvider'\n ]\n];\n"})}),"\n",(0,o.jsx)(r.p,{children:"The identity provider is automatically pulled from the service manager."}),"\n",(0,o.jsx)(r.h2,{id:"built-in-role-providers",children:"Built-in role providers"}),"\n",(0,o.jsxs)(r.p,{children:["LmcRbacMvc comes with two built-in role providers: ",(0,o.jsx)(r.code,{children:"InMemoryRoleProvider"})," and ",(0,o.jsx)(r.code,{children:"ObjectRepositoryRoleProvider"}),". A role\nprovider must be added to the ",(0,o.jsx)(r.code,{children:"role_provider"})," subkey:"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'role_provider' => [\n // Role provider config here!\n ]\n ]\n];\n"})}),"\n",(0,o.jsx)(r.h3,{id:"inmemoryroleprovider",children:"InMemoryRoleProvider"}),"\n",(0,o.jsx)(r.p,{children:"This provider is ideal for small/medium sites with few roles/permissions. All the data is specified in a simple\nPHP file, so you never hit a database."}),"\n",(0,o.jsx)(r.p,{children:"Here is an example of the format you need to use:"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'role_provider' => [\n 'LmcRbacMvc\\Role\\InMemoryRoleProvider' => [\n 'admin' => [\n 'children' => ['member'],\n 'permissions' => ['article.delete']\n ],\n 'member' => [\n 'children' => ['guest'],\n 'permissions' => ['article.edit', 'article.archive']\n ],\n 'guest' => [\n 'permissions' => ['article.read']\n ]\n ]\n ]\n ]\n];\n"})}),"\n",(0,o.jsxs)(r.p,{children:["The ",(0,o.jsx)(r.code,{children:"children"})," and ",(0,o.jsx)(r.code,{children:"permissions"})," subkeys are entirely optional. Internally, the ",(0,o.jsx)(r.code,{children:"InMemoryRoleProvider"})," creates\neither a ",(0,o.jsx)(r.code,{children:"Rbac\\Role\\Role"})," object if the role does not have any children, or a ",(0,o.jsx)(r.code,{children:"Rbac\\Role\\HierarchicalRole"})," if\nthe role has at least one child."]}),"\n",(0,o.jsx)(r.p,{children:"If you are more confident with flat RBAC, the previous config can be re-written to remove any inheritence between roles:"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'role_provider' => [\n 'LmcRbacMvc\\Role\\InMemoryRoleProvider' => [\n 'admin' => [\n 'permissions' => [\n 'article.delete',\n 'article.edit',\n 'article.archive',\n 'article.read'\n ]\n ],\n 'member' => [\n 'permissions' => [\n 'article.edit',\n 'article.archive',\n 'article.read'\n ]\n ],\n 'guest' => [\n 'permissions' => ['article.read']\n ]\n ]\n ]\n ]\n];\n"})}),"\n",(0,o.jsx)(r.h3,{id:"objectrepositoryroleprovider",children:"ObjectRepositoryRoleProvider"}),"\n",(0,o.jsxs)(r.p,{children:["This provider fetches roles from the database using ",(0,o.jsx)(r.code,{children:"Doctrine\\Common\\Persistence\\ObjectRepository"})," interface."]}),"\n",(0,o.jsxs)(r.p,{children:["You can configure this provider by giving an object repository service name that is fetched from the service manager\nusing the ",(0,o.jsx)(r.code,{children:"object_repository"})," key:"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'role_provider' => [\n 'LmcRbacMvc\\Role\\ObjectRepositoryRoleProvider' => [\n 'object_repository' => 'App\\Repository\\RoleRepository',\n 'role_name_property' => 'name'\n ]\n ]\n ]\n];\n"})}),"\n",(0,o.jsxs)(r.p,{children:["Or you can specify the ",(0,o.jsx)(r.code,{children:"object_manager"})," and ",(0,o.jsx)(r.code,{children:"class_name"})," options:"]}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'role_provider' => [\n 'LmcRbacMvc\\Role\\ObjectRepositoryRoleProvider' => [\n 'object_manager' => 'doctrine.entitymanager.orm_default',\n 'class_name' => 'App\\Entity\\Role',\n 'role_name_property' => 'name'\n ]\n ]\n ]\n];\n"})}),"\n",(0,o.jsxs)(r.p,{children:["In both cases, you need to specify the ",(0,o.jsx)(r.code,{children:"role_name_property"})," value, which is the name of the entity's property\nthat holds the actual role name. This is used internally to only load the identity roles, instead of loading\nthe whole table every time."]}),"\n",(0,o.jsxs)(r.p,{children:["Please note that your entity fetched from the table MUST implement the ",(0,o.jsx)(r.code,{children:"Rbac\\Role\\RoleInterface"})," interface."]}),"\n",(0,o.jsx)(r.h2,{id:"creating-custom-role-providers",children:"Creating custom role providers"}),"\n",(0,o.jsxs)(r.p,{children:["To create a custom role provider, you first need to create a class that implements the ",(0,o.jsx)(r.code,{children:"LmcRbacMvc\\Role\\RoleProviderInterface"}),"\ninterface."]}),"\n",(0,o.jsx)(r.p,{children:"Then, you need to add it to the role provider manager:"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'role_provider_manager' => [\n 'factories' => [\n 'Application\\Role\\CustomRoleProvider' => 'Application\\Factory\\CustomRoleProviderFactory'\n ]\n ] \n ]\n];\n"})}),"\n",(0,o.jsx)(r.p,{children:"You can now use it like any other role provider:"}),"\n",(0,o.jsx)(r.pre,{children:(0,o.jsx)(r.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'role_provider' => [\n 'Application\\Role\\CustomRoleProvider' => [\n // Options\n ]\n ]\n ]\n];\n"})})]})}function h(e={}){const{wrapper:r}={...(0,i.R)(),...e.components};return r?(0,o.jsx)(r,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}},8453:(e,r,n)=>{n.d(r,{R:()=>s,x:()=>c});var o=n(6540);const i={},t=o.createContext(i);function s(e){const r=o.useContext(t);return o.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function c(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(t.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7d54f919.1d835b5a.js b/assets/js/7d54f919.1d835b5a.js deleted file mode 100644 index 65f32cec..00000000 --- a/assets/js/7d54f919.1d835b5a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[500],{7431:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Introduction","href":"/LmcRbacMvc/docs/intro","docId":"intro","unlisted":false},{"type":"link","label":"Requirements and Installation","href":"/LmcRbacMvc/docs/installation","docId":"installation","unlisted":false},{"type":"link","label":"Quick Start","href":"/LmcRbacMvc/docs/quick-start","docId":"quick-start","unlisted":false},{"type":"link","label":"Role providers","href":"/LmcRbacMvc/docs/role-providers","docId":"role-providers","unlisted":false},{"type":"link","label":"Guards","href":"/LmcRbacMvc/docs/guards","docId":"guards","unlisted":false},{"type":"link","label":"Strategies","href":"/LmcRbacMvc/docs/strategies","docId":"strategies","unlisted":false},{"type":"link","label":"Using the Authorization Service","href":"/LmcRbacMvc/docs/using-the-authorization-service","docId":"using-the-authorization-service","unlisted":false},{"type":"link","label":"Cookbook","href":"/LmcRbacMvc/docs/cookbook","docId":"cookbook","unlisted":false},{"type":"link","label":"Support","href":"/LmcRbacMvc/docs/support","docId":"support","unlisted":false}]},"docs":{"cookbook":{"id":"cookbook","title":"Cookbook","description":"This section will help you further understand how LmcRbacMvc works by providing more concrete examples. If you have","sidebar":"tutorialSidebar"},"guards":{"id":"guards","title":"Guards","description":"In this section, you will learn:","sidebar":"tutorialSidebar"},"installation":{"id":"installation","title":"Requirements and Installation","description":"Requirements","sidebar":"tutorialSidebar"},"intro":{"id":"intro","title":"Introduction","description":"LmcRbacMvc is a role-based access control Laminas MVC module to provide additional features on top of Laminas\\\\Permissions\\\\Rbac","sidebar":"tutorialSidebar"},"quick-start":{"id":"quick-start","title":"Quick Start","description":"In this section, you will learn:","sidebar":"tutorialSidebar"},"role-providers":{"id":"role-providers","title":"Role providers","description":"In this section, you will learn:","sidebar":"tutorialSidebar"},"strategies":{"id":"strategies","title":"Strategies","description":"In this section, you will learn:","sidebar":"tutorialSidebar"},"support":{"id":"support","title":"Support","description":"- File issues at https://github.com/LM-Commons/LmcRbacMvc/issues.","sidebar":"tutorialSidebar"},"using-the-authorization-service":{"id":"using-the-authorization-service","title":"Using the Authorization Service","description":"This section will teach you how to use the AuthorizationService to its full extent.","sidebar":"tutorialSidebar"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/7d54f919.a968d26f.js b/assets/js/7d54f919.a968d26f.js new file mode 100644 index 00000000..c877f8e4 --- /dev/null +++ b/assets/js/7d54f919.a968d26f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8500],{7431:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"3.4","label":"3.4","banner":null,"badge":true,"noIndex":false,"className":"docs-version-3.4","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Introduction","href":"/LmcRbacMvc/docs/intro","docId":"intro","unlisted":false},{"type":"link","label":"Requirements and Installation","href":"/LmcRbacMvc/docs/installation","docId":"installation","unlisted":false},{"type":"link","label":"Quick Start","href":"/LmcRbacMvc/docs/quick-start","docId":"quick-start","unlisted":false},{"type":"link","label":"Role providers","href":"/LmcRbacMvc/docs/role-providers","docId":"role-providers","unlisted":false},{"type":"link","label":"Guards","href":"/LmcRbacMvc/docs/guards","docId":"guards","unlisted":false},{"type":"link","label":"Strategies","href":"/LmcRbacMvc/docs/strategies","docId":"strategies","unlisted":false},{"type":"link","label":"Using the Authorization Service","href":"/LmcRbacMvc/docs/using-the-authorization-service","docId":"using-the-authorization-service","unlisted":false},{"type":"link","label":"Cookbook","href":"/LmcRbacMvc/docs/cookbook","docId":"cookbook","unlisted":false},{"type":"link","label":"Support","href":"/LmcRbacMvc/docs/support","docId":"support","unlisted":false}]},"docs":{"cookbook":{"id":"cookbook","title":"Cookbook","description":"This section will help you further understand how LmcRbacMvc works by providing more concrete examples. If you have","sidebar":"tutorialSidebar"},"guards":{"id":"guards","title":"Guards","description":"In this section, you will learn:","sidebar":"tutorialSidebar"},"installation":{"id":"installation","title":"Requirements and Installation","description":"Requirements","sidebar":"tutorialSidebar"},"intro":{"id":"intro","title":"Introduction","description":"LmcRbacMvc is a role-based access control Laminas MVC module to provide additional features on top of Laminas\\\\Permissions\\\\Rbac","sidebar":"tutorialSidebar"},"quick-start":{"id":"quick-start","title":"Quick Start","description":"In this section, you will learn:","sidebar":"tutorialSidebar"},"role-providers":{"id":"role-providers","title":"Role providers","description":"In this section, you will learn:","sidebar":"tutorialSidebar"},"strategies":{"id":"strategies","title":"Strategies","description":"In this section, you will learn:","sidebar":"tutorialSidebar"},"support":{"id":"support","title":"Support","description":"- File issues at https://github.com/LM-Commons/LmcRbacMvc/issues.","sidebar":"tutorialSidebar"},"using-the-authorization-service":{"id":"using-the-authorization-service","title":"Using the Authorization Service","description":"This section will teach you how to use the AuthorizationService to its full extent.","sidebar":"tutorialSidebar"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/809dac3e.861672f1.js b/assets/js/809dac3e.861672f1.js new file mode 100644 index 00000000..25863d30 --- /dev/null +++ b/assets/js/809dac3e.861672f1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7804],{4e3:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>r,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>m,toc:()=>s});var c=n(4848),o=n(8453);const a={slug:"new-documentation",title:"New documentation",authors:["ericr"],tags:["laminas","PHP","lmcrbacmvc"]},i=void 0,m={permalink:"/LmcRbacMvc/blog/new-documentation",editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/blog/2024-02-22-New-documentation.md",source:"@site/blog/2024-02-22-New-documentation.md",title:"New documentation",description:"This the new documentation site dedicated to the LmcRbacMvc module.",date:"2024-02-22T00:00:00.000Z",tags:[{inline:!0,label:"laminas",permalink:"/LmcRbacMvc/blog/tags/laminas"},{inline:!0,label:"PHP",permalink:"/LmcRbacMvc/blog/tags/php"},{inline:!0,label:"lmcrbacmvc",permalink:"/LmcRbacMvc/blog/tags/lmcrbacmvc"}],readingTime:.11,hasTruncateMarker:!1,authors:[{name:"Eric Richer",title:"LM-Commons Administrator",url:"https://github.com/visto9259",imageURL:"https://github.com/visto9259.png",key:"ericr",page:null}],frontMatter:{slug:"new-documentation",title:"New documentation",authors:["ericr"],tags:["laminas","PHP","lmcrbacmvc"]},unlisted:!1,nextItem:{title:"Welcome",permalink:"/LmcRbacMvc/blog/welcome"}},r={authorsImageUrls:[void 0]},s=[];function l(e){const t={p:"p",...(0,o.R)(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(t.p,{children:"This the new documentation site dedicated to the LmcRbacMvc module."}),"\n",(0,c.jsx)(t.p,{children:"There are no changes to the code, just improvements in the documentation."})]})}function u(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,c.jsx)(t,{...e,children:(0,c.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>m});var c=n(6540);const o={},a=c.createContext(o);function i(e){const t=c.useContext(a);return c.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function m(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),c.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/809dac3e.df60525c.js b/assets/js/809dac3e.df60525c.js deleted file mode 100644 index 6ccaeb36..00000000 --- a/assets/js/809dac3e.df60525c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[804],{4e3:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>r,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>m,toc:()=>s});var c=n(4848),o=n(8453);const a={slug:"new-documentation",title:"New documentation",authors:["ericr"],tags:["laminas","PHP","lmcrbacmvc"]},i=void 0,m={permalink:"/LmcRbacMvc/blog/new-documentation",editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/blog/2024-02-22-New-documentation.md",source:"@site/blog/2024-02-22-New-documentation.md",title:"New documentation",description:"This the new documentation site dedicated to the LmcRbacMvc module.",date:"2024-02-22T00:00:00.000Z",tags:[{inline:!0,label:"laminas",permalink:"/LmcRbacMvc/blog/tags/laminas"},{inline:!0,label:"PHP",permalink:"/LmcRbacMvc/blog/tags/php"},{inline:!0,label:"lmcrbacmvc",permalink:"/LmcRbacMvc/blog/tags/lmcrbacmvc"}],readingTime:.11,hasTruncateMarker:!1,authors:[{name:"Eric Richer",title:"LM-Commons Administrator",url:"https://github.com/visto9259",imageURL:"https://github.com/visto9259.png",key:"ericr"}],frontMatter:{slug:"new-documentation",title:"New documentation",authors:["ericr"],tags:["laminas","PHP","lmcrbacmvc"]},unlisted:!1,nextItem:{title:"Welcome",permalink:"/LmcRbacMvc/blog/welcome"}},r={authorsImageUrls:[void 0]},s=[];function l(e){const t={p:"p",...(0,o.R)(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(t.p,{children:"This the new documentation site dedicated to the LmcRbacMvc module."}),"\n",(0,c.jsx)(t.p,{children:"There are no changes to the code, just improvements in the documentation."})]})}function u(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,c.jsx)(t,{...e,children:(0,c.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>m});var c=n(6540);const o={},a=c.createContext(o);function i(e){const t=c.useContext(a);return c.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function m(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),c.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/814f3328.e5c2350a.js b/assets/js/814f3328.e5c2350a.js deleted file mode 100644 index 70088e49..00000000 --- a/assets/js/814f3328.e5c2350a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[472],{5513:e=>{e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"New documentation","permalink":"/LmcRbacMvc/blog/new-documentation","unlisted":false},{"title":"Welcome","permalink":"/LmcRbacMvc/blog/welcome","unlisted":false}]}')}}]); \ No newline at end of file diff --git a/assets/js/814f3328.eb903f9c.js b/assets/js/814f3328.eb903f9c.js new file mode 100644 index 00000000..9ef22efb --- /dev/null +++ b/assets/js/814f3328.eb903f9c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7472],{5513:e=>{e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"New documentation","permalink":"/LmcRbacMvc/blog/new-documentation","unlisted":false,"date":"2024-02-22T00:00:00.000Z"},{"title":"Welcome","permalink":"/LmcRbacMvc/blog/welcome","unlisted":false,"date":"2022-08-02T00:00:00.000Z"}]}')}}]); \ No newline at end of file diff --git a/assets/js/837900c0.e79d1df5.js b/assets/js/837900c0.e79d1df5.js new file mode 100644 index 00000000..e42a9043 --- /dev/null +++ b/assets/js/837900c0.e79d1df5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[345],{2818:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>l,frontMatter:()=>o,metadata:()=>d,toc:()=>a});var n=i(4848),r=i(8453);const o={title:"Create a custom identity provider",sidebar_label:"Custom Identity Providers",sidebar_position:2},s=void 0,d={id:"Guides/identity-providers",title:"Create a custom identity provider",description:"Identity providers return the current identity. Most of the time, this means the logged in user. LmcRbacMvc comes with a",source:"@site/docs/Guides/identity-providers.md",sourceDirName:"Guides",slug:"/Guides/identity-providers",permalink:"/LmcRbacMvc/docs/next/Guides/identity-providers",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/docs/Guides/identity-providers.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Create a custom identity provider",sidebar_label:"Custom Identity Providers",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"A Real World Example",permalink:"/LmcRbacMvc/docs/next/Guides/example"},next:{title:"Using LmcRbacMvc and LmcUser",permalink:"/LmcRbacMvc/docs/next/Guides/lmcuser"}},c={},a=[{value:"Create your own identity provider",id:"create-your-own-identity-provider",level:3}];function u(e){const t={code:"code",h3:"h3",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:["Identity providers return the current identity. Most of the time, this means the logged in user. LmcRbacMvc comes with a\ndefault identity provider (",(0,n.jsx)(t.code,{children:"Lmc\\Rbac\\Mvc\\Identity\\AuthenticationIdentityProvider"}),") that uses the\n",(0,n.jsx)(t.code,{children:"Laminas\\Authentication\\AuthenticationService"})," service."]}),"\n",(0,n.jsx)(t.h3,{id:"create-your-own-identity-provider",children:"Create your own identity provider"}),"\n",(0,n.jsxs)(t.p,{children:["If you want to implement your own identity provider, create a new class that implements\n",(0,n.jsx)(t.code,{children:"Lmc\\Rbac\\Mvc\\Identity\\IdentityProviderInterface"})," class. Then, change the ",(0,n.jsx)(t.code,{children:"identity_provider"})," option in LmcRbacMvc config,\nas shown below:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'identity_provider' => 'MyCustomIdentityProvider'\n ]\n];\n"})}),"\n",(0,n.jsx)(t.p,{children:"The identity provider is automatically pulled from the service manager."})]})}function l(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>d});var n=i(6540);const r={},o=n.createContext(r);function s(e){const t=n.useContext(o);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(r):e.components||r:s(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8b5d4ccc.6cc585da.js b/assets/js/8b5d4ccc.6cc585da.js new file mode 100644 index 00000000..f92ed52d --- /dev/null +++ b/assets/js/8b5d4ccc.6cc585da.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3223],{5811:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>i,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>A});var t=r(4848),s=r(8453);const o={sidebar_position:2,title:"Guards"},a=void 0,l={id:"guards",title:"Guards",description:"In this section, you will learn:",source:"@site/docs/guards.md",sourceDirName:".",slug:"/guards",permalink:"/LmcRbacMvc/docs/next/guards",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/docs/guards.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2,title:"Guards"},sidebar:"tutorialSidebar",previous:{title:"Getting Started",permalink:"/LmcRbacMvc/docs/next/intro"},next:{title:"Strategies",permalink:"/LmcRbacMvc/docs/next/strategies"}},i={},A=[{value:"What are guards and when should you use them?",id:"what-are-guards-and-when-should-you-use-them",level:2},{value:"Protection policy",id:"protection-policy",level:3},{value:"Built-in guards",id:"built-in-guards",level:2},{value:"RouteGuard",id:"routeguard",level:3},{value:"RoutePermissionsGuard",id:"routepermissionsguard",level:3},{value:"ControllerGuard",id:"controllerguard",level:3},{value:"ControllerPermissionsGuard",id:"controllerpermissionsguard",level:3},{value:"Security notice",id:"security-notice",level:3},{value:"Creating custom guards",id:"creating-custom-guards",level:2}];function c(e){const n={blockquote:"blockquote",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"In this section, you will learn:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"What guards are"}),"\n",(0,t.jsx)(n.li,{children:"How to use and configure built-in guards"}),"\n",(0,t.jsx)(n.li,{children:"How to create custom guards"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"what-are-guards-and-when-should-you-use-them",children:"What are guards and when should you use them?"}),"\n",(0,t.jsx)(n.p,{children:"Guards are listeners that are registered on a specific event of\nthe MVC workflow. They allow your application to quickly mark a request as unauthorized."}),"\n",(0,t.jsx)(n.p,{children:"Here is a simple workflow without guards:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Laminas Framework workflow without guards",src:r(4676).A+"",width:"920",height:"200"})}),"\n",(0,t.jsx)(n.p,{children:"And here is a simple workflow with a route guard:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Laminas Framework workflow with guards",src:r(7376).A+"",width:"1120",height:"1600"})}),"\n",(0,t.jsx)(n.p,{children:'RouteGuard and ControllerGuard are not aware of permissions but rather only think about "roles". For\ninstance, you may want to refuse access to each routes that begin by "admin/*" to all users that do not have the\n"admin" role.'}),"\n",(0,t.jsx)(n.p,{children:'If you want to protect a route for a set of permissions, you must use RoutePermissionsGuard. For instance,\nyou may want to grant access to a route "post/delete" only to roles having the "delete" permission.\nNote that in a RBAC system, a permission is linked to a role, not to a user.'}),"\n",(0,t.jsx)(n.p,{children:"Albeit simple to use, guards should not be the only protection in your application, and you should always\nprotect your services as well. The reason is that your business logic should be handled by your service. Protecting a given\nroute or controller does not mean that the service cannot be access from elsewhere (another action for instance)."}),"\n",(0,t.jsx)(n.h3,{id:"protection-policy",children:"Protection policy"}),"\n",(0,t.jsx)(n.p,{children:'By default, when a guard is added, it will perform a check only on the specified guard rules. Any route or controller\nthat is not specified in the rules will be "granted" by default. Therefore, the default is a "blacklist"\nmechanism.'}),"\n",(0,t.jsx)(n.p,{children:'However, you may want a more restrictive approach (also called "whitelist"). In this mode, once a guard is added,\nanything that is not explicitly added will be refused by default.'}),"\n",(0,t.jsx)(n.p,{children:'For instance, let\'s say you have two routes: "index" and "login". If you specify a route guard rule to allow "index"\nroute to "member" role, your "login" route will become defacto unauthorized to anyone, unless you add a new rule for\nallowing the route "login" to "member" role.'}),"\n",(0,t.jsx)(n.p,{children:"You can change it in LmcRbacMvc config, as follows:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:"use LmcRbacMvc\\Guard\\GuardInterface;\n\nreturn [\n 'lmc_rbac' => [\n 'protection_policy' => GuardInterface::POLICY_DENY\n ]\n];\n"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"NOTE: this policy will block ANY route/controller (so it will also block any console routes or controllers). The\ndeny policy is much more secure, but it needs much more configuration to work with."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"built-in-guards",children:"Built-in guards"}),"\n",(0,t.jsx)(n.p,{children:"LmcRbacMvc comes with four guards, in order of priority :"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"RouteGuard : protect a set of routes based on the identity roles"}),"\n",(0,t.jsx)(n.li,{children:"RoutePermissionsGuard : protect a set of routes based on roles permissions"}),"\n",(0,t.jsx)(n.li,{children:"ControllerGuard : protect a controllers and/or actions based on the identity roles"}),"\n",(0,t.jsx)(n.li,{children:"ControllerPermissionsGuard : protect a controllers and/or actions based on roles permissions"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["All guards must be added in the ",(0,t.jsx)(n.code,{children:"guards"})," subkey:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n // Guards config here!\n ]\n ]\n];\n"})}),"\n",(0,t.jsx)(n.p,{children:"Because of the way Laminas Framework handles config, you can without problem define some rules in one module, and\nmore rules in another module. All the rules will be automatically merged."}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:'For your mental health, I recommend you to use either the route guard OR the controller guard, but not both. If\nyou decide to use both conjointly, I recommend you to set the protection policy to "allow" (otherwise, you will\nneed to define rules for every routes AND every controller, which can become quite frustrating!).'}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Please note that if your application uses both route and controller guards, route guards are always executed\n",(0,t.jsx)(n.strong,{children:"before"})," controller guards (they have a higher priority)."]}),"\n",(0,t.jsx)(n.h3,{id:"routeguard",children:"RouteGuard"}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["The RouteGuard listens to the ",(0,t.jsx)(n.code,{children:"MvcEvent::EVENT_ROUTE"})," event with a priority of -5."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:'The RouteGuard allows your application to protect a route or a hierarchy of routes. You must provide an array of "key" => "value",\nwhere the key is a route pattern and the value is an array of role names:'}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\RouteGuard' => [\n 'admin*' => ['admin'],\n 'login' => ['guest']\n ]\n ]\n ]\n];\n"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Only one role in a rule needs to be matched (it is an OR condition)."}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:'Those rules grant access to all admin routes to users that have the "admin" role, and grant access to the "login"\nroute to users that have the "guest" role (eg.: most likely unauthenticated users).'}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"The route pattern is not a regex. It only supports the wildcard (*) character, that replaces any segment."}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"You can also use the wildcard character * for roles:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\RouteGuard' => [\n 'home' => ['*']\n ]\n ]\n ]\n];\n"})}),"\n",(0,t.jsx)(n.p,{children:'This rule grants access to the "home" route to anyone.'}),"\n",(0,t.jsx)(n.p,{children:"Finally, you can also omit the roles array to completely block a route, for maintenance purpose for example :"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\RouteGuard' => [\n 'route_under_construction'\n ]\n ]\n ]\n];\n"})}),"\n",(0,t.jsx)(n.p,{children:"This rule will be inaccessible."}),"\n",(0,t.jsx)(n.p,{children:"Note : this last example could be (and should be) written in a more explicit way :"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\RouteGuard' => [\n 'route_under_construction' => []\n ]\n ]\n ]\n];\n"})}),"\n",(0,t.jsx)(n.h3,{id:"routepermissionsguard",children:"RoutePermissionsGuard"}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["The RoutePermissionsGuard listens to the ",(0,t.jsx)(n.code,{children:"MvcEvent::EVENT_ROUTE"})," event with a priority of -8."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:'The RoutePermissionsGuard allows your application to protect a route or a hierarchy of routes. You must provide an array of "key" => "value",\nwhere the key is a route pattern and the value is an array of permission names:'}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\RoutePermissionsGuard' => [\n 'admin*' => ['admin'],\n 'post/manage' => ['post.update', 'post.delete']\n ]\n ]\n ]\n];\n"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"By default, all permissions in a rule must be matched (an AND condition)."}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["In the previous example, one must have ",(0,t.jsx)(n.code,{children:"post.update"})," ",(0,t.jsx)(n.strong,{children:"AND"})," ",(0,t.jsx)(n.code,{children:"post.delete"})," permissions\nto access the ",(0,t.jsx)(n.code,{children:"post/manage"})," route. You can also specify an OR condition like so:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:"use LmcRbacMvc\\Guard\\GuardInterface;\n\nreturn [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\RoutePermissionsGuard' => [\n 'post/manage' => [\n 'permissions' => ['post.update', 'post.delete'],\n 'condition' => GuardInterface::CONDITION_OR\n ]\n ]\n ]\n ]\n];\n"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Permissions are linked to roles, not to users"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:'Those rules grant access to all admin routes to roles that have the "admin" permission, and grant access to the\n"post/delete" route to roles that have the "post.delete" or "admin" permissions.'}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"The route pattern is not a regex. It only supports the wildcard (*) character, that replaces any segment."}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"You can also use the wildcard character * for permissions:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\RoutePermissionsGuard' => [\n 'home' => ['*']\n ]\n ]\n ]\n];\n"})}),"\n",(0,t.jsx)(n.p,{children:'This rule grants access to the "home" route to anyone.'}),"\n",(0,t.jsx)(n.p,{children:"Finally, you can also use an empty array to completly block a route, for maintenance purpose for example :"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\RoutePermissionsGuard' => [\n 'route_under_construction' => []\n ]\n ]\n ]\n];\n"})}),"\n",(0,t.jsx)(n.p,{children:"This route will be inaccessible."}),"\n",(0,t.jsx)(n.h3,{id:"controllerguard",children:"ControllerGuard"}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["The ControllerGuard listens to the ",(0,t.jsx)(n.code,{children:"MvcEvent::EVENT_ROUTE"})," event with a priority of -10."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"The ControllerGuard allows your application to protect a controller. You must provide an array of arrays:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\ControllerGuard' => [\n [\n 'controller' => 'MyController',\n 'roles' => ['guest', 'member']\n ]\n ]\n ]\n ]\n];\n"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Only one role in a rule need to be matched (it is an OR condition)."}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:'Those rules grant access to each actions of the MyController controller to users that have either the "guest" or\n"member" roles.'}),"\n",(0,t.jsx)(n.p,{children:"As for RouteGuard, you can use a wildcard (*) character for roles."}),"\n",(0,t.jsx)(n.p,{children:"You can also specify optional actions, so that the rule only apply to one or several actions:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\ControllerGuard' => [\n [\n 'controller' => 'MyController',\n 'actions' => ['read', 'edit'],\n 'roles' => ['guest', 'member']\n ]\n ]\n ]\n ]\n];\n"})}),"\n",(0,t.jsx)(n.p,{children:"You can combine a generic rule and a specific action rule for the same controller, as follows:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\ControllerGuard' => [\n [\n 'controller' => 'PostController',\n 'roles' => ['member']\n ],\n [\n 'controller' => 'PostController',\n 'actions' => ['delete'],\n 'roles' => ['admin']\n ]\n ]\n ]\n ]\n];\n"})}),"\n",(0,t.jsx)(n.p,{children:'These rules grant access to each controller action to users that have the "member" role, but restrict the\n"delete" action to "admin" only.'}),"\n",(0,t.jsx)(n.h3,{id:"controllerpermissionsguard",children:"ControllerPermissionsGuard"}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["The ControllerPermissionsGuard listens to the ",(0,t.jsx)(n.code,{children:"MvcEvent::EVENT_ROUTE"})," event with a priority of -13."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"The ControllerPermissionsGuard allows your application to protect a controller using permissions. You must provide an array of arrays:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\ControllerPermissionsGuard' => [\n [\n 'controller' => 'MyController',\n 'permissions' => ['post.update', 'post.delete']\n ]\n ]\n ]\n ]\n];\n"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"All permissions in a rule must be matched (it is an AND condition)."}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["In the previous example, the user must have ",(0,t.jsx)(n.code,{children:"post.update"})," ",(0,t.jsx)(n.strong,{children:"AND"})," ",(0,t.jsx)(n.code,{children:"post.delete"})," permissions\nto access each action of the MyController controller."]}),"\n",(0,t.jsx)(n.p,{children:"As for all other guards, you can use a wildcard (*) character for permissions."}),"\n",(0,t.jsx)(n.p,{children:"The configuration rules are the same as for ControllerGuard."}),"\n",(0,t.jsx)(n.h3,{id:"security-notice",children:"Security notice"}),"\n",(0,t.jsxs)(n.p,{children:["RouteGuard and ControllerGuard listen to the ",(0,t.jsx)(n.code,{children:"MvcEvent::EVENT_ROUTE"})," event. Therefore, if you use the\n",(0,t.jsx)(n.code,{children:"forward"})," method in your controller, those guards will not intercept and check requests (because internally\nLaminas MVC does not trigger again a new MVC loop)."]}),"\n",(0,t.jsx)(n.p,{children:"Most of the time, this is not an issue, but you must be aware of it, and this is an additional reason why you\nshould always protect your services too."}),"\n",(0,t.jsx)(n.h2,{id:"creating-custom-guards",children:"Creating custom guards"}),"\n",(0,t.jsx)(n.p,{children:"LmcRbacMvc is flexible enough to allow you to create custom guards. Let's say we want to create a guard that will\nrefuse access based on an IP addresses blacklist."}),"\n",(0,t.jsx)(n.p,{children:"First create the guard:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:"namespace Application\\Guard;\n\nuse Laminas\\Http\\Request as HttpRequest;\nuse Laminas\\Mvc\\MvcEvent;\nuse LmcRbacMvc\\Guard\\AbstractGuard;\n\nclass IpGuard extends AbstractGuard\n{\n const EVENT_PRIORITY = 100;\n\n /**\n * List of IPs to blacklist\n */\n protected $ipAddresses = [];\n\n /**\n * @param array $ipAddresses\n */\n public function __construct(array $ipAddresses)\n {\n $this->ipAddresses = $ipAddresses;\n }\n\n /**\n * @param MvcEvent $event\n * @return bool\n */\n public function isGranted(MvcEvent $event)\n {\n $request = $event->getRequest();\n\n if (!$request instanceof HttpRequest) {\n return true;\n }\n\n $clientIp = $_SERVER['REMOTE_ADDR'];\n\n return !in_array($clientIp, $this->ipAddresses);\n }\n}\n"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["Guards must implement ",(0,t.jsx)(n.code,{children:"LmcRbacMvc\\Guard\\GuardInterface"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["By default, guards are listening to the event ",(0,t.jsx)(n.code,{children:"MvcEvent::EVENT_ROUTE"})," with a priority of -5 (you can change the default\nevent to listen by overriding the ",(0,t.jsx)(n.code,{children:"EVENT_NAME"})," constant in your guard subclass). However, in this case, we don't\neven need to wait for the route to be matched, so we overload the ",(0,t.jsx)(n.code,{children:"EVENT_PRIORITY"})," constant to be executed earlier."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"isGranted"})," method simply retrieves the client IP address, and checks it against the blacklist."]}),"\n",(0,t.jsx)(n.p,{children:"However, for this to work, we must register the newly created guard with the guard plugin manager. To do so, add the\nfollowing code in your config:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guard_manager' => [\n 'factories' => [\n 'Application\\Guard\\IpGuard' => 'Application\\Factory\\IpGuardFactory'\n ]\n ]\n ]\n];\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"guard_manager"})," config follows a conventional service manager configuration format."]}),"\n",(0,t.jsx)(n.p,{children:"Now, let's create the factory:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:"namespace Application\\Factory;\n\nuse Application\\Guard\\IpGuard;\nuse Laminas\\ServiceManager\\Factory\\FactoryInterface;\nuse Laminas\\ServiceManager\\ServiceLocatorInterface;\n\nclass IpGuardFactory implements FactoryInterface\n{\n /**\n * {@inheritDoc}\n */\n public function __invoke(ContainerInterface $container, $requestedName, array $options = null)\n {\n if (null === $options) {\n $options = [];\n }\n return new IpGuard($options);\n }\n}\n"})}),"\n",(0,t.jsx)(n.p,{children:"In a real use case, you would likely fetched the blacklist from a database."}),"\n",(0,t.jsxs)(n.p,{children:["Now we just need to add the guard to the ",(0,t.jsx)(n.code,{children:"guards"})," option, so that LmcRbacMvc can execute the logic behind this guard. In\nyour config, add the following code:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'Application\\Guard\\IpGuard' => [\n '87.45.66.46',\n '65.87.35.43'\n ]\n ]\n ]\n];\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The array of IP addresses will be passed to ",(0,t.jsx)(n.code,{children:"IpGuardFactory::__invoke"})," in the ",(0,t.jsx)(n.code,{children:"$options"})," parameter."]})]})}function d(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},7376:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/workflow-with-guards-9421d2ccbded4218039d3c55d9e07d64.png"},4676:(e,n,r)=>{r.d(n,{A:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA5gAAADICAYAAACNrk7XAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAABIAAAASABGyWs+AAAiB0lEQVR42u3df2hb98Hv8U/3qHCpeiFrp/SMJosaPCgpPt3DNgJxSm+pusuSQDo6MuSEQskKLWvd2+2PsY4nRb2so3+UkfjpNuhKYVQ2KylNIMrWJ+6TOyqHhSbcWaZueXAjjwysWnRLQdo/0u65f8hHleUjW5aO9D1Her/ggGUfSV/Z0sff7/n+kgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIBBE1k9ACDoyCsAQ+sm0wUAMHTikv67pNHV23slxVa/vkeS3eHj5iR9sPr1R5IWV7++JKksqWj6hQMInbjIKwDYEhqYAHohImmHpH2SRiTdLSlpulCSCpIuqlaJuyZpQdKS6UIBMIq8AgAf0cAE4IeYpG9K+p+S/ofauKqfSCQUi8UUi8W0d+9eSdK2bdu0Z8+ejgpw6dKl+teXL19WsVjUBx98oFwu187dZySdlfR/Jf1ZtR4EAIOJvAKAHqKBCaATbgXtmDa40m/btu655x4dOnRIu3bt0p133qkdO3YoEunv1KRyuaxisaiFhQVdu3ZNly5d0sWLF1UoFFrdJSfpLUnvSrosqdrXAgPwE3kFAH1EAxNAu0YlfUfSI/K44m9Zlo4cOaK9e/dq3759RipmW1Uul3Xt2jXNz8/r3Llzmp6ebnXqjKRfSPqj6C0AwoC8Iq8AAEAAjUo6IWlZktN4WJblpFIpJ5vNOqVSyRkU+XzeSafTTjKZdJpf8+pxQdIBSVHTfxwAa5BX5BUAAAigqKSn5FFJSyQSTjqddlZWVkzXq/qiUqk42WzWSaVSjmVZXpW3KUljYjsCwBTyirwCAAABNaZaBWRdJS2TyQzUVf9O5XK5VpW3ZdV6TuglAPqDvCKvAABAAEUkjUuaU9NwssnJyaG58t+JbDbrTExMtOoliJv+wwIDiLzqEHkFAAB6LapaRW3NsLJkMulks1nTdaFQKZVKTjqd9uoluKBaLwuA7pBXPiGvAACA39wegDWVi1QqxdV/H2SzWce27eaK25youAGdIK96iLwCAADdcCtq9R4Ad1gZc5X8l8/nvVZ1ZCga0B7yqo/IKwAAsFVjapqzlE6nnUqlYrpeM/BaVNxOisU1gFbIK0PIKwAAsJmYmlZZTKVS9AAYkMvlvIaijYvtAgAXeRUQ5BUAAPCyZt5SMplkzlIAZDKZ5sU15sQwNIC8CiDyCgAASLVegAtqmLfEKovBUqlUnFQq1dw78JToHcDwIa8CjrwCAGC4HVBDJWBiYoJ5SwGWz+ebh6HNqVbhBoYBeRUi5BUAAMMlooa5S5ZlOblcznR9BG2oVCrO5ORkc+/AAdNvKKCHyKuQIq8AABgOMTWsuEgvQDjl8/nmuU4nxRA0DB7yagCQVwAADK4xNVxJzmQypusd6EKlUmneIuCCGIKGwUFeDRDyCgCAwVNfddGyLCefz5uub8An6XS6sdK2LCptCD/yakCRVwAADIYTWv2HnkgkGGI2gLLZbPMQtDHTbzqgQ+TVgCOvAAAIt3plLZlMUlkbYCsrK1TaEHbk1ZAgrwAACJ81Ky+mUinT9Qn0QalUchKJBJU2hA15NYTIKwAAwoXK2pCqVCpU2hA25NWQIq8AAAiH+jAzKmvDiUobQoS8GnLkFQAAwUZlDY7jUGlDKJBXcByHvAIAIKgOiMoaGnhU2tgSAEFBXmEN8goYXjeZLgAAT6OScpKUSCR04cIF0+VBQJTLZY2MjKhQKEhSQdKIpLLpcmGokVfwRF4Bw+kLpgsAYJ2opP+QapW13//+96bLgwCJRqPK5XKyLEuSLElnVFu1EzCBvEJL5BUwnGhgAsFzRpJlWZampqYUifC/GGvFYjGdPn3avZmQ9JzpMmFonRF5hQ2QV8Dw+RfTBQCwxlOrh/7whz/o7rvvNl0eBNRXvvIVfelLX3J7jB6QNCPpuulyYaiQV2gLeQUAgBlxsUgGtqhhEY1l1YYrAv0QF3mFLSKvgOHAIj9AMEQkXZVk27atq1evMtQMbWlaRGNa0rjpMmHgkVfoCHkFDAfmYALBcESSLUlnz56lsoa2RaNRvfbaa+7NpNhvDr1HXqEj5BUwHGhgAuZFJaUlaXJyUvF43HR5EDIHDhxQMpl0b54WqzSid8grdIW8AgYfQ2QB86YkJS3L0vXr1+kNQEeKxaK2b9/u3nxa0r+bLhMGEnmFrpFXwGCjBxMwK67aMCGdPn2ayho6FovFlE6n3ZuTYgEN+C8u8go+IK+AwUYPJmDWlKSkbduam5szXRaEXLVa1c6dO90FNJ6X9ILpMmGgkFfwDXkFDK5h68GMiLH+CI64VnsDfvnLX5ouCwZAJBLRyy+/7N5MiV4B+Ccu8go+Iq8wRIau/TGoPZgRSXslPSjpbtU29bWazilIuijpI0nvSrosqWq64Bgq9AbAd/QKoEfIK/iOvMKAof0xoMYkndTq5s8dHCfFktnoj6hW33fZbNb03tcYMOl0ujHXhuqqKXqCvELPkFcYALQ/mgxKD2Zc0quSEj493oykxyUtmX5hGFgnJKUsy9Ly8rLpsmDANPUKHFWt9wnoFHmFniGvEGJxebQ/EomEHnvsMW3btk179uxZc4eFhQXduHFDr7/+umZmZpofj/ZHQERUC6JOrxhsdkyJq2nojWVJzuTkpOmLxxhQqVTKzTHGM6Jb5BV6irxCyKxrfySTSSebzTqVSqXt932lUnGy2ayTTCYHrv0R5h7MmKSc1o9t9ltBki2paPoFY2CMqvbeValUUjTKugbwX9M+c3eJK6LoDHmFniOvECJr2h+2beuNN97Q6OhoVw86Pz+vY8eOKZfLud8KdfsjrKvIjkmaV+8bl1p9jnkN2NhoGPV9qTaEgsoaeiUWi8m2bffmo6bLg9Air9Bz5BVCYkwNjctMJqO5ubmuG5eSNDo6qrm5OWUyGfdb1upz0f7okzH1bkjsZgd/ZPhhWZKTyWRMj0rCgGtYPIOJc+gUeYW+IK8QcPX2h2VZTj6f79lnIZ/PO5Zlhbr9EbYhsjHVehPvMPT8n6g2XCiU3dUIBIaboW+ahp1tF9mFrSGv0DfkFQKsPiw2kUjozJkzW8rDarW2C0kk0v60ynK5rIcffthdCCh0w2XDNEQ2otof11TjUqvPnVPIJ97CqPul2ph9KmvotaZhZw+ZLg9Ch7xC35BXCCi3/WFZlrVp47JcLmt+fl5TU1MaHx/Xvffeq5tvvlk333yz7r33Xj3zzDOamprS0tLShk8ajUZ15swZWZYlfT5clvZHD/RytdhOVpcFOjElVmNEHzWszkhuYavIK/QVeYUAqrc/NhsWm8lkmoe2bngkEglnZWVlw8fM5/O0P3ooLvONyuYjbvqXglBis3L0VTabbcwtYCvIK/QVeYWAiWv1/bjRPPRSqeS11UjbRzqd3vBzkclkQtf+CMsczAtq2sQ0AGbEEA5sTVxSXgr3fKalpSVdunTJ82e7du3S3r17N5xn4N5/cXFRkjQyMqJ9+/YpHo+vO3d2dlZ/+ctfdOTIEc/HLJfLOnv2rHbt2qWxsbH6+ZvZyvnuuWFVLpd16623ujdZ/h/tiqtHeVUul/XnP/9Z7777rm677Tbdf//92r1794bP0UlujI6Oeq7u2MvcaPWcrmq1qg8//FDz8/O6fPmyvvrVr2r37t365je/qVgs1vK1jI+Pb1i2rZ7Xzuvc7PzNXmsnyCsEzAVJCdu2NTfnvUXr7OysHnnkEX3yySddPdFmczvvvfdedwsT2h8+MblqLKvKwk9jWl19LMwaVvrzPCzLclKp1Lr7raysOIlEouX9ksmkUyqV1tzHvSLYijt0JJlMrjl/s2Mr57vnhpnILGxdT/KqYQhkW5+1bnJDkufws17nhm3bnr0d+XzesW275f0mJibWbdK+WQZ2el47r7Ob19oNkVcIhnr7I5fLeb5XS6WSc8cdd/jWrtiovpHL5fhs+OykzDckWx0nTf9yECrjGoAGi9vAbJ6LUCqV1sw/aKzYlUql+vcty3ImJyedUqnkrKysOKlUas3PGitYW21grqysOPl8vn64ldlUKrXm+27Z3MfPZDJrfu51bpg1VBLHO3zvYvj4nlfu59G9CFUqlZxSqeRks9l6I7Lx4lS3udGq/H7lhlcGTk5O1p+7sUyN86hs23bS6bRTKpXWPJ9Um5Pl9dlt9zPe7nmt8q4581o97srKSv21Nv/+u0VeISBOapMM7GZYbKtjo+GyDc9H+6NLEZlvRG52sKLTcBlT53/zgVgwo1UD0+XOFWisKE5MTNSv0HupVCr1Cmbj72erDcxWZW0V2K0qioOGhTOGVmDyyv0sJpNJz8aI25i0bbveI9ltbrj3b+5h63VuuJ+3xuf1akA3vxa3d7Pxfr1qYLZrs/Pd1+rnPF3yCj7pJv/q7Y9W7+2meZG+Hq2ypWmOcqDbH0HfpmSv6QIMSBnhn6ykimpXjzoKr9tuu830a+ipnTt3SpI+/fTT+vdOnTolSTpy5IjnfSKRiJ599llJ0s9+9jPTL2HgjIyMmC4CzAhMXp07d06SdOzYMc/51NFoVNevX9fc3Fx9DlK3ufHiiy/KsiwdP368vg9dP3zjG9+QJF27dk1SbX/H1b3s9OSTT7Z8LY888ogk6Y033uhbWbvlvj8+++wz3x6TvIJPusm/et1+79711fxyuazjx4/3rOCHDx/2LtTasgS6/RH0BuaDpgvQhmdNFwBGTGjr4fW922+/faD/eVarVf385z+X9HmlsFj8fF9gr6B23X///ZKkQqHQ93IvLCxoaWnJ8+hnxbRXdu3apdtvv12SvmO6LDDCeF5NT09L+vxz7qWx4elHbkSjUb322msqFAr60Y9+5Ofvs6Vyuayf/OQntV/g975X/55U20/UayEf13e+U/t4Xrx4seflbJV3W8m8crmsV199VdLGf9etIq/gs07y73/fcssteuKJJzwviF27dq2ndZVcLue5T2YkElEiUV/zNNBtpEB3r0q623QB2vAN0wWAcROrhySdkvSmpMuSmv9Lf+HTTz/V9u3bTZfXF7/97W81MjKiv/3tb/VVZd1KpG3b9UqhW7lKJpMbri4bjUZl23Y9WL1Wh+yVgwcPtvxZPp/va1l64c4773R7lP+b6bLAuL7nldtYTCQSba9G61duHDhwQIlEQqdOndKzzz6reDzu2+fZzcDFxUV99NFHkj7PwEQiUW9Muvno9lC24q7I2o+LbHfddVfLn3ll3tRUbbSq12udmJjwdZVh8go91G7+7f7HP/6h++67z/NB5ufne17QhYUFz6x67LHH3BERgW4jBb2B+YDpArRhp+kCIFDaDa/Qe/755z2/n81mPbf1+OCDDzZ9zJWVFUna8Cp/L6RSqZY9Nf0uC9BHfcmrW265RZLqw0S3wo/cmJqa0vbt23X48GFdvXp1wwbrVnhloGVZOn369JoM3LVrl6S10wa8uI3qfkin0y1/5vV7PHr06Lrv2bats2fPhv4CHIbWRvm3U5K2bdvmeUd3yH8vXblyRQcOHFj3/YYyBbqNFPQGpmW6AG0I+jBjmNMcXgOl+Sr3+Pi4pqen183F2bFjh6TakI9isdiyEri0tFS/ct98NXx+ft5zv7WFhQVJ3TcCH330USpJGHY9y6vGz3Orz3IzP3LDFYvFNDk5qaefflpvvvnmpntFtqsxA6vVqr7+9a8rl8vpzjvvXHOee/vUqVN6+eWXWzZw//jHP0pS4xC4ntnq78BxnPrX1WpVO3fudPfkAwZBc/59QZL27NnjeXI7F7669dZbb+nEiRPrvt9QpkC3kYLcOAp647eR6ZVsOfp3dGqii/uGwsmTtVWzjx8/vuZKfCQSkWXVcvD9999veX/3imBj5erYsWOSpLffftvzPr/4xS8kbTxHC+uY/gxxDGFeTUzUHrLVZ1mq9TSOj4+rWCx2lRtennjiCdm2raNHj66Z3+mXSCRSX5zn8OHDa+Yxuo1lSfrwww9bPsY777wjqXWlNigikYhOnz4tSXr88cd7/XSmP0Mc4T06tWH+VavVvlxcyeVy7cyHDmxbKcgNTAAhEovFlE6nVSgU1lU63MrI8ePHNTs7uy40i8VifRVId9EISfrWt74lqXYlr7lSuLS0VB9yt2/fPtMvH8AG3NVef/WrX+n8+fPrMmB+fl5Hjx7VxYsX60NqO80NL40NwGeeeaYnr3F0dFQTExPK5XL69a9/vea53SGpP/zhDzU7O7vuvvPz8/VVc1988cWelM9PY2NjSiaTmpmZqc/PBABXYFu+CtectZtMFwB908lVsZyktySlTBe+144cOaKXXnpJ09PT+sEPflCfh+RWRqanp7V//35ZlqWf/vSnuu2227S4uFify5RKpdYMVY1EIkqlUnr++ee1fft2JZNJHTp0SC+99FL9CuLExETXw1vdxTpaOXz4sK+LWBhGXg2PwORVPB6vf5YPHjwoy7L05JNPamRkRK+//nr9YlEul6t/1jrNjVbcBqDbkOuFF198UW+++aaefvppHTp0qF4uNxtnZmY0MzMj27b14x//WJJ0+fLlepkymYxn1rRqxDVnU7fntTrfy6uvvqqLFy/q6NGjeuihh3o1X528Qqd6kn+RSKS+sFgvJRKJduaLh6mtFCjLMt/FvtnxT9O/JPRVO++JZX2+FHa0+b6tNtANC3cT8lavw93E3LKsdRuqZzIZx7Ksdb8zy7KcXC7n+XilUsnJZDL1jcobj3Q67blpe3NZN9swfbMj7H8z92+i7oYNIXwCl1fZbHZdBliW5aRSqZYZsNXccD/XXkqlUv2xksmk5znt5kar3427Abtt22vyqVKpOJOTk55/B9u2PR9vs4xy7+PXea3Ob8X9XSUSCd/eI+QVfNJN/v1TkpPJZDzfoxMTEz1vX6RSqQ3zZbXsgRX0K0NTkpKmC7GJv0iKmy4E+qbVP7xpSW9Iel9ScaP7hn3bi3K5rGKxqB07drS8ulYsFlUul1ueU61W9de//lWSNnycVs8tqa3foXt+LBbzvBrvlnMzWyljEC0tLTVuSxD03Id/AptXbgZEo9G2e77azQ33c92q3O7PWz13u7mxURncPexandNulm2WUe7j+3Veq/M3KqP7Wv16n5BX8Ek3+bckaVc6nfZcEGtqaspzZWU/tVqRv+G5pyX5s2LZEDoh8z2Umx3/afqXhL5y/+4XJD2lrV1c+Kck509/+pNvV3qBdmQyGeeLX/wiIy6GD3mF0CGv4JNu8u8/JTnf//73Pd+jTb3sPTlKpZLnczeM5jrR5msxIuiL/LxrugBt+DfTBUBf2ZJulvSQpH9X7SpXu34nSR9//LHp14Ahc+PGDf3973+XVt+DGBrkFUKHvIJPusm/f5Ok3/zmN54rucbj8Z5uJ5RKpTxHT1Sr1cb9hAPdRgp6A/Oy6QIMSBnhn3l1Oal6cXHR9GvAkGl4z/m/PwOCjLxC6JBX8Ek3+Vev21++7F3N79XqybZt67nnnvMu1NqyBLr9EfQGZlXB3qD+lFjBCe07J0kfffSR6XJgyLz33nvul4H+h4RAIa9gBHmFAKi3P1555RXPE9yt2fx29uzZlnO7G8oS+PZHGCZPj0nKmi5EC/slzXb9KBgW9fey47A4HvrnppvqUW+rdlUX2Ax5BSPIKwREPQNzuZxGR0c9T3rooYcah612pdWiQlJtr1zbtt2bgW9/BL0HU6r9Av35y/lrRgH/4yJw/sv9wl09EOi1pvdawXR5EBrkFfqOvEKA1Nsfx44da3nSmTNnlEx2v+HFRo3LpjKEov0RhgamJD1uugAhKROCrajVf5jvv/++6bJgSDS81wpiThPaR16h78grBMzjUq0H8/z5854nRKNRTU1NdTxc1rZt5fP5DRuX58+fVy6XW1OmoAtLA3NJtf1egmJaW1uNCnBdlKQrV66YLgeGxDvvvON++abpsiB0yCv0FXmFgFnSavvj4MGD9T1fvYyPjyufzzcOY91UKpXS1atXN91n9uDBg+7N0LQ/wjAH0xWRdF2SZbgcBUk7FfDJtQisA5IylmVpeXnZdFkwBL785S+rUChI0kFJ57t8OAwX8gp9RV4hgOrtD8uytLi46LmFSKOlpSUtLCzoypUreuutt+q9j4lEQvfdd58efPBBfe1rX9v0ccrlskZGRtzPRKjaH2FqYEpSTLUJ33cYev5PJI2KYRvoXEzSiiStrKwoFouZLg8GWNOiALdKKpsuE0KFvELfkFcIsJiknCQrkUjozJkzmzYOG7l7abZaHdZLuVzWww8/7C4gVFBt0avQtD/CMkTWVZT0iMHnf0Qh+uMikIqqhZR+9zv2kEZvvf322+6XM6Kyhq0jr9A35BUCrCjpu5I0MzOjkZGRDYfLNotEIltqXC4tLWlkZKRxddrvivZHX4yp1pp3+nQUVp8T8MNTkhzbth2gVyqVimNZlpth412+ZzG8yCv0HHmFkBiTtKzV9kEmk/H9s5DJZBrbH8ui/dF3MTX8kXt4LK8+F+CXmFbfX7lczvT/dQyobDbbmGPtj+UB1iKv0HPkFUJkTfvDtm1fsjGXyzm2bQ9M+yNsQ2QbFVWb7NrL1WWnV5+Dbmn4qajVvZUahgQBvnrllVfcL6fFcDN0jrxCz5FXCJE17Y9cLifbtjU+Pq7Z2dn6fMt2VKtVzc7Oanx8XLZtN25FEvr2R9gW+WklLulVSQmfHm9GtX1mlky/MAysA5IyklQqlbY0WRzYzNLSku666y735n6FYFNmBBp5hZ4hrxBicXm0PxKJhB577DFt27ZNe/bsWXOHhYUF3bhxQ6+//nrjHEsX7Y+AGpN0Up0Phz0pxjqjPyJaHWIxOTlpenQSBkwqlXIzbc70Gx0DgbxCz5BXGAC0P5oMSg9ms4ikvZIelHS3pAe0fv/MgmqbSH8k6V1JlxWSvWUwMJ6SNGlZlq5fv76lFcaAVsrlsm699Vb3JnvJwS/kFXxHXmHA0P4YUpHVAwiCqFavXqXTadMXkTEgJiYmGhcIIO/gF/IKviOvMCSGrv0xqD2YQFiMS0pLzG1C95rmMtEbAL+RV/ANeQUMrjCvIgsMgjdVGy6h5557znRZEHKPP/64+2VOVNbgP/IKviGvgMFFDyZgXr1XIJ/PKx6Pmy4PQuj8+fM6ePCge9OWNG+6TBhI5BW6Rl4Bg40GJhAMc5LsRCKhCxcumC4LQqZarWrnzp0qFApSbf+scdNlwkAjr9Ax8goYfAyRBYLhsCTNzMxoamrKdFkQMo8++qhbWSuotocW0EvkFTpGXgGDjx5MIDhOSEpJ0srKimKxmOnyIASahpqxUAb6hbzClpFXwHCggQkER0TSVUm2bdu6evUqe81hQ8ViUbZtM9QMJpBX2BLyChge/2K6AADq/p+kP0j6X5988ok+++wzffvb3zZdJgRUtVrV/v379fHHH0u1oWYPSaqYLheGBnmFtpFXAACYNa7VDc0zmYzpfbARUA0blDuSRk2/aTG0yCtsirwCAMC8Ka3+M85ms6brBgiYVCrVWFljmBlMI6/QEnkFDB/mYALBFJH0e0kJy7KUy+VYRAOSpNnZWe3fv9+9+bykF0yXCUOPvIIn8goYTjQwgeCKScpJsqi0QVpXWZuR9G1JVdPlAkReoQl5BQwvGphAsK2ptC0uLioajZouEwygsoYQIK8gibwCht0XTBcAwIaKkr4rSYVCQQ8//LDK5bLpMqHPmiprBVFZQzCRVyCvANCDCYTEmKSsJDH8bLh4VNZs1SryQFCRV0OKvAIg0YMJhMWspP1SrWfAtm0Vi/zPHnRNlbWcqKwhHMirIUReAXDRwATCY12lbX5+3nSZ0CMvvPBC8xymr4vKGsKDvBoi5BUAAOEWk7Qs9p0bSJVKpXlT8guqbQMBhBF5NcDIKwAABkdM0pxW/6mnUimnUqmYrmugSysrK04ikWisrJ0QlTWEH3k1gMgrAAAGT0S1q8WOJCeRSDilUsl0nQMdymazjmVZjZW1cdNvMMBH5NUAIa8AABhsJ7T6T96yLIaghUylUnFSqVRjRW1Z0qjpNxXQI+RViJFXAAAMjzE1zHOamJhgCFoI5PN5x7bt5vlL7EyPQUdehRB5BQDA8ImqYQiaZVlOLpczXSeBh0ql4kxOTjZW1BhihmFDXoUEeQUAAMbVUBGYmJhgrlOA5HK55l6AOUlx028awBDyKsDIKwAA4IqpqXcgnU6brqsMtVKp5CSTyeZegKfEqosAeRUw5BUAAGhlXA1znWzbZlGNPiuVSs2LYjiSplSrVAP4HHllGHkFAADaEVHDyo1arbjl83nTdZmBVqlUnHQ63byU/7JqC5wA8EZeGUBeAQCATsRVuxJdr0AkEgl6CHy2QUVtXAwvA9oVF3nVc+QVAADwQ1xNFTd3KBpbBXSuxdAyR7XeGCpqQGfiIq98R14BAIBeiKup4mZZljM5OckqjluQy+W8FsNYVq2ixh5xgD/iIq+6Rl4BAIB+iEs6qaYr2clkkuFoLZRKJWdycrJ5+X6GlgG9Fxd5tSXkFQAAMCWq2jL09VUctdpLkEqlhn4T9FKp5GQyGSeRSHgNK7sgFsMA+om8Iq8AAECIjKlpOJoaKm/DMv9pZWVlo0rasmoVXJbvB8wir8grAAAQElFJB9SwCbqahqWl0+mB2UKgVCo52WzWSaVSXsPJGucqjZr+wwBYh7wirwAEwE2mCwAgNKKS7pd0TFLS64RkMqlDhw5pdHRUu3fvVjQa7DUjisWi3n//fV25ckXvvfeeZmZmvE4rSPqVpHclXZZUNV1uAJsir8grAIbQwATQiYikvZIelPSIJNvrJMuy9MADD2jfvn3avXu39uzZo1gs1veKXLFYVLlc1qVLl7S4uLhR5cw1Lemcaj0hxb4WFoDfyCsA6CMamAD8EJX0NUn/KumwpMRmd7BtW/fcc49isZj27t1b//6+ffs6KsClS5fqX587d06SdPHiRRUKhc3uWpB0UbUK2vzqAWBwkVcA0EM0MAH0SlzSnapV4vZJekCSZbhMOUn/R7WhY/OqVda44g8gLvIKAHxBAxNAv8VU60FwL/2PSLp79et71GL4Whtm9Hnl65Kkv0m6IWlh9ftl0y8cQOiQVwAAAAMqIjYEBxAO5BUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwqf8PNaKebFevR6UAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTMtMTEtMjRUMTQ6NDM6MzUrMDA6MDArZv70AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDEzLTExLTI0VDE0OjQzOjM1KzAwOjAwWjtGSAAAAABJRU5ErkJggg=="},8453:(e,n,r)=>{r.d(n,{R:()=>a,x:()=>l});var t=r(6540);const s={},o=t.createContext(s);function a(e){const n=t.useContext(o);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:a(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8b5d4ccc.b7b33d1d.js b/assets/js/8b5d4ccc.b7b33d1d.js deleted file mode 100644 index b4205e9d..00000000 --- a/assets/js/8b5d4ccc.b7b33d1d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[223],{5811:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>i,contentTitle:()=>a,default:()=>d,frontMatter:()=>t,metadata:()=>l,toc:()=>A});var s=r(4848),o=r(8453);const t={sidebar_position:5},a="Guards",l={id:"guards",title:"Guards",description:"In this section, you will learn:",source:"@site/docs/guards.md",sourceDirName:".",slug:"/guards",permalink:"/LmcRbacMvc/docs/guards",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/docs/guards.md",tags:[],version:"current",sidebarPosition:5,frontMatter:{sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"Role providers",permalink:"/LmcRbacMvc/docs/role-providers"},next:{title:"Strategies",permalink:"/LmcRbacMvc/docs/strategies"}},i={},A=[{value:"What are guards and when should you use them?",id:"what-are-guards-and-when-should-you-use-them",level:2},{value:"Protection policy",id:"protection-policy",level:3},{value:"Built-in guards",id:"built-in-guards",level:2},{value:"RouteGuard",id:"routeguard",level:3},{value:"RoutePermissionsGuard",id:"routepermissionsguard",level:3},{value:"ControllerGuard",id:"controllerguard",level:3},{value:"ControllerPermissionsGuard",id:"controllerpermissionsguard",level:3},{value:"Security notice",id:"security-notice",level:3},{value:"Creating custom guards",id:"creating-custom-guards",level:2}];function c(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"guards",children:"Guards"}),"\n",(0,s.jsx)(n.p,{children:"In this section, you will learn:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"What guards are"}),"\n",(0,s.jsx)(n.li,{children:"How to use and configure built-in guards"}),"\n",(0,s.jsx)(n.li,{children:"How to create custom guards"}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"what-are-guards-and-when-should-you-use-them",children:"What are guards and when should you use them?"}),"\n",(0,s.jsx)(n.p,{children:"Guards are listeners that are registered on a specific event of\nthe MVC workflow. They allow your application to quickly mark a request as unauthorized."}),"\n",(0,s.jsx)(n.p,{children:"Here is a simple workflow without guards:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Laminas Framework workflow without guards",src:r(4676).A+"",width:"920",height:"200"})}),"\n",(0,s.jsx)(n.p,{children:"And here is a simple workflow with a route guard:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Laminas Framework workflow with guards",src:r(7376).A+"",width:"1120",height:"1600"})}),"\n",(0,s.jsx)(n.p,{children:'RouteGuard and ControllerGuard are not aware of permissions but rather only think about "roles". For\ninstance, you may want to refuse access to each routes that begin by "admin/*" to all users that do not have the\n"admin" role.'}),"\n",(0,s.jsx)(n.p,{children:'If you want to protect a route for a set of permissions, you must use RoutePermissionsGuard. For instance,\nyou may want to grant access to a route "post/delete" only to roles having the "delete" permission.\nNote that in a RBAC system, a permission is linked to a role, not to a user.'}),"\n",(0,s.jsx)(n.p,{children:"Albeit simple to use, guards should not be the only protection in your application, and you should always\nprotect your services as well. The reason is that your business logic should be handled by your service. Protecting a given\nroute or controller does not mean that the service cannot be access from elsewhere (another action for instance)."}),"\n",(0,s.jsx)(n.h3,{id:"protection-policy",children:"Protection policy"}),"\n",(0,s.jsx)(n.p,{children:'By default, when a guard is added, it will perform a check only on the specified guard rules. Any route or controller\nthat is not specified in the rules will be "granted" by default. Therefore, the default is a "blacklist"\nmechanism.'}),"\n",(0,s.jsx)(n.p,{children:'However, you may want a more restrictive approach (also called "whitelist"). In this mode, once a guard is added,\nanything that is not explicitly added will be refused by default.'}),"\n",(0,s.jsx)(n.p,{children:'For instance, let\'s say you have two routes: "index" and "login". If you specify a route guard rule to allow "index"\nroute to "member" role, your "login" route will become defacto unauthorized to anyone, unless you add a new rule for\nallowing the route "login" to "member" role.'}),"\n",(0,s.jsx)(n.p,{children:"You can change it in LmcRbacMvc config, as follows:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"use LmcRbacMvc\\Guard\\GuardInterface;\n\nreturn [\n 'lmc_rbac' => [\n 'protection_policy' => GuardInterface::POLICY_DENY\n ]\n];\n"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"NOTE: this policy will block ANY route/controller (so it will also block any console routes or controllers). The\ndeny policy is much more secure, but it needs much more configuration to work with."}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"built-in-guards",children:"Built-in guards"}),"\n",(0,s.jsx)(n.p,{children:"LmcRbacMvc comes with four guards, in order of priority :"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"RouteGuard : protect a set of routes based on the identity roles"}),"\n",(0,s.jsx)(n.li,{children:"RoutePermissionsGuard : protect a set of routes based on roles permissions"}),"\n",(0,s.jsx)(n.li,{children:"ControllerGuard : protect a controllers and/or actions based on the identity roles"}),"\n",(0,s.jsx)(n.li,{children:"ControllerPermissionsGuard : protect a controllers and/or actions based on roles permissions"}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["All guards must be added in the ",(0,s.jsx)(n.code,{children:"guards"})," subkey:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n // Guards config here!\n ]\n ]\n];\n"})}),"\n",(0,s.jsx)(n.p,{children:"Because of the way Laminas Framework handles config, you can without problem define some rules in one module, and\nmore rules in another module. All the rules will be automatically merged."}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:'For your mental health, I recommend you to use either the route guard OR the controller guard, but not both. If\nyou decide to use both conjointly, I recommend you to set the protection policy to "allow" (otherwise, you will\nneed to define rules for every routes AND every controller, which can become quite frustrating!).'}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Please note that if your application uses both route and controller guards, route guards are always executed\n",(0,s.jsx)(n.strong,{children:"before"})," controller guards (they have a higher priority)."]}),"\n",(0,s.jsx)(n.h3,{id:"routeguard",children:"RouteGuard"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["The RouteGuard listens to the ",(0,s.jsx)(n.code,{children:"MvcEvent::EVENT_ROUTE"})," event with a priority of -5."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:'The RouteGuard allows your application to protect a route or a hierarchy of routes. You must provide an array of "key" => "value",\nwhere the key is a route pattern and the value is an array of role names:'}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\RouteGuard' => [\n 'admin*' => ['admin'],\n 'login' => ['guest']\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"Only one role in a rule needs to be matched (it is an OR condition)."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:'Those rules grant access to all admin routes to users that have the "admin" role, and grant access to the "login"\nroute to users that have the "guest" role (eg.: most likely unauthenticated users).'}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"The route pattern is not a regex. It only supports the wildcard (*) character, that replaces any segment."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"You can also use the wildcard character * for roles:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\RouteGuard' => [\n 'home' => ['*']\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsx)(n.p,{children:'This rule grants access to the "home" route to anyone.'}),"\n",(0,s.jsx)(n.p,{children:"Finally, you can also omit the roles array to completely block a route, for maintenance purpose for example :"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\RouteGuard' => [\n 'route_under_construction'\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsx)(n.p,{children:"This rule will be inaccessible."}),"\n",(0,s.jsx)(n.p,{children:"Note : this last example could be (and should be) written in a more explicit way :"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\RouteGuard' => [\n 'route_under_construction' => []\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsx)(n.h3,{id:"routepermissionsguard",children:"RoutePermissionsGuard"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["The RoutePermissionsGuard listens to the ",(0,s.jsx)(n.code,{children:"MvcEvent::EVENT_ROUTE"})," event with a priority of -8."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:'The RoutePermissionsGuard allows your application to protect a route or a hierarchy of routes. You must provide an array of "key" => "value",\nwhere the key is a route pattern and the value is an array of permission names:'}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\RoutePermissionsGuard' => [\n 'admin*' => ['admin'],\n 'post/manage' => ['post.update', 'post.delete']\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"By default, all permissions in a rule must be matched (an AND condition)."}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["In the previous example, one must have ",(0,s.jsx)(n.code,{children:"post.update"})," ",(0,s.jsx)(n.strong,{children:"AND"})," ",(0,s.jsx)(n.code,{children:"post.delete"})," permissions\nto access the ",(0,s.jsx)(n.code,{children:"post/manage"})," route. You can also specify an OR condition like so:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"use LmcRbacMvc\\Guard\\GuardInterface;\n\nreturn [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\RoutePermissionsGuard' => [\n 'post/manage' => [\n 'permissions' => ['post.update', 'post.delete'],\n 'condition' => GuardInterface::CONDITION_OR\n ]\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"Permissions are linked to roles, not to users"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:'Those rules grant access to all admin routes to roles that have the "admin" permission, and grant access to the\n"post/delete" route to roles that have the "post.delete" or "admin" permissions.'}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"The route pattern is not a regex. It only supports the wildcard (*) character, that replaces any segment."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"You can also use the wildcard character * for permissions:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\RoutePermissionsGuard' => [\n 'home' => ['*']\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsx)(n.p,{children:'This rule grants access to the "home" route to anyone.'}),"\n",(0,s.jsx)(n.p,{children:"Finally, you can also use an empty array to completly block a route, for maintenance purpose for example :"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\RoutePermissionsGuard' => [\n 'route_under_construction' => []\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsx)(n.p,{children:"This route will be inaccessible."}),"\n",(0,s.jsx)(n.h3,{id:"controllerguard",children:"ControllerGuard"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["The ControllerGuard listens to the ",(0,s.jsx)(n.code,{children:"MvcEvent::EVENT_ROUTE"})," event with a priority of -10."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"The ControllerGuard allows your application to protect a controller. You must provide an array of arrays:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\ControllerGuard' => [\n [\n 'controller' => 'MyController',\n 'roles' => ['guest', 'member']\n ]\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"Only one role in a rule need to be matched (it is an OR condition)."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:'Those rules grant access to each actions of the MyController controller to users that have either the "guest" or\n"member" roles.'}),"\n",(0,s.jsx)(n.p,{children:"As for RouteGuard, you can use a wildcard (*) character for roles."}),"\n",(0,s.jsx)(n.p,{children:"You can also specify optional actions, so that the rule only apply to one or several actions:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\ControllerGuard' => [\n [\n 'controller' => 'MyController',\n 'actions' => ['read', 'edit'],\n 'roles' => ['guest', 'member']\n ]\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsx)(n.p,{children:"You can combine a generic rule and a specific action rule for the same controller, as follows:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\ControllerGuard' => [\n [\n 'controller' => 'PostController',\n 'roles' => ['member']\n ],\n [\n 'controller' => 'PostController',\n 'actions' => ['delete'],\n 'roles' => ['admin']\n ]\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsx)(n.p,{children:'These rules grant access to each controller action to users that have the "member" role, but restrict the\n"delete" action to "admin" only.'}),"\n",(0,s.jsx)(n.h3,{id:"controllerpermissionsguard",children:"ControllerPermissionsGuard"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["The ControllerPermissionsGuard listens to the ",(0,s.jsx)(n.code,{children:"MvcEvent::EVENT_ROUTE"})," event with a priority of -13."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"The ControllerPermissionsGuard allows your application to protect a controller using permissions. You must provide an array of arrays:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\ControllerPermissionsGuard' => [\n [\n 'controller' => 'MyController',\n 'permissions' => ['post.update', 'post.delete']\n ]\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"All permissions in a rule must be matched (it is an AND condition)."}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["In the previous example, the user must have ",(0,s.jsx)(n.code,{children:"post.update"})," ",(0,s.jsx)(n.strong,{children:"AND"})," ",(0,s.jsx)(n.code,{children:"post.delete"})," permissions\nto access each action of the MyController controller."]}),"\n",(0,s.jsx)(n.p,{children:"As for all other guards, you can use a wildcard (*) character for permissions."}),"\n",(0,s.jsx)(n.p,{children:"The configuration rules are the same as for ControllerGuard."}),"\n",(0,s.jsx)(n.h3,{id:"security-notice",children:"Security notice"}),"\n",(0,s.jsxs)(n.p,{children:["RouteGuard and ControllerGuard listen to the ",(0,s.jsx)(n.code,{children:"MvcEvent::EVENT_ROUTE"})," event. Therefore, if you use the\n",(0,s.jsx)(n.code,{children:"forward"})," method in your controller, those guards will not intercept and check requests (because internally\nLaminas MVC does not trigger again a new MVC loop)."]}),"\n",(0,s.jsx)(n.p,{children:"Most of the time, this is not an issue, but you must be aware of it, and this is an additional reason why you\nshould always protect your services too."}),"\n",(0,s.jsx)(n.h2,{id:"creating-custom-guards",children:"Creating custom guards"}),"\n",(0,s.jsx)(n.p,{children:"LmcRbacMvc is flexible enough to allow you to create custom guards. Let's say we want to create a guard that will\nrefuse access based on an IP addresses blacklist."}),"\n",(0,s.jsx)(n.p,{children:"First create the guard:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"namespace Application\\Guard;\n\nuse Laminas\\Http\\Request as HttpRequest;\nuse Laminas\\Mvc\\MvcEvent;\nuse LmcRbacMvc\\Guard\\AbstractGuard;\n\nclass IpGuard extends AbstractGuard\n{\n const EVENT_PRIORITY = 100;\n\n /**\n * List of IPs to blacklist\n */\n protected $ipAddresses = [];\n\n /**\n * @param array $ipAddresses\n */\n public function __construct(array $ipAddresses)\n {\n $this->ipAddresses = $ipAddresses;\n }\n\n /**\n * @param MvcEvent $event\n * @return bool\n */\n public function isGranted(MvcEvent $event)\n {\n $request = $event->getRequest();\n\n if (!$request instanceof HttpRequest) {\n return true;\n }\n\n $clientIp = $_SERVER['REMOTE_ADDR'];\n\n return !in_array($clientIp, $this->ipAddresses);\n }\n}\n"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["Guards must implement ",(0,s.jsx)(n.code,{children:"LmcRbacMvc\\Guard\\GuardInterface"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["By default, guards are listening to the event ",(0,s.jsx)(n.code,{children:"MvcEvent::EVENT_ROUTE"})," with a priority of -5 (you can change the default\nevent to listen by overriding the ",(0,s.jsx)(n.code,{children:"EVENT_NAME"})," constant in your guard subclass). However, in this case, we don't\neven need to wait for the route to be matched, so we overload the ",(0,s.jsx)(n.code,{children:"EVENT_PRIORITY"})," constant to be executed earlier."]}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"isGranted"})," method simply retrieves the client IP address, and checks it against the blacklist."]}),"\n",(0,s.jsx)(n.p,{children:"However, for this to work, we must register the newly created guard with the guard plugin manager. To do so, add the\nfollowing code in your config:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guard_manager' => [\n 'factories' => [\n 'Application\\Guard\\IpGuard' => 'Application\\Factory\\IpGuardFactory'\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"guard_manager"})," config follows a conventional service manager configuration format."]}),"\n",(0,s.jsx)(n.p,{children:"Now, let's create the factory:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"namespace Application\\Factory;\n\nuse Application\\Guard\\IpGuard;\nuse Laminas\\ServiceManager\\Factory\\FactoryInterface;\nuse Laminas\\ServiceManager\\ServiceLocatorInterface;\n\nclass IpGuardFactory implements FactoryInterface\n{\n /**\n * {@inheritDoc}\n */\n public function __invoke(ContainerInterface $container, $requestedName, array $options = null)\n {\n if (null === $options) {\n $options = [];\n }\n return new IpGuard($options);\n }\n}\n"})}),"\n",(0,s.jsx)(n.p,{children:"In a real use case, you would likely fetched the blacklist from a database."}),"\n",(0,s.jsxs)(n.p,{children:["Now we just need to add the guard to the ",(0,s.jsx)(n.code,{children:"guards"})," option, so that LmcRbacMvc can execute the logic behind this guard. In\nyour config, add the following code:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'Application\\Guard\\IpGuard' => [\n '87.45.66.46',\n '65.87.35.43'\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The array of IP addresses will be passed to ",(0,s.jsx)(n.code,{children:"IpGuardFactory::__invoke"})," in the ",(0,s.jsx)(n.code,{children:"$options"})," parameter."]})]})}function d(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},7376:(e,n,r)=>{r.d(n,{A:()=>s});const s=r.p+"assets/images/workflow-with-guards-9421d2ccbded4218039d3c55d9e07d64.png"},4676:(e,n,r)=>{r.d(n,{A:()=>s});const s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA5gAAADICAYAAACNrk7XAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAABIAAAASABGyWs+AAAiB0lEQVR42u3df2hb98Hv8U/3qHCpeiFrp/SMJosaPCgpPt3DNgJxSm+pusuSQDo6MuSEQskKLWvd2+2PsY4nRb2so3+UkfjpNuhKYVQ2KylNIMrWJ+6TOyqHhSbcWaZueXAjjwysWnRLQdo/0u65f8hHleUjW5aO9D1Her/ggGUfSV/Z0sff7/n+kgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIBBE1k9ACDoyCsAQ+sm0wUAMHTikv67pNHV23slxVa/vkeS3eHj5iR9sPr1R5IWV7++JKksqWj6hQMInbjIKwDYEhqYAHohImmHpH2SRiTdLSlpulCSCpIuqlaJuyZpQdKS6UIBMIq8AgAf0cAE4IeYpG9K+p+S/ofauKqfSCQUi8UUi8W0d+9eSdK2bdu0Z8+ejgpw6dKl+teXL19WsVjUBx98oFwu187dZySdlfR/Jf1ZtR4EAIOJvAKAHqKBCaATbgXtmDa40m/btu655x4dOnRIu3bt0p133qkdO3YoEunv1KRyuaxisaiFhQVdu3ZNly5d0sWLF1UoFFrdJSfpLUnvSrosqdrXAgPwE3kFAH1EAxNAu0YlfUfSI/K44m9Zlo4cOaK9e/dq3759RipmW1Uul3Xt2jXNz8/r3Llzmp6ebnXqjKRfSPqj6C0AwoC8Iq8AAEAAjUo6IWlZktN4WJblpFIpJ5vNOqVSyRkU+XzeSafTTjKZdJpf8+pxQdIBSVHTfxwAa5BX5BUAAAigqKSn5FFJSyQSTjqddlZWVkzXq/qiUqk42WzWSaVSjmVZXpW3KUljYjsCwBTyirwCAAABNaZaBWRdJS2TyQzUVf9O5XK5VpW3ZdV6TuglAPqDvCKvAABAAEUkjUuaU9NwssnJyaG58t+JbDbrTExMtOoliJv+wwIDiLzqEHkFAAB6LapaRW3NsLJkMulks1nTdaFQKZVKTjqd9uoluKBaLwuA7pBXPiGvAACA39wegDWVi1QqxdV/H2SzWce27eaK25youAGdIK96iLwCAADdcCtq9R4Ad1gZc5X8l8/nvVZ1ZCga0B7yqo/IKwAAsFVjapqzlE6nnUqlYrpeM/BaVNxOisU1gFbIK0PIKwAAsJmYmlZZTKVS9AAYkMvlvIaijYvtAgAXeRUQ5BUAAPCyZt5SMplkzlIAZDKZ5sU15sQwNIC8CiDyCgAASLVegAtqmLfEKovBUqlUnFQq1dw78JToHcDwIa8CjrwCAGC4HVBDJWBiYoJ5SwGWz+ebh6HNqVbhBoYBeRUi5BUAAMMlooa5S5ZlOblcznR9BG2oVCrO5ORkc+/AAdNvKKCHyKuQIq8AABgOMTWsuEgvQDjl8/nmuU4nxRA0DB7yagCQVwAADK4xNVxJzmQypusd6EKlUmneIuCCGIKGwUFeDRDyCgCAwVNfddGyLCefz5uub8An6XS6sdK2LCptCD/yakCRVwAADIYTWv2HnkgkGGI2gLLZbPMQtDHTbzqgQ+TVgCOvAAAIt3plLZlMUlkbYCsrK1TaEHbk1ZAgrwAACJ81Ky+mUinT9Qn0QalUchKJBJU2hA15NYTIKwAAwoXK2pCqVCpU2hA25NWQIq8AAAiH+jAzKmvDiUobQoS8GnLkFQAAwUZlDY7jUGlDKJBXcByHvAIAIKgOiMoaGnhU2tgSAEFBXmEN8goYXjeZLgAAT6OScpKUSCR04cIF0+VBQJTLZY2MjKhQKEhSQdKIpLLpcmGokVfwRF4Bw+kLpgsAYJ2opP+QapW13//+96bLgwCJRqPK5XKyLEuSLElnVFu1EzCBvEJL5BUwnGhgAsFzRpJlWZampqYUifC/GGvFYjGdPn3avZmQ9JzpMmFonRF5hQ2QV8Dw+RfTBQCwxlOrh/7whz/o7rvvNl0eBNRXvvIVfelLX3J7jB6QNCPpuulyYaiQV2gLeQUAgBlxsUgGtqhhEY1l1YYrAv0QF3mFLSKvgOHAIj9AMEQkXZVk27atq1evMtQMbWlaRGNa0rjpMmHgkVfoCHkFDAfmYALBcESSLUlnz56lsoa2RaNRvfbaa+7NpNhvDr1HXqEj5BUwHGhgAuZFJaUlaXJyUvF43HR5EDIHDhxQMpl0b54WqzSid8grdIW8AgYfQ2QB86YkJS3L0vXr1+kNQEeKxaK2b9/u3nxa0r+bLhMGEnmFrpFXwGCjBxMwK67aMCGdPn2ayho6FovFlE6n3ZuTYgEN+C8u8go+IK+AwUYPJmDWlKSkbduam5szXRaEXLVa1c6dO90FNJ6X9ILpMmGgkFfwDXkFDK5h68GMiLH+CI64VnsDfvnLX5ouCwZAJBLRyy+/7N5MiV4B+Ccu8go+Iq8wRIau/TGoPZgRSXslPSjpbtU29bWazilIuijpI0nvSrosqWq64Bgq9AbAd/QKoEfIK/iOvMKAof0xoMYkndTq5s8dHCfFktnoj6hW33fZbNb03tcYMOl0ujHXhuqqKXqCvELPkFcYALQ/mgxKD2Zc0quSEj493oykxyUtmX5hGFgnJKUsy9Ly8rLpsmDANPUKHFWt9wnoFHmFniGvEGJxebQ/EomEHnvsMW3btk179uxZc4eFhQXduHFDr7/+umZmZpofj/ZHQERUC6JOrxhsdkyJq2nojWVJzuTkpOmLxxhQqVTKzTHGM6Jb5BV6irxCyKxrfySTSSebzTqVSqXt932lUnGy2ayTTCYHrv0R5h7MmKSc1o9t9ltBki2paPoFY2CMqvbeValUUjTKugbwX9M+c3eJK6LoDHmFniOvECJr2h+2beuNN97Q6OhoVw86Pz+vY8eOKZfLud8KdfsjrKvIjkmaV+8bl1p9jnkN2NhoGPV9qTaEgsoaeiUWi8m2bffmo6bLg9Air9Bz5BVCYkwNjctMJqO5ubmuG5eSNDo6qrm5OWUyGfdb1upz0f7okzH1bkjsZgd/ZPhhWZKTyWRMj0rCgGtYPIOJc+gUeYW+IK8QcPX2h2VZTj6f79lnIZ/PO5Zlhbr9EbYhsjHVehPvMPT8n6g2XCiU3dUIBIaboW+ahp1tF9mFrSGv0DfkFQKsPiw2kUjozJkzW8rDarW2C0kk0v60ynK5rIcffthdCCh0w2XDNEQ2otof11TjUqvPnVPIJ97CqPul2ph9KmvotaZhZw+ZLg9Ch7xC35BXCCi3/WFZlrVp47JcLmt+fl5TU1MaHx/Xvffeq5tvvlk333yz7r33Xj3zzDOamprS0tLShk8ajUZ15swZWZYlfT5clvZHD/RytdhOVpcFOjElVmNEHzWszkhuYavIK/QVeYUAqrc/NhsWm8lkmoe2bngkEglnZWVlw8fM5/O0P3ooLvONyuYjbvqXglBis3L0VTabbcwtYCvIK/QVeYWAiWv1/bjRPPRSqeS11UjbRzqd3vBzkclkQtf+CMsczAtq2sQ0AGbEEA5sTVxSXgr3fKalpSVdunTJ82e7du3S3r17N5xn4N5/cXFRkjQyMqJ9+/YpHo+vO3d2dlZ/+ctfdOTIEc/HLJfLOnv2rHbt2qWxsbH6+ZvZyvnuuWFVLpd16623ujdZ/h/tiqtHeVUul/XnP/9Z7777rm677Tbdf//92r1794bP0UlujI6Oeq7u2MvcaPWcrmq1qg8//FDz8/O6fPmyvvrVr2r37t365je/qVgs1vK1jI+Pb1i2rZ7Xzuvc7PzNXmsnyCsEzAVJCdu2NTfnvUXr7OysHnnkEX3yySddPdFmczvvvfdedwsT2h8+MblqLKvKwk9jWl19LMwaVvrzPCzLclKp1Lr7raysOIlEouX9ksmkUyqV1tzHvSLYijt0JJlMrjl/s2Mr57vnhpnILGxdT/KqYQhkW5+1bnJDkufws17nhm3bnr0d+XzesW275f0mJibWbdK+WQZ2el47r7Ob19oNkVcIhnr7I5fLeb5XS6WSc8cdd/jWrtiovpHL5fhs+OykzDckWx0nTf9yECrjGoAGi9vAbJ6LUCqV1sw/aKzYlUql+vcty3ImJyedUqnkrKysOKlUas3PGitYW21grqysOPl8vn64ldlUKrXm+27Z3MfPZDJrfu51bpg1VBLHO3zvYvj4nlfu59G9CFUqlZxSqeRks9l6I7Lx4lS3udGq/H7lhlcGTk5O1p+7sUyN86hs23bS6bRTKpXWPJ9Um5Pl9dlt9zPe7nmt8q4581o97srKSv21Nv/+u0VeISBOapMM7GZYbKtjo+GyDc9H+6NLEZlvRG52sKLTcBlT53/zgVgwo1UD0+XOFWisKE5MTNSv0HupVCr1Cmbj72erDcxWZW0V2K0qioOGhTOGVmDyyv0sJpNJz8aI25i0bbveI9ltbrj3b+5h63VuuJ+3xuf1akA3vxa3d7Pxfr1qYLZrs/Pd1+rnPF3yCj7pJv/q7Y9W7+2meZG+Hq2ypWmOcqDbH0HfpmSv6QIMSBnhn6ykimpXjzoKr9tuu830a+ipnTt3SpI+/fTT+vdOnTolSTpy5IjnfSKRiJ599llJ0s9+9jPTL2HgjIyMmC4CzAhMXp07d06SdOzYMc/51NFoVNevX9fc3Fx9DlK3ufHiiy/KsiwdP368vg9dP3zjG9+QJF27dk1SbX/H1b3s9OSTT7Z8LY888ogk6Y033uhbWbvlvj8+++wz3x6TvIJPusm/et1+79711fxyuazjx4/3rOCHDx/2LtTasgS6/RH0BuaDpgvQhmdNFwBGTGjr4fW922+/faD/eVarVf385z+X9HmlsFj8fF9gr6B23X///ZKkQqHQ93IvLCxoaWnJ8+hnxbRXdu3apdtvv12SvmO6LDDCeF5NT09L+vxz7qWx4elHbkSjUb322msqFAr60Y9+5Ofvs6Vyuayf/OQntV/g975X/55U20/UayEf13e+U/t4Xrx4seflbJV3W8m8crmsV199VdLGf9etIq/gs07y73/fcssteuKJJzwviF27dq2ndZVcLue5T2YkElEiUV/zNNBtpEB3r0q623QB2vAN0wWAcROrhySdkvSmpMuSmv9Lf+HTTz/V9u3bTZfXF7/97W81MjKiv/3tb/VVZd1KpG3b9UqhW7lKJpMbri4bjUZl23Y9WL1Wh+yVgwcPtvxZPp/va1l64c4773R7lP+b6bLAuL7nldtYTCQSba9G61duHDhwQIlEQqdOndKzzz6reDzu2+fZzcDFxUV99NFHkj7PwEQiUW9Muvno9lC24q7I2o+LbHfddVfLn3ll3tRUbbSq12udmJjwdZVh8go91G7+7f7HP/6h++67z/NB5ufne17QhYUFz6x67LHH3BERgW4jBb2B+YDpArRhp+kCIFDaDa/Qe/755z2/n81mPbf1+OCDDzZ9zJWVFUna8Cp/L6RSqZY9Nf0uC9BHfcmrW265RZLqw0S3wo/cmJqa0vbt23X48GFdvXp1wwbrVnhloGVZOn369JoM3LVrl6S10wa8uI3qfkin0y1/5vV7PHr06Lrv2bats2fPhv4CHIbWRvm3U5K2bdvmeUd3yH8vXblyRQcOHFj3/YYyBbqNFPQGpmW6AG0I+jBjmNMcXgOl+Sr3+Pi4pqen183F2bFjh6TakI9isdiyEri0tFS/ct98NXx+ft5zv7WFhQVJ3TcCH330USpJGHY9y6vGz3Orz3IzP3LDFYvFNDk5qaefflpvvvnmpntFtqsxA6vVqr7+9a8rl8vpzjvvXHOee/vUqVN6+eWXWzZw//jHP0pS4xC4ntnq78BxnPrX1WpVO3fudPfkAwZBc/59QZL27NnjeXI7F7669dZbb+nEiRPrvt9QpkC3kYLcOAp647eR6ZVsOfp3dGqii/uGwsmTtVWzjx8/vuZKfCQSkWXVcvD9999veX/3imBj5erYsWOSpLffftvzPr/4xS8kbTxHC+uY/gxxDGFeTUzUHrLVZ1mq9TSOj4+rWCx2lRtennjiCdm2raNHj66Z3+mXSCRSX5zn8OHDa+Yxuo1lSfrwww9bPsY777wjqXWlNigikYhOnz4tSXr88cd7/XSmP0Mc4T06tWH+VavVvlxcyeVy7cyHDmxbKcgNTAAhEovFlE6nVSgU1lU63MrI8ePHNTs7uy40i8VifRVId9EISfrWt74lqXYlr7lSuLS0VB9yt2/fPtMvH8AG3NVef/WrX+n8+fPrMmB+fl5Hjx7VxYsX60NqO80NL40NwGeeeaYnr3F0dFQTExPK5XL69a9/vea53SGpP/zhDzU7O7vuvvPz8/VVc1988cWelM9PY2NjSiaTmpmZqc/PBABXYFu+CtectZtMFwB908lVsZyktySlTBe+144cOaKXXnpJ09PT+sEPflCfh+RWRqanp7V//35ZlqWf/vSnuu2227S4uFify5RKpdYMVY1EIkqlUnr++ee1fft2JZNJHTp0SC+99FL9CuLExETXw1vdxTpaOXz4sK+LWBhGXg2PwORVPB6vf5YPHjwoy7L05JNPamRkRK+//nr9YlEul6t/1jrNjVbcBqDbkOuFF198UW+++aaefvppHTp0qF4uNxtnZmY0MzMj27b14x//WJJ0+fLlepkymYxn1rRqxDVnU7fntTrfy6uvvqqLFy/q6NGjeuihh3o1X528Qqd6kn+RSKS+sFgvJRKJduaLh6mtFCjLMt/FvtnxT9O/JPRVO++JZX2+FHa0+b6tNtANC3cT8lavw93E3LKsdRuqZzIZx7Ksdb8zy7KcXC7n+XilUsnJZDL1jcobj3Q67blpe3NZN9swfbMj7H8z92+i7oYNIXwCl1fZbHZdBliW5aRSqZYZsNXccD/XXkqlUv2xksmk5znt5kar3427Abtt22vyqVKpOJOTk55/B9u2PR9vs4xy7+PXea3Ob8X9XSUSCd/eI+QVfNJN/v1TkpPJZDzfoxMTEz1vX6RSqQ3zZbXsgRX0K0NTkpKmC7GJv0iKmy4E+qbVP7xpSW9Iel9ScaP7hn3bi3K5rGKxqB07drS8ulYsFlUul1ueU61W9de//lWSNnycVs8tqa3foXt+LBbzvBrvlnMzWyljEC0tLTVuSxD03Id/AptXbgZEo9G2e77azQ33c92q3O7PWz13u7mxURncPexandNulm2WUe7j+3Veq/M3KqP7Wv16n5BX8Ek3+bckaVc6nfZcEGtqaspzZWU/tVqRv+G5pyX5s2LZEDoh8z2Umx3/afqXhL5y/+4XJD2lrV1c+Kck509/+pNvV3qBdmQyGeeLX/wiIy6GD3mF0CGv4JNu8u8/JTnf//73Pd+jTb3sPTlKpZLnczeM5jrR5msxIuiL/LxrugBt+DfTBUBf2ZJulvSQpH9X7SpXu34nSR9//LHp14Ahc+PGDf3973+XVt+DGBrkFUKHvIJPusm/f5Ok3/zmN54rucbj8Z5uJ5RKpTxHT1Sr1cb9hAPdRgp6A/Oy6QIMSBnhn3l1Oal6cXHR9GvAkGl4z/m/PwOCjLxC6JBX8Ek3+Vev21++7F3N79XqybZt67nnnvMu1NqyBLr9EfQGZlXB3qD+lFjBCe07J0kfffSR6XJgyLz33nvul4H+h4RAIa9gBHmFAKi3P1555RXPE9yt2fx29uzZlnO7G8oS+PZHGCZPj0nKmi5EC/slzXb9KBgW9fey47A4HvrnppvqUW+rdlUX2Ax5BSPIKwREPQNzuZxGR0c9T3rooYcah612pdWiQlJtr1zbtt2bgW9/BL0HU6r9Av35y/lrRgH/4yJw/sv9wl09EOi1pvdawXR5EBrkFfqOvEKA1Nsfx44da3nSmTNnlEx2v+HFRo3LpjKEov0RhgamJD1uugAhKROCrajVf5jvv/++6bJgSDS81wpiThPaR16h78grBMzjUq0H8/z5854nRKNRTU1NdTxc1rZt5fP5DRuX58+fVy6XW1OmoAtLA3NJtf1egmJaW1uNCnBdlKQrV66YLgeGxDvvvON++abpsiB0yCv0FXmFgFnSavvj4MGD9T1fvYyPjyufzzcOY91UKpXS1atXN91n9uDBg+7N0LQ/wjAH0xWRdF2SZbgcBUk7FfDJtQisA5IylmVpeXnZdFkwBL785S+rUChI0kFJ57t8OAwX8gp9RV4hgOrtD8uytLi46LmFSKOlpSUtLCzoypUreuutt+q9j4lEQvfdd58efPBBfe1rX9v0ccrlskZGRtzPRKjaH2FqYEpSTLUJ33cYev5PJI2KYRvoXEzSiiStrKwoFouZLg8GWNOiALdKKpsuE0KFvELfkFcIsJiknCQrkUjozJkzmzYOG7l7abZaHdZLuVzWww8/7C4gVFBt0avQtD/CMkTWVZT0iMHnf0Qh+uMikIqqhZR+9zv2kEZvvf322+6XM6Kyhq0jr9A35BUCrCjpu5I0MzOjkZGRDYfLNotEIltqXC4tLWlkZKRxddrvivZHX4yp1pp3+nQUVp8T8MNTkhzbth2gVyqVimNZlpth412+ZzG8yCv0HHmFkBiTtKzV9kEmk/H9s5DJZBrbH8ui/dF3MTX8kXt4LK8+F+CXmFbfX7lczvT/dQyobDbbmGPtj+UB1iKv0HPkFUJkTfvDtm1fsjGXyzm2bQ9M+yNsQ2QbFVWb7NrL1WWnV5+Dbmn4qajVvZUahgQBvnrllVfcL6fFcDN0jrxCz5FXCJE17Y9cLifbtjU+Pq7Z2dn6fMt2VKtVzc7Oanx8XLZtN25FEvr2R9gW+WklLulVSQmfHm9GtX1mlky/MAysA5IyklQqlbY0WRzYzNLSku666y735n6FYFNmBBp5hZ4hrxBicXm0PxKJhB577DFt27ZNe/bsWXOHhYUF3bhxQ6+//nrjHEsX7Y+AGpN0Up0Phz0pxjqjPyJaHWIxOTlpenQSBkwqlXIzbc70Gx0DgbxCz5BXGAC0P5oMSg9ms4ikvZIelHS3pAe0fv/MgmqbSH8k6V1JlxWSvWUwMJ6SNGlZlq5fv76lFcaAVsrlsm699Vb3JnvJwS/kFXxHXmHA0P4YUpHVAwiCqFavXqXTadMXkTEgJiYmGhcIIO/gF/IKviOvMCSGrv0xqD2YQFiMS0pLzG1C95rmMtEbAL+RV/ANeQUMrjCvIgsMgjdVGy6h5557znRZEHKPP/64+2VOVNbgP/IKviGvgMFFDyZgXr1XIJ/PKx6Pmy4PQuj8+fM6ePCge9OWNG+6TBhI5BW6Rl4Bg40GJhAMc5LsRCKhCxcumC4LQqZarWrnzp0qFApSbf+scdNlwkAjr9Ax8goYfAyRBYLhsCTNzMxoamrKdFkQMo8++qhbWSuotocW0EvkFTpGXgGDjx5MIDhOSEpJ0srKimKxmOnyIASahpqxUAb6hbzClpFXwHCggQkER0TSVUm2bdu6evUqe81hQ8ViUbZtM9QMJpBX2BLyChge/2K6AADq/p+kP0j6X5988ok+++wzffvb3zZdJgRUtVrV/v379fHHH0u1oWYPSaqYLheGBnmFtpFXAACYNa7VDc0zmYzpfbARUA0blDuSRk2/aTG0yCtsirwCAMC8Ka3+M85ms6brBgiYVCrVWFljmBlMI6/QEnkFDB/mYALBFJH0e0kJy7KUy+VYRAOSpNnZWe3fv9+9+bykF0yXCUOPvIIn8goYTjQwgeCKScpJsqi0QVpXWZuR9G1JVdPlAkReoQl5BQwvGphAsK2ptC0uLioajZouEwygsoYQIK8gibwCht0XTBcAwIaKkr4rSYVCQQ8//LDK5bLpMqHPmiprBVFZQzCRVyCvANCDCYTEmKSsJDH8bLh4VNZs1SryQFCRV0OKvAIg0YMJhMWspP1SrWfAtm0Vi/zPHnRNlbWcqKwhHMirIUReAXDRwATCY12lbX5+3nSZ0CMvvPBC8xymr4vKGsKDvBoi5BUAAOEWk7Qs9p0bSJVKpXlT8guqbQMBhBF5NcDIKwAABkdM0pxW/6mnUimnUqmYrmugSysrK04ikWisrJ0QlTWEH3k1gMgrAAAGT0S1q8WOJCeRSDilUsl0nQMdymazjmVZjZW1cdNvMMBH5NUAIa8AABhsJ7T6T96yLIaghUylUnFSqVRjRW1Z0qjpNxXQI+RViJFXAAAMjzE1zHOamJhgCFoI5PN5x7bt5vlL7EyPQUdehRB5BQDA8ImqYQiaZVlOLpczXSeBh0ql4kxOTjZW1BhihmFDXoUEeQUAAMbVUBGYmJhgrlOA5HK55l6AOUlx028awBDyKsDIKwAA4IqpqXcgnU6brqsMtVKp5CSTyeZegKfEqosAeRUw5BUAAGhlXA1znWzbZlGNPiuVSs2LYjiSplSrVAP4HHllGHkFAADaEVHDyo1arbjl83nTdZmBVqlUnHQ63byU/7JqC5wA8EZeGUBeAQCATsRVuxJdr0AkEgl6CHy2QUVtXAwvA9oVF3nVc+QVAADwQ1xNFTd3KBpbBXSuxdAyR7XeGCpqQGfiIq98R14BAIBeiKup4mZZljM5OckqjluQy+W8FsNYVq2ixh5xgD/iIq+6Rl4BAIB+iEs6qaYr2clkkuFoLZRKJWdycrJ5+X6GlgG9Fxd5tSXkFQAAMCWq2jL09VUctdpLkEqlhn4T9FKp5GQyGSeRSHgNK7sgFsMA+om8Iq8AAECIjKlpOJoaKm/DMv9pZWVlo0rasmoVXJbvB8wir8grAAAQElFJB9SwCbqahqWl0+mB2UKgVCo52WzWSaVSXsPJGucqjZr+wwBYh7wirwAEwE2mCwAgNKKS7pd0TFLS64RkMqlDhw5pdHRUu3fvVjQa7DUjisWi3n//fV25ckXvvfeeZmZmvE4rSPqVpHclXZZUNV1uAJsir8grAIbQwATQiYikvZIelPSIJNvrJMuy9MADD2jfvn3avXu39uzZo1gs1veKXLFYVLlc1qVLl7S4uLhR5cw1Lemcaj0hxb4WFoDfyCsA6CMamAD8EJX0NUn/KumwpMRmd7BtW/fcc49isZj27t1b//6+ffs6KsClS5fqX587d06SdPHiRRUKhc3uWpB0UbUK2vzqAWBwkVcA0EM0MAH0SlzSnapV4vZJekCSZbhMOUn/R7WhY/OqVda44g8gLvIKAHxBAxNAv8VU60FwL/2PSLp79et71GL4Whtm9Hnl65Kkv0m6IWlh9ftl0y8cQOiQVwAAAAMqIjYEBxAO5BUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwqf8PNaKebFevR6UAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTMtMTEtMjRUMTQ6NDM6MzUrMDA6MDArZv70AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDEzLTExLTI0VDE0OjQzOjM1KzAwOjAwWjtGSAAAAABJRU5ErkJggg=="},8453:(e,n,r)=>{r.d(n,{R:()=>a,x:()=>l});var s=r(6540);const o={},t=s.createContext(o);function a(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(o):e.components||o:a(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8bdb87c0.3ab5ea81.js b/assets/js/8bdb87c0.3ab5ea81.js new file mode 100644 index 00000000..c3f5652c --- /dev/null +++ b/assets/js/8bdb87c0.3ab5ea81.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5317],{8773:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>d,frontMatter:()=>s,metadata:()=>c,toc:()=>l});var i=t(4848),o=t(8453);const s={sidebar_position:8},r="Cookbook",c={id:"cookbook",title:"Cookbook",description:"This section will help you further understand how LmcRbacMvc works by providing more concrete examples. If you have",source:"@site/versioned_docs/version-3.4/cookbook.md",sourceDirName:".",slug:"/cookbook",permalink:"/LmcRbacMvc/docs/cookbook",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/versioned_docs/version-3.4/cookbook.md",tags:[],version:"3.4",sidebarPosition:8,frontMatter:{sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"Using the Authorization Service",permalink:"/LmcRbacMvc/docs/using-the-authorization-service"},next:{title:"Support",permalink:"/LmcRbacMvc/docs/support"}},a={},l=[{value:"A Real World Application",id:"a-real-world-application",level:2},{value:"Best practices",id:"best-practices",level:2},{value:"When using guards then?",id:"when-using-guards-then",level:3},{value:"A Real World Application Part 2 - Only delete your own Posts",id:"a-real-world-application-part-2---only-delete-your-own-posts",level:2},{value:"A Real World Application Part 3 - Admins can delete everything",id:"a-real-world-application-part-3---admins-can-delete-everything",level:2},{value:"A Real World Application Part 4 - Checking permissions in the view",id:"a-real-world-application-part-4---checking-permissions-in-the-view",level:2},{value:"Using LmcRbacMvc with Doctrine ORM",id:"using-lmcrbacmvc-with-doctrine-orm",level:2},{value:"How to deal with roles with lot of permissions?",id:"how-to-deal-with-roles-with-lot-of-permissions",level:2},{value:"Using LmcRbacMvc and ZF2 Assetic",id:"using-lmcrbacmvc-and-zf2-assetic",level:2},{value:"Using LmcRbacMvc and LmcUser",id:"using-lmcrbacmvc-and-lmcuser",level:2}];function h(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",strong:"strong",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"cookbook",children:"Cookbook"})}),"\n",(0,i.jsx)(n.p,{children:"This section will help you further understand how LmcRbacMvc works by providing more concrete examples. If you have\nany other recipe you'd like to add, please open an issue!"}),"\n",(0,i.jsx)(n.h2,{id:"a-real-world-application",children:"A Real World Application"}),"\n",(0,i.jsxs)(n.p,{children:["In this example we are going to create a very little real world application. We will create a controller\n",(0,i.jsx)(n.code,{children:"PostController"})," that interacts with a service called ",(0,i.jsx)(n.code,{children:"PostService"}),". For the sake of simplicity we will only\ncover the ",(0,i.jsx)(n.code,{children:"delete"}),"-methods of both parts."]}),"\n",(0,i.jsxs)(n.p,{children:["Let's start by creating a controller that has the ",(0,i.jsx)(n.code,{children:"PostService"})," as dependency:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"class PostController\n{\n protected $postService;\n\n public function __construct(PostService $postService)\n {\n $this->postService = $postService;\n }\n\n // addAction(), editAction(), etc...\n\n public function deleteAction()\n {\n $id = $this->params()->fromQuery('id');\n\n $this->postService->deletePost($id);\n\n return $this->redirect()->toRoute('posts');\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Since we have a dependency, let's inject it using the ",(0,i.jsx)(n.code,{children:"ControllerManager"}),", we will do this inside our ",(0,i.jsx)(n.code,{children:"Module"})," class"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"class Module\n{\n public function getConfig()\n {\n return [\n 'controllers' => [\n 'factories' => [\n 'PostController' => function ($cpm) {\n // We assume a Service key 'PostService' here that returns the PostService Class\n return new PostController(\n $cpm->getServiceLocator()->get('PostService')\n );\n },\n ],\n ],\n ];\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Now that we have this in place let us quickly define our ",(0,i.jsx)(n.code,{children:"PostService"}),". We will be using a Service that makes use\nof Doctrine, so we require a ",(0,i.jsx)(n.code,{children:"Doctrine\\Persistence\\ObjectManager"})," as dependency."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"use Doctrine\\Persistence\\ObjectManager;\n\nclass PostService\n{\n protected $objectManager;\n\n public function __construct(ObjectManager $objectManager)\n {\n $this->objectManager = $objectManager;\n }\n\n public function deletePost($id)\n {\n $post = $this->objectManager->find('Post', $id);\n $this->objectManager->remove($post);\n $this->objectManager->flush();\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["And for this one, too, let's quickly create the factory, again within our ",(0,i.jsx)(n.code,{children:"Module"})," class."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"class Module\n{\n // getAutoloaderConfig(), getConfig(), etc...\n\n public function getServiceConfig()\n {\n return [\n 'factories' => [\n 'PostService' => function($sm) {\n return new PostService(\n $sm->get('doctrine.entitymanager.orm_default')\n );\n }\n ]\n ];\n }\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"With this set up we can now cover some best practices."}),"\n",(0,i.jsx)(n.h2,{id:"best-practices",children:"Best practices"}),"\n",(0,i.jsx)(n.p,{children:"Ideally, you should not protect your applications using only guards (Route or Controller guards).\nThis leaves your application open for some undesired side-effects.\nAs a best practice you should protect all your services or controllers by injecting the authorization service.\nBut let's go step by step:"}),"\n",(0,i.jsx)(n.p,{children:"Assuming the application example above we can easily use LmcRbacMvc to protect our route using the following guard:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\RouteGuard' => [\n 'post/delete' => ['admin']\n ]\n ]\n ]\n];\n"})}),"\n",(0,i.jsx)(n.p,{children:'Now, any users that do not have the "admin" role will receive a 403 error (unauthorized) when trying to access\nthe "post/delete" route. However, this does not prevent the service (which should contain the actual logic in a properly\ndesign application) to be injected and used elsewhere in your code. For instance:'}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"class PostController\n{\n protected $postService;\n\n public function createAction()\n {\n // this action may have been reached through the \"forward\" method, hence bypassing guards\n $this->postService->deletePost('2');\n }\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"You see the issue!"}),"\n",(0,i.jsxs)(n.p,{children:["The solution is to inject the ",(0,i.jsx)(n.code,{children:"AuthorizationService"})," into your services and check for the\npermissions before doing anything wrong. So let's modify our previously created ",(0,i.jsx)(n.code,{children:"PostService"})," class"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"use Doctrine\\Persistence\\ObjectManager;\nuse LmcRbacMvc\\Service\\AuthorizationService;\n\nclass PostService\n{\n protected $objectManager;\n\n protected $authorizationService;\n\n public function __construct(\n ObjectManager $objectManager,\n AuthorizationService $autorizationService\n ) {\n $this->objectManager = $objectManager;\n $this->authorizationService = $autorizationService;\n }\n\n public function deletePost($id)\n {\n // First check permission\n if (!$this->authorizationService->isGranted('deletePost')) {\n throw new UnauthorizedException('You are not allowed !');\n }\n\n $post = $this->objectManager->find('Post', $id);\n $this->objectManager->remove($post);\n $this->objectManager->flush();\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Since we now have an additional dependency we should inject it through our factory, again within our ",(0,i.jsx)(n.code,{children:"Module"})," class."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"class Module\n{\n // getAutoloaderConfig(), getConfig(), etc...\n\n public function getServiceConfig()\n {\n return [\n 'factories' => [\n 'PostService' => function($sm) {\n return new PostService(\n $sm->get('doctrine.entitymanager.orm_default'),\n $sm->get('LmcRbacMvc\\Service\\AuthorizationService') // This is new!\n );\n }\n ]\n ];\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Alternatively, you can also protect your controllers using the ",(0,i.jsx)(n.code,{children:"isGranted"})," helper (you do not need to inject\nthe AuthorizationService then):"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"class PostController\n{\n protected $postService;\n\n public function createAction()\n {\n if (!$this->isGranted('deletePost')) {\n throw new UnauthorizedException('You are not allowed !');\n }\n\n $this->postService->deletePost('2');\n }\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"While protecting services is the more defensive way (because services are usually the last part of the logic flow),\nit is often complicated to deal with.\nIf your application is architectured correctly, it is often simpler to protect your controllers."}),"\n",(0,i.jsx)(n.h3,{id:"when-using-guards-then",children:"When using guards then?"}),"\n",(0,i.jsx)(n.p,{children:"In fact, you should see guards as a very efficient way to quickly reject access to a hierarchy of routes or a\nwhole controller. For instance, assuming you have the following route config:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"return [\n 'router' => [\n 'routes' => [\n 'admin' => [\n 'type' => 'Literal',\n 'options' => [\n 'route' => '/admin'\n ],\n 'may_terminate' => true,\n 'child_routes' => [\n 'users' => [\n 'type' => 'Literal',\n 'options' => [\n 'route' => '/users'\n ]\n ],\n 'invoices' => [\n 'type' => 'Literal',\n 'options' => [\n 'route' => '/invoices'\n ]\n ]\n ]\n ]\n ]\n ]\n};\n"})}),"\n",(0,i.jsx)(n.p,{children:"You can quickly reject access to all admin routes using the following guard:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\RouteGuard' => [\n 'admin*' => ['admin']\n ]\n ]\n ]\n];\n"})}),"\n",(0,i.jsx)(n.h2,{id:"a-real-world-application-part-2---only-delete-your-own-posts",children:"A Real World Application Part 2 - Only delete your own Posts"}),"\n",(0,i.jsxs)(n.p,{children:["If you jumped straight to this section please notice that we assume you have the knowledge that we presented in the\nprevious example. In here we will cover a very common use case. Users of our Application should only have delete\npermissions to their own content. So let's quickly refresh our ",(0,i.jsx)(n.code,{children:"PostService"})," class:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"use Doctrine\\Persistence\\ObjectManager;\n\nclass PostService\n{\n protected $objectManager;\n\n protected $authorizationService;\n\n public function __construct(\n ObjectManager $objectManager,\n AuthorizationService $autorizationService\n ) {\n $this->objectManager = $objectManager;\n $this->authorizationService = $autorizationService;\n }\n\n public function deletePost($id)\n {\n // First check permission\n if (!$this->authorizationService->isGranted('deletePost')) {\n throw new UnauthorizedException('You are not allowed !');\n }\n\n $post = $this->objectManager->find('Post', $id);\n $this->objectManager->remove($post);\n $this->objectManager->flush();\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["As we can see, we check within our Service if the User of our Application is allowed to delete the post with a check\nagainst the ",(0,i.jsx)(n.code,{children:"deletePost"})," permission. Now how can we achieve that only a user who is the owner of the Post to be able to\ndelete his own post, but other users can't? We do not want to change our Service with more complex logic because this\nis not the task of such service. The Permission-System should handle this. And we can, for this we have the\n",(0,i.jsx)(n.code,{children:"AssertionPluginManager"})," and here is how to do it:"]}),"\n",(0,i.jsx)(n.p,{children:"First of all we need to write an Assertion. The Assertion will return a boolean statement about the current\nidentity being the owner of the post."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"namespace Your\\Namespace;\n\nuse LmcRbacMvc\\Assertion\\AssertionInterface;\nuse LmcRbacMvc\\Service\\AuthorizationService;\n\nclass MustBeAuthorAssertion implements AssertionInterface\n{\n /**\n * Check if this assertion is true\n *\n * @param AuthorizationService $authorization\n * @param mixed $post\n *\n * @return bool\n */\n public function assert(AuthorizationService $authorization, $post = null)\n {\n return $authorization->getIdentity() === $post->getAuthor();\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["This simple ",(0,i.jsx)(n.code,{children:"MustBeAuthorAssertion"})," will check against the current ",(0,i.jsx)(n.code,{children:"$authorization"}),' if it equals the identity of the\ncurrent context Author. The second parameter is called the "context". A context can be anything (an object, a scalar,\nan array...) and only makes sense in the context of the assertion.']}),"\n",(0,i.jsxs)(n.p,{children:["Imagine a user calls ",(0,i.jsx)(n.code,{children:"http://my.dom/post/delete/42"}),", so obviously he wants to delete the Post-Entity with ID#42. In\nthis case Entity#42 is our Context! If you're wondering how the context gets there, bare with me. We will get to\nthis later."]}),"\n",(0,i.jsxs)(n.p,{children:["Now that we have written the Assertion, we want to make sure that this assertion will always be called, whenever we\ncheck for the ",(0,i.jsx)(n.code,{children:"deletePost"})," permission. We don't want others to delete our previous content! For this we have the so\ncalled ",(0,i.jsx)(n.code,{children:"assertion_map"}),". In this map we glue ",(0,i.jsx)(n.code,{children:"assertions"})," and ",(0,i.jsx)(n.code,{children:"permissions"})," together."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"// config/autoload/lmc_rbac.global.php or wherever your LmcRbac configuration file is\nreturn [\n 'lmc_rbac' => [\n 'assertion_map' => [\n 'deletePost' => 'Your\\Namespace\\MustBeAuthorAssertion'\n ]\n ]\n];\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Now, whenever some test the ",(0,i.jsx)(n.code,{children:"deletePost"})," permission, it will automatically call the ",(0,i.jsx)(n.code,{children:"MustBeAuthorAssertion"})," from\nthe ",(0,i.jsx)(n.code,{children:"AssertionPluginManager"}),". This plugin manager is configured to automatically add unknown classes to an invokable.\nHowever, some assertions may need dependencies. You can manually configure the assertion plugin manager as\nshown below:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"// config/autoload/lmc_rbac.global.php or wherever your LmcRbac configuration file is\nreturn [\n 'lmc_rbac' => [\n // ... other rbac stuff\n 'assertion_manager' => [\n 'factories' => [\n 'AssertionWithDependency' => 'Your\\Namespace\\AssertionWithDependencyFactory'\n ]\n ]\n ]\n];\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Now we need to remember about the ",(0,i.jsx)(n.strong,{children:"context"}),". Somehow we need to let the ",(0,i.jsx)(n.code,{children:"AssertionPluginManager"})," know about our\ncontext. This is done by simply passing it to the ",(0,i.jsx)(n.code,{children:"isGranted()"})," method. For this we need to modify our Service\none last time."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"use Doctrine\\Persistence\\ObjectManager;\n\nclass PostService\n{\n protected $objectManager;\n\n protected $authorizationService;\n\n public function __construct(\n ObjectManager $objectManager,\n AuthorizationService $autorizationService\n ) {\n $this->objectManager = $objectManager;\n $this->authorizationService = $autorizationService;\n }\n\n public function deletePost($id)\n {\n // Note, we now need to query for the post of interest first!\n $post = $this->objectManager->find('Post', $id);\n\n // Check the permission now with a given context\n if (!$this->authorizationService->isGranted('deletePost', $post)) {\n throw new UnauthorizedException('You are not allowed !');\n }\n\n $this->objectManager->remove($post);\n $this->objectManager->flush();\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["And there you have it. The context is injected into the ",(0,i.jsx)(n.code,{children:"isGranted()"})," method and now the ",(0,i.jsx)(n.code,{children:"AssertionPluginManager"})," knows\nabout it and can do its thing. Note that in reality, after you have queried for the ",(0,i.jsx)(n.code,{children:"$post"})," you would check if ",(0,i.jsx)(n.code,{children:"$post"}),"\nis actually a real post. Because if it is an empty return value then you should throw an exception earlier without\nneeding to check against the permission."]}),"\n",(0,i.jsx)(n.h2,{id:"a-real-world-application-part-3---admins-can-delete-everything",children:"A Real World Application Part 3 - Admins can delete everything"}),"\n",(0,i.jsx)(n.p,{children:"Often, you want users with a specific role to be able to have full access to everything. For instance, admins could\ndelete all the posts, even if they don't own it."}),"\n",(0,i.jsxs)(n.p,{children:["However, with the previous assertion, even if the admin has the permission ",(0,i.jsx)(n.code,{children:"deletePost"}),", it won't work because\nthe assertion will evaluate to false."]}),"\n",(0,i.jsxs)(n.p,{children:["Actually, the answer is quite simple: deleting my own posts and deleting others' posts should be treated like\ntwo different permissions (it makes sense if you think about it). Therefore, admins will have the permission\n",(0,i.jsx)(n.code,{children:"deleteOthersPost"})," (as well as the permission ",(0,i.jsx)(n.code,{children:"deletePost"}),", because admin could write posts, too)."]}),"\n",(0,i.jsx)(n.p,{children:"The assertion must therefore be modified like this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"namespace Your\\Namespace;\n\nuse LmcRbacMvc\\Assertion\\AssertionInterface;\nuse LmcRbacMvc\\Service\\AuthorizationService;\n\nclass MustBeAuthorAssertion implements AssertionInterface\n{\n /**\n * Check if this assertion is true\n *\n * @param AuthorizationService $authorization\n * @param mixed $context\n *\n * @return bool\n */\n public function assert(AuthorizationService $authorization, $context = null)\n {\n if ($authorization->getIdentity() === $context->getAuthor()) {\n return true;\n }\n\n return $authorization->isGranted('deleteOthersPost');\n }\n}\n"})}),"\n",(0,i.jsx)(n.h2,{id:"a-real-world-application-part-4---checking-permissions-in-the-view",children:"A Real World Application Part 4 - Checking permissions in the view"}),"\n",(0,i.jsxs)(n.p,{children:["If some part of the view needs to be protected, you can use the shipped ",(0,i.jsx)(n.code,{children:"isGranted"})," view helper."]}),"\n",(0,i.jsxs)(n.p,{children:["For example, lets's say that only users with the permissions ",(0,i.jsx)(n.code,{children:"post.manage"})," will have a menu item to acces\nthe adminsitration panel :"]}),"\n",(0,i.jsx)(n.p,{children:"In your template post-index.phtml"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:'<ul class="nav">\n <li><a href="/">Home</a></li>\n <li><a href="/posts/list">View posts</a></li>\n <?php if ($this->isGranted(\'post.manage\'): ?>\n <li><a href="/posts/admin">Manage posts</a></li>\n <?php endif ?>\n</ul>\n'})}),"\n",(0,i.jsxs)(n.p,{children:["You can even protect your menu item regarding a role, by using the ",(0,i.jsx)(n.code,{children:"hasRole"})," view helper :"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:'<ul class="nav">\n <li><a href="/">Home</a></li>\n <li><a href="/posts/list">View posts</a></li>\n <?php if ($this->hasRole(\'admin\'): ?>\n <li><a href="/posts/admin">Manage posts</a></li>\n <?php endif ?>\n</ul>\n'})}),"\n",(0,i.jsxs)(n.p,{children:["In this last example, the menu item will be hidden for users who don't have the ",(0,i.jsx)(n.code,{children:"admin"})," role."]}),"\n",(0,i.jsx)(n.h2,{id:"using-lmcrbacmvc-with-doctrine-orm",children:"Using LmcRbacMvc with Doctrine ORM"}),"\n",(0,i.jsxs)(n.p,{children:["First your User entity class must implement ",(0,i.jsx)(n.code,{children:"LmcRbacMvc\\Identity\\IdentityInterface"})," :"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:'use LmccUser\\Entity\\User as LmcUserEntity;\nuse LmcRbacMvc\\Identity\\IdentityInterface;\nuse Doctrine\\ORM\\Mapping as ORM;\nuse Doctrine\\Common\\Collections\\ArrayCollection;\nuse Doctrine\\Common\\Collections\\Collection;\n\n/**\n * @ORM\\Entity\n * @ORM\\Table(name="user")\n */\nclass User extends LmcUserEntity implements IdentityInterface\n{\n /**\n * @var Collection\n * @ORM\\ManyToMany(targetEntity="HierarchicalRole")\n */\n private $roles;\n\n public function __construct()\n {\n $this->roles = new ArrayCollection();\n }\n\n /**\n * {@inheritDoc}\n */\n public function getRoles()\n {\n return $this->roles->toArray();\n }\n\n /**\n * Set the list of roles\n * @param Collection $roles\n */\n public function setRoles(Collection $roles)\n {\n $this->roles->clear();\n foreach ($roles as $role) {\n $this->roles[] = $role;\n }\n }\n\n /**\n * Add one role to roles list\n * @param \\Rbac\\Role\\RoleInterface $role\n */\n public function addRole(RoleInterface $role)\n {\n $this->roles[] = $role;\n }\n}\n'})}),"\n",(0,i.jsxs)(n.p,{children:["For this example we will use a more complex situation by using ",(0,i.jsx)(n.code,{children:"Rbac\\Role\\HierarchicalRoleInterface"})," so the second step is to create HierarchicalRole entity class"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:'class HierarchicalRole implements HierarchicalRoleInterface\n{\n /**\n * @var HierarchicalRoleInterface[]|\\Doctrine\\Common\\Collections\\Collection\n *\n * @ORM\\ManyToMany(targetEntity="HierarchicalRole")\n */\n protected $children;\n\n /**\n * @var PermissionInterface[]|\\Doctrine\\Common\\Collections\\Collection\n *\n * @ORM\\ManyToMany(targetEntity="Permission", indexBy="name", fetch="EAGER", cascade={"persist"})\n */\n protected $permissions;\n\n /**\n * Init the Doctrine collection\n */\n public function __construct()\n {\n $this->children = new ArrayCollection();\n $this->permissions = new ArrayCollection();\n }\n\n /**\n * {@inheritDoc}\n */\n public function addChild(HierarchicalRoleInterface $child)\n {\n $this->children[] = $child;\n }\n\n /*\n * Set the list of permission\n * @param Collection $permissions\n */\n public function setPermissions(Collection $permissions)\n {\n $this->permissions->clear();\n foreach ($permissions as $permission) {\n $this->permissions[] = $permission;\n }\n }\n\n /**\n * {@inheritDoc}\n */\n public function addPermission($permission)\n {\n if (is_string($permission)) {\n $permission = new Permission($permission);\n }\n\n $this->permissions[(string) $permission] = $permission;\n }\n\n /**\n * {@inheritDoc}\n */\n public function hasPermission($permission)\n {\n // This can be a performance problem if your role has a lot of permissions. Please refer\n // to the cookbook to an elegant way to solve this issue\n\n return isset($this->permissions[(string) $permission]);\n }\n\n /**\n * {@inheritDoc}\n */\n public function getChildren()\n {\n return $this->children->toArray();\n }\n\n /**\n * {@inheritDoc}\n */\n public function hasChildren()\n {\n return !$this->children->isEmpty();\n }\n}\n'})}),"\n",(0,i.jsx)(n.p,{children:"And the last step is to create a Permission entity class which is a very simple entity class. You don't have to do specific things!"}),"\n",(0,i.jsxs)(n.p,{children:["You can find all entity examples in this folder : ",(0,i.jsx)(n.a,{href:"https://github.com/LM-Commons/LmcRbacMvc/tree/master/data",children:"Example"})]}),"\n",(0,i.jsxs)(n.p,{children:["You need one more configuration step. Indeed, how can the RoleProvider retrieve your role and permissions? For this you need to configure ",(0,i.jsx)(n.code,{children:"LmcRbacMvc\\Role\\ObjectRepositoryRoleProvider"})," in your ",(0,i.jsx)(n.code,{children:"lmc_rbac.global.php"})," file :"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:" /**\n * Configuration for role provider\n */\n 'role_provider' => [\n 'LmcRbacMvc\\Role\\ObjectRepositoryRoleProvider' => [\n 'object_manager' => 'doctrine.entitymanager.orm_default', // alias for doctrine ObjectManager\n 'class_name' => 'User\\Entity\\HierarchicalRole', // FQCN for your role entity class\n 'role_name_property' => 'name', // Name to show\n ],\n ],\n"})}),"\n",(0,i.jsx)(n.p,{children:"Using DoctrineORM with LmcRbacMvc is very simple. You need to be aware of performance where there is a lot of permissions for roles."}),"\n",(0,i.jsx)(n.h2,{id:"how-to-deal-with-roles-with-lot-of-permissions",children:"How to deal with roles with lot of permissions?"}),"\n",(0,i.jsxs)(n.p,{children:["In very complex applications, your roles may have dozens of permissions. In the [/data/FlatRole.php.dist] entity\nwe provide, we configure the permissions association so that whenever a role is loaded, all of its permissions are also\nloaded in one query (notice the ",(0,i.jsx)(n.code,{children:'fetch="EAGER"'}),"):"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:'/**\n * @ORM\\ManyToMany(targetEntity="Permission", indexBy="name", fetch="EAGER")\n */\nprotected $permissions;\n'})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"hasPermission"})," method is therefore really simple:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"public function hasPermission($permission)\n{\n return isset($this->permissions[(string) $permission]);\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"However, with a lot of permissions, this method will quickly kill your database. What you can do is modfiy the Doctrine\nmapping so that the collection is not actually loaded:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:'/**\n * @ORM\\ManyToMany(targetEntity="Permission", indexBy="name", fetch="LAZY")\n */\nprotected $permissions;\n'})}),"\n",(0,i.jsxs)(n.p,{children:["Then, modify the ",(0,i.jsx)(n.code,{children:"hasPermission"})," method to use the Criteria API. The Criteria API is a Doctrine 2.2+ API that allows\nyour application to efficiently filter a collection without loading the whole collection:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"use Doctrine\\Common\\Collections\\Criteria;\n\npublic function hasPermission($permission)\n{\n $criteria = Criteria::create()->where(Criteria::expr()->eq('name', (string) $permission));\n $result = $this->permissions->matching($criteria);\n\n return count($result) > 0;\n}\n"})}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"NOTE: This is only supported starting from Doctrine ORM 2.5!"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"using-lmcrbacmvc-and-zf2-assetic",children:"Using LmcRbacMvc and ZF2 Assetic"}),"\n",(0,i.jsxs)(n.p,{children:["To use ",(0,i.jsx)(n.a,{href:"https://github.com/widmogrod/zf2-assetic-module",children:"Assetic"})," with LmcRbacMvc guards, you should modify your\n",(0,i.jsx)(n.code,{children:"module.config.php"})," using the following configuration:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"return [\n 'assetic_configuration' => [\n 'acceptableErrors' => [\n \\LmcRbacMvc\\Guard\\GuardInterface::GUARD_UNAUTHORIZED\n ]\n ]\n];\n"})}),"\n",(0,i.jsx)(n.h2,{id:"using-lmcrbacmvc-and-lmcuser",children:"Using LmcRbacMvc and LmcUser"}),"\n",(0,i.jsx)(n.p,{children:"To use the authentication service from LmcUser, just add the following alias in your application.config.php:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"return [\n 'service_manager' => [\n 'aliases' => [\n 'Laminas\\Authentication\\AuthenticationService' => 'lmcuser_auth_service'\n ]\n ]\n];\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Finally add the LmcUser routes to your ",(0,i.jsx)(n.code,{children:"guards"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbac\\Guard\\RouteGuard' => [\n 'lmcuser/login' => ['guest'],\n 'lmcuser/register' => ['guest'], // required if registration is enabled\n 'lmcuser*' => ['user'] // includes logout, changepassword and changeemail\n ]\n ]\n ]\n];\n"})})]})}function d(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>c});var i=t(6540);const o={},s=i.createContext(o);function r(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/979f5aec.e2088a00.js b/assets/js/979f5aec.e2088a00.js new file mode 100644 index 00000000..56ce90d3 --- /dev/null +++ b/assets/js/979f5aec.e2088a00.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4072],{3337:(s,e,t)=>{t.r(e),t.d(e,{assets:()=>a,contentTitle:()=>c,default:()=>m,frontMatter:()=>i,metadata:()=>r,toc:()=>d});var o=t(4848),n=t(8453);const i={sidebar_position:20,title:"Support"},c=void 0,r={id:"support",title:"Support",description:"- File issues at https://github.com/LM-Commons/LmcRbacMvc/issues.",source:"@site/versioned_docs/version-3.4/support.md",sourceDirName:".",slug:"/support",permalink:"/LmcRbacMvc/docs/support",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/versioned_docs/version-3.4/support.md",tags:[],version:"3.4",sidebarPosition:20,frontMatter:{sidebar_position:20,title:"Support"},sidebar:"tutorialSidebar",previous:{title:"Cookbook",permalink:"/LmcRbacMvc/docs/cookbook"}},a={},d=[{value:"Notices and Disclaimers",id:"notices-and-disclaimers",level:5}];function l(s){const e={a:"a",h5:"h5",li:"li",p:"p",ul:"ul",...(0,n.R)(),...s.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(e.ul,{children:["\n",(0,o.jsxs)(e.li,{children:["File issues at ",(0,o.jsx)(e.a,{href:"https://github.com/LM-Commons/LmcRbacMvc/issues",children:"https://github.com/LM-Commons/LmcRbacMvc/issues"}),"."]}),"\n",(0,o.jsxs)(e.li,{children:["Ask questions in the ",(0,o.jsx)(e.a,{href:"https://join.slack.com/t/lm-commons/shared_invite/zt-2gankt2wj-FTS45hp1W~JEj1tWvDsUHQ",children:"LM-Commons Slack"})," chat."]}),"\n"]}),"\n",(0,o.jsx)(e.h5,{id:"notices-and-disclaimers",children:"Notices and Disclaimers"}),"\n",(0,o.jsx)(e.p,{children:"This is not an official Laminas Project organization."}),"\n",(0,o.jsx)(e.p,{children:"Issues and questions related to the Laminas MVC and components\nshould be addressed to the Laminas Project organisation."}),"\n",(0,o.jsx)(e.p,{children:"Laminas is a trademark of the Laminas Project, a Series of LF Projects, LLC."})]})}function m(s={}){const{wrapper:e}={...(0,n.R)(),...s.components};return e?(0,o.jsx)(e,{...s,children:(0,o.jsx)(l,{...s})}):l(s)}},8453:(s,e,t)=>{t.d(e,{R:()=>c,x:()=>r});var o=t(6540);const n={},i=o.createContext(n);function c(s){const e=o.useContext(i);return o.useMemo((function(){return"function"==typeof s?s(e):{...e,...s}}),[e,s])}function r(s){let e;return e=s.disableParentContext?"function"==typeof s.components?s.components(n):s.components||n:c(s.components),o.createElement(i.Provider,{value:e},s.children)}}}]); \ No newline at end of file diff --git a/assets/js/9e4087bc.9b70b1ae.js b/assets/js/9e4087bc.9b70b1ae.js new file mode 100644 index 00000000..04bc910f --- /dev/null +++ b/assets/js/9e4087bc.9b70b1ae.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2711],{9331:(e,r,t)=>{t.r(r),t.d(r,{default:()=>m});t(6540);var a=t(8774),n=t(1312),s=t(1213),i=t(6266),c=t(781),l=t(1107),o=t(4848);function d(e){let{year:r,posts:t}=e;const n=(0,i.i)({day:"numeric",month:"long",timeZone:"UTC"});return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(l.A,{as:"h3",id:r,children:r}),(0,o.jsx)("ul",{children:t.map((e=>{return(0,o.jsx)("li",{children:(0,o.jsxs)(a.A,{to:e.metadata.permalink,children:[(r=e.metadata.date,n.format(new Date(r)))," - ",e.metadata.title]})},e.metadata.date);var r}))})]})}function h(e){let{years:r}=e;return(0,o.jsx)("section",{className:"margin-vert--lg",children:(0,o.jsx)("div",{className:"container",children:(0,o.jsx)("div",{className:"row",children:r.map(((e,r)=>(0,o.jsx)("div",{className:"col col--4 margin-vert--lg",children:(0,o.jsx)(d,{...e})},r)))})})})}function m(e){let{archive:r}=e;const t=(0,n.T)({id:"theme.blog.archive.title",message:"Archive",description:"The page & hero title of the blog archive page"}),a=(0,n.T)({id:"theme.blog.archive.description",message:"Archive",description:"The page & hero description of the blog archive page"}),i=function(e){const r=e.reduce(((e,r)=>{const t=r.metadata.date.split("-")[0],a=e.get(t)??[];return e.set(t,[r,...a])}),new Map);return Array.from(r,(e=>{let[r,t]=e;return{year:r,posts:t}}))}(r.blogPosts);return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.be,{title:t,description:a}),(0,o.jsxs)(c.A,{children:[(0,o.jsx)("header",{className:"hero hero--primary",children:(0,o.jsxs)("div",{className:"container",children:[(0,o.jsx)(l.A,{as:"h1",className:"hero__title",children:t}),(0,o.jsx)("p",{className:"hero__subtitle",children:a})]})}),(0,o.jsx)("main",{children:i.length>0&&(0,o.jsx)(h,{years:i})})]})]})}},6266:(e,r,t)=>{t.d(r,{i:()=>n});var a=t(4586);function n(e){void 0===e&&(e={});const{i18n:{currentLocale:r}}=(0,a.A)(),t=function(){const{i18n:{currentLocale:e,localeConfigs:r}}=(0,a.A)();return r[e].calendar}();return new Intl.DateTimeFormat(r,{calendar:t,...e})}}}]); \ No newline at end of file diff --git a/assets/js/9e4087bc.c2e72ae7.js b/assets/js/9e4087bc.c2e72ae7.js deleted file mode 100644 index 395661e3..00000000 --- a/assets/js/9e4087bc.c2e72ae7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[711],{9331:(e,r,t)=>{t.r(r),t.d(r,{default:()=>m});t(6540);var a=t(8774),n=t(1312),s=t(1213),i=t(6266),c=t(781),l=t(1107),o=t(4848);function d(e){let{year:r,posts:t}=e;const n=(0,i.i)({day:"numeric",month:"long",timeZone:"UTC"});return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(l.A,{as:"h3",id:r,children:r}),(0,o.jsx)("ul",{children:t.map((e=>{return(0,o.jsx)("li",{children:(0,o.jsxs)(a.A,{to:e.metadata.permalink,children:[(r=e.metadata.date,n.format(new Date(r)))," - ",e.metadata.title]})},e.metadata.date);var r}))})]})}function h(e){let{years:r}=e;return(0,o.jsx)("section",{className:"margin-vert--lg",children:(0,o.jsx)("div",{className:"container",children:(0,o.jsx)("div",{className:"row",children:r.map(((e,r)=>(0,o.jsx)("div",{className:"col col--4 margin-vert--lg",children:(0,o.jsx)(d,{...e})},r)))})})})}function m(e){let{archive:r}=e;const t=(0,n.T)({id:"theme.blog.archive.title",message:"Archive",description:"The page & hero title of the blog archive page"}),a=(0,n.T)({id:"theme.blog.archive.description",message:"Archive",description:"The page & hero description of the blog archive page"}),i=function(e){const r=e.reduce(((e,r)=>{const t=r.metadata.date.split("-")[0],a=e.get(t)??[];return e.set(t,[r,...a])}),new Map);return Array.from(r,(e=>{let[r,t]=e;return{year:r,posts:t}}))}(r.blogPosts);return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.be,{title:t,description:a}),(0,o.jsxs)(c.A,{children:[(0,o.jsx)("header",{className:"hero hero--primary",children:(0,o.jsxs)("div",{className:"container",children:[(0,o.jsx)(l.A,{as:"h1",className:"hero__title",children:t}),(0,o.jsx)("p",{className:"hero__subtitle",children:a})]})}),(0,o.jsx)("main",{children:i.length>0&&(0,o.jsx)(h,{years:i})})]})]})}},6266:(e,r,t)=>{t.d(r,{i:()=>n});var a=t(4586);function n(e){void 0===e&&(e={});const{i18n:{currentLocale:r}}=(0,a.A)(),t=function(){const{i18n:{currentLocale:e,localeConfigs:r}}=(0,a.A)();return r[e].calendar}();return new Intl.DateTimeFormat(r,{calendar:t,...e})}}}]); \ No newline at end of file diff --git a/assets/js/9ed00105.224cb661.js b/assets/js/9ed00105.224cb661.js new file mode 100644 index 00000000..40ce9df8 --- /dev/null +++ b/assets/js/9ed00105.224cb661.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3873],{2163:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>s,default:()=>h,frontMatter:()=>c,metadata:()=>o,toc:()=>a});var r=n(4848),i=n(8453);const c={sidebar_label:"Configuration",sidebar_position:5,title:"Configuring LmcRbacMvc"},s=void 0,o={id:"configuration",title:"Configuring LmcRbacMvc",description:"LmcRbacMvc is configured via the lmc_rbac key in the application config.",source:"@site/docs/configuration.md",sourceDirName:".",slug:"/configuration",permalink:"/LmcRbacMvc/docs/next/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/docs/configuration.md",tags:[],version:"current",sidebarPosition:5,frontMatter:{sidebar_label:"Configuration",sidebar_position:5,title:"Configuring LmcRbacMvc"},sidebar:"tutorialSidebar",previous:{title:"Authorization Service",permalink:"/LmcRbacMvc/docs/next/using-the-authorization-service"},next:{title:"Plugins and Helpers",permalink:"/LmcRbacMvc/docs/next/plugins"}},d={},a=[{value:"Reference",id:"reference",level:2}];function l(e){const t={a:"a",admonition:"admonition",code:"code",h2:"h2",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(t.p,{children:["LmcRbacMvc is configured via the ",(0,r.jsx)(t.code,{children:"lmc_rbac"})," key in the application config."]}),"\n",(0,r.jsxs)(t.p,{children:["This is typically achieved by creating\na ",(0,r.jsx)(t.code,{children:"config/autoload/lmcrbac.global.php"})," file. A sample configuration file is provided in the ",(0,r.jsx)(t.code,{children:"config/"})," folder."]}),"\n",(0,r.jsx)(t.admonition,{type:"warning",children:(0,r.jsxs)(t.p,{children:["LmcRbacMvc and LmcRbac share the same config key ",(0,r.jsx)(t.code,{children:"'lmc_rbac'"}),". This allow to configure LmcRbacMvc by adding its specific\nconfigs to the same configuration file as LmcRbac."]})}),"\n",(0,r.jsx)(t.h2,{id:"reference",children:"Reference"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Key"}),(0,r.jsx)(t.th,{children:"Type"}),(0,r.jsx)(t.th,{children:"Values"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"guards"})}),(0,r.jsx)(t.td,{children:"array"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"[]"})}),(0,r.jsxs)(t.td,{children:["Defines the guards to implement.",(0,r.jsx)("br",{}),"Refer to the section on ",(0,r.jsx)(t.a,{href:"/LmcRbacMvc/docs/next/guards",children:"Guards"}),"."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"'protection_policy'"}),(0,r.jsx)(t.td,{children:"string"}),(0,r.jsxs)(t.td,{children:["- ",(0,r.jsx)(t.code,{children:"GuardInterface::POLICY_ALLOW"})," ",(0,r.jsx)(t.strong,{children:"(default)"}),(0,r.jsx)("br",{}),"- ",(0,r.jsx)(t.code,{children:"GuardInterface::POLICY_DENY"})]}),(0,r.jsxs)(t.td,{children:["Defines the protection policy that guards will use when no rules are specified for the role.",(0,r.jsx)("br",{}),"Refer to the ",(0,r.jsx)(t.a,{href:"/LmcRbacMvc/docs/next/guards#protection-policy",children:"Guards"})," section."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"'unauthorized_strategy'"}),(0,r.jsx)(t.td,{children:"array\xa0map|null"}),(0,r.jsxs)(t.td,{children:["Defaults to ",(0,r.jsx)(t.code,{children:"null"})]}),(0,r.jsxs)(t.td,{children:["Defines the configuration for the UnAuthorized strategy.",(0,r.jsx)("br",{}),"Refer to the ",(0,r.jsx)(t.a,{href:"strategies#unauthorizedstrategy",children:"Unauthorized Strategy"})," section."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"'redirect_strategy'"}),(0,r.jsx)(t.td,{children:"array\xa0map|null"}),(0,r.jsxs)(t.td,{children:["Defaults to ",(0,r.jsx)(t.code,{children:"null"})]}),(0,r.jsxs)(t.td,{children:["Defines the configuration for the Redirect strategy.",(0,r.jsx)("br",{}),"Refer to the ",(0,r.jsx)(t.a,{href:"strategies#redirectstrategy",children:"Redirect Strategy"})," section."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"'guard_manager'"}),(0,r.jsx)(t.td,{children:"array\xa0map"}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:"[]"})," ",(0,r.jsx)(t.strong,{children:"(default)"})]}),(0,r.jsxs)(t.td,{children:["Guard Manager Plugin Manager configuration.",(0,r.jsx)("br",{}),"Must follow a Service Manager configuration."]})]})]})]})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>o});var r=n(6540);const i={},c=r.createContext(i);function s(e){const t=r.useContext(c);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),r.createElement(c.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a44fbaba.9d432ce5.js b/assets/js/a44fbaba.9d432ce5.js new file mode 100644 index 00000000..1c3ec6cc --- /dev/null +++ b/assets/js/a44fbaba.9d432ce5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[430],{2164:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>c,default:()=>l,frontMatter:()=>i,metadata:()=>a,toc:()=>u});var s=t(4848),r=t(8453);const i={title:"Using LmcRbacMvc and LmcUser",sidebar_label:"Using LmcRbacMvc and LmcUser",sidebar_position:3},c=void 0,a={id:"Guides/lmcuser",title:"Using LmcRbacMvc and LmcUser",description:"To use the authentication service from LmcUser, there are a few actions to take:",source:"@site/docs/Guides/lmcuser.md",sourceDirName:"Guides",slug:"/Guides/lmcuser",permalink:"/LmcRbacMvc/docs/next/Guides/lmcuser",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/docs/Guides/lmcuser.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"Using LmcRbacMvc and LmcUser",sidebar_label:"Using LmcRbacMvc and LmcUser",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Custom Identity Providers",permalink:"/LmcRbacMvc/docs/next/Guides/identity-providers"},next:{title:"Debugging Tools",permalink:"/LmcRbacMvc/docs/next/Guides/debugging"}},o={},u=[{value:"Set up the user entity",id:"set-up-the-user-entity",level:2},{value:"Set up the Laminas authentication service to use LmcUser",id:"set-up-the-laminas-authentication-service-to-use-lmcuser",level:2},{value:"Set up guards",id:"set-up-guards",level:2},{value:"Set up a redirect strategy",id:"set-up-a-redirect-strategy",level:2}];function d(e){const n={admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"To use the authentication service from LmcUser, there are a few actions to take:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Set up a user entity that supports roles"}),"\n",(0,s.jsx)(n.li,{children:"Set up the Laminas authentication service to use LmcUser"}),"\n",(0,s.jsx)(n.li,{children:"Set up guards"}),"\n",(0,s.jsx)(n.li,{children:"Optionally, set up a redirect strategy"}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"set-up-the-user-entity",children:"Set up the user entity"}),"\n",(0,s.jsxs)(n.p,{children:["The default user entity class in LmcUser does not implement the ",(0,s.jsx)(n.code,{children:"Lmc\\Rbac\\Identity\\IdentityInterface"}),". You will need\nto define a user identity class that does by, for example, extending the default user class:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"<?php\n\nclass CustomUser extends \\LmcUser\\Entity\\User implements \\Lmc\\Rbac\\Identity\\IdentityInterface\n{\n private array $roles = ['user']; // let's make 'user' the default role\n\n public function getRoles(): array\n {\n return $this->roles;\n }\n\n public function setRoles(array $roles): User\n {\n $this->roles = $roles;\n return $this;\n }\n}\n"})}),"\n",(0,s.jsx)(n.p,{children:"and then set LmcUser to use this entity:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_user' => [\n 'user_entity_class' => CustomUser::class,\n ]\n];\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsx)(n.p,{children:"This example does not cover modifying the database tables and mappers to fetch/hydrate roles into the user object."})}),"\n",(0,s.jsx)(n.h2,{id:"set-up-the-laminas-authentication-service-to-use-lmcuser",children:"Set up the Laminas authentication service to use LmcUser"}),"\n",(0,s.jsx)(n.p,{children:"You need to set up Laminas Authentication to use the Authentication service from LmcUser."}),"\n",(0,s.jsxs)(n.p,{children:["Add the following alias in your ",(0,s.jsx)(n.code,{children:"application.config.php"}),":"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'service_manager' => [\n 'aliases' => [\n 'Laminas\\Authentication\\AuthenticationService' => 'lmcuser_auth_service'\n ]\n ]\n];\n"})}),"\n",(0,s.jsx)(n.h2,{id:"set-up-guards",children:"Set up guards"}),"\n",(0,s.jsx)(n.p,{children:"The login and register pages should be only accessible from 'guest' users and all other pages should be accessible from\nlogged in users."}),"\n",(0,s.jsxs)(n.p,{children:["Add the LmcUser routes to your ",(0,s.jsx)(n.code,{children:"guards"}),":"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n \\Lmc\\Rbac\\Mvc\\Guard\\RouteGuard::class => [\n 'lmcuser/login' => ['guest'],\n 'lmcuser/register' => ['guest'], // required if registration is enabled\n 'lmcuser*' => ['user'] // includes logout, changepassword and changeemail\n ]\n ]\n ]\n];\n"})}),"\n",(0,s.jsx)(n.h2,{id:"set-up-a-redirect-strategy",children:"Set up a redirect strategy"}),"\n",(0,s.jsxs)(n.p,{children:["If you would like for your application to redirect users to the login page when an unauthorized access is detected, then\nyou need to setup the ",(0,s.jsx)(n.code,{children:"RedirectStrategy"}),":"]}),"\n",(0,s.jsx)(n.p,{children:"In your application.config.php:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"\nreturn [\n 'listeners' => [\n \\Lmc\\Rbac\\Mvc\\View\\Strategy\\RedirectStrategy::class,\n ],\n];\n"})}),"\n",(0,s.jsx)(n.p,{children:"In your LmcRbac config file"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'redirect_strategy' => [\n 'redirect_when_connected' => true,\n 'redirect_to_route_connected' => 'home',\n 'redirect_to_route_disconnected' => 'lmcuser/login',\n 'append_previous_uri' => true,\n 'previous_uri_query_key' => 'redirectTo'\n ],\n ]\n];\n"})})]})}function l(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>c,x:()=>a});var s=t(6540);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 a(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/a6aa9e1f.103cb339.js b/assets/js/a6aa9e1f.103cb339.js new file mode 100644 index 00000000..601f7add --- /dev/null +++ b/assets/js/a6aa9e1f.103cb339.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7643],{5124:(e,t,a)=>{a.r(t),a.d(t,{default:()=>j});a(6540);var n=a(4164),s=a(4586),r=a(1213),i=a(7559),l=a(8027),o=a(7713),c=a(1463),d=a(3892),g=a(5260),m=a(4096),u=a(4848);function h(e){const t=(0,m.kJ)(e);return(0,u.jsx)(g.A,{children:(0,u.jsx)("script",{type:"application/ld+json",children:JSON.stringify(t)})})}function p(e){const{metadata:t}=e,{siteConfig:{title:a}}=(0,s.A)(),{blogDescription:n,blogTitle:i,permalink:l}=t,o="/"===l?a:i;return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(r.be,{title:o,description:n}),(0,u.jsx)(c.A,{tag:"blog_posts_list"})]})}function x(e){const{metadata:t,items:a,sidebar:n}=e;return(0,u.jsxs)(l.A,{sidebar:n,children:[(0,u.jsx)(d.A,{items:a}),(0,u.jsx)(o.A,{metadata:t})]})}function j(e){return(0,u.jsxs)(r.e3,{className:(0,n.A)(i.G.wrapper.blogPages,i.G.page.blogListPage),children:[(0,u.jsx)(p,{...e}),(0,u.jsx)(h,{...e}),(0,u.jsx)(x,{...e})]})}},7713:(e,t,a)=>{a.d(t,{A:()=>i});a(6540);var n=a(1312),s=a(9022),r=a(4848);function i(e){const{metadata:t}=e,{previousPage:a,nextPage:i}=t;return(0,r.jsxs)("nav",{className:"pagination-nav","aria-label":(0,n.T)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[a&&(0,r.jsx)(s.A,{permalink:a,title:(0,r.jsx)(n.A,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer entries"})}),i&&(0,r.jsx)(s.A,{permalink:i,title:(0,r.jsx)(n.A,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older entries"}),isNext:!0})]})}},2907:(e,t,a)=>{a.d(t,{A:()=>U});a(6540);var n=a(4164),s=a(4096),r=a(4848);function i(e){let{children:t,className:a}=e;return(0,r.jsx)("article",{className:a,children:t})}var l=a(8774);const o={title:"title_f1Hy"};function c(e){let{className:t}=e;const{metadata:a,isBlogPostPage:i}=(0,s.e7)(),{permalink:c,title:d}=a,g=i?"h1":"h2";return(0,r.jsx)(g,{className:(0,n.A)(o.title,t),children:i?d:(0,r.jsx)(l.A,{to:c,children:d})})}var d=a(1312),g=a(5846),m=a(6266);const u={container:"container_mt6G"};function h(e){let{readingTime:t}=e;const a=function(){const{selectMessage:e}=(0,g.W)();return t=>{const a=Math.ceil(t);return e(a,(0,d.T)({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:a}))}}();return(0,r.jsx)(r.Fragment,{children:a(t)})}function p(e){let{date:t,formattedDate:a}=e;return(0,r.jsx)("time",{dateTime:t,children:a})}function x(){return(0,r.jsx)(r.Fragment,{children:" \xb7 "})}function j(e){let{className:t}=e;const{metadata:a}=(0,s.e7)(),{date:i,readingTime:l}=a,o=(0,m.i)({day:"numeric",month:"long",year:"numeric",timeZone:"UTC"});return(0,r.jsxs)("div",{className:(0,n.A)(u.container,"margin-vert--md",t),children:[(0,r.jsx)(p,{date:i,formattedDate:(c=i,o.format(new Date(c)))}),void 0!==l&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(x,{}),(0,r.jsx)(h,{readingTime:l})]})]});var c}var A=a(6913);const b={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function f(e){let{className:t}=e;const{metadata:{authors:a},assets:i}=(0,s.e7)();if(0===a.length)return null;const l=a.every((e=>{let{name:t}=e;return!t})),o=1===a.length;return(0,r.jsx)("div",{className:(0,n.A)("margin-top--md margin-bottom--sm",l?b.imageOnlyAuthorRow:"row",t),children:a.map(((e,t)=>(0,r.jsx)("div",{className:(0,n.A)(!l&&(o?"col col--12":"col col--6"),l?b.imageOnlyAuthorCol:b.authorCol),children:(0,r.jsx)(A.A,{author:{...e,imageURL:i.authorsImageUrls[t]??e.imageURL}})},t)))})}function v(){return(0,r.jsxs)("header",{children:[(0,r.jsx)(c,{}),(0,r.jsx)(j,{}),(0,r.jsx)(f,{})]})}var N=a(440),_=a(5533);function T(e){let{children:t,className:a}=e;const{isBlogPostPage:i}=(0,s.e7)();return(0,r.jsx)("div",{id:i?N.LU:void 0,className:(0,n.A)("markdown",a),children:(0,r.jsx)(_.A,{children:t})})}var k=a(7559),w=a(4336),y=a(2053);function P(){return(0,r.jsx)("b",{children:(0,r.jsx)(d.A,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts",children:"Read more"})})}function R(e){const{blogPostTitle:t,...a}=e;return(0,r.jsx)(l.A,{"aria-label":(0,d.T)({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}),...a,children:(0,r.jsx)(P,{})})}function C(){const{metadata:e,isBlogPostPage:t}=(0,s.e7)(),{tags:a,title:i,editUrl:l,hasTruncateMarker:o,lastUpdatedBy:c,lastUpdatedAt:d}=e,g=!t&&o,m=a.length>0;if(!(m||g||l))return null;if(t){const e=!!(l||d||c);return(0,r.jsxs)("footer",{className:"docusaurus-mt-lg",children:[m&&(0,r.jsx)("div",{className:(0,n.A)("row","margin-top--sm",k.G.blog.blogFooterEditMetaRow),children:(0,r.jsx)("div",{className:"col",children:(0,r.jsx)(y.A,{tags:a})})}),e&&(0,r.jsx)(w.A,{className:(0,n.A)("margin-top--sm",k.G.blog.blogFooterEditMetaRow),editUrl:l,lastUpdatedAt:d,lastUpdatedBy:c})]})}return(0,r.jsxs)("footer",{className:"row docusaurus-mt-lg",children:[m&&(0,r.jsx)("div",{className:(0,n.A)("col",{"col--9":g}),children:(0,r.jsx)(y.A,{tags:a})}),g&&(0,r.jsx)("div",{className:(0,n.A)("col text--right",{"col--3":m}),children:(0,r.jsx)(R,{blogPostTitle:i,to:e.permalink})})]})}function U(e){let{children:t,className:a}=e;const l=function(){const{isBlogPostPage:e}=(0,s.e7)();return e?void 0:"margin-bottom--xl"}();return(0,r.jsxs)(i,{className:(0,n.A)(l,a),children:[(0,r.jsx)(v,{}),(0,r.jsx)(T,{children:t}),(0,r.jsx)(C,{})]})}},3892:(e,t,a)=>{a.d(t,{A:()=>i});a(6540);var n=a(4096),s=a(2907),r=a(4848);function i(e){let{items:t,component:a=s.A}=e;return(0,r.jsx)(r.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,r.jsx)(n.in,{content:t,children:(0,r.jsx)(a,{children:(0,r.jsx)(t,{})})},t.metadata.permalink)}))})}},9022:(e,t,a)=>{a.d(t,{A:()=>i});a(6540);var n=a(4164),s=a(8774),r=a(4848);function i(e){const{permalink:t,title:a,subLabel:i,isNext:l}=e;return(0,r.jsxs)(s.A,{className:(0,n.A)("pagination-nav__link",l?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[i&&(0,r.jsx)("div",{className:"pagination-nav__sublabel",children:i}),(0,r.jsx)("div",{className:"pagination-nav__label",children:a})]})}},6133:(e,t,a)=>{a.d(t,{A:()=>l});a(6540);var n=a(4164),s=a(8774);const r={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var i=a(4848);function l(e){let{permalink:t,label:a,count:l,description:o}=e;return(0,i.jsxs)(s.A,{href:t,title:o,className:(0,n.A)(r.tag,l?r.tagWithCount:r.tagRegular),children:[a,l&&(0,i.jsx)("span",{children:l})]})}},2053:(e,t,a)=>{a.d(t,{A:()=>o});a(6540);var n=a(4164),s=a(1312),r=a(6133);const i={tags:"tags_jXut",tag:"tag_QGVx"};var l=a(4848);function o(e){let{tags:t}=e;return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("b",{children:(0,l.jsx)(s.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,l.jsx)("ul",{className:(0,n.A)(i.tags,"padding--none","margin-left--sm"),children:t.map((e=>(0,l.jsx)("li",{className:i.tag,children:(0,l.jsx)(r.A,{...e})},e.permalink)))})]})}}}]); \ No newline at end of file diff --git a/assets/js/a6aa9e1f.4810414c.js b/assets/js/a6aa9e1f.4810414c.js deleted file mode 100644 index 1a330b89..00000000 --- a/assets/js/a6aa9e1f.4810414c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[643],{5124:(e,t,a)=>{a.r(t),a.d(t,{default:()=>f});a(6540);var n=a(4164),i=a(4586),r=a(1213),o=a(7559),s=a(6535),l=a(7713),d=a(1463),c=a(3892),g=a(5260),p=a(6676),u=a(4848);function m(e){const t=(0,p.k)(e);return(0,u.jsx)(g.A,{children:(0,u.jsx)("script",{type:"application/ld+json",children:JSON.stringify(t)})})}function h(e){const{metadata:t}=e,{siteConfig:{title:a}}=(0,i.A)(),{blogDescription:n,blogTitle:o,permalink:s}=t,l="/"===s?a:o;return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(r.be,{title:l,description:n}),(0,u.jsx)(d.A,{tag:"blog_posts_list"})]})}function b(e){const{metadata:t,items:a,sidebar:n}=e;return(0,u.jsxs)(s.A,{sidebar:n,children:[(0,u.jsx)(c.A,{items:a}),(0,u.jsx)(l.A,{metadata:t})]})}function f(e){return(0,u.jsxs)(r.e3,{className:(0,n.A)(o.G.wrapper.blogPages,o.G.page.blogListPage),children:[(0,u.jsx)(h,{...e}),(0,u.jsx)(m,{...e}),(0,u.jsx)(b,{...e})]})}},7713:(e,t,a)=>{a.d(t,{A:()=>o});a(6540);var n=a(1312),i=a(9022),r=a(4848);function o(e){const{metadata:t}=e,{previousPage:a,nextPage:o}=t;return(0,r.jsxs)("nav",{className:"pagination-nav","aria-label":(0,n.T)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[a&&(0,r.jsx)(i.A,{permalink:a,title:(0,r.jsx)(n.A,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer Entries"})}),o&&(0,r.jsx)(i.A,{permalink:o,title:(0,r.jsx)(n.A,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older Entries"}),isNext:!0})]})}},3892:(e,t,a)=>{a.d(t,{A:()=>o});a(6540);var n=a(7131),i=a(4651),r=a(4848);function o(e){let{items:t,component:a=i.A}=e;return(0,r.jsx)(r.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,r.jsx)(n.i,{content:t,children:(0,r.jsx)(a,{children:(0,r.jsx)(t,{})})},t.metadata.permalink)}))})}},6676:(e,t,a)=>{a.d(t,{k:()=>c,J:()=>g});var n=a(6025),i=a(4586),r=a(6803);var o=a(7131);const s=e=>new Date(e).toISOString();function l(e){const t=e.map(p);return{author:1===t.length?t[0]:t}}function d(e,t,a){return e?{image:u({imageUrl:t(e,{absolute:!0}),caption:`title image for the blog post: ${a}`})}:{}}function c(e){const{siteConfig:t}=(0,i.A)(),{withBaseUrl:a}=(0,n.hH)(),{metadata:{blogDescription:r,blogTitle:o,permalink:c}}=e,g=`${t.url}${c}`;return{"@context":"https://schema.org","@type":"Blog","@id":g,mainEntityOfPage:g,headline:o,description:r,blogPost:e.items.map((e=>function(e,t,a){const{assets:n,frontMatter:i,metadata:r}=e,{date:o,title:c,description:g,lastUpdatedAt:p}=r,u=n.image??i.image,m=i.keywords??[],h=`${t.url}${r.permalink}`,b=p?s(p):void 0;return{"@type":"BlogPosting","@id":h,mainEntityOfPage:h,url:h,headline:c,name:c,description:g,datePublished:o,...b?{dateModified:b}:{},...l(r.authors),...d(u,a,c),...m?{keywords:m}:{}}}(e.content,t,a)))}}function g(){const e=function(){const e=(0,r.A)(),t=e?.data?.blogMetadata;if(!t)throw new Error("useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context");return t}(),{assets:t,metadata:a}=(0,o.e)(),{siteConfig:c}=(0,i.A)(),{withBaseUrl:g}=(0,n.hH)(),{date:p,title:u,description:m,frontMatter:h,lastUpdatedAt:b}=a,f=t.image??h.image,x=h.keywords??[],j=b?s(b):void 0,A=`${c.url}${a.permalink}`;return{"@context":"https://schema.org","@type":"BlogPosting","@id":A,mainEntityOfPage:A,url:A,headline:u,name:u,description:m,datePublished:p,...j?{dateModified:j}:{},...l(a.authors),...d(f,g,u),...x?{keywords:x}:{},isPartOf:{"@type":"Blog","@id":`${c.url}${e.blogBasePath}`,name:e.blogTitle}}}function p(e){return{"@type":"Person",...e.name?{name:e.name}:{},...e.title?{description:e.title}:{},...e.url?{url:e.url}:{},...e.email?{email:e.email}:{},...e.imageURL?{image:e.imageURL}:{}}}function u(e){let{imageUrl:t,caption:a}=e;return{"@type":"ImageObject","@id":t,url:t,contentUrl:t,caption:a}}}}]); \ No newline at end of file diff --git a/assets/js/a7456010.47cad1bc.js b/assets/js/a7456010.47cad1bc.js deleted file mode 100644 index b46b932d..00000000 --- a/assets/js/a7456010.47cad1bc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[235],{8552:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/a7456010.5f9bbb01.js b/assets/js/a7456010.5f9bbb01.js new file mode 100644 index 00000000..4e5dd122 --- /dev/null +++ b/assets/js/a7456010.5f9bbb01.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1235],{8552:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/a7bd4aaa.300507f7.js b/assets/js/a7bd4aaa.300507f7.js new file mode 100644 index 00000000..d0e0a693 --- /dev/null +++ b/assets/js/a7bd4aaa.300507f7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7098],{1723:(n,e,s)=>{s.r(e),s.d(e,{default:()=>l});s(6540);var r=s(1213);function o(n,e){return`docs-${n}-${e}`}var t=s(3025),c=s(2831),i=s(1463),u=s(4848);function a(n){const{version:e}=n;return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(i.A,{version:e.version,tag:o(e.pluginId,e.version)}),(0,u.jsx)(r.be,{children:e.noIndex&&(0,u.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})]})}function d(n){const{version:e,route:s}=n;return(0,u.jsx)(r.e3,{className:e.className,children:(0,u.jsx)(t.n,{version:e,children:(0,c.v)(s.routes)})})}function l(n){return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(a,{...n}),(0,u.jsx)(d,{...n})]})}}}]); \ No newline at end of file diff --git a/assets/js/a7bd4aaa.7acfaa26.js b/assets/js/a7bd4aaa.7acfaa26.js deleted file mode 100644 index 99255ddd..00000000 --- a/assets/js/a7bd4aaa.7acfaa26.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[98],{4532:(n,e,s)=>{s.r(e),s.d(e,{default:()=>d});s(6540);var r=s(1213),o=s(2967),t=s(2252),c=s(2831),i=s(1463),u=s(4848);function a(n){const{version:e}=n;return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(i.A,{version:e.version,tag:(0,o.tU)(e.pluginId,e.version)}),(0,u.jsx)(r.be,{children:e.noIndex&&(0,u.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})]})}function l(n){const{version:e,route:s}=n;return(0,u.jsx)(r.e3,{className:e.className,children:(0,u.jsx)(t.n,{version:e,children:(0,c.v)(s.routes)})})}function d(n){return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(a,{...n}),(0,u.jsx)(l,{...n})]})}}}]); \ No newline at end of file diff --git a/assets/js/a94703ab.30c92f68.js b/assets/js/a94703ab.30c92f68.js new file mode 100644 index 00000000..646f4e64 --- /dev/null +++ b/assets/js/a94703ab.30c92f68.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9048],{1377:(e,t,n)=>{n.r(t),n.d(t,{default:()=>be});var a=n(6540),o=n(4164),i=n(1213),s=n(7559),l=n(6972),r=n(609),c=n(1312),d=n(3104),u=n(5062);const m={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};var b=n(4848);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:l}=(0,d.gk)();return(0,d.Mq)(((e,n)=>{let{scrollY:a}=e;const s=n?.scrollY;s&&(i.current?i.current=!1:a>=s?(l(),o(!1)):a<t?o(!1):a+window.innerHeight<document.documentElement.scrollHeight&&o(!0))})),(0,u.$)((e=>{e.location.hash&&(i.current=!0,o(!1))})),{shown:n,scrollToTop:()=>s(0)}}({threshold:300});return(0,b.jsx)("button",{"aria-label":(0,c.T)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,o.A)("clean-btn",s.G.common.backToTopButton,m.backToTopButton,e&&m.backToTopButtonShow),type:"button",onClick:t})}var p=n(3109),x=n(6347),f=n(4581),j=n(6342),v=n(3465);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 A={collapseSidebarButton:"collapseSidebarButton_PEFL",collapseSidebarButtonIcon:"collapseSidebarButtonIcon_kv0_"};function g(e){let{onClick:t}=e;return(0,b.jsx)("button",{type:"button",title:(0,c.T)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,c.T)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,o.A)("button button--secondary button--outline",A.collapseSidebarButton),onClick:t,children:(0,b.jsx)(_,{className:A.collapseSidebarButtonIcon})})}var k=n(5041),C=n(9532);const S=Symbol("EmptyContext"),T=a.createContext(S);function N(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)(T.Provider,{value:i,children:t})}var I=n(1422),B=n(9169),y=n(8774),w=n(2303);function L(e){let{collapsed:t,categoryLabel:n,onClick:a}=e;return(0,b.jsx)("button",{"aria-label":t?(0,c.T)({id:"theme.DocSidebarItem.expandCategoryAriaLabel",message:"Expand sidebar category '{label}'",description:"The ARIA label to expand the sidebar category"},{label:n}):(0,c.T)({id:"theme.DocSidebarItem.collapseCategoryAriaLabel",message:"Collapse sidebar category '{label}'",description:"The ARIA label to collapse the sidebar category"},{label:n}),"aria-expanded":!t,type:"button",className:"clean-btn menu__caret",onClick:a})}function E(e){let{item:t,onItemClick:n,activePath:i,level:r,index:c,...d}=e;const{items:u,label:m,collapsible:h,className:p,href:x}=t,{docs:{sidebar:{autoCollapseCategories:f}}}=(0,j.p)(),v=function(e){const t=(0,w.A)();return(0,a.useMemo)((()=>e.href&&!e.linkUnlisted?e.href:!t&&e.collapsible?(0,l.Nr)(e):void 0),[e,t])}(t),_=(0,l.w8)(t,i),A=(0,B.ys)(x,i),{collapsed:g,setCollapsed:k}=(0,I.u)({initialState:()=>!!h&&(!_&&t.collapsed)}),{expandedItem:N,setExpandedItem:E}=function(){const e=(0,a.useContext)(T);if(e===S)throw new C.dV("DocSidebarItemsExpandedStateProvider");return e}(),M=function(e){void 0===e&&(e=!g),E(e?null:c),k(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:o}=e;const i=(0,C.ZC)(t);(0,a.useEffect)((()=>{t&&!i&&n&&o(!1)}),[t,i,n,o])}({isActive:_,collapsed:g,updateCollapsed:M}),(0,a.useEffect)((()=>{h&&null!=N&&N!==c&&f&&k(!0)}),[h,N,c,k,f]),(0,b.jsxs)("li",{className:(0,o.A)(s.G.docs.docSidebarItemCategory,s.G.docs.docSidebarItemCategoryLevel(r),"menu__list-item",{"menu__list-item--collapsed":g},p),children:[(0,b.jsxs)("div",{className:(0,o.A)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":A}),children:[(0,b.jsx)(y.A,{className:(0,o.A)("menu__link",{"menu__link--sublist":h,"menu__link--sublist-caret":!x&&h,"menu__link--active":_}),onClick:h?e=>{n?.(t),x?M(!1):(e.preventDefault(),M())}:()=>{n?.(t)},"aria-current":A?"page":void 0,role:h&&!x?"button":void 0,"aria-expanded":h&&!x?!g:void 0,href:h?v??"#":v,...d,children:m}),x&&h&&(0,b.jsx)(L,{collapsed:g,categoryLabel:m,onClick:e=>{e.preventDefault(),M()}})]}),(0,b.jsx)(I.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:g,children:(0,b.jsx)(U,{items:u,tabIndex:g?-1:0,onItemClick:n,activePath:i,level:r+1})})]})}var M=n(6654),H=n(3186);const G={menuExternalLink:"menuExternalLink_NmtK"};function W(e){let{item:t,onItemClick:n,activePath:a,level:i,index:r,...c}=e;const{href:d,label:u,className:m,autoAddBaseUrl:h}=t,p=(0,l.w8)(t,a),x=(0,M.A)(d);return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(i),"menu__list-item",m),children:(0,b.jsxs)(y.A,{className:(0,o.A)("menu__link",!x&&G.menuExternalLink,{"menu__link--active":p}),autoAddBaseUrl:h,"aria-current":p?"page":void 0,to:d,...x&&{onClick:n?()=>n(t):void 0},...c,children:[u,!x&&(0,b.jsx)(H.A,{})]})},u)}const P={menuHtmlItem:"menuHtmlItem_M9Kj"};function R(e){let{item:t,level:n,index:a}=e;const{value:i,defaultStyle:l,className:r}=t;return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(n),l&&[P.menuHtmlItem,"menu__list-item"],r),dangerouslySetInnerHTML:{__html:i}},a)}function D(e){let{item:t,...n}=e;switch(t.type){case"category":return(0,b.jsx)(E,{item:t,...n});case"html":return(0,b.jsx)(R,{item:t,...n});default:return(0,b.jsx)(W,{item:t,...n})}}function F(e){let{items:t,...n}=e;const a=(0,l.Y)(t,n.activePath);return(0,b.jsx)(N,{children:a.map(((e,t)=>(0,b.jsx)(D,{item:e,index:t,...n},t)))})}const U=(0,a.memo)(F),V={menu:"menu_SIkG",menuWithAnnouncementBar:"menuWithAnnouncementBar_GW3s"};function Y(e){let{path:t,sidebar:n,className:i}=e;const l=function(){const{isActive:e}=(0,k.M)(),[t,n]=(0,a.useState)(e);return(0,d.Mq)((t=>{let{scrollY:a}=t;e&&n(0===a)}),[e]),e&&t}();return(0,b.jsx)("nav",{"aria-label":(0,c.T)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,o.A)("menu thin-scrollbar",V.menu,l&&V.menuWithAnnouncementBar,i),children:(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(U,{items:n,activePath:t,level:1})})})}const K="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:l}}}=(0,j.p)();return(0,b.jsxs)("div",{className:(0,o.A)(K,s&&z,i&&q),children:[s&&(0,b.jsx)(v.A,{tabIndex:-1,className:O}),(0,b.jsx)(Y,{path:t,sidebar:n}),l&&(0,b.jsx)(g,{onClick:a})]})}const Q=a.memo(J);var X=n(5600),Z=n(9876);const $=e=>{let{sidebar:t,path:n}=e;const a=(0,Z.M)();return(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(U,{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.GX,{component:$,props:e})}const te=a.memo(ee);function ne(e){const t=(0,f.l)(),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,c.T)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,c.T)({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){let{children:t}=e;const n=(0,r.t)();return(0,b.jsx)(a.Fragment,{children:t},n?.name??"noSidebar")}function le(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:i}=e;const{pathname:l}=(0,x.zy)(),[r,c]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{r&&c(!1),!r&&(0,p.O)()&&c(!0),i((e=>!e))}),[i,r]);return(0,b.jsx)("aside",{className:(0,o.A)(s.G.docs.docSidebarContainer,ie.docSidebarContainer,n&&ie.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(ie.docSidebarContainer)&&n&&c(!0)},children:(0,b.jsx)(se,{children:(0,b.jsxs)("div",{className:(0,o.A)(ie.sidebarViewport,r&&ie.sidebarViewportHidden),children:[(0,b.jsx)(ne,{sidebar:t,path:l,onCollapse:d,isHidden:r}),r&&(0,b.jsx)(oe,{toggleSidebar:d})]})})})}const re={docMainContainer:"docMainContainer_TBSr",docMainContainerEnhanced:"docMainContainerEnhanced_lQrH",docItemWrapperEnhanced:"docItemWrapperEnhanced_JWYK"};function ce(e){let{hiddenSidebarContainer:t,children:n}=e;const a=(0,r.t)();return(0,b.jsx)("main",{className:(0,o.A)(re.docMainContainer,(t||!a)&&re.docMainContainerEnhanced),children:(0,b.jsx)("div",{className:(0,o.A)("container padding-top--md padding-bottom--lg",re.docItemWrapper,t&&re.docItemWrapperEnhanced),children:n})})}const de={docRoot:"docRoot_UBD9",docsWrapper:"docsWrapper_hBAB"};function ue(e){let{children:t}=e;const n=(0,r.t)(),[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)(le,{sidebar:n.items,hiddenSidebarContainer:o,setHiddenSidebarContainer:i}),(0,b.jsx)(ce,{hiddenSidebarContainer:o,children:t})]})]})}var me=n(3363);function be(e){const t=(0,l.B5)(e);if(!t)return(0,b.jsx)(me.A,{});const{docElement:n,sidebarName:a,sidebarItems:c}=t;return(0,b.jsx)(i.e3,{className:(0,o.A)(s.G.page.docsDocPage),children:(0,b.jsx)(r.V,{name:a,items:c,children:(0,b.jsx)(ue,{children:n})})})}},3363:(e,t,n)=>{n.d(t,{A:()=>l});n(6540);var a=n(4164),o=n(1312),i=n(1107),s=n(4848);function l(e){let{className:t}=e;return(0,s.jsx)("main",{className:(0,a.A)("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.A,{as:"h1",className:"hero__title",children:(0,s.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{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.A,{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/a94703ab.a8e86096.js b/assets/js/a94703ab.a8e86096.js deleted file mode 100644 index 258070f8..00000000 --- a/assets/js/a94703ab.a8e86096.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[48],{2559:(e,t,n)=>{n.r(t),n.d(t,{default:()=>be});var a=n(6540),o=n(4164),i=n(1213),s=n(7559),l=n(1754),r=n(6588),c=n(1312),d=n(3104),u=n(5062);const m={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};var b=n(4848);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:l}=(0,d.gk)();return(0,d.Mq)(((e,n)=>{let{scrollY:a}=e;const s=n?.scrollY;s&&(i.current?i.current=!1:a>=s?(l(),o(!1)):a<t?o(!1):a+window.innerHeight<document.documentElement.scrollHeight&&o(!0))})),(0,u.$)((e=>{e.location.hash&&(i.current=!0,o(!1))})),{shown:n,scrollToTop:()=>s(0)}}({threshold:300});return(0,b.jsx)("button",{"aria-label":(0,c.T)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,o.A)("clean-btn",s.G.common.backToTopButton,m.backToTopButton,e&&m.backToTopButtonShow),type:"button",onClick:t})}var p=n(3109),x=n(6347),f=n(4581),j=n(6342),v=n(3465);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 A={collapseSidebarButton:"collapseSidebarButton_PEFL",collapseSidebarButtonIcon:"collapseSidebarButtonIcon_kv0_"};function g(e){let{onClick:t}=e;return(0,b.jsx)("button",{type:"button",title:(0,c.T)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,c.T)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,o.A)("button button--secondary button--outline",A.collapseSidebarButton),onClick:t,children:(0,b.jsx)(_,{className:A.collapseSidebarButtonIcon})})}var k=n(5041),C=n(9532);const S=Symbol("EmptyContext"),T=a.createContext(S);function N(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)(T.Provider,{value:i,children:t})}var I=n(1422),B=n(9169),y=n(8774),w=n(2303);function L(e){let{collapsed:t,categoryLabel:n,onClick:a}=e;return(0,b.jsx)("button",{"aria-label":t?(0,c.T)({id:"theme.DocSidebarItem.expandCategoryAriaLabel",message:"Expand sidebar category '{label}'",description:"The ARIA label to expand the sidebar category"},{label:n}):(0,c.T)({id:"theme.DocSidebarItem.collapseCategoryAriaLabel",message:"Collapse sidebar category '{label}'",description:"The ARIA label to collapse the sidebar category"},{label:n}),"aria-expanded":!t,type:"button",className:"clean-btn menu__caret",onClick:a})}function E(e){let{item:t,onItemClick:n,activePath:i,level:r,index:c,...d}=e;const{items:u,label:m,collapsible:h,className:p,href:x}=t,{docs:{sidebar:{autoCollapseCategories:f}}}=(0,j.p)(),v=function(e){const t=(0,w.A)();return(0,a.useMemo)((()=>e.href&&!e.linkUnlisted?e.href:!t&&e.collapsible?(0,l.Nr)(e):void 0),[e,t])}(t),_=(0,l.w8)(t,i),A=(0,B.ys)(x,i),{collapsed:g,setCollapsed:k}=(0,I.u)({initialState:()=>!!h&&(!_&&t.collapsed)}),{expandedItem:N,setExpandedItem:E}=function(){const e=(0,a.useContext)(T);if(e===S)throw new C.dV("DocSidebarItemsExpandedStateProvider");return e}(),M=function(e){void 0===e&&(e=!g),E(e?null:c),k(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:o}=e;const i=(0,C.ZC)(t);(0,a.useEffect)((()=>{t&&!i&&n&&o(!1)}),[t,i,n,o])}({isActive:_,collapsed:g,updateCollapsed:M}),(0,a.useEffect)((()=>{h&&null!=N&&N!==c&&f&&k(!0)}),[h,N,c,k,f]),(0,b.jsxs)("li",{className:(0,o.A)(s.G.docs.docSidebarItemCategory,s.G.docs.docSidebarItemCategoryLevel(r),"menu__list-item",{"menu__list-item--collapsed":g},p),children:[(0,b.jsxs)("div",{className:(0,o.A)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":A}),children:[(0,b.jsx)(y.A,{className:(0,o.A)("menu__link",{"menu__link--sublist":h,"menu__link--sublist-caret":!x&&h,"menu__link--active":_}),onClick:h?e=>{n?.(t),x?M(!1):(e.preventDefault(),M())}:()=>{n?.(t)},"aria-current":A?"page":void 0,role:h&&!x?"button":void 0,"aria-expanded":h&&!x?!g:void 0,href:h?v??"#":v,...d,children:m}),x&&h&&(0,b.jsx)(L,{collapsed:g,categoryLabel:m,onClick:e=>{e.preventDefault(),M()}})]}),(0,b.jsx)(I.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:g,children:(0,b.jsx)(U,{items:u,tabIndex:g?-1:0,onItemClick:n,activePath:i,level:r+1})})]})}var M=n(6654),H=n(3186);const G={menuExternalLink:"menuExternalLink_NmtK"};function W(e){let{item:t,onItemClick:n,activePath:a,level:i,index:r,...c}=e;const{href:d,label:u,className:m,autoAddBaseUrl:h}=t,p=(0,l.w8)(t,a),x=(0,M.A)(d);return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(i),"menu__list-item",m),children:(0,b.jsxs)(y.A,{className:(0,o.A)("menu__link",!x&&G.menuExternalLink,{"menu__link--active":p}),autoAddBaseUrl:h,"aria-current":p?"page":void 0,to:d,...x&&{onClick:n?()=>n(t):void 0},...c,children:[u,!x&&(0,b.jsx)(H.A,{})]})},u)}const P={menuHtmlItem:"menuHtmlItem_M9Kj"};function R(e){let{item:t,level:n,index:a}=e;const{value:i,defaultStyle:l,className:r}=t;return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(n),l&&[P.menuHtmlItem,"menu__list-item"],r),dangerouslySetInnerHTML:{__html:i}},a)}function D(e){let{item:t,...n}=e;switch(t.type){case"category":return(0,b.jsx)(E,{item:t,...n});case"html":return(0,b.jsx)(R,{item:t,...n});default:return(0,b.jsx)(W,{item:t,...n})}}function F(e){let{items:t,...n}=e;const a=(0,l.Y)(t,n.activePath);return(0,b.jsx)(N,{children:a.map(((e,t)=>(0,b.jsx)(D,{item:e,index:t,...n},t)))})}const U=(0,a.memo)(F),V={menu:"menu_SIkG",menuWithAnnouncementBar:"menuWithAnnouncementBar_GW3s"};function Y(e){let{path:t,sidebar:n,className:i}=e;const l=function(){const{isActive:e}=(0,k.M)(),[t,n]=(0,a.useState)(e);return(0,d.Mq)((t=>{let{scrollY:a}=t;e&&n(0===a)}),[e]),e&&t}();return(0,b.jsx)("nav",{"aria-label":(0,c.T)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,o.A)("menu thin-scrollbar",V.menu,l&&V.menuWithAnnouncementBar,i),children:(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(U,{items:n,activePath:t,level:1})})})}const K="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:l}}}=(0,j.p)();return(0,b.jsxs)("div",{className:(0,o.A)(K,s&&z,i&&q),children:[s&&(0,b.jsx)(v.A,{tabIndex:-1,className:O}),(0,b.jsx)(Y,{path:t,sidebar:n}),l&&(0,b.jsx)(g,{onClick:a})]})}const Q=a.memo(J);var X=n(5600),Z=n(9876);const $=e=>{let{sidebar:t,path:n}=e;const a=(0,Z.M)();return(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(U,{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.GX,{component:$,props:e})}const te=a.memo(ee);function ne(e){const t=(0,f.l)(),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,c.T)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,c.T)({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){let{children:t}=e;const n=(0,r.t)();return(0,b.jsx)(a.Fragment,{children:t},n?.name??"noSidebar")}function le(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:i}=e;const{pathname:l}=(0,x.zy)(),[r,c]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{r&&c(!1),!r&&(0,p.O)()&&c(!0),i((e=>!e))}),[i,r]);return(0,b.jsx)("aside",{className:(0,o.A)(s.G.docs.docSidebarContainer,ie.docSidebarContainer,n&&ie.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(ie.docSidebarContainer)&&n&&c(!0)},children:(0,b.jsx)(se,{children:(0,b.jsxs)("div",{className:(0,o.A)(ie.sidebarViewport,r&&ie.sidebarViewportHidden),children:[(0,b.jsx)(ne,{sidebar:t,path:l,onCollapse:d,isHidden:r}),r&&(0,b.jsx)(oe,{toggleSidebar:d})]})})})}const re={docMainContainer:"docMainContainer_TBSr",docMainContainerEnhanced:"docMainContainerEnhanced_lQrH",docItemWrapperEnhanced:"docItemWrapperEnhanced_JWYK"};function ce(e){let{hiddenSidebarContainer:t,children:n}=e;const a=(0,r.t)();return(0,b.jsx)("main",{className:(0,o.A)(re.docMainContainer,(t||!a)&&re.docMainContainerEnhanced),children:(0,b.jsx)("div",{className:(0,o.A)("container padding-top--md padding-bottom--lg",re.docItemWrapper,t&&re.docItemWrapperEnhanced),children:n})})}const de={docRoot:"docRoot_UBD9",docsWrapper:"docsWrapper_hBAB"};function ue(e){let{children:t}=e;const n=(0,r.t)(),[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)(le,{sidebar:n.items,hiddenSidebarContainer:o,setHiddenSidebarContainer:i}),(0,b.jsx)(ce,{hiddenSidebarContainer:o,children:t})]})]})}var me=n(3363);function be(e){const t=(0,l.B5)(e);if(!t)return(0,b.jsx)(me.A,{});const{docElement:n,sidebarName:a,sidebarItems:c}=t;return(0,b.jsx)(i.e3,{className:(0,o.A)(s.G.page.docsDocPage),children:(0,b.jsx)(r.V,{name:a,items:c,children:(0,b.jsx)(ue,{children:n})})})}},3363:(e,t,n)=>{n.d(t,{A:()=>l});n(6540);var a=n(4164),o=n(1312),i=n(1107),s=n(4848);function l(e){let{className:t}=e;return(0,s.jsx)("main",{className:(0,a.A)("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.A,{as:"h1",className:"hero__title",children:(0,s.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{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.A,{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/aba21aa0.eb7bf6f2.js b/assets/js/aba21aa0.eb7bf6f2.js deleted file mode 100644 index 8df44791..00000000 --- a/assets/js/aba21aa0.eb7bf6f2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[742],{7093:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/aba21aa0.ed09cce9.js b/assets/js/aba21aa0.ed09cce9.js new file mode 100644 index 00000000..8a875495 --- /dev/null +++ b/assets/js/aba21aa0.ed09cce9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5742],{7093:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/acecf23e.86afcb57.js b/assets/js/acecf23e.86afcb57.js new file mode 100644 index 00000000..df991a2d --- /dev/null +++ b/assets/js/acecf23e.86afcb57.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1903],{1912:s=>{s.exports=JSON.parse('{"blogBasePath":"/LmcRbacMvc/blog","blogTitle":"Blog","authorsListPath":"/LmcRbacMvc/blog/authors"}')}}]); \ No newline at end of file diff --git a/assets/js/acecf23e.e3286c84.js b/assets/js/acecf23e.e3286c84.js deleted file mode 100644 index e8166220..00000000 --- a/assets/js/acecf23e.e3286c84.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[903],{1912:s=>{s.exports=JSON.parse('{"blogBasePath":"/LmcRbacMvc/blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/b5cb822e.91b516dc.js b/assets/js/b5cb822e.91b516dc.js deleted file mode 100644 index bc37cb41..00000000 --- a/assets/js/b5cb822e.91b516dc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[390],{2957:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>r,toc:()=>m});var n=o(4848),c=o(8453);const s={slug:"welcome",title:"Welcome",authors:["ericr"],tags:["laminas","PHP"]},i=void 0,r={permalink:"/LmcRbacMvc/blog/welcome",editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/blog/2022-08-02-welcome.md",source:"@site/blog/2022-08-02-welcome.md",title:"Welcome",description:"Welcome to the new documentation website for the LM-Commons organization.",date:"2022-08-02T00:00:00.000Z",tags:[{inline:!0,label:"laminas",permalink:"/LmcRbacMvc/blog/tags/laminas"},{inline:!0,label:"PHP",permalink:"/LmcRbacMvc/blog/tags/php"}],readingTime:.155,hasTruncateMarker:!1,authors:[{name:"Eric Richer",title:"LM-Commons Administrator",url:"https://github.com/visto9259",imageURL:"https://github.com/visto9259.png",key:"ericr"}],frontMatter:{slug:"welcome",title:"Welcome",authors:["ericr"],tags:["laminas","PHP"]},unlisted:!1,prevItem:{title:"New documentation",permalink:"/LmcRbacMvc/blog/new-documentation"}},a={authorsImageUrls:[void 0]},m=[];function l(e){const t={p:"p",...(0,c.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"Welcome to the new documentation website for the LM-Commons organization."}),"\n",(0,n.jsx)(t.p,{children:"This site is work in progress and the intent is obviously to keep it current with updates to the LM-Commons packages."})]})}function u(e={}){const{wrapper:t}={...(0,c.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>i,x:()=>r});var n=o(6540);const c={},s=n.createContext(c);function i(e){const t=n.useContext(s);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(c):e.components||c:i(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b5cb822e.ba3d1b7b.js b/assets/js/b5cb822e.ba3d1b7b.js new file mode 100644 index 00000000..65b79c92 --- /dev/null +++ b/assets/js/b5cb822e.ba3d1b7b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1390],{2957:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>r,toc:()=>m});var n=o(4848),c=o(8453);const s={slug:"welcome",title:"Welcome",authors:["ericr"],tags:["laminas","PHP"]},i=void 0,r={permalink:"/LmcRbacMvc/blog/welcome",editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/blog/2022-08-02-welcome.md",source:"@site/blog/2022-08-02-welcome.md",title:"Welcome",description:"Welcome to the new documentation website for the LM-Commons organization.",date:"2022-08-02T00:00:00.000Z",tags:[{inline:!0,label:"laminas",permalink:"/LmcRbacMvc/blog/tags/laminas"},{inline:!0,label:"PHP",permalink:"/LmcRbacMvc/blog/tags/php"}],readingTime:.155,hasTruncateMarker:!1,authors:[{name:"Eric Richer",title:"LM-Commons Administrator",url:"https://github.com/visto9259",imageURL:"https://github.com/visto9259.png",key:"ericr",page:null}],frontMatter:{slug:"welcome",title:"Welcome",authors:["ericr"],tags:["laminas","PHP"]},unlisted:!1,prevItem:{title:"New documentation",permalink:"/LmcRbacMvc/blog/new-documentation"}},a={authorsImageUrls:[void 0]},m=[];function l(e){const t={p:"p",...(0,c.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"Welcome to the new documentation website for the LM-Commons organization."}),"\n",(0,n.jsx)(t.p,{children:"This site is work in progress and the intent is obviously to keep it current with updates to the LM-Commons packages."})]})}function u(e={}){const{wrapper:t}={...(0,c.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>i,x:()=>r});var n=o(6540);const c={},s=n.createContext(c);function i(e){const t=n.useContext(s);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(c):e.components||c:i(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b831a968.af69091a.js b/assets/js/b831a968.af69091a.js new file mode 100644 index 00000000..f1effe43 --- /dev/null +++ b/assets/js/b831a968.af69091a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2741],{5297:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>a,default:()=>p,frontMatter:()=>i,metadata:()=>c,toc:()=>l});var r=n(4848),s=n(8453);const i={sidebar_position:6},a="Strategies",c={id:"strategies",title:"Strategies",description:"In this section, you will learn:",source:"@site/versioned_docs/version-3.4/strategies.md",sourceDirName:".",slug:"/strategies",permalink:"/LmcRbacMvc/docs/strategies",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/versioned_docs/version-3.4/strategies.md",tags:[],version:"3.4",sidebarPosition:6,frontMatter:{sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"Guards",permalink:"/LmcRbacMvc/docs/guards"},next:{title:"Using the Authorization Service",permalink:"/LmcRbacMvc/docs/using-the-authorization-service"}},o={},l=[{value:"What are strategies?",id:"what-are-strategies",level:2},{value:"Built-in strategies",id:"built-in-strategies",level:2},{value:"RedirectStrategy",id:"redirectstrategy",level:3},{value:"UnauthorizedStrategy",id:"unauthorizedstrategy",level:3},{value:"Creating custom strategies",id:"creating-custom-strategies",level:2}];function d(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"strategies",children:"Strategies"})}),"\n",(0,r.jsx)(t.p,{children:"In this section, you will learn:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"What strategies are"}),"\n",(0,r.jsx)(t.li,{children:"How to use built-in strategies"}),"\n",(0,r.jsx)(t.li,{children:"How to create custom strategies"}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"what-are-strategies",children:"What are strategies?"}),"\n",(0,r.jsxs)(t.p,{children:["A strategy is an object that listens to the ",(0,r.jsx)(t.code,{children:"MvcEvent::EVENT_DISPATCH_ERROR"})," event. It is used to describe what\nhappens when access to a resource is unauthorized by LmcRbacMvc."]}),"\n",(0,r.jsxs)(t.p,{children:["LmcRbacMvc strategies all check if an ",(0,r.jsx)(t.code,{children:"LmcRbacMvc\\Exception\\UnauthorizedExceptionInterface"})," has been thrown."]}),"\n",(0,r.jsxs)(t.p,{children:["By default, LmcRbacMvc does not register any strategy for you. The best place to register it is in your ",(0,r.jsx)(t.code,{children:"onBootstrap"}),"\nmethod of the ",(0,r.jsx)(t.code,{children:"Module.php"})," class:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-php",children:"public function onBootstrap(MvcEvent $e)\n{\n $app = $e->getApplication();\n $sm = $app->getServiceManager();\n $em = $app->getEventManager();\n \n $listener = $sm->get(\\LmcRbacMvc\\View\\Strategy\\UnauthorizedStrategy::class);\n $listener->attach($em);\n}\n"})}),"\n",(0,r.jsx)(t.h2,{id:"built-in-strategies",children:"Built-in strategies"}),"\n",(0,r.jsxs)(t.p,{children:["LmcRbacMvc comes with two built-in strategies: ",(0,r.jsx)(t.code,{children:"RedirectStrategy"})," and ",(0,r.jsx)(t.code,{children:"UnauthorizedStrategy"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"redirectstrategy",children:"RedirectStrategy"}),"\n",(0,r.jsx)(t.p,{children:"This strategy allows your application to redirect any unauthorized request to another route by optionally appending the previous\nURL as a query parameter."}),"\n",(0,r.jsx)(t.p,{children:"To register it, copy-paste this code into your Module.php class:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-php",children:"public function onBootstrap(MvcEvent $e)\n{\n $app = $e->getApplication();\n $sm = $app->getServiceManager();\n $em = $app->getEventManager();\n \n $listener = $sm->get(\\LmcRbacMvc\\View\\Strategy\\RedirectStrategy::class);\n $listener->attach($em);\n}\n"})}),"\n",(0,r.jsxs)(t.p,{children:["You can configure the strategy using the ",(0,r.jsx)(t.code,{children:"redirect_strategy"})," subkey:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'redirect_strategy' => [\n 'redirect_when_connected' => true,\n 'redirect_to_route_connected' => 'home',\n 'redirect_to_route_disconnected' => 'login',\n 'append_previous_uri' => true,\n 'previous_uri_query_key' => 'redirectTo'\n ],\n ]\n];\n"})}),"\n",(0,r.jsxs)(t.p,{children:["If users try to access an unauthorized resource (eg.: ",(0,r.jsx)(t.a,{href:"http://www.example.com/delete",children:"http://www.example.com/delete"}),'), they will be\nredirected to the "login" route if is not connected and to the "home" route otherwise (it must exist in your route configuration\nof course) with the previous URL appended : ',(0,r.jsx)(t.a,{href:"http://www.example.com/login?redirectTo=http://www.example.com/delete",children:"http://www.example.com/login?redirectTo=http://www.example.com/delete"})]}),"\n",(0,r.jsxs)(t.p,{children:["You can prevent redirection when a user is connected (i.e. so that the user gets a 403 page) by setting ",(0,r.jsx)(t.code,{children:"redirect_when_connected"})," to ",(0,r.jsx)(t.code,{children:"false"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"unauthorizedstrategy",children:"UnauthorizedStrategy"}),"\n",(0,r.jsx)(t.p,{children:"This strategy allows your application to render a template on any unauthorized request."}),"\n",(0,r.jsx)(t.p,{children:"To register it, copy-paste this code into your Module.php class:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-php",children:"public function onBootstrap(MvcEvent $e)\n{\n $app = $e->getApplication();\n $sm = $app->getServiceManager();\n $em = $app->getEventManager();\n \n $listener = $sm->get(\\LmcRbacMvc\\View\\Strategy\\UnauthorizedStrategy::class);\n $listener->attach($em);\n}\n"})}),"\n",(0,r.jsxs)(t.p,{children:["You can configure the strategy using the ",(0,r.jsx)(t.code,{children:"unauthorized_strategy"})," subkey:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'unauthorized_strategy' => [\n 'template' => 'error/custom-403'\n ],\n ]\n];\n"})}),"\n",(0,r.jsxs)(t.blockquote,{children:["\n",(0,r.jsxs)(t.p,{children:["By default, LmcRbacMvc uses a template called ",(0,r.jsx)(t.code,{children:"error/403"}),"."]}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"creating-custom-strategies",children:"Creating custom strategies"}),"\n",(0,r.jsxs)(t.p,{children:["Creating a custom strategy is rather easy. Let's say we want to create a strategy that integrates with\nthe ",(0,r.jsx)(t.a,{href:"https://github.com/laminas-api-tools/api-tools-api-problem",children:"ApiProblem"})," Laminas Api Tools module:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-php",children:"namespace Application\\View\\Strategy;\n\nuse Laminas\\Http\\Response as HttpResponse;\nuse Laminas\\Mvc\\MvcEvent;\nuse Laminas\\ApiTools\\ApiProblem\\ApiProblem;\nuse Laminas\\ApiTools\\ApiProblem\\ApiProblemResponse;\nuse LmcRbacMvc\\View\\Strategy\\AbstractStrategy;\nuse LmcRbacMvc\\Exception\\UnauthorizedExceptionInterface;\n\nclass ApiProblemStrategy extends AbstractStrategy\n{\n public function onError(MvcEvent $event)\n {\n // Do nothing if no error or if response is not HTTP response\n if (!($exception = $event->getParam('exception') instanceof UnauthorizedExceptionInterface)\n || ($result = $event->getResult() instanceof HttpResponse)\n || !($response = $event->getResponse() instanceof HttpResponse)\n ) {\n return;\n }\n\n return new ApiProblemResponse(new ApiProblem($exception->getMessage()));\n }\n}\n"})}),"\n",(0,r.jsx)(t.p,{children:"Register your strategy:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-php",children:"public function onBootstrap(EventInterface $e)\n{\n $e->getTarget()\n ->getEventManager()\n ->attach(new ApiProblemStrategy());\n}\n"})})]})}function p(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>c});var r=n(6540);const s={},i=r.createContext(s);function a(e){const t=r.useContext(i);return r.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(s):e.components||s:a(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b9207088.cb0c414c.js b/assets/js/b9207088.cb0c414c.js deleted file mode 100644 index 239be9ff..00000000 --- a/assets/js/b9207088.cb0c414c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[571],{7024:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>d,frontMatter:()=>s,metadata:()=>c,toc:()=>l});var i=t(4848),o=t(8453);const s={sidebar_position:8},r="Cookbook",c={id:"cookbook",title:"Cookbook",description:"This section will help you further understand how LmcRbacMvc works by providing more concrete examples. If you have",source:"@site/docs/cookbook.md",sourceDirName:".",slug:"/cookbook",permalink:"/LmcRbacMvc/docs/cookbook",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/docs/cookbook.md",tags:[],version:"current",sidebarPosition:8,frontMatter:{sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"Using the Authorization Service",permalink:"/LmcRbacMvc/docs/using-the-authorization-service"},next:{title:"Support",permalink:"/LmcRbacMvc/docs/support"}},a={},l=[{value:"A Real World Application",id:"a-real-world-application",level:2},{value:"Best practices",id:"best-practices",level:2},{value:"When using guards then?",id:"when-using-guards-then",level:3},{value:"A Real World Application Part 2 - Only delete your own Posts",id:"a-real-world-application-part-2---only-delete-your-own-posts",level:2},{value:"A Real World Application Part 3 - Admins can delete everything",id:"a-real-world-application-part-3---admins-can-delete-everything",level:2},{value:"A Real World Application Part 4 - Checking permissions in the view",id:"a-real-world-application-part-4---checking-permissions-in-the-view",level:2},{value:"Using LmcRbacMvc with Doctrine ORM",id:"using-lmcrbacmvc-with-doctrine-orm",level:2},{value:"How to deal with roles with lot of permissions?",id:"how-to-deal-with-roles-with-lot-of-permissions",level:2},{value:"Using LmcRbacMvc and ZF2 Assetic",id:"using-lmcrbacmvc-and-zf2-assetic",level:2},{value:"Using LmcRbacMvc and LmcUser",id:"using-lmcrbacmvc-and-lmcuser",level:2}];function h(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",strong:"strong",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"cookbook",children:"Cookbook"}),"\n",(0,i.jsx)(n.p,{children:"This section will help you further understand how LmcRbacMvc works by providing more concrete examples. If you have\nany other recipe you'd like to add, please open an issue!"}),"\n",(0,i.jsx)(n.h2,{id:"a-real-world-application",children:"A Real World Application"}),"\n",(0,i.jsxs)(n.p,{children:["In this example we are going to create a very little real world application. We will create a controller\n",(0,i.jsx)(n.code,{children:"PostController"})," that interacts with a service called ",(0,i.jsx)(n.code,{children:"PostService"}),". For the sake of simplicity we will only\ncover the ",(0,i.jsx)(n.code,{children:"delete"}),"-methods of both parts."]}),"\n",(0,i.jsxs)(n.p,{children:["Let's start by creating a controller that has the ",(0,i.jsx)(n.code,{children:"PostService"})," as dependency:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"class PostController\n{\n protected $postService;\n\n public function __construct(PostService $postService)\n {\n $this->postService = $postService;\n }\n\n // addAction(), editAction(), etc...\n\n public function deleteAction()\n {\n $id = $this->params()->fromQuery('id');\n\n $this->postService->deletePost($id);\n\n return $this->redirect()->toRoute('posts');\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Since we have a dependency, let's inject it using the ",(0,i.jsx)(n.code,{children:"ControllerManager"}),", we will do this inside our ",(0,i.jsx)(n.code,{children:"Module"})," class"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"class Module\n{\n public function getConfig()\n {\n return [\n 'controllers' => [\n 'factories' => [\n 'PostController' => function ($cpm) {\n // We assume a Service key 'PostService' here that returns the PostService Class\n return new PostController(\n $cpm->getServiceLocator()->get('PostService')\n );\n },\n ],\n ],\n ];\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Now that we have this in place let us quickly define our ",(0,i.jsx)(n.code,{children:"PostService"}),". We will be using a Service that makes use\nof Doctrine, so we require a ",(0,i.jsx)(n.code,{children:"Doctrine\\Persistence\\ObjectManager"})," as dependency."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"use Doctrine\\Persistence\\ObjectManager;\n\nclass PostService\n{\n protected $objectManager;\n\n public function __construct(ObjectManager $objectManager)\n {\n $this->objectManager = $objectManager;\n }\n\n public function deletePost($id)\n {\n $post = $this->objectManager->find('Post', $id);\n $this->objectManager->remove($post);\n $this->objectManager->flush();\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["And for this one, too, let's quickly create the factory, again within our ",(0,i.jsx)(n.code,{children:"Module"})," class."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"class Module\n{\n // getAutoloaderConfig(), getConfig(), etc...\n\n public function getServiceConfig()\n {\n return [\n 'factories' => [\n 'PostService' => function($sm) {\n return new PostService(\n $sm->get('doctrine.entitymanager.orm_default')\n );\n }\n ]\n ];\n }\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"With this set up we can now cover some best practices."}),"\n",(0,i.jsx)(n.h2,{id:"best-practices",children:"Best practices"}),"\n",(0,i.jsx)(n.p,{children:"Ideally, you should not protect your applications using only guards (Route or Controller guards).\nThis leaves your application open for some undesired side-effects.\nAs a best practice you should protect all your services or controllers by injecting the authorization service.\nBut let's go step by step:"}),"\n",(0,i.jsx)(n.p,{children:"Assuming the application example above we can easily use LmcRbacMvc to protect our route using the following guard:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\RouteGuard' => [\n 'post/delete' => ['admin']\n ]\n ]\n ]\n];\n"})}),"\n",(0,i.jsx)(n.p,{children:'Now, any users that do not have the "admin" role will receive a 403 error (unauthorized) when trying to access\nthe "post/delete" route. However, this does not prevent the service (which should contain the actual logic in a properly\ndesign application) to be injected and used elsewhere in your code. For instance:'}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"class PostController\n{\n protected $postService;\n\n public function createAction()\n {\n // this action may have been reached through the \"forward\" method, hence bypassing guards\n $this->postService->deletePost('2');\n }\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"You see the issue!"}),"\n",(0,i.jsxs)(n.p,{children:["The solution is to inject the ",(0,i.jsx)(n.code,{children:"AuthorizationService"})," into your services and check for the\npermissions before doing anything wrong. So let's modify our previously created ",(0,i.jsx)(n.code,{children:"PostService"})," class"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"use Doctrine\\Persistence\\ObjectManager;\nuse LmcRbacMvc\\Service\\AuthorizationService;\n\nclass PostService\n{\n protected $objectManager;\n\n protected $authorizationService;\n\n public function __construct(\n ObjectManager $objectManager,\n AuthorizationService $autorizationService\n ) {\n $this->objectManager = $objectManager;\n $this->authorizationService = $autorizationService;\n }\n\n public function deletePost($id)\n {\n // First check permission\n if (!$this->authorizationService->isGranted('deletePost')) {\n throw new UnauthorizedException('You are not allowed !');\n }\n\n $post = $this->objectManager->find('Post', $id);\n $this->objectManager->remove($post);\n $this->objectManager->flush();\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Since we now have an additional dependency we should inject it through our factory, again within our ",(0,i.jsx)(n.code,{children:"Module"})," class."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"class Module\n{\n // getAutoloaderConfig(), getConfig(), etc...\n\n public function getServiceConfig()\n {\n return [\n 'factories' => [\n 'PostService' => function($sm) {\n return new PostService(\n $sm->get('doctrine.entitymanager.orm_default'),\n $sm->get('LmcRbacMvc\\Service\\AuthorizationService') // This is new!\n );\n }\n ]\n ];\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Alternatively, you can also protect your controllers using the ",(0,i.jsx)(n.code,{children:"isGranted"})," helper (you do not need to inject\nthe AuthorizationService then):"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"class PostController\n{\n protected $postService;\n\n public function createAction()\n {\n if (!$this->isGranted('deletePost')) {\n throw new UnauthorizedException('You are not allowed !');\n }\n\n $this->postService->deletePost('2');\n }\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"While protecting services is the more defensive way (because services are usually the last part of the logic flow),\nit is often complicated to deal with.\nIf your application is architectured correctly, it is often simpler to protect your controllers."}),"\n",(0,i.jsx)(n.h3,{id:"when-using-guards-then",children:"When using guards then?"}),"\n",(0,i.jsx)(n.p,{children:"In fact, you should see guards as a very efficient way to quickly reject access to a hierarchy of routes or a\nwhole controller. For instance, assuming you have the following route config:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"return [\n 'router' => [\n 'routes' => [\n 'admin' => [\n 'type' => 'Literal',\n 'options' => [\n 'route' => '/admin'\n ],\n 'may_terminate' => true,\n 'child_routes' => [\n 'users' => [\n 'type' => 'Literal',\n 'options' => [\n 'route' => '/users'\n ]\n ],\n 'invoices' => [\n 'type' => 'Literal',\n 'options' => [\n 'route' => '/invoices'\n ]\n ]\n ]\n ]\n ]\n ]\n};\n"})}),"\n",(0,i.jsx)(n.p,{children:"You can quickly reject access to all admin routes using the following guard:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbacMvc\\Guard\\RouteGuard' => [\n 'admin*' => ['admin']\n ]\n ]\n ]\n];\n"})}),"\n",(0,i.jsx)(n.h2,{id:"a-real-world-application-part-2---only-delete-your-own-posts",children:"A Real World Application Part 2 - Only delete your own Posts"}),"\n",(0,i.jsxs)(n.p,{children:["If you jumped straight to this section please notice that we assume you have the knowledge that we presented in the\nprevious example. In here we will cover a very common use case. Users of our Application should only have delete\npermissions to their own content. So let's quickly refresh our ",(0,i.jsx)(n.code,{children:"PostService"})," class:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"use Doctrine\\Persistence\\ObjectManager;\n\nclass PostService\n{\n protected $objectManager;\n\n protected $authorizationService;\n\n public function __construct(\n ObjectManager $objectManager,\n AuthorizationService $autorizationService\n ) {\n $this->objectManager = $objectManager;\n $this->authorizationService = $autorizationService;\n }\n\n public function deletePost($id)\n {\n // First check permission\n if (!$this->authorizationService->isGranted('deletePost')) {\n throw new UnauthorizedException('You are not allowed !');\n }\n\n $post = $this->objectManager->find('Post', $id);\n $this->objectManager->remove($post);\n $this->objectManager->flush();\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["As we can see, we check within our Service if the User of our Application is allowed to delete the post with a check\nagainst the ",(0,i.jsx)(n.code,{children:"deletePost"})," permission. Now how can we achieve that only a user who is the owner of the Post to be able to\ndelete his own post, but other users can't? We do not want to change our Service with more complex logic because this\nis not the task of such service. The Permission-System should handle this. And we can, for this we have the\n",(0,i.jsx)(n.code,{children:"AssertionPluginManager"})," and here is how to do it:"]}),"\n",(0,i.jsx)(n.p,{children:"First of all we need to write an Assertion. The Assertion will return a boolean statement about the current\nidentity being the owner of the post."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"namespace Your\\Namespace;\n\nuse LmcRbacMvc\\Assertion\\AssertionInterface;\nuse LmcRbacMvc\\Service\\AuthorizationService;\n\nclass MustBeAuthorAssertion implements AssertionInterface\n{\n /**\n * Check if this assertion is true\n *\n * @param AuthorizationService $authorization\n * @param mixed $post\n *\n * @return bool\n */\n public function assert(AuthorizationService $authorization, $post = null)\n {\n return $authorization->getIdentity() === $post->getAuthor();\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["This simple ",(0,i.jsx)(n.code,{children:"MustBeAuthorAssertion"})," will check against the current ",(0,i.jsx)(n.code,{children:"$authorization"}),' if it equals the identity of the\ncurrent context Author. The second parameter is called the "context". A context can be anything (an object, a scalar,\nan array...) and only makes sense in the context of the assertion.']}),"\n",(0,i.jsxs)(n.p,{children:["Imagine a user calls ",(0,i.jsx)(n.code,{children:"http://my.dom/post/delete/42"}),", so obviously he wants to delete the Post-Entity with ID#42. In\nthis case Entity#42 is our Context! If you're wondering how the context gets there, bare with me. We will get to\nthis later."]}),"\n",(0,i.jsxs)(n.p,{children:["Now that we have written the Assertion, we want to make sure that this assertion will always be called, whenever we\ncheck for the ",(0,i.jsx)(n.code,{children:"deletePost"})," permission. We don't want others to delete our previous content! For this we have the so\ncalled ",(0,i.jsx)(n.code,{children:"assertion_map"}),". In this map we glue ",(0,i.jsx)(n.code,{children:"assertions"})," and ",(0,i.jsx)(n.code,{children:"permissions"})," together."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"// module.config.php or wherever you configure your RBAC stuff\nreturn [\n 'lmc_rbac' => [\n 'assertion_map' => [\n 'deletePost' => 'Your\\Namespace\\MustBeAuthorAssertion'\n ]\n ]\n];\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Now, whenever some test the ",(0,i.jsx)(n.code,{children:"deletePost"})," permission, it will automatically call the ",(0,i.jsx)(n.code,{children:"MustBeAuthorAssertion"})," from\nthe ",(0,i.jsx)(n.code,{children:"AssertionPluginManager"}),". This plugin manager is configured to automatically add unknown classes to an invokable.\nHowever, some assertions may need dependencies. You can manually configure the assertion plugin manager as\nshown below:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"// module.config.php or wherever you configure your RBAC stuff\nreturn [\n 'lmc_rbac' => [\n // ... other rbac stuff\n 'assertion_manager' => [\n 'factories' => [\n 'AssertionWithDependency' => 'Your\\Namespace\\AssertionWithDependencyFactory'\n ]\n ]\n ]\n];\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Now we need to remember about the ",(0,i.jsx)(n.strong,{children:"context"}),". Somehow we need to let the ",(0,i.jsx)(n.code,{children:"AssertionPluginManager"})," know about our\ncontext. This is done by simply passing it to the ",(0,i.jsx)(n.code,{children:"isGranted()"})," method. For this we need to modify our Service\none last time."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"use Doctrine\\Persistence\\ObjectManager;\n\nclass PostService\n{\n protected $objectManager;\n\n protected $authorizationService;\n\n public function __construct(\n ObjectManager $objectManager,\n AuthorizationService $autorizationService\n ) {\n $this->objectManager = $objectManager;\n $this->authorizationService = $autorizationService;\n }\n\n public function deletePost($id)\n {\n // Note, we now need to query for the post of interest first!\n $post = $this->objectManager->find('Post', $id);\n\n // Check the permission now with a given context\n if (!$this->authorizationService->isGranted('deletePost', $post)) {\n throw new UnauthorizedException('You are not allowed !');\n }\n\n $this->objectManager->remove($post);\n $this->objectManager->flush();\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["And there you have it. The context is injected into the ",(0,i.jsx)(n.code,{children:"isGranted()"})," method and now the ",(0,i.jsx)(n.code,{children:"AssertionPluginManager"})," knows\nabout it and can do its thing. Note that in reality, after you have queried for the ",(0,i.jsx)(n.code,{children:"$post"})," you would check if ",(0,i.jsx)(n.code,{children:"$post"}),"\nis actually a real post. Because if it is an empty return value then you should throw an exception earlier without\nneeding to check against the permission."]}),"\n",(0,i.jsx)(n.h2,{id:"a-real-world-application-part-3---admins-can-delete-everything",children:"A Real World Application Part 3 - Admins can delete everything"}),"\n",(0,i.jsx)(n.p,{children:"Often, you want users with a specific role to be able to have full access to everything. For instance, admins could\ndelete all the posts, even if they don't own it."}),"\n",(0,i.jsxs)(n.p,{children:["However, with the previous assertion, even if the admin has the permission ",(0,i.jsx)(n.code,{children:"deletePost"}),", it won't work because\nthe assertion will evaluate to false."]}),"\n",(0,i.jsxs)(n.p,{children:["Actually, the answer is quite simple: deleting my own posts and deleting others' posts should be treated like\ntwo different permissions (it makes sense if you think about it). Therefore, admins will have the permission\n",(0,i.jsx)(n.code,{children:"deleteOthersPost"})," (as well as the permission ",(0,i.jsx)(n.code,{children:"deletePost"}),", because admin could write posts, too)."]}),"\n",(0,i.jsx)(n.p,{children:"The assertion must therefore be modified like this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"namespace Your\\Namespace;\n\nuse LmcRbacMvc\\Assertion\\AssertionInterface;\nuse LmcRbacMvc\\Service\\AuthorizationService;\n\nclass MustBeAuthorAssertion implements AssertionInterface\n{\n /**\n * Check if this assertion is true\n *\n * @param AuthorizationService $authorization\n * @param mixed $context\n *\n * @return bool\n */\n public function assert(AuthorizationService $authorization, $context = null)\n {\n if ($authorization->getIdentity() === $context->getAuthor()) {\n return true;\n }\n\n return $authorization->isGranted('deleteOthersPost');\n }\n}\n"})}),"\n",(0,i.jsx)(n.h2,{id:"a-real-world-application-part-4---checking-permissions-in-the-view",children:"A Real World Application Part 4 - Checking permissions in the view"}),"\n",(0,i.jsxs)(n.p,{children:["If some part of the view needs to be protected, you can use the shipped ",(0,i.jsx)(n.code,{children:"isGranted"})," view helper."]}),"\n",(0,i.jsxs)(n.p,{children:["For example, lets's say that only users with the permissions ",(0,i.jsx)(n.code,{children:"post.manage"})," will have a menu item to acces\nthe adminsitration panel :"]}),"\n",(0,i.jsx)(n.p,{children:"In your template post-index.phtml"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:'<ul class="nav">\n <li><a href="/">Home</a></li>\n <li><a href="/posts/list">View posts</a></li>\n <?php if ($this->isGranted(\'post.manage\'): ?>\n <li><a href="/posts/admin">Manage posts</a></li>\n <?php endif ?>\n</ul>\n'})}),"\n",(0,i.jsxs)(n.p,{children:["You can even protect your menu item regarding a role, by using the ",(0,i.jsx)(n.code,{children:"hasRole"})," view helper :"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:'<ul class="nav">\n <li><a href="/">Home</a></li>\n <li><a href="/posts/list">View posts</a></li>\n <?php if ($this->hasRole(\'admin\'): ?>\n <li><a href="/posts/admin">Manage posts</a></li>\n <?php endif ?>\n</ul>\n'})}),"\n",(0,i.jsxs)(n.p,{children:["In this last example, the menu item will be hidden for users who don't have the ",(0,i.jsx)(n.code,{children:"admin"})," role."]}),"\n",(0,i.jsx)(n.h2,{id:"using-lmcrbacmvc-with-doctrine-orm",children:"Using LmcRbacMvc with Doctrine ORM"}),"\n",(0,i.jsxs)(n.p,{children:["First your User entity class must implement ",(0,i.jsx)(n.code,{children:"LmcRbacMvc\\Identity\\IdentityInterface"})," :"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:'use LmccUser\\Entity\\User as LmcUserEntity;\nuse LmcRbacMvc\\Identity\\IdentityInterface;\nuse Doctrine\\ORM\\Mapping as ORM;\nuse Doctrine\\Common\\Collections\\ArrayCollection;\nuse Doctrine\\Common\\Collections\\Collection;\n\n/**\n * @ORM\\Entity\n * @ORM\\Table(name="user")\n */\nclass User extends LmcUserEntity implements IdentityInterface\n{\n /**\n * @var Collection\n * @ORM\\ManyToMany(targetEntity="HierarchicalRole")\n */\n private $roles;\n\n public function __construct()\n {\n $this->roles = new ArrayCollection();\n }\n\n /**\n * {@inheritDoc}\n */\n public function getRoles()\n {\n return $this->roles->toArray();\n }\n\n /**\n * Set the list of roles\n * @param Collection $roles\n */\n public function setRoles(Collection $roles)\n {\n $this->roles->clear();\n foreach ($roles as $role) {\n $this->roles[] = $role;\n }\n }\n\n /**\n * Add one role to roles list\n * @param \\Rbac\\Role\\RoleInterface $role\n */\n public function addRole(RoleInterface $role)\n {\n $this->roles[] = $role;\n }\n}\n'})}),"\n",(0,i.jsxs)(n.p,{children:["For this example we will use a more complex situation by using ",(0,i.jsx)(n.code,{children:"Rbac\\Role\\HierarchicalRoleInterface"})," so the second step is to create HierarchicalRole entity class"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:'class HierarchicalRole implements HierarchicalRoleInterface\n{\n /**\n * @var HierarchicalRoleInterface[]|\\Doctrine\\Common\\Collections\\Collection\n *\n * @ORM\\ManyToMany(targetEntity="HierarchicalRole")\n */\n protected $children;\n\n /**\n * @var PermissionInterface[]|\\Doctrine\\Common\\Collections\\Collection\n *\n * @ORM\\ManyToMany(targetEntity="Permission", indexBy="name", fetch="EAGER", cascade={"persist"})\n */\n protected $permissions;\n\n /**\n * Init the Doctrine collection\n */\n public function __construct()\n {\n $this->children = new ArrayCollection();\n $this->permissions = new ArrayCollection();\n }\n\n /**\n * {@inheritDoc}\n */\n public function addChild(HierarchicalRoleInterface $child)\n {\n $this->children[] = $child;\n }\n\n /*\n * Set the list of permission\n * @param Collection $permissions\n */\n public function setPermissions(Collection $permissions)\n {\n $this->permissions->clear();\n foreach ($permissions as $permission) {\n $this->permissions[] = $permission;\n }\n }\n\n /**\n * {@inheritDoc}\n */\n public function addPermission($permission)\n {\n if (is_string($permission)) {\n $permission = new Permission($permission);\n }\n\n $this->permissions[(string) $permission] = $permission;\n }\n\n /**\n * {@inheritDoc}\n */\n public function hasPermission($permission)\n {\n // This can be a performance problem if your role has a lot of permissions. Please refer\n // to the cookbook to an elegant way to solve this issue\n\n return isset($this->permissions[(string) $permission]);\n }\n\n /**\n * {@inheritDoc}\n */\n public function getChildren()\n {\n return $this->children->toArray();\n }\n\n /**\n * {@inheritDoc}\n */\n public function hasChildren()\n {\n return !$this->children->isEmpty();\n }\n}\n'})}),"\n",(0,i.jsx)(n.p,{children:"And the last step is to create a Permission entity class which is a very simple entity class. You don't have to do specific things!"}),"\n",(0,i.jsxs)(n.p,{children:["You can find all entity examples in this folder : ",(0,i.jsx)(n.a,{href:"https://github.com/LM-Commons/LmcRbacMvc/tree/master/data",children:"Example"})]}),"\n",(0,i.jsxs)(n.p,{children:["You need one more configuration step. Indeed, how can the RoleProvider retrieve your role and permissions? For this you need to configure ",(0,i.jsx)(n.code,{children:"LmcRbacMvc\\Role\\ObjectRepositoryRoleProvider"})," in your ",(0,i.jsx)(n.code,{children:"lmc_rbac.global.php"})," file :"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:" /**\n * Configuration for role provider\n */\n 'role_provider' => [\n 'LmcRbacMvc\\Role\\ObjectRepositoryRoleProvider' => [\n 'object_manager' => 'doctrine.entitymanager.orm_default', // alias for doctrine ObjectManager\n 'class_name' => 'User\\Entity\\HierarchicalRole', // FQCN for your role entity class\n 'role_name_property' => 'name', // Name to show\n ],\n ],\n"})}),"\n",(0,i.jsx)(n.p,{children:"Using DoctrineORM with LmcRbacMvc is very simple. You need to be aware of performance where there is a lot of permissions for roles."}),"\n",(0,i.jsx)(n.h2,{id:"how-to-deal-with-roles-with-lot-of-permissions",children:"How to deal with roles with lot of permissions?"}),"\n",(0,i.jsxs)(n.p,{children:["In very complex applications, your roles may have dozens of permissions. In the [/data/FlatRole.php.dist] entity\nwe provide, we configure the permissions association so that whenever a role is loaded, all of its permissions are also\nloaded in one query (notice the ",(0,i.jsx)(n.code,{children:'fetch="EAGER"'}),"):"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:'/**\n * @ORM\\ManyToMany(targetEntity="Permission", indexBy="name", fetch="EAGER")\n */\nprotected $permissions;\n'})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"hasPermission"})," method is therefore really simple:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"public function hasPermission($permission)\n{\n return isset($this->permissions[(string) $permission]);\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"However, with a lot of permissions, this method will quickly kill your database. What you can do is modfiy the Doctrine\nmapping so that the collection is not actually loaded:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:'/**\n * @ORM\\ManyToMany(targetEntity="Permission", indexBy="name", fetch="LAZY")\n */\nprotected $permissions;\n'})}),"\n",(0,i.jsxs)(n.p,{children:["Then, modify the ",(0,i.jsx)(n.code,{children:"hasPermission"})," method to use the Criteria API. The Criteria API is a Doctrine 2.2+ API that allows\nyour application to efficiently filter a collection without loading the whole collection:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"use Doctrine\\Common\\Collections\\Criteria;\n\npublic function hasPermission($permission)\n{\n $criteria = Criteria::create()->where(Criteria::expr()->eq('name', (string) $permission));\n $result = $this->permissions->matching($criteria);\n\n return count($result) > 0;\n}\n"})}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"NOTE: This is only supported starting from Doctrine ORM 2.5!"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"using-lmcrbacmvc-and-zf2-assetic",children:"Using LmcRbacMvc and ZF2 Assetic"}),"\n",(0,i.jsxs)(n.p,{children:["To use ",(0,i.jsx)(n.a,{href:"https://github.com/widmogrod/zf2-assetic-module",children:"Assetic"})," with LmcRbacMvc guards, you should modify your\n",(0,i.jsx)(n.code,{children:"module.config.php"})," using the following configuration:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"return [\n 'assetic_configuration' => [\n 'acceptableErrors' => [\n \\LmcRbacMvc\\Guard\\GuardInterface::GUARD_UNAUTHORIZED\n ]\n ]\n];\n"})}),"\n",(0,i.jsx)(n.h2,{id:"using-lmcrbacmvc-and-lmcuser",children:"Using LmcRbacMvc and LmcUser"}),"\n",(0,i.jsx)(n.p,{children:"To use the authentication service from LmcUser, just add the following alias in your application.config.php:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"return [\n 'service_manager' => [\n 'aliases' => [\n 'Laminas\\Authentication\\AuthenticationService' => 'lmcuser_auth_service'\n ]\n ]\n];\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Finally add the LmcUser routes to your ",(0,i.jsx)(n.code,{children:"guards"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'guards' => [\n 'LmcRbac\\Guard\\RouteGuard' => [\n 'lmcuser/login' => ['guest'],\n 'lmcuser/register' => ['guest'], // required if registration is enabled\n 'lmcuser*' => ['user'] // includes logout, changepassword and changeemail\n ]\n ]\n ]\n];\n"})})]})}function d(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>c});var i=t(6540);const o={},s=i.createContext(o);function r(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b96269b9.cfbd8a34.js b/assets/js/b96269b9.cfbd8a34.js new file mode 100644 index 00000000..b9adbd8a --- /dev/null +++ b/assets/js/b96269b9.cfbd8a34.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1868],{9772:t=>{t.exports=JSON.parse('{"authors":[{"name":"Eric Richer","title":"LM-Commons Administrator","url":"https://github.com/visto9259","imageURL":"https://github.com/visto9259.png","key":"ericr","page":null,"count":2}]}')}}]); \ No newline at end of file diff --git a/assets/js/c0d4b1ca.0f31ba8b.js b/assets/js/c0d4b1ca.0f31ba8b.js new file mode 100644 index 00000000..b8cc23e2 --- /dev/null +++ b/assets/js/c0d4b1ca.0f31ba8b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4021],{1822:a=>{a.exports=JSON.parse('{"tag":{"label":"PHP","permalink":"/LmcRbacMvc/blog/tags/php","allTagsPath":"/LmcRbacMvc/blog/tags","count":2,"unlisted":false},"listMetadata":{"permalink":"/LmcRbacMvc/blog/tags/php","page":1,"postsPerPage":10,"totalPages":1,"totalCount":2,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/c0d4b1ca.af4355eb.js b/assets/js/c0d4b1ca.af4355eb.js deleted file mode 100644 index 195019f0..00000000 --- a/assets/js/c0d4b1ca.af4355eb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[21],{1822:a=>{a.exports=JSON.parse('{"tag":{"label":"PHP","permalink":"/LmcRbacMvc/blog/tags/php","allTagsPath":"/LmcRbacMvc/blog/tags","count":2,"unlisted":false},"listMetadata":{"permalink":"/LmcRbacMvc/blog/tags/php","page":1,"postsPerPage":10,"totalPages":1,"totalCount":2,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/c4f5d8e4.00ce20a8.js b/assets/js/c4f5d8e4.00ce20a8.js deleted file mode 100644 index 9fe6ec23..00000000 --- a/assets/js/c4f5d8e4.00ce20a8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[634],{6467:(e,s,n)=>{n.r(s),n.d(s,{default:()=>u});var t=n(4164),r=(n(8774),n(4586)),a=n(781),i=n(1107);const o={features:"features_t9lD",featureSvg:"featureSvg_GfXr"};var c=n(4848);c.Fragment;function l(){return(0,c.jsx)("section",{className:o.features,children:(0,c.jsx)("div",{className:"container"})})}const h={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"};function d(){const{siteConfig:e}=(0,r.A)();return(0,c.jsx)("header",{className:(0,t.A)("hero hero--primary",h.heroBanner),children:(0,c.jsxs)("div",{className:"container",children:[(0,c.jsx)(i.A,{as:"h1",className:"hero__title",children:e.title}),(0,c.jsx)("p",{className:"hero__subtitle",children:e.tagline}),(0,c.jsx)("p",{children:"Part of the LM-Commons series of community developed packages for Laminas"})]})})}function u(){const{siteConfig:e}=(0,r.A)();return(0,c.jsxs)(a.A,{title:`Hello from ${e.title}`,description:"Description will go into a meta tag in <head />",children:[(0,c.jsx)(d,{}),(0,c.jsx)("main",{children:(0,c.jsx)(l,{})})]})}}}]); \ No newline at end of file diff --git a/assets/js/c4f5d8e4.fed9ac7d.js b/assets/js/c4f5d8e4.fed9ac7d.js new file mode 100644 index 00000000..906a8a20 --- /dev/null +++ b/assets/js/c4f5d8e4.fed9ac7d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2634],{1402:(e,s,t)=>{t.r(s),t.d(s,{default:()=>m});var n=t(8774),c=t(4586),a=t(781),i=t(4164),o=t(1107);const r={features:"features_t9lD",featureSvg:"featureSvg_GfXr"};var l=t(4848);l.Fragment;function d(){return(0,l.jsx)("section",{className:r.features,children:(0,l.jsx)("div",{className:"container",children:(0,l.jsx)("div",{className:(0,i.A)("row"),children:(0,l.jsxs)("div",{className:(0,i.A)("col col--8"),children:[(0,l.jsx)(o.A,{as:"h1",children:"Introduction"}),(0,l.jsxs)("p",{children:["LmcRbacMvc is a companion component that extends the functionality of ",(0,l.jsx)(n.A,{href:"https://lm-commons.github.io/LmcRbac",children:"LmcRbac"})," to provide Role-based Access Control (RBAC) for Laminas MVC applications."]})]})})})})}const h={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"};function u(){const{siteConfig:e}=(0,c.A)();return(0,l.jsx)("header",{className:(0,i.A)("hero hero--primary",h.heroBanner),children:(0,l.jsxs)("div",{className:"container",children:[(0,l.jsx)(o.A,{as:"h1",className:"hero__title",children:e.title}),(0,l.jsx)("p",{className:"hero__subtitle",children:e.tagline}),(0,l.jsx)("div",{className:h.buttons,children:(0,l.jsx)(n.A,{className:"button button--secondary button--lg",to:"/docs/intro",children:"Getting Started"})})]})})}function m(){const{siteConfig:e}=(0,c.A)();return(0,l.jsxs)(a.A,{title:`Hello from ${e.title}`,description:"Description will go into a meta tag in <head />",children:[(0,l.jsx)(u,{}),(0,l.jsx)("main",{children:(0,l.jsx)(d,{})})]})}}}]); \ No newline at end of file diff --git a/assets/js/cc6cf6b9.7c1f2c29.js b/assets/js/cc6cf6b9.7c1f2c29.js new file mode 100644 index 00000000..6495f9cc --- /dev/null +++ b/assets/js/cc6cf6b9.7c1f2c29.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7447],{9419:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>c,default:()=>g,frontMatter:()=>i,metadata:()=>a,toc:()=>r});var o=n(4848),t=n(8453);const i={sidebar_position:4,sidebar_label:"Debugging Tools"},c="Debugging Tools",a={id:"Guides/debugging",title:"Debugging Tools",description:"LmcRbacMvcDeveloperTools is an extension",source:"@site/docs/Guides/debugging.md",sourceDirName:"Guides",slug:"/Guides/debugging",permalink:"/LmcRbacMvc/docs/next/Guides/debugging",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/docs/Guides/debugging.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{sidebar_position:4,sidebar_label:"Debugging Tools"},sidebar:"tutorialSidebar",previous:{title:"Using LmcRbacMvc and LmcUser",permalink:"/LmcRbacMvc/docs/next/Guides/lmcuser"},next:{title:"From v3 to v4",permalink:"/LmcRbacMvc/docs/next/Upgrading/upgrade"}},l={},r=[{value:"Installation",id:"installation",level:2},{value:"Toolbar",id:"toolbar",level:2}];function d(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",img:"img",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"debugging-tools",children:"Debugging Tools"})}),"\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.a,{href:"https://github.com/LM-Commons/LmcRbacMvcDeveloperTools",children:"LmcRbacMvcDeveloperTools"})," is an extension\nfor the ",(0,o.jsx)(s.a,{href:"https://github.com/laminas/laminas-developer-tools",children:"Laminas Developer Tools"}),",\nthat collects and displays debugging data on settings, guards and roles."]}),"\n",(0,o.jsx)(s.h2,{id:"installation",children:"Installation"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-shell",children:"$ composer require --dev lm-commons/lmc-rbac-mvc-devtools\n"})}),"\n",(0,o.jsxs)(s.p,{children:["Composer should ask to install the module. Typically, this module will go in ",(0,o.jsx)(s.code,{children:"development.config.php"}),"."]}),"\n",(0,o.jsx)(s.h2,{id:"toolbar",children:"Toolbar"}),"\n",(0,o.jsx)(s.p,{children:"LmcRbacMvcDeveloperTools provides toolbars to view settings, guards and roles:"}),"\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.img,{alt:"Settings",src:n(9588).A+"",width:"367",height:"206"}),"\n",(0,o.jsx)(s.img,{alt:"Guards",src:n(5845).A+"",width:"666",height:"372"}),"\n",(0,o.jsx)(s.img,{alt:"Roles",src:n(5496).A+"",width:"544",height:"198"})]})]})}function g(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},5845:(e,s,n)=>{n.d(s,{A:()=>o});const o=n.p+"assets/images/guards-bebe9254cc00bef48fb2532cbc931891.png"},5496:(e,s,n)=>{n.d(s,{A:()=>o});const o=n.p+"assets/images/roles-7b31412c689086807f6c9c1e354f23c1.png"},9588:(e,s,n)=>{n.d(s,{A:()=>o});const o=n.p+"assets/images/settings-de6e02e7515b826a7e9faadc1713deee.png"},8453:(e,s,n)=>{n.d(s,{R:()=>c,x:()=>a});var o=n(6540);const t={},i=o.createContext(t);function c(e){const s=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:c(e.components),o.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ccc49370.38b48d43.js b/assets/js/ccc49370.38b48d43.js new file mode 100644 index 00000000..f61217c3 --- /dev/null +++ b/assets/js/ccc49370.38b48d43.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3249],{2907:(e,t,n)=>{n.d(t,{A:()=>O});n(6540);var a=n(4164),s=n(4096),i=n(4848);function r(e){let{children:t,className:n}=e;return(0,i.jsx)("article",{className:n,children:t})}var l=n(8774);const o={title:"title_f1Hy"};function c(e){let{className:t}=e;const{metadata:n,isBlogPostPage:r}=(0,s.e7)(),{permalink:c,title:d}=n,m=r?"h1":"h2";return(0,i.jsx)(m,{className:(0,a.A)(o.title,t),children:r?d:(0,i.jsx)(l.A,{to:c,children:d})})}var d=n(1312),m=n(5846),u=n(6266);const g={container:"container_mt6G"};function h(e){let{readingTime:t}=e;const n=function(){const{selectMessage:e}=(0,m.W)();return t=>{const n=Math.ceil(t);return e(n,(0,d.T)({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:n}))}}();return(0,i.jsx)(i.Fragment,{children:n(t)})}function x(e){let{date:t,formattedDate:n}=e;return(0,i.jsx)("time",{dateTime:t,children:n})}function f(){return(0,i.jsx)(i.Fragment,{children:" \xb7 "})}function p(e){let{className:t}=e;const{metadata:n}=(0,s.e7)(),{date:r,readingTime:l}=n,o=(0,u.i)({day:"numeric",month:"long",year:"numeric",timeZone:"UTC"});return(0,i.jsxs)("div",{className:(0,a.A)(g.container,"margin-vert--md",t),children:[(0,i.jsx)(x,{date:r,formattedDate:(c=r,o.format(new Date(c)))}),void 0!==l&&(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(f,{}),(0,i.jsx)(h,{readingTime:l})]})]});var c}var v=n(6913);const j={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function b(e){let{className:t}=e;const{metadata:{authors:n},assets:r}=(0,s.e7)();if(0===n.length)return null;const l=n.every((e=>{let{name:t}=e;return!t})),o=1===n.length;return(0,i.jsx)("div",{className:(0,a.A)("margin-top--md margin-bottom--sm",l?j.imageOnlyAuthorRow:"row",t),children:n.map(((e,t)=>(0,i.jsx)("div",{className:(0,a.A)(!l&&(o?"col col--12":"col col--6"),l?j.imageOnlyAuthorCol:j.authorCol),children:(0,i.jsx)(v.A,{author:{...e,imageURL:r.authorsImageUrls[t]??e.imageURL}})},t)))})}function A(){return(0,i.jsxs)("header",{children:[(0,i.jsx)(c,{}),(0,i.jsx)(p,{}),(0,i.jsx)(b,{})]})}var N=n(440),_=n(5533);function L(e){let{children:t,className:n}=e;const{isBlogPostPage:r}=(0,s.e7)();return(0,i.jsx)("div",{id:r?N.LU:void 0,className:(0,a.A)("markdown",n),children:(0,i.jsx)(_.A,{children:t})})}var y=n(7559),C=n(4336),T=n(2053);function k(){return(0,i.jsx)("b",{children:(0,i.jsx)(d.A,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts",children:"Read more"})})}function H(e){const{blogPostTitle:t,...n}=e;return(0,i.jsx)(l.A,{"aria-label":(0,d.T)({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}),...n,children:(0,i.jsx)(k,{})})}function w(){const{metadata:e,isBlogPostPage:t}=(0,s.e7)(),{tags:n,title:r,editUrl:l,hasTruncateMarker:o,lastUpdatedBy:c,lastUpdatedAt:d}=e,m=!t&&o,u=n.length>0;if(!(u||m||l))return null;if(t){const e=!!(l||d||c);return(0,i.jsxs)("footer",{className:"docusaurus-mt-lg",children:[u&&(0,i.jsx)("div",{className:(0,a.A)("row","margin-top--sm",y.G.blog.blogFooterEditMetaRow),children:(0,i.jsx)("div",{className:"col",children:(0,i.jsx)(T.A,{tags:n})})}),e&&(0,i.jsx)(C.A,{className:(0,a.A)("margin-top--sm",y.G.blog.blogFooterEditMetaRow),editUrl:l,lastUpdatedAt:d,lastUpdatedBy:c})]})}return(0,i.jsxs)("footer",{className:"row docusaurus-mt-lg",children:[u&&(0,i.jsx)("div",{className:(0,a.A)("col",{"col--9":m}),children:(0,i.jsx)(T.A,{tags:n})}),m&&(0,i.jsx)("div",{className:(0,a.A)("col text--right",{"col--3":u}),children:(0,i.jsx)(H,{blogPostTitle:r,to:e.permalink})})]})}function O(e){let{children:t,className:n}=e;const l=function(){const{isBlogPostPage:e}=(0,s.e7)();return e?void 0:"margin-bottom--xl"}();return(0,i.jsxs)(r,{className:(0,a.A)(l,n),children:[(0,i.jsx)(A,{}),(0,i.jsx)(L,{children:t}),(0,i.jsx)(w,{})]})}},3858:(e,t,n)=>{n.r(t),n.d(t,{default:()=>j});n(6540);var a=n(4164),s=n(1213),i=n(7559),r=n(4096),l=n(8027),o=n(2907),c=n(1312),d=n(9022),m=n(4848);function u(e){const{nextItem:t,prevItem:n}=e;return(0,m.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,c.T)({id:"theme.blog.post.paginator.navAriaLabel",message:"Blog post page navigation",description:"The ARIA label for the blog posts pagination"}),children:[n&&(0,m.jsx)(d.A,{...n,subLabel:(0,m.jsx)(c.A,{id:"theme.blog.post.paginator.newerPost",description:"The blog post button label to navigate to the newer/previous post",children:"Newer post"})}),t&&(0,m.jsx)(d.A,{...t,subLabel:(0,m.jsx)(c.A,{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(){const{assets:e,metadata:t}=(0,r.e7)(),{title:n,description:a,date:i,tags:l,authors:o,frontMatter:c}=t,{keywords:d}=c,u=e.image??c.image;return(0,m.jsxs)(s.be,{title:n,description:a,keywords:d,image:u,children:[(0,m.jsx)("meta",{property:"og:type",content:"article"}),(0,m.jsx)("meta",{property:"article:published_time",content:i}),o.some((e=>e.url))&&(0,m.jsx)("meta",{property:"article:author",content:o.map((e=>e.url)).filter(Boolean).join(",")}),l.length>0&&(0,m.jsx)("meta",{property:"article:tag",content:l.map((e=>e.label)).join(",")})]})}var h=n(5260);function x(){const e=(0,r.J_)();return(0,m.jsx)(h.A,{children:(0,m.jsx)("script",{type:"application/ld+json",children:JSON.stringify(e)})})}var f=n(7763),p=n(1689);function v(e){let{sidebar:t,children:n}=e;const{metadata:a,toc:s}=(0,r.e7)(),{nextItem:i,prevItem:c,frontMatter:d}=a,{hide_table_of_contents:g,toc_min_heading_level:h,toc_max_heading_level:x}=d;return(0,m.jsxs)(l.A,{sidebar:t,toc:!g&&s.length>0?(0,m.jsx)(f.A,{toc:s,minHeadingLevel:h,maxHeadingLevel:x}):void 0,children:[(0,m.jsx)(p.A,{metadata:a}),(0,m.jsx)(o.A,{children:n}),(i||c)&&(0,m.jsx)(u,{nextItem:i,prevItem:c})]})}function j(e){const t=e.content;return(0,m.jsx)(r.in,{content:e.content,isBlogPostPage:!0,children:(0,m.jsxs)(s.e3,{className:(0,a.A)(i.G.wrapper.blogPages,i.G.page.blogPostPage),children:[(0,m.jsx)(g,{}),(0,m.jsx)(x,{}),(0,m.jsx)(v,{sidebar:e.sidebar,children:(0,m.jsx)(t,{})})]})})}},2234:(e,t,n)=>{n.d(t,{A:()=>c});n(6540);var a=n(4164),s=n(4084),i=n(7559),r=n(7293),l=n(4848);function o(e){let{className:t}=e;return(0,l.jsx)(r.A,{type:"caution",title:(0,l.jsx)(s.Rc,{}),className:(0,a.A)(t,i.G.common.unlistedBanner),children:(0,l.jsx)(s.Uh,{})})}function c(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(s.AE,{}),(0,l.jsx)(o,{...e})]})}},1689:(e,t,n)=>{n.d(t,{A:()=>d});n(6540);var a=n(4164),s=n(4084),i=n(7559),r=n(7293),l=n(4848);function o(e){let{className:t}=e;return(0,l.jsx)(r.A,{type:"caution",title:(0,l.jsx)(s.Yh,{}),className:(0,a.A)(t,i.G.common.draftBanner),children:(0,l.jsx)(s.TT,{})})}var c=n(2234);function d(e){let{metadata:t}=e;const{unlisted:n,frontMatter:a}=t;return(0,l.jsxs)(l.Fragment,{children:[(n||a.unlisted)&&(0,l.jsx)(c.A,{}),a.draft&&(0,l.jsx)(o,{})]})}},9022:(e,t,n)=>{n.d(t,{A:()=>r});n(6540);var a=n(4164),s=n(8774),i=n(4848);function r(e){const{permalink:t,title:n,subLabel:r,isNext:l}=e;return(0,i.jsxs)(s.A,{className:(0,a.A)("pagination-nav__link",l?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[r&&(0,i.jsx)("div",{className:"pagination-nav__sublabel",children:r}),(0,i.jsx)("div",{className:"pagination-nav__label",children:n})]})}},7763:(e,t,n)=>{n.d(t,{A:()=>c});n(6540);var a=n(4164),s=n(5195);const i={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var r=n(4848);const l="table-of-contents__link toc-highlight",o="table-of-contents__link--active";function c(e){let{className:t,...n}=e;return(0,r.jsx)("div",{className:(0,a.A)(i.tableOfContents,"thin-scrollbar",t),children:(0,r.jsx)(s.A,{...n,linkClassName:l,linkActiveClassName:o})})}},5195:(e,t,n)=>{n.d(t,{A:()=>x});var a=n(6540),s=n(6342);function i(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const a=n.slice(2,e.level);e.parentIndex=Math.max(...a),n[e.level]=t}));const a=[];return t.forEach((e=>{const{parentIndex:n,...s}=e;n>=0?t[n].children.push(s):a.push(s)})),a}function r(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return t.flatMap((e=>{const t=r({toc:e.children,minHeadingLevel:n,maxHeadingLevel:a});return function(e){return e.level>=n&&e.level<=a}(e)?[{...e,children:t}]:t}))}function l(e){const t=e.getBoundingClientRect();return t.top===t.bottom?l(e.parentNode):t}function o(e,t){let{anchorTopOffset:n}=t;const a=e.find((e=>l(e).top>=n));if(a){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(l(a))?a:e[e.indexOf(a)-1]??null}return e[e.length-1]??null}function c(){const e=(0,a.useRef)(0),{navbar:{hideOnScroll:t}}=(0,s.p)();return(0,a.useEffect)((()=>{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function d(e){const t=(0,a.useRef)(void 0),n=c();(0,a.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:a,linkActiveClassName:s,minHeadingLevel:i,maxHeadingLevel:r}=e;function l(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(a),l=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const a=[];for(let s=t;s<=n;s+=1)a.push(`h${s}.anchor`);return Array.from(document.querySelectorAll(a.join()))}({minHeadingLevel:i,maxHeadingLevel:r}),c=o(l,{anchorTopOffset:n.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,n){n?(t.current&&t.current!==e&&t.current.classList.remove(s),e.classList.add(s),t.current=e):e.classList.remove(s)}(e,e===d)}))}return document.addEventListener("scroll",l),document.addEventListener("resize",l),l(),()=>{document.removeEventListener("scroll",l),document.removeEventListener("resize",l)}}),[e,n])}var m=n(8774),u=n(4848);function g(e){let{toc:t,className:n,linkClassName:a,isChild:s}=e;return t.length?(0,u.jsx)("ul",{className:s?void 0:n,children:t.map((e=>(0,u.jsxs)("li",{children:[(0,u.jsx)(m.A,{to:`#${e.id}`,className:a??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,u.jsx)(g,{isChild:!0,toc:e.children,className:n,linkClassName:a})]},e.id)))}):null}const h=a.memo(g);function x(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:l="table-of-contents__link",linkActiveClassName:o,minHeadingLevel:c,maxHeadingLevel:m,...g}=e;const x=(0,s.p)(),f=c??x.tableOfContents.minHeadingLevel,p=m??x.tableOfContents.maxHeadingLevel,v=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:s}=e;return(0,a.useMemo)((()=>r({toc:i(t),minHeadingLevel:n,maxHeadingLevel:s})),[t,n,s])}({toc:t,minHeadingLevel:f,maxHeadingLevel:p});return d((0,a.useMemo)((()=>{if(l&&o)return{linkClassName:l,linkActiveClassName:o,minHeadingLevel:f,maxHeadingLevel:p}}),[l,o,f,p])),(0,u.jsx)(h,{toc:v,className:n,linkClassName:l,...g})}},6133:(e,t,n)=>{n.d(t,{A:()=>l});n(6540);var a=n(4164),s=n(8774);const i={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var r=n(4848);function l(e){let{permalink:t,label:n,count:l,description:o}=e;return(0,r.jsxs)(s.A,{href:t,title:o,className:(0,a.A)(i.tag,l?i.tagWithCount:i.tagRegular),children:[n,l&&(0,r.jsx)("span",{children:l})]})}},2053:(e,t,n)=>{n.d(t,{A:()=>o});n(6540);var a=n(4164),s=n(1312),i=n(6133);const r={tags:"tags_jXut",tag:"tag_QGVx"};var l=n(4848);function o(e){let{tags:t}=e;return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("b",{children:(0,l.jsx)(s.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,l.jsx)("ul",{className:(0,a.A)(r.tags,"padding--none","margin-left--sm"),children:t.map((e=>(0,l.jsx)("li",{className:r.tag,children:(0,l.jsx)(i.A,{...e})},e.permalink)))})]})}},4084:(e,t,n)=>{n.d(t,{AE:()=>o,Rc:()=>r,TT:()=>d,Uh:()=>l,Yh:()=>c});n(6540);var a=n(1312),s=n(5260),i=n(4848);function r(){return(0,i.jsx)(a.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function l(){return(0,i.jsx)(a.A,{id:"theme.contentVisibility.unlistedBanner.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 o(){return(0,i.jsx)(s.A,{children:(0,i.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function c(){return(0,i.jsx)(a.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function d(){return(0,i.jsx)(a.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}}}]); \ No newline at end of file diff --git a/assets/js/ccc49370.af21bf9f.js b/assets/js/ccc49370.af21bf9f.js deleted file mode 100644 index e063cfc2..00000000 --- a/assets/js/ccc49370.af21bf9f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[249],{3858:(e,t,n)=>{n.r(t),n.d(t,{default:()=>j});n(6540);var i=n(4164),a=n(1213),o=n(7559),r=n(7131),s=n(6535),l=n(4651),c=n(1312),d=n(9022),u=n(4848);function m(e){const{nextItem:t,prevItem:n}=e;return(0,u.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,c.T)({id:"theme.blog.post.paginator.navAriaLabel",message:"Blog post page navigation",description:"The ARIA label for the blog posts pagination"}),children:[n&&(0,u.jsx)(d.A,{...n,subLabel:(0,u.jsx)(c.A,{id:"theme.blog.post.paginator.newerPost",description:"The blog post button label to navigate to the newer/previous post",children:"Newer Post"})}),t&&(0,u.jsx)(d.A,{...t,subLabel:(0,u.jsx)(c.A,{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(){const{assets:e,metadata:t}=(0,r.e)(),{title:n,description:i,date:o,tags:s,authors:l,frontMatter:c}=t,{keywords:d}=c,m=e.image??c.image;return(0,u.jsxs)(a.be,{title:n,description:i,keywords:d,image:m,children:[(0,u.jsx)("meta",{property:"og:type",content:"article"}),(0,u.jsx)("meta",{property:"article:published_time",content:o}),l.some((e=>e.url))&&(0,u.jsx)("meta",{property:"article:author",content:l.map((e=>e.url)).filter(Boolean).join(",")}),s.length>0&&(0,u.jsx)("meta",{property:"article:tag",content:s.map((e=>e.label)).join(",")})]})}var h=n(5260),f=n(6676);function p(){const e=(0,f.J)();return(0,u.jsx)(h.A,{children:(0,u.jsx)("script",{type:"application/ld+json",children:JSON.stringify(e)})})}var v=n(7763),x=n(996);function b(e){let{sidebar:t,children:n}=e;const{metadata:i,toc:a}=(0,r.e)(),{nextItem:o,prevItem:c,frontMatter:d,unlisted:g}=i,{hide_table_of_contents:h,toc_min_heading_level:f,toc_max_heading_level:p}=d;return(0,u.jsxs)(s.A,{sidebar:t,toc:!h&&a.length>0?(0,u.jsx)(v.A,{toc:a,minHeadingLevel:f,maxHeadingLevel:p}):void 0,children:[g&&(0,u.jsx)(x.A,{}),(0,u.jsx)(l.A,{children:n}),(o||c)&&(0,u.jsx)(m,{nextItem:o,prevItem:c})]})}function j(e){const t=e.content;return(0,u.jsx)(r.i,{content:e.content,isBlogPostPage:!0,children:(0,u.jsxs)(a.e3,{className:(0,i.A)(o.G.wrapper.blogPages,o.G.page.blogPostPage),children:[(0,u.jsx)(g,{}),(0,u.jsx)(p,{}),(0,u.jsx)(b,{sidebar:e.sidebar,children:(0,u.jsx)(t,{})})]})})}},7763:(e,t,n)=>{n.d(t,{A:()=>c});n(6540);var i=n(4164),a=n(5195);const o={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var r=n(4848);const s="table-of-contents__link toc-highlight",l="table-of-contents__link--active";function c(e){let{className:t,...n}=e;return(0,r.jsx)("div",{className:(0,i.A)(o.tableOfContents,"thin-scrollbar",t),children:(0,r.jsx)(a.A,{...n,linkClassName:s,linkActiveClassName:l})})}},5195:(e,t,n)=>{n.d(t,{A:()=>f});var i=n(6540),a=n(6342);function o(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const i=n.slice(2,e.level);e.parentIndex=Math.max(...i),n[e.level]=t}));const i=[];return t.forEach((e=>{const{parentIndex:n,...a}=e;n>=0?t[n].children.push(a):i.push(a)})),i}function r(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:i}=e;return t.flatMap((e=>{const t=r({toc:e.children,minHeadingLevel:n,maxHeadingLevel:i});return function(e){return e.level>=n&&e.level<=i}(e)?[{...e,children:t}]:t}))}function s(e){const t=e.getBoundingClientRect();return t.top===t.bottom?s(e.parentNode):t}function l(e,t){let{anchorTopOffset:n}=t;const i=e.find((e=>s(e).top>=n));if(i){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(s(i))?i:e[e.indexOf(i)-1]??null}return e[e.length-1]??null}function c(){const e=(0,i.useRef)(0),{navbar:{hideOnScroll:t}}=(0,a.p)();return(0,i.useEffect)((()=>{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function d(e){const t=(0,i.useRef)(void 0),n=c();(0,i.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:i,linkActiveClassName:a,minHeadingLevel:o,maxHeadingLevel:r}=e;function s(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(i),s=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const i=[];for(let a=t;a<=n;a+=1)i.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(i.join()))}({minHeadingLevel:o,maxHeadingLevel:r}),c=l(s,{anchorTopOffset:n.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,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",s),document.addEventListener("resize",s),s(),()=>{document.removeEventListener("scroll",s),document.removeEventListener("resize",s)}}),[e,n])}var u=n(8774),m=n(4848);function g(e){let{toc:t,className:n,linkClassName:i,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.A,{to:`#${e.id}`,className:i??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,m.jsx)(g,{isChild:!0,toc:e.children,className:n,linkClassName:i})]},e.id)))}):null}const h=i.memo(g);function f(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:s="table-of-contents__link",linkActiveClassName:l,minHeadingLevel:c,maxHeadingLevel:u,...g}=e;const f=(0,a.p)(),p=c??f.tableOfContents.minHeadingLevel,v=u??f.tableOfContents.maxHeadingLevel,x=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,i.useMemo)((()=>r({toc:o(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:p,maxHeadingLevel:v});return d((0,i.useMemo)((()=>{if(s&&l)return{linkClassName:s,linkActiveClassName:l,minHeadingLevel:p,maxHeadingLevel:v}}),[s,l,p,v])),(0,m.jsx)(h,{toc:x,className:n,linkClassName:s,...g})}},996:(e,t,n)=>{n.d(t,{A:()=>g});n(6540);var i=n(4164),a=n(1312),o=n(5260),r=n(4848);function s(){return(0,r.jsx)(a.A,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function l(){return(0,r.jsx)(a.A,{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)(o.A,{children:(0,r.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}var d=n(7559),u=n(7293);function m(e){let{className:t}=e;return(0,r.jsx)(u.A,{type:"caution",title:(0,r.jsx)(s,{}),className:(0,i.A)(t,d.G.common.unlistedBanner),children:(0,r.jsx)(l,{})})}function g(e){return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(c,{}),(0,r.jsx)(m,{...e})]})}},6676:(e,t,n)=>{n.d(t,{k:()=>d,J:()=>u});var i=n(6025),a=n(4586),o=n(6803);var r=n(7131);const s=e=>new Date(e).toISOString();function l(e){const t=e.map(m);return{author:1===t.length?t[0]:t}}function c(e,t,n){return e?{image:g({imageUrl:t(e,{absolute:!0}),caption:`title image for the blog post: ${n}`})}:{}}function d(e){const{siteConfig:t}=(0,a.A)(),{withBaseUrl:n}=(0,i.hH)(),{metadata:{blogDescription:o,blogTitle:r,permalink:d}}=e,u=`${t.url}${d}`;return{"@context":"https://schema.org","@type":"Blog","@id":u,mainEntityOfPage:u,headline:r,description:o,blogPost:e.items.map((e=>function(e,t,n){const{assets:i,frontMatter:a,metadata:o}=e,{date:r,title:d,description:u,lastUpdatedAt:m}=o,g=i.image??a.image,h=a.keywords??[],f=`${t.url}${o.permalink}`,p=m?s(m):void 0;return{"@type":"BlogPosting","@id":f,mainEntityOfPage:f,url:f,headline:d,name:d,description:u,datePublished:r,...p?{dateModified:p}:{},...l(o.authors),...c(g,n,d),...h?{keywords:h}:{}}}(e.content,t,n)))}}function u(){const e=function(){const e=(0,o.A)(),t=e?.data?.blogMetadata;if(!t)throw new Error("useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context");return t}(),{assets:t,metadata:n}=(0,r.e)(),{siteConfig:d}=(0,a.A)(),{withBaseUrl:u}=(0,i.hH)(),{date:m,title:g,description:h,frontMatter:f,lastUpdatedAt:p}=n,v=t.image??f.image,x=f.keywords??[],b=p?s(p):void 0,j=`${d.url}${n.permalink}`;return{"@context":"https://schema.org","@type":"BlogPosting","@id":j,mainEntityOfPage:j,url:j,headline:g,name:g,description:h,datePublished:m,...b?{dateModified:b}:{},...l(n.authors),...c(v,u,g),...x?{keywords:x}:{},isPartOf:{"@type":"Blog","@id":`${d.url}${e.blogBasePath}`,name:e.blogTitle}}}function m(e){return{"@type":"Person",...e.name?{name:e.name}:{},...e.title?{description:e.title}:{},...e.url?{url:e.url}:{},...e.email?{email:e.email}:{},...e.imageURL?{image:e.imageURL}:{}}}function g(e){let{imageUrl:t,caption:n}=e;return{"@type":"ImageObject","@id":t,url:t,contentUrl:t,caption:n}}}}]); \ No newline at end of file diff --git a/assets/js/cde7c749.2b3c96b8.js b/assets/js/cde7c749.2b3c96b8.js new file mode 100644 index 00000000..5bb3ef50 --- /dev/null +++ b/assets/js/cde7c749.2b3c96b8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8117],{1768:c=>{c.exports=JSON.parse('{"tags":[{"label":"laminas","permalink":"/LmcRbacMvc/blog/tags/laminas","count":2},{"label":"PHP","permalink":"/LmcRbacMvc/blog/tags/php","count":2},{"label":"lmcrbacmvc","permalink":"/LmcRbacMvc/blog/tags/lmcrbacmvc","count":1}]}')}}]); \ No newline at end of file diff --git a/assets/js/cde7c749.53f93f3a.js b/assets/js/cde7c749.53f93f3a.js deleted file mode 100644 index 6f9b5f20..00000000 --- a/assets/js/cde7c749.53f93f3a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[117],{1768:c=>{c.exports=JSON.parse('{"tags":[{"label":"laminas","permalink":"/LmcRbacMvc/blog/tags/laminas","count":2},{"label":"PHP","permalink":"/LmcRbacMvc/blog/tags/php","count":2},{"label":"lmcrbacmvc","permalink":"/LmcRbacMvc/blog/tags/lmcrbacmvc","count":1}]}')}}]); \ No newline at end of file diff --git a/assets/js/d970cabc.20417bf6.js b/assets/js/d970cabc.20417bf6.js new file mode 100644 index 00000000..6305c977 --- /dev/null +++ b/assets/js/d970cabc.20417bf6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4118],{6444:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>r,toc:()=>l});var o=i(4848),s=i(8453);const t={sidebar_position:1},a="Introduction",r={id:"intro",title:"Introduction",description:"LmcRbacMvc is a role-based access control Laminas MVC module to provide additional features on top of Laminas\\Permissions\\Rbac",source:"@site/versioned_docs/version-3.4/intro.md",sourceDirName:".",slug:"/intro",permalink:"/LmcRbacMvc/docs/intro",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/versioned_docs/version-3.4/intro.md",tags:[],version:"3.4",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",next:{title:"Requirements and Installation",permalink:"/LmcRbacMvc/docs/installation"}},c={},l=[{value:"Why should I use an authorization module?",id:"why-should-i-use-an-authorization-module",level:2},{value:"What is the Rbac model?",id:"what-is-the-rbac-model",level:2},{value:"How can I integrate LmcRbacMvc into my application?",id:"how-can-i-integrate-lmcrbacmvc-into-my-application",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"introduction",children:"Introduction"})}),"\n",(0,o.jsx)(n.p,{children:"LmcRbacMvc is a role-based access control Laminas MVC module to provide additional features on top of Laminas\\Permissions\\Rbac"}),"\n",(0,o.jsxs)(n.p,{children:["LmcRbacMvc is part of the ",(0,o.jsx)(n.a,{href:"https://lm-commons.github.io",children:"LM-Commons"})," series of community developed packages for Laminas."]}),"\n",(0,o.jsx)(n.p,{children:"LM-Commons is a GitHub organization dedicated to the collaborative\nand community-driven long-term maintenance of packages & libraries based on the Laminas MVC and Components."}),"\n",(0,o.jsxs)(n.admonition,{type:"tip",children:[(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Important Note:"})}),(0,o.jsxs)(n.p,{children:["If you are migrating from ZfcRbac v2, there are breaking changes to take into account. See the ",(0,o.jsx)(n.a,{href:"/LmcRbacMvc/docs/installation#upgrade",children:"Upgrade"})," section for details."]})]}),"\n",(0,o.jsx)(n.h2,{id:"why-should-i-use-an-authorization-module",children:"Why should I use an authorization module?"}),"\n",(0,o.jsxs)(n.p,{children:["The authorization part of an application is an essential aspect of securing your application.\nWhile the ",(0,o.jsx)(n.em,{children:"authentication"})," part tells you who is using your website, the ",(0,o.jsx)(n.em,{children:"authorization"})," answers if the given identity has the permission to\nperform specific actions."]}),"\n",(0,o.jsx)(n.h2,{id:"what-is-the-rbac-model",children:"What is the Rbac model?"}),"\n",(0,o.jsxs)(n.p,{children:["Rbac stands for ",(0,o.jsx)(n.strong,{children:"role-based access control"}),". We use a very simple (albeit powerful) implementation of this model\nthrough the use of the ",(0,o.jsx)(n.a,{href:"https://github.com/zf-fr/rbac",children:"zf-fr/rbac"})," library."]}),"\n",(0,o.jsx)(n.p,{children:"The basic idea of Rbac is to use roles and permissions:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Users"})," can have one or many ",(0,o.jsx)(n.strong,{children:"Roles"})]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Roles"})," request access to ",(0,o.jsx)(n.strong,{children:"Permissions"})]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Permissions"})," are granted to ",(0,o.jsx)(n.strong,{children:"Roles"})]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"By default, LmcRbacMvc can be used for two kinds of Rbac model:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Flat RBAC model: in this model, roles cannot have children. This is ideal for smaller applications, as it is easier\nto understand, and the database design is simpler (no need for a join table)."}),"\n",(0,o.jsx)(n.li,{children:"Hierarchical RBAC model: in this model, roles can have child roles. When evaluating if a given role has a\npermission, this model also checks recursively if any of its child roles also have the permission."}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"how-can-i-integrate-lmcrbacmvc-into-my-application",children:"How can I integrate LmcRbacMvc into my application?"}),"\n",(0,o.jsx)(n.p,{children:"LmcRbacMvc offers multiple ways to protect your application:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Using ",(0,o.jsx)(n.strong,{children:"Guards"}),': these classes act as "firewalls" that block access to routes and/or controllers. Guards are usually\nconfigured using PHP arrays, and are executed early in the MVC dispatch process. Typically this happens right after\nthe route has been matched.']}),"\n",(0,o.jsxs)(n.li,{children:["Using ",(0,o.jsx)(n.strong,{children:"AuthorizationService"}),": a complementary method is to use the ",(0,o.jsx)(n.code,{children:"AuthorizationService"})," class and inject it into your\nservice classes to protect them from unwanted access."]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"While it is advised to use both methods to make your application even more secure, this is completely optional and you\ncan choose either of them independently."}),"\n",(0,o.jsx)(n.p,{children:"To find out about how you can easily make your existing application more secure, please refer to the following section:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"/LmcRbacMvc/docs/cookbook#a-real-world-application",children:"Cookbook: A real world example"})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>a,x:()=>r});var o=i(6540);const s={},t=o.createContext(s);function a(e){const n=o.useContext(t);return o.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:a(e.components),o.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d9e16301.d4f1b334.js b/assets/js/d9e16301.d4f1b334.js deleted file mode 100644 index e223a855..00000000 --- a/assets/js/d9e16301.d4f1b334.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[416],{1562:(s,t,e)=>{e.r(t),e.d(t,{assets:()=>a,contentTitle:()=>c,default:()=>m,frontMatter:()=>i,metadata:()=>r,toc:()=>d});var o=e(4848),n=e(8453);const i={sidebar_position:20,title:"Support"},c=void 0,r={id:"support",title:"Support",description:"- File issues at https://github.com/LM-Commons/LmcRbacMvc/issues.",source:"@site/docs/support.md",sourceDirName:".",slug:"/support",permalink:"/LmcRbacMvc/docs/support",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/docs/support.md",tags:[],version:"current",sidebarPosition:20,frontMatter:{sidebar_position:20,title:"Support"},sidebar:"tutorialSidebar",previous:{title:"Cookbook",permalink:"/LmcRbacMvc/docs/cookbook"}},a={},d=[{value:"Notices and Disclaimers",id:"notices-and-disclaimers",level:5}];function l(s){const t={a:"a",h5:"h5",li:"li",p:"p",ul:"ul",...(0,n.R)(),...s.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:["File issues at ",(0,o.jsx)(t.a,{href:"https://github.com/LM-Commons/LmcRbacMvc/issues",children:"https://github.com/LM-Commons/LmcRbacMvc/issues"}),"."]}),"\n",(0,o.jsxs)(t.li,{children:["Ask questions in the ",(0,o.jsx)(t.a,{href:"https://join.slack.com/t/lm-commons/shared_invite/zt-2gankt2wj-FTS45hp1W~JEj1tWvDsUHQ",children:"LM-Commons Slack"})," chat."]}),"\n"]}),"\n",(0,o.jsx)(t.h5,{id:"notices-and-disclaimers",children:"Notices and Disclaimers"}),"\n",(0,o.jsx)(t.p,{children:"This is not an official Laminas Project organization."}),"\n",(0,o.jsx)(t.p,{children:"Issues and questions related to the Laminas MVC and components\nshould be addressed to the Laminas Project organisation."}),"\n",(0,o.jsx)(t.p,{children:"Laminas is a trademark of the Laminas Project, a Series of LF Projects, LLC."})]})}function m(s={}){const{wrapper:t}={...(0,n.R)(),...s.components};return t?(0,o.jsx)(t,{...s,children:(0,o.jsx)(l,{...s})}):l(s)}},8453:(s,t,e)=>{e.d(t,{R:()=>c,x:()=>r});var o=e(6540);const n={},i=o.createContext(n);function c(s){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof s?s(t):{...t,...s}}),[t,s])}function r(s){let t;return t=s.disableParentContext?"function"==typeof s.components?s.components(n):s.components||n:c(s.components),o.createElement(i.Provider,{value:t},s.children)}}}]); \ No newline at end of file diff --git a/assets/js/e713aeb5.733c029f.js b/assets/js/e713aeb5.733c029f.js new file mode 100644 index 00000000..4a470353 --- /dev/null +++ b/assets/js/e713aeb5.733c029f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[214],{6112:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>l,toc:()=>c});var o=i(4848),t=i(8453);const s={sidebar_position:2,sidebar_label:"Requirements and Installation"},r="Requirements and Installation",l={id:"installation",title:"Requirements and Installation",description:"Requirements",source:"@site/versioned_docs/version-3.4/installation.md",sourceDirName:".",slug:"/installation",permalink:"/LmcRbacMvc/docs/installation",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/versioned_docs/version-3.4/installation.md",tags:[],version:"3.4",sidebarPosition:2,frontMatter:{sidebar_position:2,sidebar_label:"Requirements and Installation"},sidebar:"tutorialSidebar",previous:{title:"Introduction",permalink:"/LmcRbacMvc/docs/intro"},next:{title:"Quick Start",permalink:"/LmcRbacMvc/docs/quick-start"}},a={},c=[{value:"Requirements",id:"requirements",level:2},{value:"Optional",id:"optional",level:2},{value:"Installation",id:"installation",level:2},{value:"Upgrade",id:"upgrade",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"requirements-and-installation",children:"Requirements and Installation"})}),"\n",(0,o.jsx)(n.h2,{id:"requirements",children:"Requirements"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"PHP 8.0 or higher"}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"https://github.com/zf-fr/rbac",children:"lm-commons/rbac component v1"}),": this is actually a prototype for the ZF3 Rbac component."]}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"http://www.github.com/laminas",children:"Laminas Components 2.x | 3.x or higher"})}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"optional",children:"Optional"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"https://github.com/doctrine/DoctrineModule",children:"DoctrineModule"}),": if you want to use some built-in role and permission providers."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"https://github.com/laminas/Laminas%5CDeveloperTools",children:"Laminas\\DeveloperTools"}),": if you want to have useful stats added to\nthe Laminas Developer toolbar."]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,o.jsxs)(n.p,{children:["LmcRbacMvc only officially supports installation through Composer. For Composer documentation, please refer to\n",(0,o.jsx)(n.a,{href:"http://getcomposer.org/",children:"getcomposer.org"}),"."]}),"\n",(0,o.jsx)(n.p,{children:"Install the module:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:"$ composer require lm-commons/lmc-rbac-mvc:^3.0\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Enable the module by adding ",(0,o.jsx)(n.code,{children:"LmcRbacMvc"})," key to your ",(0,o.jsx)(n.code,{children:"application.config.php"})," or ",(0,o.jsx)(n.code,{children:"modules.config.php"})," file. Customize the module by copy-pasting\nthe ",(0,o.jsx)(n.code,{children:"lmc_rbac.global.php.dist"})," file to your ",(0,o.jsx)(n.code,{children:"config/autoload"})," folder."]}),"\n",(0,o.jsx)(n.h2,{id:"upgrade",children:"Upgrade"}),"\n",(0,o.jsx)(n.p,{children:"LmcRbacMvc introduces breaking changes from zfcrbac v2:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["[BC] The namespace has been changed from ",(0,o.jsx)(n.code,{children:"ZfcRbac"})," to ",(0,o.jsx)(n.code,{children:"LmcRbacMvc"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["[BC] The key ",(0,o.jsx)(n.code,{children:"zfc_rbac"})," in autoload and module config files has been replaced\nby the ",(0,o.jsx)(n.code,{children:"lmc_rbac"})," key."]}),"\n",(0,o.jsx)(n.li,{children:"Requires PHP 8.0 or later"}),"\n",(0,o.jsx)(n.li,{children:"Requires Laminas MVC components 3.x or later"}),"\n",(0,o.jsx)(n.li,{children:"Uses PSR-4 autoload"}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>l});var o=i(6540);const t={},s=o.createContext(t);function r(e){const n=o.useContext(s);return o.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(t):e.components||t:r(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ee696d42.48cd68ac.js b/assets/js/ee696d42.48cd68ac.js new file mode 100644 index 00000000..6e52cbd3 --- /dev/null +++ b/assets/js/ee696d42.48cd68ac.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7018],{3531:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>r,toc:()=>m});var n=o(4848),c=o(8453);const s={slug:"welcome",title:"Welcome",authors:["ericr"],tags:["laminas","PHP"]},i=void 0,r={permalink:"/LmcRbacMvc/blog/welcome",editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/blog/2022-08-02-welcome.md",source:"@site/blog/2022-08-02-welcome.md",title:"Welcome",description:"Welcome to the new documentation website for the LM-Commons organization.",date:"2022-08-02T00:00:00.000Z",tags:[{inline:!0,label:"laminas",permalink:"/LmcRbacMvc/blog/tags/laminas"},{inline:!0,label:"PHP",permalink:"/LmcRbacMvc/blog/tags/php"}],readingTime:.155,hasTruncateMarker:!1,authors:[{name:"Eric Richer",title:"LM-Commons Administrator",url:"https://github.com/visto9259",imageURL:"https://github.com/visto9259.png",key:"ericr",page:null}],frontMatter:{slug:"welcome",title:"Welcome",authors:["ericr"],tags:["laminas","PHP"]},unlisted:!1,prevItem:{title:"New documentation",permalink:"/LmcRbacMvc/blog/new-documentation"}},a={authorsImageUrls:[void 0]},m=[];function l(e){const t={p:"p",...(0,c.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"Welcome to the new documentation website for the LM-Commons organization."}),"\n",(0,n.jsx)(t.p,{children:"This site is work in progress and the intent is obviously to keep it current with updates to the LM-Commons packages."})]})}function u(e={}){const{wrapper:t}={...(0,c.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>i,x:()=>r});var n=o(6540);const c={},s=n.createContext(c);function i(e){const t=n.useContext(s);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(c):e.components||c:i(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ee696d42.f654555a.js b/assets/js/ee696d42.f654555a.js deleted file mode 100644 index 3b692900..00000000 --- a/assets/js/ee696d42.f654555a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[18],{3531:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>r,toc:()=>m});var n=o(4848),c=o(8453);const s={slug:"welcome",title:"Welcome",authors:["ericr"],tags:["laminas","PHP"]},i=void 0,r={permalink:"/LmcRbacMvc/blog/welcome",editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/blog/2022-08-02-welcome.md",source:"@site/blog/2022-08-02-welcome.md",title:"Welcome",description:"Welcome to the new documentation website for the LM-Commons organization.",date:"2022-08-02T00:00:00.000Z",tags:[{inline:!0,label:"laminas",permalink:"/LmcRbacMvc/blog/tags/laminas"},{inline:!0,label:"PHP",permalink:"/LmcRbacMvc/blog/tags/php"}],readingTime:.155,hasTruncateMarker:!1,authors:[{name:"Eric Richer",title:"LM-Commons Administrator",url:"https://github.com/visto9259",imageURL:"https://github.com/visto9259.png",key:"ericr"}],frontMatter:{slug:"welcome",title:"Welcome",authors:["ericr"],tags:["laminas","PHP"]},unlisted:!1,prevItem:{title:"New documentation",permalink:"/LmcRbacMvc/blog/new-documentation"}},a={authorsImageUrls:[void 0]},m=[];function l(e){const t={p:"p",...(0,c.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"Welcome to the new documentation website for the LM-Commons organization."}),"\n",(0,n.jsx)(t.p,{children:"This site is work in progress and the intent is obviously to keep it current with updates to the LM-Commons packages."})]})}function u(e={}){const{wrapper:t}={...(0,c.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>i,x:()=>r});var n=o(6540);const c={},s=n.createContext(c);function i(e){const t=n.useContext(s);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(c):e.components||c:i(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f6027d55.720fd4c4.js b/assets/js/f6027d55.720fd4c4.js deleted file mode 100644 index 3e79a44c..00000000 --- a/assets/js/f6027d55.720fd4c4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[246],{2712:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>a,default:()=>p,frontMatter:()=>i,metadata:()=>c,toc:()=>l});var r=n(4848),s=n(8453);const i={sidebar_position:6},a="Strategies",c={id:"strategies",title:"Strategies",description:"In this section, you will learn:",source:"@site/docs/strategies.md",sourceDirName:".",slug:"/strategies",permalink:"/LmcRbacMvc/docs/strategies",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/docs/strategies.md",tags:[],version:"current",sidebarPosition:6,frontMatter:{sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"Guards",permalink:"/LmcRbacMvc/docs/guards"},next:{title:"Using the Authorization Service",permalink:"/LmcRbacMvc/docs/using-the-authorization-service"}},o={},l=[{value:"What are strategies?",id:"what-are-strategies",level:2},{value:"Built-in strategies",id:"built-in-strategies",level:2},{value:"RedirectStrategy",id:"redirectstrategy",level:3},{value:"UnauthorizedStrategy",id:"unauthorizedstrategy",level:3},{value:"Creating custom strategies",id:"creating-custom-strategies",level:2}];function d(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"strategies",children:"Strategies"}),"\n",(0,r.jsx)(t.p,{children:"In this section, you will learn:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"What strategies are"}),"\n",(0,r.jsx)(t.li,{children:"How to use built-in strategies"}),"\n",(0,r.jsx)(t.li,{children:"How to create custom strategies"}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"what-are-strategies",children:"What are strategies?"}),"\n",(0,r.jsxs)(t.p,{children:["A strategy is an object that listens to the ",(0,r.jsx)(t.code,{children:"MvcEvent::EVENT_DISPATCH_ERROR"})," event. It is used to describe what\nhappens when access to a resource is unauthorized by LmcRbacMvc."]}),"\n",(0,r.jsxs)(t.p,{children:["LmcRbacMvc strategies all check if an ",(0,r.jsx)(t.code,{children:"LmcRbacMvc\\Exception\\UnauthorizedExceptionInterface"})," has been thrown."]}),"\n",(0,r.jsxs)(t.p,{children:["By default, LmcRbacMvc does not register any strategy for you. The best place to register it is in your ",(0,r.jsx)(t.code,{children:"onBootstrap"}),"\nmethod of the ",(0,r.jsx)(t.code,{children:"Module.php"})," class:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-php",children:"public function onBootstrap(MvcEvent $e)\n{\n $app = $e->getApplication();\n $sm = $app->getServiceManager();\n $em = $app->getEventManager();\n \n $listener = $sm->get(\\LmcRbacMvc\\View\\Strategy\\UnauthorizedStrategy::class);\n $listener->attach($em);\n}\n"})}),"\n",(0,r.jsx)(t.h2,{id:"built-in-strategies",children:"Built-in strategies"}),"\n",(0,r.jsxs)(t.p,{children:["LmcRbacMvc comes with two built-in strategies: ",(0,r.jsx)(t.code,{children:"RedirectStrategy"})," and ",(0,r.jsx)(t.code,{children:"UnauthorizedStrategy"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"redirectstrategy",children:"RedirectStrategy"}),"\n",(0,r.jsx)(t.p,{children:"This strategy allows your application to redirect any unauthorized request to another route by optionally appending the previous\nURL as a query parameter."}),"\n",(0,r.jsx)(t.p,{children:"To register it, copy-paste this code into your Module.php class:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-php",children:"public function onBootstrap(MvcEvent $e)\n{\n $app = $e->getApplication();\n $sm = $app->getServiceManager();\n $em = $app->getEventManager();\n \n $listener = $sm->get(\\LmcRbacMvc\\View\\Strategy\\RedirectStrategy::class);\n $listener->attach($em);\n}\n"})}),"\n",(0,r.jsxs)(t.p,{children:["You can configure the strategy using the ",(0,r.jsx)(t.code,{children:"redirect_strategy"})," subkey:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'redirect_strategy' => [\n 'redirect_when_connected' => true,\n 'redirect_to_route_connected' => 'home',\n 'redirect_to_route_disconnected' => 'login',\n 'append_previous_uri' => true,\n 'previous_uri_query_key' => 'redirectTo'\n ],\n ]\n];\n"})}),"\n",(0,r.jsxs)(t.p,{children:["If users try to access an unauthorized resource (eg.: ",(0,r.jsx)(t.a,{href:"http://www.example.com/delete",children:"http://www.example.com/delete"}),'), they will be\nredirected to the "login" route if is not connected and to the "home" route otherwise (it must exist in your route configuration\nof course) with the previous URL appended : ',(0,r.jsx)(t.a,{href:"http://www.example.com/login?redirectTo=http://www.example.com/delete",children:"http://www.example.com/login?redirectTo=http://www.example.com/delete"})]}),"\n",(0,r.jsxs)(t.p,{children:["You can prevent redirection when a user is connected (i.e. so that the user gets a 403 page) by setting ",(0,r.jsx)(t.code,{children:"redirect_when_connected"})," to ",(0,r.jsx)(t.code,{children:"false"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"unauthorizedstrategy",children:"UnauthorizedStrategy"}),"\n",(0,r.jsx)(t.p,{children:"This strategy allows your application to render a template on any unauthorized request."}),"\n",(0,r.jsx)(t.p,{children:"To register it, copy-paste this code into your Module.php class:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-php",children:"public function onBootstrap(MvcEvent $e)\n{\n $app = $e->getApplication();\n $sm = $app->getServiceManager();\n $em = $app->getEventManager();\n \n $listener = $sm->get(\\LmcRbacMvc\\View\\Strategy\\UnauthorizedStrategy::class);\n $listener->attach($em);\n}\n"})}),"\n",(0,r.jsxs)(t.p,{children:["You can configure the strategy using the ",(0,r.jsx)(t.code,{children:"unauthorized_strategy"})," subkey:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'unauthorized_strategy' => [\n 'template' => 'error/custom-403'\n ],\n ]\n];\n"})}),"\n",(0,r.jsxs)(t.blockquote,{children:["\n",(0,r.jsxs)(t.p,{children:["By default, LmcRbacMvc uses a template called ",(0,r.jsx)(t.code,{children:"error/403"}),"."]}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"creating-custom-strategies",children:"Creating custom strategies"}),"\n",(0,r.jsxs)(t.p,{children:["Creating a custom strategy is rather easy. Let's say we want to create a strategy that integrates with\nthe ",(0,r.jsx)(t.a,{href:"https://github.com/laminas-api-tools/api-tools-api-problem",children:"ApiProblem"})," Laminas Api Tools module:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-php",children:"namespace Application\\View\\Strategy;\n\nuse Laminas\\Http\\Response as HttpResponse;\nuse Laminas\\Mvc\\MvcEvent;\nuse Laminas\\ApiTools\\ApiProblem\\ApiProblem;\nuse Laminas\\ApiTools\\ApiProblem\\ApiProblemResponse;\nuse LmcRbacMvc\\View\\Strategy\\AbstractStrategy;\nuse LmcRbacMvc\\Exception\\UnauthorizedExceptionInterface;\n\nclass ApiProblemStrategy extends AbstractStrategy\n{\n public function onError(MvcEvent $event)\n {\n // Do nothing if no error or if response is not HTTP response\n if (!($exception = $event->getParam('exception') instanceof UnauthorizedExceptionInterface)\n || ($result = $event->getResult() instanceof HttpResponse)\n || !($response = $event->getResponse() instanceof HttpResponse)\n ) {\n return;\n }\n\n return new ApiProblemResponse(new ApiProblem($exception->getMessage()));\n }\n}\n"})}),"\n",(0,r.jsx)(t.p,{children:"Register your strategy:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-php",children:"public function onBootstrap(EventInterface $e)\n{\n $e->getTarget()\n ->getEventManager()\n ->attach(new ApiProblemStrategy());\n}\n"})})]})}function p(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>c});var r=n(6540);const s={},i=r.createContext(s);function a(e){const t=r.useContext(i);return r.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(s):e.components||s:a(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f6027d55.b2505fcb.js b/assets/js/f6027d55.b2505fcb.js new file mode 100644 index 00000000..ff3d54b1 --- /dev/null +++ b/assets/js/f6027d55.b2505fcb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[246],{2712:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>a,default:()=>h,frontMatter:()=>i,metadata:()=>c,toc:()=>l});var r=n(4848),s=n(8453);const i={title:"Strategies",sidebar_position:3},a=void 0,c={id:"strategies",title:"Strategies",description:"What are strategies?",source:"@site/docs/strategies.md",sourceDirName:".",slug:"/strategies",permalink:"/LmcRbacMvc/docs/next/strategies",draft:!1,unlisted:!1,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/docs/strategies.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"Strategies",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Guards",permalink:"/LmcRbacMvc/docs/next/guards"},next:{title:"Authorization Service",permalink:"/LmcRbacMvc/docs/next/using-the-authorization-service"}},o={},l=[{value:"What are strategies?",id:"what-are-strategies",level:2},{value:"Built-in strategies",id:"built-in-strategies",level:2},{value:"RedirectStrategy",id:"redirectstrategy",level:3},{value:"UnauthorizedStrategy",id:"unauthorizedstrategy",level:3},{value:"Creating custom strategies",id:"creating-custom-strategies",level:2}];function d(e){const t={a:"a",blockquote:"blockquote",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h2,{id:"what-are-strategies",children:"What are strategies?"}),"\n",(0,r.jsxs)(t.p,{children:["A strategy is an object that listens to the ",(0,r.jsx)(t.code,{children:"MvcEvent::EVENT_DISPATCH_ERROR"})," event. It is used to describe what\nhappens when access to a resource is unauthorized by LmcRbacMvc."]}),"\n",(0,r.jsxs)(t.p,{children:["LmcRbacMvc strategies all check if an ",(0,r.jsx)(t.code,{children:"Lmc\\Rbac\\Mvc\\Exception\\UnauthorizedExceptionInterface"})," has been thrown."]}),"\n",(0,r.jsxs)(t.p,{children:["By default, LmcRbacMvc does not register any strategy for you. The best place to register it in a config file under the\n",(0,r.jsx)(t.code,{children:"'listeners'"})," key:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-php",children:"return [\n // other configs...\n \n 'listeners' => [\n \\Lmc\\Rbac\\Mvc\\View\\Strategy\\UnauthorizedStrategy::class\n ],\n];\n"})}),"\n",(0,r.jsx)(t.h2,{id:"built-in-strategies",children:"Built-in strategies"}),"\n",(0,r.jsx)(t.p,{children:"LmcRbacMvc comes with two built-in strategies:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.code,{children:"\\Lmc\\Rbac\\Mvc\\View\\Strategy\\RedirectStrategy"})}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"\\Lmc\\Rbac\\Mvc\\View\\Strategy\\UnauthorizedStrategy"}),"."]}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"redirectstrategy",children:"RedirectStrategy"}),"\n",(0,r.jsx)(t.p,{children:"This strategy allows your application to redirect any unauthorized request to another route by optionally appending the previous\nURL as a query parameter."}),"\n",(0,r.jsx)(t.p,{children:"To register it, copy-paste this code into a configuration file:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-php",children:"return [\n // other configs...\n \n 'listeners' => [\n \\Lmc\\Rbac\\Mvc\\View\\Strategy\\RedirectStrategy::class\n ],\n];\n"})}),"\n",(0,r.jsxs)(t.p,{children:["You can configure the strategy using the ",(0,r.jsx)(t.code,{children:"redirect_strategy"})," subkey:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'redirect_strategy' => [\n 'redirect_when_connected' => true,\n 'redirect_to_route_connected' => 'home',\n 'redirect_to_route_disconnected' => 'login',\n 'append_previous_uri' => true,\n 'previous_uri_query_key' => 'redirectTo'\n ],\n ]\n];\n"})}),"\n",(0,r.jsxs)(t.p,{children:["If users try to access an unauthorized resource (eg.: ",(0,r.jsx)(t.a,{href:"http://www.example.com/delete",children:"http://www.example.com/delete"}),'), they will be\nredirected to the "login" route if is not connected and to the "home" route otherwise with the previous URL appended:']}),"\n",(0,r.jsxs)(t.blockquote,{children:["\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.a,{href:"http://www.example.com/login?redirectTo=http://www.example.com/delete",children:"http://www.example.com/login?redirectTo=http://www.example.com/delete"})}),"\n"]}),"\n",(0,r.jsxs)(t.p,{children:["You can prevent redirection when a user is connected (i.e. so that the user gets a 403 page) by setting ",(0,r.jsx)(t.code,{children:"redirect_when_connected"})," to ",(0,r.jsx)(t.code,{children:"false"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"unauthorizedstrategy",children:"UnauthorizedStrategy"}),"\n",(0,r.jsx)(t.p,{children:"This strategy allows your application to render a template on any unauthorized request."}),"\n",(0,r.jsx)(t.p,{children:"To register it, copy-paste this code into your Module.php class:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-php",children:"return [\n // other configs...\n \n 'listeners' => [\n \\Lmc\\Rbac\\Mvc\\View\\Strategy\\UnauthorizedStrategy::class\n ],\n];\n"})}),"\n",(0,r.jsxs)(t.p,{children:["You can configure the strategy using the ",(0,r.jsx)(t.code,{children:"unauthorized_strategy"})," subkey:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-php",children:"return [\n 'lmc_rbac' => [\n 'unauthorized_strategy' => [\n 'template' => 'error/custom-403'\n ],\n ]\n];\n"})}),"\n",(0,r.jsxs)(t.blockquote,{children:["\n",(0,r.jsxs)(t.p,{children:["By default, LmcRbacMvc uses a template called ",(0,r.jsx)(t.code,{children:"error/403"}),"."]}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"creating-custom-strategies",children:"Creating custom strategies"}),"\n",(0,r.jsxs)(t.p,{children:["Creating a custom strategy is rather easy. Let's say we want to create a strategy that integrates with\nthe ",(0,r.jsx)(t.a,{href:"https://github.com/laminas-api-tools/api-tools-api-problem",children:"ApiProblem"})," Laminas Api Tools module:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-php",children:"namespace Application\\View\\Strategy;\n\nuse Laminas\\Http\\Response as HttpResponse;\nuse Laminas\\Mvc\\MvcEvent;\nuse Laminas\\ApiTools\\ApiProblem\\ApiProblem;\nuse Laminas\\ApiTools\\ApiProblem\\ApiProblemResponse;\nuse Lmc\\Rbac\\Mvc\\View\\Strategy\\AbstractStrategy;\nuse Lmc\\Rbac\\Mvc\\Exception\\UnauthorizedExceptionInterface;\n\nclass ApiProblemStrategy extends AbstractStrategy\n{\n public function onError(MvcEvent $event)\n {\n // Do nothing if no error or if response is not HTTP response\n if (!($exception = $event->getParam('exception') instanceof UnauthorizedExceptionInterface)\n || ($result = $event->getResult() instanceof HttpResponse)\n || !($response = $event->getResponse() instanceof HttpResponse)\n ) {\n return;\n }\n\n return new ApiProblemResponse(new ApiProblem($exception->getMessage()));\n }\n}\n"})}),"\n",(0,r.jsx)(t.p,{children:"Register your strategy:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-php",children:"return [\n // other configs...\n \n 'listeners' => [\n Application\\View\\Strategy\\ApiProblemStrategy::class,\n ],\n];\n"})})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>c});var r=n(6540);const s={},i=r.createContext(s);function a(e){const t=r.useContext(i);return r.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(s):e.components||s:a(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/main.076466fd.js b/assets/js/main.076466fd.js deleted file mode 100644 index b5dbb553..00000000 --- a/assets/js/main.076466fd.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.076466fd.js.LICENSE.txt */ -(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[792],{8328:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});n(6540);var r=n(3259),a=n.n(r),o=n(4054);const i={"01a85c17":[()=>Promise.all([n.e(869),n.e(209)]).then(n.bind(n,9158)),"@theme/BlogTagsListPage",9158],"04b56dd9":[()=>n.e(999).then(n.t.bind(n,6527,19)),"@generated/docusaurus-plugin-content-blog/default/p/lmc-rbac-mvc-blog-tags-lmcrbacmvc-262.json",6527],"0e384e19":[()=>n.e(976).then(n.bind(n,619)),"@site/docs/intro.md",619],17896441:[()=>Promise.all([n.e(869),n.e(538),n.e(401)]).then(n.bind(n,2447)),"@theme/DocItem",2447],"1f391b9e":[()=>Promise.all([n.e(869),n.e(538),n.e(61)]).then(n.bind(n,7973)),"@theme/MDXPage",7973],"22465cd7":[()=>n.e(166).then(n.bind(n,6066)),"@site/docs/role-providers.md",6066],"3275e2b8":[()=>n.e(63).then(n.t.bind(n,8478,19)),"@generated/docusaurus-plugin-content-blog/default/p/lmc-rbac-mvc-blog-tags-laminas-774.json",8478],"36994c47":[()=>n.e(858).then(n.t.bind(n,5516,19)),"@generated/docusaurus-plugin-content-blog/default/__plugin.json",5516],"378f56c0":[()=>n.e(639).then(n.bind(n,6060)),"@site/blog/2024-02-22-New-documentation.md?truncated=true",6060],"393be207":[()=>n.e(134).then(n.bind(n,633)),"@site/src/pages/markdown-page.md",633],"3b8c55ea":[()=>n.e(803).then(n.bind(n,6845)),"@site/docs/installation.md",6845],"4e6224b1":[()=>n.e(107).then(n.bind(n,6441)),"@site/docs/using-the-authorization-service.md",6441],"57a1fbff":[()=>n.e(417).then(n.t.bind(n,6160,19)),"@generated/docusaurus-plugin-content-blog/default/p/lmc-rbac-mvc-blog-3e0.json",6160],"5e95c892":[()=>n.e(647).then(n.bind(n,7121)),"@theme/DocsRoot",7121],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,4784)),"@generated/docusaurus.config",4784],"6875c492":[()=>Promise.all([n.e(869),n.e(538),n.e(242),n.e(813)]).then(n.bind(n,3069)),"@theme/BlogTagsPostsPage",3069],"712eb253":[()=>n.e(784).then(n.t.bind(n,8657,19)),"@generated/docusaurus-plugin-content-blog/default/p/lmc-rbac-mvc-blog-archive-033.json",8657],"72e14192":[()=>n.e(814).then(n.bind(n,6711)),"@site/docs/quick-start.md",6711],"7d54f919":[()=>n.e(500).then(n.t.bind(n,7431,19)),"@generated/docusaurus-plugin-content-docs/default/p/lmc-rbac-mvc-docs-e53.json",7431],"809dac3e":[()=>n.e(804).then(n.bind(n,4e3)),"@site/blog/2024-02-22-New-documentation.md",4e3],"814f3328":[()=>n.e(472).then(n.t.bind(n,5513,19)),"~blog/default/blog-post-list-prop-default.json",5513],"8b5d4ccc":[()=>n.e(223).then(n.bind(n,5811)),"@site/docs/guards.md",5811],"9e4087bc":[()=>n.e(711).then(n.bind(n,9331)),"@theme/BlogArchivePage",9331],a6aa9e1f:[()=>Promise.all([n.e(869),n.e(538),n.e(242),n.e(643)]).then(n.bind(n,5124)),"@theme/BlogListPage",5124],a7456010:[()=>n.e(235).then(n.t.bind(n,8552,19)),"@generated/docusaurus-plugin-content-pages/default/__plugin.json",8552],a7bd4aaa:[()=>n.e(98).then(n.bind(n,4532)),"@theme/DocVersionRoot",4532],a94703ab:[()=>Promise.all([n.e(869),n.e(48)]).then(n.bind(n,2559)),"@theme/DocRoot",2559],aba21aa0:[()=>n.e(742).then(n.t.bind(n,7093,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",7093],acecf23e:[()=>n.e(903).then(n.t.bind(n,1912,19)),"~blog/default/blogMetadata-default.json",1912],b5cb822e:[()=>n.e(390).then(n.bind(n,2957)),"@site/blog/2022-08-02-welcome.md?truncated=true",2957],b9207088:[()=>n.e(571).then(n.bind(n,7024)),"@site/docs/cookbook.md",7024],c0d4b1ca:[()=>n.e(21).then(n.t.bind(n,1822,19)),"@generated/docusaurus-plugin-content-blog/default/p/lmc-rbac-mvc-blog-tags-php-d4a.json",1822],c4f5d8e4:[()=>Promise.all([n.e(869),n.e(634)]).then(n.bind(n,6467)),"@site/src/pages/index.js",6467],ccc49370:[()=>Promise.all([n.e(869),n.e(538),n.e(242),n.e(249)]).then(n.bind(n,3858)),"@theme/BlogPostPage",3858],cde7c749:[()=>n.e(117).then(n.t.bind(n,1768,19)),"@generated/docusaurus-plugin-content-blog/default/p/lmc-rbac-mvc-blog-tags-2d6.json",1768],d9e16301:[()=>n.e(416).then(n.bind(n,1562)),"@site/docs/support.md",1562],ee696d42:[()=>n.e(18).then(n.bind(n,3531)),"@site/blog/2022-08-02-welcome.md",3531],f6027d55:[()=>n.e(246).then(n.bind(n,2712)),"@site/docs/strategies.md",2712]};var l=n(4848);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(6921),u=n(3102);function d(e,t){if("*"===e)return a()({loading:s,loader:()=>n.e(237).then(n.bind(n,2237)),modules:["@theme/NotFound"],webpack:()=>[2237],render(e,t){const n=e.default;return(0,l.jsx)(u.W,{value:{plugin:{name:"native",id:"default"}},children:(0,l.jsx)(n,{...t})})}});const r=o[`${e}-${t}`],d={},f=[],p=[],g=(0,c.A)(r);return Object.entries(g).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],f.push(r[1]),p.push(r[2]))})),a().Map({loading:s,loader:d,modules:f,webpack:()=>p,render(t,n){const a=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const o=r.default;if(!o)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 o&&"function"!=typeof o||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{o[e]=r[e]}));let i=a;const l=n.split(".");l.slice(0,-1).forEach((e=>{i=i[e]})),i[l[l.length-1]]=o}));const o=a.__comp;delete a.__comp;const i=a.__context;delete a.__context;const s=a.__props;return delete a.__props,(0,l.jsx)(u.W,{value:i,children:(0,l.jsx)(o,{...a,...s,...n})})}})}const f=[{path:"/LmcRbacMvc/blog",component:d("/LmcRbacMvc/blog","f38"),exact:!0},{path:"/LmcRbacMvc/blog/archive",component:d("/LmcRbacMvc/blog/archive","3db"),exact:!0},{path:"/LmcRbacMvc/blog/new-documentation",component:d("/LmcRbacMvc/blog/new-documentation","5ba"),exact:!0},{path:"/LmcRbacMvc/blog/tags",component:d("/LmcRbacMvc/blog/tags","0ac"),exact:!0},{path:"/LmcRbacMvc/blog/tags/laminas",component:d("/LmcRbacMvc/blog/tags/laminas","b15"),exact:!0},{path:"/LmcRbacMvc/blog/tags/lmcrbacmvc",component:d("/LmcRbacMvc/blog/tags/lmcrbacmvc","200"),exact:!0},{path:"/LmcRbacMvc/blog/tags/php",component:d("/LmcRbacMvc/blog/tags/php","362"),exact:!0},{path:"/LmcRbacMvc/blog/welcome",component:d("/LmcRbacMvc/blog/welcome","c9c"),exact:!0},{path:"/LmcRbacMvc/markdown-page",component:d("/LmcRbacMvc/markdown-page","b53"),exact:!0},{path:"/LmcRbacMvc/docs",component:d("/LmcRbacMvc/docs","24f"),routes:[{path:"/LmcRbacMvc/docs",component:d("/LmcRbacMvc/docs","0bf"),routes:[{path:"/LmcRbacMvc/docs",component:d("/LmcRbacMvc/docs","033"),routes:[{path:"/LmcRbacMvc/docs/cookbook",component:d("/LmcRbacMvc/docs/cookbook","2be"),exact:!0,sidebar:"tutorialSidebar"},{path:"/LmcRbacMvc/docs/guards",component:d("/LmcRbacMvc/docs/guards","ea9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/LmcRbacMvc/docs/installation",component:d("/LmcRbacMvc/docs/installation","ecb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/LmcRbacMvc/docs/intro",component:d("/LmcRbacMvc/docs/intro","3db"),exact:!0,sidebar:"tutorialSidebar"},{path:"/LmcRbacMvc/docs/quick-start",component:d("/LmcRbacMvc/docs/quick-start","5cd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/LmcRbacMvc/docs/role-providers",component:d("/LmcRbacMvc/docs/role-providers","e09"),exact:!0,sidebar:"tutorialSidebar"},{path:"/LmcRbacMvc/docs/strategies",component:d("/LmcRbacMvc/docs/strategies","6d1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/LmcRbacMvc/docs/support",component:d("/LmcRbacMvc/docs/support","58f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/LmcRbacMvc/docs/using-the-authorization-service",component:d("/LmcRbacMvc/docs/using-the-authorization-service","9b1"),exact:!0,sidebar:"tutorialSidebar"}]}]}]},{path:"/LmcRbacMvc/",component:d("/LmcRbacMvc/","41a"),exact:!0},{path:"*",component:d("*")}]},6125:(e,t,n)=>{"use strict";n.d(t,{o:()=>o,x:()=>i});var r=n(6540),a=n(4848);const o=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,a.jsx)(o.Provider,{value:n,children:t})}},8536:(e,t,n)=>{"use strict";var r=n(6540),a=n(5338),o=n(545),i=n(4625),l=n(4784),s=n(8193);const c=[n(119),n(6134),n(6294),n(1043)];var u=n(8328),d=n(6347),f=n(2831),p=n(4848);function g(e){let{children:t}=e;return(0,p.jsx)(p.Fragment,{children:t})}var m=n(5260),h=n(4586),b=n(6025),y=n(6342),v=n(1213),w=n(2131),k=n(4090),x=n(2967),S=n(440),E=n(1463);function _(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,h.A)(),r=(0,w.o)(),a=n[e].htmlLang,o=e=>e.replace("-","_");return(0,p.jsxs)(m.A,{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:o(a)}),Object.values(n).filter((e=>a!==e.htmlLang)).map((e=>(0,p.jsx)("meta",{property:"og:locale:alternate",content:o(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function C(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,h.A)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,h.A)(),{pathname:r}=(0,d.zy)();return e+(0,S.applyTrailingSlash)((0,b.Ay)(r),{trailingSlash:n,baseUrl:t})}(),a=t?`${n}${t}`:r;return(0,p.jsxs)(m.A,{children:[(0,p.jsx)("meta",{property:"og:url",content:a}),(0,p.jsx)("link",{rel:"canonical",href:a})]})}function A(){const{i18n:{currentLocale:e}}=(0,h.A)(),{metadata:t,image:n}=(0,y.p)();return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(m.A,{children:[(0,p.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,p.jsx)("body",{className:k.w})]}),n&&(0,p.jsx)(v.be,{image:n}),(0,p.jsx)(C,{}),(0,p.jsx)(_,{}),(0,p.jsx)(E.A,{tag:x.Cy,locale:e}),(0,p.jsx)(m.A,{children:t.map(((e,t)=>(0,p.jsx)("meta",{...e},t)))})]})}const T=new Map;var L=n(6125),N=n(6988),R=n(205);function P(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 a=c.map((t=>{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>a.forEach((e=>e?.()))}const O=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,R.A)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,a=t.hash===n.hash,o=t.search===n.search;if(r&&a&&!o)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),P("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function j(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,f.u)(u.A,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class M extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.A.canUseDOM?P("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=P("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),j(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)(O,{previousLocation:this.previousLocation,location:t,children:(0,p.jsx)(d.qh,{location:t,render:()=>e})})}}const I=M,D="__docusaurus-base-url-issue-banner-container",F="__docusaurus-base-url-issue-banner",z="__docusaurus-base-url-issue-banner-suggestion-container";function $(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 = '${D}';\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 B(){const{siteConfig:{baseUrl:e}}=(0,h.A)();return(0,p.jsx)(p.Fragment,{children:!s.A.canUseDOM&&(0,p.jsx)(m.A,{children:(0,p.jsx)("script",{children:$(e)})})})}function U(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,h.A)(),{pathname:n}=(0,d.zy)();return t&&n===e?(0,p.jsx)(B,{}):null}function H(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:r,localeConfigs:a}}=(0,h.A)(),o=(0,b.Ay)(e),{htmlLang:i,direction:l}=a[r];return(0,p.jsxs)(m.A,{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:o})]})}var V=n(7489),W=n(2303);function G(){const e=(0,W.A)();return(0,p.jsx)(m.A,{children:(0,p.jsx)("html",{"data-has-hydrated":e})})}const q=(0,f.v)(u.A);function Y(){const e=function(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,f.u)(u.A,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}}((0,d.zy)());return(0,p.jsx)(I,{location:e,children:q})}function K(){return(0,p.jsx)(V.A,{children:(0,p.jsx)(N.l,{children:(0,p.jsxs)(L.x,{children:[(0,p.jsxs)(g,{children:[(0,p.jsx)(H,{}),(0,p.jsx)(A,{}),(0,p.jsx)(U,{}),(0,p.jsx)(Y,{})]}),(0,p.jsx)(G,{})]})})})}var Q=n(4054);const Z=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.appendChild(r)}))}: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 X=n(6921);const J=new Set,ee=new Set,te=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ne={prefetch:e=>{if(!(e=>!te()&&!ee.has(e)&&!J.has(e))(e))return!1;J.add(e);const t=(0,f.u)(u.A,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,X.A)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Z(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!te()&&!ee.has(e))(e)&&(ee.add(e),j(e))},re=Object.freeze(ne);function ae(e){let{children:t}=e;return"hash"===l.default.future.experimental_router?(0,p.jsx)(i.I9,{children:t}):(0,p.jsx)(i.Kd,{children:t})}const oe=Boolean(!0);if(s.A.canUseDOM){window.docusaurus=re;const e=document.getElementById("__docusaurus"),t=(0,p.jsx)(o.vd,{children:(0,p.jsx)(ae,{children:(0,p.jsx)(K,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},i=()=>{if(window.docusaurusRoot)window.docusaurusRoot.render(t);else if(oe)window.docusaurusRoot=a.hydrateRoot(e,t,{onRecoverableError:n});else{const r=a.createRoot(e,{onRecoverableError:n});r.render(t),window.docusaurusRoot=r}};j(window.location.pathname).then((()=>{(0,r.startTransition)(i)}))}},6988:(e,t,n)=>{"use strict";n.d(t,{o:()=>d,l:()=>f});var r=n(6540),a=n(4784);const o=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/LmcRbacMvc/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/LmcRbacMvc/docs","mainDocId":"intro","docs":[{"id":"cookbook","path":"/LmcRbacMvc/docs/cookbook","sidebar":"tutorialSidebar"},{"id":"guards","path":"/LmcRbacMvc/docs/guards","sidebar":"tutorialSidebar"},{"id":"installation","path":"/LmcRbacMvc/docs/installation","sidebar":"tutorialSidebar"},{"id":"intro","path":"/LmcRbacMvc/docs/intro","sidebar":"tutorialSidebar"},{"id":"quick-start","path":"/LmcRbacMvc/docs/quick-start","sidebar":"tutorialSidebar"},{"id":"role-providers","path":"/LmcRbacMvc/docs/role-providers","sidebar":"tutorialSidebar"},{"id":"strategies","path":"/LmcRbacMvc/docs/strategies","sidebar":"tutorialSidebar"},{"id":"support","path":"/LmcRbacMvc/docs/support","sidebar":"tutorialSidebar"},{"id":"using-the-authorization-service","path":"/LmcRbacMvc/docs/using-the-authorization-service","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/LmcRbacMvc/docs/intro","label":"intro"}}}}],"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(2654);const s=JSON.parse('{"docusaurusVersion":"3.4.0","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.4.0"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.4.0"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.4.0"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.4.0"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.4.0"}}}');var c=n(4848);const u={siteConfig:a.default,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},d=r.createContext(u);function f(e){let{children:t}=e;return(0,c.jsx)(d.Provider,{value:u,children:t})}},7489:(e,t,n)=>{"use strict";n.d(t,{A:()=>m});var r=n(6540),a=n(8193),o=n(5260),i=n(440),l=n(781),s=n(3102),c=n(4848);function u(e){let{error:t,tryAgain:n}=e;return(0,c.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,c.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,c.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,c.jsx)(d,{error:t})]})}function d(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,c.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function f(e){let{children:t}=e;return(0,c.jsx)(s.W,{value:{plugin:{name:"docusaurus-core-error-boundary",id:"default"}},children:t})}function p(e){let{error:t,tryAgain:n}=e;return(0,c.jsx)(f,{children:(0,c.jsxs)(m,{fallback:()=>(0,c.jsx)(u,{error:t,tryAgain:n}),children:[(0,c.jsx)(o.A,{children:(0,c.jsx)("title",{children:"Page Error"})}),(0,c.jsx)(l.A,{children:(0,c.jsx)(u,{error:t,tryAgain:n})})]})})}const g=e=>(0,c.jsx)(p,{...e});class m extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.A.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??g)(e)}return e??null}}},8193:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5260:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});n(6540);var r=n(545),a=n(4848);function o(e){return(0,a.jsx)(r.mg,{...e})}},8774:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});var r=n(6540),a=n(4625),o=n(440),i=n(4586),l=n(6654),s=n(8193),c=n(3427),u=n(6025),d=n(4848);function f(e,t){let{isNavLink:n,to:f,href:p,activeClassName:g,isActive:m,"data-noBrokenLinkCheck":h,autoAddBaseUrl:b=!0,...y}=e;const{siteConfig:v}=(0,i.A)(),{trailingSlash:w,baseUrl:k}=v,x=v.future.experimental_router,{withBaseUrl:S}=(0,u.hH)(),E=(0,c.A)(),_=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>_.current));const C=f||p;const A=(0,l.A)(C),T=C?.replace("pathname://","");let L=void 0!==T?(N=T,b&&(e=>e.startsWith("/"))(N)?S(N):N):void 0;var N;"hash"===x&&L?.startsWith("./")&&(L=L?.slice(1)),L&&A&&(L=(0,o.applyTrailingSlash)(L,{trailingSlash:w,baseUrl:k}));const R=(0,r.useRef)(!1),P=n?a.k2:a.N_,O=s.A.canUseIntersectionObserver,j=(0,r.useRef)(),M=()=>{R.current||null==L||(window.docusaurus.preload(L),R.current=!0)};(0,r.useEffect)((()=>(!O&&A&&null!=L&&window.docusaurus.prefetch(L),()=>{O&&j.current&&j.current.disconnect()})),[j,L,O,A]);const I=L?.startsWith("#")??!1,D=!y.target||"_self"===y.target,F=!L||!A||!D;return h||!I&&F||E.collectLink(L),y.id&&E.collectAnchor(y.id),F?(0,d.jsx)("a",{ref:_,href:L,...C&&!A&&{target:"_blank",rel:"noopener noreferrer"},...y}):(0,d.jsx)(P,{...y,onMouseEnter:M,onTouchStart:M,innerRef:e=>{_.current=e,O&&e&&A&&(j.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(j.current.unobserve(e),j.current.disconnect(),null!=L&&window.docusaurus.prefetch(L))}))})),j.current.observe(e))},to:L,...n&&{isActive:m,activeClassName:g}})}const p=r.forwardRef(f)},418:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const r=()=>null},1312:(e,t,n)=>{"use strict";n.d(t,{A:()=>c,T:()=>s});var r=n(6540),a=n(4848);function o(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=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(2654);function l(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function s(e,t){let{message:n,id:r}=e;return o(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,a.jsx)(a.Fragment,{children:o(i,r)})}},7065:(e,t,n)=>{"use strict";n.d(t,{W:()=>r});const r="default"},6654:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{A:()=>a,z:()=>r})},6025:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>l,hH:()=>i});var r=n(6540),a=n(4586),o=n(6654);function i(){const{siteConfig:e}=(0,a.A)(),{baseUrl:t,url:n}=e,i=e.future.experimental_router,l=(0,r.useCallback)(((e,r)=>function(e){let{siteUrl:t,baseUrl:n,url:r,options:{forcePrependBaseUrl:a=!1,absolute:i=!1}={},router:l}=e;if(!r||r.startsWith("#")||(0,o.z)(r))return r;if("hash"===l)return r.startsWith("/")?`.${r}`:`./${r}`;if(a)return n+r.replace(/^\//,"");if(r===n.replace(/\/$/,""))return n;const s=r.startsWith(n)?r:n+r.replace(/^\//,"");return i?t+s:s}({siteUrl:n,baseUrl:t,url:e,options:r,router:i})),[n,t,i]);return{withBaseUrl:l}}function l(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},3427:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(6540);n(4848);const a=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),o=()=>(0,r.useContext)(a);function i(){return o()}},4586:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540),a=n(6988);function o(){return(0,r.useContext)(a.o)}},2303:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540),a=n(6125);function o(){return(0,r.useContext)(a.o)}},205:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540);const a=n(8193).A.canUseDOM?r.useLayoutEffect:r.useEffect},6803:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540),a=n(3102);function o(){const e=r.useContext(a.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}},6921:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[o,i]=n;const l=a?`${a}.${o}`:o;r(i)?e(i,l):t[l]=i}))}(e),t}},3102:(e,t,n)=>{"use strict";n.d(t,{W:()=>i,o:()=>o});var r=n(6540),a=n(4848);const o=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(o),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,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,a.jsx)(o.Provider,{value:l,children:t})}},4070:(e,t,n)=>{"use strict";n.d(t,{zK:()=>m,vT:()=>f,Gy:()=>u,HW:()=>h,ht:()=>d,r7:()=>g,jh:()=>p});var r=n(6347),a=n(4586),o=n(7065);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.A)();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.B6)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),a=n?.docs.find((e=>!!(0,r.B6)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const c={},u=()=>i("docusaurus-plugin-content-docs")??c,d=e=>{try{return function(e,t,n){void 0===t&&(t=o.W),void 0===n&&(n={});const r=i(e),a=r?.[t];if(!a&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return a}("docusaurus-plugin-content-docs",e,{failfast:!0})}catch(t){throw new Error("You are using a feature of the Docusaurus docs plugin, but this plugin does not seem to be enabled"+("Default"===e?"":` (pluginId=${e}`),{cause:t})}};function f(e){void 0===e&&(e={});const t=u(),{pathname:n}=(0,r.zy)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.B6)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&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 o}(t,n,e)}function p(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.zy)();return s(t,n)}function h(e){const t=d(e),{pathname:n}=(0,r.zy)();return function(e,t){const n=l(e);return{latestDocSuggestion:s(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},6294:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(5947),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},6134:(e,t,n)=>{"use strict";n.r(t);var r=n(1765),a=n(4784);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(9700),n(2022)(`./prism-${e}`)})),delete globalThis.Prism}(r.My)},1107:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(4164),a=n(1312),o=n(6342),i=n(8774),l=n(3427);const s={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var c=n(4848);function u(e){let{as:t,id:n,...u}=e;const d=(0,l.A)(),{navbar:{hideOnScroll:f}}=(0,o.p)();if("h1"===t||!n)return(0,c.jsx)(t,{...u,id:void 0});d.collectAnchor(n);const p=(0,a.T)({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.A)("anchor",f?s.anchorWithHideOnScrollNavbar:s.anchorWithStickyNavbar,u.className),id:n,children:[u.children,(0,c.jsx)(i.A,{className:"hash-link",to:`#${n}`,"aria-label":p,title:p,children:"\u200b"})]})}},3186:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});n(6540);const r={iconExternalLink:"iconExternalLink_nPIU"};var a=n(4848);function o(e){let{width:t=13.5,height:n=13.5}=e;return(0,a.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,a.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"})})}},781:(e,t,n)=>{"use strict";n.d(t,{A:()=>pt});var r=n(6540),a=n(4164),o=n(7489),i=n(1213),l=n(6347),s=n(1312),c=n(5062),u=n(4848);const d="__docusaurus_skipToContent_fallback";function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function p(){const e=(0,r.useRef)(null),{action:t}=(0,l.W6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&f(t)}),[]);return(0,c.$)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,onClick:n}}const g=(0,s.T)({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){const t=e.children??g,{containerRef:n,onClick:r}=p();return(0,u.jsx)("div",{ref:n,role:"region","aria-label":g,children:(0,u.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var h=n(7559),b=n(4090);const y={skipToContent:"skipToContent_fXgn"};function v(){return(0,u.jsx)(m,{className:y.skipToContent})}var w=n(6342),k=n(5041);function x(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:a=1.2,className:o,...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:a,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.T)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,a.A)("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.p)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,a.A)(_.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const A={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function T(){const{announcementBar:e}=(0,w.p)(),{isActive:t,close:n}=(0,k.M)();if(!t)return null;const{backgroundColor:r,textColor:a,isCloseable:o}=e;return(0,u.jsxs)("div",{className:A.announcementBar,style:{backgroundColor:r,color:a},role:"banner",children:[o&&(0,u.jsx)("div",{className:A.announcementBarPlaceholder}),(0,u.jsx)(C,{className:A.announcementBarContent}),o&&(0,u.jsx)(E,{onClick:n,className:A.announcementBarClose})]})}var L=n(9876),N=n(3104);var R=n(9532),P=n(5600);const O=r.createContext(null);function j(e){let{children:t}=e;const n=function(){const e=(0,L.M)(),t=(0,P.YL)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,R.ZC)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return(0,u.jsx)(O.Provider,{value:n,children:t})}function M(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function I(){const e=(0,r.useContext)(O);if(!e)throw new R.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,P.YL)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:M(o)})),[a,o,t])}function D(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:o}=I();return(0,u.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,u.jsxs)("div",{className:(0,a.A)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":o}),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(5293),z=n(2303);function $(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 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:"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 U={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function H(e){let{className:t,buttonClassName:n,value:r,onChange:o}=e;const i=(0,z.A)(),l=(0,s.T)({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.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,s.T)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,u.jsx)("div",{className:(0,a.A)(U.toggle,t),children:(0,u.jsxs)("button",{className:(0,a.A)("clean-btn",U.toggleButton,!i&&U.toggleButtonDisabled,n),type:"button",onClick:()=>o("dark"===r?"light":"dark"),disabled:!i,title:l,"aria-label":l,"aria-live":"polite",children:[(0,u.jsx)($,{className:(0,a.A)(U.toggleIcon,U.lightToggleIcon)}),(0,u.jsx)(B,{className:(0,a.A)(U.toggleIcon,U.darkToggleIcon)})]})})}const V=r.memo(H),W={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function G(e){let{className:t}=e;const n=(0,w.p)().navbar.style,r=(0,w.p)().colorMode.disableSwitch,{colorMode:a,setColorMode:o}=(0,F.G)();return r?null:(0,u.jsx)(V,{className:t,buttonClassName:"dark"===n?W.darkNavbarColorModeToggle:void 0,value:a,onChange:o})}var q=n(3465);function Y(){return(0,u.jsx)(q.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function K(){const e=(0,L.M)();return(0,u.jsx)("button",{type:"button","aria-label":(0,s.T)({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 Q(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(Y,{}),(0,u.jsx)(G,{className:"margin-right--md"}),(0,u.jsx)(K,{})]})}var Z=n(8774),X=n(6025),J=n(6654);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(3186);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:a,label:o,html:i,isDropdownLink:l,prependBaseUrlToHref:s,...c}=e;const d=(0,X.Ay)(r),f=(0,X.Ay)(t),p=(0,X.Ay)(a,{forcePrependBaseUrl:!0}),g=o&&a&&!(0,J.A)(a),m=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,u.jsxs)(u.Fragment,{children:[o,g&&(0,u.jsx)(te.A,{...l&&{width:12,height:12}})]})};return a?(0,u.jsx)(Z.A,{href:s?p:a,...c,...m}):(0,u.jsx)(Z.A,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(f)},...c,...m})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const o=(0,u.jsx)(ne,{className:(0,a.A)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,u.jsx)("li",{children:o}):o}function ae(e){let{className:t,isDropdownItem:n,...r}=e;return(0,u.jsx)("li",{className:"menu__list-item",children:(0,u.jsx)(ne,{className:(0,a.A)("menu__link",t),...r})})}function oe(e){let{mobile:t=!1,position:n,...r}=e;const a=t?ae:re;return(0,u.jsx)(a,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(1422),le=n(9169),se=n(4586);const ce={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_S0Fm"};function ue(e,t){return e.some((e=>function(e,t){return!!(0,le.ys)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:o,onClick:i,...l}=e;const s=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{s.current&&!s.current.contains(e.target)&&d(!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)}}),[s]),(0,u.jsxs)("div",{ref:s,className:(0,a.A)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c}),children:[(0,u.jsx)(ne,{"aria-haspopup":"true","aria-expanded":c,role:"button",href:l.to?void 0:"#",className:(0,a.A)("navbar__link",o),...l,onClick:l.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))},children:l.children??l.label}),(0,u.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(_e,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function fe(e){let{items:t,className:n,position:o,onClick:i,...s}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,se.A)(),{pathname:t}=(0,l.zy)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:f,toggleCollapsed:p,setCollapsed:g}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&g(!d)}),[c,d,g]),(0,u.jsxs)("li",{className:(0,a.A)("menu__list-item",{"menu__list-item--collapsed":f}),children:[(0,u.jsx)(ne,{role:"button",className:(0,a.A)(ce.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",n),...s,onClick:e=>{e.preventDefault(),p()},children:s.children??s.label}),(0,u.jsx)(ie.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:f,children:t.map(((e,t)=>(0,r.createElement)(_e,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function pe(e){let{mobile:t=!1,...n}=e;const r=t?fe:de;return(0,u.jsx)(r,{...n})}var ge=n(2131);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(418);const ye={navbarSearchContainer:"navbarSearchContainer_Bca1"};function ve(e){let{children:t,className:n}=e;return(0,u.jsx)("div",{className:(0,a.A)(n,ye.navbarSearchContainer),children:t})}var we=n(4070),ke=n(1754);var xe=n(5597);const Se=e=>e.docs.find((t=>t.id===e.mainDocId));const Ee={default:oe,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:a="",...o}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,se.A)(),f=(0,ge.o)(),{search:p,hash:g}=(0,l.zy)(),m=[...n,...c.map((e=>{const n=`${`pathname://${f.createUrl({locale:e,fullyQualified:!1})}`}${p}${g}${a}`;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.T)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,u.jsx)(pe,{...o,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.A,{})})},dropdown:pe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:o=!1}=e;const i=o?"li":"div";return(0,u.jsx)(i,{className:(0,a.A)({navbar__item:!r&&!o,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...a}=e;const{activeDoc:o}=(0,we.zK)(r),i=(0,ke.QB)(t,r),l=o?.path===i?.path;return null===i||i.unlisted&&!l?null:(0,u.jsx)(oe,{exact:!0,...a,isActive:()=>l||!!o?.sidebar&&o.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...a}=e;const{activeDoc:o}=(0,we.zK)(r),i=(0,ke.fW)(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)(oe,{exact:!0,...a,isActive:()=>o?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...a}=e;const o=(0,ke.Vd)(r)[0],i=t??o.label,l=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(o).path;return(0,u.jsx)(oe,{...a,label:i,to:l})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:a,dropdownItemsAfter:o,...i}=e;const{search:c,hash:d}=(0,l.zy)(),f=(0,we.zK)(n),p=(0,we.jh)(n),{savePreferredVersionName:g}=(0,xe.g1)(n),m=[...a,...p.map((e=>{const t=f.alternateDocVersions[e.name]??Se(e);return{label:e.label,to:`${t.path}${c}${d}`,isActive:()=>e===f.activeVersion,onClick:()=>g(e.name)}})),...o],h=(0,ke.Vd)(n)[0],b=t&&m.length>1?(0,s.T)({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)(oe,{...i,mobile:t,label:b,to:y,isActive:r?()=>!1:void 0}):(0,u.jsx)(pe,{...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),a=Ee[r];if(!a)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,u.jsx)(a,{...n})}function Ce(){const e=(0,L.M)(),t=(0,w.p)().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 Ae(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(s.A,{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 Te(){const e=0===(0,w.p)().navbar.items.length,t=I();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(Ae,{onClick:()=>t.hide()}),t.content]})}function Le(){const e=(0,L.M)();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)(D,{header:(0,u.jsx)(Q,{}),primaryMenu:(0,u.jsx)(Ce,{}),secondaryMenu:(0,u.jsx)(Te,{})}):null}const Ne={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Re(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,a.A)("navbar-sidebar__backdrop",e.className)})}function Pe(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.p)(),i=(0,L.M)(),{navbarRef:l,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,N.Mq)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i<o.current)return void n(!0);if(a.current)return void(a.current=!1);const l=r?.scrollY,s=document.documentElement.scrollHeight-o.current,c=window.innerHeight;l&&i>=l?n(!1):i+c<s&&n(!0)})),(0,c.$)((t=>{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,u.jsxs)("nav",{ref:l,"aria-label":(0,s.T)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.A)("navbar","navbar--fixed-top",n&&[Ne.navbarHideable,!d&&Ne.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown}),children:[t,(0,u.jsx)(Re,{onClick:i.toggle}),(0,u.jsx)(Le,{})]})}var Oe=n(440);const je={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function Me(e){return(0,u.jsx)("button",{type:"button",...e,children:(0,u.jsx)(s.A,{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,Oe.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,u.jsx)("p",{className:je.errorBoundaryError,children:n})}class De 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,...a}=e;return(0,u.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...a,children:(0,u.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function $e(){const{toggle:e,shown:t}=(0,L.M)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,s.T)({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 Be={colorModeToggle:"colorModeToggle_DEke"};function Ue(e){let{items:t}=e;return(0,u.jsx)(u.Fragment,{children:t.map(((e,t)=>(0,u.jsx)(De,{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 He(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 Ve(){const e=(0,L.M)(),t=(0,w.p)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??Fe)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),a=t.find((e=>"search"===e.type));return(0,u.jsx)(He,{left:(0,u.jsxs)(u.Fragment,{children:[!e.disabled&&(0,u.jsx)($e,{}),(0,u.jsx)(Y,{}),(0,u.jsx)(Ue,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(Ue,{items:r}),(0,u.jsx)(G,{className:Be.colorModeToggle}),!a&&(0,u.jsx)(ve,{children:(0,u.jsx)(be.A,{})})]})})}function We(){return(0,u.jsx)(Pe,{children:(0,u.jsx)(Ve,{})})}function Ge(e){let{item:t}=e;const{to:n,href:r,label:a,prependBaseUrlToHref:o,...i}=t,l=(0,X.Ay)(n),s=(0,X.Ay)(r,{forcePrependBaseUrl:!0});return(0,u.jsxs)(Z.A,{className:"footer__link-item",...r?{href:o?s:r}:{to:l},...i,children:[a,r&&!(0,J.A)(r)&&(0,u.jsx)(te.A,{})]})}function qe(e){let{item:t}=e;return t.html?(0,u.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)("li",{className:"footer__item",children:(0,u.jsx)(Ge,{item:t})},t.href??t.to)}function Ye(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)(qe,{item:e},t)))})]})}function Ke(e){let{columns:t}=e;return(0,u.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,u.jsx)(Ye,{column:e},t)))})}function Qe(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function Ze(e){let{item:t}=e;return t.html?(0,u.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)(Ge,{item:t})}function Xe(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)(Ze,{item:e}),t.length!==n+1&&(0,u.jsx)(Qe,{})]},n)))})})}function Je(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,u.jsx)(Ke,{columns:t}):(0,u.jsx)(Xe,{links:t})}var et=n(1122);const tt={footerLogoLink:"footerLogoLink_BH7S"};function nt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.hH)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,u.jsx)(et.A,{className:(0,a.A)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function rt(e){let{logo:t}=e;return t.href?(0,u.jsx)(Z.A,{href:t.href,className:tt.footerLogoLink,target:t.target,children:(0,u.jsx)(nt,{logo:t})}):(0,u.jsx)(nt,{logo:t})}function at(e){let{copyright:t}=e;return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function ot(e){let{style:t,links:n,logo:r,copyright:o}=e;return(0,u.jsx)("footer",{className:(0,a.A)("footer",{"footer--dark":"dark"===t}),children:(0,u.jsxs)("div",{className:"container container-fluid",children:[n,(r||o)&&(0,u.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,u.jsx)("div",{className:"margin-bottom--sm",children:r}),o]})]})})}function it(){const{footer:e}=(0,w.p)();if(!e)return null;const{copyright:t,links:n,logo:r,style:a}=e;return(0,u.jsx)(ot,{style:a,links:n&&n.length>0&&(0,u.jsx)(Je,{links:n}),logo:r&&(0,u.jsx)(rt,{logo:r}),copyright:t&&(0,u.jsx)(at,{copyright:t})})}const lt=r.memo(it),st=(0,R.fM)([F.a,k.o,N.Tv,xe.VQ,i.Jx,function(e){let{children:t}=e;return(0,u.jsx)(P.y_,{children:(0,u.jsx)(L.e,{children:(0,u.jsx)(j,{children:t})})})}]);function ct(e){let{children:t}=e;return(0,u.jsx)(st,{children:t})}var ut=n(1107);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.A,{as:"h1",className:"hero__title",children:(0,u.jsx)(s.A,{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)(Me,{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 ft={mainWrapper:"mainWrapper_z2l0"};function pt(e){const{children:t,noFooter:n,wrapperClassName:r,title:l,description:s}=e;return(0,b.J)(),(0,u.jsxs)(ct,{children:[(0,u.jsx)(i.be,{title:l,description:s}),(0,u.jsx)(v,{}),(0,u.jsx)(T,{}),(0,u.jsx)(We,{}),(0,u.jsx)("div",{id:d,className:(0,a.A)(h.G.wrapper.main,ft.mainWrapper,r),children:(0,u.jsx)(o.A,{fallback:e=>(0,u.jsx)(dt,{...e}),children:t})}),!n&&(0,u.jsx)(lt,{})]})}},3465:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(8774),a=n(6025),o=n(4586),i=n(6342),l=n(1122),s=n(4848);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,a.Ay)(t.src),dark:(0,a.Ay)(t.srcDark||t.src)},i=(0,s.jsx)(l.A,{className:t.className,sources:o,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){const{siteConfig:{title:t}}=(0,o.A)(),{navbar:{title:n,logo:l}}=(0,i.p)(),{imageClassName:u,titleClassName:d,...f}=e,p=(0,a.Ay)(l?.href||"/"),g=n?"":t,m=l?.alt??g;return(0,s.jsxs)(r.A,{to:p,...f,...l?.target&&{target:l.target},children:[l&&(0,s.jsx)(c,{logo:l,alt:m,imageClassName:u}),null!=n&&(0,s.jsx)("b",{className:d,children:n})]})}},1463:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});n(6540);var r=n(5260),a=n(4848);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return(0,a.jsxs)(r.A,{children:[t&&(0,a.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,a.jsx)("meta",{name:"docusaurus_version",content:n}),o&&(0,a.jsx)("meta",{name:"docusaurus_tag",content:o}),i&&(0,a.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,a.jsx)("meta",{name:"docsearch:version",content:n}),o&&(0,a.jsx)("meta",{name:"docsearch:docusaurus_tag",content:o})]})}},1122:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});var r=n(6540),a=n(4164),o=n(2303),i=n(5293);const l={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var s=n(4848);function c(e){let{className:t,children:n}=e;const c=(0,o.A)(),{colorMode:u}=(0,i.G)();return(0,s.jsx)(s.Fragment,{children:(c?"dark"===u?["dark"]:["light"]:["light","dark"]).map((e=>{const o=n({theme:e,className:(0,a.A)(t,l.themedComponent,l[`themedComponent--${e}`])});return(0,s.jsx)(r.Fragment,{children:o},e)}))})}function u(e){const{sources:t,className:n,alt:r,...a}=e;return(0,s.jsx)(c,{className:n,children:e=>{let{theme:n,className:o}=e;return(0,s.jsx)("img",{src:t[n],alt:r,className:o,...a})}})}},1422:(e,t,n)=>{"use strict";n.d(t,{N:()=>b,u:()=>c});var r=n(6540),a=n(8193),o=n(205),i=n(3109),l=n(4848);const s="ease-in-out";function c(e){let{initialState:t}=e;const[n,a]=(0,r.useState)(t??!1),o=(0,r.useCallback)((()=>{a((e=>!e))}),[]);return{collapsed:n,setCollapsed:a,toggleCollapsed:o}}const u={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function f(e,t){const n=t?u:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function p(e){let{collapsibleRef:t,collapsed:n,animation:a}=e;const o=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=a?.duration??function(e){if((0,i.O)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${a?.easing??s}`,height:`${t}px`}}function l(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return f(e,n),void(o.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,a])}function g(e){if(!a.A.canUseDOM)return e?u:d}function m(e){let{as:t="div",collapsed:n,children:a,animation:o,onCollapseTransitionEnd:i,className:s,disableSSRStyle:c}=e;const u=(0,r.useRef)(null);return p({collapsibleRef:u,collapsed:n,animation:o}),(0,l.jsx)(t,{ref:u,style:c?void 0:g(n),onTransitionEnd:e=>{"height"===e.propertyName&&(f(u.current,n),i?.(n))},className:s,children:a})}function h(e){let{collapsed:t,...n}=e;const[a,i]=(0,r.useState)(!t),[s,c]=(0,r.useState)(t);return(0,o.A)((()=>{t||i(!0)}),[t]),(0,o.A)((()=>{a&&c(t)}),[a,t]),a?(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})}},5041:(e,t,n)=>{"use strict";n.d(t,{M:()=>m,o:()=>g});var r=n(6540),a=n(2303),o=n(679),i=n(9532),l=n(6342),s=n(4848);const c=(0,o.Wf)("docusaurus.announcement.dismiss"),u=(0,o.Wf)("docusaurus.announcement.id"),d=()=>"true"===c.get(),f=e=>c.set(String(e)),p=r.createContext(null);function g(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.p)(),t=(0,a.A)(),[n,o]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{o(d())}),[]);const i=(0,r.useCallback)((()=>{f(!0),o(!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&&f(!1),!r&&d()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,s.jsx)(p.Provider,{value:n,children:t})}function m(){const e=(0,r.useContext)(p);if(!e)throw new i.dV("AnnouncementBarProvider");return e}},5293:(e,t,n)=>{"use strict";n.d(t,{G:()=>b,a:()=>h});var r=n(6540),a=n(8193),o=n(9532),i=n(679),l=n(6342),s=n(4848);const c=r.createContext(void 0),u="theme",d=(0,i.Wf)(u),f={light:"light",dark:"dark"},p=e=>e===f.dark?f.dark:f.light,g=e=>a.A.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e),m=e=>{d.set(p(e))};function h(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.p)(),[a,o]=(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:a=!0}=r;t?(o(t),a&&m(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?f.dark:f.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",p(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=d.get();null!==t&&i(p(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:a,setColorMode:i,get isDarkTheme(){return a===f.dark},setLightTheme(){i(f.light)},setDarkTheme(){i(f.dark)}})),[a,i])}();return(0,s.jsx)(c.Provider,{value:n,children:t})}function b(){const e=(0,r.useContext)(c);if(null==e)throw new o.dV("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},5597:(e,t,n)=>{"use strict";n.d(t,{VQ:()=>b,g1:()=>v});var r=n(6540),a=n(4070),o=n(7065),i=n(6342),l=n(1754),s=n(9532),c=n(679),u=n(4848);const d=e=>`docs-preferred-version-${e}`,f={save:(e,t,n)=>{(0,c.Wf)(d(e),{persistence:t}).set(n)},read:(e,t)=>(0,c.Wf)(d(e),{persistence:t}).get(),clear:(e,t)=>{(0,c.Wf)(d(e),{persistence:t}).del()}},p=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const g=r.createContext(null);function m(){const e=(0,a.Gy)(),t=(0,i.p)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,l]=(0,r.useState)((()=>p(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=f.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(f.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){f.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.C5?(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.dV("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=o.W);const t=(0,a.ht)(e),[n,i]=y(),{preferredVersionName:l}=n[e];return{preferredVersion:t.versions.find((e=>e.name===l))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}},6588:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,t:()=>c});var r=n(6540),a=n(9532),o=n(4848);const i=Symbol("EmptyContext"),l=r.createContext(i);function s(e){let{children:t,name:n,items:a}=e;const i=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return(0,o.jsx)(l.Provider,{value:i,children:t})}function c(){const e=(0,r.useContext)(l);if(e===i)throw new a.dV("DocsSidebarProvider");return e}},2252:(e,t,n)=>{"use strict";n.d(t,{n:()=>l,r:()=>s});var r=n(6540),a=n(9532),o=n(4848);const i=r.createContext(null);function l(e){let{children:t,version:n}=e;return(0,o.jsx)(i.Provider,{value:n,children:t})}function s(){const e=(0,r.useContext)(i);if(null===e)throw new a.dV("DocsVersionProvider");return e}},9876:(e,t,n)=>{"use strict";n.d(t,{e:()=>p,M:()=>g});var r=n(6540),a=n(5600),o=n(4581),i=n(6347),l=n(9532);function s(e){!function(e){const t=(0,i.W6)(),n=(0,l._q)(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(6342),u=n(4848);const d=r.createContext(void 0);function f(){const e=function(){const e=(0,a.YL)(),{items:t}=(0,c.p)().navbar;return 0===t.length&&!e.component}(),t=(0,o.l)(),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 p(e){let{children:t}=e;const n=f();return(0,u.jsx)(d.Provider,{value:n,children:t})}function g(){const e=r.useContext(d);if(void 0===e)throw new l.dV("NavbarMobileSidebarProvider");return e}},5600:(e,t,n)=>{"use strict";n.d(t,{GX:()=>c,YL:()=>s,y_:()=>l});var r=n(6540),a=n(9532),o=n(4848);const i=r.createContext(null);function l(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,o.jsx)(i.Provider,{value:n,children:t})}function s(){const e=(0,r.useContext)(i);if(!e)throw new a.dV("NavbarSecondaryMenuContentProvider");return e[0]}function c(e){let{component:t,props:n}=e;const o=(0,r.useContext)(i);if(!o)throw new a.dV("NavbarSecondaryMenuContentProvider");const[,l]=o,s=(0,a.Be)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},4090:(e,t,n)=>{"use strict";n.d(t,{w:()=>a,J:()=>o});var r=n(6540);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},4581:(e,t,n)=>{"use strict";n.d(t,{l:()=>l});var r=n(6540),a=n(8193);const o={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(!a.A.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?o.desktop:o.mobile}(t))}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[t]),n}},7559:(e,t,n)=>{"use strict";n.d(t,{G:()=>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:{blogFooterTagsRow:"theme-blog-footer-tags-row",blogFooterEditMetaRow:"theme-blog-footer-edit-meta-row"},pages:{pageFooterEditMetaRow:"theme-pages-footer-edit-meta-row"}}},3109:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{O:()=>r})},1754:(e,t,n)=>{"use strict";n.d(t,{Nr:()=>p,w8:()=>h,C5:()=>f,B5:()=>E,Vd:()=>k,QB:()=>S,fW:()=>x,OF:()=>w,Y:()=>y});var r=n(6540),a=n(6347),o=n(2831),i=n(4070),l=n(5597),s=n(2252),c=n(6588);function u(e){return Array.from(new Set(e))}var d=n(9169);const f=!!i.Gy;function p(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=p(t);if(e)return e}}(e):void 0:e.href}const g=(e,t)=>void 0!==e&&(0,d.ys)(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 a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,d.ys)(o.href,n)||e(o.items))||"link"===o.type&&(0,d.ys)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function w(){const e=(0,c.t)(),{pathname:t}=(0,a.zy)(),n=(0,i.vT)()?.pluginData.breadcrumbs;return!1!==n&&e?v({sidebarItems:e.items,pathname:t}):null}function k(e){const{activeVersion:t}=(0,i.zK)(e),{preferredVersion:n}=(0,l.g1)(e),a=(0,i.r7)(e);return(0,r.useMemo)((()=>u([t,n,a].filter(Boolean))),[t,n,a])}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,a.zy)(),r=(0,s.r)(),i=t.routes,l=i.find((e=>(0,a.B6)(n.pathname,e)));if(!l)return null;const c=l.sidebar,u=c?r.docsSidebars[c]:void 0;return{docElement:(0,o.v)(i),sidebarName:c,sidebarItems:u}}},1213:(e,t,n)=>{"use strict";n.d(t,{e3:()=>f,be:()=>u,Jx:()=>p});var r=n(6540),a=n(4164),o=n(5260),i=n(6803),l=n(6025),s=n(4586);var c=n(4848);function u(e){let{title:t,description:n,keywords:r,image:a,children:i}=e;const u=function(e){const{siteConfig:t}=(0,s.A)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,l.hH)(),f=a?d(a,{absolute:!0}):void 0;return(0,c.jsxs)(o.A,{children:[t&&(0,c.jsx)("title",{children:u}),t&&(0,c.jsx)("meta",{property:"og:title",content:u}),n&&(0,c.jsx)("meta",{name:"description",content:n}),n&&(0,c.jsx)("meta",{property:"og:description",content:n}),r&&(0,c.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),f&&(0,c.jsx)("meta",{property:"og:image",content:f}),f&&(0,c.jsx)("meta",{name:"twitter:image",content:f}),i]})}const d=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(d),l=(0,a.A)(i,t);return(0,c.jsxs)(d.Provider,{value:l,children:[(0,c.jsx)(o.A,{children:(0,c.jsx)("html",{className:l})}),n]})}function p(e){let{children:t}=e;const n=(0,i.A)(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const o=`plugin-id-${n.plugin.id}`;return(0,c.jsx)(f,{className:(0,a.A)(r,o),children:t})}},9532:(e,t,n)=>{"use strict";n.d(t,{Be:()=>c,ZC:()=>l,_q:()=>i,dV:()=>s,fM:()=>u});var r=n(6540),a=n(205),o=n(4848);function i(e){const t=(0,r.useRef)(e);return(0,a.A)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function l(e){const t=(0,r.useRef)();return(0,a.A)((()=>{t.current=e})),t.current}class s extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?<name>\w+)/)?.groups.name??""} is called outside the <${e}>. ${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,o.jsx)(o.Fragment,{children:e.reduceRight(((e,t)=>(0,o.jsx)(t,{children:e})),n)})}}},9169:(e,t,n)=>{"use strict";n.d(t,{Dt:()=>l,ys:()=>i});var r=n(6540),a=n(8328),o=n(4586);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function l(){const{baseUrl:e}=(0,o.A)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.A,baseUrl:e})),[e])}},3104:(e,t,n)=>{"use strict";n.d(t,{Mq:()=>f,Tv:()=>c,gk:()=>p});var r=n(6540),a=n(8193),o=n(2303),i=(n(205),n(9532)),l=n(4848);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.dV("ScrollControllerProvider");return e}const d=()=>a.A.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function f(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),a=(0,r.useRef)(d()),o=(0,i._q)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=d();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function p(){const e=(0,r.useRef)(null),t=(0,o.A)()&&"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 a=document.documentElement.scrollTop;(n&&a>e||!n&&a<e)&&(t=requestAnimationFrame(r),window.scrollTo(0,Math.floor(.85*(a-e))+e))}(),()=>t&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},2967:(e,t,n)=>{"use strict";n.d(t,{Cy:()=>r,tU:()=>a});n(4586);const r="default";function a(e,t){return`docs-${e}-${t}`}},679:(e,t,n)=>{"use strict";n.d(t,{Wf:()=>c});n(6540);const r=JSON.parse('{"N":"localStorage","M":""}'),a=r.N;function o(e){let{key:t,oldValue:n,newValue:r,storage:a}=e;if(n===r)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}function i(e){if(void 0===e&&(e=a),"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,l||(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),l=!0),null}var t}let l=!1;const s={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function c(e,t){const n=`${e}${r.M}`;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}}(n);const a=i(t?.persistence);return null===a?s:{get:()=>{try{return a.getItem(n)}catch(e){return console.error(`Docusaurus storage error, can't get key=${n}`,e),null}},set:e=>{try{const t=a.getItem(n);a.setItem(n,e),o({key:n,oldValue:t,newValue:e,storage:a})}catch(t){console.error(`Docusaurus storage error, can't set ${n}=${e}`,t)}},del:()=>{try{const e=a.getItem(n);a.removeItem(n),o({key:n,oldValue:e,newValue:null,storage:a})}catch(e){console.error(`Docusaurus storage error, can't delete key=${n}`,e)}},listen:e=>{try{const t=t=>{t.storageArea===a&&t.key===n&&e(t)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)}catch(t){return console.error(`Docusaurus storage error, can't listen for changes of key=${n}`,t),()=>{}}}}}},2131:(e,t,n)=>{"use strict";n.d(t,{o:()=>i});var r=n(4586),a=n(6347),o=n(440);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:l}}=(0,r.A)(),{pathname:s}=(0,a.zy)(),c=(0,o.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}`}}}},5062:(e,t,n)=>{"use strict";n.d(t,{$:()=>i});var r=n(6540),a=n(6347),o=n(9532);function i(e){const t=(0,a.zy)(),n=(0,o.ZC)(t),i=(0,o._q)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6342:(e,t,n)=>{"use strict";n.d(t,{p:()=>a});var r=n(4586);function a(){return(0,r.A)().siteConfig.themeConfig}},2983:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.removeTrailingSlash=t.addLeadingSlash=t.addTrailingSlash=void 0;const r=n(2566);function a(e){return e.endsWith("/")?e:`${e}/`}function o(e){return(0,r.removeSuffix)(e,"/")}t.addTrailingSlash=a,t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[i]=e.split(/[#?]/),l="/"===i||i===r?i:(s=i,n?a(s):o(s));var s;return e.replace(i,l)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=o},253:(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]}},440: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.removePrefix=t.addSuffix=t.removeSuffix=t.addPrefix=t.removeTrailingSlash=t.addLeadingSlash=t.addTrailingSlash=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var a=n(2983);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}}),Object.defineProperty(t,"addTrailingSlash",{enumerable:!0,get:function(){return a.addTrailingSlash}}),Object.defineProperty(t,"addLeadingSlash",{enumerable:!0,get:function(){return a.addLeadingSlash}}),Object.defineProperty(t,"removeTrailingSlash",{enumerable:!0,get:function(){return a.removeTrailingSlash}});var o=n(2566);Object.defineProperty(t,"addPrefix",{enumerable:!0,get:function(){return o.addPrefix}}),Object.defineProperty(t,"removeSuffix",{enumerable:!0,get:function(){return o.removeSuffix}}),Object.defineProperty(t,"addSuffix",{enumerable:!0,get:function(){return o.addSuffix}}),Object.defineProperty(t,"removePrefix",{enumerable:!0,get:function(){return o.removePrefix}});var i=n(253);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return i.getErrorCausalChain}})},2566:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.removePrefix=t.addSuffix=t.removeSuffix=t.addPrefix=void 0,t.addPrefix=function(e,t){return e.startsWith(t)?e:`${t}${e}`},t.removeSuffix=function(e,t){return""===t?e:e.endsWith(t)?e.slice(0,-t.length):e},t.addSuffix=function(e,t){return e.endsWith(t)?e:`${e}${t}`},t.removePrefix=function(e,t){return e.startsWith(t)?e.slice(t.length):e}},1513:(e,t,n)=>{"use strict";n.d(t,{zR:()=>w,TM:()=>C,yJ:()=>p,sC:()=>T,AO:()=>f});var r=n(8168);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r<a;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&&a(e),s=t&&a(t),c=l||s;if(e&&a(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,f=i.length;f>=0;f--){var p=i[f];"."===p?o(i,f):".."===p?(o(i,f),d++):d&&(o(i,f),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&a(i[0])||i.unshift("");var g=i.join("/");return n&&"/"!==g.substr(-1)&&(g+="/"),g};var l=n(1561);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 f(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function p(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.A)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function g(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!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.A)(!1);var t,n=window.history,a=(-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,o=!(-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,a=window.location,o=a.pathname+a.search+a.hash;return _&&(o=u(o,_)),p(o,r,n)}function A(){return Math.random().toString(36).substr(2,E)}var T=g();function L(e){(0,r.A)(B,e),B.length=n.length,T.notifyListeners(B.location,B.action)}function N(e){(function(e){return void 0===e.state&&-1===navigator.userAgent.indexOf("CriOS")})(e)||O(C(e.state))}function R(){O(C(v()))}var P=!1;function O(e){if(P)P=!1,L();else{T.confirmTransitionTo(e,"POP",x,(function(t){t?L({action:"POP",location:e}):function(e){var t=B.location,n=M.indexOf(t.key);-1===n&&(n=0);var r=M.indexOf(e.key);-1===r&&(r=0);var a=n-r;a&&(P=!0,D(a))}(e)}))}}var j=C(v()),M=[j.key];function I(e){return _+f(e)}function D(e){n.go(e)}var F=0;function z(e){1===(F+=e)&&1===e?(window.addEventListener(b,N),o&&window.addEventListener(y,R)):0===F&&(window.removeEventListener(b,N),o&&window.removeEventListener(y,R))}var $=!1;var B={length:n.length,action:"POP",location:j,createHref:I,push:function(e,t){var r="PUSH",o=p(e,t,A(),B.location);T.confirmTransitionTo(o,r,x,(function(e){if(e){var t=I(o),i=o.key,l=o.state;if(a)if(n.pushState({key:i,state:l},null,t),w)window.location.href=t;else{var s=M.indexOf(B.location.key),c=M.slice(0,s+1);c.push(o.key),M=c,L({action:r,location:o})}else window.location.href=t}}))},replace:function(e,t){var r="REPLACE",o=p(e,t,A(),B.location);T.confirmTransitionTo(o,r,x,(function(e){if(e){var t=I(o),i=o.key,l=o.state;if(a)if(n.replaceState({key:i,state:l},null,t),w)window.location.replace(t);else{var s=M.indexOf(B.location.key);-1!==s&&(M[s]=o.key),L({action:r,location:o})}else window.location.replace(t)}}))},go:D,goBack:function(){D(-1)},goForward:function(){D(1)},block:function(e){void 0===e&&(e=!1);var t=T.setPrompt(e);return $||(z(1),$=!0),function(){return $&&($=!1,z(-1)),t()}},listen:function(e){var t=T.appendListener(e);return z(1),function(){z(-1),t()}}};return B}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.A)(!1);var t=window.history,n=(window.navigator.userAgent.indexOf("Firefox"),e),a=n.getUserConfirmation,o=void 0===a?h:a,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)),p(e)}var A=g();function T(e){(0,r.A)($,e),$.length=t.length,A.notifyListeners($.location,$.action)}var L=!1,N=null;function R(){var e,t,n=E(),r=v(n);if(n!==r)_(r);else{var a=C(),i=$.location;if(!L&&(t=a,(e=i).pathname===t.pathname&&e.search===t.search&&e.hash===t.hash))return;if(N===f(a))return;N=null,function(e){if(L)L=!1,T();else{var t="POP";A.confirmTransitionTo(e,t,o,(function(n){n?T({action:t,location:e}):function(e){var t=$.location,n=M.lastIndexOf(f(t));-1===n&&(n=0);var r=M.lastIndexOf(f(e));-1===r&&(r=0);var a=n-r;a&&(L=!0,I(a))}(e)}))}}(a)}}var P=E(),O=v(P);P!==O&&_(O);var j=C(),M=[f(j)];function I(e){t.go(e)}var D=0;function F(e){1===(D+=e)&&1===e?window.addEventListener(k,R):0===D&&window.removeEventListener(k,R)}var z=!1;var $={length:t.length,action:"POP",location:j,createHref:function(e){var t=document.querySelector("base"),n="";return t&&t.getAttribute("href")&&(n=S(window.location.href)),n+"#"+v(b+f(e))},push:function(e,t){var n="PUSH",r=p(e,void 0,void 0,$.location);A.confirmTransitionTo(r,n,o,(function(e){if(e){var t=f(r),a=v(b+t);if(E()!==a){N=t,function(e){window.location.hash=e}(a);var o=M.lastIndexOf(f($.location)),i=M.slice(0,o+1);i.push(t),M=i,T({action:n,location:r})}else T()}}))},replace:function(e,t){var n="REPLACE",r=p(e,void 0,void 0,$.location);A.confirmTransitionTo(r,n,o,(function(e){if(e){var t=f(r),a=v(b+t);E()!==a&&(N=t,_(a));var o=M.indexOf(f($.location));-1!==o&&(M[o]=t),T({action:n,location:r})}}))},go:I,goBack:function(){I(-1)},goForward:function(){I(1)},block:function(e){void 0===e&&(e=!1);var t=A.setPrompt(e);return z||(F(1),z=!0),function(){return z&&(z=!1,F(-1)),t()}},listen:function(e){var t=A.appendListener(e);return F(1),function(){F(-1),t()}}};return $}function A(e,t,n){return Math.min(Math.max(e,t),n)}function T(e){void 0===e&&(e={});var t=e,n=t.getUserConfirmation,a=t.initialEntries,o=void 0===a?["/"]:a,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.A)(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=A(l,0,o.length-1),b=o.map((function(e){return p(e,void 0,"string"==typeof e?m():e.key||m())})),y=f;function v(e){var t=A(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",a=p(e,t,m(),w.location);u.confirmTransitionTo(a,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,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=p(e,t,m(),w.location);u.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},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}},4146:(e,t,n)=>{"use strict";var r=n(4363),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={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]||a}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,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,g=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(g){var a=p(n);a&&a!==g&&e(t,a,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(!(o[b]||r&&r[b]||m&&m[b]||l&&l[b])){var y=f(n,b);try{c(t,b,y)}catch(v){}}}}return t}},311:e=>{"use strict";e.exports=function(e,t,n,r,a,o,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,a,o,i,l],u=0;(s=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},4634:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},119:(e,t,n)=>{"use strict";n.r(t)},1043:(e,t,n)=>{"use strict";n.r(t)},5947:function(e,t,n){var r,a;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 a(e,t,n){return e<t?t:e>n?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}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=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),c=o.querySelector(r.barSelector),u=r.speed,d=r.easing;return o.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(c,i(e,u,d)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(o,{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)*a(Math.random()*t,.1,.95)),t=a(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 a,i=t.querySelector(r.barSelector),l=e?"-100":o(n.status||0),c=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&p(a),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&&p(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,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function c(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=f(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},7022:()=>{!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i<a.length;i++)o[a[i]]=e.languages.bash[a[i]];e.languages.sh=e.languages.bash,e.languages.shell=e.languages.bash}(Prism)},2514:()=>{Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},Prism.languages.webmanifest=Prism.languages.json},9700:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,l=i.length;-1!==n.code.indexOf(a=t(r,l));)++l;return i[l]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(l){for(var s=0;s<l.length&&!(a>=o.length);s++){var c=l[s];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=o[a],d=n.tokenStack[u],f="string"==typeof c?c:c.content,p=t(r,u),g=f.indexOf(p);if(g>-1){++a;var m=f.substring(0,g),h=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=f.substring(g+p.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)},3554:()=>{!function(e){var t=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,n=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],r=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,a=/<?=>|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,o=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:t,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:r,operator:a,punctuation:o};var i={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},l=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:i}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:i}}];e.languages.insertBefore("php","variable",{string:l,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:t,string:l,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,number:r,operator:a,punctuation:o}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",(function(t){if(/<\?/.test(t.code)){e.languages["markup-templating"].buildPlaceholders(t,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)}})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"php")}))}(Prism)},2022:(e,t,n)=>{var r={"./prism-bash":7022,"./prism-json":2514,"./prism-php":3554};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=2022},2694:(e,t,n)=>{"use strict";var r=n(6925);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,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:o,resetWarningCache:a};return n.PropTypes=n,n}},5556:(e,t,n)=>{e.exports=n(2694)()},6925:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},2551:(e,t,n)=>{"use strict";var r=n(6540),a=n(9982);function o(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,f=/^[: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]*$/,p={},g={};function m(e,t,n,r,a,o,i){this.acceptsBooleans=2===t||3===t||4===t,this.attributeName=r,this.attributeNamespace=a,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=o,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 a=h.hasOwnProperty(t)?h[t]:null;(null!==a?0!==a.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,a,r)&&(n=null),r||null===a?function(e){return!!d.call(g,e)||!d.call(p,e)&&(f.test(e)?g[e]=!0:(p[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n)):a.mustUseProperty?e[a.propertyName]=null===n?3!==a.type&&"":n:(t=a.attributeName,r=a.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(a=a.type)||4===a&&!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"),A=Symbol.for("react.context"),T=Symbol.for("react.forward_ref"),L=Symbol.for("react.suspense"),N=Symbol.for("react.suspense_list"),R=Symbol.for("react.memo"),P=Symbol.for("react.lazy");Symbol.for("react.scope"),Symbol.for("react.debug_trace_mode");var O=Symbol.for("react.offscreen");Symbol.for("react.legacy_hidden"),Symbol.for("react.cache"),Symbol.for("react.tracing_marker");var j=Symbol.iterator;function M(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=j&&e[j]||e["@@iterator"])?e:null}var I,D=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 $(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 a=c.stack.split("\n"),o=r.stack.split("\n"),i=a.length-1,l=o.length-1;1<=i&&0<=l&&a[i]!==o[l];)l--;for(;1<=i&&0<=l;i--,l--)if(a[i]!==o[l]){if(1!==i||1!==l)do{if(i--,0>--l||a[i]!==o[l]){var s="\n"+a[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 B(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=$(e.type,!1);case 11:return e=$(e.type.render,!1);case 1:return e=$(e.type,!0);default:return""}}function U(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 L:return"Suspense";case N:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case A:return(e.displayName||"Context")+".Consumer";case C:return(e._context.displayName||"Context")+".Provider";case T:var t=e.render;return(e=e.displayName)||(e=""!==(e=t.displayName||t.name||"")?"ForwardRef("+e+")":"ForwardRef"),e;case R:return null!==(t=e.displayName||null)?t:U(e.type)||"Memo";case P:t=e._payload,e=e._init;try{return U(e(t))}catch(n){}}return null}function H(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 U(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 V(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":case"object":return e;default:return""}}function W(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function G(e){e._valueTracker||(e._valueTracker=function(e){var t=W(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 a=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return a.call(this)},set:function(e){r=""+e,o.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 q(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=W(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function Y(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 K(e,t){var n=t.checked;return D({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function Q(e,t){var n=null==t.defaultValue?"":t.defaultValue,r=null!=t.checked?t.checked:t.defaultChecked;n=V(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 Z(e,t){null!=(t=t.checked)&&v(e,"checked",t,!1)}function X(e,t){Z(e,t);var n=V(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,V(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&&Y(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 a=0;a<n.length;a++)t["$"+n[a]]=!0;for(n=0;n<e.length;n++)a=t.hasOwnProperty("$"+e[n].value),e[n].selected!==a&&(e[n].selected=a),a&&r&&(e[n].defaultSelected=!0)}else{for(n=""+V(n),t=null,a=0;a<e.length;a++){if(e[a].value===n)return e[a].selected=!0,void(r&&(e[a].defaultSelected=!0));null!==t||e[a].disabled||(t=e[a])}null!==t&&(t.selected=!0)}}function re(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(o(91));return D({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function ae(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultValue,null!=n){if(null!=t)throw Error(o(92));if(te(n)){if(1<n.length)throw Error(o(93));n=n[0]}t=n}null==t&&(t=""),n=t}e._wrapperState={initialValue:V(n)}}function oe(e,t){var n=V(t.value),r=V(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 fe(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 pe={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||pe.hasOwnProperty(e)&&pe[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("--"),a=me(n,t[n],r);"float"===n&&(n="cssFloat"),r?e.setProperty(n,a):e[n]=a}}Object.keys(pe).forEach((function(e){ge.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),pe[t]=pe[e]}))}));var be=D({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(o(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(o(60));if("object"!=typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(o(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(o(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=va(e)){if("function"!=typeof xe)throw Error(o(280));var t=e.stateNode;t&&(t=ka(t),xe(e.stateNode,e.type,t))}}function Ce(e){Se?Ee?Ee.push(e):Ee=[e]:Se=e}function Ae(){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 Te(e,t){return e(t)}function Le(){}var Ne=!1;function Re(e,t,n){if(Ne)return e(t,n);Ne=!0;try{return Te(e,t,n)}finally{Ne=!1,(null!==Se||null!==Ee)&&(Le(),Ae())}}function Pe(e,t){var n=e.stateNode;if(null===n)return null;var r=ka(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(o(231,t,typeof n));return n}var Oe=!1;if(u)try{var je={};Object.defineProperty(je,"passive",{get:function(){Oe=!0}}),window.addEventListener("test",je,je),window.removeEventListener("test",je,je)}catch(ue){Oe=!1}function Me(e,t,n,r,a,o,i,l,s){var c=Array.prototype.slice.call(arguments,3);try{t.apply(n,c)}catch(u){this.onError(u)}}var Ie=!1,De=null,Fe=!1,ze=null,$e={onError:function(e){Ie=!0,De=e}};function Be(e,t,n,r,a,o,i,l,s){Ie=!1,De=null,Me.apply($e,arguments)}function Ue(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 He(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 Ve(e){if(Ue(e)!==e)throw Error(o(188))}function We(e){return null!==(e=function(e){var t=e.alternate;if(!t){if(null===(t=Ue(e)))throw Error(o(188));return t!==e?null:e}for(var n=e,r=t;;){var a=n.return;if(null===a)break;var i=a.alternate;if(null===i){if(null!==(r=a.return)){n=r;continue}break}if(a.child===i.child){for(i=a.child;i;){if(i===n)return Ve(a),e;if(i===r)return Ve(a),t;i=i.sibling}throw Error(o(188))}if(n.return!==r.return)n=a,r=i;else{for(var l=!1,s=a.child;s;){if(s===n){l=!0,n=a,r=i;break}if(s===r){l=!0,r=a,n=i;break}s=s.sibling}if(!l){for(s=i.child;s;){if(s===n){l=!0,n=i,r=a;break}if(s===r){l=!0,r=i,n=a;break}s=s.sibling}if(!l)throw Error(o(189))}}if(n.alternate!==r)throw Error(o(190))}if(3!==n.tag)throw Error(o(188));return n.stateNode.current===n?e:t}(e))?Ge(e):null}function Ge(e){if(5===e.tag||6===e.tag)return e;for(e=e.child;null!==e;){var t=Ge(e);if(null!==t)return t;e=e.sibling}return null}var qe=a.unstable_scheduleCallback,Ye=a.unstable_cancelCallback,Ke=a.unstable_shouldYield,Qe=a.unstable_requestPaint,Ze=a.unstable_now,Xe=a.unstable_getCurrentPriorityLevel,Je=a.unstable_ImmediatePriority,et=a.unstable_UserBlockingPriority,tt=a.unstable_NormalPriority,nt=a.unstable_LowPriority,rt=a.unstable_IdlePriority,at=null,ot=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 ft(e,t){var n=e.pendingLanes;if(0===n)return 0;var r=0,a=e.suspendedLanes,o=e.pingedLanes,i=268435455&n;if(0!==i){var l=i&~a;0!==l?r=dt(l):0!==(o&=i)&&(r=dt(o))}else 0!==(i=n&~a)?r=dt(i):0!==o&&(r=dt(o));if(0===r)return 0;if(0!==t&&t!==r&&0==(t&a)&&((a=r&-r)>=(o=t&-t)||16===a&&0!=(4194240&o)))return t;if(0!=(4&r)&&(r|=16&n),0!==(t=e.entangledLanes))for(e=e.entanglements,t&=r;0<t;)a=1<<(n=31-it(t)),r|=e[n],t&=~a;return r}function pt(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),a=1<<r;a&t|e[r]&t&&(e[r]|=t),n&=~a}}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,At=[],Tt=null,Lt=null,Nt=null,Rt=new Map,Pt=new Map,Ot=[],jt="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 Mt(e,t){switch(e){case"focusin":case"focusout":Tt=null;break;case"dragenter":case"dragleave":Lt=null;break;case"mouseover":case"mouseout":Nt=null;break;case"pointerover":case"pointerout":Rt.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":Pt.delete(t.pointerId)}}function It(e,t,n,r,a,o){return null===e||e.nativeEvent!==o?(e={blockedOn:t,domEventName:n,eventSystemFlags:r,nativeEvent:o,targetContainers:[a]},null!==t&&(null!==(t=va(t))&&xt(t)),e):(e.eventSystemFlags|=r,t=e.targetContainers,null!==a&&-1===t.indexOf(a)&&t.push(a),e)}function Dt(e){var t=ya(e.target);if(null!==t){var n=Ue(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=He(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=Kt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n)return null!==(t=va(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 $t(){Ct=!1,null!==Tt&&Ft(Tt)&&(Tt=null),null!==Lt&&Ft(Lt)&&(Lt=null),null!==Nt&&Ft(Nt)&&(Nt=null),Rt.forEach(zt),Pt.forEach(zt)}function Bt(e,t){e.blockedOn===t&&(e.blockedOn=null,Ct||(Ct=!0,a.unstable_scheduleCallback(a.unstable_NormalPriority,$t)))}function Ut(e){function t(t){return Bt(t,e)}if(0<At.length){Bt(At[0],e);for(var n=1;n<At.length;n++){var r=At[n];r.blockedOn===e&&(r.blockedOn=null)}}for(null!==Tt&&Bt(Tt,e),null!==Lt&&Bt(Lt,e),null!==Nt&&Bt(Nt,e),Rt.forEach(t),Pt.forEach(t),n=0;n<Ot.length;n++)(r=Ot[n]).blockedOn===e&&(r.blockedOn=null);for(;0<Ot.length&&null===(n=Ot[0]).blockedOn;)Dt(n),null===n.blockedOn&&Ot.shift()}var Ht=w.ReactCurrentBatchConfig,Vt=!0;function Wt(e,t,n,r){var a=vt,o=Ht.transition;Ht.transition=null;try{vt=1,qt(e,t,n,r)}finally{vt=a,Ht.transition=o}}function Gt(e,t,n,r){var a=vt,o=Ht.transition;Ht.transition=null;try{vt=4,qt(e,t,n,r)}finally{vt=a,Ht.transition=o}}function qt(e,t,n,r){if(Vt){var a=Kt(e,t,n,r);if(null===a)Vr(e,t,r,Yt,n),Mt(e,r);else if(function(e,t,n,r,a){switch(t){case"focusin":return Tt=It(Tt,e,t,n,r,a),!0;case"dragenter":return Lt=It(Lt,e,t,n,r,a),!0;case"mouseover":return Nt=It(Nt,e,t,n,r,a),!0;case"pointerover":var o=a.pointerId;return Rt.set(o,It(Rt.get(o)||null,e,t,n,r,a)),!0;case"gotpointercapture":return o=a.pointerId,Pt.set(o,It(Pt.get(o)||null,e,t,n,r,a)),!0}return!1}(a,e,t,n,r))r.stopPropagation();else if(Mt(e,r),4&t&&-1<jt.indexOf(e)){for(;null!==a;){var o=va(a);if(null!==o&&kt(o),null===(o=Kt(e,t,n,r))&&Vr(e,t,r,Yt,n),o===a)break;a=o}null!==a&&r.stopPropagation()}else Vr(e,t,r,null,n)}}var Yt=null;function Kt(e,t,n,r){if(Yt=null,null!==(e=ya(e=ke(r))))if(null===(t=Ue(e)))e=null;else if(13===(n=t.tag)){if(null!==(e=He(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 Yt=e,null}function Qt(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(Xe()){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 Zt=null,Xt=null,Jt=null;function en(){if(Jt)return Jt;var e,t,n=Xt,r=n.length,a="value"in Zt?Zt.value:Zt.textContent,o=a.length;for(e=0;e<r&&n[e]===a[e];e++);var i=r-e;for(t=1;t<=i&&n[r-t]===a[o-t];t++);return Jt=a.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 an(e){function t(t,n,r,a,o){for(var i in this._reactName=t,this._targetInst=r,this.type=n,this.nativeEvent=a,this.target=o,this.currentTarget=null,e)e.hasOwnProperty(i)&&(t=e[i],this[i]=t?t(a):a[i]);return this.isDefaultPrevented=(null!=a.defaultPrevented?a.defaultPrevented:!1===a.returnValue)?nn:rn,this.isPropagationStopped=rn,this}return D(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 on,ln,sn,cn={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},un=an(cn),dn=D({},cn,{view:0,detail:0}),fn=an(dn),pn=D({},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?(on=e.screenX-sn.screenX,ln=e.screenY-sn.screenY):ln=on=0,sn=e),on)},movementY:function(e){return"movementY"in e?e.movementY:ln}}),gn=an(pn),mn=an(D({},pn,{dataTransfer:0})),hn=an(D({},dn,{relatedTarget:0})),bn=an(D({},cn,{animationName:0,elapsedTime:0,pseudoElement:0})),yn=D({},cn,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),vn=an(yn),wn=an(D({},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=D({},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}}),An=an(Cn),Tn=an(D({},pn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),Ln=an(D({},dn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:_n})),Nn=an(D({},cn,{propertyName:0,elapsedTime:0,pseudoElement:0})),Rn=D({},pn,{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}),Pn=an(Rn),On=[9,13,27,32],jn=u&&"CompositionEvent"in window,Mn=null;u&&"documentMode"in document&&(Mn=document.documentMode);var In=u&&"TextEvent"in window&&!Mn,Dn=u&&(!jn||Mn&&8<Mn&&11>=Mn),Fn=String.fromCharCode(32),zn=!1;function $n(e,t){switch(e){case"keyup":return-1!==On.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Bn(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var Un=!1;var Hn={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 Vn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!Hn[e.type]:"textarea"===t}function Wn(e,t,n,r){Ce(r),0<(t=Gr(t,"onChange")).length&&(n=new un("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Gn=null,qn=null;function Yn(e){Fr(e,0)}function Kn(e){if(q(wa(e)))return e}function Qn(e,t){if("change"===e)return t}var Zn=!1;if(u){var Xn;if(u){var Jn="oninput"in document;if(!Jn){var er=document.createElement("div");er.setAttribute("oninput","return;"),Jn="function"==typeof er.oninput}Xn=Jn}else Xn=!1;Zn=Xn&&(!document.documentMode||9<document.documentMode)}function tr(){Gn&&(Gn.detachEvent("onpropertychange",nr),qn=Gn=null)}function nr(e){if("value"===e.propertyName&&Kn(qn)){var t=[];Wn(t,qn,e,ke(e)),Re(Yn,t)}}function rr(e,t,n){"focusin"===e?(tr(),qn=n,(Gn=t).attachEvent("onpropertychange",nr)):"focusout"===e&&tr()}function ar(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return Kn(qn)}function or(e,t){if("click"===e)return Kn(t)}function ir(e,t){if("input"===e||"change"===e)return Kn(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 a=n[r];if(!d.call(t,a)||!lr(e[a],t[a]))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 fr(){for(var e=window,t=Y();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=Y((e=t.contentWindow).document)}return t}function pr(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=fr(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&dr(n.ownerDocument.documentElement,n)){if(null!==r&&pr(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 a=n.textContent.length,o=Math.min(r.start,a);r=void 0===r.end?o:Math.min(r.end,a),!e.extend&&o>r&&(a=r,r=o,o=a),a=ur(n,o);var i=ur(n,r);a&&i&&(1!==e.rangeCount||e.anchorNode!==a.node||e.anchorOffset!==a.offset||e.focusNode!==i.node||e.focusOffset!==i.offset)&&((t=t.createRange()).setStart(a.node,a.offset),e.removeAllRanges(),o>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!==Y(r)||("selectionStart"in(r=hr)&&pr(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=Gr(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"),Ar=_r("animationiteration"),Tr=_r("animationstart"),Lr=_r("transitionend"),Nr=new Map,Rr="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 Pr(e,t){Nr.set(e,t),s(t,[e])}for(var Or=0;Or<Rr.length;Or++){var jr=Rr[Or];Pr(jr.toLowerCase(),"on"+(jr[0].toUpperCase()+jr.slice(1)))}Pr(Cr,"onAnimationEnd"),Pr(Ar,"onAnimationIteration"),Pr(Tr,"onAnimationStart"),Pr("dblclick","onDoubleClick"),Pr("focusin","onFocus"),Pr("focusout","onBlur"),Pr(Lr,"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 Mr="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(Mr));function Dr(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,function(e,t,n,r,a,i,l,s,c){if(Be.apply(this,arguments),Ie){if(!Ie)throw Error(o(198));var u=De;Ie=!1,De=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],a=r.event;r=r.listeners;e:{var o=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!==o&&a.isPropagationStopped())break e;Dr(a,l,c),o=s}else for(i=0;i<r.length;i++){if(s=(l=r[i]).instance,c=l.currentTarget,l=l.listener,s!==o&&a.isPropagationStopped())break e;Dr(a,l,c),o=s}}}if(Fe)throw e=ze,Fe=!1,ze=null,e}function zr(e,t){var n=t[ma];void 0===n&&(n=t[ma]=new Set);var r=e+"__bubble";n.has(r)||(Hr(t,e,2,!1),n.add(r))}function $r(e,t,n){var r=0;t&&(r|=4),Hr(n,e,r,t)}var Br="_reactListening"+Math.random().toString(36).slice(2);function Ur(e){if(!e[Br]){e[Br]=!0,i.forEach((function(t){"selectionchange"!==t&&(Ir.has(t)||$r(t,!1,e),$r(t,!0,e))}));var t=9===e.nodeType?e:e.ownerDocument;null===t||t[Br]||(t[Br]=!0,$r("selectionchange",!1,t))}}function Hr(e,t,n,r){switch(Qt(t)){case 1:var a=Wt;break;case 4:a=Gt;break;default:a=qt}n=a.bind(null,t,n,e),a=void 0,!Oe||"touchstart"!==t&&"touchmove"!==t&&"wheel"!==t||(a=!0),r?void 0!==a?e.addEventListener(t,n,{capture:!0,passive:a}):e.addEventListener(t,n,!0):void 0!==a?e.addEventListener(t,n,{passive:a}):e.addEventListener(t,n,!1)}function Vr(e,t,n,r,a){var o=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===a||8===l.nodeType&&l.parentNode===a)break;if(4===i)for(i=r.return;null!==i;){var s=i.tag;if((3===s||4===s)&&((s=i.stateNode.containerInfo)===a||8===s.nodeType&&s.parentNode===a))return;i=i.return}for(;null!==l;){if(null===(i=ya(l)))return;if(5===(s=i.tag)||6===s){r=o=i;continue e}l=l.parentNode}}r=r.return}Re((function(){var r=o,a=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=An;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=Ln;break;case Cr:case Ar:case Tr:s=bn;break;case Lr:s=Nn;break;case"scroll":s=fn;break;case"wheel":s=Pn;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=Tn}var u=0!=(4&t),d=!u&&"scroll"===e,f=u?null!==l?l+"Capture":null:l;u=[];for(var p,g=r;null!==g;){var m=(p=g).stateNode;if(5===p.tag&&null!==m&&(p=m,null!==f&&(null!=(m=Pe(g,f))&&u.push(Wr(g,m,p)))),d)break;g=g.return}0<u.length&&(l=new s(l,c,null,n,a),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)||!ya(c)&&!c[ga])&&(s||l)&&(l=a.window===a?a:(l=a.ownerDocument)?l.defaultView||l.parentWindow:window,s?(s=r,null!==(c=(c=n.relatedTarget||n.toElement)?ya(c):null)&&(c!==(d=Ue(c))||5!==c.tag&&6!==c.tag)&&(c=null)):(s=null,c=r),s!==c)){if(u=gn,m="onMouseLeave",f="onMouseEnter",g="mouse","pointerout"!==e&&"pointerover"!==e||(u=Tn,m="onPointerLeave",f="onPointerEnter",g="pointer"),d=null==s?l:wa(s),p=null==c?l:wa(c),(l=new u(m,g+"leave",s,n,a)).target=d,l.relatedTarget=p,m=null,ya(a)===r&&((u=new u(f,g+"enter",c,n,a)).target=p,u.relatedTarget=d,m=u),d=m,s&&c)e:{for(f=c,g=0,p=u=s;p;p=qr(p))g++;for(p=0,m=f;m;m=qr(m))p++;for(;0<g-p;)u=qr(u),g--;for(;0<p-g;)f=qr(f),p--;for(;g--;){if(u===f||null!==f&&u===f.alternate)break e;u=qr(u),f=qr(f)}u=null}else u=null;null!==s&&Yr(i,l,s,u,!1),null!==c&&null!==d&&Yr(i,d,c,u,!0)}if("select"===(s=(l=r?wa(r):window).nodeName&&l.nodeName.toLowerCase())||"input"===s&&"file"===l.type)var h=Qn;else if(Vn(l))if(Zn)h=ir;else{h=ar;var b=rr}else(s=l.nodeName)&&"input"===s.toLowerCase()&&("checkbox"===l.type||"radio"===l.type)&&(h=or);switch(h&&(h=h(e,r))?Wn(i,h,n,a):(b&&b(e,l,r),"focusout"===e&&(b=l._wrapperState)&&b.controlled&&"number"===l.type&&ee(l,"number",l.value)),b=r?wa(r):window,e){case"focusin":(Vn(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,a);break;case"selectionchange":if(mr)break;case"keydown":case"keyup":wr(i,n,a)}var y;if(jn)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 Un?$n(e,n)&&(v="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(v="onCompositionStart");v&&(Dn&&"ko"!==n.locale&&(Un||"onCompositionStart"!==v?"onCompositionEnd"===v&&Un&&(y=en()):(Xt="value"in(Zt=a)?Zt.value:Zt.textContent,Un=!0)),0<(b=Gr(r,v)).length&&(v=new wn(v,e,null,n,a),i.push({event:v,listeners:b}),y?v.data=y:null!==(y=Bn(n))&&(v.data=y))),(y=In?function(e,t){switch(e){case"compositionend":return Bn(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(Un)return"compositionend"===e||!jn&&$n(e,t)?(e=en(),Jt=Xt=Zt=null,Un=!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 Dn&&"ko"!==t.locale?null:t.data}}(e,n))&&(0<(r=Gr(r,"onBeforeInput")).length&&(a=new wn("onBeforeInput","beforeinput",null,n,a),i.push({event:a,listeners:r}),a.data=y))}Fr(i,t)}))}function Wr(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Gr(e,t){for(var n=t+"Capture",r=[];null!==e;){var a=e,o=a.stateNode;5===a.tag&&null!==o&&(a=o,null!=(o=Pe(e,n))&&r.unshift(Wr(e,o,a)),null!=(o=Pe(e,t))&&r.push(Wr(e,o,a))),e=e.return}return r}function qr(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag);return e||null}function Yr(e,t,n,r,a){for(var o=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,a?null!=(s=Pe(n,o))&&i.unshift(Wr(n,s,l)):a||null!=(s=Pe(n,o))&&i.push(Wr(n,s,l))),n=n.return}0!==i.length&&e.push({event:t,listeners:i})}var Kr=/\r\n?/g,Qr=/\u0000|\uFFFD/g;function Zr(e){return("string"==typeof e?e:""+e).replace(Kr,"\n").replace(Qr,"")}function Xr(e,t,n){if(t=Zr(t),Zr(e)!==t&&n)throw Error(o(425))}function Jr(){}var ea=null,ta=null;function na(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 ra="function"==typeof setTimeout?setTimeout:void 0,aa="function"==typeof clearTimeout?clearTimeout:void 0,oa="function"==typeof Promise?Promise:void 0,ia="function"==typeof queueMicrotask?queueMicrotask:void 0!==oa?function(e){return oa.resolve(null).then(e).catch(la)}:ra;function la(e){setTimeout((function(){throw e}))}function sa(e,t){var n=t,r=0;do{var a=n.nextSibling;if(e.removeChild(n),a&&8===a.nodeType)if("/$"===(n=a.data)){if(0===r)return e.removeChild(a),void Ut(t);r--}else"$"!==n&&"$?"!==n&&"$!"!==n||r++;n=a}while(n);Ut(t)}function ca(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 ua(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 da=Math.random().toString(36).slice(2),fa="__reactFiber$"+da,pa="__reactProps$"+da,ga="__reactContainer$"+da,ma="__reactEvents$"+da,ha="__reactListeners$"+da,ba="__reactHandles$"+da;function ya(e){var t=e[fa];if(t)return t;for(var n=e.parentNode;n;){if(t=n[ga]||n[fa]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=ua(e);null!==e;){if(n=e[fa])return n;e=ua(e)}return t}n=(e=n).parentNode}return null}function va(e){return!(e=e[fa]||e[ga])||5!==e.tag&&6!==e.tag&&13!==e.tag&&3!==e.tag?null:e}function wa(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(o(33))}function ka(e){return e[pa]||null}var xa=[],Sa=-1;function Ea(e){return{current:e}}function _a(e){0>Sa||(e.current=xa[Sa],xa[Sa]=null,Sa--)}function Ca(e,t){Sa++,xa[Sa]=e.current,e.current=t}var Aa={},Ta=Ea(Aa),La=Ea(!1),Na=Aa;function Ra(e,t){var n=e.type.contextTypes;if(!n)return Aa;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var a,o={};for(a in n)o[a]=t[a];return r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=o),o}function Pa(e){return null!=(e=e.childContextTypes)}function Oa(){_a(La),_a(Ta)}function ja(e,t,n){if(Ta.current!==Aa)throw Error(o(168));Ca(Ta,t),Ca(La,n)}function Ma(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,"function"!=typeof r.getChildContext)return n;for(var a in r=r.getChildContext())if(!(a in t))throw Error(o(108,H(e)||"Unknown",a));return D({},n,r)}function Ia(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Aa,Na=Ta.current,Ca(Ta,e),Ca(La,La.current),!0}function Da(e,t,n){var r=e.stateNode;if(!r)throw Error(o(169));n?(e=Ma(e,t,Na),r.__reactInternalMemoizedMergedChildContext=e,_a(La),_a(Ta),Ca(Ta,e)):_a(La),Ca(La,n)}var Fa=null,za=!1,$a=!1;function Ba(e){null===Fa?Fa=[e]:Fa.push(e)}function Ua(){if(!$a&&null!==Fa){$a=!0;var e=0,t=vt;try{var n=Fa;for(vt=1;e<n.length;e++){var r=n[e];do{r=r(!0)}while(null!==r)}Fa=null,za=!1}catch(a){throw null!==Fa&&(Fa=Fa.slice(e+1)),qe(Je,Ua),a}finally{vt=t,$a=!1}}return null}var Ha=[],Va=0,Wa=null,Ga=0,qa=[],Ya=0,Ka=null,Qa=1,Za="";function Xa(e,t){Ha[Va++]=Ga,Ha[Va++]=Wa,Wa=e,Ga=t}function Ja(e,t,n){qa[Ya++]=Qa,qa[Ya++]=Za,qa[Ya++]=Ka,Ka=e;var r=Qa;e=Za;var a=32-it(r)-1;r&=~(1<<a),n+=1;var o=32-it(t)+a;if(30<o){var i=a-a%5;o=(r&(1<<i)-1).toString(32),r>>=i,a-=i,Qa=1<<32-it(t)+a|n<<a|r,Za=o+e}else Qa=1<<o|n<<a|r,Za=e}function eo(e){null!==e.return&&(Xa(e,1),Ja(e,1,0))}function to(e){for(;e===Wa;)Wa=Ha[--Va],Ha[Va]=null,Ga=Ha[--Va],Ha[Va]=null;for(;e===Ka;)Ka=qa[--Ya],qa[Ya]=null,Za=qa[--Ya],qa[Ya]=null,Qa=qa[--Ya],qa[Ya]=null}var no=null,ro=null,ao=!1,oo=null;function io(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 lo(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,no=e,ro=ca(t.firstChild),!0);case 6:return null!==(t=""===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,no=e,ro=null,!0);case 13:return null!==(t=8!==t.nodeType?null:t)&&(n=null!==Ka?{id:Qa,overflow:Za}:null,e.memoizedState={dehydrated:t,treeContext:n,retryLane:1073741824},(n=Rc(18,null,null,0)).stateNode=t,n.return=e,e.child=n,no=e,ro=null,!0);default:return!1}}function so(e){return 0!=(1&e.mode)&&0==(128&e.flags)}function co(e){if(ao){var t=ro;if(t){var n=t;if(!lo(e,t)){if(so(e))throw Error(o(418));t=ca(n.nextSibling);var r=no;t&&lo(e,t)?io(r,n):(e.flags=-4097&e.flags|2,ao=!1,no=e)}}else{if(so(e))throw Error(o(418));e.flags=-4097&e.flags|2,ao=!1,no=e}}}function uo(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;no=e}function fo(e){if(e!==no)return!1;if(!ao)return uo(e),ao=!0,!1;var t;if((t=3!==e.tag)&&!(t=5!==e.tag)&&(t="head"!==(t=e.type)&&"body"!==t&&!na(e.type,e.memoizedProps)),t&&(t=ro)){if(so(e))throw po(),Error(o(418));for(;t;)io(e,t),t=ca(t.nextSibling)}if(uo(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(o(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if("/$"===n){if(0===t){ro=ca(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}ro=null}}else ro=no?ca(e.stateNode.nextSibling):null;return!0}function po(){for(var e=ro;e;)e=ca(e.nextSibling)}function go(){ro=no=null,ao=!1}function mo(e){null===oo?oo=[e]:oo.push(e)}var ho=w.ReactCurrentBatchConfig;function bo(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(o(309));var r=n.stateNode}if(!r)throw Error(o(147,e));var a=r,i=""+e;return null!==t&&null!==t.ref&&"function"==typeof t.ref&&t.ref._stringRef===i?t.ref:(t=function(e){var t=a.refs;null===e?delete t[i]:t[i]=e},t._stringRef=i,t)}if("string"!=typeof e)throw Error(o(284));if(!n._owner)throw Error(o(290,e))}return e}function yo(e,t){throw e=Object.prototype.toString.call(t),Error(o(31,"[object Object]"===e?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function vo(e){return(0,e._init)(e._payload)}function wo(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 a(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=Dc(n,e.mode,r)).return=e,t):((t=a(t,n)).return=e,t)}function c(e,t,n,r){var o=n.type;return o===S?d(e,t,n.props.children,r,n.key):null!==t&&(t.elementType===o||"object"==typeof o&&null!==o&&o.$$typeof===P&&vo(o)===t.type)?((r=a(t,n.props)).ref=bo(e,t,n),r.return=e,r):((r=jc(n.type,n.key,n.props,null,e.mode,r)).ref=bo(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=Fc(n,e.mode,r)).return=e,t):((t=a(t,n.children||[])).return=e,t)}function d(e,t,n,r,o){return null===t||7!==t.tag?((t=Mc(n,e.mode,r,o)).return=e,t):((t=a(t,n)).return=e,t)}function f(e,t,n){if("string"==typeof t&&""!==t||"number"==typeof t)return(t=Dc(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case k:return(n=jc(t.type,t.key,t.props,null,e.mode,n)).ref=bo(e,null,t),n.return=e,n;case x:return(t=Fc(t,e.mode,n)).return=e,t;case P:return f(e,(0,t._init)(t._payload),n)}if(te(t)||M(t))return(t=Mc(t,e.mode,n,null)).return=e,t;yo(e,t)}return null}function p(e,t,n,r){var a=null!==t?t.key:null;if("string"==typeof n&&""!==n||"number"==typeof n)return null!==a?null:s(e,t,""+n,r);if("object"==typeof n&&null!==n){switch(n.$$typeof){case k:return n.key===a?c(e,t,n,r):null;case x:return n.key===a?u(e,t,n,r):null;case P:return p(e,t,(a=n._init)(n._payload),r)}if(te(n)||M(n))return null!==a?null:d(e,t,n,r,null);yo(e,n)}return null}function g(e,t,n,r,a){if("string"==typeof r&&""!==r||"number"==typeof r)return s(t,e=e.get(n)||null,""+r,a);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,a);case x:return u(t,e=e.get(null===r.key?n:r.key)||null,r,a);case P:return g(e,t,n,(0,r._init)(r._payload),a)}if(te(r)||M(r))return d(t,e=e.get(n)||null,r,a,null);yo(t,r)}return null}function m(a,o,l,s){for(var c=null,u=null,d=o,m=o=0,h=null;null!==d&&m<l.length;m++){d.index>m?(h=d,d=null):h=d.sibling;var b=p(a,d,l[m],s);if(null===b){null===d&&(d=h);break}e&&d&&null===b.alternate&&t(a,d),o=i(b,o,m),null===u?c=b:u.sibling=b,u=b,d=h}if(m===l.length)return n(a,d),ao&&Xa(a,m),c;if(null===d){for(;m<l.length;m++)null!==(d=f(a,l[m],s))&&(o=i(d,o,m),null===u?c=d:u.sibling=d,u=d);return ao&&Xa(a,m),c}for(d=r(a,d);m<l.length;m++)null!==(h=g(d,a,m,l[m],s))&&(e&&null!==h.alternate&&d.delete(null===h.key?m:h.key),o=i(h,o,m),null===u?c=h:u.sibling=h,u=h);return e&&d.forEach((function(e){return t(a,e)})),ao&&Xa(a,m),c}function h(a,l,s,c){var u=M(s);if("function"!=typeof u)throw Error(o(150));if(null==(s=u.call(s)))throw Error(o(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=p(a,m,y.value,c);if(null===v){null===m&&(m=b);break}e&&m&&null===v.alternate&&t(a,m),l=i(v,l,h),null===d?u=v:d.sibling=v,d=v,m=b}if(y.done)return n(a,m),ao&&Xa(a,h),u;if(null===m){for(;!y.done;h++,y=s.next())null!==(y=f(a,y.value,c))&&(l=i(y,l,h),null===d?u=y:d.sibling=y,d=y);return ao&&Xa(a,h),u}for(m=r(a,m);!y.done;h++,y=s.next())null!==(y=g(m,a,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(a,e)})),ao&&Xa(a,h),u}return function e(r,o,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=o;null!==u;){if(u.key===c){if((c=i.type)===S){if(7===u.tag){n(r,u.sibling),(o=a(u,i.props.children)).return=r,r=o;break e}}else if(u.elementType===c||"object"==typeof c&&null!==c&&c.$$typeof===P&&vo(c)===u.type){n(r,u.sibling),(o=a(u,i.props)).ref=bo(r,u,i),o.return=r,r=o;break e}n(r,u);break}t(r,u),u=u.sibling}i.type===S?((o=Mc(i.props.children,r.mode,s,i.key)).return=r,r=o):((s=jc(i.type,i.key,i.props,null,r.mode,s)).ref=bo(r,o,i),s.return=r,r=s)}return l(r);case x:e:{for(u=i.key;null!==o;){if(o.key===u){if(4===o.tag&&o.stateNode.containerInfo===i.containerInfo&&o.stateNode.implementation===i.implementation){n(r,o.sibling),(o=a(o,i.children||[])).return=r,r=o;break e}n(r,o);break}t(r,o),o=o.sibling}(o=Fc(i,r.mode,s)).return=r,r=o}return l(r);case P:return e(r,o,(u=i._init)(i._payload),s)}if(te(i))return m(r,o,i,s);if(M(i))return h(r,o,i,s);yo(r,i)}return"string"==typeof i&&""!==i||"number"==typeof i?(i=""+i,null!==o&&6===o.tag?(n(r,o.sibling),(o=a(o,i)).return=r,r=o):(n(r,o),(o=Dc(i,r.mode,s)).return=r,r=o),l(r)):n(r,o)}}var ko=wo(!0),xo=wo(!1),So=Ea(null),Eo=null,_o=null,Co=null;function Ao(){Co=_o=Eo=null}function To(e){var t=So.current;_a(So),e._currentValue=t}function Lo(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 No(e,t){Eo=e,Co=_o=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(0!=(e.lanes&t)&&(vl=!0),e.firstContext=null)}function Ro(e){var t=e._currentValue;if(Co!==e)if(e={context:e,memoizedValue:t,next:null},null===_o){if(null===Eo)throw Error(o(308));_o=e,Eo.dependencies={lanes:0,firstContext:e}}else _o=_o.next=e;return t}var Po=null;function Oo(e){null===Po?Po=[e]:Po.push(e)}function jo(e,t,n,r){var a=t.interleaved;return null===a?(n.next=n,Oo(t)):(n.next=a.next,a.next=n),t.interleaved=n,Mo(e,r)}function Mo(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 Io=!1;function Do(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Fo(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 zo(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function $o(e,t,n){var r=e.updateQueue;if(null===r)return null;if(r=r.shared,0!=(2&Ts)){var a=r.pending;return null===a?t.next=t:(t.next=a.next,a.next=t),r.pending=t,Mo(e,n)}return null===(a=r.interleaved)?(t.next=t,Oo(r)):(t.next=a.next,a.next=t),r.interleaved=t,Mo(e,n)}function Bo(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 Uo(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r.updateQueue)){var a=null,o=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===o?a=o=i:o=o.next=i,n=n.next}while(null!==n);null===o?a=o=t:o=o.next=t}else a=o=t;return n={baseState:r.baseState,firstBaseUpdate:a,lastBaseUpdate:o,shared:r.shared,effects:r.effects},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function Ho(e,t,n,r){var a=e.updateQueue;Io=!1;var o=a.firstBaseUpdate,i=a.lastBaseUpdate,l=a.shared.pending;if(null!==l){a.shared.pending=null;var s=l,c=s.next;s.next=null,null===i?o=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!==o){var d=a.baseState;for(i=0,u=c=s=null,l=o;;){var f=l.lane,p=l.eventTime;if((r&f)===f){null!==u&&(u=u.next={eventTime:p,lane:0,tag:l.tag,payload:l.payload,callback:l.callback,next:null});e:{var g=e,m=l;switch(f=t,p=n,m.tag){case 1:if("function"==typeof(g=m.payload)){d=g.call(p,d,f);break e}d=g;break e;case 3:g.flags=-65537&g.flags|128;case 0:if(null==(f="function"==typeof(g=m.payload)?g.call(p,d,f):g))break e;d=D({},d,f);break e;case 2:Io=!0}}null!==l.callback&&0!==l.lane&&(e.flags|=64,null===(f=a.effects)?a.effects=[l]:f.push(l))}else p={eventTime:p,lane:f,tag:l.tag,payload:l.payload,callback:l.callback,next:null},null===u?(c=u=p,s=d):u=u.next=p,i|=f;if(null===(l=l.next)){if(null===(l=a.shared.pending))break;l=(f=l).next,f.next=null,a.lastBaseUpdate=f,a.shared.pending=null}}if(null===u&&(s=d),a.baseState=s,a.firstBaseUpdate=c,a.lastBaseUpdate=u,null!==(t=a.shared.interleaved)){a=t;do{i|=a.lane,a=a.next}while(a!==t)}else null===o&&(a.shared.lanes=0);Is|=i,e.lanes=i,e.memoizedState=d}}function Vo(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t<e.length;t++){var r=e[t],a=r.callback;if(null!==a){if(r.callback=null,r=n,"function"!=typeof a)throw Error(o(191,a));a.call(r)}}}var Wo={},Go=Ea(Wo),qo=Ea(Wo),Yo=Ea(Wo);function Ko(e){if(e===Wo)throw Error(o(174));return e}function Qo(e,t){switch(Ca(Yo,t),Ca(qo,e),Ca(Go,Wo),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)}_a(Go),Ca(Go,t)}function Zo(){_a(Go),_a(qo),_a(Yo)}function Xo(e){Ko(Yo.current);var t=Ko(Go.current),n=se(t,e.type);t!==n&&(Ca(qo,e),Ca(Go,n))}function Jo(e){qo.current===e&&(_a(Go),_a(qo))}var ei=Ea(0);function ti(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 ni=[];function ri(){for(var e=0;e<ni.length;e++)ni[e]._workInProgressVersionPrimary=null;ni.length=0}var ai=w.ReactCurrentDispatcher,oi=w.ReactCurrentBatchConfig,ii=0,li=null,si=null,ci=null,ui=!1,di=!1,fi=0,pi=0;function gi(){throw Error(o(321))}function mi(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 hi(e,t,n,r,a,i){if(ii=i,li=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,ai.current=null===e||null===e.memoizedState?Ji:el,e=n(r,a),di){i=0;do{if(di=!1,fi=0,25<=i)throw Error(o(301));i+=1,ci=si=null,t.updateQueue=null,ai.current=tl,e=n(r,a)}while(di)}if(ai.current=Xi,t=null!==si&&null!==si.next,ii=0,ci=si=li=null,ui=!1,t)throw Error(o(300));return e}function bi(){var e=0!==fi;return fi=0,e}function yi(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===ci?li.memoizedState=ci=e:ci=ci.next=e,ci}function vi(){if(null===si){var e=li.alternate;e=null!==e?e.memoizedState:null}else e=si.next;var t=null===ci?li.memoizedState:ci.next;if(null!==t)ci=t,si=e;else{if(null===e)throw Error(o(310));e={memoizedState:(si=e).memoizedState,baseState:si.baseState,baseQueue:si.baseQueue,queue:si.queue,next:null},null===ci?li.memoizedState=ci=e:ci=ci.next=e}return ci}function wi(e,t){return"function"==typeof t?t(e):t}function ki(e){var t=vi(),n=t.queue;if(null===n)throw Error(o(311));n.lastRenderedReducer=e;var r=si,a=r.baseQueue,i=n.pending;if(null!==i){if(null!==a){var l=a.next;a.next=i.next,i.next=l}r.baseQueue=a=i,n.pending=null}if(null!==a){i=a.next,r=r.baseState;var s=l=null,c=null,u=i;do{var d=u.lane;if((ii&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 f={lane:d,action:u.action,hasEagerState:u.hasEagerState,eagerState:u.eagerState,next:null};null===c?(s=c=f,l=r):c=c.next=f,li.lanes|=d,Is|=d}u=u.next}while(null!==u&&u!==i);null===c?l=r:c.next=s,lr(r,t.memoizedState)||(vl=!0),t.memoizedState=r,t.baseState=l,t.baseQueue=c,n.lastRenderedState=r}if(null!==(e=n.interleaved)){a=e;do{i=a.lane,li.lanes|=i,Is|=i,a=a.next}while(a!==e)}else null===a&&(n.lanes=0);return[t.memoizedState,n.dispatch]}function xi(e){var t=vi(),n=t.queue;if(null===n)throw Error(o(311));n.lastRenderedReducer=e;var r=n.dispatch,a=n.pending,i=t.memoizedState;if(null!==a){n.pending=null;var l=a=a.next;do{i=e(i,l.action),l=l.next}while(l!==a);lr(i,t.memoizedState)||(vl=!0),t.memoizedState=i,null===t.baseQueue&&(t.baseState=i),n.lastRenderedState=i}return[i,r]}function Si(){}function Ei(e,t){var n=li,r=vi(),a=t(),i=!lr(r.memoizedState,a);if(i&&(r.memoizedState=a,vl=!0),r=r.queue,Ii(Ai.bind(null,n,r,e),[e]),r.getSnapshot!==t||i||null!==ci&&1&ci.memoizedState.tag){if(n.flags|=2048,Ri(9,Ci.bind(null,n,r,a,t),void 0,null),null===Ls)throw Error(o(349));0!=(30&ii)||_i(n,t,a)}return a}function _i(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},null===(t=li.updateQueue)?(t={lastEffect:null,stores:null},li.updateQueue=t,t.stores=[e]):null===(n=t.stores)?t.stores=[e]:n.push(e)}function Ci(e,t,n,r){t.value=n,t.getSnapshot=r,Ti(t)&&Li(e)}function Ai(e,t,n){return n((function(){Ti(t)&&Li(e)}))}function Ti(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!lr(e,n)}catch(r){return!0}}function Li(e){var t=Mo(e,1);null!==t&&nc(t,e,1,-1)}function Ni(e){var t=yi();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:wi,lastRenderedState:e},t.queue=e,e=e.dispatch=Yi.bind(null,li,e),[t.memoizedState,e]}function Ri(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null},null===(t=li.updateQueue)?(t={lastEffect:null,stores:null},li.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 Pi(){return vi().memoizedState}function Oi(e,t,n,r){var a=yi();li.flags|=e,a.memoizedState=Ri(1|t,n,void 0,void 0===r?null:r)}function ji(e,t,n,r){var a=vi();r=void 0===r?null:r;var o=void 0;if(null!==si){var i=si.memoizedState;if(o=i.destroy,null!==r&&mi(r,i.deps))return void(a.memoizedState=Ri(t,n,o,r))}li.flags|=e,a.memoizedState=Ri(1|t,n,o,r)}function Mi(e,t){return Oi(8390656,8,e,t)}function Ii(e,t){return ji(2048,8,e,t)}function Di(e,t){return ji(4,2,e,t)}function Fi(e,t){return ji(4,4,e,t)}function zi(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 $i(e,t,n){return n=null!=n?n.concat([e]):null,ji(4,4,zi.bind(null,t,e),n)}function Bi(){}function Ui(e,t){var n=vi();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&mi(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function Hi(e,t){var n=vi();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&mi(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)}function Vi(e,t,n){return 0==(21&ii)?(e.baseState&&(e.baseState=!1,vl=!0),e.memoizedState=n):(lr(n,t)||(n=mt(),li.lanes|=n,Is|=n,e.baseState=!0),t)}function Wi(e,t){var n=vt;vt=0!==n&&4>n?n:4,e(!0);var r=oi.transition;oi.transition={};try{e(!1),t()}finally{vt=n,oi.transition=r}}function Gi(){return vi().memoizedState}function qi(e,t,n){var r=tc(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},Ki(e))Qi(t,n);else if(null!==(n=jo(e,t,n,r))){nc(n,e,r,ec()),Zi(n,t,r)}}function Yi(e,t,n){var r=tc(e),a={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(Ki(e))Qi(t,a);else{var o=e.alternate;if(0===e.lanes&&(null===o||0===o.lanes)&&null!==(o=t.lastRenderedReducer))try{var i=t.lastRenderedState,l=o(i,n);if(a.hasEagerState=!0,a.eagerState=l,lr(l,i)){var s=t.interleaved;return null===s?(a.next=a,Oo(t)):(a.next=s.next,s.next=a),void(t.interleaved=a)}}catch(c){}null!==(n=jo(e,t,a,r))&&(nc(n,e,r,a=ec()),Zi(n,t,r))}}function Ki(e){var t=e.alternate;return e===li||null!==t&&t===li}function Qi(e,t){di=ui=!0;var n=e.pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Zi(e,t,n){if(0!=(4194240&n)){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,yt(e,n)}}var Xi={readContext:Ro,useCallback:gi,useContext:gi,useEffect:gi,useImperativeHandle:gi,useInsertionEffect:gi,useLayoutEffect:gi,useMemo:gi,useReducer:gi,useRef:gi,useState:gi,useDebugValue:gi,useDeferredValue:gi,useTransition:gi,useMutableSource:gi,useSyncExternalStore:gi,useId:gi,unstable_isNewReconciler:!1},Ji={readContext:Ro,useCallback:function(e,t){return yi().memoizedState=[e,void 0===t?null:t],e},useContext:Ro,useEffect:Mi,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,Oi(4194308,4,zi.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Oi(4194308,4,e,t)},useInsertionEffect:function(e,t){return Oi(4,2,e,t)},useMemo:function(e,t){var n=yi();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=yi();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=qi.bind(null,li,e),[r.memoizedState,e]},useRef:function(e){return e={current:e},yi().memoizedState=e},useState:Ni,useDebugValue:Bi,useDeferredValue:function(e){return yi().memoizedState=e},useTransition:function(){var e=Ni(!1),t=e[0];return e=Wi.bind(null,e[1]),yi().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=li,a=yi();if(ao){if(void 0===n)throw Error(o(407));n=n()}else{if(n=t(),null===Ls)throw Error(o(349));0!=(30&ii)||_i(r,t,n)}a.memoizedState=n;var i={value:n,getSnapshot:t};return a.queue=i,Mi(Ai.bind(null,r,i,e),[e]),r.flags|=2048,Ri(9,Ci.bind(null,r,i,n,t),void 0,null),n},useId:function(){var e=yi(),t=Ls.identifierPrefix;if(ao){var n=Za;t=":"+t+"R"+(n=(Qa&~(1<<32-it(Qa)-1)).toString(32)+n),0<(n=fi++)&&(t+="H"+n.toString(32)),t+=":"}else t=":"+t+"r"+(n=pi++).toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},el={readContext:Ro,useCallback:Ui,useContext:Ro,useEffect:Ii,useImperativeHandle:$i,useInsertionEffect:Di,useLayoutEffect:Fi,useMemo:Hi,useReducer:ki,useRef:Pi,useState:function(){return ki(wi)},useDebugValue:Bi,useDeferredValue:function(e){return Vi(vi(),si.memoizedState,e)},useTransition:function(){return[ki(wi)[0],vi().memoizedState]},useMutableSource:Si,useSyncExternalStore:Ei,useId:Gi,unstable_isNewReconciler:!1},tl={readContext:Ro,useCallback:Ui,useContext:Ro,useEffect:Ii,useImperativeHandle:$i,useInsertionEffect:Di,useLayoutEffect:Fi,useMemo:Hi,useReducer:xi,useRef:Pi,useState:function(){return xi(wi)},useDebugValue:Bi,useDeferredValue:function(e){var t=vi();return null===si?t.memoizedState=e:Vi(t,si.memoizedState,e)},useTransition:function(){return[xi(wi)[0],vi().memoizedState]},useMutableSource:Si,useSyncExternalStore:Ei,useId:Gi,unstable_isNewReconciler:!1};function nl(e,t){if(e&&e.defaultProps){for(var n in t=D({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}return t}function rl(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:D({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var al={isMounted:function(e){return!!(e=e._reactInternals)&&Ue(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=ec(),a=tc(e),o=zo(r,a);o.payload=t,null!=n&&(o.callback=n),null!==(t=$o(e,o,a))&&(nc(t,e,a,r),Bo(t,e,a))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=ec(),a=tc(e),o=zo(r,a);o.tag=1,o.payload=t,null!=n&&(o.callback=n),null!==(t=$o(e,o,a))&&(nc(t,e,a,r),Bo(t,e,a))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=ec(),r=tc(e),a=zo(n,r);a.tag=2,null!=t&&(a.callback=t),null!==(t=$o(e,a,r))&&(nc(t,e,r,n),Bo(t,e,r))}};function ol(e,t,n,r,a,o,i){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,o,i):!t.prototype||!t.prototype.isPureReactComponent||(!sr(n,r)||!sr(a,o))}function il(e,t,n){var r=!1,a=Aa,o=t.contextType;return"object"==typeof o&&null!==o?o=Ro(o):(a=Pa(t)?Na:Ta.current,o=(r=null!=(r=t.contextTypes))?Ra(e,a):Aa),t=new t(n,o),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=al,e.stateNode=t,t._reactInternals=e,r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=a,e.__reactInternalMemoizedMaskedChildContext=o),t}function ll(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&&al.enqueueReplaceState(t,t.state,null)}function sl(e,t,n,r){var a=e.stateNode;a.props=n,a.state=e.memoizedState,a.refs={},Do(e);var o=t.contextType;"object"==typeof o&&null!==o?a.context=Ro(o):(o=Pa(t)?Na:Ta.current,a.context=Ra(e,o)),a.state=e.memoizedState,"function"==typeof(o=t.getDerivedStateFromProps)&&(rl(e,t,o,n),a.state=e.memoizedState),"function"==typeof t.getDerivedStateFromProps||"function"==typeof a.getSnapshotBeforeUpdate||"function"!=typeof a.UNSAFE_componentWillMount&&"function"!=typeof a.componentWillMount||(t=a.state,"function"==typeof a.componentWillMount&&a.componentWillMount(),"function"==typeof a.UNSAFE_componentWillMount&&a.UNSAFE_componentWillMount(),t!==a.state&&al.enqueueReplaceState(a,a.state,null),Ho(e,n,a,r),a.state=e.memoizedState),"function"==typeof a.componentDidMount&&(e.flags|=4194308)}function cl(e,t){try{var n="",r=t;do{n+=B(r),r=r.return}while(r);var a=n}catch(o){a="\nError generating stack: "+o.message+"\n"+o.stack}return{value:e,source:t,stack:a,digest:null}}function ul(e,t,n){return{value:e,source:null,stack:null!=n?n:null,digest:null!=t?t:null}}function dl(e,t){try{console.error(t.value)}catch(n){setTimeout((function(){throw n}))}}var fl="function"==typeof WeakMap?WeakMap:Map;function pl(e,t,n){(n=zo(-1,n)).tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Vs||(Vs=!0,Ws=r),dl(0,t)},n}function gl(e,t,n){(n=zo(-1,n)).tag=3;var r=e.type.getDerivedStateFromError;if("function"==typeof r){var a=t.value;n.payload=function(){return r(a)},n.callback=function(){dl(0,t)}}var o=e.stateNode;return null!==o&&"function"==typeof o.componentDidCatch&&(n.callback=function(){dl(0,t),"function"!=typeof r&&(null===Gs?Gs=new Set([this]):Gs.add(this));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}function ml(e,t,n){var r=e.pingCache;if(null===r){r=e.pingCache=new fl;var a=new Set;r.set(t,a)}else void 0===(a=r.get(t))&&(a=new Set,r.set(t,a));a.has(n)||(a.add(n),e=_c.bind(null,e,t,n),t.then(e,e))}function hl(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 bl(e,t,n,r,a){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=zo(-1,1)).tag=2,$o(n,t,1))),n.lanes|=1),e):(e.flags|=65536,e.lanes=a,e)}var yl=w.ReactCurrentOwner,vl=!1;function wl(e,t,n,r){t.child=null===e?xo(t,null,n,r):ko(t,e.child,n,r)}function kl(e,t,n,r,a){n=n.render;var o=t.ref;return No(t,a),r=hi(e,t,n,r,o,a),n=bi(),null===e||vl?(ao&&n&&eo(t),t.flags|=1,wl(e,t,r,a),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~a,Vl(e,t,a))}function xl(e,t,n,r,a){if(null===e){var o=n.type;return"function"!=typeof o||Pc(o)||void 0!==o.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=jc(n.type,null,r,t,t.mode,a)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=o,Sl(e,t,o,r,a))}if(o=e.child,0==(e.lanes&a)){var i=o.memoizedProps;if((n=null!==(n=n.compare)?n:sr)(i,r)&&e.ref===t.ref)return Vl(e,t,a)}return t.flags|=1,(e=Oc(o,r)).ref=t.ref,e.return=t,t.child=e}function Sl(e,t,n,r,a){if(null!==e){var o=e.memoizedProps;if(sr(o,r)&&e.ref===t.ref){if(vl=!1,t.pendingProps=r=o,0==(e.lanes&a))return t.lanes=e.lanes,Vl(e,t,a);0!=(131072&e.flags)&&(vl=!0)}}return Cl(e,t,n,r,a)}function El(e,t,n){var r=t.pendingProps,a=r.children,o=null!==e?e.memoizedState:null;if("hidden"===r.mode)if(0==(1&t.mode))t.memoizedState={baseLanes:0,cachePool:null,transitions:null},Ca(Os,Ps),Ps|=n;else{if(0==(1073741824&n))return e=null!==o?o.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,Ca(Os,Ps),Ps|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=null!==o?o.baseLanes:n,Ca(Os,Ps),Ps|=r}else null!==o?(r=o.baseLanes|n,t.memoizedState=null):r=n,Ca(Os,Ps),Ps|=r;return wl(e,t,a,n),t.child}function _l(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=512,t.flags|=2097152)}function Cl(e,t,n,r,a){var o=Pa(n)?Na:Ta.current;return o=Ra(t,o),No(t,a),n=hi(e,t,n,r,o,a),r=bi(),null===e||vl?(ao&&r&&eo(t),t.flags|=1,wl(e,t,n,a),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~a,Vl(e,t,a))}function Al(e,t,n,r,a){if(Pa(n)){var o=!0;Ia(t)}else o=!1;if(No(t,a),null===t.stateNode)Hl(e,t),il(t,n,r),sl(t,n,r,a),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=Ro(c):c=Ra(t,c=Pa(n)?Na:Ta.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)&&ll(t,i,r,c),Io=!1;var f=t.memoizedState;i.state=f,Ho(t,r,i,a),s=t.memoizedState,l!==r||f!==s||La.current||Io?("function"==typeof u&&(rl(t,n,u,r),s=t.memoizedState),(l=Io||ol(t,n,l,r,f,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,Fo(e,t),l=t.memoizedProps,c=t.type===t.elementType?l:nl(t.type,l),i.props=c,d=t.pendingProps,f=i.context,"object"==typeof(s=n.contextType)&&null!==s?s=Ro(s):s=Ra(t,s=Pa(n)?Na:Ta.current);var p=n.getDerivedStateFromProps;(u="function"==typeof p||"function"==typeof i.getSnapshotBeforeUpdate)||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(l!==d||f!==s)&&ll(t,i,r,s),Io=!1,f=t.memoizedState,i.state=f,Ho(t,r,i,a);var g=t.memoizedState;l!==d||f!==g||La.current||Io?("function"==typeof p&&(rl(t,n,p,r),g=t.memoizedState),(c=Io||ol(t,n,c,r,f,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&&f===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||l===e.memoizedProps&&f===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&&f===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),r=!1)}return Tl(e,t,n,r,o,a)}function Tl(e,t,n,r,a,o){_l(e,t);var i=0!=(128&t.flags);if(!r&&!i)return a&&Da(t,n,!1),Vl(e,t,o);r=t.stateNode,yl.current=t;var l=i&&"function"!=typeof n.getDerivedStateFromError?null:r.render();return t.flags|=1,null!==e&&i?(t.child=ko(t,e.child,null,o),t.child=ko(t,null,l,o)):wl(e,t,l,o),t.memoizedState=r.state,a&&Da(t,n,!0),t.child}function Ll(e){var t=e.stateNode;t.pendingContext?ja(0,t.pendingContext,t.pendingContext!==t.context):t.context&&ja(0,t.context,!1),Qo(e,t.containerInfo)}function Nl(e,t,n,r,a){return go(),mo(a),t.flags|=256,wl(e,t,n,r),t.child}var Rl,Pl,Ol,jl,Ml={dehydrated:null,treeContext:null,retryLane:0};function Il(e){return{baseLanes:e,cachePool:null,transitions:null}}function Dl(e,t,n){var r,a=t.pendingProps,i=ei.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),Ca(ei,1&i),null===e)return co(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=a.children,e=a.fallback,l?(a=t.mode,l=t.child,s={mode:"hidden",children:s},0==(1&a)&&null!==l?(l.childLanes=0,l.pendingProps=s):l=Ic(s,a,0,null),e=Mc(e,a,n,null),l.return=t,e.return=t,l.sibling=e,t.child=l,t.child.memoizedState=Il(n),t.memoizedState=Ml,e):Fl(t,s));if(null!==(i=e.memoizedState)&&null!==(r=i.dehydrated))return function(e,t,n,r,a,i,l){if(n)return 256&t.flags?(t.flags&=-257,zl(e,t,l,r=ul(Error(o(422))))):null!==t.memoizedState?(t.child=e.child,t.flags|=128,null):(i=r.fallback,a=t.mode,r=Ic({mode:"visible",children:r.children},a,0,null),(i=Mc(i,a,l,null)).flags|=2,r.return=t,i.return=t,r.sibling=i,t.child=r,0!=(1&t.mode)&&ko(t,e.child,null,l),t.child.memoizedState=Il(l),t.memoizedState=Ml,i);if(0==(1&t.mode))return zl(e,t,l,null);if("$!"===a.data){if(r=a.nextSibling&&a.nextSibling.dataset)var s=r.dgst;return r=s,zl(e,t,l,r=ul(i=Error(o(419)),r,void 0))}if(s=0!=(l&e.childLanes),vl||s){if(null!==(r=Ls)){switch(l&-l){case 4:a=2;break;case 16:a=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:a=32;break;case 536870912:a=268435456;break;default:a=0}0!==(a=0!=(a&(r.suspendedLanes|l))?0:a)&&a!==i.retryLane&&(i.retryLane=a,Mo(e,a),nc(r,e,a,-1))}return mc(),zl(e,t,l,r=ul(Error(o(421))))}return"$?"===a.data?(t.flags|=128,t.child=e.child,t=Ac.bind(null,e),a._reactRetry=t,null):(e=i.treeContext,ro=ca(a.nextSibling),no=t,ao=!0,oo=null,null!==e&&(qa[Ya++]=Qa,qa[Ya++]=Za,qa[Ya++]=Ka,Qa=e.id,Za=e.overflow,Ka=t),t=Fl(t,r.children),t.flags|=4096,t)}(e,t,s,a,r,i,n);if(l){l=a.fallback,s=t.mode,r=(i=e.child).sibling;var c={mode:"hidden",children:a.children};return 0==(1&s)&&t.child!==i?((a=t.child).childLanes=0,a.pendingProps=c,t.deletions=null):(a=Oc(i,c)).subtreeFlags=14680064&i.subtreeFlags,null!==r?l=Oc(r,l):(l=Mc(l,s,n,null)).flags|=2,l.return=t,a.return=t,a.sibling=l,t.child=a,a=l,l=t.child,s=null===(s=e.child.memoizedState)?Il(n):{baseLanes:s.baseLanes|n,cachePool:null,transitions:s.transitions},l.memoizedState=s,l.childLanes=e.childLanes&~n,t.memoizedState=Ml,a}return e=(l=e.child).sibling,a=Oc(l,{mode:"visible",children:a.children}),0==(1&t.mode)&&(a.lanes=n),a.return=t,a.sibling=null,null!==e&&(null===(n=t.deletions)?(t.deletions=[e],t.flags|=16):n.push(e)),t.child=a,t.memoizedState=null,a}function Fl(e,t){return(t=Ic({mode:"visible",children:t},e.mode,0,null)).return=e,e.child=t}function zl(e,t,n,r){return null!==r&&mo(r),ko(t,e.child,null,n),(e=Fl(t,t.pendingProps.children)).flags|=2,t.memoizedState=null,e}function $l(e,t,n){e.lanes|=t;var r=e.alternate;null!==r&&(r.lanes|=t),Lo(e.return,t,n)}function Bl(e,t,n,r,a){var o=e.memoizedState;null===o?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:a}:(o.isBackwards=t,o.rendering=null,o.renderingStartTime=0,o.last=r,o.tail=n,o.tailMode=a)}function Ul(e,t,n){var r=t.pendingProps,a=r.revealOrder,o=r.tail;if(wl(e,t,r.children,n),0!=(2&(r=ei.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&&$l(e,n,t);else if(19===e.tag)$l(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(Ca(ei,r),0==(1&t.mode))t.memoizedState=null;else switch(a){case"forwards":for(n=t.child,a=null;null!==n;)null!==(e=n.alternate)&&null===ti(e)&&(a=n),n=n.sibling;null===(n=a)?(a=t.child,t.child=null):(a=n.sibling,n.sibling=null),Bl(t,!1,a,n,o);break;case"backwards":for(n=null,a=t.child,t.child=null;null!==a;){if(null!==(e=a.alternate)&&null===ti(e)){t.child=a;break}e=a.sibling,a.sibling=n,n=a,a=e}Bl(t,!0,n,null,o);break;case"together":Bl(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 Vl(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),Is|=t.lanes,0==(n&t.childLanes))return null;if(null!==e&&t.child!==e.child)throw Error(o(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 Wl(e,t){if(!ao)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 Gl(e){var t=null!==e.alternate&&e.alternate.child===e.child,n=0,r=0;if(t)for(var a=e.child;null!==a;)n|=a.lanes|a.childLanes,r|=14680064&a.subtreeFlags,r|=14680064&a.flags,a.return=e,a=a.sibling;else for(a=e.child;null!==a;)n|=a.lanes|a.childLanes,r|=a.subtreeFlags,r|=a.flags,a.return=e,a=a.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function ql(e,t,n){var r=t.pendingProps;switch(to(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Gl(t),null;case 1:case 17:return Pa(t.type)&&Oa(),Gl(t),null;case 3:return r=t.stateNode,Zo(),_a(La),_a(Ta),ri(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),null!==e&&null!==e.child||(fo(t)?t.flags|=4:null===e||e.memoizedState.isDehydrated&&0==(256&t.flags)||(t.flags|=1024,null!==oo&&(ic(oo),oo=null))),Pl(e,t),Gl(t),null;case 5:Jo(t);var a=Ko(Yo.current);if(n=t.type,null!==e&&null!=t.stateNode)Ol(e,t,n,r,a),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!r){if(null===t.stateNode)throw Error(o(166));return Gl(t),null}if(e=Ko(Go.current),fo(t)){r=t.stateNode,n=t.type;var i=t.memoizedProps;switch(r[fa]=t,r[pa]=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(a=0;a<Mr.length;a++)zr(Mr[a],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":Q(r,i),zr("invalid",r);break;case"select":r._wrapperState={wasMultiple:!!i.multiple},zr("invalid",r);break;case"textarea":ae(r,i),zr("invalid",r)}for(var s in ye(n,i),a=null,i)if(i.hasOwnProperty(s)){var c=i[s];"children"===s?"string"==typeof c?r.textContent!==c&&(!0!==i.suppressHydrationWarning&&Xr(r.textContent,c,e),a=["children",c]):"number"==typeof c&&r.textContent!==""+c&&(!0!==i.suppressHydrationWarning&&Xr(r.textContent,c,e),a=["children",""+c]):l.hasOwnProperty(s)&&null!=c&&"onScroll"===s&&zr("scroll",r)}switch(n){case"input":G(r),J(r,i,!0);break;case"textarea":G(r),ie(r);break;case"select":case"option":break;default:"function"==typeof i.onClick&&(r.onclick=Jr)}r=a,t.updateQueue=r,null!==r&&(t.flags|=4)}else{s=9===a.nodeType?a:a.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[fa]=t,e[pa]=r,Rl(e,t,!1,!1),t.stateNode=e;e:{switch(s=ve(n,r),n){case"dialog":zr("cancel",e),zr("close",e),a=r;break;case"iframe":case"object":case"embed":zr("load",e),a=r;break;case"video":case"audio":for(a=0;a<Mr.length;a++)zr(Mr[a],e);a=r;break;case"source":zr("error",e),a=r;break;case"img":case"image":case"link":zr("error",e),zr("load",e),a=r;break;case"details":zr("toggle",e),a=r;break;case"input":Q(e,r),a=K(e,r),zr("invalid",e);break;case"option":default:a=r;break;case"select":e._wrapperState={wasMultiple:!!r.multiple},a=D({},r,{value:void 0}),zr("invalid",e);break;case"textarea":ae(e,r),a=re(e,r),zr("invalid",e)}for(i in ye(n,a),c=a)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)&&fe(e,u):"number"==typeof u&&fe(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":G(e),J(e,r,!1);break;case"textarea":G(e),ie(e);break;case"option":null!=r.value&&e.setAttribute("value",""+V(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 a.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 Gl(t),null;case 6:if(e&&null!=t.stateNode)jl(e,t,e.memoizedProps,r);else{if("string"!=typeof r&&null===t.stateNode)throw Error(o(166));if(n=Ko(Yo.current),Ko(Go.current),fo(t)){if(r=t.stateNode,n=t.memoizedProps,r[fa]=t,(i=r.nodeValue!==n)&&null!==(e=no))switch(e.tag){case 3:Xr(r.nodeValue,n,0!=(1&e.mode));break;case 5:!0!==e.memoizedProps.suppressHydrationWarning&&Xr(r.nodeValue,n,0!=(1&e.mode))}i&&(t.flags|=4)}else(r=(9===n.nodeType?n:n.ownerDocument).createTextNode(r))[fa]=t,t.stateNode=r}return Gl(t),null;case 13:if(_a(ei),r=t.memoizedState,null===e||null!==e.memoizedState&&null!==e.memoizedState.dehydrated){if(ao&&null!==ro&&0!=(1&t.mode)&&0==(128&t.flags))po(),go(),t.flags|=98560,i=!1;else if(i=fo(t),null!==r&&null!==r.dehydrated){if(null===e){if(!i)throw Error(o(318));if(!(i=null!==(i=t.memoizedState)?i.dehydrated:null))throw Error(o(317));i[fa]=t}else go(),0==(128&t.flags)&&(t.memoizedState=null),t.flags|=4;Gl(t),i=!1}else null!==oo&&(ic(oo),oo=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&ei.current)?0===js&&(js=3):mc())),null!==t.updateQueue&&(t.flags|=4),Gl(t),null);case 4:return Zo(),Pl(e,t),null===e&&Ur(t.stateNode.containerInfo),Gl(t),null;case 10:return To(t.type._context),Gl(t),null;case 19:if(_a(ei),null===(i=t.memoizedState))return Gl(t),null;if(r=0!=(128&t.flags),null===(s=i.rendering))if(r)Wl(i,!1);else{if(0!==js||null!==e&&0!=(128&e.flags))for(e=t.child;null!==e;){if(null!==(s=ti(e))){for(t.flags|=128,Wl(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 Ca(ei,1&ei.current|2),t.child}e=e.sibling}null!==i.tail&&Ze()>Us&&(t.flags|=128,r=!0,Wl(i,!1),t.lanes=4194304)}else{if(!r)if(null!==(e=ti(s))){if(t.flags|=128,r=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),Wl(i,!0),null===i.tail&&"hidden"===i.tailMode&&!s.alternate&&!ao)return Gl(t),null}else 2*Ze()-i.renderingStartTime>Us&&1073741824!==n&&(t.flags|=128,r=!0,Wl(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=Ze(),t.sibling=null,n=ei.current,Ca(ei,r?1&n|2:1&n),t):(Gl(t),null);case 22:case 23:return dc(),r=null!==t.memoizedState,null!==e&&null!==e.memoizedState!==r&&(t.flags|=8192),r&&0!=(1&t.mode)?0!=(1073741824&Ps)&&(Gl(t),6&t.subtreeFlags&&(t.flags|=8192)):Gl(t),null;case 24:case 25:return null}throw Error(o(156,t.tag))}function Yl(e,t){switch(to(t),t.tag){case 1:return Pa(t.type)&&Oa(),65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 3:return Zo(),_a(La),_a(Ta),ri(),0!=(65536&(e=t.flags))&&0==(128&e)?(t.flags=-65537&e|128,t):null;case 5:return Jo(t),null;case 13:if(_a(ei),null!==(e=t.memoizedState)&&null!==e.dehydrated){if(null===t.alternate)throw Error(o(340));go()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 19:return _a(ei),null;case 4:return Zo(),null;case 10:return To(t.type._context),null;case 22:case 23:return dc(),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 a=e.memoizedProps;if(a!==r){e=t.stateNode,Ko(Go.current);var o,i=null;switch(n){case"input":a=K(e,a),r=K(e,r),i=[];break;case"select":a=D({},a,{value:void 0}),r=D({},r,{value:void 0}),i=[];break;case"textarea":a=re(e,a),r=re(e,r),i=[];break;default:"function"!=typeof a.onClick&&"function"==typeof r.onClick&&(e.onclick=Jr)}for(u in ye(n,r),n=null,a)if(!r.hasOwnProperty(u)&&a.hasOwnProperty(u)&&null!=a[u])if("style"===u){var s=a[u];for(o in s)s.hasOwnProperty(o)&&(n||(n={}),n[o]="")}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!=a?a[u]:void 0,r.hasOwnProperty(u)&&c!==s&&(null!=c||null!=s))if("style"===u)if(s){for(o in s)!s.hasOwnProperty(o)||c&&c.hasOwnProperty(o)||(n||(n={}),n[o]="");for(o in c)c.hasOwnProperty(o)&&s[o]!==c[o]&&(n||(n={}),n[o]=c[o])}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)}},jl=function(e,t,n,r){n!==r&&(t.flags|=4)};var Kl=!1,Ql=!1,Zl="function"==typeof WeakSet?WeakSet:Set,Xl=null;function Jl(e,t){var n=e.ref;if(null!==n)if("function"==typeof n)try{n(null)}catch(r){Ec(e,t,r)}else n.current=null}function es(e,t,n){try{n()}catch(r){Ec(e,t,r)}}var ts=!1;function ns(e,t,n){var r=t.updateQueue;if(null!==(r=null!==r?r.lastEffect:null)){var a=r=r.next;do{if((a.tag&e)===e){var o=a.destroy;a.destroy=void 0,void 0!==o&&es(t,n,o)}a=a.next}while(a!==r)}}function rs(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 os(e){var t=e.alternate;null!==t&&(e.alternate=null,os(t)),e.child=null,e.deletions=null,e.sibling=null,5===e.tag&&(null!==(t=e.stateNode)&&(delete t[fa],delete t[pa],delete t[ma],delete t[ha],delete t[ba])),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 is(e){return 5===e.tag||3===e.tag||4===e.tag}function ls(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||is(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 ss(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(ss(e,t,n),e=e.sibling;null!==e;)ss(e,t,n),e=e.sibling}function cs(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(cs(e,t,n),e=e.sibling;null!==e;)cs(e,t,n),e=e.sibling}var us=null,ds=!1;function fs(e,t,n){for(n=n.child;null!==n;)ps(e,t,n),n=n.sibling}function ps(e,t,n){if(ot&&"function"==typeof ot.onCommitFiberUnmount)try{ot.onCommitFiberUnmount(at,n)}catch(l){}switch(n.tag){case 5:Ql||Jl(n,t);case 6:var r=us,a=ds;us=null,fs(e,t,n),ds=a,null!==(us=r)&&(ds?(e=us,n=n.stateNode,8===e.nodeType?e.parentNode.removeChild(n):e.removeChild(n)):us.removeChild(n.stateNode));break;case 18:null!==us&&(ds?(e=us,n=n.stateNode,8===e.nodeType?sa(e.parentNode,n):1===e.nodeType&&sa(e,n),Ut(e)):sa(us,n.stateNode));break;case 4:r=us,a=ds,us=n.stateNode.containerInfo,ds=!0,fs(e,t,n),us=r,ds=a;break;case 0:case 11:case 14:case 15:if(!Ql&&(null!==(r=n.updateQueue)&&null!==(r=r.lastEffect))){a=r=r.next;do{var o=a,i=o.destroy;o=o.tag,void 0!==i&&(0!=(2&o)||0!=(4&o))&&es(n,t,i),a=a.next}while(a!==r)}fs(e,t,n);break;case 1:if(!Ql&&(Jl(n,t),"function"==typeof(r=n.stateNode).componentWillUnmount))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(l){Ec(n,t,l)}fs(e,t,n);break;case 21:fs(e,t,n);break;case 22:1&n.mode?(Ql=(r=Ql)||null!==n.memoizedState,fs(e,t,n),Ql=r):fs(e,t,n);break;default:fs(e,t,n)}}function gs(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=Tc.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))}))}}function ms(e,t){var n=t.deletions;if(null!==n)for(var r=0;r<n.length;r++){var a=n[r];try{var i=e,l=t,s=l;e:for(;null!==s;){switch(s.tag){case 5:us=s.stateNode,ds=!1;break e;case 3:case 4:us=s.stateNode.containerInfo,ds=!0;break e}s=s.return}if(null===us)throw Error(o(160));ps(i,l,a),us=null,ds=!1;var c=a.alternate;null!==c&&(c.return=null),a.return=null}catch(u){Ec(a,t,u)}}if(12854&t.subtreeFlags)for(t=t.child;null!==t;)hs(t,e),t=t.sibling}function hs(e,t){var n=e.alternate,r=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(ms(t,e),bs(e),4&r){try{ns(3,e,e.return),rs(3,e)}catch(h){Ec(e,e.return,h)}try{ns(5,e,e.return)}catch(h){Ec(e,e.return,h)}}break;case 1:ms(t,e),bs(e),512&r&&null!==n&&Jl(n,n.return);break;case 5:if(ms(t,e),bs(e),512&r&&null!==n&&Jl(n,n.return),32&e.flags){var a=e.stateNode;try{fe(a,"")}catch(h){Ec(e,e.return,h)}}if(4&r&&null!=(a=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&&Z(a,i),ve(s,l);var u=ve(s,i);for(l=0;l<c.length;l+=2){var d=c[l],f=c[l+1];"style"===d?he(a,f):"dangerouslySetInnerHTML"===d?de(a,f):"children"===d?fe(a,f):v(a,d,f,u)}switch(s){case"input":X(a,i);break;case"textarea":oe(a,i);break;case"select":var p=a._wrapperState.wasMultiple;a._wrapperState.wasMultiple=!!i.multiple;var g=i.value;null!=g?ne(a,!!i.multiple,g,!1):p!==!!i.multiple&&(null!=i.defaultValue?ne(a,!!i.multiple,i.defaultValue,!0):ne(a,!!i.multiple,i.multiple?[]:"",!1))}a[pa]=i}catch(h){Ec(e,e.return,h)}}break;case 6:if(ms(t,e),bs(e),4&r){if(null===e.stateNode)throw Error(o(162));a=e.stateNode,i=e.memoizedProps;try{a.nodeValue=i}catch(h){Ec(e,e.return,h)}}break;case 3:if(ms(t,e),bs(e),4&r&&null!==n&&n.memoizedState.isDehydrated)try{Ut(t.containerInfo)}catch(h){Ec(e,e.return,h)}break;case 4:default:ms(t,e),bs(e);break;case 13:ms(t,e),bs(e),8192&(a=e.child).flags&&(i=null!==a.memoizedState,a.stateNode.isHidden=i,!i||null!==a.alternate&&null!==a.alternate.memoizedState||(Bs=Ze())),4&r&&gs(e);break;case 22:if(d=null!==n&&null!==n.memoizedState,1&e.mode?(Ql=(u=Ql)||d,ms(t,e),Ql=u):ms(t,e),bs(e),8192&r){if(u=null!==e.memoizedState,(e.stateNode.isHidden=u)&&!d&&0!=(1&e.mode))for(Xl=e,d=e.child;null!==d;){for(f=Xl=d;null!==Xl;){switch(g=(p=Xl).child,p.tag){case 0:case 11:case 14:case 15:ns(4,p,p.return);break;case 1:Jl(p,p.return);var m=p.stateNode;if("function"==typeof m.componentWillUnmount){r=p,n=p.return;try{t=r,m.props=t.memoizedProps,m.state=t.memoizedState,m.componentWillUnmount()}catch(h){Ec(r,n,h)}}break;case 5:Jl(p,p.return);break;case 22:if(null!==p.memoizedState){ks(f);continue}}null!==g?(g.return=p,Xl=g):ks(f)}d=d.sibling}e:for(d=null,f=e;;){if(5===f.tag){if(null===d){d=f;try{a=f.stateNode,u?"function"==typeof(i=a.style).setProperty?i.setProperty("display","none","important"):i.display="none":(s=f.stateNode,l=null!=(c=f.memoizedProps.style)&&c.hasOwnProperty("display")?c.display:null,s.style.display=me("display",l))}catch(h){Ec(e,e.return,h)}}}else if(6===f.tag){if(null===d)try{f.stateNode.nodeValue=u?"":f.memoizedProps}catch(h){Ec(e,e.return,h)}}else if((22!==f.tag&&23!==f.tag||null===f.memoizedState||f===e)&&null!==f.child){f.child.return=f,f=f.child;continue}if(f===e)break e;for(;null===f.sibling;){if(null===f.return||f.return===e)break e;d===f&&(d=null),f=f.return}d===f&&(d=null),f.sibling.return=f.return,f=f.sibling}}break;case 19:ms(t,e),bs(e),4&r&&gs(e);case 21:}}function bs(e){var t=e.flags;if(2&t){try{e:{for(var n=e.return;null!==n;){if(is(n)){var r=n;break e}n=n.return}throw Error(o(160))}switch(r.tag){case 5:var a=r.stateNode;32&r.flags&&(fe(a,""),r.flags&=-33),cs(e,ls(e),a);break;case 3:case 4:var i=r.stateNode.containerInfo;ss(e,ls(e),i);break;default:throw Error(o(161))}}catch(l){Ec(e,e.return,l)}e.flags&=-3}4096&t&&(e.flags&=-4097)}function ys(e,t,n){Xl=e,vs(e,t,n)}function vs(e,t,n){for(var r=0!=(1&e.mode);null!==Xl;){var a=Xl,o=a.child;if(22===a.tag&&r){var i=null!==a.memoizedState||Kl;if(!i){var l=a.alternate,s=null!==l&&null!==l.memoizedState||Ql;l=Kl;var c=Ql;if(Kl=i,(Ql=s)&&!c)for(Xl=a;null!==Xl;)s=(i=Xl).child,22===i.tag&&null!==i.memoizedState?xs(a):null!==s?(s.return=i,Xl=s):xs(a);for(;null!==o;)Xl=o,vs(o,t,n),o=o.sibling;Xl=a,Kl=l,Ql=c}ws(e)}else 0!=(8772&a.subtreeFlags)&&null!==o?(o.return=a,Xl=o):ws(e)}}function ws(e){for(;null!==Xl;){var t=Xl;if(0!=(8772&t.flags)){var n=t.alternate;try{if(0!=(8772&t.flags))switch(t.tag){case 0:case 11:case 15:Ql||rs(5,t);break;case 1:var r=t.stateNode;if(4&t.flags&&!Ql)if(null===n)r.componentDidMount();else{var a=t.elementType===t.type?n.memoizedProps:nl(t.type,n.memoizedProps);r.componentDidUpdate(a,n.memoizedState,r.__reactInternalSnapshotBeforeUpdate)}var i=t.updateQueue;null!==i&&Vo(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}Vo(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 f=d.dehydrated;null!==f&&Ut(f)}}}break;default:throw Error(o(163))}Ql||512&t.flags&&as(t)}catch(p){Ec(t,t.return,p)}}if(t===e){Xl=null;break}if(null!==(n=t.sibling)){n.return=t.return,Xl=n;break}Xl=t.return}}function ks(e){for(;null!==Xl;){var t=Xl;if(t===e){Xl=null;break}var n=t.sibling;if(null!==n){n.return=t.return,Xl=n;break}Xl=t.return}}function xs(e){for(;null!==Xl;){var t=Xl;try{switch(t.tag){case 0:case 11:case 15:var n=t.return;try{rs(4,t)}catch(s){Ec(t,n,s)}break;case 1:var r=t.stateNode;if("function"==typeof r.componentDidMount){var a=t.return;try{r.componentDidMount()}catch(s){Ec(t,a,s)}}var o=t.return;try{as(t)}catch(s){Ec(t,o,s)}break;case 5:var i=t.return;try{as(t)}catch(s){Ec(t,i,s)}}}catch(s){Ec(t,t.return,s)}if(t===e){Xl=null;break}var l=t.sibling;if(null!==l){l.return=t.return,Xl=l;break}Xl=t.return}}var Ss,Es=Math.ceil,_s=w.ReactCurrentDispatcher,Cs=w.ReactCurrentOwner,As=w.ReactCurrentBatchConfig,Ts=0,Ls=null,Ns=null,Rs=0,Ps=0,Os=Ea(0),js=0,Ms=null,Is=0,Ds=0,Fs=0,zs=null,$s=null,Bs=0,Us=1/0,Hs=null,Vs=!1,Ws=null,Gs=null,qs=!1,Ys=null,Ks=0,Qs=0,Zs=null,Xs=-1,Js=0;function ec(){return 0!=(6&Ts)?Ze():-1!==Xs?Xs:Xs=Ze()}function tc(e){return 0==(1&e.mode)?1:0!=(2&Ts)&&0!==Rs?Rs&-Rs:null!==ho.transition?(0===Js&&(Js=mt()),Js):0!==(e=vt)?e:e=void 0===(e=window.event)?16:Qt(e.type)}function nc(e,t,n,r){if(50<Qs)throw Qs=0,Zs=null,Error(o(185));bt(e,n,r),0!=(2&Ts)&&e===Ls||(e===Ls&&(0==(2&Ts)&&(Ds|=n),4===js&&lc(e,Rs)),rc(e,r),1===n&&0===Ts&&0==(1&t.mode)&&(Us=Ze()+500,za&&Ua()))}function rc(e,t){var n=e.callbackNode;!function(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,a=e.expirationTimes,o=e.pendingLanes;0<o;){var i=31-it(o),l=1<<i,s=a[i];-1===s?0!=(l&n)&&0==(l&r)||(a[i]=pt(l,t)):s<=t&&(e.expiredLanes|=l),o&=~l}}(e,t);var r=ft(e,e===Ls?Rs:0);if(0===r)null!==n&&Ye(n),e.callbackNode=null,e.callbackPriority=0;else if(t=r&-r,e.callbackPriority!==t){if(null!=n&&Ye(n),1===t)0===e.tag?function(e){za=!0,Ba(e)}(sc.bind(null,e)):Ba(sc.bind(null,e)),ia((function(){0==(6&Ts)&&Ua()})),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=Lc(n,ac.bind(null,e))}e.callbackPriority=t,e.callbackNode=n}}function ac(e,t){if(Xs=-1,Js=0,0!=(6&Ts))throw Error(o(327));var n=e.callbackNode;if(xc()&&e.callbackNode!==n)return null;var r=ft(e,e===Ls?Rs:0);if(0===r)return null;if(0!=(30&r)||0!=(r&e.expiredLanes)||t)t=hc(e,r);else{t=r;var a=Ts;Ts|=2;var i=gc();for(Ls===e&&Rs===t||(Hs=null,Us=Ze()+500,fc(e,t));;)try{yc();break}catch(s){pc(e,s)}Ao(),_s.current=i,Ts=a,null!==Ns?t=0:(Ls=null,Rs=0,t=js)}if(0!==t){if(2===t&&(0!==(a=gt(e))&&(r=a,t=oc(e,a))),1===t)throw n=Ms,fc(e,0),lc(e,r),rc(e,Ze()),n;if(6===t)lc(e,r);else{if(a=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 a=n[r],o=a.getSnapshot;a=a.value;try{if(!lr(o(),a))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}(a)&&(2===(t=hc(e,r))&&(0!==(i=gt(e))&&(r=i,t=oc(e,i))),1===t))throw n=Ms,fc(e,0),lc(e,r),rc(e,Ze()),n;switch(e.finishedWork=a,e.finishedLanes=r,t){case 0:case 1:throw Error(o(345));case 2:case 5:kc(e,$s,Hs);break;case 3:if(lc(e,r),(130023424&r)===r&&10<(t=Bs+500-Ze())){if(0!==ft(e,0))break;if(((a=e.suspendedLanes)&r)!==r){ec(),e.pingedLanes|=e.suspendedLanes&a;break}e.timeoutHandle=ra(kc.bind(null,e,$s,Hs),t);break}kc(e,$s,Hs);break;case 4:if(lc(e,r),(4194240&r)===r)break;for(t=e.eventTimes,a=-1;0<r;){var l=31-it(r);i=1<<l,(l=t[l])>a&&(a=l),r&=~i}if(r=a,10<(r=(120>(r=Ze()-r)?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*Es(r/1960))-r)){e.timeoutHandle=ra(kc.bind(null,e,$s,Hs),r);break}kc(e,$s,Hs);break;default:throw Error(o(329))}}}return rc(e,Ze()),e.callbackNode===n?ac.bind(null,e):null}function oc(e,t){var n=zs;return e.current.memoizedState.isDehydrated&&(fc(e,t).flags|=256),2!==(e=hc(e,t))&&(t=$s,$s=n,null!==t&&ic(t)),e}function ic(e){null===$s?$s=e:$s.push.apply($s,e)}function lc(e,t){for(t&=~Fs,t&=~Ds,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 sc(e){if(0!=(6&Ts))throw Error(o(327));xc();var t=ft(e,0);if(0==(1&t))return rc(e,Ze()),null;var n=hc(e,t);if(0!==e.tag&&2===n){var r=gt(e);0!==r&&(t=r,n=oc(e,r))}if(1===n)throw n=Ms,fc(e,0),lc(e,t),rc(e,Ze()),n;if(6===n)throw Error(o(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,kc(e,$s,Hs),rc(e,Ze()),null}function cc(e,t){var n=Ts;Ts|=1;try{return e(t)}finally{0===(Ts=n)&&(Us=Ze()+500,za&&Ua())}}function uc(e){null!==Ys&&0===Ys.tag&&0==(6&Ts)&&xc();var t=Ts;Ts|=1;var n=As.transition,r=vt;try{if(As.transition=null,vt=1,e)return e()}finally{vt=r,As.transition=n,0==(6&(Ts=t))&&Ua()}}function dc(){Ps=Os.current,_a(Os)}function fc(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,aa(n)),null!==Ns)for(n=Ns.return;null!==n;){var r=n;switch(to(r),r.tag){case 1:null!=(r=r.type.childContextTypes)&&Oa();break;case 3:Zo(),_a(La),_a(Ta),ri();break;case 5:Jo(r);break;case 4:Zo();break;case 13:case 19:_a(ei);break;case 10:To(r.type._context);break;case 22:case 23:dc()}n=n.return}if(Ls=e,Ns=e=Oc(e.current,null),Rs=Ps=t,js=0,Ms=null,Fs=Ds=Is=0,$s=zs=null,null!==Po){for(t=0;t<Po.length;t++)if(null!==(r=(n=Po[t]).interleaved)){n.interleaved=null;var a=r.next,o=n.pending;if(null!==o){var i=o.next;o.next=a,r.next=i}n.pending=r}Po=null}return e}function pc(e,t){for(;;){var n=Ns;try{if(Ao(),ai.current=Xi,ui){for(var r=li.memoizedState;null!==r;){var a=r.queue;null!==a&&(a.pending=null),r=r.next}ui=!1}if(ii=0,ci=si=li=null,di=!1,fi=0,Cs.current=null,null===n||null===n.return){js=1,Ms=t,Ns=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,f=d.tag;if(0==(1&d.mode)&&(0===f||11===f||15===f)){var p=d.alternate;p?(d.updateQueue=p.updateQueue,d.memoizedState=p.memoizedState,d.lanes=p.lanes):(d.updateQueue=null,d.memoizedState=null)}var g=hl(l);if(null!==g){g.flags&=-257,bl(g,l,s,0,t),1&g.mode&&ml(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)){ml(i,u,t),mc();break e}c=Error(o(426))}else if(ao&&1&s.mode){var b=hl(l);if(null!==b){0==(65536&b.flags)&&(b.flags|=256),bl(b,l,s,0,t),mo(cl(c,s));break e}}i=c=cl(c,s),4!==js&&(js=2),null===zs?zs=[i]:zs.push(i),i=l;do{switch(i.tag){case 3:i.flags|=65536,t&=-t,i.lanes|=t,Uo(i,pl(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===Gs||!Gs.has(v)))){i.flags|=65536,t&=-t,i.lanes|=t,Uo(i,gl(i,s,t));break e}}i=i.return}while(null!==i)}wc(n)}catch(w){t=w,Ns===n&&null!==n&&(Ns=n=n.return);continue}break}}function gc(){var e=_s.current;return _s.current=Xi,null===e?Xi:e}function mc(){0!==js&&3!==js&&2!==js||(js=4),null===Ls||0==(268435455&Is)&&0==(268435455&Ds)||lc(Ls,Rs)}function hc(e,t){var n=Ts;Ts|=2;var r=gc();for(Ls===e&&Rs===t||(Hs=null,fc(e,t));;)try{bc();break}catch(a){pc(e,a)}if(Ao(),Ts=n,_s.current=r,null!==Ns)throw Error(o(261));return Ls=null,Rs=0,js}function bc(){for(;null!==Ns;)vc(Ns)}function yc(){for(;null!==Ns&&!Ke();)vc(Ns)}function vc(e){var t=Ss(e.alternate,e,Ps);e.memoizedProps=e.pendingProps,null===t?wc(e):Ns=t,Cs.current=null}function wc(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(Ns=n)}else{if(null!==(n=Yl(n,t)))return n.flags&=32767,void(Ns=n);if(null===e)return js=6,void(Ns=null);e.flags|=32768,e.subtreeFlags=0,e.deletions=null}if(null!==(t=t.sibling))return void(Ns=t);Ns=t=e}while(null!==t);0===js&&(js=5)}function kc(e,t,n){var r=vt,a=As.transition;try{As.transition=null,vt=1,function(e,t,n,r){do{xc()}while(null!==Ys);if(0!=(6&Ts))throw Error(o(327));n=e.finishedWork;var a=e.finishedLanes;if(null===n)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(o(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 a=31-it(n),o=1<<a;t[a]=0,r[a]=-1,e[a]=-1,n&=~o}}(e,i),e===Ls&&(Ns=Ls=null,Rs=0),0==(2064&n.subtreeFlags)&&0==(2064&n.flags)||qs||(qs=!0,Lc(tt,(function(){return xc(),null}))),i=0!=(15990&n.flags),0!=(15990&n.subtreeFlags)||i){i=As.transition,As.transition=null;var l=vt;vt=1;var s=Ts;Ts|=4,Cs.current=null,function(e,t){if(ea=Vt,pr(e=fr())){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 a=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,f=e,p=null;t:for(;;){for(var g;f!==n||0!==a&&3!==f.nodeType||(s=l+a),f!==i||0!==r&&3!==f.nodeType||(c=l+r),3===f.nodeType&&(l+=f.nodeValue.length),null!==(g=f.firstChild);)p=f,f=g;for(;;){if(f===e)break t;if(p===n&&++u===a&&(s=l),p===i&&++d===r&&(c=l),null!==(g=f.nextSibling))break;p=(f=p).parentNode}f=g}n=-1===s||-1===c?null:{start:s,end:c}}else n=null}n=n||{start:0,end:0}}else n=null;for(ta={focusedElem:e,selectionRange:n},Vt=!1,Xl=t;null!==Xl;)if(e=(t=Xl).child,0!=(1028&t.subtreeFlags)&&null!==e)e.return=t,Xl=e;else for(;null!==Xl;){t=Xl;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:nl(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(o(163))}}catch(k){Ec(t,t.return,k)}if(null!==(e=t.sibling)){e.return=t.return,Xl=e;break}Xl=t.return}m=ts,ts=!1}(e,n),hs(n,e),gr(ta),Vt=!!ea,ta=ea=null,e.current=n,ys(n,e,a),Qe(),Ts=s,vt=l,As.transition=i}else e.current=n;if(qs&&(qs=!1,Ys=e,Ks=a),i=e.pendingLanes,0===i&&(Gs=null),function(e){if(ot&&"function"==typeof ot.onCommitFiberRoot)try{ot.onCommitFiberRoot(at,e,void 0,128==(128&e.current.flags))}catch(t){}}(n.stateNode),rc(e,Ze()),null!==t)for(r=e.onRecoverableError,n=0;n<t.length;n++)a=t[n],r(a.value,{componentStack:a.stack,digest:a.digest});if(Vs)throw Vs=!1,e=Ws,Ws=null,e;0!=(1&Ks)&&0!==e.tag&&xc(),i=e.pendingLanes,0!=(1&i)?e===Zs?Qs++:(Qs=0,Zs=e):Qs=0,Ua()}(e,t,n,r)}finally{As.transition=a,vt=r}return null}function xc(){if(null!==Ys){var e=wt(Ks),t=As.transition,n=vt;try{if(As.transition=null,vt=16>e?16:e,null===Ys)var r=!1;else{if(e=Ys,Ys=null,Ks=0,0!=(6&Ts))throw Error(o(331));var a=Ts;for(Ts|=4,Xl=e.current;null!==Xl;){var i=Xl,l=i.child;if(0!=(16&Xl.flags)){var s=i.deletions;if(null!==s){for(var c=0;c<s.length;c++){var u=s[c];for(Xl=u;null!==Xl;){var d=Xl;switch(d.tag){case 0:case 11:case 15:ns(8,d,i)}var f=d.child;if(null!==f)f.return=d,Xl=f;else for(;null!==Xl;){var p=(d=Xl).sibling,g=d.return;if(os(d),d===u){Xl=null;break}if(null!==p){p.return=g,Xl=p;break}Xl=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)}}Xl=i}}if(0!=(2064&i.subtreeFlags)&&null!==l)l.return=i,Xl=l;else e:for(;null!==Xl;){if(0!=(2048&(i=Xl).flags))switch(i.tag){case 0:case 11:case 15:ns(9,i,i.return)}var y=i.sibling;if(null!==y){y.return=i.return,Xl=y;break e}Xl=i.return}}var v=e.current;for(Xl=v;null!==Xl;){var w=(l=Xl).child;if(0!=(2064&l.subtreeFlags)&&null!==w)w.return=l,Xl=w;else e:for(l=v;null!==Xl;){if(0!=(2048&(s=Xl).flags))try{switch(s.tag){case 0:case 11:case 15:rs(9,s)}}catch(x){Ec(s,s.return,x)}if(s===l){Xl=null;break e}var k=s.sibling;if(null!==k){k.return=s.return,Xl=k;break e}Xl=s.return}}if(Ts=a,Ua(),ot&&"function"==typeof ot.onPostCommitFiberRoot)try{ot.onPostCommitFiberRoot(at,e)}catch(x){}r=!0}return r}finally{vt=n,As.transition=t}}return!1}function Sc(e,t,n){e=$o(e,t=pl(0,t=cl(n,t),1),1),t=ec(),null!==e&&(bt(e,1,t),rc(e,t))}function Ec(e,t,n){if(3===e.tag)Sc(e,e,n);else for(;null!==t;){if(3===t.tag){Sc(t,e,n);break}if(1===t.tag){var r=t.stateNode;if("function"==typeof t.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===Gs||!Gs.has(r))){t=$o(t,e=gl(t,e=cl(n,e),1),1),e=ec(),null!==t&&(bt(t,1,e),rc(t,e));break}}t=t.return}}function _c(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),t=ec(),e.pingedLanes|=e.suspendedLanes&n,Ls===e&&(Rs&n)===n&&(4===js||3===js&&(130023424&Rs)===Rs&&500>Ze()-Bs?fc(e,0):Fs|=n),rc(e,t)}function Cc(e,t){0===t&&(0==(1&e.mode)?t=1:(t=ut,0==(130023424&(ut<<=1))&&(ut=4194304)));var n=ec();null!==(e=Mo(e,t))&&(bt(e,t,n),rc(e,n))}function Ac(e){var t=e.memoizedState,n=0;null!==t&&(n=t.retryLane),Cc(e,n)}function Tc(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,a=e.memoizedState;null!==a&&(n=a.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(o(314))}null!==r&&r.delete(t),Cc(e,n)}function Lc(e,t){return qe(e,t)}function Nc(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 Nc(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 jc(e,t,n,r,a,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 Mc(n.children,a,i,t);case E:l=8,a|=8;break;case _:return(e=Rc(12,n,t,2|a)).elementType=_,e.lanes=i,e;case L:return(e=Rc(13,n,t,a)).elementType=L,e.lanes=i,e;case N:return(e=Rc(19,n,t,a)).elementType=N,e.lanes=i,e;case O:return Ic(n,a,i,t);default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case C:l=10;break e;case A:l=9;break e;case T:l=11;break e;case R:l=14;break e;case P:l=16,r=null;break e}throw Error(o(130,null==e?e:typeof e,""))}return(t=Rc(l,n,t,a)).elementType=e,t.type=r,t.lanes=i,t}function Mc(e,t,n,r){return(e=Rc(7,e,r,t)).lanes=n,e}function Ic(e,t,n,r){return(e=Rc(22,e,r,t)).elementType=O,e.lanes=n,e.stateNode={isHidden:!1},e}function Dc(e,t,n){return(e=Rc(6,e,null,t)).lanes=n,e}function Fc(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 zc(e,t,n,r,a){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=a,this.mutableSourceEagerHydrationData=null}function $c(e,t,n,r,a,o,i,l,s){return e=new zc(e,t,n,l,s),1===t?(t=1,!0===o&&(t|=8)):t=0,o=Rc(3,null,null,t),e.current=o,o.stateNode=e,o.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Do(o),e}function Bc(e){if(!e)return Aa;e:{if(Ue(e=e._reactInternals)!==e||1!==e.tag)throw Error(o(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(Pa(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(null!==t);throw Error(o(171))}if(1===e.tag){var n=e.type;if(Pa(n))return Ma(e,n,t)}return t}function Uc(e,t,n,r,a,o,i,l,s){return(e=$c(n,r,!0,e,0,o,0,l,s)).context=Bc(null),n=e.current,(o=zo(r=ec(),a=tc(n))).callback=null!=t?t:null,$o(n,o,a),e.current.lanes=a,bt(e,a,r),rc(e,r),e}function Hc(e,t,n,r){var a=t.current,o=ec(),i=tc(a);return n=Bc(n),null===t.context?t.context=n:t.pendingContext=n,(t=zo(o,i)).payload={element:e},null!==(r=void 0===r?null:r)&&(t.callback=r),null!==(e=$o(a,t,i))&&(nc(e,a,i,o),Bo(e,a,i)),i}function Vc(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function Wc(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function Gc(e,t){Wc(e,t),(e=e.alternate)&&Wc(e,t)}Ss=function(e,t,n){if(null!==e)if(e.memoizedProps!==t.pendingProps||La.current)vl=!0;else{if(0==(e.lanes&n)&&0==(128&t.flags))return vl=!1,function(e,t,n){switch(t.tag){case 3:Ll(t),go();break;case 5:Xo(t);break;case 1:Pa(t.type)&&Ia(t);break;case 4:Qo(t,t.stateNode.containerInfo);break;case 10:var r=t.type._context,a=t.memoizedProps.value;Ca(So,r._currentValue),r._currentValue=a;break;case 13:if(null!==(r=t.memoizedState))return null!==r.dehydrated?(Ca(ei,1&ei.current),t.flags|=128,null):0!=(n&t.child.childLanes)?Dl(e,t,n):(Ca(ei,1&ei.current),null!==(e=Vl(e,t,n))?e.sibling:null);Ca(ei,1&ei.current);break;case 19:if(r=0!=(n&t.childLanes),0!=(128&e.flags)){if(r)return Ul(e,t,n);t.flags|=128}if(null!==(a=t.memoizedState)&&(a.rendering=null,a.tail=null,a.lastEffect=null),Ca(ei,ei.current),r)break;return null;case 22:case 23:return t.lanes=0,El(e,t,n)}return Vl(e,t,n)}(e,t,n);vl=0!=(131072&e.flags)}else vl=!1,ao&&0!=(1048576&t.flags)&&Ja(t,Ga,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;Hl(e,t),e=t.pendingProps;var a=Ra(t,Ta.current);No(t,n),a=hi(null,t,r,e,a,n);var i=bi();return t.flags|=1,"object"==typeof a&&null!==a&&"function"==typeof a.render&&void 0===a.$$typeof?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Pa(r)?(i=!0,Ia(t)):i=!1,t.memoizedState=null!==a.state&&void 0!==a.state?a.state:null,Do(t),a.updater=al,t.stateNode=a,a._reactInternals=t,sl(t,r,e,n),t=Tl(null,t,r,!0,i,n)):(t.tag=0,ao&&i&&eo(t),wl(null,t,a,n),t=t.child),t;case 16:r=t.elementType;e:{switch(Hl(e,t),e=t.pendingProps,r=(a=r._init)(r._payload),t.type=r,a=t.tag=function(e){if("function"==typeof e)return Pc(e)?1:0;if(null!=e){if((e=e.$$typeof)===T)return 11;if(e===R)return 14}return 2}(r),e=nl(r,e),a){case 0:t=Cl(null,t,r,e,n);break e;case 1:t=Al(null,t,r,e,n);break e;case 11:t=kl(null,t,r,e,n);break e;case 14:t=xl(null,t,r,nl(r.type,e),n);break e}throw Error(o(306,r,""))}return t;case 0:return r=t.type,a=t.pendingProps,Cl(e,t,r,a=t.elementType===r?a:nl(r,a),n);case 1:return r=t.type,a=t.pendingProps,Al(e,t,r,a=t.elementType===r?a:nl(r,a),n);case 3:e:{if(Ll(t),null===e)throw Error(o(387));r=t.pendingProps,a=(i=t.memoizedState).element,Fo(e,t),Ho(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=Nl(e,t,r,n,a=cl(Error(o(423)),t));break e}if(r!==a){t=Nl(e,t,r,n,a=cl(Error(o(424)),t));break e}for(ro=ca(t.stateNode.containerInfo.firstChild),no=t,ao=!0,oo=null,n=xo(t,null,r,n),t.child=n;n;)n.flags=-3&n.flags|4096,n=n.sibling}else{if(go(),r===a){t=Vl(e,t,n);break e}wl(e,t,r,n)}t=t.child}return t;case 5:return Xo(t),null===e&&co(t),r=t.type,a=t.pendingProps,i=null!==e?e.memoizedProps:null,l=a.children,na(r,a)?l=null:null!==i&&na(r,i)&&(t.flags|=32),_l(e,t),wl(e,t,l,n),t.child;case 6:return null===e&&co(t),null;case 13:return Dl(e,t,n);case 4:return Qo(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=ko(t,null,r,n):wl(e,t,r,n),t.child;case 11:return r=t.type,a=t.pendingProps,kl(e,t,r,a=t.elementType===r?a:nl(r,a),n);case 7:return wl(e,t,t.pendingProps,n),t.child;case 8:case 12:return wl(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,a=t.pendingProps,i=t.memoizedProps,l=a.value,Ca(So,r._currentValue),r._currentValue=l,null!==i)if(lr(i.value,l)){if(i.children===a.children&&!La.current){t=Vl(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=zo(-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),Lo(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(o(341));l.lanes|=n,null!==(s=l.alternate)&&(s.lanes|=n),Lo(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}wl(e,t,a.children,n),t=t.child}return t;case 9:return a=t.type,r=t.pendingProps.children,No(t,n),r=r(a=Ro(a)),t.flags|=1,wl(e,t,r,n),t.child;case 14:return a=nl(r=t.type,t.pendingProps),xl(e,t,r,a=nl(r.type,a),n);case 15:return Sl(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:nl(r,a),Hl(e,t),t.tag=1,Pa(r)?(e=!0,Ia(t)):e=!1,No(t,n),il(t,r,a),sl(t,r,a,n),Tl(null,t,r,!0,e,n);case 19:return Ul(e,t,n);case 22:return El(e,t,n)}throw Error(o(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 Qc(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 Xc(){}function Jc(e,t,n,r,a){var o=n._reactRootContainer;if(o){var i=o;if("function"==typeof a){var l=a;a=function(){var e=Vc(i);l.call(e)}}Hc(t,i,e,a)}else i=function(e,t,n,r,a){if(a){if("function"==typeof r){var o=r;r=function(){var e=Vc(i);o.call(e)}}var i=Uc(t,r,e,0,null,!1,0,"",Xc);return e._reactRootContainer=i,e[ga]=i.current,Ur(8===e.nodeType?e.parentNode:e),uc(),i}for(;a=e.lastChild;)e.removeChild(a);if("function"==typeof r){var l=r;r=function(){var e=Vc(s);l.call(e)}}var s=$c(e,0,!1,null,0,!1,0,"",Xc);return e._reactRootContainer=s,e[ga]=s.current,Ur(8===e.nodeType?e.parentNode:e),uc((function(){Hc(t,s,n,r)})),s}(n,t,e,a,r);return Vc(i)}Kc.prototype.render=Yc.prototype.render=function(e){var t=this._internalRoot;if(null===t)throw Error(o(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;uc((function(){Hc(null,e,null,null)})),t[ga]=null}},Kc.prototype.unstable_scheduleHydration=function(e){if(e){var t=Et();e={blockedOn:null,target:e,priority:t};for(var n=0;n<Ot.length&&0!==t&&t<Ot[n].priority;n++);Ot.splice(n,0,e),0===n&&Dt(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),rc(t,Ze()),0==(6&Ts)&&(Us=Ze()+500,Ua()))}break;case 13:uc((function(){var t=Mo(e,1);if(null!==t){var n=ec();nc(t,e,1,n)}})),Gc(e,1)}},xt=function(e){if(13===e.tag){var t=Mo(e,134217728);if(null!==t)nc(t,e,134217728,ec());Gc(e,134217728)}},St=function(e){if(13===e.tag){var t=tc(e),n=Mo(e,t);if(null!==n)nc(n,e,t,ec());Gc(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(X(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 a=ka(r);if(!a)throw Error(o(90));q(r),X(r,a)}}}break;case"textarea":oe(e,n);break;case"select":null!=(t=n.value)&&ne(e,!!n.multiple,t,!1)}},Te=cc,Le=uc;var eu={usingClientEntryPoint:!1,Events:[va,wa,ka,Ce,Ae,cc]},tu={findFiberByHostInstance:ya,bundleType:0,version:"18.3.1",rendererPackageName:"react-dom"},nu={bundleType:tu.bundleType,version:tu.version,rendererPackageName:tu.rendererPackageName,rendererConfig:tu.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=We(e))?null:e.stateNode},findFiberByHostInstance:tu.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.3.1-next-f1338f8080-20240426"};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var ru=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!ru.isDisabled&&ru.supportsFiber)try{at=ru.inject(nu),ot=ru}catch(ue){}}t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=eu,t.createPortal=function(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!Qc(t))throw Error(o(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(!Qc(e))throw Error(o(299));var n=!1,r="",a=qc;return null!=t&&(!0===t.unstable_strictMode&&(n=!0),void 0!==t.identifierPrefix&&(r=t.identifierPrefix),void 0!==t.onRecoverableError&&(a=t.onRecoverableError)),t=$c(e,1,!1,null,0,n,0,r,a),e[ga]=t.current,Ur(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(o(188));throw e=Object.keys(e).join(","),Error(o(268,e))}return e=null===(e=We(t))?null:e.stateNode},t.flushSync=function(e){return uc(e)},t.hydrate=function(e,t,n){if(!Zc(t))throw Error(o(200));return Jc(null,e,t,!0,n)},t.hydrateRoot=function(e,t,n){if(!Qc(e))throw Error(o(405));var r=null!=n&&n.hydratedSources||null,a=!1,i="",l=qc;if(null!=n&&(!0===n.unstable_strictMode&&(a=!0),void 0!==n.identifierPrefix&&(i=n.identifierPrefix),void 0!==n.onRecoverableError&&(l=n.onRecoverableError)),t=Uc(t,null,e,1,null!=n?n:null,a,0,i,l),e[ga]=t.current,Ur(e),r)for(e=0;e<r.length;e++)a=(a=(n=r[e])._getVersion)(n._source),null==t.mutableSourceEagerHydrationData?t.mutableSourceEagerHydrationData=[n,a]:t.mutableSourceEagerHydrationData.push(n,a);return new Kc(t)},t.render=function(e,t,n){if(!Zc(t))throw Error(o(200));return Jc(null,e,t,!1,n)},t.unmountComponentAtNode=function(e){if(!Zc(e))throw Error(o(40));return!!e._reactRootContainer&&(uc((function(){Jc(null,null,e,!1,(function(){e._reactRootContainer=null,e[ga]=null}))})),!0)},t.unstable_batchedUpdates=cc,t.unstable_renderSubtreeIntoContainer=function(e,t,n,r){if(!Zc(n))throw Error(o(200));if(null==e||void 0===e._reactInternals)throw Error(o(38));return Jc(e,t,n,!1,r)},t.version="18.3.1-next-f1338f8080-20240426"},5338:(e,t,n)=>{"use strict";var r=n(961);t.createRoot=r.createRoot,t.hydrateRoot=r.hydrateRoot},961:(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(2551)},115:e=>{var t="undefined"!=typeof Element,n="function"==typeof Map,r="function"==typeof Set,a="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function o(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(!o(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(!o(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(a&&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)&&!o(e[c[s]],i[c[s]]))return!1;return!0}return e!=e&&i!=i}e.exports=function(e,t){try{return o(e,t)}catch(n){if((n.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw n}}},545:(e,t,n)=>{"use strict";n.d(t,{mg:()=>J,vd:()=>W});var r=n(6540),a=n(5556),o=n.n(a),i=n(115),l=n.n(i),s=n(311),c=n.n(s),u=n(2833),d=n.n(u);function f(){return f=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},f.apply(this,arguments)}function p(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,a={},o=Object.keys(e);for(r=0;r<o.length;r++)t.indexOf(n=o[r])>=0||(a[n]=e[n]);return a}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 f({},e,t)}),{})},A=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),a=0;a<r.length;a+=1){var o=r[a].toLowerCase();if(-1!==e.indexOf(o)&&n[o])return t.concat(n)}return t}),[])},T=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 a={};n.filter((function(e){for(var n,o=Object.keys(e),i=0;i<o.length;i+=1){var l=o[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]={}),a[n]||(a[n]={}),!r[n][c]&&(a[n][c]=!0,!0)})).reverse().forEach((function(t){return e.push(t)}));for(var o=Object.keys(a),i=0;i<o.length;i+=1){var l=o[i],s=f({},r[l],a[l]);r[l]=s}return e}),[]).reverse()},L=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},R=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}},P=function(e,t){var n;return f({},e,((n={})[t]=void 0,n))},O=[h.NOSCRIPT,h.SCRIPT,h.STYLE],j=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,"'")},M=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)},D=function(e,t){return t.map((function(t,n){var a,o=((a={key:n})["data-rh"]=!0,a);return Object.keys(t).forEach((function(e){var n=k[e]||e;"innerHTML"===n||"cssText"===n?o.dangerouslySetInnerHTML={__html:t.innerHTML||t.cssText}:o[n]=t[e]})),r.createElement(e,o)}))},F=function(e,t,n){switch(e){case h.TITLE:return{toComponent:function(){return n=t.titleAttributes,(a={key:e=t.title})["data-rh"]=!0,o=I(n,a),[r.createElement(h.TITLE,o,e)];var e,n,a,o},toString:function(){return function(e,t,n,r){var a=M(n),o=N(t);return a?"<"+e+' data-rh="true" '+a+">"+j(o,r)+"</"+e+">":"<"+e+' data-rh="true">'+j(o,r)+"</"+e+">"}(e,t.title,t.titleAttributes,n)}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return I(t)},toString:function(){return M(t)}};default:return{toComponent:function(){return D(e,t)},toString:function(){return function(e,t,n){return t.reduce((function(t,r){var a=Object.keys(r).filter((function(e){return!("innerHTML"===e||"cssText"===e)})).reduce((function(e,t){var a=void 0===r[t]?t:t+'="'+j(r[t],n)+'"';return e?e+" "+a:a}),""),o=r.innerHTML||r.cssText||"",i=-1===O.indexOf(e);return t+"<"+e+' data-rh="true" '+a+(i?"/>":">"+o+"</"+e+">")}),"")}(e,t,n)}}}},z=function(e){var t=e.baseTag,n=e.bodyAttributes,r=e.encode,a=e.htmlAttributes,o=e.noscriptTags,i=e.styleTags,l=e.title,s=void 0===l?"":l,c=e.titleAttributes,u=e.linkTags,d=e.metaTags,f=e.scriptTags,p={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var g=function(e){var t=e.linkTags,n=e.scriptTags,r=e.encode,a=R(e.metaTags,v),o=R(t,b),i=R(n,y);return{priorityMethods:{toComponent:function(){return[].concat(D(h.META,a.priority),D(h.LINK,o.priority),D(h.SCRIPT,i.priority))},toString:function(){return F(h.META,a.priority,r)+" "+F(h.LINK,o.priority,r)+" "+F(h.SCRIPT,i.priority,r)}},metaTags:a.default,linkTags:o.default,scriptTags:i.default}}(e);p=g.priorityMethods,u=g.linkTags,d=g.metaTags,f=g.scriptTags}return{priority:p,base:F(h.BASE,t,r),bodyAttributes:F("bodyAttributes",n,r),htmlAttributes:F("htmlAttributes",a,r),link:F(h.LINK,u,r),meta:F(h.META,d,r),noscript:F(h.NOSCRIPT,o,r),script:F(h.SCRIPT,f,r),style:F(h.STYLE,i,r),title:F(h.TITLE,{title:s,titleAttributes:c},r)}},$=[],B=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?$:n.instances},add:function(e){(n.canUseDOM?$:n.instances).push(e)},remove:function(e){var t=(n.canUseDOM?$:n.instances).indexOf(e);(n.canUseDOM?$: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:{}}))},U=r.createContext({}),H=o().shape({setHelmet:o().func,helmetInstances:o().shape({get:o().func,add:o().func,remove:o().func})}),V="undefined"!=typeof document,W=function(e){function t(n){var r;return(r=e.call(this,n)||this).helmetData=new B(r.props.context,t.canUseDOM),r}return p(t,e),t.prototype.render=function(){return r.createElement(U.Provider,{value:this.helmetData.value},this.props.children)},t}(r.Component);W.canUseDOM=V,W.propTypes={context:o().shape({helmet:o().shape()}),children:o().node.isRequired},W.defaultProps={context:{}},W.displayName="HelmetProvider";var G=function(e,t){var n,r=document.head||document.querySelector(h.HEAD),a=r.querySelectorAll(e+"[data-rh]"),o=[].slice.call(a),i=[];return t&&t.length&&t.forEach((function(t){var r=document.createElement(e);for(var a in t)Object.prototype.hasOwnProperty.call(t,a)&&("innerHTML"===a?r.innerHTML=t.innerHTML:"cssText"===a?r.styleSheet?r.styleSheet.cssText=t.cssText:r.appendChild(document.createTextNode(t.cssText)):r.setAttribute(a,void 0===t[a]?"":t[a]));r.setAttribute("data-rh","true"),o.some((function(e,t){return n=t,r.isEqualNode(e)}))?o.splice(n,1):i.push(r)})),o.forEach((function(e){return e.parentNode.removeChild(e)})),i.forEach((function(e){return r.appendChild(e)})),{oldTags:o,newTags:i}},q=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var r=n.getAttribute("data-rh"),a=r?r.split(","):[],o=[].concat(a),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===a.indexOf(s)&&a.push(s);var u=o.indexOf(s);-1!==u&&o.splice(u,1)}for(var d=o.length-1;d>=0;d-=1)n.removeAttribute(o[d]);a.length===o.length?n.removeAttribute("data-rh"):n.getAttribute("data-rh")!==i.join(",")&&n.setAttribute("data-rh",i.join(","))}},Y=function(e,t){var n=e.baseTag,r=e.htmlAttributes,a=e.linkTags,o=e.metaTags,i=e.noscriptTags,l=e.onChangeClientState,s=e.scriptTags,c=e.styleTags,u=e.title,d=e.titleAttributes;q(h.BODY,e.bodyAttributes),q(h.HTML,r),function(e,t){void 0!==e&&document.title!==e&&(document.title=N(e)),q(h.TITLE,t)}(u,d);var f={baseTag:G(h.BASE,n),linkTags:G(h.LINK,a),metaTags:G(h.META,o),noscriptTags:G(h.NOSCRIPT,i),scriptTags:G(h.SCRIPT,s),styleTags:G(h.STYLE,c)},p={},g={};Object.keys(f).forEach((function(e){var t=f[e],n=t.newTags,r=t.oldTags;n.length&&(p[e]=n),r.length&&(g[e]=f[e].oldTags)})),t&&t(),l(e,p,g)},K=null,Q=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];return(t=e.call.apply(e,[this].concat(r))||this).rendered=!1,t}p(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,a=null,o=(e=n.helmetInstances.get().map((function(e){var t=f({},e.props);return delete t.context,t})),{baseTag:A(["href"],e),bodyAttributes:C("bodyAttributes",e),defer:S(e,"defer"),encode:S(e,"encodeSpecialCharacters"),htmlAttributes:C("htmlAttributes",e),linkTags:T(h.LINK,["rel","href"],e),metaTags:T(h.META,["name","charset","http-equiv","property","itemprop"],e),noscriptTags:T(h.NOSCRIPT,["innerHTML"],e),onChangeClientState:_(e),scriptTags:T(h.SCRIPT,["src","innerHTML"],e),styleTags:T(h.STYLE,["cssText"],e),title:E(e),titleAttributes:C("titleAttributes",e),prioritizeSeoTags:L(e,"prioritizeSeoTags")});W.canUseDOM?(t=o,K&&cancelAnimationFrame(K),t.defer?K=requestAnimationFrame((function(){Y(t,(function(){K=null}))})):(Y(t),K=null)):z&&(a=z(o)),r(a)},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);Q.propTypes={context:H.isRequired},Q.displayName="HelmetDispatcher";var Z=["children"],X=["children"],J=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!l()(P(this.props,"helmetData"),P(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 f({},r,((t={})[n.type]=[].concat(r[n.type]||[],[f({},e.newChildProps,this.mapNestedChildrenToProps(n,e.nestedChildren))]),t))},n.mapObjectTypeChildren=function(e){var t,n,r=e.child,a=e.newProps,o=e.newChildProps,i=e.nestedChildren;switch(r.type){case h.TITLE:return f({},a,((t={})[r.type]=i,t.titleAttributes=f({},o),t));case h.BODY:return f({},a,{bodyAttributes:f({},o)});case h.HTML:return f({},a,{htmlAttributes:f({},o)});default:return f({},a,((n={})[r.type]=f({},o),n))}},n.mapArrayTypeChildrenToProps=function(e,t){var n=f({},t);return Object.keys(e).forEach((function(t){var r;n=f({},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,a={};return r.Children.forEach(e,(function(e){if(e&&e.props){var r=e.props,o=r.children,i=m(r,Z),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,o),s){case h.FRAGMENT:t=n.mapChildrenToProps(o,t);break;case h.LINK:case h.META:case h.NOSCRIPT:case h.SCRIPT:case h.STYLE:a=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:a,newChildProps:l,nestedChildren:o});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:l,nestedChildren:o})}}})),this.mapArrayTypeChildrenToProps(a,t)},n.render=function(){var e=this.props,t=e.children,n=m(e,X),a=f({},n),o=n.helmetData;return t&&(a=this.mapChildrenToProps(t,a)),!o||o instanceof B||(o=new B(o.context,o.instances)),o?r.createElement(Q,f({},a,{context:o.value,helmetData:void 0})):r.createElement(U.Consumer,null,(function(e){return r.createElement(Q,f({},a,{context:e}))}))},t}(r.Component);J.propTypes={base:o().object,bodyAttributes:o().object,children:o().oneOfType([o().arrayOf(o().node),o().node]),defaultTitle:o().string,defer:o().bool,encodeSpecialCharacters:o().bool,htmlAttributes:o().object,link:o().arrayOf(o().object),meta:o().arrayOf(o().object),noscript:o().arrayOf(o().object),onChangeClientState:o().func,script:o().arrayOf(o().object),style:o().arrayOf(o().object),title:o().string,titleAttributes:o().object,titleTemplate:o().string,prioritizeSeoTags:o().bool,helmetData:o().object},J.defaultProps={defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1},J.displayName="Helmet"},2799:(e,t)=>{"use strict";var n="function"==typeof Symbol&&Symbol.for,r=n?Symbol.for("react.element"):60103,a=n?Symbol.for("react.portal"):60106,o=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,f=n?Symbol.for("react.forward_ref"):60112,p=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 o:case l:case i:case p:return e;default:switch(e=e&&e.$$typeof){case c:case f:case h:case m:case s:return e;default:return t}}case a: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=f,t.Fragment=o,t.Lazy=h,t.Memo=m,t.Portal=a,t.Profiler=l,t.StrictMode=i,t.Suspense=p,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)===f},t.isFragment=function(e){return k(e)===o},t.isLazy=function(e){return k(e)===h},t.isMemo=function(e){return k(e)===m},t.isPortal=function(e){return k(e)===a},t.isProfiler=function(e){return k(e)===l},t.isStrictMode=function(e){return k(e)===i},t.isSuspense=function(e){return k(e)===p},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===o||e===d||e===l||e===i||e===p||e===g||"object"==typeof e&&null!==e&&(e.$$typeof===h||e.$$typeof===m||e.$$typeof===s||e.$$typeof===c||e.$$typeof===f||e.$$typeof===y||e.$$typeof===v||e.$$typeof===w||e.$$typeof===b)},t.typeOf=k},4363:(e,t,n)=>{"use strict";e.exports=n(2799)},3259:(e,t,n)=>{"use strict";function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function a(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(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(6540),s=[],c=[];var u=l.createContext(null);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 f(e){var t={loading:!1,loaded:{},error:null},n=[];try{Object.keys(e).forEach((function(r){var a=d(e[r]);a.loading?t.loading=!0:(t.loaded[r]=a.loaded,t.error=a.error),n.push(a.promise),a.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 p(e,t){return l.createElement((n=e)&&n.__esModule?n.default:n,t);var n}function g(e,t){var d,f;if(!t.loading)throw new Error("react-loadable requires a `loading` component");var g=i({loader:null,loading:null,delay:200,timeout:null,render:p,webpack:null,modules:null},t),m=null;function h(){return m||(m=e(g.loader)),m.promise}return s.push(h),"function"==typeof g.webpack&&c.push((function(){if((0,g.webpack)().every((function(e){return void 0!==e&&void 0!==n.m[e]})))return h()})),f=d=function(t){function n(n){var r;return o(a(a(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&&Array.isArray(g.modules)&&g.modules.forEach((function(t){e.context.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),o(d,"contextType",u),f}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(f,e)};var h=function(e){function t(){return e.apply(this,arguments)||this}return r(t,e),t.prototype.render=function(){return l.createElement(u.Provider,{value:{report:this.props.report}},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)}))}m.Capture=h,m.preloadAll=function(){return new Promise((function(e,t){b(s).then(e,t)}))},m.preloadReady=function(){return new Promise((function(e,t){b(c).then(e,e)}))},e.exports=m},2831:(e,t,n)=>{"use strict";n.d(t,{u:()=>i,v:()=>l});var r=n(6347),a=n(8168),o=n(6540);function i(e,t,n){return void 0===n&&(n=[]),e.some((function(e){var a=e.path?(0,r.B6)(t,e):n.length?n[n.length-1].match:r.Ix.computeRootMatch(t);return a&&(n.push({route:e,match:a}),e.routes&&i(e.routes,t,n)),a})),n}function l(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),e?o.createElement(r.dO,n,e.map((function(e,n){return o.createElement(r.qh,{key:e.key||n,path:e.path,exact:e.exact,strict:e.strict,render:function(n){return e.render?e.render((0,a.A)({},n,{},t,{route:e})):o.createElement(e.component,(0,a.A)({},n,t,{route:e}))}})}))):null}},4625:(e,t,n)=>{"use strict";n.d(t,{I9:()=>d,Kd:()=>u,N_:()=>b,k2:()=>w});var r=n(6347),a=n(2892),o=n(6540),i=n(1513),l=n(8168),s=n(8587),c=n(1561),u=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];return(t=e.call.apply(e,[this].concat(r))||this).history=(0,i.zR)(t.props),t}return(0,a.A)(t,e),t.prototype.render=function(){return o.createElement(r.Ix,{history:this.history,children:this.props.children})},t}(o.Component);var d=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];return(t=e.call.apply(e,[this].concat(r))||this).history=(0,i.TM)(t.props),t}return(0,a.A)(t,e),t.prototype.render=function(){return o.createElement(r.Ix,{history:this.history,children:this.props.children})},t}(o.Component);var f=function(e,t){return"function"==typeof e?e(t):e},p=function(e,t){return"string"==typeof e?(0,i.yJ)(e,null,null,t):e},g=function(e){return e},m=o.forwardRef;void 0===m&&(m=g);var h=m((function(e,t){var n=e.innerRef,r=e.navigate,a=e.onClick,i=(0,s.A)(e,["innerRef","navigate","onClick"]),c=i.target,u=(0,l.A)({},i,{onClick:function(e){try{a&&a(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=g!==m&&t||n,o.createElement("a",u)}));var b=m((function(e,t){var n=e.component,a=void 0===n?h:n,u=e.replace,d=e.to,b=e.innerRef,y=(0,s.A)(e,["component","replace","to","innerRef"]);return o.createElement(r.XZ.Consumer,null,(function(e){e||(0,c.A)(!1);var n=e.history,r=p(f(d,e.location),e.location),s=r?n.createHref(r):"",h=(0,l.A)({},y,{href:s,navigate:function(){var t=f(d,e.location),r=(0,i.AO)(e.location)===(0,i.AO)(p(t));(u||r?n.replace:n.push)(t)}});return g!==m?h.ref=t||b:h.innerRef=b,o.createElement(a,h)}))})),y=function(e){return e},v=o.forwardRef;void 0===v&&(v=y);var w=v((function(e,t){var n=e["aria-current"],a=void 0===n?"page":n,i=e.activeClassName,u=void 0===i?"active":i,d=e.activeStyle,g=e.className,m=e.exact,h=e.isActive,w=e.location,k=e.sensitive,x=e.strict,S=e.style,E=e.to,_=e.innerRef,C=(0,s.A)(e,["aria-current","activeClassName","activeStyle","className","exact","isActive","location","sensitive","strict","style","to","innerRef"]);return o.createElement(r.XZ.Consumer,null,(function(e){e||(0,c.A)(!1);var n=w||e.location,i=p(f(E,n),n),s=i.pathname,A=s&&s.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1"),T=A?(0,r.B6)(n.pathname,{path:A,exact:m,sensitive:k,strict:x}):null,L=!!(h?h(T,n):T),N="function"==typeof g?g(L):g,R="function"==typeof S?S(L):S;L&&(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),R=(0,l.A)({},R,d));var P=(0,l.A)({"aria-current":L&&a||null,className:N,style:R,to:i},C);return y!==v?P.ref=t||_:P.innerRef=_,o.createElement(b,P)}))}))},6347:(e,t,n)=>{"use strict";n.d(t,{B6:()=>S,Ix:()=>v,W6:()=>P,XZ:()=>y,dO:()=>N,qh:()=>E,zy:()=>O});var r=n(2892),a=n(6540),o=n(5556),i=n.n(o),l=n(1513),s=n(1561),c=n(8168),u=n(8505),d=n.n(u),f=(n(4363),n(8587)),p=(n(4146),1073741823),g="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{};var m=a.createContext||function(e,t){var n,o,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,a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return(t=e.call.apply(e,[this].concat(o))||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.A)(n,e);var a=n.prototype;return a.getChildContext=function(){var e;return(e={})[l]=this.emitter,e},a.componentWillReceiveProps=function(e){if(this.props.value!==e.value){var n,r=this.props.value,a=e.value;((o=r)===(i=a)?0!==o||1/o==1/i:o!=o&&i!=i)?n=0:(n="function"==typeof t?t(r,a):p,0!==(n|=0)&&this.emitter.set(e.value,n))}var o,i},a.render=function(){return this.props.children},n}(a.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),a=0;a<n;a++)r[a]=arguments[a];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.A)(n,t);var a=n.prototype;return a.componentWillReceiveProps=function(e){var t=e.observedBits;this.observedBits=null==t?p:t},a.componentDidMount=function(){this.context[l]&&this.context[l].on(this.onUpdate);var e=this.props.observedBits;this.observedBits=null==e?p:e},a.componentWillUnmount=function(){this.context[l]&&this.context[l].off(this.onUpdate)},a.getValue=function(){return this.context[l]?this.context[l].get():e},a.render=function(){return(e=this.props.children,Array.isArray(e)?e[0]:e)(this.state.value);var e},n}(a.Component);return c.contextTypes=((o={})[l]=i().object,o),{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.A)(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 a.createElement(y.Provider,{value:{history:this.props.history,location:this.state.location,match:t.computeRootMatch(this.state.location.pathname),staticContext:this.props.staticContext}},a.createElement(b.Provider,{children:this.props.children||null,value:this.props.history}))},t}(a.Component);a.Component;a.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,a=n.exact,o=void 0!==a&&a,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 a=[],o={regexp:d()(e,a,t),keys:a};return x<k&&(r[e]=o,x++),o}(n,{end:o,strict:l,sensitive:c}),a=r.regexp,i=r.keys,s=a.exec(e);if(!s)return null;var u=s[0],f=s.slice(1),p=e===u;return o&&!p?null:{path:n,url:"/"===n&&""===u?"/":u,isExact:p,params:i.reduce((function(e,t,n){return e[t.name]=f[n],e}),{})}}),null)}var E=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.A)(t,e),t.prototype.render=function(){var e=this;return a.createElement(y.Consumer,null,(function(t){t||(0,s.A)(!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,o=(0,c.A)({},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===a.Children.count(e)}(l)&&(l=null),a.createElement(y.Provider,{value:o},o.match?l?"function"==typeof l?l(o):l:u?a.createElement(u,o):d?d(o):null:"function"==typeof l?l(o):null)}))},t}(a.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.A)({},t,{pathname:t.pathname.substr(n.length)})}function A(e){return"string"==typeof e?e:(0,l.AO)(e)}function T(e){return function(){(0,s.A)(!1)}}function L(){}a.Component;var N=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.A)(t,e),t.prototype.render=function(){var e=this;return a.createElement(y.Consumer,null,(function(t){t||(0,s.A)(!1);var n,r,o=e.props.location||t.location;return a.Children.forEach(e.props.children,(function(e){if(null==r&&a.isValidElement(e)){n=e;var i=e.props.path||e.props.from;r=i?S(o.pathname,(0,c.A)({},e.props,{path:i})):t.match}})),r?a.cloneElement(n,{location:o,computedMatch:r}):null}))},t}(a.Component);var R=a.useContext;function P(){return R(b)}function O(){return R(y).location}},8505:(e,t,n)=>{var r=n(4634);e.exports=p,e.exports.parse=o,e.exports.compile=function(e,t){return l(o(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=f;var a=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function o(e,t){for(var n,r=[],o=0,i=0,l="",u=t&&t.delimiter||"/";null!=(n=a.exec(e));){var d=n[0],f=n[1],p=n.index;if(l+=e.slice(i,p),i=p+d.length,f)l+=f[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||o++,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),a=0;a<e.length;a++)"object"==typeof e[a]&&(n[a]=new RegExp("^(?:"+e[a].pattern+")$",d(t)));return function(t,a){for(var o="",l=t||{},s=(a||{}).pretty?i:encodeURIComponent,c=0;c<e.length;c++){var u=e[c];if("string"!=typeof u){var d,f=l[u.name];if(null==f){if(u.optional){u.partial&&(o+=u.prefix);continue}throw new TypeError('Expected "'+u.name+'" to be defined')}if(r(f)){if(!u.repeat)throw new TypeError('Expected "'+u.name+'" to not repeat, but received `'+JSON.stringify(f)+"`");if(0===f.length){if(u.optional)continue;throw new TypeError('Expected "'+u.name+'" to not be empty')}for(var p=0;p<f.length;p++){if(d=s(f[p]),!n[c].test(d))throw new TypeError('Expected all "'+u.name+'" to match "'+u.pattern+'", but received `'+JSON.stringify(d)+"`");o+=(0===p?u.prefix:u.delimiter)+d}}else{if(d=u.asterisk?encodeURI(f).replace(/[?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})):s(f),!n[c].test(d))throw new TypeError('Expected "'+u.name+'" to match "'+u.pattern+'", but received "'+d+'"');o+=u.prefix+d}}else o+=u}return o}}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 f(e,t,n){r(t)||(n=t||n,t=[]);for(var a=(n=n||{}).strict,o=!1!==n.end,i="",l=0;l<e.length;l++){var c=e[l];if("string"==typeof c)i+=s(c);else{var f=s(c.prefix),p="(?:"+c.pattern+")";t.push(c),c.repeat&&(p+="(?:"+f+p+")*"),i+=p=c.optional?c.partial?f+"("+p+")?":"(?:"+f+"("+p+"))?":f+"("+p+")"}}var g=s(n.delimiter||"/"),m=i.slice(-g.length)===g;return a||(i=(m?i.slice(0,-g.length):i)+"(?:"+g+"(?=$))?"),i+=o?"$":a&&m?"":"(?="+g+"|$)",u(new RegExp("^"+i,d(n)),t)}function p(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=[],a=0;a<e.length;a++)r.push(p(e[a],t,n).source);return u(new RegExp("(?:"+r.join("|")+")",d(n)),t)}(e,t,n):function(e,t,n){return f(o(e,n),t,n)}(e,t,n)}},1020:(e,t,n)=>{"use strict";var r=n(6540),a=Symbol.for("react.element"),o=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,o={},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)&&(o[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===o[r]&&(o[r]=t[r]);return{$$typeof:a,type:e,key:c,ref:u,props:o,_owner:l.current}}t.Fragment=o,t.jsx=c,t.jsxs=c},5287:(e,t)=>{"use strict";var n=Symbol.for("react.element"),r=Symbol.for("react.portal"),a=Symbol.for("react.fragment"),o=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"),f=Symbol.for("react.lazy"),p=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 a,o={},i=null,l=null;if(null!=t)for(a in void 0!==t.ref&&(l=t.ref),void 0!==t.key&&(i=""+t.key),t)x.call(t,a)&&!E.hasOwnProperty(a)&&(o[a]=t[a]);var s=arguments.length-2;if(1===s)o.children=r;else if(1<s){for(var c=Array(s),u=0;u<s;u++)c[u]=arguments[u+2];o.children=c}if(e&&e.defaultProps)for(a in s=e.defaultProps)void 0===o[a]&&(o[a]=s[a]);return{$$typeof:n,type:e,key:i,ref:l,props:o,_owner:S.current}}function C(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var A=/\/+/g;function T(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 L(e,t,a,o,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=""===o?"."+T(s,0):o,k(i)?(a="",null!=e&&(a=e.replace(A,"$&/")+"/"),L(i,t,a,"",(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,a+(!i.key||s&&s.key===i.key?"":(""+i.key).replace(A,"$&/")+"/")+e)),t.push(i)),1;if(s=0,o=""===o?".":o+":",k(e))for(var c=0;c<e.length;c++){var u=o+T(l=e[c],c);s+=L(l,t,a,u,i)}else if(u=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=p&&e[p]||e["@@iterator"])?e:null}(e),"function"==typeof u)for(e=u.call(e),c=0;!(l=e.next()).done;)s+=L(l=l.value,t,a,u=o+T(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=[],a=0;return L(e,r,"","",(function(e){return t.call(n,e,a++)})),r}function R(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 P={current:null},O={transition:null},j={ReactCurrentDispatcher:P,ReactCurrentBatchConfig:O,ReactCurrentOwner:S};function M(){throw Error("act(...) is not supported in production builds of React.")}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=a,t.Profiler=i,t.PureComponent=v,t.StrictMode=o,t.Suspense=u,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=j,t.act=M,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 a=m({},e.props),o=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&&(o=""+t.key),e.type&&e.type.defaultProps)var s=e.type.defaultProps;for(c in t)x.call(t,c)&&!E.hasOwnProperty(c)&&(a[c]=void 0===t[c]&&void 0!==s?s[c]:t[c])}var c=arguments.length-2;if(1===c)a.children=r;else if(1<c){s=Array(c);for(var u=0;u<c;u++)s[u]=arguments[u+2];a.children=s}return{$$typeof:n,type:e.type,key:o,ref:i,props:a,_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:f,_payload:{_status:-1,_result:e},_init:R}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=O.transition;O.transition={};try{e()}finally{O.transition=t}},t.unstable_act=M,t.useCallback=function(e,t){return P.current.useCallback(e,t)},t.useContext=function(e){return P.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return P.current.useDeferredValue(e)},t.useEffect=function(e,t){return P.current.useEffect(e,t)},t.useId=function(){return P.current.useId()},t.useImperativeHandle=function(e,t,n){return P.current.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return P.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return P.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return P.current.useMemo(e,t)},t.useReducer=function(e,t,n){return P.current.useReducer(e,t,n)},t.useRef=function(e){return P.current.useRef(e)},t.useState=function(e){return P.current.useState(e)},t.useSyncExternalStore=function(e,t,n){return P.current.useSyncExternalStore(e,t,n)},t.useTransition=function(){return P.current.useTransition()},t.version="18.3.1"},6540:(e,t,n)=>{"use strict";e.exports=n(5287)},4848:(e,t,n)=>{"use strict";e.exports=n(1020)},7463:(e,t)=>{"use strict";function n(e,t){var n=e.length;e.push(t);e:for(;0<n;){var r=n-1>>>1,a=e[r];if(!(0<o(a,t)))break e;e[r]=t,e[n]=a,n=r}}function r(e){return 0===e.length?null:e[0]}function a(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,a=e.length,i=a>>>1;r<i;){var l=2*(r+1)-1,s=e[l],c=l+1,u=e[c];if(0>o(s,n))c<a&&0>o(u,s)?(e[r]=u,e[c]=n,r=c):(e[r]=s,e[l]=n,r=l);else{if(!(c<a&&0>o(u,n)))break e;e[r]=u,e[c]=n,r=c}}}return t}function o(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,f=null,p=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)a(u);else{if(!(t.startTime<=e))break;a(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,O(x);else{var t=r(u);null!==t&&j(k,t.startTime-e)}}function x(e,n){m=!1,h&&(h=!1,y(C),C=-1),g=!0;var o=p;try{for(w(n),f=r(c);null!==f&&(!(f.expirationTime>n)||e&&!L());){var i=f.callback;if("function"==typeof i){f.callback=null,p=f.priorityLevel;var l=i(f.expirationTime<=n);n=t.unstable_now(),"function"==typeof l?f.callback=l:f===r(c)&&a(c),w(n)}else a(c);f=r(c)}if(null!==f)var s=!0;else{var d=r(u);null!==d&&j(k,d.startTime-n),s=!1}return s}finally{f=null,p=o,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,A=5,T=-1;function L(){return!(t.unstable_now()-T<A)}function N(){if(null!==_){var e=t.unstable_now();T=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 R=new MessageChannel,P=R.port2;R.port1.onmessage=N,S=function(){P.postMessage(null)}}else S=function(){b(N,0)};function O(e){_=e,E||(E=!0,S())}function j(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,O(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"):A=0<e?Math.floor(1e3/e):5},t.unstable_getCurrentPriorityLevel=function(){return p},t.unstable_getFirstCallbackNode=function(){return r(c)},t.unstable_next=function(e){switch(p){case 1:case 2:case 3:var t=3;break;default:t=p}var n=p;p=t;try{return e()}finally{p=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=p;p=e;try{return t()}finally{p=n}},t.unstable_scheduleCallback=function(e,a,o){var i=t.unstable_now();switch("object"==typeof o&&null!==o?o="number"==typeof(o=o.delay)&&0<o?i+o:i:o=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:a,priorityLevel:e,startTime:o,expirationTime:l=o+l,sortIndex:-1},o>i?(e.sortIndex=o,n(u,e),null===r(c)&&e===r(u)&&(h?(y(C),C=-1):h=!0,j(k,o-i))):(e.sortIndex=l,n(c,e),m||g||(m=!0,O(x))),e},t.unstable_shouldYield=L,t.unstable_wrapCallback=function(e){var t=p;return function(){var n=p;p=t;try{return e.apply(this,arguments)}finally{p=n}}}},9982:(e,t,n)=>{"use strict";e.exports=n(7463)},2833:e=>{e.exports=function(e,t,n,r){var a=n?n.call(r,e,t):void 0;if(void 0!==a)return!!a;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var o=Object.keys(e),i=Object.keys(t);if(o.length!==i.length)return!1;for(var l=Object.prototype.hasOwnProperty.bind(t),s=0;s<o.length;s++){var c=o[s];if(!l(c))return!1;var u=e[c],d=t[c];if(!1===(a=n?n.call(r,u,d,c):void 0)||void 0===a&&u!==d)return!1}return!0}},4784:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={title:"LmcRbacMvc",tagline:"Role-based access control for Laminas MVC application",favicon:"img/favicon.ico",url:"https://lm-commons.github.io",baseUrl:"/LmcRbacMvc/",organizationName:"LM-Commons",projectName:"LmcRbacMvc",trailingSlash:!1,onBrokenLinks:"throw",onBrokenMarkdownLinks:"warn",i18n:{defaultLocale:"en",locales:["en"],path:"i18n",localeConfigs:{}},presets:[["classic",{docs:{sidebarPath:"./sidebars.js",editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/"},blog:{showReadingTime:!0,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/"},theme:{customCss:"./src/css/custom.css"}}]],themeConfig:{image:"img/LMC-social-card.png",navbar:{title:"LmcRbacMvc",logo:{alt:"LM-Commons Logo",src:"img/LMC-logo.png"},items:[{type:"docSidebar",sidebarId:"tutorialSidebar",position:"left",label:"Documentation"},{to:"/blog",label:"Blog",position:"left"},{href:"https://lm-commons.github.io",label:"LM-Commons",position:"right"},{href:"https://github.com/lm-commons/lmcrbacmvc",label:"GitHub",position:"right"}],hideOnScroll:!1},footer:{style:"dark",links:[{title:"Docs",items:[{label:"Documentation",to:"/docs/intro"}]},{title:"Community",items:[{label:"Slack",href:"https://join.slack.com/t/lm-commons/shared_invite/zt-2gankt2wj-FTS45hp1W~JEj1tWvDsUHQ"}]},{title:"More",items:[{label:"Blog",to:"/blog"},{label:"GitHub",href:"https://github.com/lm-commons/lmcrbacmvc"}]}],copyright:"Copyright \xa9 2024 LM-Commons Organization. Built with Docusaurus."},prism:{theme:{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"}}]},darkTheme:{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)"}}]},additionalLanguages:["bash","json","php"],magicComments:[{className:"theme-code-block-highlighted-line",line:"highlight-next-line",block:{start:"highlight-start",end:"highlight-end"}}]},colorMode:{defaultMode:"light",disableSwitch:!1,respectPrefersColorScheme:!1},docs:{versionPersistence:"localStorage",sidebar:{hideable:!1,autoCollapseCategories:!1}},metadata:[],tableOfContents:{minHeadingLevel:2,maxHeadingLevel:3}},baseUrlIssueBanner:!0,future:{experimental_storage:{type:"localStorage",namespace:!1},experimental_router:"browser"},onBrokenAnchors:"warn",onDuplicateRoutes:"warn",staticDirectories:["static"],customFields:{},plugins:[],themes:[],scripts:[],headTags:[],stylesheets:[],clientModules:[],titleDelimiter:"|",noIndex:!1,markdown:{format:"mdx",mermaid:!1,mdx1Compat:{comments:!0,admonitions:!0,headingIds:!0},anchors:{maintainCase:!1}}}},8168:(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,{A:()=>r})},2892:(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 a(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,r(e,t)}n.d(t,{A:()=>a})},8587:(e,t,n)=>{"use strict";function r(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}n.d(t,{A:()=>r})},4164:(e,t,n)=>{"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(n=r(e[t]))&&(a&&(a+=" "),a+=n)}else for(n in e)e[n]&&(a&&(a+=" "),a+=n);return a}n.d(t,{A:()=>a});const a=function(){for(var e,t,n=0,a="",o=arguments.length;n<o;n++)(e=arguments[n])&&(t=r(e))&&(a&&(a+=" "),a+=t);return a}},1765:(e,t,n)=>{"use strict";n.d(t,{My:()=>A,f4:()=>ee});var r,a,o,i,l,s,c,u=n(6540),d=n(4164),f=Object.create,p=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?p(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 a?new a(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 a,o;switch(n=n||{},r.util.type(t)){case"Object":if(o=r.util.objId(t),n[o])return n[o];for(var i in a={},n[o]=a,t)t.hasOwnProperty(i)&&(a[i]=e(t[i],n));return a;case"Array":return o=r.util.objId(t),n[o]?n[o]:(a=[],n[o]=a,t.forEach((function(t,r){a[r]=e(t,n)})),a);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 a=e.classList;if(a.contains(t))return!0;if(a.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 a in t)n[a]=t[a];return n},insertBefore:function(e,t,n,a){var o=(a=a||r.languages)[e],i={};for(var l in o)if(o.hasOwnProperty(l)){if(l==t)for(var s in n)n.hasOwnProperty(s)&&(i[s]=n[s]);n.hasOwnProperty(l)||(i[l]=o[l])}var c=a[e];return a[e]=i,r.languages.DFS(r.languages,(function(t,n){n===c&&t!=e&&(this[t]=i)})),i},DFS:function e(t,n,a,o){o=o||{};var i=r.util.objId;for(var l in t)if(t.hasOwnProperty(l)){n.call(t,l,t[l],a||l);var s=t[l],c=r.util.type(s);"Object"!==c||o[i(s)]?"Array"!==c||o[i(s)]||(o[i(s)]=!0,e(s,n,l,o)):(o[i(s)]=!0,e(s,n,null,o))}}},plugins:{},highlight:function(e,t,n){var o={code:e,grammar:t,language:n};if(r.hooks.run("before-tokenize",o),!o.grammar)throw new Error('The language "'+o.language+'" has no grammar.');return o.tokens=r.tokenize(o.code,o.grammar),r.hooks.run("after-tokenize",o),a.stringify(r.util.encode(o.tokens),o.language)},tokenize:function(e,t){var n=t.rest;if(n){for(var r in n)t[r]=n[r];delete t.rest}var a=new l;return s(a,a.head,e),i(e,a,t,a.head,0),function(e){for(var t=[],n=e.head.next;n!==e.tail;)t.push(n.value),n=n.next;return t}(a)},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 a,o=0;a=n[o++];)a(t)}},Token:a};function a(e,t,n,r){this.type=e,this.content=t,this.alias=n,this.length=0|(r||"").length}function o(e,t,n,r){e.lastIndex=t;var a=e.exec(n);if(a&&r&&a[1]){var o=a[1].length;a.index+=o,a[0]=a[0].slice(o)}return a}function i(e,t,n,l,u,d){for(var f in n)if(n.hasOwnProperty(f)&&n[f]){var p=n[f];p=Array.isArray(p)?p:[p];for(var g=0;g<p.length;++g){if(d&&d.cause==f+","+g)return;var m=p[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 a)){var _,C=1;if(y){if(!(_=o(k,S,e,b))||_.index>=e.length)break;var A=_.index,T=_.index+_[0].length,L=S;for(L+=x.value.length;A>=L;)L+=(x=x.next).value.length;if(S=L-=x.value.length,x.value instanceof a)continue;for(var N=x;N!==t.tail&&(L<T||"string"==typeof N.value);N=N.next)C++,L+=N.value.length;C--,E=e.slice(S,L),_.index-=S}else if(!(_=o(k,0,E,b)))continue;A=_.index;var R=_[0],P=E.slice(0,A),O=E.slice(A+R.length),j=S+E.length;d&&j>d.reach&&(d.reach=j);var M=x.prev;if(P&&(M=s(t,M,P),S+=P.length),c(t,M,C),x=s(t,M,new a(f,h?r.tokenize(R,h):R,v,R)),O&&s(t,x,O),C>1){var I={cause:f+","+g,reach:j};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,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}function c(e,t,n){for(var r=t.next,a=0;a<n&&r!==e.tail;a++)r=r.next;t.next=r,r.prev=t,e.length-=a}return a.stringify=function e(t,n){if("string"==typeof t)return t;if(Array.isArray(t)){var a="";return t.forEach((function(t){a+=e(t,n)})),a}var o={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(o.classes,i):o.classes.push(i)),r.hooks.run("wrap",o);var l="";for(var s in o.attributes)l+=" "+s+'="'+(o.attributes[s]||"").replace(/"/g,""")+'"';return"<"+o.tag+' class="'+o.classes.join(" ")+'"'+l+">"+o.content+"</"+o.tag+">"},r}();t.exports=n,n.default=n}},function(){return a||(0,r[b(r)[0]])((a={exports:{}}).exports,a),a.exports}),A=((e,t,n)=>(n=null!=e?f(v(e)):{},((e,t,n,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let a of b(t))w.call(e,a)||a===n||p(e,a,{get:()=>t[a],enumerable:!(r=m(t,a))||r.enumerable});return e})(!t&&e&&e.__esModule?n:p(n,"default",{value:e,enumerable:!0}),e)))(C());A.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]},A.languages.markup.tag.inside["attr-value"].inside.entity=A.languages.markup.entity,A.languages.markup.doctype.inside["internal-subset"].inside=A.languages.markup,A.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(A.languages.markup.tag,"addInlined",{value:function(e,t){var n;(t=((n=((n={})["language-"+t]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:A.languages[t]},n.cdata=/^<!\[CDATA\[|\]\]>$/i,{"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:n}}))["language-"+t]={pattern:/[\s\S]+/,inside:A.languages[t]},{}))[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:n},A.languages.insertBefore("markup","cdata",t)}}),Object.defineProperty(A.languages.markup.tag,"addAttribute",{value:function(e,t){A.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:A.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),A.languages.html=A.languages.markup,A.languages.mathml=A.languages.markup,A.languages.svg=A.languages.markup,A.languages.xml=A.languages.extend("markup",{}),A.languages.ssml=A.languages.xml,A.languages.atom=A.languages.xml,A.languages.rss=A.languages.xml,o=A,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"},o.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"}},A.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:/[{}[\];(),.:]/},A.languages.javascript=A.languages.extend("clike",{"class-name":[A.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}|\?\?=?|\?\.?|[~:]/}),A.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,A.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:A.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:A.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:A.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:A.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:A.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),A.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:A.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"}}),A.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),A.languages.markup&&(A.languages.markup.tag.addInlined("script","javascript"),A.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")),A.languages.js=A.languages.javascript,A.languages.actionscript=A.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:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<<?|>>?>?|[!=]=?)=?|[~?@]/}),A.languages.actionscript["class-name"].alias="function",delete A.languages.actionscript.parameter,delete A.languages.actionscript["literal-property"],A.languages.markup&&A.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:A.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}(A),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},a="doc-comment";if(o=e.languages[t]){var o,i=o[a];if((i=i||(o=e.languages.insertBefore(t,"comment",{"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}}))[a])instanceof RegExp&&(i=o[a]={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)}(A),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"))}(A),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})}(A),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\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})),o=/"(?:[^"\\\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"(?:"+a+"|"+o+")"}))),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(o),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}(A),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,a=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),o=/\|?[ \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("^"+a+o+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+o+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),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 a,o=t[n];"code"!==o.type?e(o.content):(a=o.content[1],o=o.content[3],a&&o&&"code-language"===a.type&&"code-block"===o.type&&"string"==typeof a.content&&(a=a.content.replace(/\b#/g,"sharp").replace(/\b\+\+/g,"pp"),a="language-"+(a=(/[a-z][\w-]*/i.exec(a)||[""])[0].toLowerCase()),o.alias?"string"==typeof o.alias?o.alias=[o.alias,a]:o.alias.push(a):o.alias=[a]))}}(e.tokens)})),e.hooks.add("wrap",(function(t){if("code-block"===t.type){for(var n="",r=0,a=t.classes.length;r<a;r++){var o=t.classes[r];if(o=/language-(.+)/.exec(o)){n=o[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}(A),A.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:A.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+/},A.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 a=[];if(d(["definition-mutation","punctuation"])&&"("===u(1).content){n+=2;var o=f(/^\($/,/^\)$/);if(-1===o)continue;for(;n<o;n++){var i=u(0);"variable"===i.type&&(p(i,"variable-input"),a.push(i.content))}n=o+1}if(d(["punctuation","property-query"])&&"{"===u(0).content&&(n++,p(u(0),"property-mutation"),0<a.length)){var l=f(/^\{$/,/^\}$/);if(-1!==l)for(var s=n;s<l;s++){var c=t[s];"variable"===c.type&&0<=a.indexOf(c.content)&&p(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 f(e,r){for(var a=1,o=n;o<t.length;o++){var i=t[o],l=i.content;if("punctuation"===i.type&&"string"==typeof l)if(e.test(l))a++;else if(r.test(l)&&0==--a)return o}return-1}function p(e,t){var n=e.alias;n?Array.isArray(n)||(e.alias=n=[n]):e.alias=n=[],n.push(t)}})),A.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,a=r.inside["interpolation-punctuation"],o=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(o),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 o=0;o<n.length;o++){if(c>=d.length)return;var i,s,f,p,g,m,h,b=n[o];"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],f=void 0,(p={})["interpolation-punctuation"]=a,3===(p=e.tokenize(g,p)).length&&((f=[1,1]).push.apply(f,l(p[1],e.languages.javascript,"javascript")),p.splice.apply(p,f)),f=new e.Token("interpolation",p,r.alias,g),p=m.substring(h+i.length),g=[],s&&g.push(s),g.push(f),p&&(t(m=[p]),g.push.apply(g,m)),"string"==typeof b?(n.splice.apply(n,[o,1].concat(g)),o+=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,a=n.length;r<a;r++){var o,i,l,c=n[r];"string"!=typeof c&&(o=c.content,Array.isArray(o)?"template-string"===c.type?(c=o[1],3===o.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])&&(o[1]=s(i,l,c))):t(o):"string"!=typeof o&&t([o]))}}(t.tokens)}))}(A),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}(A),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)}(A),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})}(A),A.languages.n4js=A.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/}),A.languages.insertBefore("n4js","constant",{annotation:{pattern:/@+\w+/,alias:"operator"}}),A.languages.n4jsd=A.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 a=n[r],o=e.languages.javascript[a];a=(o="RegExp"===e.util.type(o)?e.languages.javascript[a]={pattern:o}:o).inside||{};(o.inside=a)["maybe-class-name"]=/^[A-Z][\s\S]*/}}(A),function(e){var t=e.util.clone(e.languages.javascript),n=/(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source,r=/(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source,a=/(?:\{<S>*\.{3}(?:[^{}]|<BRACES>)*\})/.source;function o(e,t){return e=e.replace(/<S>/g,(function(){return n})).replace(/<BRACES>/g,(function(){return r})).replace(/<SPREAD>/g,(function(){return a})),RegExp(e,t)}function i(t){for(var n=[],r=0;r<t.length;r++){var a=t[r],o=!1;"string"!=typeof a&&("tag"===a.type&&a.content[0]&&"tag"===a.content[0].type?"</"===a.content[0].content[0].content?0<n.length&&n[n.length-1].tagName===l(a.content[0].content[1])&&n.pop():"/>"!==a.content[a.content.length-1].content&&n.push({tagName:l(a.content[0].content[1]),openedBraces:0}):0<n.length&&"punctuation"===a.type&&"{"===a.content?n[n.length-1].openedBraces++:0<n.length&&0<n[n.length-1].openedBraces&&"punctuation"===a.type&&"}"===a.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof a)&&0<n.length&&0===n[n.length-1].openedBraces&&(o=l(a),r<t.length-1&&("string"==typeof t[r+1]||"plain-text"===t[r+1].type)&&(o+=l(t[r+1]),t.splice(r+1,1)),0<r&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(o=l(t[r-1])+o,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",o,null,o)),a.content&&"string"!=typeof a.content&&i(a.content)}}a=o(a).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\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:o(/<SPREAD>/.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=<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)}))}(A),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}(A),A.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:/[{}[\]();,.:\\]/},A.languages.swift["string-literal"].forEach((function(e){e.inside.interpolation.inside=A.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}(A),A.languages.c=A.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|[?:~]|[-+*/%&|^!=<>]=?/}),A.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),A.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},A.languages.c.string],char:A.languages.c.char,comment:A.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:A.languages.c}}}}),A.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 A.languages.c.boolean,A.languages.objectivec=A.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 A.languages.objectivec["class-name"],A.languages.objc=A.languages.objectivec,A.languages.reason=A.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/}),A.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 A.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}(A),A.languages.go=A.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/}),A.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete A.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"])}(A),A.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:/[{}[\];(),.:]/},A.languages.python["string-interpolation"].inside.interpolation.inside.rest=A.languages.python,A.languages.py=A.languages.python;((e,t)=>{for(var n in t)p(e,n,{get:t[n],enumerable:!0})})({},{dracula:()=>T,duotoneDark:()=>L,duotoneLight:()=>N,github:()=>R,jettwaveDark:()=>V,jettwaveLight:()=>W,nightOwl:()=>P,nightOwlLight:()=>O,oceanicNext:()=>I,okaidia:()=>D,oneDark:()=>G,oneLight:()=>q,palenight:()=>F,shadesOfPurple:()=>z,synthwave84:()=>$,ultramin:()=>B,vsDark:()=>U,vsLight:()=>H});var T={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)"}}]},L={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"}}]},R={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"}}]},P={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)"}}]},O={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)"}}]},j="#c5a5c5",M="#8dc891",I={plain:{backgroundColor:"#282c34",color:"#ffffff"},styles:[{types:["attr-name"],style:{color:j}},{types:["attr-value"],style:{color:M}},{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:M}},{types:["punctuation"],style:{color:M}},{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:j}},{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}}]},D={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)"}}]},$={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"}}]},B={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)"}}]},U={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)"}}]},H={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)"}}]},V={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"}}]},W={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"}}]},G={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%)"}}]},q={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%)"}}]},Y=(e,t)=>{const{plain:n}=e,r=e.styles.reduce(((e,n)=>{const{languages:r,style:a}=n;return r&&!r.includes(t)||n.types.forEach((t=>{const n=S(S({},e[t]),a);e[t]=n})),e}),{});return r.root=n,r.plain=E(S({},n),{backgroundColor:void 0}),r},K=/\r\n|\r|\n/,Q=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)},Z=(e,t)=>{const n=e.length;return n>0&&e[n-1]===t?e:e.concat(t)},X=e=>{const t=[[]],n=[e],r=[0],a=[e.length];let o=0,i=0,l=[];const s=[l];for(;i>-1;){for(;(o=r[i]++)<a[i];){let e,c=t[i];const u=n[i][o];if("string"==typeof u?(c=i>0?c:["plain"],e=u):(c=Z(c,u.type),u.alias&&(c=Z(c,u.alias)),e=u.content),"string"!=typeof e){i++,t.push(c),n.push(e),r.push(0),a.push(e.length);continue}const d=e.split(K),f=d.length;l.push({types:c,content:d[0]});for(let t=1;t<f;t++)Q(l),s.push(l=[]),l.push({types:c,content:d[t]})}i--,t.pop(),n.pop(),r.pop(),a.pop()}return Q(l),s},J=({children:e,language:t,code:n,theme:r,prism:a})=>{const o=t.toLowerCase(),i=((e,t)=>{const[n,r]=(0,u.useState)(Y(t,e)),a=(0,u.useRef)(),o=(0,u.useRef)();return(0,u.useEffect)((()=>{t===a.current&&e===o.current||(a.current=t,o.current=e,r(Y(t,e)))}),[e,t]),n})(o,r),l=(e=>(0,u.useCallback)((t=>{var n=t,{className:r,style:a,line:o}=n,i=_(n,["className","style","line"]);const l=E(S({},i),{className:(0,d.A)("token-line",r)});return"object"==typeof e&&"plain"in e&&(l.style=e.plain),"object"==typeof a&&(l.style=S(S({},l.style||{}),a)),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:a,style:o}=n,i=_(n,["token","className","style"]);const l=E(S({},i),{className:(0,d.A)("token",...r.types,a),children:r.content,style:t(r)});return null!=o&&(l.style=S(S({},l.style||{}),o)),l}),[t])})(i),c=(({prism:e,code:t,grammar:n,language:r})=>{const a=(0,u.useRef)(e);return(0,u.useMemo)((()=>{if(null==n)return X([t]);const e={code:t,grammar:n,language:r,tokens:[]};return a.current.hooks.run("before-tokenize",e),e.tokens=a.current.tokenize(t,n),a.current.hooks.run("after-tokenize",e),X(e.tokens)}),[t,n,r])})({prism:a,language:o,code:n,grammar:a.languages[o]});return e({tokens:c,className:`prism-code language-${o}`,style:null!=i?i.root:{},getLineProps:l,getTokenProps:s})},ee=e=>(0,u.createElement)(J,E(S({},e),{prism:e.prism||A,theme:e.theme||U,code:e.code,language:e.language}))},1561:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=!0,a="Invariant failed";function o(e,t){if(!e){if(r)throw new Error(a);var n="function"==typeof t?t():t,o=n?"".concat(a,": ").concat(n):a;throw new Error(o)}}},2654:e=>{"use strict";e.exports={}},4054:e=>{"use strict";e.exports=JSON.parse('{"/LmcRbacMvc/blog-f38":{"__comp":"a6aa9e1f","__context":{"plugin":"36994c47"},"sidebar":"814f3328","items":[{"content":"378f56c0"},{"content":"b5cb822e"}],"__props":"57a1fbff"},"/LmcRbacMvc/blog/archive-3db":{"__comp":"9e4087bc","__context":{"plugin":"36994c47"},"__props":"712eb253"},"/LmcRbacMvc/blog/new-documentation-5ba":{"__comp":"ccc49370","__context":{"data":{"blogMetadata":"acecf23e"},"plugin":"36994c47"},"sidebar":"814f3328","content":"809dac3e"},"/LmcRbacMvc/blog/tags-0ac":{"__comp":"01a85c17","__context":{"plugin":"36994c47"},"sidebar":"814f3328","__props":"cde7c749"},"/LmcRbacMvc/blog/tags/laminas-b15":{"__comp":"6875c492","__context":{"plugin":"36994c47"},"sidebar":"814f3328","items":[{"content":"378f56c0"},{"content":"b5cb822e"}],"__props":"3275e2b8"},"/LmcRbacMvc/blog/tags/lmcrbacmvc-200":{"__comp":"6875c492","__context":{"plugin":"36994c47"},"sidebar":"814f3328","items":[{"content":"378f56c0"}],"__props":"04b56dd9"},"/LmcRbacMvc/blog/tags/php-362":{"__comp":"6875c492","__context":{"plugin":"36994c47"},"sidebar":"814f3328","items":[{"content":"378f56c0"},{"content":"b5cb822e"}],"__props":"c0d4b1ca"},"/LmcRbacMvc/blog/welcome-c9c":{"__comp":"ccc49370","__context":{"data":{"blogMetadata":"acecf23e"},"plugin":"36994c47"},"sidebar":"814f3328","content":"ee696d42"},"/LmcRbacMvc/markdown-page-b53":{"__comp":"1f391b9e","__context":{"plugin":"a7456010"},"content":"393be207"},"/LmcRbacMvc/docs-24f":{"__comp":"5e95c892","__context":{"plugin":"aba21aa0"}},"/LmcRbacMvc/docs-0bf":{"__comp":"a7bd4aaa","__props":"7d54f919"},"/LmcRbacMvc/docs-033":{"__comp":"a94703ab"},"/LmcRbacMvc/docs/cookbook-2be":{"__comp":"17896441","content":"b9207088"},"/LmcRbacMvc/docs/guards-ea9":{"__comp":"17896441","content":"8b5d4ccc"},"/LmcRbacMvc/docs/installation-ecb":{"__comp":"17896441","content":"3b8c55ea"},"/LmcRbacMvc/docs/intro-3db":{"__comp":"17896441","content":"0e384e19"},"/LmcRbacMvc/docs/quick-start-5cd":{"__comp":"17896441","content":"72e14192"},"/LmcRbacMvc/docs/role-providers-e09":{"__comp":"17896441","content":"22465cd7"},"/LmcRbacMvc/docs/strategies-6d1":{"__comp":"17896441","content":"f6027d55"},"/LmcRbacMvc/docs/support-58f":{"__comp":"17896441","content":"d9e16301"},"/LmcRbacMvc/docs/using-the-authorization-service-9b1":{"__comp":"17896441","content":"4e6224b1"},"/LmcRbacMvc/-41a":{"__comp":"c4f5d8e4","__context":{"plugin":"a7456010"},"config":"5e9f5e1a"}}')}},e=>{e.O(0,[869],(()=>{return t=8536,e(e.s=t);var t}));e.O()}]); \ No newline at end of file diff --git a/assets/js/main.498b0bde.js b/assets/js/main.498b0bde.js new file mode 100644 index 00000000..6f5a1f5c --- /dev/null +++ b/assets/js/main.498b0bde.js @@ -0,0 +1,2 @@ +/*! For license information please see main.498b0bde.js.LICENSE.txt */ +(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8792],{8328:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});n(6540);var r=n(3259),a=n.n(r),o=n(4054);const i={"01a85c17":[()=>Promise.all([n.e(1869),n.e(8209)]).then(n.bind(n,9158)),"@theme/BlogTagsListPage",9158],"036cfcc4":[()=>n.e(5997).then(n.bind(n,1854)),"@site/versioned_docs/version-3.4/guards.md",1854],"04b56dd9":[()=>n.e(999).then(n.t.bind(n,6527,19)),"@generated/docusaurus-plugin-content-blog/default/p/lmc-rbac-mvc-blog-tags-lmcrbacmvc-262.json",6527],"07642c9c":[()=>n.e(3555).then(n.bind(n,145)),"@site/docs/Guides/example.md",145],"0e384e19":[()=>n.e(3976).then(n.bind(n,619)),"@site/docs/intro.md",619],17896441:[()=>Promise.all([n.e(1869),n.e(1538),n.e(8401)]).then(n.bind(n,575)),"@theme/DocItem",575],"19e40cbb":[()=>n.e(5937).then(n.bind(n,7086)),"@site/versioned_docs/version-3.4/using-the-authorization-service.md",7086],"1f391b9e":[()=>Promise.all([n.e(1869),n.e(1538),n.e(6061)]).then(n.bind(n,7973)),"@theme/MDXPage",7973],"294ac9d5":[()=>n.e(8744).then(n.bind(n,7077)),"@site/docs/plugins.md",7077],"3275e2b8":[()=>n.e(8063).then(n.t.bind(n,8478,19)),"@generated/docusaurus-plugin-content-blog/default/p/lmc-rbac-mvc-blog-tags-laminas-774.json",8478],"36994c47":[()=>n.e(9858).then(n.t.bind(n,5516,19)),"@generated/docusaurus-plugin-content-blog/default/__plugin.json",5516],"378f56c0":[()=>n.e(5639).then(n.bind(n,6060)),"@site/blog/2024-02-22-New-documentation.md?truncated=true",6060],"393be207":[()=>n.e(4134).then(n.bind(n,633)),"@site/src/pages/markdown-page.md",633],"3af849c7":[()=>n.e(9926).then(n.t.bind(n,6087,19)),"@generated/docusaurus-plugin-content-docs/default/p/lmc-rbac-mvc-docs-next-ed0.json",6087],"4e6224b1":[()=>n.e(4107).then(n.bind(n,6441)),"@site/docs/using-the-authorization-service.md",6441],"57a1fbff":[()=>n.e(2417).then(n.t.bind(n,6160,19)),"@generated/docusaurus-plugin-content-blog/default/p/lmc-rbac-mvc-blog-3e0.json",6160],"5e95c892":[()=>n.e(9647).then(n.bind(n,7121)),"@theme/DocsRoot",7121],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,4784)),"@generated/docusaurus.config",4784],"621db11d":[()=>Promise.all([n.e(1869),n.e(3347),n.e(4212)]).then(n.bind(n,3250)),"@theme/Blog/Pages/BlogAuthorsListPage",3250],"633f8beb":[()=>n.e(8102).then(n.bind(n,8169)),"@site/docs/Upgrading/upgrade.md",8169],"6875c492":[()=>Promise.all([n.e(1869),n.e(1538),n.e(3347),n.e(4813)]).then(n.bind(n,3069)),"@theme/BlogTagsPostsPage",3069],"712eb253":[()=>n.e(7784).then(n.t.bind(n,8657,19)),"@generated/docusaurus-plugin-content-blog/default/p/lmc-rbac-mvc-blog-archive-033.json",8657],"7543bdb1":[()=>n.e(1745).then(n.bind(n,9852)),"@site/versioned_docs/version-3.4/quick-start.md",9852],"778c4758":[()=>n.e(5946).then(n.bind(n,5539)),"@site/versioned_docs/version-3.4/role-providers.md",5539],"7d54f919":[()=>n.e(8500).then(n.t.bind(n,7431,19)),"@generated/docusaurus-plugin-content-docs/default/p/lmc-rbac-mvc-docs-e53.json",7431],"809dac3e":[()=>n.e(7804).then(n.bind(n,4e3)),"@site/blog/2024-02-22-New-documentation.md",4e3],"814f3328":[()=>n.e(7472).then(n.t.bind(n,5513,19)),"~blog/default/blog-post-list-prop-default.json",5513],"837900c0":[()=>n.e(345).then(n.bind(n,2818)),"@site/docs/Guides/identity-providers.md",2818],"8b5d4ccc":[()=>n.e(3223).then(n.bind(n,5811)),"@site/docs/guards.md",5811],"8bdb87c0":[()=>n.e(5317).then(n.bind(n,8773)),"@site/versioned_docs/version-3.4/cookbook.md",8773],"979f5aec":[()=>n.e(4072).then(n.bind(n,3337)),"@site/versioned_docs/version-3.4/support.md",3337],"9e4087bc":[()=>n.e(2711).then(n.bind(n,9331)),"@theme/BlogArchivePage",9331],"9ed00105":[()=>n.e(3873).then(n.bind(n,2163)),"@site/docs/configuration.md",2163],a44fbaba:[()=>n.e(430).then(n.bind(n,2164)),"@site/docs/Guides/lmcuser.md",2164],a6aa9e1f:[()=>Promise.all([n.e(1869),n.e(1538),n.e(3347),n.e(7643)]).then(n.bind(n,5124)),"@theme/BlogListPage",5124],a7456010:[()=>n.e(1235).then(n.t.bind(n,8552,19)),"@generated/docusaurus-plugin-content-pages/default/__plugin.json",8552],a7bd4aaa:[()=>n.e(7098).then(n.bind(n,1723)),"@theme/DocVersionRoot",1723],a94703ab:[()=>Promise.all([n.e(1869),n.e(9048)]).then(n.bind(n,1377)),"@theme/DocRoot",1377],aba21aa0:[()=>n.e(5742).then(n.t.bind(n,7093,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",7093],acecf23e:[()=>n.e(1903).then(n.t.bind(n,1912,19)),"~blog/default/blogMetadata-default.json",1912],b5cb822e:[()=>n.e(1390).then(n.bind(n,2957)),"@site/blog/2022-08-02-welcome.md?truncated=true",2957],b831a968:[()=>n.e(2741).then(n.bind(n,5297)),"@site/versioned_docs/version-3.4/strategies.md",5297],b96269b9:[()=>n.e(1868).then(n.t.bind(n,9772,19)),"@generated/docusaurus-plugin-content-blog/default/p/lmc-rbac-mvc-blog-authors-03b.json",9772],c0d4b1ca:[()=>n.e(4021).then(n.t.bind(n,1822,19)),"@generated/docusaurus-plugin-content-blog/default/p/lmc-rbac-mvc-blog-tags-php-d4a.json",1822],c4f5d8e4:[()=>Promise.all([n.e(1869),n.e(2634)]).then(n.bind(n,1402)),"@site/src/pages/index.js",1402],cc6cf6b9:[()=>n.e(7447).then(n.bind(n,9419)),"@site/docs/Guides/debugging.md",9419],ccc49370:[()=>Promise.all([n.e(1869),n.e(1538),n.e(3347),n.e(3249)]).then(n.bind(n,3858)),"@theme/BlogPostPage",3858],cde7c749:[()=>n.e(8117).then(n.t.bind(n,1768,19)),"@generated/docusaurus-plugin-content-blog/default/p/lmc-rbac-mvc-blog-tags-2d6.json",1768],d970cabc:[()=>n.e(4118).then(n.bind(n,6444)),"@site/versioned_docs/version-3.4/intro.md",6444],e713aeb5:[()=>n.e(214).then(n.bind(n,6112)),"@site/versioned_docs/version-3.4/installation.md",6112],ee696d42:[()=>n.e(7018).then(n.bind(n,3531)),"@site/blog/2022-08-02-welcome.md",3531],f6027d55:[()=>n.e(246).then(n.bind(n,2712)),"@site/docs/strategies.md",2712]};var l=n(4848);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(6921),u=n(3102);function d(e,t){if("*"===e)return a()({loading:s,loader:()=>n.e(2237).then(n.bind(n,2237)),modules:["@theme/NotFound"],webpack:()=>[2237],render(e,t){const n=e.default;return(0,l.jsx)(u.W,{value:{plugin:{name:"native",id:"default"}},children:(0,l.jsx)(n,{...t})})}});const r=o[`${e}-${t}`],d={},f=[],p=[],m=(0,c.A)(r);return Object.entries(m).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],f.push(r[1]),p.push(r[2]))})),a().Map({loading:s,loader:d,modules:f,webpack:()=>p,render(t,n){const a=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const o=r.default;if(!o)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 o&&"function"!=typeof o||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{o[e]=r[e]}));let i=a;const l=n.split(".");l.slice(0,-1).forEach((e=>{i=i[e]})),i[l[l.length-1]]=o}));const o=a.__comp;delete a.__comp;const i=a.__context;delete a.__context;const s=a.__props;return delete a.__props,(0,l.jsx)(u.W,{value:i,children:(0,l.jsx)(o,{...a,...s,...n})})}})}const f=[{path:"/LmcRbacMvc/blog",component:d("/LmcRbacMvc/blog","f38"),exact:!0},{path:"/LmcRbacMvc/blog/archive",component:d("/LmcRbacMvc/blog/archive","3db"),exact:!0},{path:"/LmcRbacMvc/blog/authors",component:d("/LmcRbacMvc/blog/authors","74c"),exact:!0},{path:"/LmcRbacMvc/blog/new-documentation",component:d("/LmcRbacMvc/blog/new-documentation","5ba"),exact:!0},{path:"/LmcRbacMvc/blog/tags",component:d("/LmcRbacMvc/blog/tags","0ac"),exact:!0},{path:"/LmcRbacMvc/blog/tags/laminas",component:d("/LmcRbacMvc/blog/tags/laminas","b15"),exact:!0},{path:"/LmcRbacMvc/blog/tags/lmcrbacmvc",component:d("/LmcRbacMvc/blog/tags/lmcrbacmvc","200"),exact:!0},{path:"/LmcRbacMvc/blog/tags/php",component:d("/LmcRbacMvc/blog/tags/php","362"),exact:!0},{path:"/LmcRbacMvc/blog/welcome",component:d("/LmcRbacMvc/blog/welcome","c9c"),exact:!0},{path:"/LmcRbacMvc/markdown-page",component:d("/LmcRbacMvc/markdown-page","b53"),exact:!0},{path:"/LmcRbacMvc/docs",component:d("/LmcRbacMvc/docs","ef6"),routes:[{path:"/LmcRbacMvc/docs/next",component:d("/LmcRbacMvc/docs/next","4e9"),routes:[{path:"/LmcRbacMvc/docs/next",component:d("/LmcRbacMvc/docs/next","9ad"),routes:[{path:"/LmcRbacMvc/docs/next/configuration",component:d("/LmcRbacMvc/docs/next/configuration","5ff"),exact:!0,sidebar:"tutorialSidebar"},{path:"/LmcRbacMvc/docs/next/guards",component:d("/LmcRbacMvc/docs/next/guards","852"),exact:!0,sidebar:"tutorialSidebar"},{path:"/LmcRbacMvc/docs/next/Guides/debugging",component:d("/LmcRbacMvc/docs/next/Guides/debugging","b74"),exact:!0,sidebar:"tutorialSidebar"},{path:"/LmcRbacMvc/docs/next/Guides/example",component:d("/LmcRbacMvc/docs/next/Guides/example","42a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/LmcRbacMvc/docs/next/Guides/identity-providers",component:d("/LmcRbacMvc/docs/next/Guides/identity-providers","0bf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/LmcRbacMvc/docs/next/Guides/lmcuser",component:d("/LmcRbacMvc/docs/next/Guides/lmcuser","bb8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/LmcRbacMvc/docs/next/intro",component:d("/LmcRbacMvc/docs/next/intro","ea5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/LmcRbacMvc/docs/next/plugins",component:d("/LmcRbacMvc/docs/next/plugins","42f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/LmcRbacMvc/docs/next/strategies",component:d("/LmcRbacMvc/docs/next/strategies","803"),exact:!0,sidebar:"tutorialSidebar"},{path:"/LmcRbacMvc/docs/next/Upgrading/upgrade",component:d("/LmcRbacMvc/docs/next/Upgrading/upgrade","add"),exact:!0,sidebar:"tutorialSidebar"},{path:"/LmcRbacMvc/docs/next/using-the-authorization-service",component:d("/LmcRbacMvc/docs/next/using-the-authorization-service","be7"),exact:!0,sidebar:"tutorialSidebar"}]}]},{path:"/LmcRbacMvc/docs",component:d("/LmcRbacMvc/docs","d61"),routes:[{path:"/LmcRbacMvc/docs",component:d("/LmcRbacMvc/docs","2e2"),routes:[{path:"/LmcRbacMvc/docs/cookbook",component:d("/LmcRbacMvc/docs/cookbook","44e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/LmcRbacMvc/docs/guards",component:d("/LmcRbacMvc/docs/guards","80b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/LmcRbacMvc/docs/installation",component:d("/LmcRbacMvc/docs/installation","aef"),exact:!0,sidebar:"tutorialSidebar"},{path:"/LmcRbacMvc/docs/intro",component:d("/LmcRbacMvc/docs/intro","dd0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/LmcRbacMvc/docs/quick-start",component:d("/LmcRbacMvc/docs/quick-start","3c5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/LmcRbacMvc/docs/role-providers",component:d("/LmcRbacMvc/docs/role-providers","68b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/LmcRbacMvc/docs/strategies",component:d("/LmcRbacMvc/docs/strategies","03b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/LmcRbacMvc/docs/support",component:d("/LmcRbacMvc/docs/support","1fc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/LmcRbacMvc/docs/using-the-authorization-service",component:d("/LmcRbacMvc/docs/using-the-authorization-service","e3d"),exact:!0,sidebar:"tutorialSidebar"}]}]}]},{path:"/LmcRbacMvc/",component:d("/LmcRbacMvc/","41a"),exact:!0},{path:"*",component:d("*")}]},6125:(e,t,n)=>{"use strict";n.d(t,{o:()=>o,x:()=>i});var r=n(6540),a=n(4848);const o=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,a.jsx)(o.Provider,{value:n,children:t})}},7815:(e,t,n)=>{"use strict";var r=n(6540),a=n(5338),o=n(545),i=n(4625),l=n(4784),s=n(8193);const c=[n(119),n(6134),n(6294),n(1043)];var u=n(8328),d=n(6347),f=n(2831),p=n(4848);function m(e){let{children:t}=e;return(0,p.jsx)(p.Fragment,{children:t})}var g=n(5260),h=n(4586),b=n(6025),y=n(6342),v=n(1213),w=n(2131),k=n(4090);const x="default";var S=n(440),_=n(1463);function E(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,h.A)(),r=(0,w.o)(),a=n[e].htmlLang,o=e=>e.replace("-","_");return(0,p.jsxs)(g.A,{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:o(a)}),Object.values(n).filter((e=>a!==e.htmlLang)).map((e=>(0,p.jsx)("meta",{property:"og:locale:alternate",content:o(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function C(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,h.A)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,h.A)(),{pathname:r}=(0,d.zy)();return e+(0,S.Ks)((0,b.Ay)(r),{trailingSlash:n,baseUrl:t})}(),a=t?`${n}${t}`:r;return(0,p.jsxs)(g.A,{children:[(0,p.jsx)("meta",{property:"og:url",content:a}),(0,p.jsx)("link",{rel:"canonical",href:a})]})}function A(){const{i18n:{currentLocale:e}}=(0,h.A)(),{metadata:t,image:n}=(0,y.p)();return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(g.A,{children:[(0,p.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,p.jsx)("body",{className:k.w})]}),n&&(0,p.jsx)(v.be,{image:n}),(0,p.jsx)(C,{}),(0,p.jsx)(E,{}),(0,p.jsx)(_.A,{tag:x,locale:e}),(0,p.jsx)(g.A,{children:t.map(((e,t)=>(0,p.jsx)("meta",{...e},t)))})]})}const T=new Map;var L=n(6125),R=n(6988),N=n(205);function O(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 a=c.map((t=>{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>a.forEach((e=>e?.()))}const j=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,N.A)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,a=t.hash===n.hash,o=t.search===n.search;if(r&&a&&!o)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),O("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function P(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,f.u)(u.A,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class M extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.A.canUseDOM?O("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=O("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),P(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)(j,{previousLocation:this.previousLocation,location:t,children:(0,p.jsx)(d.qh,{location:t,render:()=>e})})}}const I=M,D="__docusaurus-base-url-issue-banner-container",F="__docusaurus-base-url-issue-banner",z="__docusaurus-base-url-issue-banner-suggestion-container";function $(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 = '${D}';\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 B(){const{siteConfig:{baseUrl:e}}=(0,h.A)();return(0,p.jsx)(p.Fragment,{children:!s.A.canUseDOM&&(0,p.jsx)(g.A,{children:(0,p.jsx)("script",{children:$(e)})})})}function U(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,h.A)(),{pathname:n}=(0,d.zy)();return t&&n===e?(0,p.jsx)(B,{}):null}function H(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:r,localeConfigs:a}}=(0,h.A)(),o=(0,b.Ay)(e),{htmlLang:i,direction:l}=a[r];return(0,p.jsxs)(g.A,{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:o})]})}var V=n(7489),W=n(2303);function G(){const e=(0,W.A)();return(0,p.jsx)(g.A,{children:(0,p.jsx)("html",{"data-has-hydrated":e})})}const q=(0,f.v)(u.A);function Y(){const e=function(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,f.u)(u.A,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}}((0,d.zy)());return(0,p.jsx)(I,{location:e,children:q})}function K(){return(0,p.jsx)(V.A,{children:(0,p.jsx)(R.l,{children:(0,p.jsxs)(L.x,{children:[(0,p.jsxs)(m,{children:[(0,p.jsx)(H,{}),(0,p.jsx)(A,{}),(0,p.jsx)(U,{}),(0,p.jsx)(Y,{})]}),(0,p.jsx)(G,{})]})})})}var Q=n(4054);const Z=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.appendChild(r)}))}: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 X=n(6921);const J=new Set,ee=new Set,te=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ne={prefetch:e=>{if(!(e=>!te()&&!ee.has(e)&&!J.has(e))(e))return!1;J.add(e);const t=(0,f.u)(u.A,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,X.A)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Z(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!te()&&!ee.has(e))(e)&&(ee.add(e),P(e))},re=Object.freeze(ne);function ae(e){let{children:t}=e;return"hash"===l.default.future.experimental_router?(0,p.jsx)(i.I9,{children:t}):(0,p.jsx)(i.Kd,{children:t})}const oe=Boolean(!0);if(s.A.canUseDOM){window.docusaurus=re;const e=document.getElementById("__docusaurus"),t=(0,p.jsx)(o.vd,{children:(0,p.jsx)(ae,{children:(0,p.jsx)(K,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},i=()=>{if(window.docusaurusRoot)window.docusaurusRoot.render(t);else if(oe)window.docusaurusRoot=a.hydrateRoot(e,t,{onRecoverableError:n});else{const r=a.createRoot(e,{onRecoverableError:n});r.render(t),window.docusaurusRoot=r}};P(window.location.pathname).then((()=>{(0,r.startTransition)(i)}))}},6988:(e,t,n)=>{"use strict";n.d(t,{o:()=>d,l:()=>f});var r=n(6540),a=n(4784);const o=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/LmcRbacMvc/docs","versions":[{"name":"current","label":"Next","isLast":false,"path":"/LmcRbacMvc/docs/next","mainDocId":"intro","docs":[{"id":"configuration","path":"/LmcRbacMvc/docs/next/configuration","sidebar":"tutorialSidebar"},{"id":"guards","path":"/LmcRbacMvc/docs/next/guards","sidebar":"tutorialSidebar"},{"id":"Guides/debugging","path":"/LmcRbacMvc/docs/next/Guides/debugging","sidebar":"tutorialSidebar"},{"id":"Guides/example","path":"/LmcRbacMvc/docs/next/Guides/example","sidebar":"tutorialSidebar"},{"id":"Guides/identity-providers","path":"/LmcRbacMvc/docs/next/Guides/identity-providers","sidebar":"tutorialSidebar"},{"id":"Guides/lmcuser","path":"/LmcRbacMvc/docs/next/Guides/lmcuser","sidebar":"tutorialSidebar"},{"id":"intro","path":"/LmcRbacMvc/docs/next/intro","sidebar":"tutorialSidebar"},{"id":"plugins","path":"/LmcRbacMvc/docs/next/plugins","sidebar":"tutorialSidebar"},{"id":"strategies","path":"/LmcRbacMvc/docs/next/strategies","sidebar":"tutorialSidebar"},{"id":"Upgrading/upgrade","path":"/LmcRbacMvc/docs/next/Upgrading/upgrade","sidebar":"tutorialSidebar"},{"id":"using-the-authorization-service","path":"/LmcRbacMvc/docs/next/using-the-authorization-service","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/LmcRbacMvc/docs/next/intro","label":"Getting Started"}}}},{"name":"3.4","label":"3.4","isLast":true,"path":"/LmcRbacMvc/docs","mainDocId":"intro","docs":[{"id":"cookbook","path":"/LmcRbacMvc/docs/cookbook","sidebar":"tutorialSidebar"},{"id":"guards","path":"/LmcRbacMvc/docs/guards","sidebar":"tutorialSidebar"},{"id":"installation","path":"/LmcRbacMvc/docs/installation","sidebar":"tutorialSidebar"},{"id":"intro","path":"/LmcRbacMvc/docs/intro","sidebar":"tutorialSidebar"},{"id":"quick-start","path":"/LmcRbacMvc/docs/quick-start","sidebar":"tutorialSidebar"},{"id":"role-providers","path":"/LmcRbacMvc/docs/role-providers","sidebar":"tutorialSidebar"},{"id":"strategies","path":"/LmcRbacMvc/docs/strategies","sidebar":"tutorialSidebar"},{"id":"support","path":"/LmcRbacMvc/docs/support","sidebar":"tutorialSidebar"},{"id":"using-the-authorization-service","path":"/LmcRbacMvc/docs/using-the-authorization-service","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/LmcRbacMvc/docs/intro","label":"intro"}}}}],"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(2654);const s=JSON.parse('{"docusaurusVersion":"3.5.2","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.5.2"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.5.2"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.5.2"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.5.2"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.5.2"}}}');var c=n(4848);const u={siteConfig:a.default,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},d=r.createContext(u);function f(e){let{children:t}=e;return(0,c.jsx)(d.Provider,{value:u,children:t})}},7489:(e,t,n)=>{"use strict";n.d(t,{A:()=>g});var r=n(6540),a=n(8193),o=n(5260),i=n(440),l=n(781),s=n(3102),c=n(4848);function u(e){let{error:t,tryAgain:n}=e;return(0,c.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,c.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,c.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,c.jsx)(d,{error:t})]})}function d(e){let{error:t}=e;const n=(0,i.rA)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,c.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function f(e){let{children:t}=e;return(0,c.jsx)(s.W,{value:{plugin:{name:"docusaurus-core-error-boundary",id:"default"}},children:t})}function p(e){let{error:t,tryAgain:n}=e;return(0,c.jsx)(f,{children:(0,c.jsxs)(g,{fallback:()=>(0,c.jsx)(u,{error:t,tryAgain:n}),children:[(0,c.jsx)(o.A,{children:(0,c.jsx)("title",{children:"Page Error"})}),(0,c.jsx)(l.A,{children:(0,c.jsx)(u,{error:t,tryAgain:n})})]})})}const m=e=>(0,c.jsx)(p,{...e});class g extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.A.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??m)(e)}return e??null}}},8193:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5260:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});n(6540);var r=n(545),a=n(4848);function o(e){return(0,a.jsx)(r.mg,{...e})}},8774:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});var r=n(6540),a=n(4625),o=n(440),i=n(4586),l=n(6654),s=n(8193),c=n(3427),u=n(6025),d=n(4848);function f(e,t){let{isNavLink:n,to:f,href:p,activeClassName:m,isActive:g,"data-noBrokenLinkCheck":h,autoAddBaseUrl:b=!0,...y}=e;const{siteConfig:v}=(0,i.A)(),{trailingSlash:w,baseUrl:k}=v,x=v.future.experimental_router,{withBaseUrl:S}=(0,u.hH)(),_=(0,c.A)(),E=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>E.current));const C=f||p;const A=(0,l.A)(C),T=C?.replace("pathname://","");let L=void 0!==T?(R=T,b&&(e=>e.startsWith("/"))(R)?S(R):R):void 0;var R;"hash"===x&&L?.startsWith("./")&&(L=L?.slice(1)),L&&A&&(L=(0,o.Ks)(L,{trailingSlash:w,baseUrl:k}));const N=(0,r.useRef)(!1),O=n?a.k2:a.N_,j=s.A.canUseIntersectionObserver,P=(0,r.useRef)(),M=()=>{N.current||null==L||(window.docusaurus.preload(L),N.current=!0)};(0,r.useEffect)((()=>(!j&&A&&s.A.canUseDOM&&null!=L&&window.docusaurus.prefetch(L),()=>{j&&P.current&&P.current.disconnect()})),[P,L,j,A]);const I=L?.startsWith("#")??!1,D=!y.target||"_self"===y.target,F=!L||!A||!D||I&&"hash"!==x;h||!I&&F||_.collectLink(L),y.id&&_.collectAnchor(y.id);const z={};return F?(0,d.jsx)("a",{ref:E,href:L,...C&&!A&&{target:"_blank",rel:"noopener noreferrer"},...y,...z}):(0,d.jsx)(O,{...y,onMouseEnter:M,onTouchStart:M,innerRef:e=>{E.current=e,j&&e&&A&&(P.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(P.current.unobserve(e),P.current.disconnect(),null!=L&&window.docusaurus.prefetch(L))}))})),P.current.observe(e))},to:L,...n&&{isActive:g,activeClassName:m},...z})}const p=r.forwardRef(f)},418:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const r=()=>null},1312:(e,t,n)=>{"use strict";n.d(t,{A:()=>c,T:()=>s});var r=n(6540),a=n(4848);function o(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=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(2654);function l(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function s(e,t){let{message:n,id:r}=e;return o(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,a.jsx)(a.Fragment,{children:o(i,r)})}},7065:(e,t,n)=>{"use strict";n.d(t,{W:()=>r});const r="default"},6654:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{A:()=>a,z:()=>r})},6025:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>l,hH:()=>i});var r=n(6540),a=n(4586),o=n(6654);function i(){const{siteConfig:e}=(0,a.A)(),{baseUrl:t,url:n}=e,i=e.future.experimental_router,l=(0,r.useCallback)(((e,r)=>function(e){let{siteUrl:t,baseUrl:n,url:r,options:{forcePrependBaseUrl:a=!1,absolute:i=!1}={},router:l}=e;if(!r||r.startsWith("#")||(0,o.z)(r))return r;if("hash"===l)return r.startsWith("/")?`.${r}`:`./${r}`;if(a)return n+r.replace(/^\//,"");if(r===n.replace(/\/$/,""))return n;const s=r.startsWith(n)?r:n+r.replace(/^\//,"");return i?t+s:s}({siteUrl:n,baseUrl:t,url:e,options:r,router:i})),[n,t,i]);return{withBaseUrl:l}}function l(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},3427:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(6540);n(4848);const a=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),o=()=>(0,r.useContext)(a);function i(){return o()}},4586:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540),a=n(6988);function o(){return(0,r.useContext)(a.o)}},2303:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540),a=n(6125);function o(){return(0,r.useContext)(a.o)}},205:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540);const a=n(8193).A.canUseDOM?r.useLayoutEffect:r.useEffect},6803:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540),a=n(3102);function o(){const e=r.useContext(a.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}},6921:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[o,i]=n;const l=a?`${a}.${o}`:o;r(i)?e(i,l):t[l]=i}))}(e),t}},3102:(e,t,n)=>{"use strict";n.d(t,{W:()=>i,o:()=>o});var r=n(6540),a=n(4848);const o=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(o),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,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,a.jsx)(o.Provider,{value:l,children:t})}},3886:(e,t,n)=>{"use strict";n.d(t,{VQ:()=>h,g1:()=>y});var r=n(6540),a=n(4070),o=n(7065),i=n(6342),l=n(679),s=n(9532),c=n(4848);const u=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,l.Wf)(u(e),{persistence:t}).set(n)},read:(e,t)=>(0,l.Wf)(u(e),{persistence:t}).get(),clear:(e,t)=>{(0,l.Wf)(u(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const p=r.createContext(null);function m(){const e=(0,a.Gy)(),t=(0,i.p)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,l]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=d.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(d.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function g(e){let{children:t}=e;const n=m();return(0,c.jsx)(p.Provider,{value:n,children:t})}function h(e){let{children:t}=e;return(0,c.jsx)(g,{children:t})}function b(){const e=(0,r.useContext)(p);if(!e)throw new s.dV("DocsPreferredVersionContextProvider");return e}function y(e){void 0===e&&(e=o.W);const t=(0,a.ht)(e),[n,i]=b(),{preferredVersionName:l}=n[e];return{preferredVersion:t.versions.find((e=>e.name===l))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}},609:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,t:()=>c});var r=n(6540),a=n(9532),o=n(4848);const i=Symbol("EmptyContext"),l=r.createContext(i);function s(e){let{children:t,name:n,items:a}=e;const i=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return(0,o.jsx)(l.Provider,{value:i,children:t})}function c(){const e=(0,r.useContext)(l);if(e===i)throw new a.dV("DocsSidebarProvider");return e}},6972:(e,t,n)=>{"use strict";n.d(t,{B5:()=>S,Nr:()=>f,OF:()=>v,QB:()=>x,Vd:()=>w,Y:()=>b,fW:()=>k,w8:()=>g});var r=n(6540),a=n(6347),o=n(2831),i=n(4070),l=n(9169),s=n(1682),c=n(3886),u=n(3025),d=n(609);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 p=(e,t)=>void 0!==e&&(0,l.ys)(e,t),m=(e,t)=>e.some((e=>g(e,t)));function g(e,t){return"link"===e.type?p(e.href,t):"category"===e.type&&(p(e.href,t)||m(e.items,t))}function h(e,t){switch(e.type){case"category":return g(e,t)||e.items.some((e=>h(e,t)));case"link":return!e.unlisted||g(e,t);default:return!0}}function b(e,t){return(0,r.useMemo)((()=>e.filter((e=>h(e,t)))),[e,t])}function y(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,l.ys)(o.href,n)||e(o.items))||"link"===o.type&&(0,l.ys)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function v(){const e=(0,d.t)(),{pathname:t}=(0,a.zy)(),n=(0,i.vT)()?.pluginData.breadcrumbs;return!1!==n&&e?y({sidebarItems:e.items,pathname:t}):null}function w(e){const{activeVersion:t}=(0,i.zK)(e),{preferredVersion:n}=(0,c.g1)(e),a=(0,i.r7)(e);return(0,r.useMemo)((()=>(0,s.sb)([t,n,a].filter(Boolean))),[t,n,a])}function k(e,t){const n=w(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 x(e,t){const n=w(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- ${(0,s.sb)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function S(e){let{route:t}=e;const n=(0,a.zy)(),r=(0,u.r)(),i=t.routes,l=i.find((e=>(0,a.B6)(n.pathname,e)));if(!l)return null;const s=l.sidebar,c=s?r.docsSidebars[s]:void 0;return{docElement:(0,o.v)(i),sidebarName:s,sidebarItems:c}}},3025:(e,t,n)=>{"use strict";n.d(t,{n:()=>l,r:()=>s});var r=n(6540),a=n(9532),o=n(4848);const i=r.createContext(null);function l(e){let{children:t,version:n}=e;return(0,o.jsx)(i.Provider,{value:n,children:t})}function s(){const e=(0,r.useContext)(i);if(null===e)throw new a.dV("DocsVersionProvider");return e}},4070:(e,t,n)=>{"use strict";n.d(t,{zK:()=>g,vT:()=>f,Gy:()=>u,HW:()=>h,ht:()=>d,r7:()=>m,jh:()=>p});var r=n(6347),a=n(4586),o=n(7065);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.A)();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){return[...e.versions].sort(((e,t)=>e.path===t.path?0:e.path.includes(t.path)?-1:t.path.includes(e.path)?1:0)).find((e=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),a=n?.docs.find((e=>!!(0,r.B6)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const c={},u=()=>i("docusaurus-plugin-content-docs")??c,d=e=>{try{return function(e,t,n){void 0===t&&(t=o.W),void 0===n&&(n={});const r=i(e),a=r?.[t];if(!a&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return a}("docusaurus-plugin-content-docs",e,{failfast:!0})}catch(t){throw new Error("You are using a feature of the Docusaurus docs plugin, but this plugin does not seem to be enabled"+("Default"===e?"":` (pluginId=${e}`),{cause:t})}};function f(e){void 0===e&&(e={});const t=u(),{pathname:n}=(0,r.zy)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.B6)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&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 o}(t,n,e)}function p(e){return d(e).versions}function m(e){const t=d(e);return l(t)}function g(e){const t=d(e),{pathname:n}=(0,r.zy)();return s(t,n)}function h(e){const t=d(e),{pathname:n}=(0,r.zy)();return function(e,t){const n=l(e);return{latestDocSuggestion:s(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},6294:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(5947),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},6134:(e,t,n)=>{"use strict";n.r(t);var r=n(1765),a=n(4784);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(9700),n(2022)(`./prism-${e}`)})),delete globalThis.Prism}(r.My)},1107:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(4164),a=n(1312),o=n(6342),i=n(8774),l=n(3427);const s={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var c=n(4848);function u(e){let{as:t,id:n,...u}=e;const d=(0,l.A)(),{navbar:{hideOnScroll:f}}=(0,o.p)();if("h1"===t||!n)return(0,c.jsx)(t,{...u,id:void 0});d.collectAnchor(n);const p=(0,a.T)({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.A)("anchor",f?s.anchorWithHideOnScrollNavbar:s.anchorWithStickyNavbar,u.className),id:n,children:[u.children,(0,c.jsx)(i.A,{className:"hash-link",to:`#${n}`,"aria-label":p,title:p,children:"\u200b"})]})}},3186:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});n(6540);const r={iconExternalLink:"iconExternalLink_nPIU"};var a=n(4848);function o(e){let{width:t=13.5,height:n=13.5}=e;return(0,a.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,a.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"})})}},781:(e,t,n)=>{"use strict";n.d(t,{A:()=>pt});var r=n(6540),a=n(4164),o=n(7489),i=n(1213),l=n(6347),s=n(1312),c=n(5062),u=n(4848);const d="__docusaurus_skipToContent_fallback";function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function p(){const e=(0,r.useRef)(null),{action:t}=(0,l.W6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&f(t)}),[]);return(0,c.$)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,onClick:n}}const m=(0,s.T)({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 g(e){const t=e.children??m,{containerRef:n,onClick:r}=p();return(0,u.jsx)("div",{ref:n,role:"region","aria-label":m,children:(0,u.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var h=n(7559),b=n(4090);const y={skipToContent:"skipToContent_fXgn"};function v(){return(0,u.jsx)(g,{className:y.skipToContent})}var w=n(6342),k=n(5041);function x(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:a=1.2,className:o,...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:a,children:(0,u.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const S={closeButton:"closeButton_CVFx"};function _(e){return(0,u.jsx)("button",{type:"button","aria-label":(0,s.T)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,a.A)("clean-btn close",S.closeButton,e.className),children:(0,u.jsx)(x,{width:14,height:14,strokeWidth:3.1})})}const E={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,w.p)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,a.A)(E.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const A={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function T(){const{announcementBar:e}=(0,w.p)(),{isActive:t,close:n}=(0,k.M)();if(!t)return null;const{backgroundColor:r,textColor:a,isCloseable:o}=e;return(0,u.jsxs)("div",{className:A.announcementBar,style:{backgroundColor:r,color:a},role:"banner",children:[o&&(0,u.jsx)("div",{className:A.announcementBarPlaceholder}),(0,u.jsx)(C,{className:A.announcementBarContent}),o&&(0,u.jsx)(_,{onClick:n,className:A.announcementBarClose})]})}var L=n(9876),R=n(3104);var N=n(9532),O=n(5600);const j=r.createContext(null);function P(e){let{children:t}=e;const n=function(){const e=(0,L.M)(),t=(0,O.YL)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,N.ZC)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return(0,u.jsx)(j.Provider,{value:n,children:t})}function M(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function I(){const e=(0,r.useContext)(j);if(!e)throw new N.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,O.YL)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:M(o)})),[a,o,t])}function D(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:o}=I();return(0,u.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,u.jsxs)("div",{className:(0,a.A)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":o}),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(5293),z=n(2303);function $(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 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:"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 U={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function H(e){let{className:t,buttonClassName:n,value:r,onChange:o}=e;const i=(0,z.A)(),l=(0,s.T)({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.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,s.T)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,u.jsx)("div",{className:(0,a.A)(U.toggle,t),children:(0,u.jsxs)("button",{className:(0,a.A)("clean-btn",U.toggleButton,!i&&U.toggleButtonDisabled,n),type:"button",onClick:()=>o("dark"===r?"light":"dark"),disabled:!i,title:l,"aria-label":l,"aria-live":"polite",children:[(0,u.jsx)($,{className:(0,a.A)(U.toggleIcon,U.lightToggleIcon)}),(0,u.jsx)(B,{className:(0,a.A)(U.toggleIcon,U.darkToggleIcon)})]})})}const V=r.memo(H),W={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function G(e){let{className:t}=e;const n=(0,w.p)().navbar.style,r=(0,w.p)().colorMode.disableSwitch,{colorMode:a,setColorMode:o}=(0,F.G)();return r?null:(0,u.jsx)(V,{className:t,buttonClassName:"dark"===n?W.darkNavbarColorModeToggle:void 0,value:a,onChange:o})}var q=n(3465);function Y(){return(0,u.jsx)(q.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function K(){const e=(0,L.M)();return(0,u.jsx)("button",{type:"button","aria-label":(0,s.T)({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 Q(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(Y,{}),(0,u.jsx)(G,{className:"margin-right--md"}),(0,u.jsx)(K,{})]})}var Z=n(8774),X=n(6025),J=n(6654);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(3186);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:a,label:o,html:i,isDropdownLink:l,prependBaseUrlToHref:s,...c}=e;const d=(0,X.Ay)(r),f=(0,X.Ay)(t),p=(0,X.Ay)(a,{forcePrependBaseUrl:!0}),m=o&&a&&!(0,J.A)(a),g=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,u.jsxs)(u.Fragment,{children:[o,m&&(0,u.jsx)(te.A,{...l&&{width:12,height:12}})]})};return a?(0,u.jsx)(Z.A,{href:s?p:a,...c,...g}):(0,u.jsx)(Z.A,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(f)},...c,...g})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const o=(0,u.jsx)(ne,{className:(0,a.A)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,u.jsx)("li",{children:o}):o}function ae(e){let{className:t,isDropdownItem:n,...r}=e;return(0,u.jsx)("li",{className:"menu__list-item",children:(0,u.jsx)(ne,{className:(0,a.A)("menu__link",t),...r})})}function oe(e){let{mobile:t=!1,position:n,...r}=e;const a=t?ae:re;return(0,u.jsx)(a,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(1422),le=n(9169),se=n(4586);const ce={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_S0Fm"};function ue(e,t){return e.some((e=>function(e,t){return!!(0,le.ys)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:o,onClick:i,...l}=e;const s=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{s.current&&!s.current.contains(e.target)&&d(!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)}}),[s]),(0,u.jsxs)("div",{ref:s,className:(0,a.A)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c}),children:[(0,u.jsx)(ne,{"aria-haspopup":"true","aria-expanded":c,role:"button",href:l.to?void 0:"#",className:(0,a.A)("navbar__link",o),...l,onClick:l.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))},children:l.children??l.label}),(0,u.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(Ee,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function fe(e){let{items:t,className:n,position:o,onClick:i,...s}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,se.A)(),{pathname:t}=(0,l.zy)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:f,toggleCollapsed:p,setCollapsed:m}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[c,d,m]),(0,u.jsxs)("li",{className:(0,a.A)("menu__list-item",{"menu__list-item--collapsed":f}),children:[(0,u.jsx)(ne,{role:"button",className:(0,a.A)(ce.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",n),...s,onClick:e=>{e.preventDefault(),p()},children:s.children??s.label}),(0,u.jsx)(ie.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:f,children:t.map(((e,t)=>(0,r.createElement)(Ee,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function pe(e){let{mobile:t=!1,...n}=e;const r=t?fe:de;return(0,u.jsx)(r,{...n})}var me=n(2131);function ge(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(418);const ye={navbarSearchContainer:"navbarSearchContainer_Bca1"};function ve(e){let{children:t,className:n}=e;return(0,u.jsx)("div",{className:(0,a.A)(n,ye.navbarSearchContainer),children:t})}var we=n(4070),ke=n(6972);var xe=n(3886);function Se(e,t){return t.alternateDocVersions[e.name]??function(e){return e.docs.find((t=>t.id===e.mainDocId))}(e)}const _e={default:oe,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:a="",...o}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,se.A)(),f=(0,me.o)(),{search:p,hash:m}=(0,l.zy)(),g=[...n,...c.map((e=>{const n=`${`pathname://${f.createUrl({locale:e,fullyQualified:!1})}`}${p}${m}${a}`;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.T)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,u.jsx)(pe,{...o,mobile:t,label:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(ge,{className:he}),h]}),items:g})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,u.jsx)(ve,{className:n,children:(0,u.jsx)(be.A,{})})},dropdown:pe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:o=!1}=e;const i=o?"li":"div";return(0,u.jsx)(i,{className:(0,a.A)({navbar__item:!r&&!o,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...a}=e;const{activeDoc:o}=(0,we.zK)(r),i=(0,ke.QB)(t,r),l=o?.path===i?.path;return null===i||i.unlisted&&!l?null:(0,u.jsx)(oe,{exact:!0,...a,isActive:()=>l||!!o?.sidebar&&o.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...a}=e;const{activeDoc:o}=(0,we.zK)(r),i=(0,ke.fW)(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)(oe,{exact:!0,...a,isActive:()=>o?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...a}=e;const o=(0,ke.Vd)(r)[0],i=t??o.label,l=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(o).path;return(0,u.jsx)(oe,{...a,label:i,to:l})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:a,dropdownItemsAfter:o,...i}=e;const{search:c,hash:d}=(0,l.zy)(),f=(0,we.zK)(n),p=(0,we.jh)(n),{savePreferredVersionName:m}=(0,xe.g1)(n),g=[...a,...p.map((function(e){const t=Se(e,f);return{label:e.label,to:`${t.path}${c}${d}`,isActive:()=>e===f.activeVersion,onClick:()=>m(e.name)}})),...o],h=(0,ke.Vd)(n)[0],b=t&&g.length>1?(0,s.T)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):h.label,y=t&&g.length>1?void 0:Se(h,f).path;return g.length<=1?(0,u.jsx)(oe,{...i,mobile:t,label:b,to:y,isActive:r?()=>!1:void 0}):(0,u.jsx)(pe,{...i,mobile:t,label:b,to:y,items:g,isActive:r?()=>!1:void 0})}};function Ee(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),a=_e[r];if(!a)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,u.jsx)(a,{...n})}function Ce(){const e=(0,L.M)(),t=(0,w.p)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(Ee,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Ae(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(s.A,{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 Te(){const e=0===(0,w.p)().navbar.items.length,t=I();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(Ae,{onClick:()=>t.hide()}),t.content]})}function Le(){const e=(0,L.M)();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)(D,{header:(0,u.jsx)(Q,{}),primaryMenu:(0,u.jsx)(Ce,{}),secondaryMenu:(0,u.jsx)(Te,{})}):null}const Re={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ne(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,a.A)("navbar-sidebar__backdrop",e.className)})}function Oe(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.p)(),i=(0,L.M)(),{navbarRef:l,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,R.Mq)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i<o.current)return void n(!0);if(a.current)return void(a.current=!1);const l=r?.scrollY,s=document.documentElement.scrollHeight-o.current,c=window.innerHeight;l&&i>=l?n(!1):i+c<s&&n(!0)})),(0,c.$)((t=>{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,u.jsxs)("nav",{ref:l,"aria-label":(0,s.T)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.A)("navbar","navbar--fixed-top",n&&[Re.navbarHideable,!d&&Re.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown}),children:[t,(0,u.jsx)(Ne,{onClick:i.toggle}),(0,u.jsx)(Le,{})]})}var je=n(440);const Pe={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function Me(e){return(0,u.jsx)("button",{type:"button",...e,children:(0,u.jsx)(s.A,{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,je.rA)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,u.jsx)("p",{className:Pe.errorBoundaryError,children:n})}class De 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,...a}=e;return(0,u.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...a,children:(0,u.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function $e(){const{toggle:e,shown:t}=(0,L.M)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,s.T)({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 Be={colorModeToggle:"colorModeToggle_DEke"};function Ue(e){let{items:t}=e;return(0,u.jsx)(u.Fragment,{children:t.map(((e,t)=>(0,u.jsx)(De,{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)(Ee,{...e})},t)))})}function He(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 Ve(){const e=(0,L.M)(),t=(0,w.p)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??Fe)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),a=t.find((e=>"search"===e.type));return(0,u.jsx)(He,{left:(0,u.jsxs)(u.Fragment,{children:[!e.disabled&&(0,u.jsx)($e,{}),(0,u.jsx)(Y,{}),(0,u.jsx)(Ue,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(Ue,{items:r}),(0,u.jsx)(G,{className:Be.colorModeToggle}),!a&&(0,u.jsx)(ve,{children:(0,u.jsx)(be.A,{})})]})})}function We(){return(0,u.jsx)(Oe,{children:(0,u.jsx)(Ve,{})})}function Ge(e){let{item:t}=e;const{to:n,href:r,label:a,prependBaseUrlToHref:o,...i}=t,l=(0,X.Ay)(n),s=(0,X.Ay)(r,{forcePrependBaseUrl:!0});return(0,u.jsxs)(Z.A,{className:"footer__link-item",...r?{href:o?s:r}:{to:l},...i,children:[a,r&&!(0,J.A)(r)&&(0,u.jsx)(te.A,{})]})}function qe(e){let{item:t}=e;return t.html?(0,u.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)("li",{className:"footer__item",children:(0,u.jsx)(Ge,{item:t})},t.href??t.to)}function Ye(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)(qe,{item:e},t)))})]})}function Ke(e){let{columns:t}=e;return(0,u.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,u.jsx)(Ye,{column:e},t)))})}function Qe(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function Ze(e){let{item:t}=e;return t.html?(0,u.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)(Ge,{item:t})}function Xe(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)(Ze,{item:e}),t.length!==n+1&&(0,u.jsx)(Qe,{})]},n)))})})}function Je(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,u.jsx)(Ke,{columns:t}):(0,u.jsx)(Xe,{links:t})}var et=n(1122);const tt={footerLogoLink:"footerLogoLink_BH7S"};function nt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.hH)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,u.jsx)(et.A,{className:(0,a.A)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function rt(e){let{logo:t}=e;return t.href?(0,u.jsx)(Z.A,{href:t.href,className:tt.footerLogoLink,target:t.target,children:(0,u.jsx)(nt,{logo:t})}):(0,u.jsx)(nt,{logo:t})}function at(e){let{copyright:t}=e;return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function ot(e){let{style:t,links:n,logo:r,copyright:o}=e;return(0,u.jsx)("footer",{className:(0,a.A)("footer",{"footer--dark":"dark"===t}),children:(0,u.jsxs)("div",{className:"container container-fluid",children:[n,(r||o)&&(0,u.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,u.jsx)("div",{className:"margin-bottom--sm",children:r}),o]})]})})}function it(){const{footer:e}=(0,w.p)();if(!e)return null;const{copyright:t,links:n,logo:r,style:a}=e;return(0,u.jsx)(ot,{style:a,links:n&&n.length>0&&(0,u.jsx)(Je,{links:n}),logo:r&&(0,u.jsx)(rt,{logo:r}),copyright:t&&(0,u.jsx)(at,{copyright:t})})}const lt=r.memo(it),st=(0,N.fM)([F.a,k.o,R.Tv,xe.VQ,i.Jx,function(e){let{children:t}=e;return(0,u.jsx)(O.y_,{children:(0,u.jsx)(L.e,{children:(0,u.jsx)(P,{children:t})})})}]);function ct(e){let{children:t}=e;return(0,u.jsx)(st,{children:t})}var ut=n(1107);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.A,{as:"h1",className:"hero__title",children:(0,u.jsx)(s.A,{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)(Me,{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 ft={mainWrapper:"mainWrapper_z2l0"};function pt(e){const{children:t,noFooter:n,wrapperClassName:r,title:l,description:s}=e;return(0,b.J)(),(0,u.jsxs)(ct,{children:[(0,u.jsx)(i.be,{title:l,description:s}),(0,u.jsx)(v,{}),(0,u.jsx)(T,{}),(0,u.jsx)(We,{}),(0,u.jsx)("div",{id:d,className:(0,a.A)(h.G.wrapper.main,ft.mainWrapper,r),children:(0,u.jsx)(o.A,{fallback:e=>(0,u.jsx)(dt,{...e}),children:t})}),!n&&(0,u.jsx)(lt,{})]})}},3465:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(8774),a=n(6025),o=n(4586),i=n(6342),l=n(1122),s=n(4848);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,a.Ay)(t.src),dark:(0,a.Ay)(t.srcDark||t.src)},i=(0,s.jsx)(l.A,{className:t.className,sources:o,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){const{siteConfig:{title:t}}=(0,o.A)(),{navbar:{title:n,logo:l}}=(0,i.p)(),{imageClassName:u,titleClassName:d,...f}=e,p=(0,a.Ay)(l?.href||"/"),m=n?"":t,g=l?.alt??m;return(0,s.jsxs)(r.A,{to:p,...f,...l?.target&&{target:l.target},children:[l&&(0,s.jsx)(c,{logo:l,alt:g,imageClassName:u}),null!=n&&(0,s.jsx)("b",{className:d,children:n})]})}},1463:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});n(6540);var r=n(5260),a=n(4848);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return(0,a.jsxs)(r.A,{children:[t&&(0,a.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,a.jsx)("meta",{name:"docusaurus_version",content:n}),o&&(0,a.jsx)("meta",{name:"docusaurus_tag",content:o}),i&&(0,a.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,a.jsx)("meta",{name:"docsearch:version",content:n}),o&&(0,a.jsx)("meta",{name:"docsearch:docusaurus_tag",content:o})]})}},1122:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});var r=n(6540),a=n(4164),o=n(2303),i=n(5293);const l={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var s=n(4848);function c(e){let{className:t,children:n}=e;const c=(0,o.A)(),{colorMode:u}=(0,i.G)();return(0,s.jsx)(s.Fragment,{children:(c?"dark"===u?["dark"]:["light"]:["light","dark"]).map((e=>{const o=n({theme:e,className:(0,a.A)(t,l.themedComponent,l[`themedComponent--${e}`])});return(0,s.jsx)(r.Fragment,{children:o},e)}))})}function u(e){const{sources:t,className:n,alt:r,...a}=e;return(0,s.jsx)(c,{className:n,children:e=>{let{theme:n,className:o}=e;return(0,s.jsx)("img",{src:t[n],alt:r,className:o,...a})}})}},1422:(e,t,n)=>{"use strict";n.d(t,{N:()=>b,u:()=>c});var r=n(6540),a=n(8193),o=n(205),i=n(3109),l=n(4848);const s="ease-in-out";function c(e){let{initialState:t}=e;const[n,a]=(0,r.useState)(t??!1),o=(0,r.useCallback)((()=>{a((e=>!e))}),[]);return{collapsed:n,setCollapsed:a,toggleCollapsed:o}}const u={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function f(e,t){const n=t?u:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function p(e){let{collapsibleRef:t,collapsed:n,animation:a}=e;const o=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=a?.duration??function(e){if((0,i.O)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${a?.easing??s}`,height:`${t}px`}}function l(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return f(e,n),void(o.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,a])}function m(e){if(!a.A.canUseDOM)return e?u:d}function g(e){let{as:t="div",collapsed:n,children:a,animation:o,onCollapseTransitionEnd:i,className:s,disableSSRStyle:c}=e;const u=(0,r.useRef)(null);return p({collapsibleRef:u,collapsed:n,animation:o}),(0,l.jsx)(t,{ref:u,style:c?void 0:m(n),onTransitionEnd:e=>{"height"===e.propertyName&&(f(u.current,n),i?.(n))},className:s,children:a})}function h(e){let{collapsed:t,...n}=e;const[a,i]=(0,r.useState)(!t),[s,c]=(0,r.useState)(t);return(0,o.A)((()=>{t||i(!0)}),[t]),(0,o.A)((()=>{a&&c(t)}),[a,t]),a?(0,l.jsx)(g,{...n,collapsed:s}):null}function b(e){let{lazy:t,...n}=e;const r=t?h:g;return(0,l.jsx)(r,{...n})}},5041:(e,t,n)=>{"use strict";n.d(t,{M:()=>g,o:()=>m});var r=n(6540),a=n(2303),o=n(679),i=n(9532),l=n(6342),s=n(4848);const c=(0,o.Wf)("docusaurus.announcement.dismiss"),u=(0,o.Wf)("docusaurus.announcement.id"),d=()=>"true"===c.get(),f=e=>c.set(String(e)),p=r.createContext(null);function m(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.p)(),t=(0,a.A)(),[n,o]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{o(d())}),[]);const i=(0,r.useCallback)((()=>{f(!0),o(!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&&f(!1),!r&&d()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,s.jsx)(p.Provider,{value:n,children:t})}function g(){const e=(0,r.useContext)(p);if(!e)throw new i.dV("AnnouncementBarProvider");return e}},5293:(e,t,n)=>{"use strict";n.d(t,{G:()=>b,a:()=>h});var r=n(6540),a=n(8193),o=n(9532),i=n(679),l=n(6342),s=n(4848);const c=r.createContext(void 0),u="theme",d=(0,i.Wf)(u),f={light:"light",dark:"dark"},p=e=>e===f.dark?f.dark:f.light,m=e=>a.A.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e),g=e=>{d.set(p(e))};function h(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.p)(),[a,o]=(0,r.useState)(m(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(o(t),a&&g(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?f.dark:f.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",p(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=d.get();null!==t&&i(p(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:a,setColorMode:i,get isDarkTheme(){return a===f.dark},setLightTheme(){i(f.light)},setDarkTheme(){i(f.dark)}})),[a,i])}();return(0,s.jsx)(c.Provider,{value:n,children:t})}function b(){const e=(0,r.useContext)(c);if(null==e)throw new o.dV("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},9876:(e,t,n)=>{"use strict";n.d(t,{e:()=>p,M:()=>m});var r=n(6540),a=n(5600),o=n(4581),i=n(6347),l=n(9532);function s(e){!function(e){const t=(0,i.W6)(),n=(0,l._q)(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(6342),u=n(4848);const d=r.createContext(void 0);function f(){const e=function(){const e=(0,a.YL)(),{items:t}=(0,c.p)().navbar;return 0===t.length&&!e.component}(),t=(0,o.l)(),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 p(e){let{children:t}=e;const n=f();return(0,u.jsx)(d.Provider,{value:n,children:t})}function m(){const e=r.useContext(d);if(void 0===e)throw new l.dV("NavbarMobileSidebarProvider");return e}},5600:(e,t,n)=>{"use strict";n.d(t,{GX:()=>c,YL:()=>s,y_:()=>l});var r=n(6540),a=n(9532),o=n(4848);const i=r.createContext(null);function l(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,o.jsx)(i.Provider,{value:n,children:t})}function s(){const e=(0,r.useContext)(i);if(!e)throw new a.dV("NavbarSecondaryMenuContentProvider");return e[0]}function c(e){let{component:t,props:n}=e;const o=(0,r.useContext)(i);if(!o)throw new a.dV("NavbarSecondaryMenuContentProvider");const[,l]=o,s=(0,a.Be)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},4090:(e,t,n)=>{"use strict";n.d(t,{w:()=>a,J:()=>o});var r=n(6540);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},4581:(e,t,n)=>{"use strict";n.d(t,{l:()=>l});var r=n(6540),a=n(8193);const o={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(!a.A.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?o.desktop:o.mobile}(t))}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[t]),n}},7559:(e,t,n)=>{"use strict";n.d(t,{G:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",blogAuthorsListPage:"blog-authors-list-page",blogAuthorsPostsPage:"blog-authors-posts-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",draftBanner:"theme-draft-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:{blogFooterTagsRow:"theme-blog-footer-tags-row",blogFooterEditMetaRow:"theme-blog-footer-edit-meta-row"},pages:{pageFooterEditMetaRow:"theme-pages-footer-edit-meta-row"}}},3109:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{O:()=>r})},1682:(e,t,n)=>{"use strict";function r(e){return Array.from(new Set(e))}function a(e,t){const n={};let r=0;for(const a of e){const e=t(a,r);n[e]??=[],n[e].push(a),r+=1}return n}n.d(t,{$z:()=>a,sb:()=>r})},1213:(e,t,n)=>{"use strict";n.d(t,{e3:()=>f,be:()=>u,Jx:()=>p});var r=n(6540),a=n(4164),o=n(5260),i=n(6803),l=n(6025),s=n(4586);var c=n(4848);function u(e){let{title:t,description:n,keywords:r,image:a,children:i}=e;const u=function(e){const{siteConfig:t}=(0,s.A)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,l.hH)(),f=a?d(a,{absolute:!0}):void 0;return(0,c.jsxs)(o.A,{children:[t&&(0,c.jsx)("title",{children:u}),t&&(0,c.jsx)("meta",{property:"og:title",content:u}),n&&(0,c.jsx)("meta",{name:"description",content:n}),n&&(0,c.jsx)("meta",{property:"og:description",content:n}),r&&(0,c.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),f&&(0,c.jsx)("meta",{property:"og:image",content:f}),f&&(0,c.jsx)("meta",{name:"twitter:image",content:f}),i]})}const d=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(d),l=(0,a.A)(i,t);return(0,c.jsxs)(d.Provider,{value:l,children:[(0,c.jsx)(o.A,{children:(0,c.jsx)("html",{className:l})}),n]})}function p(e){let{children:t}=e;const n=(0,i.A)(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const o=`plugin-id-${n.plugin.id}`;return(0,c.jsx)(f,{className:(0,a.A)(r,o),children:t})}},9532:(e,t,n)=>{"use strict";n.d(t,{Be:()=>c,ZC:()=>l,_q:()=>i,dV:()=>s,fM:()=>u});var r=n(6540),a=n(205),o=n(4848);function i(e){const t=(0,r.useRef)(e);return(0,a.A)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function l(e){const t=(0,r.useRef)();return(0,a.A)((()=>{t.current=e})),t.current}class s extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?<name>\w+)/)?.groups.name??""} is called outside the <${e}>. ${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,o.jsx)(o.Fragment,{children:e.reduceRight(((e,t)=>(0,o.jsx)(t,{children:e})),n)})}}},9169:(e,t,n)=>{"use strict";n.d(t,{Dt:()=>l,ys:()=>i});var r=n(6540),a=n(8328),o=n(4586);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function l(){const{baseUrl:e}=(0,o.A)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.A,baseUrl:e})),[e])}},3104:(e,t,n)=>{"use strict";n.d(t,{Mq:()=>f,Tv:()=>c,gk:()=>p});var r=n(6540),a=n(8193),o=n(2303),i=(n(205),n(9532)),l=n(4848);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.dV("ScrollControllerProvider");return e}const d=()=>a.A.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function f(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),a=(0,r.useRef)(d()),o=(0,i._q)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=d();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function p(){const e=(0,r.useRef)(null),t=(0,o.A)()&&"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 a=document.documentElement.scrollTop;(n&&a>e||!n&&a<e)&&(t=requestAnimationFrame(r),window.scrollTo(0,Math.floor(.85*(a-e))+e))}(),()=>t&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},679:(e,t,n)=>{"use strict";n.d(t,{Wf:()=>c});n(6540);const r=JSON.parse('{"N":"localStorage","M":""}'),a=r.N;function o(e){let{key:t,oldValue:n,newValue:r,storage:a}=e;if(n===r)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}function i(e){if(void 0===e&&(e=a),"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,l||(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),l=!0),null}var t}let l=!1;const s={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function c(e,t){const n=`${e}${r.M}`;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}}(n);const a=i(t?.persistence);return null===a?s:{get:()=>{try{return a.getItem(n)}catch(e){return console.error(`Docusaurus storage error, can't get key=${n}`,e),null}},set:e=>{try{const t=a.getItem(n);a.setItem(n,e),o({key:n,oldValue:t,newValue:e,storage:a})}catch(t){console.error(`Docusaurus storage error, can't set ${n}=${e}`,t)}},del:()=>{try{const e=a.getItem(n);a.removeItem(n),o({key:n,oldValue:e,newValue:null,storage:a})}catch(e){console.error(`Docusaurus storage error, can't delete key=${n}`,e)}},listen:e=>{try{const t=t=>{t.storageArea===a&&t.key===n&&e(t)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)}catch(t){return console.error(`Docusaurus storage error, can't listen for changes of key=${n}`,t),()=>{}}}}}},2131:(e,t,n)=>{"use strict";n.d(t,{o:()=>i});var r=n(4586),a=n(6347),o=n(440);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:l}}=(0,r.A)(),{pathname:s}=(0,a.zy)(),c=(0,o.Ks)(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}`}}}},5062:(e,t,n)=>{"use strict";n.d(t,{$:()=>i});var r=n(6540),a=n(6347),o=n(9532);function i(e){const t=(0,a.zy)(),n=(0,o.ZC)(t),i=(0,o._q)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6342:(e,t,n)=>{"use strict";n.d(t,{p:()=>a});var r=n(4586);function a(){return(0,r.A)().siteConfig.themeConfig}},2983:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addTrailingSlash=a,t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[i]=e.split(/[#?]/),l="/"===i||i===r?i:(s=i,c=n,c?a(s):o(s));var s,c;return e.replace(i,l)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=o;const r=n(2566);function a(e){return e.endsWith("/")?e:`${e}/`}function o(e){return(0,r.removeSuffix)(e,"/")}},253:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=function e(t){if(t.cause)return[t,...e(t.cause)];return[t]}},440:(e,t,n)=>{"use strict";t.rA=t.Ks=t.LU=void 0;const r=n(1635);t.LU="__blog-post-container";var a=n(2983);Object.defineProperty(t,"Ks",{enumerable:!0,get:function(){return r.__importDefault(a).default}});var o=n(2566);var i=n(253);Object.defineProperty(t,"rA",{enumerable:!0,get:function(){return i.getErrorCausalChain}})},2566:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addPrefix=function(e,t){return e.startsWith(t)?e:`${t}${e}`},t.removeSuffix=function(e,t){if(""===t)return e;return e.endsWith(t)?e.slice(0,-t.length):e},t.addSuffix=function(e,t){return e.endsWith(t)?e:`${e}${t}`},t.removePrefix=function(e,t){return e.startsWith(t)?e.slice(t.length):e}},1513:(e,t,n)=>{"use strict";n.d(t,{zR:()=>w,TM:()=>C,yJ:()=>p,sC:()=>T,AO:()=>f});var r=n(8168);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r<a;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&&a(e),s=t&&a(t),c=l||s;if(e&&a(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,f=i.length;f>=0;f--){var p=i[f];"."===p?o(i,f):".."===p?(o(i,f),d++):d&&(o(i,f),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&a(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var l=n(1561);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 f(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function p(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.A)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!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 g=!("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={}),g||(0,l.A)(!1);var t,n=window.history,a=(-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,o=!(-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,_=void 0===S?6:S,E=e.basename?d(s(e.basename)):"";function C(e){var t=e||{},n=t.key,r=t.state,a=window.location,o=a.pathname+a.search+a.hash;return E&&(o=u(o,E)),p(o,r,n)}function A(){return Math.random().toString(36).substr(2,_)}var T=m();function L(e){(0,r.A)(B,e),B.length=n.length,T.notifyListeners(B.location,B.action)}function R(e){(function(e){return void 0===e.state&&-1===navigator.userAgent.indexOf("CriOS")})(e)||j(C(e.state))}function N(){j(C(v()))}var O=!1;function j(e){if(O)O=!1,L();else{T.confirmTransitionTo(e,"POP",x,(function(t){t?L({action:"POP",location:e}):function(e){var t=B.location,n=M.indexOf(t.key);-1===n&&(n=0);var r=M.indexOf(e.key);-1===r&&(r=0);var a=n-r;a&&(O=!0,D(a))}(e)}))}}var P=C(v()),M=[P.key];function I(e){return E+f(e)}function D(e){n.go(e)}var F=0;function z(e){1===(F+=e)&&1===e?(window.addEventListener(b,R),o&&window.addEventListener(y,N)):0===F&&(window.removeEventListener(b,R),o&&window.removeEventListener(y,N))}var $=!1;var B={length:n.length,action:"POP",location:P,createHref:I,push:function(e,t){var r="PUSH",o=p(e,t,A(),B.location);T.confirmTransitionTo(o,r,x,(function(e){if(e){var t=I(o),i=o.key,l=o.state;if(a)if(n.pushState({key:i,state:l},null,t),w)window.location.href=t;else{var s=M.indexOf(B.location.key),c=M.slice(0,s+1);c.push(o.key),M=c,L({action:r,location:o})}else window.location.href=t}}))},replace:function(e,t){var r="REPLACE",o=p(e,t,A(),B.location);T.confirmTransitionTo(o,r,x,(function(e){if(e){var t=I(o),i=o.key,l=o.state;if(a)if(n.replaceState({key:i,state:l},null,t),w)window.location.replace(t);else{var s=M.indexOf(B.location.key);-1!==s&&(M[s]=o.key),L({action:r,location:o})}else window.location.replace(t)}}))},go:D,goBack:function(){D(-1)},goForward:function(){D(1)},block:function(e){void 0===e&&(e=!1);var t=T.setPrompt(e);return $||(z(1),$=!0),function(){return $&&($=!1,z(-1)),t()}},listen:function(e){var t=T.appendListener(e);return z(1),function(){z(-1),t()}}};return B}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 _(){var e=window.location.href,t=e.indexOf("#");return-1===t?"":e.substring(t+1)}function E(e){window.location.replace(S(window.location.href)+"#"+e)}function C(e){void 0===e&&(e={}),g||(0,l.A)(!1);var t=window.history,n=(window.navigator.userAgent.indexOf("Firefox"),e),a=n.getUserConfirmation,o=void 0===a?h:a,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(_());return b&&(e=u(e,b)),p(e)}var A=m();function T(e){(0,r.A)($,e),$.length=t.length,A.notifyListeners($.location,$.action)}var L=!1,R=null;function N(){var e,t,n=_(),r=v(n);if(n!==r)E(r);else{var a=C(),i=$.location;if(!L&&(t=a,(e=i).pathname===t.pathname&&e.search===t.search&&e.hash===t.hash))return;if(R===f(a))return;R=null,function(e){if(L)L=!1,T();else{var t="POP";A.confirmTransitionTo(e,t,o,(function(n){n?T({action:t,location:e}):function(e){var t=$.location,n=M.lastIndexOf(f(t));-1===n&&(n=0);var r=M.lastIndexOf(f(e));-1===r&&(r=0);var a=n-r;a&&(L=!0,I(a))}(e)}))}}(a)}}var O=_(),j=v(O);O!==j&&E(j);var P=C(),M=[f(P)];function I(e){t.go(e)}var D=0;function F(e){1===(D+=e)&&1===e?window.addEventListener(k,N):0===D&&window.removeEventListener(k,N)}var z=!1;var $={length:t.length,action:"POP",location:P,createHref:function(e){var t=document.querySelector("base"),n="";return t&&t.getAttribute("href")&&(n=S(window.location.href)),n+"#"+v(b+f(e))},push:function(e,t){var n="PUSH",r=p(e,void 0,void 0,$.location);A.confirmTransitionTo(r,n,o,(function(e){if(e){var t=f(r),a=v(b+t);if(_()!==a){R=t,function(e){window.location.hash=e}(a);var o=M.lastIndexOf(f($.location)),i=M.slice(0,o+1);i.push(t),M=i,T({action:n,location:r})}else T()}}))},replace:function(e,t){var n="REPLACE",r=p(e,void 0,void 0,$.location);A.confirmTransitionTo(r,n,o,(function(e){if(e){var t=f(r),a=v(b+t);_()!==a&&(R=t,E(a));var o=M.indexOf(f($.location));-1!==o&&(M[o]=t),T({action:n,location:r})}}))},go:I,goBack:function(){I(-1)},goForward:function(){I(1)},block:function(e){void 0===e&&(e=!1);var t=A.setPrompt(e);return z||(F(1),z=!0),function(){return z&&(z=!1,F(-1)),t()}},listen:function(e){var t=A.appendListener(e);return F(1),function(){F(-1),t()}}};return $}function A(e,t,n){return Math.min(Math.max(e,t),n)}function T(e){void 0===e&&(e={});var t=e,n=t.getUserConfirmation,a=t.initialEntries,o=void 0===a?["/"]:a,i=t.initialIndex,l=void 0===i?0:i,s=t.keyLength,c=void 0===s?6:s,u=m();function d(e){(0,r.A)(w,e),w.length=w.entries.length,u.notifyListeners(w.location,w.action)}function g(){return Math.random().toString(36).substr(2,c)}var h=A(l,0,o.length-1),b=o.map((function(e){return p(e,void 0,"string"==typeof e?g():e.key||g())})),y=f;function v(e){var t=A(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",a=p(e,t,g(),w.location);u.confirmTransitionTo(a,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,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=p(e,t,g(),w.location);u.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},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}},4146:(e,t,n)=>{"use strict";var r=n(4363),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={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]||a}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,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var a=p(n);a&&a!==m&&e(t,a,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var l=s(t),g=s(n),h=0;h<i.length;++h){var b=i[h];if(!(o[b]||r&&r[b]||g&&g[b]||l&&l[b])){var y=f(n,b);try{c(t,b,y)}catch(v){}}}}return t}},311:e=>{"use strict";e.exports=function(e,t,n,r,a,o,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,a,o,i,l],u=0;(s=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},4634:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},119:(e,t,n)=>{"use strict";n.r(t)},1043:(e,t,n)=>{"use strict";n.r(t)},5947:function(e,t,n){var r,a;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 a(e,t,n){return e<t?t:e>n?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}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=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),c=o.querySelector(r.barSelector),u=r.speed,d=r.easing;return o.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(c,i(e,u,d)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(o,{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)*a(Math.random()*t,.1,.95)),t=a(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 a,i=t.querySelector(r.barSelector),l=e?"-100":o(n.status||0),c=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&p(a),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&&p(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,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function c(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=f(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},7022:()=>{!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i<a.length;i++)o[a[i]]=e.languages.bash[a[i]];e.languages.sh=e.languages.bash,e.languages.shell=e.languages.bash}(Prism)},2514:()=>{Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},Prism.languages.webmanifest=Prism.languages.json},9700:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,l=i.length;-1!==n.code.indexOf(a=t(r,l));)++l;return i[l]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(l){for(var s=0;s<l.length&&!(a>=o.length);s++){var c=l[s];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=o[a],d=n.tokenStack[u],f="string"==typeof c?c:c.content,p=t(r,u),m=f.indexOf(p);if(m>-1){++a;var g=f.substring(0,m),h=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=f.substring(m+p.length),y=[];g&&y.push.apply(y,i([g])),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)},3554:()=>{!function(e){var t=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,n=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],r=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,a=/<?=>|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,o=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:t,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:r,operator:a,punctuation:o};var i={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},l=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:i}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:i}}];e.languages.insertBefore("php","variable",{string:l,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:t,string:l,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,number:r,operator:a,punctuation:o}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",(function(t){if(/<\?/.test(t.code)){e.languages["markup-templating"].buildPlaceholders(t,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)}})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"php")}))}(Prism)},2022:(e,t,n)=>{var r={"./prism-bash":7022,"./prism-json":2514,"./prism-php":3554};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=2022},2694:(e,t,n)=>{"use strict";var r=n(6925);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,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:o,resetWarningCache:a};return n.PropTypes=n,n}},5556:(e,t,n)=>{e.exports=n(2694)()},6925:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},2551:(e,t,n)=>{"use strict";var r=n(6540),a=n(9982);function o(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,f=/^[: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]*$/,p={},m={};function g(e,t,n,r,a,o,i){this.acceptsBooleans=2===t||3===t||4===t,this.attributeName=r,this.attributeNamespace=a,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=i}var h={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach((function(e){h[e]=new g(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 g(t,1,!1,e[1],null,!1,!1)})),["contentEditable","draggable","spellCheck","value"].forEach((function(e){h[e]=new g(e,2,!1,e.toLowerCase(),null,!1,!1)})),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach((function(e){h[e]=new g(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 g(e,3,!1,e.toLowerCase(),null,!1,!1)})),["checked","multiple","muted","selected"].forEach((function(e){h[e]=new g(e,3,!0,e,null,!1,!1)})),["capture","download"].forEach((function(e){h[e]=new g(e,4,!1,e,null,!1,!1)})),["cols","rows","size","span"].forEach((function(e){h[e]=new g(e,6,!1,e,null,!1,!1)})),["rowSpan","start"].forEach((function(e){h[e]=new g(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 a=h.hasOwnProperty(t)?h[t]:null;(null!==a?0!==a.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,a,r)&&(n=null),r||null===a?function(e){return!!d.call(m,e)||!d.call(p,e)&&(f.test(e)?m[e]=!0:(p[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n)):a.mustUseProperty?e[a.propertyName]=null===n?3!==a.type&&"":n:(t=a.attributeName,r=a.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(a=a.type)||4===a&&!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 g(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 g(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 g(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){h[e]=new g(e,1,!1,e.toLowerCase(),null,!1,!1)})),h.xlinkHref=new g("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){h[e]=new g(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"),_=Symbol.for("react.strict_mode"),E=Symbol.for("react.profiler"),C=Symbol.for("react.provider"),A=Symbol.for("react.context"),T=Symbol.for("react.forward_ref"),L=Symbol.for("react.suspense"),R=Symbol.for("react.suspense_list"),N=Symbol.for("react.memo"),O=Symbol.for("react.lazy");Symbol.for("react.scope"),Symbol.for("react.debug_trace_mode");var j=Symbol.for("react.offscreen");Symbol.for("react.legacy_hidden"),Symbol.for("react.cache"),Symbol.for("react.tracing_marker");var P=Symbol.iterator;function M(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=P&&e[P]||e["@@iterator"])?e:null}var I,D=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 $(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 a=c.stack.split("\n"),o=r.stack.split("\n"),i=a.length-1,l=o.length-1;1<=i&&0<=l&&a[i]!==o[l];)l--;for(;1<=i&&0<=l;i--,l--)if(a[i]!==o[l]){if(1!==i||1!==l)do{if(i--,0>--l||a[i]!==o[l]){var s="\n"+a[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 B(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=$(e.type,!1);case 11:return e=$(e.type.render,!1);case 1:return e=$(e.type,!0);default:return""}}function U(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 E:return"Profiler";case _:return"StrictMode";case L:return"Suspense";case R:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case A:return(e.displayName||"Context")+".Consumer";case C:return(e._context.displayName||"Context")+".Provider";case T:var t=e.render;return(e=e.displayName)||(e=""!==(e=t.displayName||t.name||"")?"ForwardRef("+e+")":"ForwardRef"),e;case N:return null!==(t=e.displayName||null)?t:U(e.type)||"Memo";case O:t=e._payload,e=e._init;try{return U(e(t))}catch(n){}}return null}function H(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 U(t);case 8:return t===_?"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 V(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":case"object":return e;default:return""}}function W(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function G(e){e._valueTracker||(e._valueTracker=function(e){var t=W(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 a=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return a.call(this)},set:function(e){r=""+e,o.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 q(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=W(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function Y(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 K(e,t){var n=t.checked;return D({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function Q(e,t){var n=null==t.defaultValue?"":t.defaultValue,r=null!=t.checked?t.checked:t.defaultChecked;n=V(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 Z(e,t){null!=(t=t.checked)&&v(e,"checked",t,!1)}function X(e,t){Z(e,t);var n=V(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,V(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&&Y(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 a=0;a<n.length;a++)t["$"+n[a]]=!0;for(n=0;n<e.length;n++)a=t.hasOwnProperty("$"+e[n].value),e[n].selected!==a&&(e[n].selected=a),a&&r&&(e[n].defaultSelected=!0)}else{for(n=""+V(n),t=null,a=0;a<e.length;a++){if(e[a].value===n)return e[a].selected=!0,void(r&&(e[a].defaultSelected=!0));null!==t||e[a].disabled||(t=e[a])}null!==t&&(t.selected=!0)}}function re(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(o(91));return D({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function ae(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultValue,null!=n){if(null!=t)throw Error(o(92));if(te(n)){if(1<n.length)throw Error(o(93));n=n[0]}t=n}null==t&&(t=""),n=t}e._wrapperState={initialValue:V(n)}}function oe(e,t){var n=V(t.value),r=V(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 fe(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 pe={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},me=["Webkit","ms","Moz","O"];function ge(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"number"!=typeof t||0===t||pe.hasOwnProperty(e)&&pe[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("--"),a=ge(n,t[n],r);"float"===n&&(n="cssFloat"),r?e.setProperty(n,a):e[n]=a}}Object.keys(pe).forEach((function(e){me.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),pe[t]=pe[e]}))}));var be=D({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(o(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(o(60));if("object"!=typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(o(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(o(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,_e=null;function Ee(e){if(e=va(e)){if("function"!=typeof xe)throw Error(o(280));var t=e.stateNode;t&&(t=ka(t),xe(e.stateNode,e.type,t))}}function Ce(e){Se?_e?_e.push(e):_e=[e]:Se=e}function Ae(){if(Se){var e=Se,t=_e;if(_e=Se=null,Ee(e),t)for(e=0;e<t.length;e++)Ee(t[e])}}function Te(e,t){return e(t)}function Le(){}var Re=!1;function Ne(e,t,n){if(Re)return e(t,n);Re=!0;try{return Te(e,t,n)}finally{Re=!1,(null!==Se||null!==_e)&&(Le(),Ae())}}function Oe(e,t){var n=e.stateNode;if(null===n)return null;var r=ka(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(o(231,t,typeof n));return n}var je=!1;if(u)try{var Pe={};Object.defineProperty(Pe,"passive",{get:function(){je=!0}}),window.addEventListener("test",Pe,Pe),window.removeEventListener("test",Pe,Pe)}catch(ue){je=!1}function Me(e,t,n,r,a,o,i,l,s){var c=Array.prototype.slice.call(arguments,3);try{t.apply(n,c)}catch(u){this.onError(u)}}var Ie=!1,De=null,Fe=!1,ze=null,$e={onError:function(e){Ie=!0,De=e}};function Be(e,t,n,r,a,o,i,l,s){Ie=!1,De=null,Me.apply($e,arguments)}function Ue(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 He(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 Ve(e){if(Ue(e)!==e)throw Error(o(188))}function We(e){return null!==(e=function(e){var t=e.alternate;if(!t){if(null===(t=Ue(e)))throw Error(o(188));return t!==e?null:e}for(var n=e,r=t;;){var a=n.return;if(null===a)break;var i=a.alternate;if(null===i){if(null!==(r=a.return)){n=r;continue}break}if(a.child===i.child){for(i=a.child;i;){if(i===n)return Ve(a),e;if(i===r)return Ve(a),t;i=i.sibling}throw Error(o(188))}if(n.return!==r.return)n=a,r=i;else{for(var l=!1,s=a.child;s;){if(s===n){l=!0,n=a,r=i;break}if(s===r){l=!0,r=a,n=i;break}s=s.sibling}if(!l){for(s=i.child;s;){if(s===n){l=!0,n=i,r=a;break}if(s===r){l=!0,r=i,n=a;break}s=s.sibling}if(!l)throw Error(o(189))}}if(n.alternate!==r)throw Error(o(190))}if(3!==n.tag)throw Error(o(188));return n.stateNode.current===n?e:t}(e))?Ge(e):null}function Ge(e){if(5===e.tag||6===e.tag)return e;for(e=e.child;null!==e;){var t=Ge(e);if(null!==t)return t;e=e.sibling}return null}var qe=a.unstable_scheduleCallback,Ye=a.unstable_cancelCallback,Ke=a.unstable_shouldYield,Qe=a.unstable_requestPaint,Ze=a.unstable_now,Xe=a.unstable_getCurrentPriorityLevel,Je=a.unstable_ImmediatePriority,et=a.unstable_UserBlockingPriority,tt=a.unstable_NormalPriority,nt=a.unstable_LowPriority,rt=a.unstable_IdlePriority,at=null,ot=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 ft(e,t){var n=e.pendingLanes;if(0===n)return 0;var r=0,a=e.suspendedLanes,o=e.pingedLanes,i=268435455&n;if(0!==i){var l=i&~a;0!==l?r=dt(l):0!==(o&=i)&&(r=dt(o))}else 0!==(i=n&~a)?r=dt(i):0!==o&&(r=dt(o));if(0===r)return 0;if(0!==t&&t!==r&&0==(t&a)&&((a=r&-r)>=(o=t&-t)||16===a&&0!=(4194240&o)))return t;if(0!=(4&r)&&(r|=16&n),0!==(t=e.entangledLanes))for(e=e.entanglements,t&=r;0<t;)a=1<<(n=31-it(t)),r|=e[n],t&=~a;return r}function pt(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 mt(e){return 0!==(e=-1073741825&e.pendingLanes)?e:1073741824&e?1073741824:0}function gt(){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),a=1<<r;a&t|e[r]&t&&(e[r]|=t),n&=~a}}var vt=0;function wt(e){return 1<(e&=-e)?4<e?0!=(268435455&e)?16:536870912:4:1}var kt,xt,St,_t,Et,Ct=!1,At=[],Tt=null,Lt=null,Rt=null,Nt=new Map,Ot=new Map,jt=[],Pt="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 Mt(e,t){switch(e){case"focusin":case"focusout":Tt=null;break;case"dragenter":case"dragleave":Lt=null;break;case"mouseover":case"mouseout":Rt=null;break;case"pointerover":case"pointerout":Nt.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":Ot.delete(t.pointerId)}}function It(e,t,n,r,a,o){return null===e||e.nativeEvent!==o?(e={blockedOn:t,domEventName:n,eventSystemFlags:r,nativeEvent:o,targetContainers:[a]},null!==t&&(null!==(t=va(t))&&xt(t)),e):(e.eventSystemFlags|=r,t=e.targetContainers,null!==a&&-1===t.indexOf(a)&&t.push(a),e)}function Dt(e){var t=ya(e.target);if(null!==t){var n=Ue(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=He(n)))return e.blockedOn=t,void Et(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=Kt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n)return null!==(t=va(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 $t(){Ct=!1,null!==Tt&&Ft(Tt)&&(Tt=null),null!==Lt&&Ft(Lt)&&(Lt=null),null!==Rt&&Ft(Rt)&&(Rt=null),Nt.forEach(zt),Ot.forEach(zt)}function Bt(e,t){e.blockedOn===t&&(e.blockedOn=null,Ct||(Ct=!0,a.unstable_scheduleCallback(a.unstable_NormalPriority,$t)))}function Ut(e){function t(t){return Bt(t,e)}if(0<At.length){Bt(At[0],e);for(var n=1;n<At.length;n++){var r=At[n];r.blockedOn===e&&(r.blockedOn=null)}}for(null!==Tt&&Bt(Tt,e),null!==Lt&&Bt(Lt,e),null!==Rt&&Bt(Rt,e),Nt.forEach(t),Ot.forEach(t),n=0;n<jt.length;n++)(r=jt[n]).blockedOn===e&&(r.blockedOn=null);for(;0<jt.length&&null===(n=jt[0]).blockedOn;)Dt(n),null===n.blockedOn&&jt.shift()}var Ht=w.ReactCurrentBatchConfig,Vt=!0;function Wt(e,t,n,r){var a=vt,o=Ht.transition;Ht.transition=null;try{vt=1,qt(e,t,n,r)}finally{vt=a,Ht.transition=o}}function Gt(e,t,n,r){var a=vt,o=Ht.transition;Ht.transition=null;try{vt=4,qt(e,t,n,r)}finally{vt=a,Ht.transition=o}}function qt(e,t,n,r){if(Vt){var a=Kt(e,t,n,r);if(null===a)Vr(e,t,r,Yt,n),Mt(e,r);else if(function(e,t,n,r,a){switch(t){case"focusin":return Tt=It(Tt,e,t,n,r,a),!0;case"dragenter":return Lt=It(Lt,e,t,n,r,a),!0;case"mouseover":return Rt=It(Rt,e,t,n,r,a),!0;case"pointerover":var o=a.pointerId;return Nt.set(o,It(Nt.get(o)||null,e,t,n,r,a)),!0;case"gotpointercapture":return o=a.pointerId,Ot.set(o,It(Ot.get(o)||null,e,t,n,r,a)),!0}return!1}(a,e,t,n,r))r.stopPropagation();else if(Mt(e,r),4&t&&-1<Pt.indexOf(e)){for(;null!==a;){var o=va(a);if(null!==o&&kt(o),null===(o=Kt(e,t,n,r))&&Vr(e,t,r,Yt,n),o===a)break;a=o}null!==a&&r.stopPropagation()}else Vr(e,t,r,null,n)}}var Yt=null;function Kt(e,t,n,r){if(Yt=null,null!==(e=ya(e=ke(r))))if(null===(t=Ue(e)))e=null;else if(13===(n=t.tag)){if(null!==(e=He(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 Yt=e,null}function Qt(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(Xe()){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 Zt=null,Xt=null,Jt=null;function en(){if(Jt)return Jt;var e,t,n=Xt,r=n.length,a="value"in Zt?Zt.value:Zt.textContent,o=a.length;for(e=0;e<r&&n[e]===a[e];e++);var i=r-e;for(t=1;t<=i&&n[r-t]===a[o-t];t++);return Jt=a.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 an(e){function t(t,n,r,a,o){for(var i in this._reactName=t,this._targetInst=r,this.type=n,this.nativeEvent=a,this.target=o,this.currentTarget=null,e)e.hasOwnProperty(i)&&(t=e[i],this[i]=t?t(a):a[i]);return this.isDefaultPrevented=(null!=a.defaultPrevented?a.defaultPrevented:!1===a.returnValue)?nn:rn,this.isPropagationStopped=rn,this}return D(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 on,ln,sn,cn={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},un=an(cn),dn=D({},cn,{view:0,detail:0}),fn=an(dn),pn=D({},dn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:En,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?(on=e.screenX-sn.screenX,ln=e.screenY-sn.screenY):ln=on=0,sn=e),on)},movementY:function(e){return"movementY"in e?e.movementY:ln}}),mn=an(pn),gn=an(D({},pn,{dataTransfer:0})),hn=an(D({},dn,{relatedTarget:0})),bn=an(D({},cn,{animationName:0,elapsedTime:0,pseudoElement:0})),yn=D({},cn,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),vn=an(yn),wn=an(D({},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 _n(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=Sn[e])&&!!t[e]}function En(){return _n}var Cn=D({},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:En,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}}),An=an(Cn),Tn=an(D({},pn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),Ln=an(D({},dn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:En})),Rn=an(D({},cn,{propertyName:0,elapsedTime:0,pseudoElement:0})),Nn=D({},pn,{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}),On=an(Nn),jn=[9,13,27,32],Pn=u&&"CompositionEvent"in window,Mn=null;u&&"documentMode"in document&&(Mn=document.documentMode);var In=u&&"TextEvent"in window&&!Mn,Dn=u&&(!Pn||Mn&&8<Mn&&11>=Mn),Fn=String.fromCharCode(32),zn=!1;function $n(e,t){switch(e){case"keyup":return-1!==jn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Bn(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var Un=!1;var Hn={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 Vn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!Hn[e.type]:"textarea"===t}function Wn(e,t,n,r){Ce(r),0<(t=Gr(t,"onChange")).length&&(n=new un("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Gn=null,qn=null;function Yn(e){Fr(e,0)}function Kn(e){if(q(wa(e)))return e}function Qn(e,t){if("change"===e)return t}var Zn=!1;if(u){var Xn;if(u){var Jn="oninput"in document;if(!Jn){var er=document.createElement("div");er.setAttribute("oninput","return;"),Jn="function"==typeof er.oninput}Xn=Jn}else Xn=!1;Zn=Xn&&(!document.documentMode||9<document.documentMode)}function tr(){Gn&&(Gn.detachEvent("onpropertychange",nr),qn=Gn=null)}function nr(e){if("value"===e.propertyName&&Kn(qn)){var t=[];Wn(t,qn,e,ke(e)),Ne(Yn,t)}}function rr(e,t,n){"focusin"===e?(tr(),qn=n,(Gn=t).attachEvent("onpropertychange",nr)):"focusout"===e&&tr()}function ar(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return Kn(qn)}function or(e,t){if("click"===e)return Kn(t)}function ir(e,t){if("input"===e||"change"===e)return Kn(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 a=n[r];if(!d.call(t,a)||!lr(e[a],t[a]))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 fr(){for(var e=window,t=Y();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=Y((e=t.contentWindow).document)}return t}function pr(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 mr(e){var t=fr(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&dr(n.ownerDocument.documentElement,n)){if(null!==r&&pr(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 a=n.textContent.length,o=Math.min(r.start,a);r=void 0===r.end?o:Math.min(r.end,a),!e.extend&&o>r&&(a=r,r=o,o=a),a=ur(n,o);var i=ur(n,r);a&&i&&(1!==e.rangeCount||e.anchorNode!==a.node||e.anchorOffset!==a.offset||e.focusNode!==i.node||e.focusOffset!==i.offset)&&((t=t.createRange()).setStart(a.node,a.offset),e.removeAllRanges(),o>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 gr=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!==Y(r)||("selectionStart"in(r=hr)&&pr(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=Gr(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={},_r={};function Er(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 _r)return Sr[e]=n[t];return e}u&&(_r=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=Er("animationend"),Ar=Er("animationiteration"),Tr=Er("animationstart"),Lr=Er("transitionend"),Rr=new Map,Nr="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 Or(e,t){Rr.set(e,t),s(t,[e])}for(var jr=0;jr<Nr.length;jr++){var Pr=Nr[jr];Or(Pr.toLowerCase(),"on"+(Pr[0].toUpperCase()+Pr.slice(1)))}Or(Cr,"onAnimationEnd"),Or(Ar,"onAnimationIteration"),Or(Tr,"onAnimationStart"),Or("dblclick","onDoubleClick"),Or("focusin","onFocus"),Or("focusout","onBlur"),Or(Lr,"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 Mr="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(Mr));function Dr(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,function(e,t,n,r,a,i,l,s,c){if(Be.apply(this,arguments),Ie){if(!Ie)throw Error(o(198));var u=De;Ie=!1,De=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],a=r.event;r=r.listeners;e:{var o=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!==o&&a.isPropagationStopped())break e;Dr(a,l,c),o=s}else for(i=0;i<r.length;i++){if(s=(l=r[i]).instance,c=l.currentTarget,l=l.listener,s!==o&&a.isPropagationStopped())break e;Dr(a,l,c),o=s}}}if(Fe)throw e=ze,Fe=!1,ze=null,e}function zr(e,t){var n=t[ga];void 0===n&&(n=t[ga]=new Set);var r=e+"__bubble";n.has(r)||(Hr(t,e,2,!1),n.add(r))}function $r(e,t,n){var r=0;t&&(r|=4),Hr(n,e,r,t)}var Br="_reactListening"+Math.random().toString(36).slice(2);function Ur(e){if(!e[Br]){e[Br]=!0,i.forEach((function(t){"selectionchange"!==t&&(Ir.has(t)||$r(t,!1,e),$r(t,!0,e))}));var t=9===e.nodeType?e:e.ownerDocument;null===t||t[Br]||(t[Br]=!0,$r("selectionchange",!1,t))}}function Hr(e,t,n,r){switch(Qt(t)){case 1:var a=Wt;break;case 4:a=Gt;break;default:a=qt}n=a.bind(null,t,n,e),a=void 0,!je||"touchstart"!==t&&"touchmove"!==t&&"wheel"!==t||(a=!0),r?void 0!==a?e.addEventListener(t,n,{capture:!0,passive:a}):e.addEventListener(t,n,!0):void 0!==a?e.addEventListener(t,n,{passive:a}):e.addEventListener(t,n,!1)}function Vr(e,t,n,r,a){var o=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===a||8===l.nodeType&&l.parentNode===a)break;if(4===i)for(i=r.return;null!==i;){var s=i.tag;if((3===s||4===s)&&((s=i.stateNode.containerInfo)===a||8===s.nodeType&&s.parentNode===a))return;i=i.return}for(;null!==l;){if(null===(i=ya(l)))return;if(5===(s=i.tag)||6===s){r=o=i;continue e}l=l.parentNode}}r=r.return}Ne((function(){var r=o,a=ke(n),i=[];e:{var l=Rr.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=An;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=mn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":s=gn;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":s=Ln;break;case Cr:case Ar:case Tr:s=bn;break;case Lr:s=Rn;break;case"scroll":s=fn;break;case"wheel":s=On;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=Tn}var u=0!=(4&t),d=!u&&"scroll"===e,f=u?null!==l?l+"Capture":null:l;u=[];for(var p,m=r;null!==m;){var g=(p=m).stateNode;if(5===p.tag&&null!==g&&(p=g,null!==f&&(null!=(g=Oe(m,f))&&u.push(Wr(m,g,p)))),d)break;m=m.return}0<u.length&&(l=new s(l,c,null,n,a),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)||!ya(c)&&!c[ma])&&(s||l)&&(l=a.window===a?a:(l=a.ownerDocument)?l.defaultView||l.parentWindow:window,s?(s=r,null!==(c=(c=n.relatedTarget||n.toElement)?ya(c):null)&&(c!==(d=Ue(c))||5!==c.tag&&6!==c.tag)&&(c=null)):(s=null,c=r),s!==c)){if(u=mn,g="onMouseLeave",f="onMouseEnter",m="mouse","pointerout"!==e&&"pointerover"!==e||(u=Tn,g="onPointerLeave",f="onPointerEnter",m="pointer"),d=null==s?l:wa(s),p=null==c?l:wa(c),(l=new u(g,m+"leave",s,n,a)).target=d,l.relatedTarget=p,g=null,ya(a)===r&&((u=new u(f,m+"enter",c,n,a)).target=p,u.relatedTarget=d,g=u),d=g,s&&c)e:{for(f=c,m=0,p=u=s;p;p=qr(p))m++;for(p=0,g=f;g;g=qr(g))p++;for(;0<m-p;)u=qr(u),m--;for(;0<p-m;)f=qr(f),p--;for(;m--;){if(u===f||null!==f&&u===f.alternate)break e;u=qr(u),f=qr(f)}u=null}else u=null;null!==s&&Yr(i,l,s,u,!1),null!==c&&null!==d&&Yr(i,d,c,u,!0)}if("select"===(s=(l=r?wa(r):window).nodeName&&l.nodeName.toLowerCase())||"input"===s&&"file"===l.type)var h=Qn;else if(Vn(l))if(Zn)h=ir;else{h=ar;var b=rr}else(s=l.nodeName)&&"input"===s.toLowerCase()&&("checkbox"===l.type||"radio"===l.type)&&(h=or);switch(h&&(h=h(e,r))?Wn(i,h,n,a):(b&&b(e,l,r),"focusout"===e&&(b=l._wrapperState)&&b.controlled&&"number"===l.type&&ee(l,"number",l.value)),b=r?wa(r):window,e){case"focusin":(Vn(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,a);break;case"selectionchange":if(gr)break;case"keydown":case"keyup":wr(i,n,a)}var y;if(Pn)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 Un?$n(e,n)&&(v="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(v="onCompositionStart");v&&(Dn&&"ko"!==n.locale&&(Un||"onCompositionStart"!==v?"onCompositionEnd"===v&&Un&&(y=en()):(Xt="value"in(Zt=a)?Zt.value:Zt.textContent,Un=!0)),0<(b=Gr(r,v)).length&&(v=new wn(v,e,null,n,a),i.push({event:v,listeners:b}),y?v.data=y:null!==(y=Bn(n))&&(v.data=y))),(y=In?function(e,t){switch(e){case"compositionend":return Bn(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(Un)return"compositionend"===e||!Pn&&$n(e,t)?(e=en(),Jt=Xt=Zt=null,Un=!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 Dn&&"ko"!==t.locale?null:t.data}}(e,n))&&(0<(r=Gr(r,"onBeforeInput")).length&&(a=new wn("onBeforeInput","beforeinput",null,n,a),i.push({event:a,listeners:r}),a.data=y))}Fr(i,t)}))}function Wr(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Gr(e,t){for(var n=t+"Capture",r=[];null!==e;){var a=e,o=a.stateNode;5===a.tag&&null!==o&&(a=o,null!=(o=Oe(e,n))&&r.unshift(Wr(e,o,a)),null!=(o=Oe(e,t))&&r.push(Wr(e,o,a))),e=e.return}return r}function qr(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag);return e||null}function Yr(e,t,n,r,a){for(var o=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,a?null!=(s=Oe(n,o))&&i.unshift(Wr(n,s,l)):a||null!=(s=Oe(n,o))&&i.push(Wr(n,s,l))),n=n.return}0!==i.length&&e.push({event:t,listeners:i})}var Kr=/\r\n?/g,Qr=/\u0000|\uFFFD/g;function Zr(e){return("string"==typeof e?e:""+e).replace(Kr,"\n").replace(Qr,"")}function Xr(e,t,n){if(t=Zr(t),Zr(e)!==t&&n)throw Error(o(425))}function Jr(){}var ea=null,ta=null;function na(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 ra="function"==typeof setTimeout?setTimeout:void 0,aa="function"==typeof clearTimeout?clearTimeout:void 0,oa="function"==typeof Promise?Promise:void 0,ia="function"==typeof queueMicrotask?queueMicrotask:void 0!==oa?function(e){return oa.resolve(null).then(e).catch(la)}:ra;function la(e){setTimeout((function(){throw e}))}function sa(e,t){var n=t,r=0;do{var a=n.nextSibling;if(e.removeChild(n),a&&8===a.nodeType)if("/$"===(n=a.data)){if(0===r)return e.removeChild(a),void Ut(t);r--}else"$"!==n&&"$?"!==n&&"$!"!==n||r++;n=a}while(n);Ut(t)}function ca(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 ua(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 da=Math.random().toString(36).slice(2),fa="__reactFiber$"+da,pa="__reactProps$"+da,ma="__reactContainer$"+da,ga="__reactEvents$"+da,ha="__reactListeners$"+da,ba="__reactHandles$"+da;function ya(e){var t=e[fa];if(t)return t;for(var n=e.parentNode;n;){if(t=n[ma]||n[fa]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=ua(e);null!==e;){if(n=e[fa])return n;e=ua(e)}return t}n=(e=n).parentNode}return null}function va(e){return!(e=e[fa]||e[ma])||5!==e.tag&&6!==e.tag&&13!==e.tag&&3!==e.tag?null:e}function wa(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(o(33))}function ka(e){return e[pa]||null}var xa=[],Sa=-1;function _a(e){return{current:e}}function Ea(e){0>Sa||(e.current=xa[Sa],xa[Sa]=null,Sa--)}function Ca(e,t){Sa++,xa[Sa]=e.current,e.current=t}var Aa={},Ta=_a(Aa),La=_a(!1),Ra=Aa;function Na(e,t){var n=e.type.contextTypes;if(!n)return Aa;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var a,o={};for(a in n)o[a]=t[a];return r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=o),o}function Oa(e){return null!=(e=e.childContextTypes)}function ja(){Ea(La),Ea(Ta)}function Pa(e,t,n){if(Ta.current!==Aa)throw Error(o(168));Ca(Ta,t),Ca(La,n)}function Ma(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,"function"!=typeof r.getChildContext)return n;for(var a in r=r.getChildContext())if(!(a in t))throw Error(o(108,H(e)||"Unknown",a));return D({},n,r)}function Ia(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Aa,Ra=Ta.current,Ca(Ta,e),Ca(La,La.current),!0}function Da(e,t,n){var r=e.stateNode;if(!r)throw Error(o(169));n?(e=Ma(e,t,Ra),r.__reactInternalMemoizedMergedChildContext=e,Ea(La),Ea(Ta),Ca(Ta,e)):Ea(La),Ca(La,n)}var Fa=null,za=!1,$a=!1;function Ba(e){null===Fa?Fa=[e]:Fa.push(e)}function Ua(){if(!$a&&null!==Fa){$a=!0;var e=0,t=vt;try{var n=Fa;for(vt=1;e<n.length;e++){var r=n[e];do{r=r(!0)}while(null!==r)}Fa=null,za=!1}catch(a){throw null!==Fa&&(Fa=Fa.slice(e+1)),qe(Je,Ua),a}finally{vt=t,$a=!1}}return null}var Ha=[],Va=0,Wa=null,Ga=0,qa=[],Ya=0,Ka=null,Qa=1,Za="";function Xa(e,t){Ha[Va++]=Ga,Ha[Va++]=Wa,Wa=e,Ga=t}function Ja(e,t,n){qa[Ya++]=Qa,qa[Ya++]=Za,qa[Ya++]=Ka,Ka=e;var r=Qa;e=Za;var a=32-it(r)-1;r&=~(1<<a),n+=1;var o=32-it(t)+a;if(30<o){var i=a-a%5;o=(r&(1<<i)-1).toString(32),r>>=i,a-=i,Qa=1<<32-it(t)+a|n<<a|r,Za=o+e}else Qa=1<<o|n<<a|r,Za=e}function eo(e){null!==e.return&&(Xa(e,1),Ja(e,1,0))}function to(e){for(;e===Wa;)Wa=Ha[--Va],Ha[Va]=null,Ga=Ha[--Va],Ha[Va]=null;for(;e===Ka;)Ka=qa[--Ya],qa[Ya]=null,Za=qa[--Ya],qa[Ya]=null,Qa=qa[--Ya],qa[Ya]=null}var no=null,ro=null,ao=!1,oo=null;function io(e,t){var n=Nc(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 lo(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,no=e,ro=ca(t.firstChild),!0);case 6:return null!==(t=""===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,no=e,ro=null,!0);case 13:return null!==(t=8!==t.nodeType?null:t)&&(n=null!==Ka?{id:Qa,overflow:Za}:null,e.memoizedState={dehydrated:t,treeContext:n,retryLane:1073741824},(n=Nc(18,null,null,0)).stateNode=t,n.return=e,e.child=n,no=e,ro=null,!0);default:return!1}}function so(e){return 0!=(1&e.mode)&&0==(128&e.flags)}function co(e){if(ao){var t=ro;if(t){var n=t;if(!lo(e,t)){if(so(e))throw Error(o(418));t=ca(n.nextSibling);var r=no;t&&lo(e,t)?io(r,n):(e.flags=-4097&e.flags|2,ao=!1,no=e)}}else{if(so(e))throw Error(o(418));e.flags=-4097&e.flags|2,ao=!1,no=e}}}function uo(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;no=e}function fo(e){if(e!==no)return!1;if(!ao)return uo(e),ao=!0,!1;var t;if((t=3!==e.tag)&&!(t=5!==e.tag)&&(t="head"!==(t=e.type)&&"body"!==t&&!na(e.type,e.memoizedProps)),t&&(t=ro)){if(so(e))throw po(),Error(o(418));for(;t;)io(e,t),t=ca(t.nextSibling)}if(uo(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(o(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if("/$"===n){if(0===t){ro=ca(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}ro=null}}else ro=no?ca(e.stateNode.nextSibling):null;return!0}function po(){for(var e=ro;e;)e=ca(e.nextSibling)}function mo(){ro=no=null,ao=!1}function go(e){null===oo?oo=[e]:oo.push(e)}var ho=w.ReactCurrentBatchConfig;function bo(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(o(309));var r=n.stateNode}if(!r)throw Error(o(147,e));var a=r,i=""+e;return null!==t&&null!==t.ref&&"function"==typeof t.ref&&t.ref._stringRef===i?t.ref:(t=function(e){var t=a.refs;null===e?delete t[i]:t[i]=e},t._stringRef=i,t)}if("string"!=typeof e)throw Error(o(284));if(!n._owner)throw Error(o(290,e))}return e}function yo(e,t){throw e=Object.prototype.toString.call(t),Error(o(31,"[object Object]"===e?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function vo(e){return(0,e._init)(e._payload)}function wo(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 a(e,t){return(e=jc(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=Dc(n,e.mode,r)).return=e,t):((t=a(t,n)).return=e,t)}function c(e,t,n,r){var o=n.type;return o===S?d(e,t,n.props.children,r,n.key):null!==t&&(t.elementType===o||"object"==typeof o&&null!==o&&o.$$typeof===O&&vo(o)===t.type)?((r=a(t,n.props)).ref=bo(e,t,n),r.return=e,r):((r=Pc(n.type,n.key,n.props,null,e.mode,r)).ref=bo(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=Fc(n,e.mode,r)).return=e,t):((t=a(t,n.children||[])).return=e,t)}function d(e,t,n,r,o){return null===t||7!==t.tag?((t=Mc(n,e.mode,r,o)).return=e,t):((t=a(t,n)).return=e,t)}function f(e,t,n){if("string"==typeof t&&""!==t||"number"==typeof t)return(t=Dc(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case k:return(n=Pc(t.type,t.key,t.props,null,e.mode,n)).ref=bo(e,null,t),n.return=e,n;case x:return(t=Fc(t,e.mode,n)).return=e,t;case O:return f(e,(0,t._init)(t._payload),n)}if(te(t)||M(t))return(t=Mc(t,e.mode,n,null)).return=e,t;yo(e,t)}return null}function p(e,t,n,r){var a=null!==t?t.key:null;if("string"==typeof n&&""!==n||"number"==typeof n)return null!==a?null:s(e,t,""+n,r);if("object"==typeof n&&null!==n){switch(n.$$typeof){case k:return n.key===a?c(e,t,n,r):null;case x:return n.key===a?u(e,t,n,r):null;case O:return p(e,t,(a=n._init)(n._payload),r)}if(te(n)||M(n))return null!==a?null:d(e,t,n,r,null);yo(e,n)}return null}function m(e,t,n,r,a){if("string"==typeof r&&""!==r||"number"==typeof r)return s(t,e=e.get(n)||null,""+r,a);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,a);case x:return u(t,e=e.get(null===r.key?n:r.key)||null,r,a);case O:return m(e,t,n,(0,r._init)(r._payload),a)}if(te(r)||M(r))return d(t,e=e.get(n)||null,r,a,null);yo(t,r)}return null}function g(a,o,l,s){for(var c=null,u=null,d=o,g=o=0,h=null;null!==d&&g<l.length;g++){d.index>g?(h=d,d=null):h=d.sibling;var b=p(a,d,l[g],s);if(null===b){null===d&&(d=h);break}e&&d&&null===b.alternate&&t(a,d),o=i(b,o,g),null===u?c=b:u.sibling=b,u=b,d=h}if(g===l.length)return n(a,d),ao&&Xa(a,g),c;if(null===d){for(;g<l.length;g++)null!==(d=f(a,l[g],s))&&(o=i(d,o,g),null===u?c=d:u.sibling=d,u=d);return ao&&Xa(a,g),c}for(d=r(a,d);g<l.length;g++)null!==(h=m(d,a,g,l[g],s))&&(e&&null!==h.alternate&&d.delete(null===h.key?g:h.key),o=i(h,o,g),null===u?c=h:u.sibling=h,u=h);return e&&d.forEach((function(e){return t(a,e)})),ao&&Xa(a,g),c}function h(a,l,s,c){var u=M(s);if("function"!=typeof u)throw Error(o(150));if(null==(s=u.call(s)))throw Error(o(151));for(var d=u=null,g=l,h=l=0,b=null,y=s.next();null!==g&&!y.done;h++,y=s.next()){g.index>h?(b=g,g=null):b=g.sibling;var v=p(a,g,y.value,c);if(null===v){null===g&&(g=b);break}e&&g&&null===v.alternate&&t(a,g),l=i(v,l,h),null===d?u=v:d.sibling=v,d=v,g=b}if(y.done)return n(a,g),ao&&Xa(a,h),u;if(null===g){for(;!y.done;h++,y=s.next())null!==(y=f(a,y.value,c))&&(l=i(y,l,h),null===d?u=y:d.sibling=y,d=y);return ao&&Xa(a,h),u}for(g=r(a,g);!y.done;h++,y=s.next())null!==(y=m(g,a,h,y.value,c))&&(e&&null!==y.alternate&&g.delete(null===y.key?h:y.key),l=i(y,l,h),null===d?u=y:d.sibling=y,d=y);return e&&g.forEach((function(e){return t(a,e)})),ao&&Xa(a,h),u}return function e(r,o,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=o;null!==u;){if(u.key===c){if((c=i.type)===S){if(7===u.tag){n(r,u.sibling),(o=a(u,i.props.children)).return=r,r=o;break e}}else if(u.elementType===c||"object"==typeof c&&null!==c&&c.$$typeof===O&&vo(c)===u.type){n(r,u.sibling),(o=a(u,i.props)).ref=bo(r,u,i),o.return=r,r=o;break e}n(r,u);break}t(r,u),u=u.sibling}i.type===S?((o=Mc(i.props.children,r.mode,s,i.key)).return=r,r=o):((s=Pc(i.type,i.key,i.props,null,r.mode,s)).ref=bo(r,o,i),s.return=r,r=s)}return l(r);case x:e:{for(u=i.key;null!==o;){if(o.key===u){if(4===o.tag&&o.stateNode.containerInfo===i.containerInfo&&o.stateNode.implementation===i.implementation){n(r,o.sibling),(o=a(o,i.children||[])).return=r,r=o;break e}n(r,o);break}t(r,o),o=o.sibling}(o=Fc(i,r.mode,s)).return=r,r=o}return l(r);case O:return e(r,o,(u=i._init)(i._payload),s)}if(te(i))return g(r,o,i,s);if(M(i))return h(r,o,i,s);yo(r,i)}return"string"==typeof i&&""!==i||"number"==typeof i?(i=""+i,null!==o&&6===o.tag?(n(r,o.sibling),(o=a(o,i)).return=r,r=o):(n(r,o),(o=Dc(i,r.mode,s)).return=r,r=o),l(r)):n(r,o)}}var ko=wo(!0),xo=wo(!1),So=_a(null),_o=null,Eo=null,Co=null;function Ao(){Co=Eo=_o=null}function To(e){var t=So.current;Ea(So),e._currentValue=t}function Lo(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 Ro(e,t){_o=e,Co=Eo=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(0!=(e.lanes&t)&&(vl=!0),e.firstContext=null)}function No(e){var t=e._currentValue;if(Co!==e)if(e={context:e,memoizedValue:t,next:null},null===Eo){if(null===_o)throw Error(o(308));Eo=e,_o.dependencies={lanes:0,firstContext:e}}else Eo=Eo.next=e;return t}var Oo=null;function jo(e){null===Oo?Oo=[e]:Oo.push(e)}function Po(e,t,n,r){var a=t.interleaved;return null===a?(n.next=n,jo(t)):(n.next=a.next,a.next=n),t.interleaved=n,Mo(e,r)}function Mo(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 Io=!1;function Do(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Fo(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 zo(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function $o(e,t,n){var r=e.updateQueue;if(null===r)return null;if(r=r.shared,0!=(2&Ts)){var a=r.pending;return null===a?t.next=t:(t.next=a.next,a.next=t),r.pending=t,Mo(e,n)}return null===(a=r.interleaved)?(t.next=t,jo(r)):(t.next=a.next,a.next=t),r.interleaved=t,Mo(e,n)}function Bo(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 Uo(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r.updateQueue)){var a=null,o=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===o?a=o=i:o=o.next=i,n=n.next}while(null!==n);null===o?a=o=t:o=o.next=t}else a=o=t;return n={baseState:r.baseState,firstBaseUpdate:a,lastBaseUpdate:o,shared:r.shared,effects:r.effects},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function Ho(e,t,n,r){var a=e.updateQueue;Io=!1;var o=a.firstBaseUpdate,i=a.lastBaseUpdate,l=a.shared.pending;if(null!==l){a.shared.pending=null;var s=l,c=s.next;s.next=null,null===i?o=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!==o){var d=a.baseState;for(i=0,u=c=s=null,l=o;;){var f=l.lane,p=l.eventTime;if((r&f)===f){null!==u&&(u=u.next={eventTime:p,lane:0,tag:l.tag,payload:l.payload,callback:l.callback,next:null});e:{var m=e,g=l;switch(f=t,p=n,g.tag){case 1:if("function"==typeof(m=g.payload)){d=m.call(p,d,f);break e}d=m;break e;case 3:m.flags=-65537&m.flags|128;case 0:if(null==(f="function"==typeof(m=g.payload)?m.call(p,d,f):m))break e;d=D({},d,f);break e;case 2:Io=!0}}null!==l.callback&&0!==l.lane&&(e.flags|=64,null===(f=a.effects)?a.effects=[l]:f.push(l))}else p={eventTime:p,lane:f,tag:l.tag,payload:l.payload,callback:l.callback,next:null},null===u?(c=u=p,s=d):u=u.next=p,i|=f;if(null===(l=l.next)){if(null===(l=a.shared.pending))break;l=(f=l).next,f.next=null,a.lastBaseUpdate=f,a.shared.pending=null}}if(null===u&&(s=d),a.baseState=s,a.firstBaseUpdate=c,a.lastBaseUpdate=u,null!==(t=a.shared.interleaved)){a=t;do{i|=a.lane,a=a.next}while(a!==t)}else null===o&&(a.shared.lanes=0);Is|=i,e.lanes=i,e.memoizedState=d}}function Vo(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t<e.length;t++){var r=e[t],a=r.callback;if(null!==a){if(r.callback=null,r=n,"function"!=typeof a)throw Error(o(191,a));a.call(r)}}}var Wo={},Go=_a(Wo),qo=_a(Wo),Yo=_a(Wo);function Ko(e){if(e===Wo)throw Error(o(174));return e}function Qo(e,t){switch(Ca(Yo,t),Ca(qo,e),Ca(Go,Wo),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)}Ea(Go),Ca(Go,t)}function Zo(){Ea(Go),Ea(qo),Ea(Yo)}function Xo(e){Ko(Yo.current);var t=Ko(Go.current),n=se(t,e.type);t!==n&&(Ca(qo,e),Ca(Go,n))}function Jo(e){qo.current===e&&(Ea(Go),Ea(qo))}var ei=_a(0);function ti(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 ni=[];function ri(){for(var e=0;e<ni.length;e++)ni[e]._workInProgressVersionPrimary=null;ni.length=0}var ai=w.ReactCurrentDispatcher,oi=w.ReactCurrentBatchConfig,ii=0,li=null,si=null,ci=null,ui=!1,di=!1,fi=0,pi=0;function mi(){throw Error(o(321))}function gi(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 hi(e,t,n,r,a,i){if(ii=i,li=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,ai.current=null===e||null===e.memoizedState?Ji:el,e=n(r,a),di){i=0;do{if(di=!1,fi=0,25<=i)throw Error(o(301));i+=1,ci=si=null,t.updateQueue=null,ai.current=tl,e=n(r,a)}while(di)}if(ai.current=Xi,t=null!==si&&null!==si.next,ii=0,ci=si=li=null,ui=!1,t)throw Error(o(300));return e}function bi(){var e=0!==fi;return fi=0,e}function yi(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===ci?li.memoizedState=ci=e:ci=ci.next=e,ci}function vi(){if(null===si){var e=li.alternate;e=null!==e?e.memoizedState:null}else e=si.next;var t=null===ci?li.memoizedState:ci.next;if(null!==t)ci=t,si=e;else{if(null===e)throw Error(o(310));e={memoizedState:(si=e).memoizedState,baseState:si.baseState,baseQueue:si.baseQueue,queue:si.queue,next:null},null===ci?li.memoizedState=ci=e:ci=ci.next=e}return ci}function wi(e,t){return"function"==typeof t?t(e):t}function ki(e){var t=vi(),n=t.queue;if(null===n)throw Error(o(311));n.lastRenderedReducer=e;var r=si,a=r.baseQueue,i=n.pending;if(null!==i){if(null!==a){var l=a.next;a.next=i.next,i.next=l}r.baseQueue=a=i,n.pending=null}if(null!==a){i=a.next,r=r.baseState;var s=l=null,c=null,u=i;do{var d=u.lane;if((ii&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 f={lane:d,action:u.action,hasEagerState:u.hasEagerState,eagerState:u.eagerState,next:null};null===c?(s=c=f,l=r):c=c.next=f,li.lanes|=d,Is|=d}u=u.next}while(null!==u&&u!==i);null===c?l=r:c.next=s,lr(r,t.memoizedState)||(vl=!0),t.memoizedState=r,t.baseState=l,t.baseQueue=c,n.lastRenderedState=r}if(null!==(e=n.interleaved)){a=e;do{i=a.lane,li.lanes|=i,Is|=i,a=a.next}while(a!==e)}else null===a&&(n.lanes=0);return[t.memoizedState,n.dispatch]}function xi(e){var t=vi(),n=t.queue;if(null===n)throw Error(o(311));n.lastRenderedReducer=e;var r=n.dispatch,a=n.pending,i=t.memoizedState;if(null!==a){n.pending=null;var l=a=a.next;do{i=e(i,l.action),l=l.next}while(l!==a);lr(i,t.memoizedState)||(vl=!0),t.memoizedState=i,null===t.baseQueue&&(t.baseState=i),n.lastRenderedState=i}return[i,r]}function Si(){}function _i(e,t){var n=li,r=vi(),a=t(),i=!lr(r.memoizedState,a);if(i&&(r.memoizedState=a,vl=!0),r=r.queue,Ii(Ai.bind(null,n,r,e),[e]),r.getSnapshot!==t||i||null!==ci&&1&ci.memoizedState.tag){if(n.flags|=2048,Ni(9,Ci.bind(null,n,r,a,t),void 0,null),null===Ls)throw Error(o(349));0!=(30&ii)||Ei(n,t,a)}return a}function Ei(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},null===(t=li.updateQueue)?(t={lastEffect:null,stores:null},li.updateQueue=t,t.stores=[e]):null===(n=t.stores)?t.stores=[e]:n.push(e)}function Ci(e,t,n,r){t.value=n,t.getSnapshot=r,Ti(t)&&Li(e)}function Ai(e,t,n){return n((function(){Ti(t)&&Li(e)}))}function Ti(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!lr(e,n)}catch(r){return!0}}function Li(e){var t=Mo(e,1);null!==t&&nc(t,e,1,-1)}function Ri(e){var t=yi();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:wi,lastRenderedState:e},t.queue=e,e=e.dispatch=Yi.bind(null,li,e),[t.memoizedState,e]}function Ni(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null},null===(t=li.updateQueue)?(t={lastEffect:null,stores:null},li.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 Oi(){return vi().memoizedState}function ji(e,t,n,r){var a=yi();li.flags|=e,a.memoizedState=Ni(1|t,n,void 0,void 0===r?null:r)}function Pi(e,t,n,r){var a=vi();r=void 0===r?null:r;var o=void 0;if(null!==si){var i=si.memoizedState;if(o=i.destroy,null!==r&&gi(r,i.deps))return void(a.memoizedState=Ni(t,n,o,r))}li.flags|=e,a.memoizedState=Ni(1|t,n,o,r)}function Mi(e,t){return ji(8390656,8,e,t)}function Ii(e,t){return Pi(2048,8,e,t)}function Di(e,t){return Pi(4,2,e,t)}function Fi(e,t){return Pi(4,4,e,t)}function zi(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 $i(e,t,n){return n=null!=n?n.concat([e]):null,Pi(4,4,zi.bind(null,t,e),n)}function Bi(){}function Ui(e,t){var n=vi();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&gi(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function Hi(e,t){var n=vi();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&gi(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)}function Vi(e,t,n){return 0==(21&ii)?(e.baseState&&(e.baseState=!1,vl=!0),e.memoizedState=n):(lr(n,t)||(n=gt(),li.lanes|=n,Is|=n,e.baseState=!0),t)}function Wi(e,t){var n=vt;vt=0!==n&&4>n?n:4,e(!0);var r=oi.transition;oi.transition={};try{e(!1),t()}finally{vt=n,oi.transition=r}}function Gi(){return vi().memoizedState}function qi(e,t,n){var r=tc(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},Ki(e))Qi(t,n);else if(null!==(n=Po(e,t,n,r))){nc(n,e,r,ec()),Zi(n,t,r)}}function Yi(e,t,n){var r=tc(e),a={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(Ki(e))Qi(t,a);else{var o=e.alternate;if(0===e.lanes&&(null===o||0===o.lanes)&&null!==(o=t.lastRenderedReducer))try{var i=t.lastRenderedState,l=o(i,n);if(a.hasEagerState=!0,a.eagerState=l,lr(l,i)){var s=t.interleaved;return null===s?(a.next=a,jo(t)):(a.next=s.next,s.next=a),void(t.interleaved=a)}}catch(c){}null!==(n=Po(e,t,a,r))&&(nc(n,e,r,a=ec()),Zi(n,t,r))}}function Ki(e){var t=e.alternate;return e===li||null!==t&&t===li}function Qi(e,t){di=ui=!0;var n=e.pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Zi(e,t,n){if(0!=(4194240&n)){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,yt(e,n)}}var Xi={readContext:No,useCallback:mi,useContext:mi,useEffect:mi,useImperativeHandle:mi,useInsertionEffect:mi,useLayoutEffect:mi,useMemo:mi,useReducer:mi,useRef:mi,useState:mi,useDebugValue:mi,useDeferredValue:mi,useTransition:mi,useMutableSource:mi,useSyncExternalStore:mi,useId:mi,unstable_isNewReconciler:!1},Ji={readContext:No,useCallback:function(e,t){return yi().memoizedState=[e,void 0===t?null:t],e},useContext:No,useEffect:Mi,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,ji(4194308,4,zi.bind(null,t,e),n)},useLayoutEffect:function(e,t){return ji(4194308,4,e,t)},useInsertionEffect:function(e,t){return ji(4,2,e,t)},useMemo:function(e,t){var n=yi();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=yi();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=qi.bind(null,li,e),[r.memoizedState,e]},useRef:function(e){return e={current:e},yi().memoizedState=e},useState:Ri,useDebugValue:Bi,useDeferredValue:function(e){return yi().memoizedState=e},useTransition:function(){var e=Ri(!1),t=e[0];return e=Wi.bind(null,e[1]),yi().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=li,a=yi();if(ao){if(void 0===n)throw Error(o(407));n=n()}else{if(n=t(),null===Ls)throw Error(o(349));0!=(30&ii)||Ei(r,t,n)}a.memoizedState=n;var i={value:n,getSnapshot:t};return a.queue=i,Mi(Ai.bind(null,r,i,e),[e]),r.flags|=2048,Ni(9,Ci.bind(null,r,i,n,t),void 0,null),n},useId:function(){var e=yi(),t=Ls.identifierPrefix;if(ao){var n=Za;t=":"+t+"R"+(n=(Qa&~(1<<32-it(Qa)-1)).toString(32)+n),0<(n=fi++)&&(t+="H"+n.toString(32)),t+=":"}else t=":"+t+"r"+(n=pi++).toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},el={readContext:No,useCallback:Ui,useContext:No,useEffect:Ii,useImperativeHandle:$i,useInsertionEffect:Di,useLayoutEffect:Fi,useMemo:Hi,useReducer:ki,useRef:Oi,useState:function(){return ki(wi)},useDebugValue:Bi,useDeferredValue:function(e){return Vi(vi(),si.memoizedState,e)},useTransition:function(){return[ki(wi)[0],vi().memoizedState]},useMutableSource:Si,useSyncExternalStore:_i,useId:Gi,unstable_isNewReconciler:!1},tl={readContext:No,useCallback:Ui,useContext:No,useEffect:Ii,useImperativeHandle:$i,useInsertionEffect:Di,useLayoutEffect:Fi,useMemo:Hi,useReducer:xi,useRef:Oi,useState:function(){return xi(wi)},useDebugValue:Bi,useDeferredValue:function(e){var t=vi();return null===si?t.memoizedState=e:Vi(t,si.memoizedState,e)},useTransition:function(){return[xi(wi)[0],vi().memoizedState]},useMutableSource:Si,useSyncExternalStore:_i,useId:Gi,unstable_isNewReconciler:!1};function nl(e,t){if(e&&e.defaultProps){for(var n in t=D({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}return t}function rl(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:D({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var al={isMounted:function(e){return!!(e=e._reactInternals)&&Ue(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=ec(),a=tc(e),o=zo(r,a);o.payload=t,null!=n&&(o.callback=n),null!==(t=$o(e,o,a))&&(nc(t,e,a,r),Bo(t,e,a))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=ec(),a=tc(e),o=zo(r,a);o.tag=1,o.payload=t,null!=n&&(o.callback=n),null!==(t=$o(e,o,a))&&(nc(t,e,a,r),Bo(t,e,a))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=ec(),r=tc(e),a=zo(n,r);a.tag=2,null!=t&&(a.callback=t),null!==(t=$o(e,a,r))&&(nc(t,e,r,n),Bo(t,e,r))}};function ol(e,t,n,r,a,o,i){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,o,i):!t.prototype||!t.prototype.isPureReactComponent||(!sr(n,r)||!sr(a,o))}function il(e,t,n){var r=!1,a=Aa,o=t.contextType;return"object"==typeof o&&null!==o?o=No(o):(a=Oa(t)?Ra:Ta.current,o=(r=null!=(r=t.contextTypes))?Na(e,a):Aa),t=new t(n,o),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=al,e.stateNode=t,t._reactInternals=e,r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=a,e.__reactInternalMemoizedMaskedChildContext=o),t}function ll(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&&al.enqueueReplaceState(t,t.state,null)}function sl(e,t,n,r){var a=e.stateNode;a.props=n,a.state=e.memoizedState,a.refs={},Do(e);var o=t.contextType;"object"==typeof o&&null!==o?a.context=No(o):(o=Oa(t)?Ra:Ta.current,a.context=Na(e,o)),a.state=e.memoizedState,"function"==typeof(o=t.getDerivedStateFromProps)&&(rl(e,t,o,n),a.state=e.memoizedState),"function"==typeof t.getDerivedStateFromProps||"function"==typeof a.getSnapshotBeforeUpdate||"function"!=typeof a.UNSAFE_componentWillMount&&"function"!=typeof a.componentWillMount||(t=a.state,"function"==typeof a.componentWillMount&&a.componentWillMount(),"function"==typeof a.UNSAFE_componentWillMount&&a.UNSAFE_componentWillMount(),t!==a.state&&al.enqueueReplaceState(a,a.state,null),Ho(e,n,a,r),a.state=e.memoizedState),"function"==typeof a.componentDidMount&&(e.flags|=4194308)}function cl(e,t){try{var n="",r=t;do{n+=B(r),r=r.return}while(r);var a=n}catch(o){a="\nError generating stack: "+o.message+"\n"+o.stack}return{value:e,source:t,stack:a,digest:null}}function ul(e,t,n){return{value:e,source:null,stack:null!=n?n:null,digest:null!=t?t:null}}function dl(e,t){try{console.error(t.value)}catch(n){setTimeout((function(){throw n}))}}var fl="function"==typeof WeakMap?WeakMap:Map;function pl(e,t,n){(n=zo(-1,n)).tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Vs||(Vs=!0,Ws=r),dl(0,t)},n}function ml(e,t,n){(n=zo(-1,n)).tag=3;var r=e.type.getDerivedStateFromError;if("function"==typeof r){var a=t.value;n.payload=function(){return r(a)},n.callback=function(){dl(0,t)}}var o=e.stateNode;return null!==o&&"function"==typeof o.componentDidCatch&&(n.callback=function(){dl(0,t),"function"!=typeof r&&(null===Gs?Gs=new Set([this]):Gs.add(this));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}function gl(e,t,n){var r=e.pingCache;if(null===r){r=e.pingCache=new fl;var a=new Set;r.set(t,a)}else void 0===(a=r.get(t))&&(a=new Set,r.set(t,a));a.has(n)||(a.add(n),e=Ec.bind(null,e,t,n),t.then(e,e))}function hl(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 bl(e,t,n,r,a){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=zo(-1,1)).tag=2,$o(n,t,1))),n.lanes|=1),e):(e.flags|=65536,e.lanes=a,e)}var yl=w.ReactCurrentOwner,vl=!1;function wl(e,t,n,r){t.child=null===e?xo(t,null,n,r):ko(t,e.child,n,r)}function kl(e,t,n,r,a){n=n.render;var o=t.ref;return Ro(t,a),r=hi(e,t,n,r,o,a),n=bi(),null===e||vl?(ao&&n&&eo(t),t.flags|=1,wl(e,t,r,a),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~a,Vl(e,t,a))}function xl(e,t,n,r,a){if(null===e){var o=n.type;return"function"!=typeof o||Oc(o)||void 0!==o.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=Pc(n.type,null,r,t,t.mode,a)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=o,Sl(e,t,o,r,a))}if(o=e.child,0==(e.lanes&a)){var i=o.memoizedProps;if((n=null!==(n=n.compare)?n:sr)(i,r)&&e.ref===t.ref)return Vl(e,t,a)}return t.flags|=1,(e=jc(o,r)).ref=t.ref,e.return=t,t.child=e}function Sl(e,t,n,r,a){if(null!==e){var o=e.memoizedProps;if(sr(o,r)&&e.ref===t.ref){if(vl=!1,t.pendingProps=r=o,0==(e.lanes&a))return t.lanes=e.lanes,Vl(e,t,a);0!=(131072&e.flags)&&(vl=!0)}}return Cl(e,t,n,r,a)}function _l(e,t,n){var r=t.pendingProps,a=r.children,o=null!==e?e.memoizedState:null;if("hidden"===r.mode)if(0==(1&t.mode))t.memoizedState={baseLanes:0,cachePool:null,transitions:null},Ca(js,Os),Os|=n;else{if(0==(1073741824&n))return e=null!==o?o.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,Ca(js,Os),Os|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=null!==o?o.baseLanes:n,Ca(js,Os),Os|=r}else null!==o?(r=o.baseLanes|n,t.memoizedState=null):r=n,Ca(js,Os),Os|=r;return wl(e,t,a,n),t.child}function El(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=512,t.flags|=2097152)}function Cl(e,t,n,r,a){var o=Oa(n)?Ra:Ta.current;return o=Na(t,o),Ro(t,a),n=hi(e,t,n,r,o,a),r=bi(),null===e||vl?(ao&&r&&eo(t),t.flags|=1,wl(e,t,n,a),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~a,Vl(e,t,a))}function Al(e,t,n,r,a){if(Oa(n)){var o=!0;Ia(t)}else o=!1;if(Ro(t,a),null===t.stateNode)Hl(e,t),il(t,n,r),sl(t,n,r,a),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=No(c):c=Na(t,c=Oa(n)?Ra:Ta.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)&&ll(t,i,r,c),Io=!1;var f=t.memoizedState;i.state=f,Ho(t,r,i,a),s=t.memoizedState,l!==r||f!==s||La.current||Io?("function"==typeof u&&(rl(t,n,u,r),s=t.memoizedState),(l=Io||ol(t,n,l,r,f,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,Fo(e,t),l=t.memoizedProps,c=t.type===t.elementType?l:nl(t.type,l),i.props=c,d=t.pendingProps,f=i.context,"object"==typeof(s=n.contextType)&&null!==s?s=No(s):s=Na(t,s=Oa(n)?Ra:Ta.current);var p=n.getDerivedStateFromProps;(u="function"==typeof p||"function"==typeof i.getSnapshotBeforeUpdate)||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(l!==d||f!==s)&&ll(t,i,r,s),Io=!1,f=t.memoizedState,i.state=f,Ho(t,r,i,a);var m=t.memoizedState;l!==d||f!==m||La.current||Io?("function"==typeof p&&(rl(t,n,p,r),m=t.memoizedState),(c=Io||ol(t,n,c,r,f,m,s)||!1)?(u||"function"!=typeof i.UNSAFE_componentWillUpdate&&"function"!=typeof i.componentWillUpdate||("function"==typeof i.componentWillUpdate&&i.componentWillUpdate(r,m,s),"function"==typeof i.UNSAFE_componentWillUpdate&&i.UNSAFE_componentWillUpdate(r,m,s)),"function"==typeof i.componentDidUpdate&&(t.flags|=4),"function"==typeof i.getSnapshotBeforeUpdate&&(t.flags|=1024)):("function"!=typeof i.componentDidUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=m),i.props=r,i.state=m,i.context=s,r=c):("function"!=typeof i.componentDidUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),r=!1)}return Tl(e,t,n,r,o,a)}function Tl(e,t,n,r,a,o){El(e,t);var i=0!=(128&t.flags);if(!r&&!i)return a&&Da(t,n,!1),Vl(e,t,o);r=t.stateNode,yl.current=t;var l=i&&"function"!=typeof n.getDerivedStateFromError?null:r.render();return t.flags|=1,null!==e&&i?(t.child=ko(t,e.child,null,o),t.child=ko(t,null,l,o)):wl(e,t,l,o),t.memoizedState=r.state,a&&Da(t,n,!0),t.child}function Ll(e){var t=e.stateNode;t.pendingContext?Pa(0,t.pendingContext,t.pendingContext!==t.context):t.context&&Pa(0,t.context,!1),Qo(e,t.containerInfo)}function Rl(e,t,n,r,a){return mo(),go(a),t.flags|=256,wl(e,t,n,r),t.child}var Nl,Ol,jl,Pl,Ml={dehydrated:null,treeContext:null,retryLane:0};function Il(e){return{baseLanes:e,cachePool:null,transitions:null}}function Dl(e,t,n){var r,a=t.pendingProps,i=ei.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),Ca(ei,1&i),null===e)return co(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=a.children,e=a.fallback,l?(a=t.mode,l=t.child,s={mode:"hidden",children:s},0==(1&a)&&null!==l?(l.childLanes=0,l.pendingProps=s):l=Ic(s,a,0,null),e=Mc(e,a,n,null),l.return=t,e.return=t,l.sibling=e,t.child=l,t.child.memoizedState=Il(n),t.memoizedState=Ml,e):Fl(t,s));if(null!==(i=e.memoizedState)&&null!==(r=i.dehydrated))return function(e,t,n,r,a,i,l){if(n)return 256&t.flags?(t.flags&=-257,zl(e,t,l,r=ul(Error(o(422))))):null!==t.memoizedState?(t.child=e.child,t.flags|=128,null):(i=r.fallback,a=t.mode,r=Ic({mode:"visible",children:r.children},a,0,null),(i=Mc(i,a,l,null)).flags|=2,r.return=t,i.return=t,r.sibling=i,t.child=r,0!=(1&t.mode)&&ko(t,e.child,null,l),t.child.memoizedState=Il(l),t.memoizedState=Ml,i);if(0==(1&t.mode))return zl(e,t,l,null);if("$!"===a.data){if(r=a.nextSibling&&a.nextSibling.dataset)var s=r.dgst;return r=s,zl(e,t,l,r=ul(i=Error(o(419)),r,void 0))}if(s=0!=(l&e.childLanes),vl||s){if(null!==(r=Ls)){switch(l&-l){case 4:a=2;break;case 16:a=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:a=32;break;case 536870912:a=268435456;break;default:a=0}0!==(a=0!=(a&(r.suspendedLanes|l))?0:a)&&a!==i.retryLane&&(i.retryLane=a,Mo(e,a),nc(r,e,a,-1))}return gc(),zl(e,t,l,r=ul(Error(o(421))))}return"$?"===a.data?(t.flags|=128,t.child=e.child,t=Ac.bind(null,e),a._reactRetry=t,null):(e=i.treeContext,ro=ca(a.nextSibling),no=t,ao=!0,oo=null,null!==e&&(qa[Ya++]=Qa,qa[Ya++]=Za,qa[Ya++]=Ka,Qa=e.id,Za=e.overflow,Ka=t),t=Fl(t,r.children),t.flags|=4096,t)}(e,t,s,a,r,i,n);if(l){l=a.fallback,s=t.mode,r=(i=e.child).sibling;var c={mode:"hidden",children:a.children};return 0==(1&s)&&t.child!==i?((a=t.child).childLanes=0,a.pendingProps=c,t.deletions=null):(a=jc(i,c)).subtreeFlags=14680064&i.subtreeFlags,null!==r?l=jc(r,l):(l=Mc(l,s,n,null)).flags|=2,l.return=t,a.return=t,a.sibling=l,t.child=a,a=l,l=t.child,s=null===(s=e.child.memoizedState)?Il(n):{baseLanes:s.baseLanes|n,cachePool:null,transitions:s.transitions},l.memoizedState=s,l.childLanes=e.childLanes&~n,t.memoizedState=Ml,a}return e=(l=e.child).sibling,a=jc(l,{mode:"visible",children:a.children}),0==(1&t.mode)&&(a.lanes=n),a.return=t,a.sibling=null,null!==e&&(null===(n=t.deletions)?(t.deletions=[e],t.flags|=16):n.push(e)),t.child=a,t.memoizedState=null,a}function Fl(e,t){return(t=Ic({mode:"visible",children:t},e.mode,0,null)).return=e,e.child=t}function zl(e,t,n,r){return null!==r&&go(r),ko(t,e.child,null,n),(e=Fl(t,t.pendingProps.children)).flags|=2,t.memoizedState=null,e}function $l(e,t,n){e.lanes|=t;var r=e.alternate;null!==r&&(r.lanes|=t),Lo(e.return,t,n)}function Bl(e,t,n,r,a){var o=e.memoizedState;null===o?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:a}:(o.isBackwards=t,o.rendering=null,o.renderingStartTime=0,o.last=r,o.tail=n,o.tailMode=a)}function Ul(e,t,n){var r=t.pendingProps,a=r.revealOrder,o=r.tail;if(wl(e,t,r.children,n),0!=(2&(r=ei.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&&$l(e,n,t);else if(19===e.tag)$l(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(Ca(ei,r),0==(1&t.mode))t.memoizedState=null;else switch(a){case"forwards":for(n=t.child,a=null;null!==n;)null!==(e=n.alternate)&&null===ti(e)&&(a=n),n=n.sibling;null===(n=a)?(a=t.child,t.child=null):(a=n.sibling,n.sibling=null),Bl(t,!1,a,n,o);break;case"backwards":for(n=null,a=t.child,t.child=null;null!==a;){if(null!==(e=a.alternate)&&null===ti(e)){t.child=a;break}e=a.sibling,a.sibling=n,n=a,a=e}Bl(t,!0,n,null,o);break;case"together":Bl(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 Vl(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),Is|=t.lanes,0==(n&t.childLanes))return null;if(null!==e&&t.child!==e.child)throw Error(o(153));if(null!==t.child){for(n=jc(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=jc(e,e.pendingProps)).return=t;n.sibling=null}return t.child}function Wl(e,t){if(!ao)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 Gl(e){var t=null!==e.alternate&&e.alternate.child===e.child,n=0,r=0;if(t)for(var a=e.child;null!==a;)n|=a.lanes|a.childLanes,r|=14680064&a.subtreeFlags,r|=14680064&a.flags,a.return=e,a=a.sibling;else for(a=e.child;null!==a;)n|=a.lanes|a.childLanes,r|=a.subtreeFlags,r|=a.flags,a.return=e,a=a.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function ql(e,t,n){var r=t.pendingProps;switch(to(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Gl(t),null;case 1:case 17:return Oa(t.type)&&ja(),Gl(t),null;case 3:return r=t.stateNode,Zo(),Ea(La),Ea(Ta),ri(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),null!==e&&null!==e.child||(fo(t)?t.flags|=4:null===e||e.memoizedState.isDehydrated&&0==(256&t.flags)||(t.flags|=1024,null!==oo&&(ic(oo),oo=null))),Ol(e,t),Gl(t),null;case 5:Jo(t);var a=Ko(Yo.current);if(n=t.type,null!==e&&null!=t.stateNode)jl(e,t,n,r,a),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!r){if(null===t.stateNode)throw Error(o(166));return Gl(t),null}if(e=Ko(Go.current),fo(t)){r=t.stateNode,n=t.type;var i=t.memoizedProps;switch(r[fa]=t,r[pa]=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(a=0;a<Mr.length;a++)zr(Mr[a],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":Q(r,i),zr("invalid",r);break;case"select":r._wrapperState={wasMultiple:!!i.multiple},zr("invalid",r);break;case"textarea":ae(r,i),zr("invalid",r)}for(var s in ye(n,i),a=null,i)if(i.hasOwnProperty(s)){var c=i[s];"children"===s?"string"==typeof c?r.textContent!==c&&(!0!==i.suppressHydrationWarning&&Xr(r.textContent,c,e),a=["children",c]):"number"==typeof c&&r.textContent!==""+c&&(!0!==i.suppressHydrationWarning&&Xr(r.textContent,c,e),a=["children",""+c]):l.hasOwnProperty(s)&&null!=c&&"onScroll"===s&&zr("scroll",r)}switch(n){case"input":G(r),J(r,i,!0);break;case"textarea":G(r),ie(r);break;case"select":case"option":break;default:"function"==typeof i.onClick&&(r.onclick=Jr)}r=a,t.updateQueue=r,null!==r&&(t.flags|=4)}else{s=9===a.nodeType?a:a.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[fa]=t,e[pa]=r,Nl(e,t,!1,!1),t.stateNode=e;e:{switch(s=ve(n,r),n){case"dialog":zr("cancel",e),zr("close",e),a=r;break;case"iframe":case"object":case"embed":zr("load",e),a=r;break;case"video":case"audio":for(a=0;a<Mr.length;a++)zr(Mr[a],e);a=r;break;case"source":zr("error",e),a=r;break;case"img":case"image":case"link":zr("error",e),zr("load",e),a=r;break;case"details":zr("toggle",e),a=r;break;case"input":Q(e,r),a=K(e,r),zr("invalid",e);break;case"option":default:a=r;break;case"select":e._wrapperState={wasMultiple:!!r.multiple},a=D({},r,{value:void 0}),zr("invalid",e);break;case"textarea":ae(e,r),a=re(e,r),zr("invalid",e)}for(i in ye(n,a),c=a)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)&&fe(e,u):"number"==typeof u&&fe(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":G(e),J(e,r,!1);break;case"textarea":G(e),ie(e);break;case"option":null!=r.value&&e.setAttribute("value",""+V(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 a.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 Gl(t),null;case 6:if(e&&null!=t.stateNode)Pl(e,t,e.memoizedProps,r);else{if("string"!=typeof r&&null===t.stateNode)throw Error(o(166));if(n=Ko(Yo.current),Ko(Go.current),fo(t)){if(r=t.stateNode,n=t.memoizedProps,r[fa]=t,(i=r.nodeValue!==n)&&null!==(e=no))switch(e.tag){case 3:Xr(r.nodeValue,n,0!=(1&e.mode));break;case 5:!0!==e.memoizedProps.suppressHydrationWarning&&Xr(r.nodeValue,n,0!=(1&e.mode))}i&&(t.flags|=4)}else(r=(9===n.nodeType?n:n.ownerDocument).createTextNode(r))[fa]=t,t.stateNode=r}return Gl(t),null;case 13:if(Ea(ei),r=t.memoizedState,null===e||null!==e.memoizedState&&null!==e.memoizedState.dehydrated){if(ao&&null!==ro&&0!=(1&t.mode)&&0==(128&t.flags))po(),mo(),t.flags|=98560,i=!1;else if(i=fo(t),null!==r&&null!==r.dehydrated){if(null===e){if(!i)throw Error(o(318));if(!(i=null!==(i=t.memoizedState)?i.dehydrated:null))throw Error(o(317));i[fa]=t}else mo(),0==(128&t.flags)&&(t.memoizedState=null),t.flags|=4;Gl(t),i=!1}else null!==oo&&(ic(oo),oo=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&ei.current)?0===Ps&&(Ps=3):gc())),null!==t.updateQueue&&(t.flags|=4),Gl(t),null);case 4:return Zo(),Ol(e,t),null===e&&Ur(t.stateNode.containerInfo),Gl(t),null;case 10:return To(t.type._context),Gl(t),null;case 19:if(Ea(ei),null===(i=t.memoizedState))return Gl(t),null;if(r=0!=(128&t.flags),null===(s=i.rendering))if(r)Wl(i,!1);else{if(0!==Ps||null!==e&&0!=(128&e.flags))for(e=t.child;null!==e;){if(null!==(s=ti(e))){for(t.flags|=128,Wl(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 Ca(ei,1&ei.current|2),t.child}e=e.sibling}null!==i.tail&&Ze()>Us&&(t.flags|=128,r=!0,Wl(i,!1),t.lanes=4194304)}else{if(!r)if(null!==(e=ti(s))){if(t.flags|=128,r=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),Wl(i,!0),null===i.tail&&"hidden"===i.tailMode&&!s.alternate&&!ao)return Gl(t),null}else 2*Ze()-i.renderingStartTime>Us&&1073741824!==n&&(t.flags|=128,r=!0,Wl(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=Ze(),t.sibling=null,n=ei.current,Ca(ei,r?1&n|2:1&n),t):(Gl(t),null);case 22:case 23:return dc(),r=null!==t.memoizedState,null!==e&&null!==e.memoizedState!==r&&(t.flags|=8192),r&&0!=(1&t.mode)?0!=(1073741824&Os)&&(Gl(t),6&t.subtreeFlags&&(t.flags|=8192)):Gl(t),null;case 24:case 25:return null}throw Error(o(156,t.tag))}function Yl(e,t){switch(to(t),t.tag){case 1:return Oa(t.type)&&ja(),65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 3:return Zo(),Ea(La),Ea(Ta),ri(),0!=(65536&(e=t.flags))&&0==(128&e)?(t.flags=-65537&e|128,t):null;case 5:return Jo(t),null;case 13:if(Ea(ei),null!==(e=t.memoizedState)&&null!==e.dehydrated){if(null===t.alternate)throw Error(o(340));mo()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 19:return Ea(ei),null;case 4:return Zo(),null;case 10:return To(t.type._context),null;case 22:case 23:return dc(),null;default:return null}}Nl=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}},Ol=function(){},jl=function(e,t,n,r){var a=e.memoizedProps;if(a!==r){e=t.stateNode,Ko(Go.current);var o,i=null;switch(n){case"input":a=K(e,a),r=K(e,r),i=[];break;case"select":a=D({},a,{value:void 0}),r=D({},r,{value:void 0}),i=[];break;case"textarea":a=re(e,a),r=re(e,r),i=[];break;default:"function"!=typeof a.onClick&&"function"==typeof r.onClick&&(e.onclick=Jr)}for(u in ye(n,r),n=null,a)if(!r.hasOwnProperty(u)&&a.hasOwnProperty(u)&&null!=a[u])if("style"===u){var s=a[u];for(o in s)s.hasOwnProperty(o)&&(n||(n={}),n[o]="")}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!=a?a[u]:void 0,r.hasOwnProperty(u)&&c!==s&&(null!=c||null!=s))if("style"===u)if(s){for(o in s)!s.hasOwnProperty(o)||c&&c.hasOwnProperty(o)||(n||(n={}),n[o]="");for(o in c)c.hasOwnProperty(o)&&s[o]!==c[o]&&(n||(n={}),n[o]=c[o])}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)}},Pl=function(e,t,n,r){n!==r&&(t.flags|=4)};var Kl=!1,Ql=!1,Zl="function"==typeof WeakSet?WeakSet:Set,Xl=null;function Jl(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 es(e,t,n){try{n()}catch(r){_c(e,t,r)}}var ts=!1;function ns(e,t,n){var r=t.updateQueue;if(null!==(r=null!==r?r.lastEffect:null)){var a=r=r.next;do{if((a.tag&e)===e){var o=a.destroy;a.destroy=void 0,void 0!==o&&es(t,n,o)}a=a.next}while(a!==r)}}function rs(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 os(e){var t=e.alternate;null!==t&&(e.alternate=null,os(t)),e.child=null,e.deletions=null,e.sibling=null,5===e.tag&&(null!==(t=e.stateNode)&&(delete t[fa],delete t[pa],delete t[ga],delete t[ha],delete t[ba])),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 is(e){return 5===e.tag||3===e.tag||4===e.tag}function ls(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||is(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 ss(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(ss(e,t,n),e=e.sibling;null!==e;)ss(e,t,n),e=e.sibling}function cs(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(cs(e,t,n),e=e.sibling;null!==e;)cs(e,t,n),e=e.sibling}var us=null,ds=!1;function fs(e,t,n){for(n=n.child;null!==n;)ps(e,t,n),n=n.sibling}function ps(e,t,n){if(ot&&"function"==typeof ot.onCommitFiberUnmount)try{ot.onCommitFiberUnmount(at,n)}catch(l){}switch(n.tag){case 5:Ql||Jl(n,t);case 6:var r=us,a=ds;us=null,fs(e,t,n),ds=a,null!==(us=r)&&(ds?(e=us,n=n.stateNode,8===e.nodeType?e.parentNode.removeChild(n):e.removeChild(n)):us.removeChild(n.stateNode));break;case 18:null!==us&&(ds?(e=us,n=n.stateNode,8===e.nodeType?sa(e.parentNode,n):1===e.nodeType&&sa(e,n),Ut(e)):sa(us,n.stateNode));break;case 4:r=us,a=ds,us=n.stateNode.containerInfo,ds=!0,fs(e,t,n),us=r,ds=a;break;case 0:case 11:case 14:case 15:if(!Ql&&(null!==(r=n.updateQueue)&&null!==(r=r.lastEffect))){a=r=r.next;do{var o=a,i=o.destroy;o=o.tag,void 0!==i&&(0!=(2&o)||0!=(4&o))&&es(n,t,i),a=a.next}while(a!==r)}fs(e,t,n);break;case 1:if(!Ql&&(Jl(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?(Ql=(r=Ql)||null!==n.memoizedState,fs(e,t,n),Ql=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=Tc.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))}))}}function gs(e,t){var n=t.deletions;if(null!==n)for(var r=0;r<n.length;r++){var a=n[r];try{var i=e,l=t,s=l;e:for(;null!==s;){switch(s.tag){case 5:us=s.stateNode,ds=!1;break e;case 3:case 4:us=s.stateNode.containerInfo,ds=!0;break e}s=s.return}if(null===us)throw Error(o(160));ps(i,l,a),us=null,ds=!1;var c=a.alternate;null!==c&&(c.return=null),a.return=null}catch(u){_c(a,t,u)}}if(12854&t.subtreeFlags)for(t=t.child;null!==t;)hs(t,e),t=t.sibling}function hs(e,t){var n=e.alternate,r=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(gs(t,e),bs(e),4&r){try{ns(3,e,e.return),rs(3,e)}catch(h){_c(e,e.return,h)}try{ns(5,e,e.return)}catch(h){_c(e,e.return,h)}}break;case 1:gs(t,e),bs(e),512&r&&null!==n&&Jl(n,n.return);break;case 5:if(gs(t,e),bs(e),512&r&&null!==n&&Jl(n,n.return),32&e.flags){var a=e.stateNode;try{fe(a,"")}catch(h){_c(e,e.return,h)}}if(4&r&&null!=(a=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&&Z(a,i),ve(s,l);var u=ve(s,i);for(l=0;l<c.length;l+=2){var d=c[l],f=c[l+1];"style"===d?he(a,f):"dangerouslySetInnerHTML"===d?de(a,f):"children"===d?fe(a,f):v(a,d,f,u)}switch(s){case"input":X(a,i);break;case"textarea":oe(a,i);break;case"select":var p=a._wrapperState.wasMultiple;a._wrapperState.wasMultiple=!!i.multiple;var m=i.value;null!=m?ne(a,!!i.multiple,m,!1):p!==!!i.multiple&&(null!=i.defaultValue?ne(a,!!i.multiple,i.defaultValue,!0):ne(a,!!i.multiple,i.multiple?[]:"",!1))}a[pa]=i}catch(h){_c(e,e.return,h)}}break;case 6:if(gs(t,e),bs(e),4&r){if(null===e.stateNode)throw Error(o(162));a=e.stateNode,i=e.memoizedProps;try{a.nodeValue=i}catch(h){_c(e,e.return,h)}}break;case 3:if(gs(t,e),bs(e),4&r&&null!==n&&n.memoizedState.isDehydrated)try{Ut(t.containerInfo)}catch(h){_c(e,e.return,h)}break;case 4:default:gs(t,e),bs(e);break;case 13:gs(t,e),bs(e),8192&(a=e.child).flags&&(i=null!==a.memoizedState,a.stateNode.isHidden=i,!i||null!==a.alternate&&null!==a.alternate.memoizedState||(Bs=Ze())),4&r&&ms(e);break;case 22:if(d=null!==n&&null!==n.memoizedState,1&e.mode?(Ql=(u=Ql)||d,gs(t,e),Ql=u):gs(t,e),bs(e),8192&r){if(u=null!==e.memoizedState,(e.stateNode.isHidden=u)&&!d&&0!=(1&e.mode))for(Xl=e,d=e.child;null!==d;){for(f=Xl=d;null!==Xl;){switch(m=(p=Xl).child,p.tag){case 0:case 11:case 14:case 15:ns(4,p,p.return);break;case 1:Jl(p,p.return);var g=p.stateNode;if("function"==typeof g.componentWillUnmount){r=p,n=p.return;try{t=r,g.props=t.memoizedProps,g.state=t.memoizedState,g.componentWillUnmount()}catch(h){_c(r,n,h)}}break;case 5:Jl(p,p.return);break;case 22:if(null!==p.memoizedState){ks(f);continue}}null!==m?(m.return=p,Xl=m):ks(f)}d=d.sibling}e:for(d=null,f=e;;){if(5===f.tag){if(null===d){d=f;try{a=f.stateNode,u?"function"==typeof(i=a.style).setProperty?i.setProperty("display","none","important"):i.display="none":(s=f.stateNode,l=null!=(c=f.memoizedProps.style)&&c.hasOwnProperty("display")?c.display:null,s.style.display=ge("display",l))}catch(h){_c(e,e.return,h)}}}else if(6===f.tag){if(null===d)try{f.stateNode.nodeValue=u?"":f.memoizedProps}catch(h){_c(e,e.return,h)}}else if((22!==f.tag&&23!==f.tag||null===f.memoizedState||f===e)&&null!==f.child){f.child.return=f,f=f.child;continue}if(f===e)break e;for(;null===f.sibling;){if(null===f.return||f.return===e)break e;d===f&&(d=null),f=f.return}d===f&&(d=null),f.sibling.return=f.return,f=f.sibling}}break;case 19:gs(t,e),bs(e),4&r&&ms(e);case 21:}}function bs(e){var t=e.flags;if(2&t){try{e:{for(var n=e.return;null!==n;){if(is(n)){var r=n;break e}n=n.return}throw Error(o(160))}switch(r.tag){case 5:var a=r.stateNode;32&r.flags&&(fe(a,""),r.flags&=-33),cs(e,ls(e),a);break;case 3:case 4:var i=r.stateNode.containerInfo;ss(e,ls(e),i);break;default:throw Error(o(161))}}catch(l){_c(e,e.return,l)}e.flags&=-3}4096&t&&(e.flags&=-4097)}function ys(e,t,n){Xl=e,vs(e,t,n)}function vs(e,t,n){for(var r=0!=(1&e.mode);null!==Xl;){var a=Xl,o=a.child;if(22===a.tag&&r){var i=null!==a.memoizedState||Kl;if(!i){var l=a.alternate,s=null!==l&&null!==l.memoizedState||Ql;l=Kl;var c=Ql;if(Kl=i,(Ql=s)&&!c)for(Xl=a;null!==Xl;)s=(i=Xl).child,22===i.tag&&null!==i.memoizedState?xs(a):null!==s?(s.return=i,Xl=s):xs(a);for(;null!==o;)Xl=o,vs(o,t,n),o=o.sibling;Xl=a,Kl=l,Ql=c}ws(e)}else 0!=(8772&a.subtreeFlags)&&null!==o?(o.return=a,Xl=o):ws(e)}}function ws(e){for(;null!==Xl;){var t=Xl;if(0!=(8772&t.flags)){var n=t.alternate;try{if(0!=(8772&t.flags))switch(t.tag){case 0:case 11:case 15:Ql||rs(5,t);break;case 1:var r=t.stateNode;if(4&t.flags&&!Ql)if(null===n)r.componentDidMount();else{var a=t.elementType===t.type?n.memoizedProps:nl(t.type,n.memoizedProps);r.componentDidUpdate(a,n.memoizedState,r.__reactInternalSnapshotBeforeUpdate)}var i=t.updateQueue;null!==i&&Vo(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}Vo(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 f=d.dehydrated;null!==f&&Ut(f)}}}break;default:throw Error(o(163))}Ql||512&t.flags&&as(t)}catch(p){_c(t,t.return,p)}}if(t===e){Xl=null;break}if(null!==(n=t.sibling)){n.return=t.return,Xl=n;break}Xl=t.return}}function ks(e){for(;null!==Xl;){var t=Xl;if(t===e){Xl=null;break}var n=t.sibling;if(null!==n){n.return=t.return,Xl=n;break}Xl=t.return}}function xs(e){for(;null!==Xl;){var t=Xl;try{switch(t.tag){case 0:case 11:case 15:var n=t.return;try{rs(4,t)}catch(s){_c(t,n,s)}break;case 1:var r=t.stateNode;if("function"==typeof r.componentDidMount){var a=t.return;try{r.componentDidMount()}catch(s){_c(t,a,s)}}var o=t.return;try{as(t)}catch(s){_c(t,o,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){Xl=null;break}var l=t.sibling;if(null!==l){l.return=t.return,Xl=l;break}Xl=t.return}}var Ss,_s=Math.ceil,Es=w.ReactCurrentDispatcher,Cs=w.ReactCurrentOwner,As=w.ReactCurrentBatchConfig,Ts=0,Ls=null,Rs=null,Ns=0,Os=0,js=_a(0),Ps=0,Ms=null,Is=0,Ds=0,Fs=0,zs=null,$s=null,Bs=0,Us=1/0,Hs=null,Vs=!1,Ws=null,Gs=null,qs=!1,Ys=null,Ks=0,Qs=0,Zs=null,Xs=-1,Js=0;function ec(){return 0!=(6&Ts)?Ze():-1!==Xs?Xs:Xs=Ze()}function tc(e){return 0==(1&e.mode)?1:0!=(2&Ts)&&0!==Ns?Ns&-Ns:null!==ho.transition?(0===Js&&(Js=gt()),Js):0!==(e=vt)?e:e=void 0===(e=window.event)?16:Qt(e.type)}function nc(e,t,n,r){if(50<Qs)throw Qs=0,Zs=null,Error(o(185));bt(e,n,r),0!=(2&Ts)&&e===Ls||(e===Ls&&(0==(2&Ts)&&(Ds|=n),4===Ps&&lc(e,Ns)),rc(e,r),1===n&&0===Ts&&0==(1&t.mode)&&(Us=Ze()+500,za&&Ua()))}function rc(e,t){var n=e.callbackNode;!function(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,a=e.expirationTimes,o=e.pendingLanes;0<o;){var i=31-it(o),l=1<<i,s=a[i];-1===s?0!=(l&n)&&0==(l&r)||(a[i]=pt(l,t)):s<=t&&(e.expiredLanes|=l),o&=~l}}(e,t);var r=ft(e,e===Ls?Ns:0);if(0===r)null!==n&&Ye(n),e.callbackNode=null,e.callbackPriority=0;else if(t=r&-r,e.callbackPriority!==t){if(null!=n&&Ye(n),1===t)0===e.tag?function(e){za=!0,Ba(e)}(sc.bind(null,e)):Ba(sc.bind(null,e)),ia((function(){0==(6&Ts)&&Ua()})),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=Lc(n,ac.bind(null,e))}e.callbackPriority=t,e.callbackNode=n}}function ac(e,t){if(Xs=-1,Js=0,0!=(6&Ts))throw Error(o(327));var n=e.callbackNode;if(xc()&&e.callbackNode!==n)return null;var r=ft(e,e===Ls?Ns:0);if(0===r)return null;if(0!=(30&r)||0!=(r&e.expiredLanes)||t)t=hc(e,r);else{t=r;var a=Ts;Ts|=2;var i=mc();for(Ls===e&&Ns===t||(Hs=null,Us=Ze()+500,fc(e,t));;)try{yc();break}catch(s){pc(e,s)}Ao(),Es.current=i,Ts=a,null!==Rs?t=0:(Ls=null,Ns=0,t=Ps)}if(0!==t){if(2===t&&(0!==(a=mt(e))&&(r=a,t=oc(e,a))),1===t)throw n=Ms,fc(e,0),lc(e,r),rc(e,Ze()),n;if(6===t)lc(e,r);else{if(a=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 a=n[r],o=a.getSnapshot;a=a.value;try{if(!lr(o(),a))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}(a)&&(2===(t=hc(e,r))&&(0!==(i=mt(e))&&(r=i,t=oc(e,i))),1===t))throw n=Ms,fc(e,0),lc(e,r),rc(e,Ze()),n;switch(e.finishedWork=a,e.finishedLanes=r,t){case 0:case 1:throw Error(o(345));case 2:case 5:kc(e,$s,Hs);break;case 3:if(lc(e,r),(130023424&r)===r&&10<(t=Bs+500-Ze())){if(0!==ft(e,0))break;if(((a=e.suspendedLanes)&r)!==r){ec(),e.pingedLanes|=e.suspendedLanes&a;break}e.timeoutHandle=ra(kc.bind(null,e,$s,Hs),t);break}kc(e,$s,Hs);break;case 4:if(lc(e,r),(4194240&r)===r)break;for(t=e.eventTimes,a=-1;0<r;){var l=31-it(r);i=1<<l,(l=t[l])>a&&(a=l),r&=~i}if(r=a,10<(r=(120>(r=Ze()-r)?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*_s(r/1960))-r)){e.timeoutHandle=ra(kc.bind(null,e,$s,Hs),r);break}kc(e,$s,Hs);break;default:throw Error(o(329))}}}return rc(e,Ze()),e.callbackNode===n?ac.bind(null,e):null}function oc(e,t){var n=zs;return e.current.memoizedState.isDehydrated&&(fc(e,t).flags|=256),2!==(e=hc(e,t))&&(t=$s,$s=n,null!==t&&ic(t)),e}function ic(e){null===$s?$s=e:$s.push.apply($s,e)}function lc(e,t){for(t&=~Fs,t&=~Ds,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 sc(e){if(0!=(6&Ts))throw Error(o(327));xc();var t=ft(e,0);if(0==(1&t))return rc(e,Ze()),null;var n=hc(e,t);if(0!==e.tag&&2===n){var r=mt(e);0!==r&&(t=r,n=oc(e,r))}if(1===n)throw n=Ms,fc(e,0),lc(e,t),rc(e,Ze()),n;if(6===n)throw Error(o(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,kc(e,$s,Hs),rc(e,Ze()),null}function cc(e,t){var n=Ts;Ts|=1;try{return e(t)}finally{0===(Ts=n)&&(Us=Ze()+500,za&&Ua())}}function uc(e){null!==Ys&&0===Ys.tag&&0==(6&Ts)&&xc();var t=Ts;Ts|=1;var n=As.transition,r=vt;try{if(As.transition=null,vt=1,e)return e()}finally{vt=r,As.transition=n,0==(6&(Ts=t))&&Ua()}}function dc(){Os=js.current,Ea(js)}function fc(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,aa(n)),null!==Rs)for(n=Rs.return;null!==n;){var r=n;switch(to(r),r.tag){case 1:null!=(r=r.type.childContextTypes)&&ja();break;case 3:Zo(),Ea(La),Ea(Ta),ri();break;case 5:Jo(r);break;case 4:Zo();break;case 13:case 19:Ea(ei);break;case 10:To(r.type._context);break;case 22:case 23:dc()}n=n.return}if(Ls=e,Rs=e=jc(e.current,null),Ns=Os=t,Ps=0,Ms=null,Fs=Ds=Is=0,$s=zs=null,null!==Oo){for(t=0;t<Oo.length;t++)if(null!==(r=(n=Oo[t]).interleaved)){n.interleaved=null;var a=r.next,o=n.pending;if(null!==o){var i=o.next;o.next=a,r.next=i}n.pending=r}Oo=null}return e}function pc(e,t){for(;;){var n=Rs;try{if(Ao(),ai.current=Xi,ui){for(var r=li.memoizedState;null!==r;){var a=r.queue;null!==a&&(a.pending=null),r=r.next}ui=!1}if(ii=0,ci=si=li=null,di=!1,fi=0,Cs.current=null,null===n||null===n.return){Ps=1,Ms=t,Rs=null;break}e:{var i=e,l=n.return,s=n,c=t;if(t=Ns,s.flags|=32768,null!==c&&"object"==typeof c&&"function"==typeof c.then){var u=c,d=s,f=d.tag;if(0==(1&d.mode)&&(0===f||11===f||15===f)){var p=d.alternate;p?(d.updateQueue=p.updateQueue,d.memoizedState=p.memoizedState,d.lanes=p.lanes):(d.updateQueue=null,d.memoizedState=null)}var m=hl(l);if(null!==m){m.flags&=-257,bl(m,l,s,0,t),1&m.mode&&gl(i,u,t),c=u;var g=(t=m).updateQueue;if(null===g){var h=new Set;h.add(c),t.updateQueue=h}else g.add(c);break e}if(0==(1&t)){gl(i,u,t),gc();break e}c=Error(o(426))}else if(ao&&1&s.mode){var b=hl(l);if(null!==b){0==(65536&b.flags)&&(b.flags|=256),bl(b,l,s,0,t),go(cl(c,s));break e}}i=c=cl(c,s),4!==Ps&&(Ps=2),null===zs?zs=[i]:zs.push(i),i=l;do{switch(i.tag){case 3:i.flags|=65536,t&=-t,i.lanes|=t,Uo(i,pl(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===Gs||!Gs.has(v)))){i.flags|=65536,t&=-t,i.lanes|=t,Uo(i,ml(i,s,t));break e}}i=i.return}while(null!==i)}wc(n)}catch(w){t=w,Rs===n&&null!==n&&(Rs=n=n.return);continue}break}}function mc(){var e=Es.current;return Es.current=Xi,null===e?Xi:e}function gc(){0!==Ps&&3!==Ps&&2!==Ps||(Ps=4),null===Ls||0==(268435455&Is)&&0==(268435455&Ds)||lc(Ls,Ns)}function hc(e,t){var n=Ts;Ts|=2;var r=mc();for(Ls===e&&Ns===t||(Hs=null,fc(e,t));;)try{bc();break}catch(a){pc(e,a)}if(Ao(),Ts=n,Es.current=r,null!==Rs)throw Error(o(261));return Ls=null,Ns=0,Ps}function bc(){for(;null!==Rs;)vc(Rs)}function yc(){for(;null!==Rs&&!Ke();)vc(Rs)}function vc(e){var t=Ss(e.alternate,e,Os);e.memoizedProps=e.pendingProps,null===t?wc(e):Rs=t,Cs.current=null}function wc(e){var t=e;do{var n=t.alternate;if(e=t.return,0==(32768&t.flags)){if(null!==(n=ql(n,t,Os)))return void(Rs=n)}else{if(null!==(n=Yl(n,t)))return n.flags&=32767,void(Rs=n);if(null===e)return Ps=6,void(Rs=null);e.flags|=32768,e.subtreeFlags=0,e.deletions=null}if(null!==(t=t.sibling))return void(Rs=t);Rs=t=e}while(null!==t);0===Ps&&(Ps=5)}function kc(e,t,n){var r=vt,a=As.transition;try{As.transition=null,vt=1,function(e,t,n,r){do{xc()}while(null!==Ys);if(0!=(6&Ts))throw Error(o(327));n=e.finishedWork;var a=e.finishedLanes;if(null===n)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(o(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 a=31-it(n),o=1<<a;t[a]=0,r[a]=-1,e[a]=-1,n&=~o}}(e,i),e===Ls&&(Rs=Ls=null,Ns=0),0==(2064&n.subtreeFlags)&&0==(2064&n.flags)||qs||(qs=!0,Lc(tt,(function(){return xc(),null}))),i=0!=(15990&n.flags),0!=(15990&n.subtreeFlags)||i){i=As.transition,As.transition=null;var l=vt;vt=1;var s=Ts;Ts|=4,Cs.current=null,function(e,t){if(ea=Vt,pr(e=fr())){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 a=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,f=e,p=null;t:for(;;){for(var m;f!==n||0!==a&&3!==f.nodeType||(s=l+a),f!==i||0!==r&&3!==f.nodeType||(c=l+r),3===f.nodeType&&(l+=f.nodeValue.length),null!==(m=f.firstChild);)p=f,f=m;for(;;){if(f===e)break t;if(p===n&&++u===a&&(s=l),p===i&&++d===r&&(c=l),null!==(m=f.nextSibling))break;p=(f=p).parentNode}f=m}n=-1===s||-1===c?null:{start:s,end:c}}else n=null}n=n||{start:0,end:0}}else n=null;for(ta={focusedElem:e,selectionRange:n},Vt=!1,Xl=t;null!==Xl;)if(e=(t=Xl).child,0!=(1028&t.subtreeFlags)&&null!==e)e.return=t,Xl=e;else for(;null!==Xl;){t=Xl;try{var g=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!==g){var h=g.memoizedProps,b=g.memoizedState,y=t.stateNode,v=y.getSnapshotBeforeUpdate(t.elementType===t.type?h:nl(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(o(163))}}catch(k){_c(t,t.return,k)}if(null!==(e=t.sibling)){e.return=t.return,Xl=e;break}Xl=t.return}g=ts,ts=!1}(e,n),hs(n,e),mr(ta),Vt=!!ea,ta=ea=null,e.current=n,ys(n,e,a),Qe(),Ts=s,vt=l,As.transition=i}else e.current=n;if(qs&&(qs=!1,Ys=e,Ks=a),i=e.pendingLanes,0===i&&(Gs=null),function(e){if(ot&&"function"==typeof ot.onCommitFiberRoot)try{ot.onCommitFiberRoot(at,e,void 0,128==(128&e.current.flags))}catch(t){}}(n.stateNode),rc(e,Ze()),null!==t)for(r=e.onRecoverableError,n=0;n<t.length;n++)a=t[n],r(a.value,{componentStack:a.stack,digest:a.digest});if(Vs)throw Vs=!1,e=Ws,Ws=null,e;0!=(1&Ks)&&0!==e.tag&&xc(),i=e.pendingLanes,0!=(1&i)?e===Zs?Qs++:(Qs=0,Zs=e):Qs=0,Ua()}(e,t,n,r)}finally{As.transition=a,vt=r}return null}function xc(){if(null!==Ys){var e=wt(Ks),t=As.transition,n=vt;try{if(As.transition=null,vt=16>e?16:e,null===Ys)var r=!1;else{if(e=Ys,Ys=null,Ks=0,0!=(6&Ts))throw Error(o(331));var a=Ts;for(Ts|=4,Xl=e.current;null!==Xl;){var i=Xl,l=i.child;if(0!=(16&Xl.flags)){var s=i.deletions;if(null!==s){for(var c=0;c<s.length;c++){var u=s[c];for(Xl=u;null!==Xl;){var d=Xl;switch(d.tag){case 0:case 11:case 15:ns(8,d,i)}var f=d.child;if(null!==f)f.return=d,Xl=f;else for(;null!==Xl;){var p=(d=Xl).sibling,m=d.return;if(os(d),d===u){Xl=null;break}if(null!==p){p.return=m,Xl=p;break}Xl=m}}}var g=i.alternate;if(null!==g){var h=g.child;if(null!==h){g.child=null;do{var b=h.sibling;h.sibling=null,h=b}while(null!==h)}}Xl=i}}if(0!=(2064&i.subtreeFlags)&&null!==l)l.return=i,Xl=l;else e:for(;null!==Xl;){if(0!=(2048&(i=Xl).flags))switch(i.tag){case 0:case 11:case 15:ns(9,i,i.return)}var y=i.sibling;if(null!==y){y.return=i.return,Xl=y;break e}Xl=i.return}}var v=e.current;for(Xl=v;null!==Xl;){var w=(l=Xl).child;if(0!=(2064&l.subtreeFlags)&&null!==w)w.return=l,Xl=w;else e:for(l=v;null!==Xl;){if(0!=(2048&(s=Xl).flags))try{switch(s.tag){case 0:case 11:case 15:rs(9,s)}}catch(x){_c(s,s.return,x)}if(s===l){Xl=null;break e}var k=s.sibling;if(null!==k){k.return=s.return,Xl=k;break e}Xl=s.return}}if(Ts=a,Ua(),ot&&"function"==typeof ot.onPostCommitFiberRoot)try{ot.onPostCommitFiberRoot(at,e)}catch(x){}r=!0}return r}finally{vt=n,As.transition=t}}return!1}function Sc(e,t,n){e=$o(e,t=pl(0,t=cl(n,t),1),1),t=ec(),null!==e&&(bt(e,1,t),rc(e,t))}function _c(e,t,n){if(3===e.tag)Sc(e,e,n);else for(;null!==t;){if(3===t.tag){Sc(t,e,n);break}if(1===t.tag){var r=t.stateNode;if("function"==typeof t.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===Gs||!Gs.has(r))){t=$o(t,e=ml(t,e=cl(n,e),1),1),e=ec(),null!==t&&(bt(t,1,e),rc(t,e));break}}t=t.return}}function Ec(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),t=ec(),e.pingedLanes|=e.suspendedLanes&n,Ls===e&&(Ns&n)===n&&(4===Ps||3===Ps&&(130023424&Ns)===Ns&&500>Ze()-Bs?fc(e,0):Fs|=n),rc(e,t)}function Cc(e,t){0===t&&(0==(1&e.mode)?t=1:(t=ut,0==(130023424&(ut<<=1))&&(ut=4194304)));var n=ec();null!==(e=Mo(e,t))&&(bt(e,t,n),rc(e,n))}function Ac(e){var t=e.memoizedState,n=0;null!==t&&(n=t.retryLane),Cc(e,n)}function Tc(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,a=e.memoizedState;null!==a&&(n=a.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(o(314))}null!==r&&r.delete(t),Cc(e,n)}function Lc(e,t){return qe(e,t)}function Rc(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 Nc(e,t,n,r){return new Rc(e,t,n,r)}function Oc(e){return!(!(e=e.prototype)||!e.isReactComponent)}function jc(e,t){var n=e.alternate;return null===n?((n=Nc(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 Pc(e,t,n,r,a,i){var l=2;if(r=e,"function"==typeof e)Oc(e)&&(l=1);else if("string"==typeof e)l=5;else e:switch(e){case S:return Mc(n.children,a,i,t);case _:l=8,a|=8;break;case E:return(e=Nc(12,n,t,2|a)).elementType=E,e.lanes=i,e;case L:return(e=Nc(13,n,t,a)).elementType=L,e.lanes=i,e;case R:return(e=Nc(19,n,t,a)).elementType=R,e.lanes=i,e;case j:return Ic(n,a,i,t);default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case C:l=10;break e;case A:l=9;break e;case T:l=11;break e;case N:l=14;break e;case O:l=16,r=null;break e}throw Error(o(130,null==e?e:typeof e,""))}return(t=Nc(l,n,t,a)).elementType=e,t.type=r,t.lanes=i,t}function Mc(e,t,n,r){return(e=Nc(7,e,r,t)).lanes=n,e}function Ic(e,t,n,r){return(e=Nc(22,e,r,t)).elementType=j,e.lanes=n,e.stateNode={isHidden:!1},e}function Dc(e,t,n){return(e=Nc(6,e,null,t)).lanes=n,e}function Fc(e,t,n){return(t=Nc(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function zc(e,t,n,r,a){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=a,this.mutableSourceEagerHydrationData=null}function $c(e,t,n,r,a,o,i,l,s){return e=new zc(e,t,n,l,s),1===t?(t=1,!0===o&&(t|=8)):t=0,o=Nc(3,null,null,t),e.current=o,o.stateNode=e,o.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Do(o),e}function Bc(e){if(!e)return Aa;e:{if(Ue(e=e._reactInternals)!==e||1!==e.tag)throw Error(o(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(Oa(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(null!==t);throw Error(o(171))}if(1===e.tag){var n=e.type;if(Oa(n))return Ma(e,n,t)}return t}function Uc(e,t,n,r,a,o,i,l,s){return(e=$c(n,r,!0,e,0,o,0,l,s)).context=Bc(null),n=e.current,(o=zo(r=ec(),a=tc(n))).callback=null!=t?t:null,$o(n,o,a),e.current.lanes=a,bt(e,a,r),rc(e,r),e}function Hc(e,t,n,r){var a=t.current,o=ec(),i=tc(a);return n=Bc(n),null===t.context?t.context=n:t.pendingContext=n,(t=zo(o,i)).payload={element:e},null!==(r=void 0===r?null:r)&&(t.callback=r),null!==(e=$o(a,t,i))&&(nc(e,a,i,o),Bo(e,a,i)),i}function Vc(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function Wc(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function Gc(e,t){Wc(e,t),(e=e.alternate)&&Wc(e,t)}Ss=function(e,t,n){if(null!==e)if(e.memoizedProps!==t.pendingProps||La.current)vl=!0;else{if(0==(e.lanes&n)&&0==(128&t.flags))return vl=!1,function(e,t,n){switch(t.tag){case 3:Ll(t),mo();break;case 5:Xo(t);break;case 1:Oa(t.type)&&Ia(t);break;case 4:Qo(t,t.stateNode.containerInfo);break;case 10:var r=t.type._context,a=t.memoizedProps.value;Ca(So,r._currentValue),r._currentValue=a;break;case 13:if(null!==(r=t.memoizedState))return null!==r.dehydrated?(Ca(ei,1&ei.current),t.flags|=128,null):0!=(n&t.child.childLanes)?Dl(e,t,n):(Ca(ei,1&ei.current),null!==(e=Vl(e,t,n))?e.sibling:null);Ca(ei,1&ei.current);break;case 19:if(r=0!=(n&t.childLanes),0!=(128&e.flags)){if(r)return Ul(e,t,n);t.flags|=128}if(null!==(a=t.memoizedState)&&(a.rendering=null,a.tail=null,a.lastEffect=null),Ca(ei,ei.current),r)break;return null;case 22:case 23:return t.lanes=0,_l(e,t,n)}return Vl(e,t,n)}(e,t,n);vl=0!=(131072&e.flags)}else vl=!1,ao&&0!=(1048576&t.flags)&&Ja(t,Ga,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;Hl(e,t),e=t.pendingProps;var a=Na(t,Ta.current);Ro(t,n),a=hi(null,t,r,e,a,n);var i=bi();return t.flags|=1,"object"==typeof a&&null!==a&&"function"==typeof a.render&&void 0===a.$$typeof?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Oa(r)?(i=!0,Ia(t)):i=!1,t.memoizedState=null!==a.state&&void 0!==a.state?a.state:null,Do(t),a.updater=al,t.stateNode=a,a._reactInternals=t,sl(t,r,e,n),t=Tl(null,t,r,!0,i,n)):(t.tag=0,ao&&i&&eo(t),wl(null,t,a,n),t=t.child),t;case 16:r=t.elementType;e:{switch(Hl(e,t),e=t.pendingProps,r=(a=r._init)(r._payload),t.type=r,a=t.tag=function(e){if("function"==typeof e)return Oc(e)?1:0;if(null!=e){if((e=e.$$typeof)===T)return 11;if(e===N)return 14}return 2}(r),e=nl(r,e),a){case 0:t=Cl(null,t,r,e,n);break e;case 1:t=Al(null,t,r,e,n);break e;case 11:t=kl(null,t,r,e,n);break e;case 14:t=xl(null,t,r,nl(r.type,e),n);break e}throw Error(o(306,r,""))}return t;case 0:return r=t.type,a=t.pendingProps,Cl(e,t,r,a=t.elementType===r?a:nl(r,a),n);case 1:return r=t.type,a=t.pendingProps,Al(e,t,r,a=t.elementType===r?a:nl(r,a),n);case 3:e:{if(Ll(t),null===e)throw Error(o(387));r=t.pendingProps,a=(i=t.memoizedState).element,Fo(e,t),Ho(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=Rl(e,t,r,n,a=cl(Error(o(423)),t));break e}if(r!==a){t=Rl(e,t,r,n,a=cl(Error(o(424)),t));break e}for(ro=ca(t.stateNode.containerInfo.firstChild),no=t,ao=!0,oo=null,n=xo(t,null,r,n),t.child=n;n;)n.flags=-3&n.flags|4096,n=n.sibling}else{if(mo(),r===a){t=Vl(e,t,n);break e}wl(e,t,r,n)}t=t.child}return t;case 5:return Xo(t),null===e&&co(t),r=t.type,a=t.pendingProps,i=null!==e?e.memoizedProps:null,l=a.children,na(r,a)?l=null:null!==i&&na(r,i)&&(t.flags|=32),El(e,t),wl(e,t,l,n),t.child;case 6:return null===e&&co(t),null;case 13:return Dl(e,t,n);case 4:return Qo(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=ko(t,null,r,n):wl(e,t,r,n),t.child;case 11:return r=t.type,a=t.pendingProps,kl(e,t,r,a=t.elementType===r?a:nl(r,a),n);case 7:return wl(e,t,t.pendingProps,n),t.child;case 8:case 12:return wl(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,a=t.pendingProps,i=t.memoizedProps,l=a.value,Ca(So,r._currentValue),r._currentValue=l,null!==i)if(lr(i.value,l)){if(i.children===a.children&&!La.current){t=Vl(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=zo(-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),Lo(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(o(341));l.lanes|=n,null!==(s=l.alternate)&&(s.lanes|=n),Lo(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}wl(e,t,a.children,n),t=t.child}return t;case 9:return a=t.type,r=t.pendingProps.children,Ro(t,n),r=r(a=No(a)),t.flags|=1,wl(e,t,r,n),t.child;case 14:return a=nl(r=t.type,t.pendingProps),xl(e,t,r,a=nl(r.type,a),n);case 15:return Sl(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:nl(r,a),Hl(e,t),t.tag=1,Oa(r)?(e=!0,Ia(t)):e=!1,Ro(t,n),il(t,r,a),sl(t,r,a,n),Tl(null,t,r,!0,e,n);case 19:return Ul(e,t,n);case 22:return _l(e,t,n)}throw Error(o(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 Qc(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 Xc(){}function Jc(e,t,n,r,a){var o=n._reactRootContainer;if(o){var i=o;if("function"==typeof a){var l=a;a=function(){var e=Vc(i);l.call(e)}}Hc(t,i,e,a)}else i=function(e,t,n,r,a){if(a){if("function"==typeof r){var o=r;r=function(){var e=Vc(i);o.call(e)}}var i=Uc(t,r,e,0,null,!1,0,"",Xc);return e._reactRootContainer=i,e[ma]=i.current,Ur(8===e.nodeType?e.parentNode:e),uc(),i}for(;a=e.lastChild;)e.removeChild(a);if("function"==typeof r){var l=r;r=function(){var e=Vc(s);l.call(e)}}var s=$c(e,0,!1,null,0,!1,0,"",Xc);return e._reactRootContainer=s,e[ma]=s.current,Ur(8===e.nodeType?e.parentNode:e),uc((function(){Hc(t,s,n,r)})),s}(n,t,e,a,r);return Vc(i)}Kc.prototype.render=Yc.prototype.render=function(e){var t=this._internalRoot;if(null===t)throw Error(o(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;uc((function(){Hc(null,e,null,null)})),t[ma]=null}},Kc.prototype.unstable_scheduleHydration=function(e){if(e){var t=_t();e={blockedOn:null,target:e,priority:t};for(var n=0;n<jt.length&&0!==t&&t<jt[n].priority;n++);jt.splice(n,0,e),0===n&&Dt(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),rc(t,Ze()),0==(6&Ts)&&(Us=Ze()+500,Ua()))}break;case 13:uc((function(){var t=Mo(e,1);if(null!==t){var n=ec();nc(t,e,1,n)}})),Gc(e,1)}},xt=function(e){if(13===e.tag){var t=Mo(e,134217728);if(null!==t)nc(t,e,134217728,ec());Gc(e,134217728)}},St=function(e){if(13===e.tag){var t=tc(e),n=Mo(e,t);if(null!==n)nc(n,e,t,ec());Gc(e,t)}},_t=function(){return vt},Et=function(e,t){var n=vt;try{return vt=e,t()}finally{vt=n}},xe=function(e,t,n){switch(t){case"input":if(X(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 a=ka(r);if(!a)throw Error(o(90));q(r),X(r,a)}}}break;case"textarea":oe(e,n);break;case"select":null!=(t=n.value)&&ne(e,!!n.multiple,t,!1)}},Te=cc,Le=uc;var eu={usingClientEntryPoint:!1,Events:[va,wa,ka,Ce,Ae,cc]},tu={findFiberByHostInstance:ya,bundleType:0,version:"18.3.1",rendererPackageName:"react-dom"},nu={bundleType:tu.bundleType,version:tu.version,rendererPackageName:tu.rendererPackageName,rendererConfig:tu.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=We(e))?null:e.stateNode},findFiberByHostInstance:tu.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.3.1-next-f1338f8080-20240426"};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var ru=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!ru.isDisabled&&ru.supportsFiber)try{at=ru.inject(nu),ot=ru}catch(ue){}}t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=eu,t.createPortal=function(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!Qc(t))throw Error(o(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(!Qc(e))throw Error(o(299));var n=!1,r="",a=qc;return null!=t&&(!0===t.unstable_strictMode&&(n=!0),void 0!==t.identifierPrefix&&(r=t.identifierPrefix),void 0!==t.onRecoverableError&&(a=t.onRecoverableError)),t=$c(e,1,!1,null,0,n,0,r,a),e[ma]=t.current,Ur(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(o(188));throw e=Object.keys(e).join(","),Error(o(268,e))}return e=null===(e=We(t))?null:e.stateNode},t.flushSync=function(e){return uc(e)},t.hydrate=function(e,t,n){if(!Zc(t))throw Error(o(200));return Jc(null,e,t,!0,n)},t.hydrateRoot=function(e,t,n){if(!Qc(e))throw Error(o(405));var r=null!=n&&n.hydratedSources||null,a=!1,i="",l=qc;if(null!=n&&(!0===n.unstable_strictMode&&(a=!0),void 0!==n.identifierPrefix&&(i=n.identifierPrefix),void 0!==n.onRecoverableError&&(l=n.onRecoverableError)),t=Uc(t,null,e,1,null!=n?n:null,a,0,i,l),e[ma]=t.current,Ur(e),r)for(e=0;e<r.length;e++)a=(a=(n=r[e])._getVersion)(n._source),null==t.mutableSourceEagerHydrationData?t.mutableSourceEagerHydrationData=[n,a]:t.mutableSourceEagerHydrationData.push(n,a);return new Kc(t)},t.render=function(e,t,n){if(!Zc(t))throw Error(o(200));return Jc(null,e,t,!1,n)},t.unmountComponentAtNode=function(e){if(!Zc(e))throw Error(o(40));return!!e._reactRootContainer&&(uc((function(){Jc(null,null,e,!1,(function(){e._reactRootContainer=null,e[ma]=null}))})),!0)},t.unstable_batchedUpdates=cc,t.unstable_renderSubtreeIntoContainer=function(e,t,n,r){if(!Zc(n))throw Error(o(200));if(null==e||void 0===e._reactInternals)throw Error(o(38));return Jc(e,t,n,!1,r)},t.version="18.3.1-next-f1338f8080-20240426"},5338:(e,t,n)=>{"use strict";var r=n(961);t.createRoot=r.createRoot,t.hydrateRoot=r.hydrateRoot},961:(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(2551)},115:e=>{var t="undefined"!=typeof Element,n="function"==typeof Map,r="function"==typeof Set,a="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function o(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(!o(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(!o(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(a&&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)&&!o(e[c[s]],i[c[s]]))return!1;return!0}return e!=e&&i!=i}e.exports=function(e,t){try{return o(e,t)}catch(n){if((n.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw n}}},545:(e,t,n)=>{"use strict";n.d(t,{mg:()=>J,vd:()=>W});var r=n(6540),a=n(5556),o=n.n(a),i=n(115),l=n.n(i),s=n(311),c=n.n(s),u=n(2833),d=n.n(u);function f(){return f=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},f.apply(this,arguments)}function p(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,m(e,t)}function m(e,t){return m=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},m(e,t)}function g(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)t.indexOf(n=o[r])>=0||(a[n]=e[n]);return a}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},_=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},E=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 f({},e,t)}),{})},A=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),a=0;a<r.length;a+=1){var o=r[a].toLowerCase();if(-1!==e.indexOf(o)&&n[o])return t.concat(n)}return t}),[])},T=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 a={};n.filter((function(e){for(var n,o=Object.keys(e),i=0;i<o.length;i+=1){var l=o[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]={}),a[n]||(a[n]={}),!r[n][c]&&(a[n][c]=!0,!0)})).reverse().forEach((function(t){return e.push(t)}));for(var o=Object.keys(a),i=0;i<o.length;i+=1){var l=o[i],s=f({},r[l],a[l]);r[l]=s}return e}),[]).reverse()},L=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},R=function(e){return Array.isArray(e)?e.join(""):e},N=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}},O=function(e,t){var n;return f({},e,((n={})[t]=void 0,n))},j=[h.NOSCRIPT,h.SCRIPT,h.STYLE],P=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,"'")},M=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)},D=function(e,t){return t.map((function(t,n){var a,o=((a={key:n})["data-rh"]=!0,a);return Object.keys(t).forEach((function(e){var n=k[e]||e;"innerHTML"===n||"cssText"===n?o.dangerouslySetInnerHTML={__html:t.innerHTML||t.cssText}:o[n]=t[e]})),r.createElement(e,o)}))},F=function(e,t,n){switch(e){case h.TITLE:return{toComponent:function(){return n=t.titleAttributes,(a={key:e=t.title})["data-rh"]=!0,o=I(n,a),[r.createElement(h.TITLE,o,e)];var e,n,a,o},toString:function(){return function(e,t,n,r){var a=M(n),o=R(t);return a?"<"+e+' data-rh="true" '+a+">"+P(o,r)+"</"+e+">":"<"+e+' data-rh="true">'+P(o,r)+"</"+e+">"}(e,t.title,t.titleAttributes,n)}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return I(t)},toString:function(){return M(t)}};default:return{toComponent:function(){return D(e,t)},toString:function(){return function(e,t,n){return t.reduce((function(t,r){var a=Object.keys(r).filter((function(e){return!("innerHTML"===e||"cssText"===e)})).reduce((function(e,t){var a=void 0===r[t]?t:t+'="'+P(r[t],n)+'"';return e?e+" "+a:a}),""),o=r.innerHTML||r.cssText||"",i=-1===j.indexOf(e);return t+"<"+e+' data-rh="true" '+a+(i?"/>":">"+o+"</"+e+">")}),"")}(e,t,n)}}}},z=function(e){var t=e.baseTag,n=e.bodyAttributes,r=e.encode,a=e.htmlAttributes,o=e.noscriptTags,i=e.styleTags,l=e.title,s=void 0===l?"":l,c=e.titleAttributes,u=e.linkTags,d=e.metaTags,f=e.scriptTags,p={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var m=function(e){var t=e.linkTags,n=e.scriptTags,r=e.encode,a=N(e.metaTags,v),o=N(t,b),i=N(n,y);return{priorityMethods:{toComponent:function(){return[].concat(D(h.META,a.priority),D(h.LINK,o.priority),D(h.SCRIPT,i.priority))},toString:function(){return F(h.META,a.priority,r)+" "+F(h.LINK,o.priority,r)+" "+F(h.SCRIPT,i.priority,r)}},metaTags:a.default,linkTags:o.default,scriptTags:i.default}}(e);p=m.priorityMethods,u=m.linkTags,d=m.metaTags,f=m.scriptTags}return{priority:p,base:F(h.BASE,t,r),bodyAttributes:F("bodyAttributes",n,r),htmlAttributes:F("htmlAttributes",a,r),link:F(h.LINK,u,r),meta:F(h.META,d,r),noscript:F(h.NOSCRIPT,o,r),script:F(h.SCRIPT,f,r),style:F(h.STYLE,i,r),title:F(h.TITLE,{title:s,titleAttributes:c},r)}},$=[],B=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?$:n.instances},add:function(e){(n.canUseDOM?$:n.instances).push(e)},remove:function(e){var t=(n.canUseDOM?$:n.instances).indexOf(e);(n.canUseDOM?$: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:{}}))},U=r.createContext({}),H=o().shape({setHelmet:o().func,helmetInstances:o().shape({get:o().func,add:o().func,remove:o().func})}),V="undefined"!=typeof document,W=function(e){function t(n){var r;return(r=e.call(this,n)||this).helmetData=new B(r.props.context,t.canUseDOM),r}return p(t,e),t.prototype.render=function(){return r.createElement(U.Provider,{value:this.helmetData.value},this.props.children)},t}(r.Component);W.canUseDOM=V,W.propTypes={context:o().shape({helmet:o().shape()}),children:o().node.isRequired},W.defaultProps={context:{}},W.displayName="HelmetProvider";var G=function(e,t){var n,r=document.head||document.querySelector(h.HEAD),a=r.querySelectorAll(e+"[data-rh]"),o=[].slice.call(a),i=[];return t&&t.length&&t.forEach((function(t){var r=document.createElement(e);for(var a in t)Object.prototype.hasOwnProperty.call(t,a)&&("innerHTML"===a?r.innerHTML=t.innerHTML:"cssText"===a?r.styleSheet?r.styleSheet.cssText=t.cssText:r.appendChild(document.createTextNode(t.cssText)):r.setAttribute(a,void 0===t[a]?"":t[a]));r.setAttribute("data-rh","true"),o.some((function(e,t){return n=t,r.isEqualNode(e)}))?o.splice(n,1):i.push(r)})),o.forEach((function(e){return e.parentNode.removeChild(e)})),i.forEach((function(e){return r.appendChild(e)})),{oldTags:o,newTags:i}},q=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var r=n.getAttribute("data-rh"),a=r?r.split(","):[],o=[].concat(a),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===a.indexOf(s)&&a.push(s);var u=o.indexOf(s);-1!==u&&o.splice(u,1)}for(var d=o.length-1;d>=0;d-=1)n.removeAttribute(o[d]);a.length===o.length?n.removeAttribute("data-rh"):n.getAttribute("data-rh")!==i.join(",")&&n.setAttribute("data-rh",i.join(","))}},Y=function(e,t){var n=e.baseTag,r=e.htmlAttributes,a=e.linkTags,o=e.metaTags,i=e.noscriptTags,l=e.onChangeClientState,s=e.scriptTags,c=e.styleTags,u=e.title,d=e.titleAttributes;q(h.BODY,e.bodyAttributes),q(h.HTML,r),function(e,t){void 0!==e&&document.title!==e&&(document.title=R(e)),q(h.TITLE,t)}(u,d);var f={baseTag:G(h.BASE,n),linkTags:G(h.LINK,a),metaTags:G(h.META,o),noscriptTags:G(h.NOSCRIPT,i),scriptTags:G(h.SCRIPT,s),styleTags:G(h.STYLE,c)},p={},m={};Object.keys(f).forEach((function(e){var t=f[e],n=t.newTags,r=t.oldTags;n.length&&(p[e]=n),r.length&&(m[e]=f[e].oldTags)})),t&&t(),l(e,p,m)},K=null,Q=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];return(t=e.call.apply(e,[this].concat(r))||this).rendered=!1,t}p(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,a=null,o=(e=n.helmetInstances.get().map((function(e){var t=f({},e.props);return delete t.context,t})),{baseTag:A(["href"],e),bodyAttributes:C("bodyAttributes",e),defer:S(e,"defer"),encode:S(e,"encodeSpecialCharacters"),htmlAttributes:C("htmlAttributes",e),linkTags:T(h.LINK,["rel","href"],e),metaTags:T(h.META,["name","charset","http-equiv","property","itemprop"],e),noscriptTags:T(h.NOSCRIPT,["innerHTML"],e),onChangeClientState:E(e),scriptTags:T(h.SCRIPT,["src","innerHTML"],e),styleTags:T(h.STYLE,["cssText"],e),title:_(e),titleAttributes:C("titleAttributes",e),prioritizeSeoTags:L(e,"prioritizeSeoTags")});W.canUseDOM?(t=o,K&&cancelAnimationFrame(K),t.defer?K=requestAnimationFrame((function(){Y(t,(function(){K=null}))})):(Y(t),K=null)):z&&(a=z(o)),r(a)},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);Q.propTypes={context:H.isRequired},Q.displayName="HelmetDispatcher";var Z=["children"],X=["children"],J=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!l()(O(this.props,"helmetData"),O(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 f({},r,((t={})[n.type]=[].concat(r[n.type]||[],[f({},e.newChildProps,this.mapNestedChildrenToProps(n,e.nestedChildren))]),t))},n.mapObjectTypeChildren=function(e){var t,n,r=e.child,a=e.newProps,o=e.newChildProps,i=e.nestedChildren;switch(r.type){case h.TITLE:return f({},a,((t={})[r.type]=i,t.titleAttributes=f({},o),t));case h.BODY:return f({},a,{bodyAttributes:f({},o)});case h.HTML:return f({},a,{htmlAttributes:f({},o)});default:return f({},a,((n={})[r.type]=f({},o),n))}},n.mapArrayTypeChildrenToProps=function(e,t){var n=f({},t);return Object.keys(e).forEach((function(t){var r;n=f({},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,a={};return r.Children.forEach(e,(function(e){if(e&&e.props){var r=e.props,o=r.children,i=g(r,Z),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,o),s){case h.FRAGMENT:t=n.mapChildrenToProps(o,t);break;case h.LINK:case h.META:case h.NOSCRIPT:case h.SCRIPT:case h.STYLE:a=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:a,newChildProps:l,nestedChildren:o});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:l,nestedChildren:o})}}})),this.mapArrayTypeChildrenToProps(a,t)},n.render=function(){var e=this.props,t=e.children,n=g(e,X),a=f({},n),o=n.helmetData;return t&&(a=this.mapChildrenToProps(t,a)),!o||o instanceof B||(o=new B(o.context,o.instances)),o?r.createElement(Q,f({},a,{context:o.value,helmetData:void 0})):r.createElement(U.Consumer,null,(function(e){return r.createElement(Q,f({},a,{context:e}))}))},t}(r.Component);J.propTypes={base:o().object,bodyAttributes:o().object,children:o().oneOfType([o().arrayOf(o().node),o().node]),defaultTitle:o().string,defer:o().bool,encodeSpecialCharacters:o().bool,htmlAttributes:o().object,link:o().arrayOf(o().object),meta:o().arrayOf(o().object),noscript:o().arrayOf(o().object),onChangeClientState:o().func,script:o().arrayOf(o().object),style:o().arrayOf(o().object),title:o().string,titleAttributes:o().object,titleTemplate:o().string,prioritizeSeoTags:o().bool,helmetData:o().object},J.defaultProps={defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1},J.displayName="Helmet"},2799:(e,t)=>{"use strict";var n="function"==typeof Symbol&&Symbol.for,r=n?Symbol.for("react.element"):60103,a=n?Symbol.for("react.portal"):60106,o=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,f=n?Symbol.for("react.forward_ref"):60112,p=n?Symbol.for("react.suspense"):60113,m=n?Symbol.for("react.suspense_list"):60120,g=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 o:case l:case i:case p:return e;default:switch(e=e&&e.$$typeof){case c:case f:case h:case g:case s:return e;default:return t}}case a: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=f,t.Fragment=o,t.Lazy=h,t.Memo=g,t.Portal=a,t.Profiler=l,t.StrictMode=i,t.Suspense=p,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)===f},t.isFragment=function(e){return k(e)===o},t.isLazy=function(e){return k(e)===h},t.isMemo=function(e){return k(e)===g},t.isPortal=function(e){return k(e)===a},t.isProfiler=function(e){return k(e)===l},t.isStrictMode=function(e){return k(e)===i},t.isSuspense=function(e){return k(e)===p},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===o||e===d||e===l||e===i||e===p||e===m||"object"==typeof e&&null!==e&&(e.$$typeof===h||e.$$typeof===g||e.$$typeof===s||e.$$typeof===c||e.$$typeof===f||e.$$typeof===y||e.$$typeof===v||e.$$typeof===w||e.$$typeof===b)},t.typeOf=k},4363:(e,t,n)=>{"use strict";e.exports=n(2799)},3259:(e,t,n)=>{"use strict";function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function a(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(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(6540),s=[],c=[];var u=l.createContext(null);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 f(e){var t={loading:!1,loaded:{},error:null},n=[];try{Object.keys(e).forEach((function(r){var a=d(e[r]);a.loading?t.loading=!0:(t.loaded[r]=a.loaded,t.error=a.error),n.push(a.promise),a.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 p(e,t){return l.createElement((n=e)&&n.__esModule?n.default:n,t);var n}function m(e,t){var d,f;if(!t.loading)throw new Error("react-loadable requires a `loading` component");var m=i({loader:null,loading:null,delay:200,timeout:null,render:p,webpack:null,modules:null},t),g=null;function h(){return g||(g=e(m.loader)),g.promise}return s.push(h),"function"==typeof m.webpack&&c.push((function(){if((0,m.webpack)().every((function(e){return void 0!==e&&void 0!==n.m[e]})))return h()})),f=d=function(t){function n(n){var r;return o(a(a(r=t.call(this,n)||this)),"retry",(function(){r.setState({error:null,loading:!0,timedOut:!1}),g=e(m.loader),r._loadModule()})),h(),r.state={error:g.error,pastDelay:!1,timedOut:!1,loading:g.loading,loaded:g.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&&Array.isArray(m.modules)&&m.modules.forEach((function(t){e.context.report(t)})),g.loading){var t=function(t){e._mounted&&e.setState(t)};"number"==typeof m.delay&&(0===m.delay?this.setState({pastDelay:!0}):this._delay=setTimeout((function(){t({pastDelay:!0})}),m.delay)),"number"==typeof m.timeout&&(this._timeout=setTimeout((function(){t({timedOut:!0})}),m.timeout));var n=function(){t({error:g.error,loaded:g.loaded,loading:g.loading}),e._clearTimeouts()};g.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(m.loading,{isLoading:this.state.loading,pastDelay:this.state.pastDelay,timedOut:this.state.timedOut,error:this.state.error,retry:this.retry}):this.state.loaded?m.render(this.state.loaded,this.props):null},n}(l.Component),o(d,"contextType",u),f}function g(e){return m(d,e)}g.Map=function(e){if("function"!=typeof e.render)throw new Error("LoadableMap requires a `render(loaded, props)` function");return m(f,e)};var h=function(e){function t(){return e.apply(this,arguments)||this}return r(t,e),t.prototype.render=function(){return l.createElement(u.Provider,{value:{report:this.props.report}},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)}))}g.Capture=h,g.preloadAll=function(){return new Promise((function(e,t){b(s).then(e,t)}))},g.preloadReady=function(){return new Promise((function(e,t){b(c).then(e,e)}))},e.exports=g},2831:(e,t,n)=>{"use strict";n.d(t,{u:()=>i,v:()=>l});var r=n(6347),a=n(8168),o=n(6540);function i(e,t,n){return void 0===n&&(n=[]),e.some((function(e){var a=e.path?(0,r.B6)(t,e):n.length?n[n.length-1].match:r.Ix.computeRootMatch(t);return a&&(n.push({route:e,match:a}),e.routes&&i(e.routes,t,n)),a})),n}function l(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),e?o.createElement(r.dO,n,e.map((function(e,n){return o.createElement(r.qh,{key:e.key||n,path:e.path,exact:e.exact,strict:e.strict,render:function(n){return e.render?e.render((0,a.A)({},n,{},t,{route:e})):o.createElement(e.component,(0,a.A)({},n,t,{route:e}))}})}))):null}},4625:(e,t,n)=>{"use strict";n.d(t,{I9:()=>d,Kd:()=>u,N_:()=>b,k2:()=>w});var r=n(6347),a=n(2892),o=n(6540),i=n(1513),l=n(8168),s=n(8587),c=n(1561),u=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];return(t=e.call.apply(e,[this].concat(r))||this).history=(0,i.zR)(t.props),t}return(0,a.A)(t,e),t.prototype.render=function(){return o.createElement(r.Ix,{history:this.history,children:this.props.children})},t}(o.Component);var d=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];return(t=e.call.apply(e,[this].concat(r))||this).history=(0,i.TM)(t.props),t}return(0,a.A)(t,e),t.prototype.render=function(){return o.createElement(r.Ix,{history:this.history,children:this.props.children})},t}(o.Component);var f=function(e,t){return"function"==typeof e?e(t):e},p=function(e,t){return"string"==typeof e?(0,i.yJ)(e,null,null,t):e},m=function(e){return e},g=o.forwardRef;void 0===g&&(g=m);var h=g((function(e,t){var n=e.innerRef,r=e.navigate,a=e.onClick,i=(0,s.A)(e,["innerRef","navigate","onClick"]),c=i.target,u=(0,l.A)({},i,{onClick:function(e){try{a&&a(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=m!==g&&t||n,o.createElement("a",u)}));var b=g((function(e,t){var n=e.component,a=void 0===n?h:n,u=e.replace,d=e.to,b=e.innerRef,y=(0,s.A)(e,["component","replace","to","innerRef"]);return o.createElement(r.XZ.Consumer,null,(function(e){e||(0,c.A)(!1);var n=e.history,r=p(f(d,e.location),e.location),s=r?n.createHref(r):"",h=(0,l.A)({},y,{href:s,navigate:function(){var t=f(d,e.location),r=(0,i.AO)(e.location)===(0,i.AO)(p(t));(u||r?n.replace:n.push)(t)}});return m!==g?h.ref=t||b:h.innerRef=b,o.createElement(a,h)}))})),y=function(e){return e},v=o.forwardRef;void 0===v&&(v=y);var w=v((function(e,t){var n=e["aria-current"],a=void 0===n?"page":n,i=e.activeClassName,u=void 0===i?"active":i,d=e.activeStyle,m=e.className,g=e.exact,h=e.isActive,w=e.location,k=e.sensitive,x=e.strict,S=e.style,_=e.to,E=e.innerRef,C=(0,s.A)(e,["aria-current","activeClassName","activeStyle","className","exact","isActive","location","sensitive","strict","style","to","innerRef"]);return o.createElement(r.XZ.Consumer,null,(function(e){e||(0,c.A)(!1);var n=w||e.location,i=p(f(_,n),n),s=i.pathname,A=s&&s.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1"),T=A?(0,r.B6)(n.pathname,{path:A,exact:g,sensitive:k,strict:x}):null,L=!!(h?h(T,n):T),R="function"==typeof m?m(L):m,N="function"==typeof S?S(L):S;L&&(R=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(" ")}(R,u),N=(0,l.A)({},N,d));var O=(0,l.A)({"aria-current":L&&a||null,className:R,style:N,to:i},C);return y!==v?O.ref=t||E:O.innerRef=E,o.createElement(b,O)}))}))},6347:(e,t,n)=>{"use strict";n.d(t,{B6:()=>S,Ix:()=>v,W6:()=>O,XZ:()=>y,dO:()=>R,qh:()=>_,zy:()=>j});var r=n(2892),a=n(6540),o=n(5556),i=n.n(o),l=n(1513),s=n(1561),c=n(8168),u=n(8505),d=n.n(u),f=(n(4363),n(8587)),p=(n(4146),1073741823),m="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{};var g=a.createContext||function(e,t){var n,o,l="__create-react-context-"+function(){var e="__global_unique_id__";return m[e]=(m[e]||0)+1}()+"__",s=function(e){function n(){for(var t,n,r,a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return(t=e.call.apply(e,[this].concat(o))||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.A)(n,e);var a=n.prototype;return a.getChildContext=function(){var e;return(e={})[l]=this.emitter,e},a.componentWillReceiveProps=function(e){if(this.props.value!==e.value){var n,r=this.props.value,a=e.value;((o=r)===(i=a)?0!==o||1/o==1/i:o!=o&&i!=i)?n=0:(n="function"==typeof t?t(r,a):p,0!==(n|=0)&&this.emitter.set(e.value,n))}var o,i},a.render=function(){return this.props.children},n}(a.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),a=0;a<n;a++)r[a]=arguments[a];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.A)(n,t);var a=n.prototype;return a.componentWillReceiveProps=function(e){var t=e.observedBits;this.observedBits=null==t?p:t},a.componentDidMount=function(){this.context[l]&&this.context[l].on(this.onUpdate);var e=this.props.observedBits;this.observedBits=null==e?p:e},a.componentWillUnmount=function(){this.context[l]&&this.context[l].off(this.onUpdate)},a.getValue=function(){return this.context[l]?this.context[l].get():e},a.render=function(){return(e=this.props.children,Array.isArray(e)?e[0]:e)(this.state.value);var e},n}(a.Component);return c.contextTypes=((o={})[l]=i().object,o),{Provider:s,Consumer:c}},h=function(e){var t=g();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.A)(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 a.createElement(y.Provider,{value:{history:this.props.history,location:this.state.location,match:t.computeRootMatch(this.state.location.pathname),staticContext:this.props.staticContext}},a.createElement(b.Provider,{children:this.props.children||null,value:this.props.history}))},t}(a.Component);a.Component;a.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,a=n.exact,o=void 0!==a&&a,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 a=[],o={regexp:d()(e,a,t),keys:a};return x<k&&(r[e]=o,x++),o}(n,{end:o,strict:l,sensitive:c}),a=r.regexp,i=r.keys,s=a.exec(e);if(!s)return null;var u=s[0],f=s.slice(1),p=e===u;return o&&!p?null:{path:n,url:"/"===n&&""===u?"/":u,isExact:p,params:i.reduce((function(e,t,n){return e[t.name]=f[n],e}),{})}}),null)}var _=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.A)(t,e),t.prototype.render=function(){var e=this;return a.createElement(y.Consumer,null,(function(t){t||(0,s.A)(!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,o=(0,c.A)({},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===a.Children.count(e)}(l)&&(l=null),a.createElement(y.Provider,{value:o},o.match?l?"function"==typeof l?l(o):l:u?a.createElement(u,o):d?d(o):null:"function"==typeof l?l(o):null)}))},t}(a.Component);function E(e){return"/"===e.charAt(0)?e:"/"+e}function C(e,t){if(!e)return t;var n=E(e);return 0!==t.pathname.indexOf(n)?t:(0,c.A)({},t,{pathname:t.pathname.substr(n.length)})}function A(e){return"string"==typeof e?e:(0,l.AO)(e)}function T(e){return function(){(0,s.A)(!1)}}function L(){}a.Component;var R=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.A)(t,e),t.prototype.render=function(){var e=this;return a.createElement(y.Consumer,null,(function(t){t||(0,s.A)(!1);var n,r,o=e.props.location||t.location;return a.Children.forEach(e.props.children,(function(e){if(null==r&&a.isValidElement(e)){n=e;var i=e.props.path||e.props.from;r=i?S(o.pathname,(0,c.A)({},e.props,{path:i})):t.match}})),r?a.cloneElement(n,{location:o,computedMatch:r}):null}))},t}(a.Component);var N=a.useContext;function O(){return N(b)}function j(){return N(y).location}},8505:(e,t,n)=>{var r=n(4634);e.exports=p,e.exports.parse=o,e.exports.compile=function(e,t){return l(o(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=f;var a=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function o(e,t){for(var n,r=[],o=0,i=0,l="",u=t&&t.delimiter||"/";null!=(n=a.exec(e));){var d=n[0],f=n[1],p=n.index;if(l+=e.slice(i,p),i=p+d.length,f)l+=f[1];else{var m=e[i],g=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!=g&&null!=m&&m!==g,x="+"===v||"*"===v,S="?"===v||"*"===v,_=n[2]||u,E=b||y;r.push({name:h||o++,prefix:g||"",delimiter:_,optional:S,repeat:x,partial:k,asterisk:!!w,pattern:E?c(E):w?".*":"[^"+s(_)+"]+?"})}}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),a=0;a<e.length;a++)"object"==typeof e[a]&&(n[a]=new RegExp("^(?:"+e[a].pattern+")$",d(t)));return function(t,a){for(var o="",l=t||{},s=(a||{}).pretty?i:encodeURIComponent,c=0;c<e.length;c++){var u=e[c];if("string"!=typeof u){var d,f=l[u.name];if(null==f){if(u.optional){u.partial&&(o+=u.prefix);continue}throw new TypeError('Expected "'+u.name+'" to be defined')}if(r(f)){if(!u.repeat)throw new TypeError('Expected "'+u.name+'" to not repeat, but received `'+JSON.stringify(f)+"`");if(0===f.length){if(u.optional)continue;throw new TypeError('Expected "'+u.name+'" to not be empty')}for(var p=0;p<f.length;p++){if(d=s(f[p]),!n[c].test(d))throw new TypeError('Expected all "'+u.name+'" to match "'+u.pattern+'", but received `'+JSON.stringify(d)+"`");o+=(0===p?u.prefix:u.delimiter)+d}}else{if(d=u.asterisk?encodeURI(f).replace(/[?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})):s(f),!n[c].test(d))throw new TypeError('Expected "'+u.name+'" to match "'+u.pattern+'", but received "'+d+'"');o+=u.prefix+d}}else o+=u}return o}}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 f(e,t,n){r(t)||(n=t||n,t=[]);for(var a=(n=n||{}).strict,o=!1!==n.end,i="",l=0;l<e.length;l++){var c=e[l];if("string"==typeof c)i+=s(c);else{var f=s(c.prefix),p="(?:"+c.pattern+")";t.push(c),c.repeat&&(p+="(?:"+f+p+")*"),i+=p=c.optional?c.partial?f+"("+p+")?":"(?:"+f+"("+p+"))?":f+"("+p+")"}}var m=s(n.delimiter||"/"),g=i.slice(-m.length)===m;return a||(i=(g?i.slice(0,-m.length):i)+"(?:"+m+"(?=$))?"),i+=o?"$":a&&g?"":"(?="+m+"|$)",u(new RegExp("^"+i,d(n)),t)}function p(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=[],a=0;a<e.length;a++)r.push(p(e[a],t,n).source);return u(new RegExp("(?:"+r.join("|")+")",d(n)),t)}(e,t,n):function(e,t,n){return f(o(e,n),t,n)}(e,t,n)}},1020:(e,t,n)=>{"use strict";var r=n(6540),a=Symbol.for("react.element"),o=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,o={},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)&&(o[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===o[r]&&(o[r]=t[r]);return{$$typeof:a,type:e,key:c,ref:u,props:o,_owner:l.current}}t.Fragment=o,t.jsx=c,t.jsxs=c},5287:(e,t)=>{"use strict";var n=Symbol.for("react.element"),r=Symbol.for("react.portal"),a=Symbol.for("react.fragment"),o=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"),f=Symbol.for("react.lazy"),p=Symbol.iterator;var m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,h={};function b(e,t,n){this.props=e,this.context=t,this.refs=h,this.updater=n||m}function y(){}function v(e,t,n){this.props=e,this.context=t,this.refs=h,this.updater=n||m}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,g(w,b.prototype),w.isPureReactComponent=!0;var k=Array.isArray,x=Object.prototype.hasOwnProperty,S={current:null},_={key:!0,ref:!0,__self:!0,__source:!0};function E(e,t,r){var a,o={},i=null,l=null;if(null!=t)for(a in void 0!==t.ref&&(l=t.ref),void 0!==t.key&&(i=""+t.key),t)x.call(t,a)&&!_.hasOwnProperty(a)&&(o[a]=t[a]);var s=arguments.length-2;if(1===s)o.children=r;else if(1<s){for(var c=Array(s),u=0;u<s;u++)c[u]=arguments[u+2];o.children=c}if(e&&e.defaultProps)for(a in s=e.defaultProps)void 0===o[a]&&(o[a]=s[a]);return{$$typeof:n,type:e,key:i,ref:l,props:o,_owner:S.current}}function C(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var A=/\/+/g;function T(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 L(e,t,a,o,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=""===o?"."+T(s,0):o,k(i)?(a="",null!=e&&(a=e.replace(A,"$&/")+"/"),L(i,t,a,"",(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,a+(!i.key||s&&s.key===i.key?"":(""+i.key).replace(A,"$&/")+"/")+e)),t.push(i)),1;if(s=0,o=""===o?".":o+":",k(e))for(var c=0;c<e.length;c++){var u=o+T(l=e[c],c);s+=L(l,t,a,u,i)}else if(u=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=p&&e[p]||e["@@iterator"])?e:null}(e),"function"==typeof u)for(e=u.call(e),c=0;!(l=e.next()).done;)s+=L(l=l.value,t,a,u=o+T(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 R(e,t,n){if(null==e)return e;var r=[],a=0;return L(e,r,"","",(function(e){return t.call(n,e,a++)})),r}function N(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 O={current:null},j={transition:null},P={ReactCurrentDispatcher:O,ReactCurrentBatchConfig:j,ReactCurrentOwner:S};function M(){throw Error("act(...) is not supported in production builds of React.")}t.Children={map:R,forEach:function(e,t,n){R(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return R(e,(function(){t++})),t},toArray:function(e){return R(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=a,t.Profiler=i,t.PureComponent=v,t.StrictMode=o,t.Suspense=u,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=P,t.act=M,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 a=g({},e.props),o=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&&(o=""+t.key),e.type&&e.type.defaultProps)var s=e.type.defaultProps;for(c in t)x.call(t,c)&&!_.hasOwnProperty(c)&&(a[c]=void 0===t[c]&&void 0!==s?s[c]:t[c])}var c=arguments.length-2;if(1===c)a.children=r;else if(1<c){s=Array(c);for(var u=0;u<c;u++)s[u]=arguments[u+2];a.children=s}return{$$typeof:n,type:e.type,key:o,ref:i,props:a,_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=E,t.createFactory=function(e){var t=E.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:f,_payload:{_status:-1,_result:e},_init:N}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=j.transition;j.transition={};try{e()}finally{j.transition=t}},t.unstable_act=M,t.useCallback=function(e,t){return O.current.useCallback(e,t)},t.useContext=function(e){return O.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return O.current.useDeferredValue(e)},t.useEffect=function(e,t){return O.current.useEffect(e,t)},t.useId=function(){return O.current.useId()},t.useImperativeHandle=function(e,t,n){return O.current.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return O.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return O.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return O.current.useMemo(e,t)},t.useReducer=function(e,t,n){return O.current.useReducer(e,t,n)},t.useRef=function(e){return O.current.useRef(e)},t.useState=function(e){return O.current.useState(e)},t.useSyncExternalStore=function(e,t,n){return O.current.useSyncExternalStore(e,t,n)},t.useTransition=function(){return O.current.useTransition()},t.version="18.3.1"},6540:(e,t,n)=>{"use strict";e.exports=n(5287)},4848:(e,t,n)=>{"use strict";e.exports=n(1020)},7463:(e,t)=>{"use strict";function n(e,t){var n=e.length;e.push(t);e:for(;0<n;){var r=n-1>>>1,a=e[r];if(!(0<o(a,t)))break e;e[r]=t,e[n]=a,n=r}}function r(e){return 0===e.length?null:e[0]}function a(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,a=e.length,i=a>>>1;r<i;){var l=2*(r+1)-1,s=e[l],c=l+1,u=e[c];if(0>o(s,n))c<a&&0>o(u,s)?(e[r]=u,e[c]=n,r=c):(e[r]=s,e[l]=n,r=l);else{if(!(c<a&&0>o(u,n)))break e;e[r]=u,e[c]=n,r=c}}}return t}function o(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,f=null,p=3,m=!1,g=!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)a(u);else{if(!(t.startTime<=e))break;a(u),t.sortIndex=t.expirationTime,n(c,t)}t=r(u)}}function k(e){if(h=!1,w(e),!g)if(null!==r(c))g=!0,j(x);else{var t=r(u);null!==t&&P(k,t.startTime-e)}}function x(e,n){g=!1,h&&(h=!1,y(C),C=-1),m=!0;var o=p;try{for(w(n),f=r(c);null!==f&&(!(f.expirationTime>n)||e&&!L());){var i=f.callback;if("function"==typeof i){f.callback=null,p=f.priorityLevel;var l=i(f.expirationTime<=n);n=t.unstable_now(),"function"==typeof l?f.callback=l:f===r(c)&&a(c),w(n)}else a(c);f=r(c)}if(null!==f)var s=!0;else{var d=r(u);null!==d&&P(k,d.startTime-n),s=!1}return s}finally{f=null,p=o,m=!1}}"undefined"!=typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);var S,_=!1,E=null,C=-1,A=5,T=-1;function L(){return!(t.unstable_now()-T<A)}function R(){if(null!==E){var e=t.unstable_now();T=e;var n=!0;try{n=E(!0,e)}finally{n?S():(_=!1,E=null)}}else _=!1}if("function"==typeof v)S=function(){v(R)};else if("undefined"!=typeof MessageChannel){var N=new MessageChannel,O=N.port2;N.port1.onmessage=R,S=function(){O.postMessage(null)}}else S=function(){b(R,0)};function j(e){E=e,_||(_=!0,S())}function P(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(){g||m||(g=!0,j(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"):A=0<e?Math.floor(1e3/e):5},t.unstable_getCurrentPriorityLevel=function(){return p},t.unstable_getFirstCallbackNode=function(){return r(c)},t.unstable_next=function(e){switch(p){case 1:case 2:case 3:var t=3;break;default:t=p}var n=p;p=t;try{return e()}finally{p=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=p;p=e;try{return t()}finally{p=n}},t.unstable_scheduleCallback=function(e,a,o){var i=t.unstable_now();switch("object"==typeof o&&null!==o?o="number"==typeof(o=o.delay)&&0<o?i+o:i:o=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:a,priorityLevel:e,startTime:o,expirationTime:l=o+l,sortIndex:-1},o>i?(e.sortIndex=o,n(u,e),null===r(c)&&e===r(u)&&(h?(y(C),C=-1):h=!0,P(k,o-i))):(e.sortIndex=l,n(c,e),g||m||(g=!0,j(x))),e},t.unstable_shouldYield=L,t.unstable_wrapCallback=function(e){var t=p;return function(){var n=p;p=t;try{return e.apply(this,arguments)}finally{p=n}}}},9982:(e,t,n)=>{"use strict";e.exports=n(7463)},2833:e=>{e.exports=function(e,t,n,r){var a=n?n.call(r,e,t):void 0;if(void 0!==a)return!!a;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var o=Object.keys(e),i=Object.keys(t);if(o.length!==i.length)return!1;for(var l=Object.prototype.hasOwnProperty.bind(t),s=0;s<o.length;s++){var c=o[s];if(!l(c))return!1;var u=e[c],d=t[c];if(!1===(a=n?n.call(r,u,d,c):void 0)||void 0===a&&u!==d)return!1}return!0}},4784:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={title:"LmcRbacMvc",tagline:"Role-based access control for Laminas MVC application",favicon:"img/favicon.ico",url:"https://lm-commons.github.io",baseUrl:"/LmcRbacMvc/",organizationName:"LM-Commons",projectName:"LmcRbacMvc",trailingSlash:!1,onBrokenLinks:"throw",onBrokenMarkdownLinks:"warn",i18n:{defaultLocale:"en",locales:["en"],path:"i18n",localeConfigs:{}},presets:[["classic",{docs:{sidebarPath:"./sidebars.js",editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/"},blog:{showReadingTime:!0,editUrl:"https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/"},theme:{customCss:"./src/css/custom.css"}}]],themeConfig:{image:"img/LMC-social-card.png",navbar:{title:"LmcRbacMvc",logo:{alt:"LM-Commons Logo",src:"img/LMC-logo.png"},items:[{type:"docSidebar",sidebarId:"tutorialSidebar",position:"left",label:"Docs"},{type:"docsVersionDropdown",position:"right",dropdownItemsBefore:[],dropdownItemsAfter:[]},{href:"https://lm-commons.github.io",label:"LM-Commons",position:"right"},{href:"https://github.com/lm-commons/lmcrbacmvc",position:"right",className:"header-github-link"}],hideOnScroll:!1},footer:{style:"dark",links:[{title:"Community",items:[{label:"Slack",href:"https://join.slack.com/t/lm-commons/shared_invite/zt-2gankt2wj-FTS45hp1W~JEj1tWvDsUHQ"}]},{title:"More",items:[{label:"GitHub",href:"https://github.com/lm-commons/lmcrbacmvc"}]}],copyright:"Copyright \xa9 2024 LM-Commons Organization. Built with Docusaurus."},prism:{theme:{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"}}]},darkTheme:{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)"}}]},additionalLanguages:["bash","json","php"],magicComments:[{className:"theme-code-block-highlighted-line",line:"highlight-next-line",block:{start:"highlight-start",end:"highlight-end"}}]},colorMode:{defaultMode:"light",disableSwitch:!1,respectPrefersColorScheme:!1},docs:{versionPersistence:"localStorage",sidebar:{hideable:!1,autoCollapseCategories:!1}},blog:{sidebar:{groupByYear:!0}},metadata:[],tableOfContents:{minHeadingLevel:2,maxHeadingLevel:3}},baseUrlIssueBanner:!0,future:{experimental_storage:{type:"localStorage",namespace:!1},experimental_router:"browser"},onBrokenAnchors:"warn",onDuplicateRoutes:"warn",staticDirectories:["static"],customFields:{},plugins:[],themes:[],scripts:[],headTags:[],stylesheets:[],clientModules:[],titleDelimiter:"|",noIndex:!1,markdown:{format:"mdx",mermaid:!1,mdx1Compat:{comments:!0,admonitions:!0,headingIds:!0},anchors:{maintainCase:!1}}}},8168:(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,{A:()=>r})},2892:(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 a(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,r(e,t)}n.d(t,{A:()=>a})},8587:(e,t,n)=>{"use strict";function r(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}n.d(t,{A:()=>r})},4164:(e,t,n)=>{"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(n=r(e[t]))&&(a&&(a+=" "),a+=n)}else for(n in e)e[n]&&(a&&(a+=" "),a+=n);return a}n.d(t,{A:()=>a});const a=function(){for(var e,t,n=0,a="",o=arguments.length;n<o;n++)(e=arguments[n])&&(t=r(e))&&(a&&(a+=" "),a+=t);return a}},1765:(e,t,n)=>{"use strict";n.d(t,{My:()=>A,f4:()=>ee});var r,a,o,i,l,s,c,u=n(6540),d=n(4164),f=Object.create,p=Object.defineProperty,m=Object.defineProperties,g=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?p(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,t)=>m(e,h(t)),E=(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 a?new a(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 a,o;switch(n=n||{},r.util.type(t)){case"Object":if(o=r.util.objId(t),n[o])return n[o];for(var i in a={},n[o]=a,t)t.hasOwnProperty(i)&&(a[i]=e(t[i],n));return a;case"Array":return o=r.util.objId(t),n[o]?n[o]:(a=[],n[o]=a,t.forEach((function(t,r){a[r]=e(t,n)})),a);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 a=e.classList;if(a.contains(t))return!0;if(a.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 a in t)n[a]=t[a];return n},insertBefore:function(e,t,n,a){var o=(a=a||r.languages)[e],i={};for(var l in o)if(o.hasOwnProperty(l)){if(l==t)for(var s in n)n.hasOwnProperty(s)&&(i[s]=n[s]);n.hasOwnProperty(l)||(i[l]=o[l])}var c=a[e];return a[e]=i,r.languages.DFS(r.languages,(function(t,n){n===c&&t!=e&&(this[t]=i)})),i},DFS:function e(t,n,a,o){o=o||{};var i=r.util.objId;for(var l in t)if(t.hasOwnProperty(l)){n.call(t,l,t[l],a||l);var s=t[l],c=r.util.type(s);"Object"!==c||o[i(s)]?"Array"!==c||o[i(s)]||(o[i(s)]=!0,e(s,n,l,o)):(o[i(s)]=!0,e(s,n,null,o))}}},plugins:{},highlight:function(e,t,n){var o={code:e,grammar:t,language:n};if(r.hooks.run("before-tokenize",o),!o.grammar)throw new Error('The language "'+o.language+'" has no grammar.');return o.tokens=r.tokenize(o.code,o.grammar),r.hooks.run("after-tokenize",o),a.stringify(r.util.encode(o.tokens),o.language)},tokenize:function(e,t){var n=t.rest;if(n){for(var r in n)t[r]=n[r];delete t.rest}var a=new l;return s(a,a.head,e),i(e,a,t,a.head,0),function(e){for(var t=[],n=e.head.next;n!==e.tail;)t.push(n.value),n=n.next;return t}(a)},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 a,o=0;a=n[o++];)a(t)}},Token:a};function a(e,t,n,r){this.type=e,this.content=t,this.alias=n,this.length=0|(r||"").length}function o(e,t,n,r){e.lastIndex=t;var a=e.exec(n);if(a&&r&&a[1]){var o=a[1].length;a.index+=o,a[0]=a[0].slice(o)}return a}function i(e,t,n,l,u,d){for(var f in n)if(n.hasOwnProperty(f)&&n[f]){var p=n[f];p=Array.isArray(p)?p:[p];for(var m=0;m<p.length;++m){if(d&&d.cause==f+","+m)return;var g=p[m],h=g.inside,b=!!g.lookbehind,y=!!g.greedy,v=g.alias;if(y&&!g.pattern.global){var w=g.pattern.toString().match(/[imsuy]*$/)[0];g.pattern=RegExp(g.pattern.source,w+"g")}for(var k=g.pattern||g,x=l.next,S=u;x!==t.tail&&!(d&&S>=d.reach);S+=x.value.length,x=x.next){var _=x.value;if(t.length>e.length)return;if(!(_ instanceof a)){var E,C=1;if(y){if(!(E=o(k,S,e,b))||E.index>=e.length)break;var A=E.index,T=E.index+E[0].length,L=S;for(L+=x.value.length;A>=L;)L+=(x=x.next).value.length;if(S=L-=x.value.length,x.value instanceof a)continue;for(var R=x;R!==t.tail&&(L<T||"string"==typeof R.value);R=R.next)C++,L+=R.value.length;C--,_=e.slice(S,L),E.index-=S}else if(!(E=o(k,0,_,b)))continue;A=E.index;var N=E[0],O=_.slice(0,A),j=_.slice(A+N.length),P=S+_.length;d&&P>d.reach&&(d.reach=P);var M=x.prev;if(O&&(M=s(t,M,O),S+=O.length),c(t,M,C),x=s(t,M,new a(f,h?r.tokenize(N,h):N,v,N)),j&&s(t,x,j),C>1){var I={cause:f+","+m,reach:P};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,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}function c(e,t,n){for(var r=t.next,a=0;a<n&&r!==e.tail;a++)r=r.next;t.next=r,r.prev=t,e.length-=a}return a.stringify=function e(t,n){if("string"==typeof t)return t;if(Array.isArray(t)){var a="";return t.forEach((function(t){a+=e(t,n)})),a}var o={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(o.classes,i):o.classes.push(i)),r.hooks.run("wrap",o);var l="";for(var s in o.attributes)l+=" "+s+'="'+(o.attributes[s]||"").replace(/"/g,""")+'"';return"<"+o.tag+' class="'+o.classes.join(" ")+'"'+l+">"+o.content+"</"+o.tag+">"},r}();t.exports=n,n.default=n}},function(){return a||(0,r[b(r)[0]])((a={exports:{}}).exports,a),a.exports}),A=((e,t,n)=>(n=null!=e?f(v(e)):{},((e,t,n,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let a of b(t))w.call(e,a)||a===n||p(e,a,{get:()=>t[a],enumerable:!(r=g(t,a))||r.enumerable});return e})(!t&&e&&e.__esModule?n:p(n,"default",{value:e,enumerable:!0}),e)))(C());A.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]},A.languages.markup.tag.inside["attr-value"].inside.entity=A.languages.markup.entity,A.languages.markup.doctype.inside["internal-subset"].inside=A.languages.markup,A.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(A.languages.markup.tag,"addInlined",{value:function(e,t){var n;(t=((n=((n={})["language-"+t]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:A.languages[t]},n.cdata=/^<!\[CDATA\[|\]\]>$/i,{"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:n}}))["language-"+t]={pattern:/[\s\S]+/,inside:A.languages[t]},{}))[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:n},A.languages.insertBefore("markup","cdata",t)}}),Object.defineProperty(A.languages.markup.tag,"addAttribute",{value:function(e,t){A.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:A.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),A.languages.html=A.languages.markup,A.languages.mathml=A.languages.markup,A.languages.svg=A.languages.markup,A.languages.xml=A.languages.extend("markup",{}),A.languages.ssml=A.languages.xml,A.languages.atom=A.languages.xml,A.languages.rss=A.languages.xml,o=A,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"},o.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"}},A.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:/[{}[\];(),.:]/},A.languages.javascript=A.languages.extend("clike",{"class-name":[A.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}|\?\?=?|\?\.?|[~:]/}),A.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,A.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:A.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:A.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:A.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:A.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:A.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),A.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:A.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"}}),A.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),A.languages.markup&&(A.languages.markup.tag.addInlined("script","javascript"),A.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")),A.languages.js=A.languages.javascript,A.languages.actionscript=A.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:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<<?|>>?>?|[!=]=?)=?|[~?@]/}),A.languages.actionscript["class-name"].alias="function",delete A.languages.actionscript.parameter,delete A.languages.actionscript["literal-property"],A.languages.markup&&A.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:A.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}(A),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},a="doc-comment";if(o=e.languages[t]){var o,i=o[a];if((i=i||(o=e.languages.insertBefore(t,"comment",{"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}}))[a])instanceof RegExp&&(i=o[a]={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)}(A),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"))}(A),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})}(A),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\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})),o=/"(?:[^"\\\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"(?:"+a+"|"+o+")"}))),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(o),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}(A),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,a=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),o=/\|?[ \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("^"+a+o+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+o+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),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 a,o=t[n];"code"!==o.type?e(o.content):(a=o.content[1],o=o.content[3],a&&o&&"code-language"===a.type&&"code-block"===o.type&&"string"==typeof a.content&&(a=a.content.replace(/\b#/g,"sharp").replace(/\b\+\+/g,"pp"),a="language-"+(a=(/[a-z][\w-]*/i.exec(a)||[""])[0].toLowerCase()),o.alias?"string"==typeof o.alias?o.alias=[o.alias,a]:o.alias.push(a):o.alias=[a]))}}(e.tokens)})),e.hooks.add("wrap",(function(t){if("code-block"===t.type){for(var n="",r=0,a=t.classes.length;r<a;r++){var o=t.classes[r];if(o=/language-(.+)/.exec(o)){n=o[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}(A),A.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:A.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+/},A.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 a=[];if(d(["definition-mutation","punctuation"])&&"("===u(1).content){n+=2;var o=f(/^\($/,/^\)$/);if(-1===o)continue;for(;n<o;n++){var i=u(0);"variable"===i.type&&(p(i,"variable-input"),a.push(i.content))}n=o+1}if(d(["punctuation","property-query"])&&"{"===u(0).content&&(n++,p(u(0),"property-mutation"),0<a.length)){var l=f(/^\{$/,/^\}$/);if(-1!==l)for(var s=n;s<l;s++){var c=t[s];"variable"===c.type&&0<=a.indexOf(c.content)&&p(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 f(e,r){for(var a=1,o=n;o<t.length;o++){var i=t[o],l=i.content;if("punctuation"===i.type&&"string"==typeof l)if(e.test(l))a++;else if(r.test(l)&&0==--a)return o}return-1}function p(e,t){var n=e.alias;n?Array.isArray(n)||(e.alias=n=[n]):e.alias=n=[],n.push(t)}})),A.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,a=r.inside["interpolation-punctuation"],o=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(o),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 o=0;o<n.length;o++){if(c>=d.length)return;var i,s,f,p,m,g,h,b=n[o];"string"==typeof b||"string"==typeof b.content?(i=d[c],-1!==(h=(g="string"==typeof b?b:b.content).indexOf(i))&&(++c,s=g.substring(0,h),m=u[i],f=void 0,(p={})["interpolation-punctuation"]=a,3===(p=e.tokenize(m,p)).length&&((f=[1,1]).push.apply(f,l(p[1],e.languages.javascript,"javascript")),p.splice.apply(p,f)),f=new e.Token("interpolation",p,r.alias,m),p=g.substring(h+i.length),m=[],s&&m.push(s),m.push(f),p&&(t(g=[p]),m.push.apply(m,g)),"string"==typeof b?(n.splice.apply(n,[o,1].concat(m)),o+=m.length-1):b.content=m)):(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,a=n.length;r<a;r++){var o,i,l,c=n[r];"string"!=typeof c&&(o=c.content,Array.isArray(o)?"template-string"===c.type?(c=o[1],3===o.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])&&(o[1]=s(i,l,c))):t(o):"string"!=typeof o&&t([o]))}}(t.tokens)}))}(A),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}(A),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)}(A),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})}(A),A.languages.n4js=A.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/}),A.languages.insertBefore("n4js","constant",{annotation:{pattern:/@+\w+/,alias:"operator"}}),A.languages.n4jsd=A.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 a=n[r],o=e.languages.javascript[a];a=(o="RegExp"===e.util.type(o)?e.languages.javascript[a]={pattern:o}:o).inside||{};(o.inside=a)["maybe-class-name"]=/^[A-Z][\s\S]*/}}(A),function(e){var t=e.util.clone(e.languages.javascript),n=/(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source,r=/(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source,a=/(?:\{<S>*\.{3}(?:[^{}]|<BRACES>)*\})/.source;function o(e,t){return e=e.replace(/<S>/g,(function(){return n})).replace(/<BRACES>/g,(function(){return r})).replace(/<SPREAD>/g,(function(){return a})),RegExp(e,t)}function i(t){for(var n=[],r=0;r<t.length;r++){var a=t[r],o=!1;"string"!=typeof a&&("tag"===a.type&&a.content[0]&&"tag"===a.content[0].type?"</"===a.content[0].content[0].content?0<n.length&&n[n.length-1].tagName===l(a.content[0].content[1])&&n.pop():"/>"!==a.content[a.content.length-1].content&&n.push({tagName:l(a.content[0].content[1]),openedBraces:0}):0<n.length&&"punctuation"===a.type&&"{"===a.content?n[n.length-1].openedBraces++:0<n.length&&0<n[n.length-1].openedBraces&&"punctuation"===a.type&&"}"===a.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof a)&&0<n.length&&0===n[n.length-1].openedBraces&&(o=l(a),r<t.length-1&&("string"==typeof t[r+1]||"plain-text"===t[r+1].type)&&(o+=l(t[r+1]),t.splice(r+1,1)),0<r&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(o=l(t[r-1])+o,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",o,null,o)),a.content&&"string"!=typeof a.content&&i(a.content)}}a=o(a).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\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:o(/<SPREAD>/.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=<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)}))}(A),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}(A),A.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:/[{}[\]();,.:\\]/},A.languages.swift["string-literal"].forEach((function(e){e.inside.interpolation.inside=A.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}(A),A.languages.c=A.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|[?:~]|[-+*/%&|^!=<>]=?/}),A.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),A.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},A.languages.c.string],char:A.languages.c.char,comment:A.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:A.languages.c}}}}),A.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 A.languages.c.boolean,A.languages.objectivec=A.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 A.languages.objectivec["class-name"],A.languages.objc=A.languages.objectivec,A.languages.reason=A.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/}),A.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 A.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}(A),A.languages.go=A.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/}),A.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete A.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"])}(A),A.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:/[{}[\];(),.:]/},A.languages.python["string-interpolation"].inside.interpolation.inside.rest=A.languages.python,A.languages.py=A.languages.python;((e,t)=>{for(var n in t)p(e,n,{get:t[n],enumerable:!0})})({},{dracula:()=>T,duotoneDark:()=>L,duotoneLight:()=>R,github:()=>N,jettwaveDark:()=>V,jettwaveLight:()=>W,nightOwl:()=>O,nightOwlLight:()=>j,oceanicNext:()=>I,okaidia:()=>D,oneDark:()=>G,oneLight:()=>q,palenight:()=>F,shadesOfPurple:()=>z,synthwave84:()=>$,ultramin:()=>B,vsDark:()=>U,vsLight:()=>H});var T={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)"}}]},L={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"}}]},R={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"}}]},N={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"}}]},O={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)"}}]},j={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)"}}]},P="#c5a5c5",M="#8dc891",I={plain:{backgroundColor:"#282c34",color:"#ffffff"},styles:[{types:["attr-name"],style:{color:P}},{types:["attr-value"],style:{color:M}},{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:M}},{types:["punctuation"],style:{color:M}},{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:P}},{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}}]},D={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)"}}]},$={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"}}]},B={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)"}}]},U={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)"}}]},H={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)"}}]},V={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"}}]},W={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"}}]},G={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%)"}}]},q={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%)"}}]},Y=(e,t)=>{const{plain:n}=e,r=e.styles.reduce(((e,n)=>{const{languages:r,style:a}=n;return r&&!r.includes(t)||n.types.forEach((t=>{const n=S(S({},e[t]),a);e[t]=n})),e}),{});return r.root=n,r.plain=_(S({},n),{backgroundColor:void 0}),r},K=/\r\n|\r|\n/,Q=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)},Z=(e,t)=>{const n=e.length;return n>0&&e[n-1]===t?e:e.concat(t)},X=e=>{const t=[[]],n=[e],r=[0],a=[e.length];let o=0,i=0,l=[];const s=[l];for(;i>-1;){for(;(o=r[i]++)<a[i];){let e,c=t[i];const u=n[i][o];if("string"==typeof u?(c=i>0?c:["plain"],e=u):(c=Z(c,u.type),u.alias&&(c=Z(c,u.alias)),e=u.content),"string"!=typeof e){i++,t.push(c),n.push(e),r.push(0),a.push(e.length);continue}const d=e.split(K),f=d.length;l.push({types:c,content:d[0]});for(let t=1;t<f;t++)Q(l),s.push(l=[]),l.push({types:c,content:d[t]})}i--,t.pop(),n.pop(),r.pop(),a.pop()}return Q(l),s},J=({children:e,language:t,code:n,theme:r,prism:a})=>{const o=t.toLowerCase(),i=((e,t)=>{const[n,r]=(0,u.useState)(Y(t,e)),a=(0,u.useRef)(),o=(0,u.useRef)();return(0,u.useEffect)((()=>{t===a.current&&e===o.current||(a.current=t,o.current=e,r(Y(t,e)))}),[e,t]),n})(o,r),l=(e=>(0,u.useCallback)((t=>{var n=t,{className:r,style:a,line:o}=n,i=E(n,["className","style","line"]);const l=_(S({},i),{className:(0,d.A)("token-line",r)});return"object"==typeof e&&"plain"in e&&(l.style=e.plain),"object"==typeof a&&(l.style=S(S({},l.style||{}),a)),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:a,style:o}=n,i=E(n,["token","className","style"]);const l=_(S({},i),{className:(0,d.A)("token",...r.types,a),children:r.content,style:t(r)});return null!=o&&(l.style=S(S({},l.style||{}),o)),l}),[t])})(i),c=(({prism:e,code:t,grammar:n,language:r})=>{const a=(0,u.useRef)(e);return(0,u.useMemo)((()=>{if(null==n)return X([t]);const e={code:t,grammar:n,language:r,tokens:[]};return a.current.hooks.run("before-tokenize",e),e.tokens=a.current.tokenize(t,n),a.current.hooks.run("after-tokenize",e),X(e.tokens)}),[t,n,r])})({prism:a,language:o,code:n,grammar:a.languages[o]});return e({tokens:c,className:`prism-code language-${o}`,style:null!=i?i.root:{},getLineProps:l,getTokenProps:s})},ee=e=>(0,u.createElement)(J,_(S({},e),{prism:e.prism||A,theme:e.theme||U,code:e.code,language:e.language}))},1561:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=!0,a="Invariant failed";function o(e,t){if(!e){if(r)throw new Error(a);var n="function"==typeof t?t():t,o=n?"".concat(a,": ").concat(n):a;throw new Error(o)}}},1635:(e,t,n)=>{"use strict";n.r(t),n.d(t,{__addDisposableResource:()=>P,__assign:()=>o,__asyncDelegator:()=>E,__asyncGenerator:()=>_,__asyncValues:()=>C,__await:()=>S,__awaiter:()=>m,__classPrivateFieldGet:()=>N,__classPrivateFieldIn:()=>j,__classPrivateFieldSet:()=>O,__createBinding:()=>h,__decorate:()=>l,__disposeResources:()=>I,__esDecorate:()=>c,__exportStar:()=>b,__extends:()=>a,__generator:()=>g,__importDefault:()=>R,__importStar:()=>L,__makeTemplateObject:()=>A,__metadata:()=>p,__param:()=>s,__propKey:()=>d,__read:()=>v,__rest:()=>i,__runInitializers:()=>u,__setFunctionName:()=>f,__spread:()=>w,__spreadArray:()=>x,__spreadArrays:()=>k,__values:()=>y,default:()=>D});var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)};function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var o=function(){return o=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var a in t=arguments[n])Object.prototype.hasOwnProperty.call(t,a)&&(e[a]=t[a]);return e},o.apply(this,arguments)};function i(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var a=0;for(r=Object.getOwnPropertySymbols(e);a<r.length;a++)t.indexOf(r[a])<0&&Object.prototype.propertyIsEnumerable.call(e,r[a])&&(n[r[a]]=e[r[a]])}return n}function l(e,t,n,r){var a,o=arguments.length,i=o<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,n,r);else for(var l=e.length-1;l>=0;l--)(a=e[l])&&(i=(o<3?a(i):o>3?a(t,n,i):a(t,n))||i);return o>3&&i&&Object.defineProperty(t,n,i),i}function s(e,t){return function(n,r){t(n,r,e)}}function c(e,t,n,r,a,o){function i(e){if(void 0!==e&&"function"!=typeof e)throw new TypeError("Function expected");return e}for(var l,s=r.kind,c="getter"===s?"get":"setter"===s?"set":"value",u=!t&&e?r.static?e:e.prototype:null,d=t||(u?Object.getOwnPropertyDescriptor(u,r.name):{}),f=!1,p=n.length-1;p>=0;p--){var m={};for(var g in r)m[g]="access"===g?{}:r[g];for(var g in r.access)m.access[g]=r.access[g];m.addInitializer=function(e){if(f)throw new TypeError("Cannot add initializers after decoration has completed");o.push(i(e||null))};var h=(0,n[p])("accessor"===s?{get:d.get,set:d.set}:d[c],m);if("accessor"===s){if(void 0===h)continue;if(null===h||"object"!=typeof h)throw new TypeError("Object expected");(l=i(h.get))&&(d.get=l),(l=i(h.set))&&(d.set=l),(l=i(h.init))&&a.unshift(l)}else(l=i(h))&&("field"===s?a.unshift(l):d[c]=l)}u&&Object.defineProperty(u,r.name,d),f=!0}function u(e,t,n){for(var r=arguments.length>2,a=0;a<t.length;a++)n=r?t[a].call(e,n):t[a].call(e);return r?n:void 0}function d(e){return"symbol"==typeof e?e:"".concat(e)}function f(e,t,n){return"symbol"==typeof t&&(t=t.description?"[".concat(t.description,"]"):""),Object.defineProperty(e,"name",{configurable:!0,value:n?"".concat(n," ",t):t})}function p(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function m(e,t,n,r){return new(n||(n=Promise))((function(a,o){function i(e){try{s(r.next(e))}catch(t){o(t)}}function l(e){try{s(r.throw(e))}catch(t){o(t)}}function s(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(i,l)}s((r=r.apply(e,t||[])).next())}))}function g(e,t){var n,r,a,o,i={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]};return o={next:l(0),throw:l(1),return:l(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function l(l){return function(s){return function(l){if(n)throw new TypeError("Generator is already executing.");for(;o&&(o=0,l[0]&&(i=0)),i;)try{if(n=1,r&&(a=2&l[0]?r.return:l[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,l[1])).done)return a;switch(r=0,a&&(l=[2&l[0],a.value]),l[0]){case 0:case 1:a=l;break;case 4:return i.label++,{value:l[1],done:!1};case 5:i.label++,r=l[1],l=[0];continue;case 7:l=i.ops.pop(),i.trys.pop();continue;default:if(!(a=i.trys,(a=a.length>0&&a[a.length-1])||6!==l[0]&&2!==l[0])){i=0;continue}if(3===l[0]&&(!a||l[1]>a[0]&&l[1]<a[3])){i.label=l[1];break}if(6===l[0]&&i.label<a[1]){i.label=a[1],a=l;break}if(a&&i.label<a[2]){i.label=a[2],i.ops.push(l);break}a[2]&&i.ops.pop(),i.trys.pop();continue}l=t.call(e,i)}catch(s){l=[6,s],r=0}finally{n=a=0}if(5&l[0])throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}([l,s])}}}var h=Object.create?function(e,t,n,r){void 0===r&&(r=n);var a=Object.getOwnPropertyDescriptor(t,n);a&&!("get"in a?!t.__esModule:a.writable||a.configurable)||(a={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,a)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]};function b(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||h(t,e,n)}function y(e){var t="function"==typeof Symbol&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function v(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,a,o=n.call(e),i=[];try{for(;(void 0===t||t-- >0)&&!(r=o.next()).done;)i.push(r.value)}catch(l){a={error:l}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(a)throw a.error}}return i}function w(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(v(arguments[t]));return e}function k(){for(var e=0,t=0,n=arguments.length;t<n;t++)e+=arguments[t].length;var r=Array(e),a=0;for(t=0;t<n;t++)for(var o=arguments[t],i=0,l=o.length;i<l;i++,a++)r[a]=o[i];return r}function x(e,t,n){if(n||2===arguments.length)for(var r,a=0,o=t.length;a<o;a++)!r&&a in t||(r||(r=Array.prototype.slice.call(t,0,a)),r[a]=t[a]);return e.concat(r||Array.prototype.slice.call(t))}function S(e){return this instanceof S?(this.v=e,this):new S(e)}function _(e,t,n){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var r,a=n.apply(e,t||[]),o=[];return r={},i("next"),i("throw"),i("return"),r[Symbol.asyncIterator]=function(){return this},r;function i(e){a[e]&&(r[e]=function(t){return new Promise((function(n,r){o.push([e,t,n,r])>1||l(e,t)}))})}function l(e,t){try{(n=a[e](t)).value instanceof S?Promise.resolve(n.value.v).then(s,c):u(o[0][2],n)}catch(r){u(o[0][3],r)}var n}function s(e){l("next",e)}function c(e){l("throw",e)}function u(e,t){e(t),o.shift(),o.length&&l(o[0][0],o[0][1])}}function E(e){var t,n;return t={},r("next"),r("throw",(function(e){throw e})),r("return"),t[Symbol.iterator]=function(){return this},t;function r(r,a){t[r]=e[r]?function(t){return(n=!n)?{value:S(e[r](t)),done:!1}:a?a(t):t}:a}}function C(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,n=e[Symbol.asyncIterator];return n?n.call(e):(e=y(e),t={},r("next"),r("throw"),r("return"),t[Symbol.asyncIterator]=function(){return this},t);function r(n){t[n]=e[n]&&function(t){return new Promise((function(r,a){(function(e,t,n,r){Promise.resolve(r).then((function(t){e({value:t,done:n})}),t)})(r,a,(t=e[n](t)).done,t.value)}))}}}function A(e,t){return Object.defineProperty?Object.defineProperty(e,"raw",{value:t}):e.raw=t,e}var T=Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t};function L(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&h(t,e,n);return T(t,e),t}function R(e){return e&&e.__esModule?e:{default:e}}function N(e,t,n,r){if("a"===n&&!r)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!r:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?r:"a"===n?r.call(e):r?r.value:t.get(e)}function O(e,t,n,r,a){if("m"===r)throw new TypeError("Private method is not writable");if("a"===r&&!a)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===r?a.call(e,n):a?a.value=n:t.set(e,n),n}function j(e,t){if(null===t||"object"!=typeof t&&"function"!=typeof t)throw new TypeError("Cannot use 'in' operator on non-object");return"function"==typeof e?t===e:e.has(t)}function P(e,t,n){if(null!=t){if("object"!=typeof t&&"function"!=typeof t)throw new TypeError("Object expected.");var r;if(n){if(!Symbol.asyncDispose)throw new TypeError("Symbol.asyncDispose is not defined.");r=t[Symbol.asyncDispose]}if(void 0===r){if(!Symbol.dispose)throw new TypeError("Symbol.dispose is not defined.");r=t[Symbol.dispose]}if("function"!=typeof r)throw new TypeError("Object not disposable.");e.stack.push({value:t,dispose:r,async:n})}else n&&e.stack.push({async:!0});return t}var M="function"==typeof SuppressedError?SuppressedError:function(e,t,n){var r=new Error(n);return r.name="SuppressedError",r.error=e,r.suppressed=t,r};function I(e){function t(t){e.error=e.hasError?new M(t,e.error,"An error was suppressed during disposal."):t,e.hasError=!0}return function n(){for(;e.stack.length;){var r=e.stack.pop();try{var a=r.dispose&&r.dispose.call(r.value);if(r.async)return Promise.resolve(a).then(n,(function(e){return t(e),n()}))}catch(o){t(o)}}if(e.hasError)throw e.error}()}const D={__extends:a,__assign:o,__rest:i,__decorate:l,__param:s,__metadata:p,__awaiter:m,__generator:g,__createBinding:h,__exportStar:b,__values:y,__read:v,__spread:w,__spreadArrays:k,__spreadArray:x,__await:S,__asyncGenerator:_,__asyncDelegator:E,__asyncValues:C,__makeTemplateObject:A,__importStar:L,__importDefault:R,__classPrivateFieldGet:N,__classPrivateFieldSet:O,__classPrivateFieldIn:j,__addDisposableResource:P,__disposeResources:I}},2654:e=>{"use strict";e.exports={}},4054:e=>{"use strict";e.exports=JSON.parse('{"/LmcRbacMvc/blog-f38":{"__comp":"a6aa9e1f","__context":{"plugin":"36994c47"},"sidebar":"814f3328","items":[{"content":"378f56c0"},{"content":"b5cb822e"}],"__props":"57a1fbff"},"/LmcRbacMvc/blog/archive-3db":{"__comp":"9e4087bc","__context":{"plugin":"36994c47"},"__props":"712eb253"},"/LmcRbacMvc/blog/authors-74c":{"__comp":"621db11d","__context":{"data":{"blogMetadata":"acecf23e"},"plugin":"36994c47"},"sidebar":"814f3328","__props":"b96269b9"},"/LmcRbacMvc/blog/new-documentation-5ba":{"__comp":"ccc49370","__context":{"data":{"blogMetadata":"acecf23e"},"plugin":"36994c47"},"sidebar":"814f3328","content":"809dac3e"},"/LmcRbacMvc/blog/tags-0ac":{"__comp":"01a85c17","__context":{"plugin":"36994c47"},"sidebar":"814f3328","__props":"cde7c749"},"/LmcRbacMvc/blog/tags/laminas-b15":{"__comp":"6875c492","__context":{"plugin":"36994c47"},"sidebar":"814f3328","items":[{"content":"378f56c0"},{"content":"b5cb822e"}],"__props":"3275e2b8"},"/LmcRbacMvc/blog/tags/lmcrbacmvc-200":{"__comp":"6875c492","__context":{"plugin":"36994c47"},"sidebar":"814f3328","items":[{"content":"378f56c0"}],"__props":"04b56dd9"},"/LmcRbacMvc/blog/tags/php-362":{"__comp":"6875c492","__context":{"plugin":"36994c47"},"sidebar":"814f3328","items":[{"content":"378f56c0"},{"content":"b5cb822e"}],"__props":"c0d4b1ca"},"/LmcRbacMvc/blog/welcome-c9c":{"__comp":"ccc49370","__context":{"data":{"blogMetadata":"acecf23e"},"plugin":"36994c47"},"sidebar":"814f3328","content":"ee696d42"},"/LmcRbacMvc/markdown-page-b53":{"__comp":"1f391b9e","__context":{"plugin":"a7456010"},"content":"393be207"},"/LmcRbacMvc/docs-ef6":{"__comp":"5e95c892","__context":{"plugin":"aba21aa0"}},"/LmcRbacMvc/docs/next-4e9":{"__comp":"a7bd4aaa","__props":"3af849c7"},"/LmcRbacMvc/docs/next-9ad":{"__comp":"a94703ab"},"/LmcRbacMvc/docs/next/configuration-5ff":{"__comp":"17896441","content":"9ed00105"},"/LmcRbacMvc/docs/next/guards-852":{"__comp":"17896441","content":"8b5d4ccc"},"/LmcRbacMvc/docs/next/Guides/debugging-b74":{"__comp":"17896441","content":"cc6cf6b9"},"/LmcRbacMvc/docs/next/Guides/example-42a":{"__comp":"17896441","content":"07642c9c"},"/LmcRbacMvc/docs/next/Guides/identity-providers-0bf":{"__comp":"17896441","content":"837900c0"},"/LmcRbacMvc/docs/next/Guides/lmcuser-bb8":{"__comp":"17896441","content":"a44fbaba"},"/LmcRbacMvc/docs/next/intro-ea5":{"__comp":"17896441","content":"0e384e19"},"/LmcRbacMvc/docs/next/plugins-42f":{"__comp":"17896441","content":"294ac9d5"},"/LmcRbacMvc/docs/next/strategies-803":{"__comp":"17896441","content":"f6027d55"},"/LmcRbacMvc/docs/next/Upgrading/upgrade-add":{"__comp":"17896441","content":"633f8beb"},"/LmcRbacMvc/docs/next/using-the-authorization-service-be7":{"__comp":"17896441","content":"4e6224b1"},"/LmcRbacMvc/docs-d61":{"__comp":"a7bd4aaa","__props":"7d54f919"},"/LmcRbacMvc/docs-2e2":{"__comp":"a94703ab"},"/LmcRbacMvc/docs/cookbook-44e":{"__comp":"17896441","content":"8bdb87c0"},"/LmcRbacMvc/docs/guards-80b":{"__comp":"17896441","content":"036cfcc4"},"/LmcRbacMvc/docs/installation-aef":{"__comp":"17896441","content":"e713aeb5"},"/LmcRbacMvc/docs/intro-dd0":{"__comp":"17896441","content":"d970cabc"},"/LmcRbacMvc/docs/quick-start-3c5":{"__comp":"17896441","content":"7543bdb1"},"/LmcRbacMvc/docs/role-providers-68b":{"__comp":"17896441","content":"778c4758"},"/LmcRbacMvc/docs/strategies-03b":{"__comp":"17896441","content":"b831a968"},"/LmcRbacMvc/docs/support-1fc":{"__comp":"17896441","content":"979f5aec"},"/LmcRbacMvc/docs/using-the-authorization-service-e3d":{"__comp":"17896441","content":"19e40cbb"},"/LmcRbacMvc/-41a":{"__comp":"c4f5d8e4","__context":{"plugin":"a7456010"},"config":"5e9f5e1a"}}')}},e=>{e.O(0,[1869],(()=>{return t=7815,e(e.s=t);var t}));e.O()}]); \ No newline at end of file diff --git a/assets/js/main.076466fd.js.LICENSE.txt b/assets/js/main.498b0bde.js.LICENSE.txt similarity index 100% rename from assets/js/main.076466fd.js.LICENSE.txt rename to assets/js/main.498b0bde.js.LICENSE.txt diff --git a/assets/js/runtime~main.62e8306b.js b/assets/js/runtime~main.62e8306b.js new file mode 100644 index 00000000..84d01f2a --- /dev/null +++ b/assets/js/runtime~main.62e8306b.js @@ -0,0 +1 @@ +(()=>{"use strict";var e,c,a,t,r,b={},d={};function f(e){var c=d[e];if(void 0!==c)return c.exports;var a=d[e]={exports:{}};return b[e].call(a.exports,a,a.exports,f),a.exports}f.m=b,e=[],f.O=(c,a,t,r)=>{if(!a){var b=1/0;for(i=0;i<e.length;i++){a=e[i][0],t=e[i][1],r=e[i][2];for(var d=!0,o=0;o<a.length;o++)(!1&r||b>=r)&&Object.keys(f.O).every((e=>f.O[e](a[o])))?a.splice(o--,1):(d=!1,r<b&&(b=r));if(d){e.splice(i--,1);var n=t();void 0!==n&&(c=n)}}return c}r=r||0;for(var i=e.length;i>0&&e[i-1][2]>r;i--)e[i]=e[i-1];e[i]=[a,t,r]},f.n=e=>{var c=e&&e.__esModule?()=>e.default:()=>e;return f.d(c,{a:c}),c},a=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,f.t=function(e,t){if(1&t&&(e=this(e)),8&t)return e;if("object"==typeof e&&e){if(4&t&&e.__esModule)return e;if(16&t&&"function"==typeof e.then)return e}var r=Object.create(null);f.r(r);var b={};c=c||[null,a({}),a([]),a(a)];for(var d=2&t&&e;"object"==typeof d&&!~c.indexOf(d);d=a(d))Object.getOwnPropertyNames(d).forEach((c=>b[c]=()=>e[c]));return b.default=()=>e,f.d(r,b),r},f.d=(e,c)=>{for(var a in c)f.o(c,a)&&!f.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:c[a]})},f.f={},f.e=e=>Promise.all(Object.keys(f.f).reduce(((c,a)=>(f.f[a](e,c),c)),[])),f.u=e=>"assets/js/"+({214:"e713aeb5",246:"f6027d55",345:"837900c0",430:"a44fbaba",999:"04b56dd9",1235:"a7456010",1390:"b5cb822e",1745:"7543bdb1",1868:"b96269b9",1903:"acecf23e",2417:"57a1fbff",2634:"c4f5d8e4",2711:"9e4087bc",2741:"b831a968",3223:"8b5d4ccc",3249:"ccc49370",3555:"07642c9c",3873:"9ed00105",3976:"0e384e19",4021:"c0d4b1ca",4072:"979f5aec",4107:"4e6224b1",4118:"d970cabc",4134:"393be207",4212:"621db11d",4813:"6875c492",5317:"8bdb87c0",5639:"378f56c0",5742:"aba21aa0",5937:"19e40cbb",5946:"778c4758",5997:"036cfcc4",6061:"1f391b9e",7018:"ee696d42",7098:"a7bd4aaa",7447:"cc6cf6b9",7472:"814f3328",7643:"a6aa9e1f",7784:"712eb253",7804:"809dac3e",8063:"3275e2b8",8102:"633f8beb",8117:"cde7c749",8209:"01a85c17",8401:"17896441",8500:"7d54f919",8744:"294ac9d5",9048:"a94703ab",9647:"5e95c892",9858:"36994c47",9926:"3af849c7"}[e]||e)+"."+{214:"733c029f",246:"b2505fcb",345:"e79d1df5",430:"9d432ce5",999:"0bbd9564",1235:"5f9bbb01",1390:"ba3d1b7b",1538:"a265ec9d",1745:"8fc45892",1868:"cfbd8a34",1903:"86afcb57",2237:"fe867cfb",2417:"be0d9c8e",2634:"fed9ac7d",2711:"9b70b1ae",2741:"af69091a",3223:"6cc585da",3249:"38b48d43",3347:"6b0bf050",3555:"9ced579e",3873:"224cb661",3976:"07fd4970",4021:"0f31ba8b",4072:"e2088a00",4107:"163e7fc5",4118:"20417bf6",4134:"1a944186",4212:"4117d741",4813:"0d9791f6",5317:"3ab5ea81",5639:"2d553100",5742:"ed09cce9",5937:"3433c7a4",5946:"a73e0da4",5997:"98f88a4b",6061:"6f467a80",7018:"48cd68ac",7098:"300507f7",7447:"7c1f2c29",7472:"eb903f9c",7643:"103cb339",7784:"32121b00",7804:"861672f1",8063:"edaaaf30",8102:"55fa4972",8117:"2b3c96b8",8209:"e660fcd3",8401:"f73ac772",8500:"a968d26f",8744:"7144cbd3",9048:"30c92f68",9647:"3d1fe17f",9858:"337a7516",9926:"e8dc50a7"}[e]+".js",f.miniCssF=e=>{},f.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),f.o=(e,c)=>Object.prototype.hasOwnProperty.call(e,c),t={},r="docs:",f.l=(e,c,a,b)=>{if(t[e])t[e].push(c);else{var d,o;if(void 0!==a)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")==r+a){d=u;break}}d||(o=!0,(d=document.createElement("script")).charset="utf-8",d.timeout=120,f.nc&&d.setAttribute("nonce",f.nc),d.setAttribute("data-webpack",r+a),d.src=e),t[e]=[c];var l=(c,a)=>{d.onerror=d.onload=null,clearTimeout(s);var r=t[e];if(delete t[e],d.parentNode&&d.parentNode.removeChild(d),r&&r.forEach((e=>e(a))),c)return c(a)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:d}),12e4);d.onerror=l.bind(null,d.onerror),d.onload=l.bind(null,d.onload),o&&document.head.appendChild(d)}},f.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.p="/LmcRbacMvc/",f.gca=function(e){return e={17896441:"8401",e713aeb5:"214",f6027d55:"246","837900c0":"345",a44fbaba:"430","04b56dd9":"999",a7456010:"1235",b5cb822e:"1390","7543bdb1":"1745",b96269b9:"1868",acecf23e:"1903","57a1fbff":"2417",c4f5d8e4:"2634","9e4087bc":"2711",b831a968:"2741","8b5d4ccc":"3223",ccc49370:"3249","07642c9c":"3555","9ed00105":"3873","0e384e19":"3976",c0d4b1ca:"4021","979f5aec":"4072","4e6224b1":"4107",d970cabc:"4118","393be207":"4134","621db11d":"4212","6875c492":"4813","8bdb87c0":"5317","378f56c0":"5639",aba21aa0:"5742","19e40cbb":"5937","778c4758":"5946","036cfcc4":"5997","1f391b9e":"6061",ee696d42:"7018",a7bd4aaa:"7098",cc6cf6b9:"7447","814f3328":"7472",a6aa9e1f:"7643","712eb253":"7784","809dac3e":"7804","3275e2b8":"8063","633f8beb":"8102",cde7c749:"8117","01a85c17":"8209","7d54f919":"8500","294ac9d5":"8744",a94703ab:"9048","5e95c892":"9647","36994c47":"9858","3af849c7":"9926"}[e]||e,f.p+f.u(e)},(()=>{var e={5354:0,1869:0};f.f.j=(c,a)=>{var t=f.o(e,c)?e[c]:void 0;if(0!==t)if(t)a.push(t[2]);else if(/^(1869|5354)$/.test(c))e[c]=0;else{var r=new Promise(((a,r)=>t=e[c]=[a,r]));a.push(t[2]=r);var b=f.p+f.u(c),d=new Error;f.l(b,(a=>{if(f.o(e,c)&&(0!==(t=e[c])&&(e[c]=void 0),t)){var r=a&&("load"===a.type?"missing":a.type),b=a&&a.target&&a.target.src;d.message="Loading chunk "+c+" failed.\n("+r+": "+b+")",d.name="ChunkLoadError",d.type=r,d.request=b,t[1](d)}}),"chunk-"+c,c)}},f.O.j=c=>0===e[c];var c=(c,a)=>{var t,r,b=a[0],d=a[1],o=a[2],n=0;if(b.some((c=>0!==e[c]))){for(t in d)f.o(d,t)&&(f.m[t]=d[t]);if(o)var i=o(f)}for(c&&c(a);n<b.length;n++)r=b[n],f.o(e,r)&&e[r]&&e[r][0](),e[r]=0;return f.O(i)},a=self.webpackChunkdocs=self.webpackChunkdocs||[];a.forEach(c.bind(null,0)),a.push=c.bind(null,a.push.bind(a))})()})(); \ No newline at end of file diff --git a/assets/js/runtime~main.c0234646.js b/assets/js/runtime~main.c0234646.js deleted file mode 100644 index 0ed27274..00000000 --- a/assets/js/runtime~main.c0234646.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";var e,t,a,r,c,o={},f={};function d(e){var t=f[e];if(void 0!==t)return t.exports;var a=f[e]={exports:{}};return o[e].call(a.exports,a,a.exports,d),a.exports}d.m=o,e=[],d.O=(t,a,r,c)=>{if(!a){var o=1/0;for(i=0;i<e.length;i++){a=e[i][0],r=e[i][1],c=e[i][2];for(var f=!0,n=0;n<a.length;n++)(!1&c||o>=c)&&Object.keys(d.O).every((e=>d.O[e](a[n])))?a.splice(n--,1):(f=!1,c<o&&(o=c));if(f){e.splice(i--,1);var b=r();void 0!==b&&(t=b)}}return t}c=c||0;for(var i=e.length;i>0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[a,r,c]},d.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return d.d(t,{a:t}),t},a=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,d.t=function(e,r){if(1&r&&(e=this(e)),8&r)return e;if("object"==typeof e&&e){if(4&r&&e.__esModule)return e;if(16&r&&"function"==typeof e.then)return e}var c=Object.create(null);d.r(c);var o={};t=t||[null,a({}),a([]),a(a)];for(var f=2&r&&e;"object"==typeof f&&!~t.indexOf(f);f=a(f))Object.getOwnPropertyNames(f).forEach((t=>o[t]=()=>e[t]));return o.default=()=>e,d.d(c,o),c},d.d=(e,t)=>{for(var a in t)d.o(t,a)&&!d.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},d.f={},d.e=e=>Promise.all(Object.keys(d.f).reduce(((t,a)=>(d.f[a](e,t),t)),[])),d.u=e=>"assets/js/"+({18:"ee696d42",21:"c0d4b1ca",48:"a94703ab",61:"1f391b9e",63:"3275e2b8",98:"a7bd4aaa",107:"4e6224b1",117:"cde7c749",134:"393be207",166:"22465cd7",209:"01a85c17",223:"8b5d4ccc",235:"a7456010",246:"f6027d55",249:"ccc49370",390:"b5cb822e",401:"17896441",416:"d9e16301",417:"57a1fbff",472:"814f3328",500:"7d54f919",571:"b9207088",634:"c4f5d8e4",639:"378f56c0",643:"a6aa9e1f",647:"5e95c892",711:"9e4087bc",742:"aba21aa0",784:"712eb253",803:"3b8c55ea",804:"809dac3e",813:"6875c492",814:"72e14192",858:"36994c47",903:"acecf23e",976:"0e384e19",999:"04b56dd9"}[e]||e)+"."+{18:"f654555a",21:"af4355eb",48:"a8e86096",61:"afd6222f",63:"c0d8267a",98:"7acfaa26",107:"497eb0d7",117:"53f93f3a",134:"b3cf2c30",166:"685bf539",209:"80194efd",223:"b7b33d1d",235:"47cad1bc",237:"02cb92cf",242:"8f375f31",246:"720fd4c4",249:"af21bf9f",390:"91b516dc",401:"241f5da3",416:"d4f1b334",417:"c104b4f4",472:"e5c2350a",500:"1d835b5a",538:"3a792d77",571:"cb0c414c",634:"00ce20a8",639:"ceb7f922",643:"4810414c",647:"4bba8c03",711:"c2e72ae7",742:"eb7bf6f2",784:"dbb8ddea",803:"3149f13b",804:"df60525c",813:"3f033c5c",814:"3a5f0d69",858:"5b43e344",903:"e3286c84",976:"bd8a3694",999:"0bbd9564"}[e]+".js",d.miniCssF=e=>{},d.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),d.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r={},c="docs:",d.l=(e,t,a,o)=>{if(r[e])r[e].push(t);else{var f,n;if(void 0!==a)for(var b=document.getElementsByTagName("script"),i=0;i<b.length;i++){var u=b[i];if(u.getAttribute("src")==e||u.getAttribute("data-webpack")==c+a){f=u;break}}f||(n=!0,(f=document.createElement("script")).charset="utf-8",f.timeout=120,d.nc&&f.setAttribute("nonce",d.nc),f.setAttribute("data-webpack",c+a),f.src=e),r[e]=[t];var l=(t,a)=>{f.onerror=f.onload=null,clearTimeout(s);var c=r[e];if(delete r[e],f.parentNode&&f.parentNode.removeChild(f),c&&c.forEach((e=>e(a))),t)return t(a)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:f}),12e4);f.onerror=l.bind(null,f.onerror),f.onload=l.bind(null,f.onload),n&&document.head.appendChild(f)}},d.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},d.p="/LmcRbacMvc/",d.gca=function(e){return e={17896441:"401",ee696d42:"18",c0d4b1ca:"21",a94703ab:"48","1f391b9e":"61","3275e2b8":"63",a7bd4aaa:"98","4e6224b1":"107",cde7c749:"117","393be207":"134","22465cd7":"166","01a85c17":"209","8b5d4ccc":"223",a7456010:"235",f6027d55:"246",ccc49370:"249",b5cb822e:"390",d9e16301:"416","57a1fbff":"417","814f3328":"472","7d54f919":"500",b9207088:"571",c4f5d8e4:"634","378f56c0":"639",a6aa9e1f:"643","5e95c892":"647","9e4087bc":"711",aba21aa0:"742","712eb253":"784","3b8c55ea":"803","809dac3e":"804","6875c492":"813","72e14192":"814","36994c47":"858",acecf23e:"903","0e384e19":"976","04b56dd9":"999"}[e]||e,d.p+d.u(e)},(()=>{var e={354:0,869:0};d.f.j=(t,a)=>{var r=d.o(e,t)?e[t]:void 0;if(0!==r)if(r)a.push(r[2]);else if(/^(354|869)$/.test(t))e[t]=0;else{var c=new Promise(((a,c)=>r=e[t]=[a,c]));a.push(r[2]=c);var o=d.p+d.u(t),f=new Error;d.l(o,(a=>{if(d.o(e,t)&&(0!==(r=e[t])&&(e[t]=void 0),r)){var c=a&&("load"===a.type?"missing":a.type),o=a&&a.target&&a.target.src;f.message="Loading chunk "+t+" failed.\n("+c+": "+o+")",f.name="ChunkLoadError",f.type=c,f.request=o,r[1](f)}}),"chunk-"+t,t)}},d.O.j=t=>0===e[t];var t=(t,a)=>{var r,c,o=a[0],f=a[1],n=a[2],b=0;if(o.some((t=>0!==e[t]))){for(r in f)d.o(f,r)&&(d.m[r]=f[r]);if(n)var i=n(d)}for(t&&t(a);b<o.length;b++)c=o[b],d.o(e,c)&&e[c]&&e[c][0](),e[c]=0;return d.O(i)},a=self.webpackChunkdocs=self.webpackChunkdocs||[];a.forEach(t.bind(null,0)),a.push=t.bind(null,a.push.bind(a))})()})(); \ No newline at end of file diff --git a/blog.html b/blog.html index 91396cfe..ceeb36e4 100644 --- a/blog.html +++ b/blog.html @@ -2,15 +2,15 @@ <html lang="en" dir="ltr" class="blog-wrapper blog-list-page plugin-blog plugin-id-default" data-has-hydrated="false"> <head> <meta charset="UTF-8"> -<meta name="generator" content="Docusaurus v3.4.0"> +<meta name="generator" content="Docusaurus v3.5.2"> <title data-rh="true">Blog | LmcRbacMvc - - - + + + -
Skip to main content

New documentation

· One min read
Eric Richer
LM-Commons Administrator

This the new documentation site dedicated to the LmcRbacMvc module.

-

There are no changes to the code, just improvements in the documentation.

Welcome

· One min read
Eric Richer
LM-Commons Administrator

Welcome to the new documentation website for the LM-Commons organization.

-

This site is work in progress and the intent is obviously to keep it current with updates to the LM-Commons packages.

+
Skip to main content

New documentation

· One min read
Eric Richer
LM-Commons Administrator

This the new documentation site dedicated to the LmcRbacMvc module.

+

There are no changes to the code, just improvements in the documentation.

Welcome

· One min read
Eric Richer
LM-Commons Administrator

Welcome to the new documentation website for the LM-Commons organization.

+

This site is work in progress and the intent is obviously to keep it current with updates to the LM-Commons packages.

\ No newline at end of file diff --git a/blog/archive.html b/blog/archive.html index 8039e257..610be619 100644 --- a/blog/archive.html +++ b/blog/archive.html @@ -2,13 +2,13 @@ - + Archive | LmcRbacMvc - - - + + + -
Skip to main content
+
Skip to main content
\ No newline at end of file diff --git a/blog/authors.html b/blog/authors.html new file mode 100644 index 00000000..e7d7b30f --- /dev/null +++ b/blog/authors.html @@ -0,0 +1,14 @@ + + + + + +Authors | LmcRbacMvc + + + + + +
Skip to main content

Authors

+ + \ No newline at end of file diff --git a/blog/new-documentation.html b/blog/new-documentation.html index 6ca9333f..0a595d1a 100644 --- a/blog/new-documentation.html +++ b/blog/new-documentation.html @@ -2,14 +2,14 @@ - + New documentation | LmcRbacMvc - - - + + + -
Skip to main content

New documentation

· One min read
Eric Richer
LM-Commons Administrator

This the new documentation site dedicated to the LmcRbacMvc module.

-

There are no changes to the code, just improvements in the documentation.

+
Skip to main content

New documentation

· One min read
Eric Richer
LM-Commons Administrator

This the new documentation site dedicated to the LmcRbacMvc module.

+

There are no changes to the code, just improvements in the documentation.

\ No newline at end of file diff --git a/blog/tags.html b/blog/tags.html index 0aa8f3cd..157a2587 100644 --- a/blog/tags.html +++ b/blog/tags.html @@ -2,13 +2,13 @@ - + Tags | LmcRbacMvc - - - + + + -
Skip to main content
+
Skip to main content
\ No newline at end of file diff --git a/blog/tags/laminas.html b/blog/tags/laminas.html index 42aef7c2..23985b05 100644 --- a/blog/tags/laminas.html +++ b/blog/tags/laminas.html @@ -2,15 +2,15 @@ - + 2 posts tagged with "laminas" | LmcRbacMvc - - - + + + -
Skip to main content

2 posts tagged with "laminas"

View All Tags

New documentation

· One min read
Eric Richer
LM-Commons Administrator

This the new documentation site dedicated to the LmcRbacMvc module.

-

There are no changes to the code, just improvements in the documentation.

Welcome

· One min read
Eric Richer
LM-Commons Administrator

Welcome to the new documentation website for the LM-Commons organization.

-

This site is work in progress and the intent is obviously to keep it current with updates to the LM-Commons packages.

+
Skip to main content

2 posts tagged with "laminas"

View All Tags

New documentation

· One min read
Eric Richer
LM-Commons Administrator

This the new documentation site dedicated to the LmcRbacMvc module.

+

There are no changes to the code, just improvements in the documentation.

Welcome

· One min read
Eric Richer
LM-Commons Administrator

Welcome to the new documentation website for the LM-Commons organization.

+

This site is work in progress and the intent is obviously to keep it current with updates to the LM-Commons packages.

\ No newline at end of file diff --git a/blog/tags/lmcrbacmvc.html b/blog/tags/lmcrbacmvc.html index ee3899fb..00421274 100644 --- a/blog/tags/lmcrbacmvc.html +++ b/blog/tags/lmcrbacmvc.html @@ -2,14 +2,14 @@ - + One post tagged with "lmcrbacmvc" | LmcRbacMvc - - - + + + -
Skip to main content

One post tagged with "lmcrbacmvc"

View All Tags

New documentation

· One min read
Eric Richer
LM-Commons Administrator

This the new documentation site dedicated to the LmcRbacMvc module.

-

There are no changes to the code, just improvements in the documentation.

+
Skip to main content

One post tagged with "lmcrbacmvc"

View All Tags

New documentation

· One min read
Eric Richer
LM-Commons Administrator

This the new documentation site dedicated to the LmcRbacMvc module.

+

There are no changes to the code, just improvements in the documentation.

\ No newline at end of file diff --git a/blog/tags/php.html b/blog/tags/php.html index 06dc72b8..f80292e3 100644 --- a/blog/tags/php.html +++ b/blog/tags/php.html @@ -2,15 +2,15 @@ - + 2 posts tagged with "PHP" | LmcRbacMvc - - - + + + -
Skip to main content

2 posts tagged with "PHP"

View All Tags

New documentation

· One min read
Eric Richer
LM-Commons Administrator

This the new documentation site dedicated to the LmcRbacMvc module.

-

There are no changes to the code, just improvements in the documentation.

Welcome

· One min read
Eric Richer
LM-Commons Administrator

Welcome to the new documentation website for the LM-Commons organization.

-

This site is work in progress and the intent is obviously to keep it current with updates to the LM-Commons packages.

+
Skip to main content

2 posts tagged with "PHP"

View All Tags

New documentation

· One min read
Eric Richer
LM-Commons Administrator

This the new documentation site dedicated to the LmcRbacMvc module.

+

There are no changes to the code, just improvements in the documentation.

Welcome

· One min read
Eric Richer
LM-Commons Administrator

Welcome to the new documentation website for the LM-Commons organization.

+

This site is work in progress and the intent is obviously to keep it current with updates to the LM-Commons packages.

\ No newline at end of file diff --git a/blog/welcome.html b/blog/welcome.html index 4245c1c6..b22c8bd7 100644 --- a/blog/welcome.html +++ b/blog/welcome.html @@ -2,14 +2,14 @@ - + Welcome | LmcRbacMvc - - - + + + -
Skip to main content

Welcome

· One min read
Eric Richer
LM-Commons Administrator

Welcome to the new documentation website for the LM-Commons organization.

-

This site is work in progress and the intent is obviously to keep it current with updates to the LM-Commons packages.

+
Skip to main content

Welcome

· One min read
Eric Richer
LM-Commons Administrator

Welcome to the new documentation website for the LM-Commons organization.

+

This site is work in progress and the intent is obviously to keep it current with updates to the LM-Commons packages.

\ No newline at end of file diff --git a/docs/cookbook.html b/docs/cookbook.html index 11ab52ec..0e9e1b96 100644 --- a/docs/cookbook.html +++ b/docs/cookbook.html @@ -1,18 +1,18 @@ - + - -Cookbook | LmcRbacMvc - - - + +Cookbook | LmcRbacMvc + + + -
Skip to main content

Cookbook

+
Version: 3.4

Cookbook

This section will help you further understand how LmcRbacMvc works by providing more concrete examples. If you have any other recipe you'd like to add, please open an issue!

-

A Real World Application

+

A Real World Application

In this example we are going to create a very little real world application. We will create a controller PostController that interacts with a service called PostService. For the sake of simplicity we will only cover the delete-methods of both parts.

@@ -26,7 +26,7 @@

A R

And for this one, too, let's quickly create the factory, again within our Module class.

class Module
{
// getAutoloaderConfig(), getConfig(), etc...

public function getServiceConfig()
{
return [
'factories' => [
'PostService' => function($sm) {
return new PostService(
$sm->get('doctrine.entitymanager.orm_default')
);
}
]
];
}
}

With this set up we can now cover some best practices.

-

Best practices

+

Best practices

Ideally, you should not protect your applications using only guards (Route or Controller guards). This leaves your application open for some undesired side-effects. As a best practice you should protect all your services or controllers by injecting the authorization service. @@ -49,13 +49,13 @@

Best practice

While protecting services is the more defensive way (because services are usually the last part of the logic flow), it is often complicated to deal with. If your application is architectured correctly, it is often simpler to protect your controllers.

-

When using guards then?

+

When using guards then?

In fact, you should see guards as a very efficient way to quickly reject access to a hierarchy of routes or a whole controller. For instance, assuming you have the following route config:

return [
'router' => [
'routes' => [
'admin' => [
'type' => 'Literal',
'options' => [
'route' => '/admin'
],
'may_terminate' => true,
'child_routes' => [
'users' => [
'type' => 'Literal',
'options' => [
'route' => '/users'
]
],
'invoices' => [
'type' => 'Literal',
'options' => [
'route' => '/invoices'
]
]
]
]
]
]
};

You can quickly reject access to all admin routes using the following guard:

return [
'lmc_rbac' => [
'guards' => [
'LmcRbacMvc\Guard\RouteGuard' => [
'admin*' => ['admin']
]
]
]
];
-

A Real World Application Part 2 - Only delete your own Posts

+

A Real World Application Part 2 - Only delete your own Posts

If you jumped straight to this section please notice that we assume you have the knowledge that we presented in the previous example. In here we will cover a very common use case. Users of our Application should only have delete permissions to their own content. So let's quickly refresh our PostService class:

@@ -77,12 +77,12 @@

// module.config.php or wherever you configure your RBAC stuff
return [
'lmc_rbac' => [
'assertion_map' => [
'deletePost' => 'Your\Namespace\MustBeAuthorAssertion'
]
]
];

+
// config/autoload/lmc_rbac.global.php or wherever your LmcRbac configuration file is
return [
'lmc_rbac' => [
'assertion_map' => [
'deletePost' => 'Your\Namespace\MustBeAuthorAssertion'
]
]
];

Now, whenever some test the deletePost permission, it will automatically call the MustBeAuthorAssertion from the AssertionPluginManager. This plugin manager is configured to automatically add unknown classes to an invokable. However, some assertions may need dependencies. You can manually configure the assertion plugin manager as shown below:

-
// module.config.php or wherever you configure your RBAC stuff
return [
'lmc_rbac' => [
// ... other rbac stuff
'assertion_manager' => [
'factories' => [
'AssertionWithDependency' => 'Your\Namespace\AssertionWithDependencyFactory'
]
]
]
];
+
// config/autoload/lmc_rbac.global.php or wherever your LmcRbac configuration file is
return [
'lmc_rbac' => [
// ... other rbac stuff
'assertion_manager' => [
'factories' => [
'AssertionWithDependency' => 'Your\Namespace\AssertionWithDependencyFactory'
]
]
]
];

Now we need to remember about the context. Somehow we need to let the AssertionPluginManager know about our context. This is done by simply passing it to the isGranted() method. For this we need to modify our Service one last time.

@@ -91,7 +91,7 @@

A Real World Application Part 3 - Admins can delete everything

+

A Real World Application Part 3 - Admins can delete everything

Often, you want users with a specific role to be able to have full access to everything. For instance, admins could delete all the posts, even if they don't own it.

However, with the previous assertion, even if the admin has the permission deletePost, it won't work because @@ -101,7 +101,7 @@

namespace Your\Namespace;

use LmcRbacMvc\Assertion\AssertionInterface;
use LmcRbacMvc\Service\AuthorizationService;

class MustBeAuthorAssertion implements AssertionInterface
{
/**
* Check if this assertion is true
*
* @param AuthorizationService $authorization
* @param mixed $context
*
* @return bool
*/
public function assert(AuthorizationService $authorization, $context = null)
{
if ($authorization->getIdentity() === $context->getAuthor()) {
return true;
}

return $authorization->isGranted('deleteOthersPost');
}
}

-

A Real World Application Part 4 - Checking permissions in the view

+

A Real World Application Part 4 - Checking permissions in the view

If some part of the view needs to be protected, you can use the shipped isGranted view helper.

For example, lets's say that only users with the permissions post.manage will have a menu item to acces the adminsitration panel :

@@ -110,7 +110,7 @@

In this last example, the menu item will be hidden for users who don't have the admin role.

-

Using LmcRbacMvc with Doctrine ORM

+

Using LmcRbacMvc with Doctrine ORM

First your User entity class must implement LmcRbacMvc\Identity\IdentityInterface :

use LmccUser\Entity\User as LmcUserEntity;
use LmcRbacMvc\Identity\IdentityInterface;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;

/**
* @ORM\Entity
* @ORM\Table(name="user")
*/
class User extends LmcUserEntity implements IdentityInterface
{
/**
* @var Collection
* @ORM\ManyToMany(targetEntity="HierarchicalRole")
*/
private $roles;

public function __construct()
{
$this->roles = new ArrayCollection();
}

/**
* {@inheritDoc}
*/
public function getRoles()
{
return $this->roles->toArray();
}

/**
* Set the list of roles
* @param Collection $roles
*/
public function setRoles(Collection $roles)
{
$this->roles->clear();
foreach ($roles as $role) {
$this->roles[] = $role;
}
}

/**
* Add one role to roles list
* @param \Rbac\Role\RoleInterface $role
*/
public function addRole(RoleInterface $role)
{
$this->roles[] = $role;
}
}

For this example we will use a more complex situation by using Rbac\Role\HierarchicalRoleInterface so the second step is to create HierarchicalRole entity class

@@ -120,7 +120,7 @@

        /**
* Configuration for role provider
*/
'role_provider' => [
'LmcRbacMvc\Role\ObjectRepositoryRoleProvider' => [
'object_manager' => 'doctrine.entitymanager.orm_default', // alias for doctrine ObjectManager
'class_name' => 'User\Entity\HierarchicalRole', // FQCN for your role entity class
'role_name_property' => 'name', // Name to show
],
],

Using DoctrineORM with LmcRbacMvc is very simple. You need to be aware of performance where there is a lot of permissions for roles.

-

How to deal with roles with lot of permissions?

+

How to deal with roles with lot of permissions?

In very complex applications, your roles may have dozens of permissions. In the [/data/FlatRole.php.dist] entity we provide, we configure the permissions association so that whenever a role is loaded, all of its permissions are also loaded in one query (notice the fetch="EAGER"):

@@ -136,14 +136,14 @@

Using LmcRbacMvc and ZF2 Assetic

+

Using LmcRbacMvc and ZF2 Assetic

To use Assetic with LmcRbacMvc guards, you should modify your module.config.php using the following configuration:

return [
'assetic_configuration' => [
'acceptableErrors' => [
\LmcRbacMvc\Guard\GuardInterface::GUARD_UNAUTHORIZED
]
]
];
-

Using LmcRbacMvc and LmcUser

+

Using LmcRbacMvc and LmcUser

To use the authentication service from LmcUser, just add the following alias in your application.config.php:

return [
'service_manager' => [
'aliases' => [
'Laminas\Authentication\AuthenticationService' => 'lmcuser_auth_service'
]
]
];

Finally add the LmcUser routes to your guards:

-
return [
'lmc_rbac' => [
'guards' => [
'LmcRbac\Guard\RouteGuard' => [
'lmcuser/login' => ['guest'],
'lmcuser/register' => ['guest'], // required if registration is enabled
'lmcuser*' => ['user'] // includes logout, changepassword and changeemail
]
]
]
];
+
return [
'lmc_rbac' => [
'guards' => [
'LmcRbac\Guard\RouteGuard' => [
'lmcuser/login' => ['guest'],
'lmcuser/register' => ['guest'], // required if registration is enabled
'lmcuser*' => ['user'] // includes logout, changepassword and changeemail
]
]
]
];
\ No newline at end of file diff --git a/docs/guards.html b/docs/guards.html index 638899ed..bf3bc968 100644 --- a/docs/guards.html +++ b/docs/guards.html @@ -1,22 +1,22 @@ - + - -Guards | LmcRbacMvc - - - + +Guards | LmcRbacMvc + + + -
Skip to main content

Guards

+
Version: 3.4

Guards

In this section, you will learn:

  • What guards are
  • How to use and configure built-in guards
  • How to create custom guards
-

What are guards and when should you use them?

+

What are guards and when should you use them?

Guards are listeners that are registered on a specific event of the MVC workflow. They allow your application to quickly mark a request as unauthorized.

Here is a simple workflow without guards:

@@ -32,7 +32,7 @@

Protection policy

+

Protection policy

By default, when a guard is added, it will perform a check only on the specified guard rules. Any route or controller that is not specified in the rules will be "granted" by default. Therefore, the default is a "blacklist" mechanism.

@@ -47,7 +47,7 @@

Protection

NOTE: this policy will block ANY route/controller (so it will also block any console routes or controllers). The deny policy is much more secure, but it needs much more configuration to work with.

-

Built-in guards

+

Built-in guards

LmcRbacMvc comes with four guards, in order of priority :

  • RouteGuard : protect a set of routes based on the identity roles
  • @@ -66,7 +66,7 @@

    Built-in gua

    Please note that if your application uses both route and controller guards, route guards are always executed before controller guards (they have a higher priority).

    -

    RouteGuard

    +

    RouteGuard

    The RouteGuard listens to the MvcEvent::EVENT_ROUTE event with a priority of -5.

    @@ -89,7 +89,7 @@

    RouteGuardThis rule will be inaccessible.

    Note : this last example could be (and should be) written in a more explicit way :

    return [
    'lmc_rbac' => [
    'guards' => [
    'LmcRbacMvc\Guard\RouteGuard' => [
    'route_under_construction' => []
    ]
    ]
    ]
    ];
    -

    RoutePermissionsGuard

    +

    RoutePermissionsGuard

    The RoutePermissionsGuard listens to the MvcEvent::EVENT_ROUTE event with a priority of -8.

    @@ -116,7 +116,7 @@

    RouteP

    Finally, you can also use an empty array to completly block a route, for maintenance purpose for example :

    return [
    'lmc_rbac' => [
    'guards' => [
    'LmcRbacMvc\Guard\RoutePermissionsGuard' => [
    'route_under_construction' => []
    ]
    ]
    ]
    ];

    This route will be inaccessible.

    -

    ControllerGuard

    +

    ControllerGuard

    The ControllerGuard listens to the MvcEvent::EVENT_ROUTE event with a priority of -10.

    @@ -134,7 +134,7 @@

    ControllerGu
    return [
    'lmc_rbac' => [
    'guards' => [
    'LmcRbacMvc\Guard\ControllerGuard' => [
    [
    'controller' => 'PostController',
    'roles' => ['member']
    ],
    [
    'controller' => 'PostController',
    'actions' => ['delete'],
    'roles' => ['admin']
    ]
    ]
    ]
    ]
    ];

    These rules grant access to each controller action to users that have the "member" role, but restrict the "delete" action to "admin" only.

    -

    ControllerPermissionsGuard

    +

    ControllerPermissionsGuard

    The ControllerPermissionsGuard listens to the MvcEvent::EVENT_ROUTE event with a priority of -13.

    @@ -147,13 +147,13 @@

    C to access each action of the MyController controller.

    As for all other guards, you can use a wildcard (*) character for permissions.

    The configuration rules are the same as for ControllerGuard.

    -

    Security notice

    +

    Security notice

    RouteGuard and ControllerGuard listen to the MvcEvent::EVENT_ROUTE event. Therefore, if you use the forward method in your controller, those guards will not intercept and check requests (because internally Laminas MVC does not trigger again a new MVC loop).

    Most of the time, this is not an issue, but you must be aware of it, and this is an additional reason why you should always protect your services too.

    -

    Creating custom guards

    +

    Creating custom guards

    LmcRbacMvc is flexible enough to allow you to create custom guards. Let's say we want to create a guard that will refuse access based on an IP addresses blacklist.

    First create the guard:

    @@ -175,6 +175,6 @@

    Creat

    Now we just need to add the guard to the guards option, so that LmcRbacMvc can execute the logic behind this guard. In your config, add the following code:

    return [
    'lmc_rbac' => [
    'guards' => [
    'Application\Guard\IpGuard' => [
    '87.45.66.46',
    '65.87.35.43'
    ]
    ]
    ]
    ];
    -

    The array of IP addresses will be passed to IpGuardFactory::__invoke in the $options parameter.

+

The array of IP addresses will be passed to IpGuardFactory::__invoke in the $options parameter.

\ No newline at end of file diff --git a/docs/installation.html b/docs/installation.html index 8f3c94cc..914db076 100644 --- a/docs/installation.html +++ b/docs/installation.html @@ -1,35 +1,35 @@ - + - -Requirements and Installation | LmcRbacMvc - - - + +Requirements and Installation | LmcRbacMvc + + + -
Skip to main content

Requirements and Installation

-

Requirements

+
Version: 3.4

Requirements and Installation

+

Requirements

-

Optional

+

Optional

-

Installation

+

Installation

LmcRbacMvc only officially supports installation through Composer. For Composer documentation, please refer to getcomposer.org.

Install the module:

$ composer require lm-commons/lmc-rbac-mvc:^3.0

Enable the module by adding LmcRbacMvc key to your application.config.php or modules.config.php file. Customize the module by copy-pasting the lmc_rbac.global.php.dist file to your config/autoload folder.

-

Upgrade

+

Upgrade

LmcRbacMvc introduces breaking changes from zfcrbac v2:

  • [BC] The namespace has been changed from ZfcRbac to LmcRbacMvc.
  • @@ -38,6 +38,6 @@

    Upgrade

+
\ No newline at end of file diff --git a/docs/intro.html b/docs/intro.html index 399e3212..5e6bf6e0 100644 --- a/docs/intro.html +++ b/docs/intro.html @@ -1,25 +1,25 @@ - + - -Introduction | LmcRbacMvc - - - + +Introduction | LmcRbacMvc + + + -
Skip to main content

Introduction

+
Version: 3.4

Introduction

LmcRbacMvc is a role-based access control Laminas MVC module to provide additional features on top of Laminas\Permissions\Rbac

LmcRbacMvc is part of the LM-Commons series of community developed packages for Laminas.

LM-Commons is a GitHub organization dedicated to the collaborative and community-driven long-term maintenance of packages & libraries based on the Laminas MVC and Components.

tip

Important Note:

If you are migrating from ZfcRbac v2, there are breaking changes to take into account. See the Upgrade section for details.

-

Why should I use an authorization module?

+

Why should I use an authorization module?

The authorization part of an application is an essential aspect of securing your application. While the authentication part tells you who is using your website, the authorization answers if the given identity has the permission to perform specific actions.

-

What is the Rbac model?

+

What is the Rbac model?

Rbac stands for role-based access control. We use a very simple (albeit powerful) implementation of this model through the use of the zf-fr/rbac library.

The basic idea of Rbac is to use roles and permissions:

@@ -35,7 +35,7 @@

What
  • Hierarchical RBAC model: in this model, roles can have child roles. When evaluating if a given role has a permission, this model also checks recursively if any of its child roles also have the permission.
  • -

    How can I integrate LmcRbacMvc into my application?

    +

    How can I integrate LmcRbacMvc into my application?

    LmcRbacMvc offers multiple ways to protect your application:

    • Using Guards: these classes act as "firewalls" that block access to routes and/or controllers. Guards are usually @@ -49,6 +49,6 @@

      Cookbook: A real world example

    • -
    +
    \ No newline at end of file diff --git a/docs/next/Guides/debugging.html b/docs/next/Guides/debugging.html new file mode 100644 index 00000000..f95c1108 --- /dev/null +++ b/docs/next/Guides/debugging.html @@ -0,0 +1,25 @@ + + + + + +Debugging Tools | LmcRbacMvc + + + + + +
    Skip to main content
    Version: Next

    Debugging Tools

    +

    LmcRbacMvcDeveloperTools is an extension +for the Laminas Developer Tools, +that collects and displays debugging data on settings, guards and roles.

    +

    Installation

    +
    $ composer require --dev lm-commons/lmc-rbac-mvc-devtools
    +

    Composer should ask to install the module. Typically, this module will go in development.config.php.

    +

    Toolbar

    +

    LmcRbacMvcDeveloperTools provides toolbars to view settings, guards and roles:

    +

    Settings +Guards +Roles

    + + \ No newline at end of file diff --git a/docs/next/Guides/example.html b/docs/next/Guides/example.html new file mode 100644 index 00000000..e51c6f19 --- /dev/null +++ b/docs/next/Guides/example.html @@ -0,0 +1,136 @@ + + + + + +A Real World Example | LmcRbacMvc + + + + + +
    Skip to main content
    Version: Next

    A Real World Example

    In this example we are going to create a very little real world application. We will create a controller +PostController that interacts with a service called PostService. For the sake of simplicity we will only +cover the delete-methods of both parts.

    +

    Let's start by creating a controller that has the PostService as dependency:

    +
    class PostController extends \Laminas\Mvc\Controller\AbstractActionController
    {
    protected PostService $postService;

    public function __construct(PostService $postService)
    {
    $this->postService = $postService;
    }

    // addAction(), editAction(), etc...

    public function deleteAction()
    {
    $id = $this->params()->fromRoute('id');

    $this->postService->deletePost($id);

    return $this->redirect()->toRoute('posts');
    }
    }
    +

    Since we have a dependency, let's inject it using the ControllerManager, we will do this inside our Module class

    +
    class Module
    {
    public function getConfig()
    {
    return [
    'controllers' => [
    'factories' => [
    'PostController' => function ($container) {
    return new PostController(
    $container->get('PostService')
    );
    },
    ],
    ],
    ];
    }
    }
    +

    Now that we have this in place let us quickly define our PostService. We will be using a Service that makes use +of Doctrine, so we require a Doctrine\Persistence\ObjectManager as dependency.

    +
    use Doctrine\Persistence\ObjectManager;

    class PostService
    {
    protected $objectManager;

    public function __construct(ObjectManager $objectManager)
    {
    $this->objectManager = $objectManager;
    }

    public function deletePost($id)
    {
    $post = $this->objectManager->find('Post', $id);
    $this->objectManager->remove($post);
    $this->objectManager->flush();
    }
    }
    +

    And for this one, too, let's quickly create the factory, again within our Module class.

    +
    class Module
    {
    // getAutoloaderConfig(), getConfig(), etc...

    public function getServiceConfig()
    {
    return [
    'factories' => [
    'PostService' => function($container) {
    return new PostService(
    $container->get('doctrine.entitymanager.orm_default')
    );
    }
    ]
    ];
    }
    }
    +

    With this set up we can now cover some best practices.

    +

    Best practices

    +

    Ideally, you should not protect your applications using only guards (Route or Controller guards). +This leaves your application open for some undesired side-effects. +As a best practice you should protect all your services or controllers by injecting the authorization service. +But let's go step by step:

    +

    Assuming the application example above we can easily use LmcRbacMvc to protect our route using the following guard:

    +
    return [
    'lmc_rbac' => [
    'guards' => [
    \Lmc\Rbac\Mvc\Guard\RouteGuard::class => [
    'post/delete' => ['admin']
    ]
    ]
    ]
    ];
    +

    Now, any users that do not have the "admin" role will receive a 403 error (unauthorized) when trying to access +the "post/delete" route. However, this does not prevent the service (which should contain the actual logic in a properly +design application) to be injected and used elsewhere in your code. For instance:

    +
    class PostController
    {
    protected $postService;

    public function createAction()
    {
    // this action may have been reached through the "forward" method, hence bypassing guards
    $this->postService->deletePost('2');
    }
    }
    +

    You see the issue!

    +

    The solution is to inject the AuthorizationService into your services and check for the +permissions before doing anything wrong. So let's modify our previously created PostService class

    +
    use Doctrine\Persistence\ObjectManager;
    use Lmc\Rbac\Mvc\Service\AuthorizationService;

    class PostService
    {
    protected $objectManager;

    protected $authorizationService;

    public function __construct(
    ObjectManager $objectManager,
    AuthorizationService $authorizationService
    ) {
    $this->objectManager = $objectManager;
    $this->authorizationService = $authorizationService;
    }

    public function deletePost($id)
    {
    // First check permission
    if (!$this->authorizationService->isGranted('deletePost')) {
    throw new UnauthorizedException('You are not allowed !');
    }

    $post = $this->objectManager->find('Post', $id);
    $this->objectManager->remove($post);
    $this->objectManager->flush();
    }
    }
    +

    Since we now have an additional dependency we should inject it through our factory, again within our Module class.

    +
    class Module
    {
    // getAutoloaderConfig(), getConfig(), etc...

    public function getServiceConfig()
    {
    return [
    'factories' => [
    'PostService' => function($sm) {
    return new PostService(
    $sm->get('doctrine.entitymanager.orm_default'),
    $sm->get('Lmc\Rbac\Mvc\Service\AuthorizationService') // This is new!
    );
    }
    ]
    ];
    }
    }
    +

    Alternatively, you can also protect your controllers using the isGranted helper (you do not need to inject +the AuthorizationService then):

    +
    class PostController
    {
    protected $postService;

    public function createAction()
    {
    if (!$this->isGranted('deletePost')) {
    throw new UnauthorizedException('You are not allowed !');
    }

    $this->postService->deletePost('2');
    }
    }
    +

    While protecting services is the more defensive way (because services are usually the last part of the logic flow), +it is often complicated to deal with. +If your application is architectured correctly, it is often simpler to protect your controllers.

    +

    When using guards then?

    +

    In fact, you should see guards as a very efficient way to quickly reject access to a hierarchy of routes or a +whole controller. For instance, assuming you have the following route config:

    +
    return [
    'router' => [
    'routes' => [
    'admin' => [
    'type' => 'Literal',
    'options' => [
    'route' => '/admin'
    ],
    'may_terminate' => true,
    'child_routes' => [
    'users' => [
    'type' => 'Literal',
    'options' => [
    'route' => '/users'
    ]
    ],
    'invoices' => [
    'type' => 'Literal',
    'options' => [
    'route' => '/invoices'
    ]
    ]
    ]
    ]
    ]
    ]
    };
    +

    You can quickly reject access to all admin routes using the following guard:

    +
    return [
    'lmc_rbac' => [
    'guards' => [
    'Lmc\Rbac\Mvc\Guard\RouteGuard' => [
    'admin*' => ['admin']
    ]
    ]
    ]
    ];
    +

    A Real World Application Part 2 - Only delete your own Posts

    +

    If you jumped straight to this section please notice that we assume you have the knowledge that we presented in the +previous example. In here we will cover a very common use case. Users of our Application should only have delete +permissions to their own content. So let's quickly refresh our PostService class:

    +
    use Doctrine\Persistence\ObjectManager;

    class PostService
    {
    protected $objectManager;

    protected $authorizationService;

    public function __construct(
    ObjectManager $objectManager,
    AuthorizationService $authorizationService
    ) {
    $this->objectManager = $objectManager;
    $this->authorizationService = $authorizationService;
    }

    public function deletePost($id)
    {
    // First check permission
    if (!$this->authorizationService->isGranted('deletePost')) {
    throw new UnauthorizedException('You are not allowed !');
    }

    $post = $this->objectManager->find('Post', $id);
    $this->objectManager->remove($post);
    $this->objectManager->flush();
    }
    }
    +

    As we can see, we check within our Service if the User of our Application is allowed to delete the post with a check +against the deletePost permission. Now how can we achieve that only a user who is the owner of the Post to be able to +delete his own post, but other users can't? We do not want to change our Service with more complex logic because this +is not the task of such service. The Permission-System should handle this. And we can, for this we have the +AssertionPluginManager and here is how to do it:

    +

    First of all we need to write an Assertion. The Assertion will return a boolean statement about the current +identity being the owner of the post.

    +
    namespace Your\Namespace;

    use Lmc\Rbac\Mvc\Assertion\AssertionInterface;
    use Lmc\Rbac\Mvc\Service\AuthorizationService;

    class MustBeAuthorAssertion implements AssertionInterface
    {
    /**
    * Check if this assertion is true
    *
    * @param AuthorizationService $authorization
    * @param mixed $post
    *
    * @return bool
    */
    public function assert(AuthorizationService $authorization, $post = null)
    {
    return $authorization->getIdentity() === $post->getAuthor();
    }
    }
    +

    This simple MustBeAuthorAssertion will check against the current $authorization if it equals the identity of the +current context Author. The second parameter is called the "context". A context can be anything (an object, a scalar, +an array...) and only makes sense in the context of the assertion.

    +

    Imagine a user calls http://my.dom/post/delete/42, so obviously he wants to delete the Post-Entity with ID#42. In +this case Entity#42 is our Context! If you're wondering how the context gets there, bare with me. We will get to +this later.

    +

    Now that we have written the Assertion, we want to make sure that this assertion will always be called, whenever we +check for the deletePost permission. We don't want others to delete our previous content! For this we have the so +called assertion_map. In this map we glue assertions and permissions together.

    +
    // config/autoload/lmc_rbac.global.php or wherever your LmcRbac configuration file is
    return [
    'lmc_rbac' => [
    'assertion_map' => [
    'deletePost' => 'Your\Namespace\MustBeAuthorAssertion'
    ]
    ]
    ];
    +

    Now, whenever some test the deletePost permission, it will automatically call the MustBeAuthorAssertion from +the AssertionPluginManager. This plugin manager is configured to automatically add unknown classes to an invokable. +However, some assertions may need dependencies. You can manually configure the assertion plugin manager as +shown below:

    +
    // config/autoload/lmc_rbac.global.php or wherever your LmcRbac configuration file is
    return [
    'lmc_rbac' => [
    // ... other rbac stuff
    'assertion_manager' => [
    'factories' => [
    'AssertionWithDependency' => 'Your\Namespace\AssertionWithDependencyFactory'
    ]
    ]
    ]
    ];
    +

    Now we need to remember about the context. Somehow we need to let the AssertionPluginManager know about our +context. This is done by simply passing it to the isGranted() method. For this we need to modify our Service +one last time.

    +
    use Doctrine\Persistence\ObjectManager;

    class PostService
    {
    protected $objectManager;

    protected $authorizationService;

    public function __construct(
    ObjectManager $objectManager,
    AuthorizationService $autorizationService
    ) {
    $this->objectManager = $objectManager;
    $this->authorizationService = $autorizationService;
    }

    public function deletePost($id)
    {
    // Note, we now need to query for the post of interest first!
    $post = $this->objectManager->find('Post', $id);

    // Check the permission now with a given context
    if (!$this->authorizationService->isGranted('deletePost', $post)) {
    throw new UnauthorizedException('You are not allowed !');
    }

    $this->objectManager->remove($post);
    $this->objectManager->flush();
    }
    }
    +

    And there you have it. The context is injected into the isGranted() method and now the AssertionPluginManager knows +about it and can do its thing. Note that in reality, after you have queried for the $post you would check if $post +is actually a real post. Because if it is an empty return value then you should throw an exception earlier without +needing to check against the permission.

    +

    A Real World Application Part 3 - Admins can delete everything

    +

    Often, you want users with a specific role to be able to have full access to everything. For instance, admins could +delete all the posts, even if they don't own it.

    +

    However, with the previous assertion, even if the admin has the permission deletePost, it won't work because +the assertion will evaluate to false.

    +

    Actually, the answer is quite simple: deleting my own posts and deleting others' posts should be treated like +two different permissions (it makes sense if you think about it). Therefore, admins will have the permission +deleteOthersPost (as well as the permission deletePost, because admin could write posts, too).

    +

    The assertion must therefore be modified like this:

    +
    namespace Your\Namespace;

    use Lmc\Rbac\Mvc\Assertion\AssertionInterface;
    use Lmc\Rbac\Mvc\Service\AuthorizationService;

    class MustBeAuthorAssertion implements AssertionInterface
    {
    /**
    * Check if this assertion is true
    *
    * @param AuthorizationService $authorization
    * @param mixed $context
    *
    * @return bool
    */
    public function assert(AuthorizationService $authorization, $context = null)
    {
    if ($authorization->getIdentity() === $context->getAuthor()) {
    return true;
    }

    return $authorization->isGranted('deleteOthersPost');
    }
    }
    +

    A Real World Application Part 4 - Checking permissions in the view

    +

    If some part of the view needs to be protected, you can use the shipped isGranted view helper.

    +

    For example, lets's say that only users with the permissions post.manage will have a menu item to acces +the adminsitration panel :

    +

    In your template post-index.phtml

    +
    <ul class="nav">
    <li><a href="/">Home</a></li>
    <li><a href="/posts/list">View posts</a></li>
    <?php if ($this->isGranted('post.manage'): ?>
    <li><a href="/posts/admin">Manage posts</a></li>
    <?php endif ?>
    </ul>
    +

    You can even protect your menu item regarding a role, by using the hasRole view helper :

    +
    <ul class="nav">
    <li><a href="/">Home</a></li>
    <li><a href="/posts/list">View posts</a></li>
    <?php if ($this->hasRole('admin'): ?>
    <li><a href="/posts/admin">Manage posts</a></li>
    <?php endif ?>
    </ul>
    +

    In this last example, the menu item will be hidden for users who don't have the admin role.

    +

    Using LmcRbacMvc with Doctrine ORM

    +

    First your User entity class must implement Lmc\Rbac\Mvc\Identity\IdentityInterface :

    +
    use LmccUser\Entity\User as LmcUserEntity;
    use Lmc\Rbac\Mvc\Identity\IdentityInterface;
    use Doctrine\ORM\Mapping as ORM;
    use Doctrine\Common\Collections\ArrayCollection;
    use Doctrine\Common\Collections\Collection;

    /**
    * @ORM\Entity
    * @ORM\Table(name="user")
    */
    class User extends LmcUserEntity implements IdentityInterface
    {
    /**
    * @var Collection
    * @ORM\ManyToMany(targetEntity="HierarchicalRole")
    */
    private $roles;

    public function __construct()
    {
    $this->roles = new ArrayCollection();
    }

    /**
    * {@inheritDoc}
    */
    public function getRoles()
    {
    return $this->roles->toArray();
    }

    /**
    * Set the list of roles
    * @param Collection $roles
    */
    public function setRoles(Collection $roles)
    {
    $this->roles->clear();
    foreach ($roles as $role) {
    $this->roles[] = $role;
    }
    }

    /**
    * Add one role to roles list
    * @param \Rbac\Role\RoleInterface $role
    */
    public function addRole(RoleInterface $role)
    {
    $this->roles[] = $role;
    }
    }
    +

    For this example we will use a more complex situation by using Rbac\Role\HierarchicalRoleInterface so the second step is to create HierarchicalRole entity class

    +
    class HierarchicalRole implements HierarchicalRoleInterface
    {
    /**
    * @var HierarchicalRoleInterface[]|\Doctrine\Common\Collections\Collection
    *
    * @ORM\ManyToMany(targetEntity="HierarchicalRole")
    */
    protected $children;

    /**
    * @var PermissionInterface[]|\Doctrine\Common\Collections\Collection
    *
    * @ORM\ManyToMany(targetEntity="Permission", indexBy="name", fetch="EAGER", cascade={"persist"})
    */
    protected $permissions;

    /**
    * Init the Doctrine collection
    */
    public function __construct()
    {
    $this->children = new ArrayCollection();
    $this->permissions = new ArrayCollection();
    }

    /**
    * {@inheritDoc}
    */
    public function addChild(HierarchicalRoleInterface $child)
    {
    $this->children[] = $child;
    }

    /*
    * Set the list of permission
    * @param Collection $permissions
    */
    public function setPermissions(Collection $permissions)
    {
    $this->permissions->clear();
    foreach ($permissions as $permission) {
    $this->permissions[] = $permission;
    }
    }

    /**
    * {@inheritDoc}
    */
    public function addPermission($permission)
    {
    if (is_string($permission)) {
    $permission = new Permission($permission);
    }

    $this->permissions[(string) $permission] = $permission;
    }

    /**
    * {@inheritDoc}
    */
    public function hasPermission($permission)
    {
    // This can be a performance problem if your role has a lot of permissions. Please refer
    // to the cookbook to an elegant way to solve this issue

    return isset($this->permissions[(string) $permission]);
    }

    /**
    * {@inheritDoc}
    */
    public function getChildren()
    {
    return $this->children->toArray();
    }

    /**
    * {@inheritDoc}
    */
    public function hasChildren()
    {
    return !$this->children->isEmpty();
    }
    }
    +

    And the last step is to create a Permission entity class which is a very simple entity class. You don't have to do specific things!

    +

    You can find all entity examples in this folder : Example

    +

    You need one more configuration step. Indeed, how can the RoleProvider retrieve your role and permissions? For this you need to configure LmcRbacMvc\Role\ObjectRepositoryRoleProvider in your lmc_rbac.global.php file :

    +
            /**
    * Configuration for role provider
    */
    'role_provider' => [
    'LmcRbacMvc\Role\ObjectRepositoryRoleProvider' => [
    'object_manager' => 'doctrine.entitymanager.orm_default', // alias for doctrine ObjectManager
    'class_name' => 'User\Entity\HierarchicalRole', // FQCN for your role entity class
    'role_name_property' => 'name', // Name to show
    ],
    ],
    +

    Using DoctrineORM with LmcRbacMvc is very simple. You need to be aware of performance where there is a lot of permissions for roles.

    +

    How to deal with roles with lot of permissions?

    +

    In very complex applications, your roles may have dozens of permissions. In the [/data/FlatRole.php.dist] entity +we provide, we configure the permissions association so that whenever a role is loaded, all of its permissions are also +loaded in one query (notice the fetch="EAGER"):

    +
    /**
    * @ORM\ManyToMany(targetEntity="Permission", indexBy="name", fetch="EAGER")
    */
    protected $permissions;
    +

    The hasPermission method is therefore really simple:

    +
    public function hasPermission($permission)
    {
    return isset($this->permissions[(string) $permission]);
    }
    +

    However, with a lot of permissions, this method will quickly kill your database. What you can do is modfiy the Doctrine +mapping so that the collection is not actually loaded:

    +
    /**
    * @ORM\ManyToMany(targetEntity="Permission", indexBy="name", fetch="LAZY")
    */
    protected $permissions;
    +

    Then, modify the hasPermission method to use the Criteria API. The Criteria API is a Doctrine 2.2+ API that allows +your application to efficiently filter a collection without loading the whole collection:

    +
    use Doctrine\Common\Collections\Criteria;

    public function hasPermission($permission)
    {
    $criteria = Criteria::create()->where(Criteria::expr()->eq('name', (string) $permission));
    $result = $this->permissions->matching($criteria);

    return count($result) > 0;
    }
    +
    +

    NOTE: This is only supported starting from Doctrine ORM 2.5!

    +
    + + \ No newline at end of file diff --git a/docs/next/Guides/identity-providers.html b/docs/next/Guides/identity-providers.html new file mode 100644 index 00000000..a3f3524c --- /dev/null +++ b/docs/next/Guides/identity-providers.html @@ -0,0 +1,22 @@ + + + + + +Create a custom identity provider | LmcRbacMvc + + + + + +
    Skip to main content
    Version: Next

    Create a custom identity provider

    Identity providers return the current identity. Most of the time, this means the logged in user. LmcRbacMvc comes with a +default identity provider (Lmc\Rbac\Mvc\Identity\AuthenticationIdentityProvider) that uses the +Laminas\Authentication\AuthenticationService service.

    +

    Create your own identity provider

    +

    If you want to implement your own identity provider, create a new class that implements +Lmc\Rbac\Mvc\Identity\IdentityProviderInterface class. Then, change the identity_provider option in LmcRbacMvc config, +as shown below:

    +
    return [
    'lmc_rbac' => [
    'identity_provider' => 'MyCustomIdentityProvider'
    ]
    ];
    +

    The identity provider is automatically pulled from the service manager.

    + + \ No newline at end of file diff --git a/docs/next/Guides/lmcuser.html b/docs/next/Guides/lmcuser.html new file mode 100644 index 00000000..27537b35 --- /dev/null +++ b/docs/next/Guides/lmcuser.html @@ -0,0 +1,43 @@ + + + + + +Using LmcRbacMvc and LmcUser | LmcRbacMvc + + + + + +
    Skip to main content
    Version: Next

    Using LmcRbacMvc and LmcUser

    To use the authentication service from LmcUser, there are a few actions to take:

    +
      +
    1. Set up a user entity that supports roles
    2. +
    3. Set up the Laminas authentication service to use LmcUser
    4. +
    5. Set up guards
    6. +
    7. Optionally, set up a redirect strategy
    8. +
    +

    Set up the user entity

    +

    The default user entity class in LmcUser does not implement the Lmc\Rbac\Identity\IdentityInterface. You will need +to define a user identity class that does by, for example, extending the default user class:

    +
    <?php

    class CustomUser extends \LmcUser\Entity\User implements \Lmc\Rbac\Identity\IdentityInterface
    {
    private array $roles = ['user']; // let's make 'user' the default role

    public function getRoles(): array
    {
    return $this->roles;
    }

    public function setRoles(array $roles): User
    {
    $this->roles = $roles;
    return $this;
    }
    }
    +

    and then set LmcUser to use this entity:

    +
    return [
    'lmc_user' => [
    'user_entity_class' => CustomUser::class,
    ]
    ];
    +
    note

    This example does not cover modifying the database tables and mappers to fetch/hydrate roles into the user object.

    +

    Set up the Laminas authentication service to use LmcUser

    +

    You need to set up Laminas Authentication to use the Authentication service from LmcUser.

    +

    Add the following alias in your application.config.php:

    +
    return [
    'service_manager' => [
    'aliases' => [
    'Laminas\Authentication\AuthenticationService' => 'lmcuser_auth_service'
    ]
    ]
    ];
    +

    Set up guards

    +

    The login and register pages should be only accessible from 'guest' users and all other pages should be accessible from +logged in users.

    +

    Add the LmcUser routes to your guards:

    +
    return [
    'lmc_rbac' => [
    'guards' => [
    \Lmc\Rbac\Mvc\Guard\RouteGuard::class => [
    'lmcuser/login' => ['guest'],
    'lmcuser/register' => ['guest'], // required if registration is enabled
    'lmcuser*' => ['user'] // includes logout, changepassword and changeemail
    ]
    ]
    ]
    ];
    +

    Set up a redirect strategy

    +

    If you would like for your application to redirect users to the login page when an unauthorized access is detected, then +you need to setup the RedirectStrategy:

    +

    In your application.config.php:

    +

    return [
    'listeners' => [
    \Lmc\Rbac\Mvc\View\Strategy\RedirectStrategy::class,
    ],
    ];
    +

    In your LmcRbac config file

    +
    return [
    'lmc_rbac' => [
    'redirect_strategy' => [
    'redirect_when_connected' => true,
    'redirect_to_route_connected' => 'home',
    'redirect_to_route_disconnected' => 'lmcuser/login',
    'append_previous_uri' => true,
    'previous_uri_query_key' => 'redirectTo'
    ],
    ]
    ];
    + + \ No newline at end of file diff --git a/docs/next/Upgrading/upgrade.html b/docs/next/Upgrading/upgrade.html new file mode 100644 index 00000000..3e0117ea --- /dev/null +++ b/docs/next/Upgrading/upgrade.html @@ -0,0 +1,14 @@ + + + + + +Upgrading from v3 to v4 | LmcRbacMvc + + + + + +
    Skip to main content
    Version: Next

    Upgrading from v3 to v4

    + + \ No newline at end of file diff --git a/docs/next/configuration.html b/docs/next/configuration.html new file mode 100644 index 00000000..51033077 --- /dev/null +++ b/docs/next/configuration.html @@ -0,0 +1,20 @@ + + + + + +Configuring LmcRbacMvc | LmcRbacMvc + + + + + +
    Skip to main content
    Version: Next

    Configuring LmcRbacMvc

    LmcRbacMvc is configured via the lmc_rbac key in the application config.

    +

    This is typically achieved by creating +a config/autoload/lmcrbac.global.php file. A sample configuration file is provided in the config/ folder.

    +
    warning

    LmcRbacMvc and LmcRbac share the same config key 'lmc_rbac'. This allow to configure LmcRbacMvc by adding its specific +configs to the same configuration file as LmcRbac.

    +

    Reference

    +
    KeyTypeValuesDescription
    guardsarray[]Defines the guards to implement.
    Refer to the section on Guards.
    'protection_policy'string- GuardInterface::POLICY_ALLOW (default)
    - GuardInterface::POLICY_DENY
    Defines the protection policy that guards will use when no rules are specified for the role.
    Refer to the Guards section.
    'unauthorized_strategy'array map|nullDefaults to nullDefines the configuration for the UnAuthorized strategy.
    Refer to the Unauthorized Strategy section.
    'redirect_strategy'array map|nullDefaults to nullDefines the configuration for the Redirect strategy.
    Refer to the Redirect Strategy section.
    'guard_manager'array map[] (default)Guard Manager Plugin Manager configuration.
    Must follow a Service Manager configuration.
    + + \ No newline at end of file diff --git a/docs/next/guards.html b/docs/next/guards.html new file mode 100644 index 00000000..d209a68a --- /dev/null +++ b/docs/next/guards.html @@ -0,0 +1,179 @@ + + + + + +Guards | LmcRbacMvc + + + + + +
    Skip to main content
    Version: Next

    Guards

    In this section, you will learn:

    +
      +
    • What guards are
    • +
    • How to use and configure built-in guards
    • +
    • How to create custom guards
    • +
    +

    What are guards and when should you use them?

    +

    Guards are listeners that are registered on a specific event of +the MVC workflow. They allow your application to quickly mark a request as unauthorized.

    +

    Here is a simple workflow without guards:

    +

    Laminas Framework workflow without guards

    +

    And here is a simple workflow with a route guard:

    +

    Laminas Framework workflow with guards

    +

    RouteGuard and ControllerGuard are not aware of permissions but rather only think about "roles". For +instance, you may want to refuse access to each routes that begin by "admin/*" to all users that do not have the +"admin" role.

    +

    If you want to protect a route for a set of permissions, you must use RoutePermissionsGuard. For instance, +you may want to grant access to a route "post/delete" only to roles having the "delete" permission. +Note that in a RBAC system, a permission is linked to a role, not to a user.

    +

    Albeit simple to use, guards should not be the only protection in your application, and you should always +protect your services as well. The reason is that your business logic should be handled by your service. Protecting a given +route or controller does not mean that the service cannot be access from elsewhere (another action for instance).

    +

    Protection policy

    +

    By default, when a guard is added, it will perform a check only on the specified guard rules. Any route or controller +that is not specified in the rules will be "granted" by default. Therefore, the default is a "blacklist" +mechanism.

    +

    However, you may want a more restrictive approach (also called "whitelist"). In this mode, once a guard is added, +anything that is not explicitly added will be refused by default.

    +

    For instance, let's say you have two routes: "index" and "login". If you specify a route guard rule to allow "index" +route to "member" role, your "login" route will become defacto unauthorized to anyone, unless you add a new rule for +allowing the route "login" to "member" role.

    +

    You can change it in LmcRbacMvc config, as follows:

    +
    use LmcRbacMvc\Guard\GuardInterface;

    return [
    'lmc_rbac' => [
    'protection_policy' => GuardInterface::POLICY_DENY
    ]
    ];
    +
    +

    NOTE: this policy will block ANY route/controller (so it will also block any console routes or controllers). The +deny policy is much more secure, but it needs much more configuration to work with.

    +
    +

    Built-in guards

    +

    LmcRbacMvc comes with four guards, in order of priority :

    +
      +
    • RouteGuard : protect a set of routes based on the identity roles
    • +
    • RoutePermissionsGuard : protect a set of routes based on roles permissions
    • +
    • ControllerGuard : protect a controllers and/or actions based on the identity roles
    • +
    • ControllerPermissionsGuard : protect a controllers and/or actions based on roles permissions
    • +
    +

    All guards must be added in the guards subkey:

    +
    return [
    'lmc_rbac' => [
    'guards' => [
    // Guards config here!
    ]
    ]
    ];
    +

    Because of the way Laminas Framework handles config, you can without problem define some rules in one module, and +more rules in another module. All the rules will be automatically merged.

    +
    +

    For your mental health, I recommend you to use either the route guard OR the controller guard, but not both. If +you decide to use both conjointly, I recommend you to set the protection policy to "allow" (otherwise, you will +need to define rules for every routes AND every controller, which can become quite frustrating!).

    +
    +

    Please note that if your application uses both route and controller guards, route guards are always executed +before controller guards (they have a higher priority).

    +

    RouteGuard

    +
    +

    The RouteGuard listens to the MvcEvent::EVENT_ROUTE event with a priority of -5.

    +
    +

    The RouteGuard allows your application to protect a route or a hierarchy of routes. You must provide an array of "key" => "value", +where the key is a route pattern and the value is an array of role names:

    +
    return [
    'lmc_rbac' => [
    'guards' => [
    'LmcRbacMvc\Guard\RouteGuard' => [
    'admin*' => ['admin'],
    'login' => ['guest']
    ]
    ]
    ]
    ];
    +
    +

    Only one role in a rule needs to be matched (it is an OR condition).

    +
    +

    Those rules grant access to all admin routes to users that have the "admin" role, and grant access to the "login" +route to users that have the "guest" role (eg.: most likely unauthenticated users).

    +
    +

    The route pattern is not a regex. It only supports the wildcard (*) character, that replaces any segment.

    +
    +

    You can also use the wildcard character * for roles:

    +
    return [
    'lmc_rbac' => [
    'guards' => [
    'LmcRbacMvc\Guard\RouteGuard' => [
    'home' => ['*']
    ]
    ]
    ]
    ];
    +

    This rule grants access to the "home" route to anyone.

    +

    Finally, you can also omit the roles array to completely block a route, for maintenance purpose for example :

    +
    return [
    'lmc_rbac' => [
    'guards' => [
    'LmcRbacMvc\Guard\RouteGuard' => [
    'route_under_construction'
    ]
    ]
    ]
    ];
    +

    This rule will be inaccessible.

    +

    Note : this last example could be (and should be) written in a more explicit way :

    +
    return [
    'lmc_rbac' => [
    'guards' => [
    'LmcRbacMvc\Guard\RouteGuard' => [
    'route_under_construction' => []
    ]
    ]
    ]
    ];
    +

    RoutePermissionsGuard

    +
    +

    The RoutePermissionsGuard listens to the MvcEvent::EVENT_ROUTE event with a priority of -8.

    +
    +

    The RoutePermissionsGuard allows your application to protect a route or a hierarchy of routes. You must provide an array of "key" => "value", +where the key is a route pattern and the value is an array of permission names:

    +
    return [
    'lmc_rbac' => [
    'guards' => [
    'LmcRbacMvc\Guard\RoutePermissionsGuard' => [
    'admin*' => ['admin'],
    'post/manage' => ['post.update', 'post.delete']
    ]
    ]
    ]
    ];
    +
    +

    By default, all permissions in a rule must be matched (an AND condition).

    +
    +

    In the previous example, one must have post.update AND post.delete permissions +to access the post/manage route. You can also specify an OR condition like so:

    +
    use LmcRbacMvc\Guard\GuardInterface;

    return [
    'lmc_rbac' => [
    'guards' => [
    'LmcRbacMvc\Guard\RoutePermissionsGuard' => [
    'post/manage' => [
    'permissions' => ['post.update', 'post.delete'],
    'condition' => GuardInterface::CONDITION_OR
    ]
    ]
    ]
    ]
    ];
    +
    +

    Permissions are linked to roles, not to users

    +
    +

    Those rules grant access to all admin routes to roles that have the "admin" permission, and grant access to the +"post/delete" route to roles that have the "post.delete" or "admin" permissions.

    +
    +

    The route pattern is not a regex. It only supports the wildcard (*) character, that replaces any segment.

    +
    +

    You can also use the wildcard character * for permissions:

    +
    return [
    'lmc_rbac' => [
    'guards' => [
    'LmcRbacMvc\Guard\RoutePermissionsGuard' => [
    'home' => ['*']
    ]
    ]
    ]
    ];
    +

    This rule grants access to the "home" route to anyone.

    +

    Finally, you can also use an empty array to completly block a route, for maintenance purpose for example :

    +
    return [
    'lmc_rbac' => [
    'guards' => [
    'LmcRbacMvc\Guard\RoutePermissionsGuard' => [
    'route_under_construction' => []
    ]
    ]
    ]
    ];
    +

    This route will be inaccessible.

    +

    ControllerGuard

    +
    +

    The ControllerGuard listens to the MvcEvent::EVENT_ROUTE event with a priority of -10.

    +
    +

    The ControllerGuard allows your application to protect a controller. You must provide an array of arrays:

    +
    return [
    'lmc_rbac' => [
    'guards' => [
    'LmcRbacMvc\Guard\ControllerGuard' => [
    [
    'controller' => 'MyController',
    'roles' => ['guest', 'member']
    ]
    ]
    ]
    ]
    ];
    +
    +

    Only one role in a rule need to be matched (it is an OR condition).

    +
    +

    Those rules grant access to each actions of the MyController controller to users that have either the "guest" or +"member" roles.

    +

    As for RouteGuard, you can use a wildcard (*) character for roles.

    +

    You can also specify optional actions, so that the rule only apply to one or several actions:

    +
    return [
    'lmc_rbac' => [
    'guards' => [
    'LmcRbacMvc\Guard\ControllerGuard' => [
    [
    'controller' => 'MyController',
    'actions' => ['read', 'edit'],
    'roles' => ['guest', 'member']
    ]
    ]
    ]
    ]
    ];
    +

    You can combine a generic rule and a specific action rule for the same controller, as follows:

    +
    return [
    'lmc_rbac' => [
    'guards' => [
    'LmcRbacMvc\Guard\ControllerGuard' => [
    [
    'controller' => 'PostController',
    'roles' => ['member']
    ],
    [
    'controller' => 'PostController',
    'actions' => ['delete'],
    'roles' => ['admin']
    ]
    ]
    ]
    ]
    ];
    +

    These rules grant access to each controller action to users that have the "member" role, but restrict the +"delete" action to "admin" only.

    +

    ControllerPermissionsGuard

    +
    +

    The ControllerPermissionsGuard listens to the MvcEvent::EVENT_ROUTE event with a priority of -13.

    +
    +

    The ControllerPermissionsGuard allows your application to protect a controller using permissions. You must provide an array of arrays:

    +
    return [
    'lmc_rbac' => [
    'guards' => [
    'LmcRbacMvc\Guard\ControllerPermissionsGuard' => [
    [
    'controller' => 'MyController',
    'permissions' => ['post.update', 'post.delete']
    ]
    ]
    ]
    ]
    ];
    +
    +

    All permissions in a rule must be matched (it is an AND condition).

    +
    +

    In the previous example, the user must have post.update AND post.delete permissions +to access each action of the MyController controller.

    +

    As for all other guards, you can use a wildcard (*) character for permissions.

    +

    The configuration rules are the same as for ControllerGuard.

    +

    Security notice

    +

    RouteGuard and ControllerGuard listen to the MvcEvent::EVENT_ROUTE event. Therefore, if you use the +forward method in your controller, those guards will not intercept and check requests (because internally +Laminas MVC does not trigger again a new MVC loop).

    +

    Most of the time, this is not an issue, but you must be aware of it, and this is an additional reason why you +should always protect your services too.

    +

    Creating custom guards

    +

    LmcRbacMvc is flexible enough to allow you to create custom guards. Let's say we want to create a guard that will +refuse access based on an IP addresses blacklist.

    +

    First create the guard:

    +
    namespace Application\Guard;

    use Laminas\Http\Request as HttpRequest;
    use Laminas\Mvc\MvcEvent;
    use LmcRbacMvc\Guard\AbstractGuard;

    class IpGuard extends AbstractGuard
    {
    const EVENT_PRIORITY = 100;

    /**
    * List of IPs to blacklist
    */
    protected $ipAddresses = [];

    /**
    * @param array $ipAddresses
    */
    public function __construct(array $ipAddresses)
    {
    $this->ipAddresses = $ipAddresses;
    }

    /**
    * @param MvcEvent $event
    * @return bool
    */
    public function isGranted(MvcEvent $event)
    {
    $request = $event->getRequest();

    if (!$request instanceof HttpRequest) {
    return true;
    }

    $clientIp = $_SERVER['REMOTE_ADDR'];

    return !in_array($clientIp, $this->ipAddresses);
    }
    }
    +
    +

    Guards must implement LmcRbacMvc\Guard\GuardInterface.

    +
    +

    By default, guards are listening to the event MvcEvent::EVENT_ROUTE with a priority of -5 (you can change the default +event to listen by overriding the EVENT_NAME constant in your guard subclass). However, in this case, we don't +even need to wait for the route to be matched, so we overload the EVENT_PRIORITY constant to be executed earlier.

    +

    The isGranted method simply retrieves the client IP address, and checks it against the blacklist.

    +

    However, for this to work, we must register the newly created guard with the guard plugin manager. To do so, add the +following code in your config:

    +
    return [
    'lmc_rbac' => [
    'guard_manager' => [
    'factories' => [
    'Application\Guard\IpGuard' => 'Application\Factory\IpGuardFactory'
    ]
    ]
    ]
    ];
    +

    The guard_manager config follows a conventional service manager configuration format.

    +

    Now, let's create the factory:

    +
    namespace Application\Factory;

    use Application\Guard\IpGuard;
    use Laminas\ServiceManager\Factory\FactoryInterface;
    use Laminas\ServiceManager\ServiceLocatorInterface;

    class IpGuardFactory implements FactoryInterface
    {
    /**
    * {@inheritDoc}
    */
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
    {
    if (null === $options) {
    $options = [];
    }
    return new IpGuard($options);
    }
    }
    +

    In a real use case, you would likely fetched the blacklist from a database.

    +

    Now we just need to add the guard to the guards option, so that LmcRbacMvc can execute the logic behind this guard. In +your config, add the following code:

    +
    return [
    'lmc_rbac' => [
    'guards' => [
    'Application\Guard\IpGuard' => [
    '87.45.66.46',
    '65.87.35.43'
    ]
    ]
    ]
    ];
    +

    The array of IP addresses will be passed to IpGuardFactory::__invoke in the $options parameter.

    + + \ No newline at end of file diff --git a/docs/next/intro.html b/docs/next/intro.html new file mode 100644 index 00000000..e6650e7c --- /dev/null +++ b/docs/next/intro.html @@ -0,0 +1,90 @@ + + + + + +Getting Started | LmcRbacMvc + + + + + +
    Skip to main content
    Version: Next

    Getting Started

    LmcRbacMvc is a companion component that extends the functionality of LmcRbac to provide Role-based Access Control +(RBAC) for Laminas MVC applications.

    +

    LmcRbacMvc provides additional features on top of LmcRbac that are suitable for a Laminas MVC application:

    +
      +
    • Guards that acts like a firewall allowing access to routes, controllers and actions to authorized users.
    • +
    • Strategies to execute when unauthorized access occurs such as redirection and error responses
    • +
    • Extensions to LmcRbac Authorization service such as controller and view plugins
    • +
    +
    Important Note:

    If you are migrating from v3, there are breaking changes to take into account. See the Upgrading section for details.

    +

    Extending LmcRbac

    +

    LmcRbacMvc extends the functionality of LmcRbac to support Laminas MVC applications.

    +

    It is highly recommended to first go through the concepts and usage of LmcRbac before using the functionalities of +LmcRbacMvc.

    +

    Requirements

    +
      +
    • PHP 8.1 or higher
    • +
    • LmcRbac v2 (installed by default)
    • +
    +

    Optional requirements

    + +

    Installation

    +

    Install the module using Composer:

    +
    $ composer require lm-commons/lmc-rbac-mvc:^4.0
    +

    You will be prompted by the laminas-component-installer plugin to inject LM-Commons\LmcRbacMvc.

    +
    Manual installation

    Enable the module by adding Lmc\Rbac\Mvc key to your application.config.php or modules.config.php file.

    +

    Customize the module by copy-pasting the lmc_rbac.global.php.dist file to your config/autoload folder.

    +
    warning

    LmcRbac and LmcRbacMvc share the same config key 'lmc_rbac'. Be careful when creating configuration files to avoid +overriding configuration.

    It is recommended that have one configuration file containing both LmcRbac and LmcRbacMvc configuration. This makes it +easier to keep all configuration in one place.

    +

    Quick Start

    +

    Before you start configuring LmcRbacMvc, you must set up LmcRbac first. Please follow the instructions in LmcRbac +documentation.

    +

    Specifying an identity provider

    +

    By default, LmcRbacMvc internally uses the Laminas\Authentication\AuthenticationService service key to retrieve the user (logged or +not). Therefore, you must implement and register this service in your application by providing a factory on your configuration.

    +

    For example, in module.config.php file:

    +
    return [
    'service_manager' => [
    'factories' => [
    \Laminas\Authentication\AuthenticationService::class => function($container) {
    // Create your authentication service!
    }
    ]
    ]
    ];
    +

    The identity given by Laminas\Authentication\AuthenticationService must implement Lmc\Rbac\Identity\IdentityInterface.

    +
    warning

    Note that the default identity provided with Laminas does not implement this interface.

    +
    tip

    If you are also using the LmcUser package, then the Laminas\Authentication\AuthenticationService will be +provided for you and there is no need to implement your own.

    warning

    LmcUser's default User entity does not implement the IdentityInteface that is required +by LmcRbac.

    +

    LmcRbacMvc is flexible enough to use something other than the built-in AuthenticationService, by specifying custom +identity providers. For more information, refer to the Create a custom identity provider +section.

    +

    Adding a guard

    +

    A guard allows your application to block access to routes and/or controllers using a simple syntax. For instance, this configuration +grants access to any route that begins with admin (or is exactly admin) to the admin role only:

    +
    return [
    'lmc_rbac' => [
    'guards' => [
    'Lmc\Rbac\Mvc\Guard\RouteGuard' => [
    'admin*' => ['admin']
    ]
    ]
    ]
    ];
    +

    LmcRbacMvc has several built-in guards, and you can also register your own guards. For more information, refer +to this section.

    +

    Registering a strategy

    +

    When a guard blocks access to a route/controller, or if you throw the Lmc\Rbac\Mvc\Exception\UnauthorizedException +exception in your service, LmcRbacMvc automatically performs some logic for you depending on the view strategy used.

    +

    For instance, if you want LmcRbacMvc to automatically redirect all unauthorized requests to the "login" route, +add +the following code in the onBootstrap method of your Module.php class:

    +
    public function onBootstrap(MvcEvent $event)
    {
    $app = $event->getApplication();
    $sm = $app->getServiceManager();
    $em = $app->getEventManager();

    $listener = $sm->get(\Lmc\Rbac\Mvc\View\Strategy\RedirectStrategy::class);
    $listener->attach($em);
    }
    +

    or add the listener to 'listeners' config key in a configuration file:

    +
    return [
    // other configs...

    'listeners' => [
    \Lmc\Rbac\Mvc\View\Strategy\RedirectStrategy::class
    ],
    ];
    +

    By default, RedirectStrategy redirects all unauthorized requests to a route named "login" when the user is not connected +and to a route named "home" when the user is connected. This is entirely configurable.

    +
    warning

    For flexibility purposes, LmcRbacMvc does not register any strategy for you by default!

    +

    For more information about built-in strategies, refer to this section +in the Strategies section.

    +

    Using the authorization service

    +

    With LmcRbac and LmcRbacMvc properly configured, you can inject the authorization service into any class and use it to +check if the current identity is granted to do something.

    +

    The LmcRbacMvc Authorization Service is a wrapper to the LmcRbac Authorization Service.

    +

    The difference is in the isGranted method:

    +
    public function isGranted(string $permission, mixed $context = null): bool;
    +

    where the service will get the identity from the identity provider and there is no need to get it separately.

    +

    The authorization service can be retrieved from the container using the key Lmc\Rbac\Mvc\Service\AuthorizationServiceInterface. +Once injected, you can use it as follows:

    +
    use Lmc\Rbac\Mvc\Exception\UnauthorizedException;

    class ActionController extends \Laminas\Mvc\Controller\AbstractActionController {
    public function delete()
    {
    if (!$this->authorizationService->isGranted('delete')) {
    throw new UnauthorizedException();
    }

    // Delete the post
    }
    }
    + + \ No newline at end of file diff --git a/docs/next/plugins.html b/docs/next/plugins.html new file mode 100644 index 00000000..51010b14 --- /dev/null +++ b/docs/next/plugins.html @@ -0,0 +1,26 @@ + + + + + +Plugins and Helpers | LmcRbacMvc + + + + + +
    Skip to main content
    Version: Next

    Plugins and Helpers

    +

    LmcRbacMvc provides a controller plugin and view helpers to check authorization.

    +

    Controller plugins

    +

    isGranted(string $permission, $context=null): bool

    +

    Basic usage:

    +
        public function doSomethingAction()
    {
    if (!$this->isGranted('myPermission', $context)) {
    // redirect if not granted for example
    }
    }
    +

    View Helpers

    +

    isGranted(string $permission, $context=null): bool

    +

    Basic usage:

    +
        <?php if ($this->isGranted('myPermission', $myContext)): ?>
    <div>
    <p>Display only if granted</p>
    </div>
    <?php endif ?>
    +

    hasRole(array $roleOrRoles): bool

    +

    Basic usage:

    +
        <?php if ($this->hasRole(['admin'])): ?>
    <div>
    <p>Display only if user has the admin role</p>
    </div>
    <?php endif ?>
    + + \ No newline at end of file diff --git a/docs/next/strategies.html b/docs/next/strategies.html new file mode 100644 index 00000000..45445b1a --- /dev/null +++ b/docs/next/strategies.html @@ -0,0 +1,54 @@ + + + + + +Strategies | LmcRbacMvc + + + + + +
    Skip to main content
    Version: Next

    Strategies

    What are strategies?

    +

    A strategy is an object that listens to the MvcEvent::EVENT_DISPATCH_ERROR event. It is used to describe what +happens when access to a resource is unauthorized by LmcRbacMvc.

    +

    LmcRbacMvc strategies all check if an Lmc\Rbac\Mvc\Exception\UnauthorizedExceptionInterface has been thrown.

    +

    By default, LmcRbacMvc does not register any strategy for you. The best place to register it in a config file under the +'listeners' key:

    +
    return [
    // other configs...

    'listeners' => [
    \Lmc\Rbac\Mvc\View\Strategy\UnauthorizedStrategy::class
    ],
    ];
    +

    Built-in strategies

    +

    LmcRbacMvc comes with two built-in strategies:

    +
      +
    • \Lmc\Rbac\Mvc\View\Strategy\RedirectStrategy
    • +
    • \Lmc\Rbac\Mvc\View\Strategy\UnauthorizedStrategy.
    • +
    +

    RedirectStrategy

    +

    This strategy allows your application to redirect any unauthorized request to another route by optionally appending the previous +URL as a query parameter.

    +

    To register it, copy-paste this code into a configuration file:

    +
    return [
    // other configs...

    'listeners' => [
    \Lmc\Rbac\Mvc\View\Strategy\RedirectStrategy::class
    ],
    ];
    +

    You can configure the strategy using the redirect_strategy subkey:

    +
    return [
    'lmc_rbac' => [
    'redirect_strategy' => [
    'redirect_when_connected' => true,
    'redirect_to_route_connected' => 'home',
    'redirect_to_route_disconnected' => 'login',
    'append_previous_uri' => true,
    'previous_uri_query_key' => 'redirectTo'
    ],
    ]
    ];
    +

    If users try to access an unauthorized resource (eg.: http://www.example.com/delete), they will be +redirected to the "login" route if is not connected and to the "home" route otherwise with the previous URL appended:

    +
    +

    http://www.example.com/login?redirectTo=http://www.example.com/delete

    +
    +

    You can prevent redirection when a user is connected (i.e. so that the user gets a 403 page) by setting redirect_when_connected to false.

    +

    UnauthorizedStrategy

    +

    This strategy allows your application to render a template on any unauthorized request.

    +

    To register it, copy-paste this code into your Module.php class:

    +
    return [
    // other configs...

    'listeners' => [
    \Lmc\Rbac\Mvc\View\Strategy\UnauthorizedStrategy::class
    ],
    ];
    +

    You can configure the strategy using the unauthorized_strategy subkey:

    +
    return [
    'lmc_rbac' => [
    'unauthorized_strategy' => [
    'template' => 'error/custom-403'
    ],
    ]
    ];
    +
    +

    By default, LmcRbacMvc uses a template called error/403.

    +
    +

    Creating custom strategies

    +

    Creating a custom strategy is rather easy. Let's say we want to create a strategy that integrates with +the ApiProblem Laminas Api Tools module:

    +
    namespace Application\View\Strategy;

    use Laminas\Http\Response as HttpResponse;
    use Laminas\Mvc\MvcEvent;
    use Laminas\ApiTools\ApiProblem\ApiProblem;
    use Laminas\ApiTools\ApiProblem\ApiProblemResponse;
    use Lmc\Rbac\Mvc\View\Strategy\AbstractStrategy;
    use Lmc\Rbac\Mvc\Exception\UnauthorizedExceptionInterface;

    class ApiProblemStrategy extends AbstractStrategy
    {
    public function onError(MvcEvent $event)
    {
    // Do nothing if no error or if response is not HTTP response
    if (!($exception = $event->getParam('exception') instanceof UnauthorizedExceptionInterface)
    || ($result = $event->getResult() instanceof HttpResponse)
    || !($response = $event->getResponse() instanceof HttpResponse)
    ) {
    return;
    }

    return new ApiProblemResponse(new ApiProblem($exception->getMessage()));
    }
    }
    +

    Register your strategy:

    +
    return [
    // other configs...

    'listeners' => [
    Application\View\Strategy\ApiProblemStrategy::class,
    ],
    ];
    + + \ No newline at end of file diff --git a/docs/next/using-the-authorization-service.html b/docs/next/using-the-authorization-service.html new file mode 100644 index 00000000..11ba291a --- /dev/null +++ b/docs/next/using-the-authorization-service.html @@ -0,0 +1,34 @@ + + + + + +Using the Authorization Service | LmcRbacMvc + + + + + +
    Skip to main content
    Version: Next

    Using the Authorization Service

    +

    The LmcRbacMvc Authorization service is a wrapper for the LmcRbac Authorization service.

    +

    \Lmc\Rbac\Mvc\Service\AuthorizationService provides the same methods as \Lmc\Rbac\Service\AuthorizationService +except for the isGranted() method which does not required an identity parameter.

    +

    \Lmc\Rbac\Mvc\Service\AuthorizationService::isGranted() will get the identity from the +Laminas Authentication Service directly.

    +

    Injecting the Authorization Service

    +

    Different techniques for injecting the Authorization Service are described in LmcRbac. The same techniques apply +to LmcRbacMvc using the equivalent wrapper classes and trait:

    +
      +
    • \Lmc\Rbac\Mvc\Service\AuthorizationServiceAwareInterface
    • +
    • \Lmc\Rbac\Mvc\Service\AuthorizationServiceAwareTrait
    • +
    • \Lmc\Rbac\Mvc\Service\AuthorizationServiceDelegatorFactory
    • +
    +

    Refer to this section in LmcRbac on how to inject the Authorization Service.

    +

    Permissions and Assertions

    +

    Assertions are provided by LmcRbac. Refer to the Assertion section in LmcRbac on how to configure assertions.

    +

    \Lmc\Rbac\Mvc\Service\AuthorizationService provides the same methods as \Lmc\Rbac\Service\AuthorizationService to +override assertions at run-time.

    +
    warning

    If you are upgrading from v3, please not that assertions must now implement the +Lmc\Rbac\Assertion\AssertionInterface interface which has a different signature for the assert() method.

    Make sure to update your assertions to follow the Lmc\Rbac\Assertion\AssertionInterface interface.

    + + \ No newline at end of file diff --git a/docs/quick-start.html b/docs/quick-start.html index 88661fd0..7b748368 100644 --- a/docs/quick-start.html +++ b/docs/quick-start.html @@ -1,15 +1,15 @@ - + - -Quick Start | LmcRbacMvc - - - + +Quick Start | LmcRbacMvc + + + -
    Skip to main content

    Quick Start

    +
    Version: 3.4

    Quick Start

    In this section, you will learn:

    • How to set up the module
    • @@ -18,7 +18,7 @@

    Before starting the quick start, make sure you have properly installed the module by following the instructions in the README file.

    -

    Specifying an identity provider

    +

    Specifying an identity provider

    By default, LmcRbacMvc internally uses the Laminas\Authentication\AuthenticationService service key to retrieve the user (logged or not). Therefore, you must implement and register this service in your application by adding these lines in your module.config.php file:

    return [
    'service_manager' => [
    'factories' => [
    'Laminas\Authentication\AuthenticationService' => function($sm) {
    // Create your authentication service!
    }
    ]
    ]
    ];
    @@ -27,13 +27,13 @@

    warning

    Note that the default identity provided with Laminas does not implement this interface, neither does the LmcUser suite.

    LmcRbacMvc is flexible enough to use something other than the built-in AuthenticationService, by specifying custom identity providers. For more information, refer to this section.

    -

    Adding a guard

    +

    Adding a guard

    A guard allows your application to block access to routes and/or controllers using a simple syntax. For instance, this configuration grants access to any route that begins with admin (or is exactly admin) to the admin role only:

    return [
    'lmc_rbac' => [
    'guards' => [
    'LmcRbacMvc\Guard\RouteGuard' => [
    'admin*' => ['admin']
    ]
    ]
    ]
    ];

    LmcRbacMvc has several built-in guards, and you can also register your own guards. For more information, refer to this section.

    -

    Adding a role provider

    +

    Adding a role provider

    RBAC model is based on roles. Therefore, for LmcRbacMvc to work properly, it must be aware of all the roles that are used inside your application.

    This configuration creates an admin role that has a child role called member. The admin role automatically @@ -43,7 +43,7 @@

    Addin its child), while the member role only has the edit permission.

    LmcRbacMvc has several built-in role providers, and you can also register your own role providers. For more information, refer to this section.

    -

    Registering a strategy

    +

    Registering a strategy

    When a guard blocks access to a route/controller, or if you throw the LmcRbacMvc\Exception\UnauthorizedException exception in your service, LmcRbacMvc automatically performs some logic for you depending on the view strategy used.

    For instance, if you want LmcRbacMvc to automatically redirect all unauthorized requests to the "login" route, add @@ -56,11 +56,11 @@

    Regis

    For more information about built-in strategies, refer to this section. to this section

    -

    Using the authorization service

    +

    Using the authorization service

    Now that LmcRbacMvc is properly configured, you can inject the authorization service into any class and use it to check if the current identity is granted to do something.

    The authorization service is registered inside the service manager using the following key: LmcRbacMvc\Service\AuthorizationService. Once injected, you can use it as follows:

    -
    use LmcRbacMvc\Exception\UnauthorizedException;

    class ActionController extends \Laminas\Mvc\Controller\AbstractActionController {
    public function delete()
    {
    if (!$this->authorizationService->isGranted('delete')) {
    throw new UnauthorizedException();
    }

    // Delete the post
    }
    }
    +
    use LmcRbacMvc\Exception\UnauthorizedException;

    class ActionController extends \Laminas\Mvc\Controller\AbstractActionController {
    public function delete()
    {
    if (!$this->authorizationService->isGranted('delete')) {
    throw new UnauthorizedException();
    }

    // Delete the post
    }
    }
    \ No newline at end of file diff --git a/docs/role-providers.html b/docs/role-providers.html index f8017d8f..0a6e8c7b 100644 --- a/docs/role-providers.html +++ b/docs/role-providers.html @@ -1,15 +1,15 @@ - + - -Role providers | LmcRbacMvc - - - + +Role providers | LmcRbacMvc + + + -
    Skip to main content

    Role providers

    +
    Version: 3.4

    Role providers

    In this section, you will learn:

    • What are role providers
    • @@ -17,28 +17,28 @@
    • How to use and configure built-in providers
    • How to create custom role providers
    -

    What are role providers?

    +

    What are role providers?

    A role provider is an object that returns a list of roles. Each role provider must implement the LmcRbacMvc\Role\RoleProviderInterface interface. The only required method is getRoles, and must return an array of Rbac\Role\RoleInterface objects.

    Roles can come from one of many sources: in memory, from a file, from a database... However, please note that you can specify only one role provider per application. The reason is that having multiple role providers makes the workflow harder and can lead to security problems that are very hard to spot.

    -

    Identity providers?

    +

    Identity providers?

    Identity providers return the current identity. Most of the time, this means the logged in user. LmcRbacMvc comes with a default identity provider (LmcRbacMvc\Identity\AuthenticationIdentityProvider) that uses the Laminas\Authentication\AuthenticationService service.

    -

    Create your own identity provider

    +

    Create your own identity provider

    If you want to implement your own identity provider, create a new class that implements LmcRbacMvc\Identity\IdentityProviderInterface class. Then, change the identity_provider option in LmcRbacMvc config, as shown below:

    return [
    'lmc_rbac' => [
    'identity_provider' => 'MyCustomIdentityProvider'
    ]
    ];

    The identity provider is automatically pulled from the service manager.

    -

    Built-in role providers

    +

    Built-in role providers

    LmcRbacMvc comes with two built-in role providers: InMemoryRoleProvider and ObjectRepositoryRoleProvider. A role provider must be added to the role_provider subkey:

    return [
    'lmc_rbac' => [
    'role_provider' => [
    // Role provider config here!
    ]
    ]
    ];
    -

    InMemoryRoleProvider

    +

    InMemoryRoleProvider

    This provider is ideal for small/medium sites with few roles/permissions. All the data is specified in a simple PHP file, so you never hit a database.

    Here is an example of the format you need to use:

    @@ -48,7 +48,7 @@

    InMemor the role has at least one child.

    If you are more confident with flat RBAC, the previous config can be re-written to remove any inheritence between roles:

    return [
    'lmc_rbac' => [
    'role_provider' => [
    'LmcRbacMvc\Role\InMemoryRoleProvider' => [
    'admin' => [
    'permissions' => [
    'article.delete',
    'article.edit',
    'article.archive',
    'article.read'
    ]
    ],
    'member' => [
    'permissions' => [
    'article.edit',
    'article.archive',
    'article.read'
    ]
    ],
    'guest' => [
    'permissions' => ['article.read']
    ]
    ]
    ]
    ]
    ];
    -

    ObjectRepositoryRoleProvider

    +

    ObjectRepositoryRoleProvider

    This provider fetches roles from the database using Doctrine\Common\Persistence\ObjectRepository interface.

    You can configure this provider by giving an object repository service name that is fetched from the service manager using the object_repository key:

    @@ -59,12 +59,12 @@

    Please note that your entity fetched from the table MUST implement the Rbac\Role\RoleInterface interface.

    -

    Creating custom role providers

    +

    Creating custom role providers

    To create a custom role provider, you first need to create a class that implements the LmcRbacMvc\Role\RoleProviderInterface interface.

    Then, you need to add it to the role provider manager:

    return [
    'lmc_rbac' => [
    'role_provider_manager' => [
    'factories' => [
    'Application\Role\CustomRoleProvider' => 'Application\Factory\CustomRoleProviderFactory'
    ]
    ]
    ]
    ];

    You can now use it like any other role provider:

    -
    return [
    'lmc_rbac' => [
    'role_provider' => [
    'Application\Role\CustomRoleProvider' => [
    // Options
    ]
    ]
    ]
    ];
    +
    return [
    'lmc_rbac' => [
    'role_provider' => [
    'Application\Role\CustomRoleProvider' => [
    // Options
    ]
    ]
    ]
    ];
    \ No newline at end of file diff --git a/docs/strategies.html b/docs/strategies.html index c54041e8..02165457 100644 --- a/docs/strategies.html +++ b/docs/strategies.html @@ -1,31 +1,31 @@ - + - -Strategies | LmcRbacMvc - - - + +Strategies | LmcRbacMvc + + + -
    Skip to main content

    Strategies

    +
    Version: 3.4

    Strategies

    In this section, you will learn:

    • What strategies are
    • How to use built-in strategies
    • How to create custom strategies
    -

    What are strategies?

    +

    What are strategies?

    A strategy is an object that listens to the MvcEvent::EVENT_DISPATCH_ERROR event. It is used to describe what happens when access to a resource is unauthorized by LmcRbacMvc.

    LmcRbacMvc strategies all check if an LmcRbacMvc\Exception\UnauthorizedExceptionInterface has been thrown.

    By default, LmcRbacMvc does not register any strategy for you. The best place to register it is in your onBootstrap method of the Module.php class:

    public function onBootstrap(MvcEvent $e)
    {
    $app = $e->getApplication();
    $sm = $app->getServiceManager();
    $em = $app->getEventManager();

    $listener = $sm->get(\LmcRbacMvc\View\Strategy\UnauthorizedStrategy::class);
    $listener->attach($em);
    }
    -

    Built-in strategies

    +

    Built-in strategies

    LmcRbacMvc comes with two built-in strategies: RedirectStrategy and UnauthorizedStrategy.

    -

    RedirectStrategy

    +

    RedirectStrategy

    This strategy allows your application to redirect any unauthorized request to another route by optionally appending the previous URL as a query parameter.

    To register it, copy-paste this code into your Module.php class:

    @@ -36,7 +36,7 @@

    RedirectStr redirected to the "login" route if is not connected and to the "home" route otherwise (it must exist in your route configuration of course) with the previous URL appended : http://www.example.com/login?redirectTo=http://www.example.com/delete

    You can prevent redirection when a user is connected (i.e. so that the user gets a 403 page) by setting redirect_when_connected to false.

    -

    UnauthorizedStrategy

    +

    UnauthorizedStrategy

    This strategy allows your application to render a template on any unauthorized request.

    To register it, copy-paste this code into your Module.php class:

    public function onBootstrap(MvcEvent $e)
    {
    $app = $e->getApplication();
    $sm = $app->getServiceManager();
    $em = $app->getEventManager();

    $listener = $sm->get(\LmcRbacMvc\View\Strategy\UnauthorizedStrategy::class);
    $listener->attach($em);
    }
    @@ -45,11 +45,11 @@

    Unautho

    By default, LmcRbacMvc uses a template called error/403.

    -

    Creating custom strategies

    +

    Creating custom strategies

    Creating a custom strategy is rather easy. Let's say we want to create a strategy that integrates with the ApiProblem Laminas Api Tools module:

    namespace Application\View\Strategy;

    use Laminas\Http\Response as HttpResponse;
    use Laminas\Mvc\MvcEvent;
    use Laminas\ApiTools\ApiProblem\ApiProblem;
    use Laminas\ApiTools\ApiProblem\ApiProblemResponse;
    use LmcRbacMvc\View\Strategy\AbstractStrategy;
    use LmcRbacMvc\Exception\UnauthorizedExceptionInterface;

    class ApiProblemStrategy extends AbstractStrategy
    {
    public function onError(MvcEvent $event)
    {
    // Do nothing if no error or if response is not HTTP response
    if (!($exception = $event->getParam('exception') instanceof UnauthorizedExceptionInterface)
    || ($result = $event->getResult() instanceof HttpResponse)
    || !($response = $event->getResponse() instanceof HttpResponse)
    ) {
    return;
    }

    return new ApiProblemResponse(new ApiProblem($exception->getMessage()));
    }
    }

    Register your strategy:

    -
    public function onBootstrap(EventInterface $e)
    {
    $e->getTarget()
    ->getEventManager()
    ->attach(new ApiProblemStrategy());
    }
    +
    public function onBootstrap(EventInterface $e)
    {
    $e->getTarget()
    ->getEventManager()
    ->attach(new ApiProblemStrategy());
    }
    \ No newline at end of file diff --git a/docs/support.html b/docs/support.html index 1eabdee5..6f7d2ac6 100644 --- a/docs/support.html +++ b/docs/support.html @@ -1,22 +1,22 @@ - + - -Support | LmcRbacMvc - - - + +Support | LmcRbacMvc + + + -
    Skip to main content

    Support

    \ No newline at end of file diff --git a/docs/using-the-authorization-service.html b/docs/using-the-authorization-service.html index 3ebfbc0a..7da59f0d 100644 --- a/docs/using-the-authorization-service.html +++ b/docs/using-the-authorization-service.html @@ -1,18 +1,18 @@ - + - -Using the Authorization Service | LmcRbacMvc - - - + +Using the Authorization Service | LmcRbacMvc + + + -
    Skip to main content

    Using the Authorization Service

    +
    Version: 3.4

    Using the Authorization Service

    This section will teach you how to use the AuthorizationService to its full extent.

    -

    Injecting the Authorization Service

    -

    Using initializers

    +

    Injecting the Authorization Service

    +

    Using initializers

    To automatically inject the authorization service into your classes, you can implement the AuthorizationServiceAwareInterface and use the trait, as shown below:

    namespace YourModule;

    use LmcRbacMvc\Service\AuthorizationServiceAwareInterface;
    use LmcRbacMvc\Service\AuthorizationServiceAwareTrait;

    class MyClass implements AuthorizationServiceAwareInterface
    {
    use AuthorizationServiceAwareTrait;

    public function doSomethingThatRequiresAuth()
    {
    if (! $this->getAuthorizationService()->isGranted('deletePost')) {
    throw new UnauthorizedException('You are not allowed !');
    }

    return true;
    }
    }
    @@ -21,7 +21,7 @@

    Using ini

    While initializers allow rapid prototyping, their use can lead to more fragile code. We'd suggest using factories.

    -

    Using delegator factory

    +

    Using delegator factory

    LmcRbacMvc is shipped with a LmcRbacMvc\Factory\AuthorizationServiceDelegatorFactory delegator factory to automatically inject the authorization service into your classes.

    As for the initializer, the class must implement the AuthorizationServiceAwareInterface.

    @@ -30,40 +30,40 @@

    Usin

    While they need a little more configuration, delegator factories have better performances than initializers.

    -

    Using Factories

    +

    Using Factories

    You can inject the AuthorizationService into your factories by using Laminas' ServiceManager. The AuthorizationService is known to the ServiceManager as 'LmcRbacMvc\Service\AuthorizationService'. Here is a classic example for injecting the AuthorizationService:

    YourModule/Module.php

    class Module
    {
    // getAutoloaderConfig(), etc...

    public function getServiceConfig()
    {
    return [
    'factories' => [
    'MyService' => function($sm) {
    $authService = $sm->get('LmcRbacMvc\Service\AuthorizationService');
    return new MyService($authService);
    }
    ]
    ];
    }
    }
    -

    Permissions and Assertions

    +

    Permissions and Assertions

    Since you now know how to inject the AuthorizationService, let's use it!

    One of the great things the AuthorizationService brings are assertions. Assertions get executed if the identity in fact holds the permission you are requesting. A common example is a blog post, which only the author can edit. In this case, you have a post.edit permission and run an assertion checking the author afterwards.

    -

    Defining assertions

    +

    Defining assertions

    The AssertionPluginManager is a great way for you to use assertions and IOC. You can add new assertions quite easily by adding this to your module.config.php file:

    return [
    'lmc_rbac' => [
    'assertion_manager' => [
    'factories' => [
    'MyAssertion' => 'MyAssertionFactory'
    ]
    ]
    ]
    ];
    -

    Defining the assertion map

    +

    Defining the assertion map

    The assertion map can automatically map permissions to assertions. This means that every time you check for a permission with an assertion map, you'll include the assertion in your check. You can define the assertion map by adding this to your module.config.php file:

    return [
    'lmc_rbac' => [
    'assertion_map' => [
    'myPermission' => 'myAssertion'
    ]
    ]
    ];

    Now, every time you check for myPermission, myAssertion will be checked as well.

    -

    Checking permissions in a service

    +

    Checking permissions in a service

    So let's check for a permission, shall we?

    $authorizationService->isGranted('myPermission');

    That was easy, wasn't it?

    isGranted checks if the current identity is granted the permission and additionally runs the assertion that is provided by the assertion map.

    -

    Checking permissions in controllers and views

    +

    Checking permissions in controllers and views

    LmcRbacMvc comes with both a controller plugin and a view helper to check permissions.

    -

    In a controller :

    +

    In a controller :

        public function doSomethingAction()
    {
    if (!$this->isGranted('myPermission')) {
    // redirect if not granted for example
    }
    }
    -

    In a view :

    +

    In a view :

        <?php if ($this->isGranted('myPermission')): ?>
    <div>
    <p>Display only if granted</p>
    </div>
    <?php endif ?>
    -

    Defining additional permissions

    +

    Defining additional permissions

    But what if you don't want to use the assertion map? That's quite easy as well!

    Here are four examples of how to run an assertion without using the assertion map:

    Disable the assertion:

    @@ -74,6 +74,6 @@

    $context = true;

    $authorizationService->setAssertion('myPermission', new MyAssertion($foo, $bar));
    $authorizationService->isGranted('myPermission', $context);

    Using the AssertionPluginManager:

    $context = true;
    $authorizationService->setAssertion('myPermission', 'MyAssertion');
    $authorizationService->isGranted('myPermission', $context);
    -

    Please note: The context parameter is optional!

    +

    Please note: The context parameter is optional!

    \ No newline at end of file diff --git a/index.html b/index.html index 76464cd2..b211ed69 100644 --- a/index.html +++ b/index.html @@ -2,13 +2,13 @@ - + Hello from LmcRbacMvc | LmcRbacMvc - - - + + + -
    Skip to main content

    LmcRbacMvc

    Role-based access control for Laminas MVC application

    Part of the LM-Commons series of community developed packages for Laminas

    +
    Skip to main content

    LmcRbacMvc

    Role-based access control for Laminas MVC application

    Introduction

    LmcRbacMvc is a companion component that extends the functionality of LmcRbac to provide Role-based Access Control (RBAC) for Laminas MVC applications.

    \ No newline at end of file diff --git a/markdown-page.html b/markdown-page.html index fdecb4a7..4c5c4ab3 100644 --- a/markdown-page.html +++ b/markdown-page.html @@ -2,14 +2,14 @@ - + Markdown page example | LmcRbacMvc - - - + + + -
    Skip to main content

    Markdown page example

    -

    You don't need React to write simple standalone pages.

    +
    Skip to main content

    Markdown page example

    +

    You don't need React to write simple standalone pages.

    \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index 3e1fc15d..4949d9f1 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1 +1 @@ -https://lm-commons.github.io/LmcRbacMvc/blogweekly0.5https://lm-commons.github.io/LmcRbacMvc/blog/archiveweekly0.5https://lm-commons.github.io/LmcRbacMvc/blog/new-documentationweekly0.5https://lm-commons.github.io/LmcRbacMvc/blog/tagsweekly0.5https://lm-commons.github.io/LmcRbacMvc/blog/tags/laminasweekly0.5https://lm-commons.github.io/LmcRbacMvc/blog/tags/lmcrbacmvcweekly0.5https://lm-commons.github.io/LmcRbacMvc/blog/tags/phpweekly0.5https://lm-commons.github.io/LmcRbacMvc/blog/welcomeweekly0.5https://lm-commons.github.io/LmcRbacMvc/markdown-pageweekly0.5https://lm-commons.github.io/LmcRbacMvc/docs/cookbookweekly0.5https://lm-commons.github.io/LmcRbacMvc/docs/guardsweekly0.5https://lm-commons.github.io/LmcRbacMvc/docs/installationweekly0.5https://lm-commons.github.io/LmcRbacMvc/docs/introweekly0.5https://lm-commons.github.io/LmcRbacMvc/docs/quick-startweekly0.5https://lm-commons.github.io/LmcRbacMvc/docs/role-providersweekly0.5https://lm-commons.github.io/LmcRbacMvc/docs/strategiesweekly0.5https://lm-commons.github.io/LmcRbacMvc/docs/supportweekly0.5https://lm-commons.github.io/LmcRbacMvc/docs/using-the-authorization-serviceweekly0.5https://lm-commons.github.io/LmcRbacMvc/weekly0.5 \ No newline at end of file +https://lm-commons.github.io/LmcRbacMvc/blogweekly0.5https://lm-commons.github.io/LmcRbacMvc/blog/archiveweekly0.5https://lm-commons.github.io/LmcRbacMvc/blog/authorsweekly0.5https://lm-commons.github.io/LmcRbacMvc/blog/new-documentationweekly0.5https://lm-commons.github.io/LmcRbacMvc/blog/tagsweekly0.5https://lm-commons.github.io/LmcRbacMvc/blog/tags/laminasweekly0.5https://lm-commons.github.io/LmcRbacMvc/blog/tags/lmcrbacmvcweekly0.5https://lm-commons.github.io/LmcRbacMvc/blog/tags/phpweekly0.5https://lm-commons.github.io/LmcRbacMvc/blog/welcomeweekly0.5https://lm-commons.github.io/LmcRbacMvc/markdown-pageweekly0.5https://lm-commons.github.io/LmcRbacMvc/docs/next/configurationweekly0.5https://lm-commons.github.io/LmcRbacMvc/docs/next/guardsweekly0.5https://lm-commons.github.io/LmcRbacMvc/docs/next/Guides/debuggingweekly0.5https://lm-commons.github.io/LmcRbacMvc/docs/next/Guides/exampleweekly0.5https://lm-commons.github.io/LmcRbacMvc/docs/next/Guides/identity-providersweekly0.5https://lm-commons.github.io/LmcRbacMvc/docs/next/Guides/lmcuserweekly0.5https://lm-commons.github.io/LmcRbacMvc/docs/next/introweekly0.5https://lm-commons.github.io/LmcRbacMvc/docs/next/pluginsweekly0.5https://lm-commons.github.io/LmcRbacMvc/docs/next/strategiesweekly0.5https://lm-commons.github.io/LmcRbacMvc/docs/next/Upgrading/upgradeweekly0.5https://lm-commons.github.io/LmcRbacMvc/docs/next/using-the-authorization-serviceweekly0.5https://lm-commons.github.io/LmcRbacMvc/docs/cookbookweekly0.5https://lm-commons.github.io/LmcRbacMvc/docs/guardsweekly0.5https://lm-commons.github.io/LmcRbacMvc/docs/installationweekly0.5https://lm-commons.github.io/LmcRbacMvc/docs/introweekly0.5https://lm-commons.github.io/LmcRbacMvc/docs/quick-startweekly0.5https://lm-commons.github.io/LmcRbacMvc/docs/role-providersweekly0.5https://lm-commons.github.io/LmcRbacMvc/docs/strategiesweekly0.5https://lm-commons.github.io/LmcRbacMvc/docs/supportweekly0.5https://lm-commons.github.io/LmcRbacMvc/docs/using-the-authorization-serviceweekly0.5https://lm-commons.github.io/LmcRbacMvc/weekly0.5 \ No newline at end of file