From e99f9d57ae0c0d2ec8dcf8c52d75a6c1f21d9860 Mon Sep 17 00:00:00 2001 From: GitHub workflow <2769109+epoberezkin@users.noreply.github.com> Date: Mon, 16 Dec 2024 00:07:27 +0000 Subject: [PATCH] updated by ajv workflow https://github.com/ajv-validator/ajv/actions/runs/12343417529 --- 404.html | 8 +- api.html | 6 +- assets/css/0.styles.7f8cbd9f.css | 1 + assets/img/contributors.dce34075.jpg | Bin 0 -> 251445 bytes assets/js/14.d239147b.js | 1 + assets/js/19.1c7f3cdf.js | 1 + assets/js/22.6bf94e96.js | 1 + assets/js/24.2547ea08.js | 1 + assets/js/26.4f21deb9.js | 1 + assets/js/27.1927cbbb.js | 1 + assets/js/29.7ab70007.js | 1 + assets/js/30.494f3f73.js | 1 + assets/js/32.d0b77cdc.js | 1 + assets/js/45.38b67184.js | 1 + assets/js/46.452b30ba.js | 1 + assets/js/47.e3997d4d.js | 1 + assets/js/48.a6fa3c8a.js | 1 + assets/js/49.633e50de.js | 1 + assets/js/50.6fb28fbe.js | 1 + assets/js/51.d223469b.js | 1 + assets/js/52.431b7581.js | 1 + assets/js/58.8bcb567a.js | 1 + assets/js/61.0d386b18.js | 1 + assets/js/62.17eb9b44.js | 1 + assets/js/63.fff784a9.js | 1 + assets/js/68.39d52c84.js | 1 + assets/js/69.fb6c89c0.js | 1 + assets/js/70.41c11761.js | 1 + assets/js/71.debaead8.js | 1 + assets/js/74.90e9d3b3.js | 1 + assets/js/75.cf55aad8.js | 1 + assets/js/83.ae8c92d7.js | 1 + assets/js/84.83ff6efb.js | 1 + assets/js/app.bb2a0f22.js | 10 + code_of_conduct/index.html | 6 +- codegen.html | 6 +- coercion.html | 6 +- components.html | 6 +- contributing/index.html | 6 +- faq.html | 6 +- guide/async-validation.html | 6 +- guide/combining-schemas.html | 6 +- guide/environments.html | 6 +- guide/formats.html | 6 +- guide/getting-started.html | 6 +- guide/managing-schemas.html | 6 +- guide/modifying-data.html | 6 +- guide/schema-language.html | 8 +- guide/typescript.html | 6 +- guide/user-keywords.html | 6 +- guide/why-ajv.html | 6 +- index.html | 184 +++++++++--------- json-schema.html | 6 +- json-type-definition.html | 6 +- keywords.html | 6 +- license.html | 6 +- ...08-14-mozilla-grant-openjs-foundation.html | 6 +- news/2020-12-15-ajv-version-7-released.html | 6 +- ...-07-ajv-supports-json-type-definition.html | 6 +- news/2021-03-27-ajv-version-8-released.html | 6 +- news/2021-04-24-ajv-online-event.html | 6 +- news/2021-05-24-ajv-online-event-video.html | 6 +- ...1-07-22-ajv-microsoft-foss-fund-award.html | 6 +- news/index.html | 6 +- options.html | 6 +- packages/ajv-cli.html | 6 +- packages/ajv-errors.html | 6 +- packages/ajv-formats.html | 6 +- packages/ajv-i18n.html | 6 +- packages/ajv-keywords.html | 6 +- packages/index.html | 6 +- security.html | 6 +- standalone.html | 6 +- strict-mode.html | 6 +- testimonials.html | 6 +- v6-to-v8-migration.html | 6 +- 76 files changed, 263 insertions(+), 223 deletions(-) create mode 100644 assets/css/0.styles.7f8cbd9f.css create mode 100644 assets/img/contributors.dce34075.jpg create mode 100644 assets/js/14.d239147b.js create mode 100644 assets/js/19.1c7f3cdf.js create mode 100644 assets/js/22.6bf94e96.js create mode 100644 assets/js/24.2547ea08.js create mode 100644 assets/js/26.4f21deb9.js create mode 100644 assets/js/27.1927cbbb.js create mode 100644 assets/js/29.7ab70007.js create mode 100644 assets/js/30.494f3f73.js create mode 100644 assets/js/32.d0b77cdc.js create mode 100644 assets/js/45.38b67184.js create mode 100644 assets/js/46.452b30ba.js create mode 100644 assets/js/47.e3997d4d.js create mode 100644 assets/js/48.a6fa3c8a.js create mode 100644 assets/js/49.633e50de.js create mode 100644 assets/js/50.6fb28fbe.js create mode 100644 assets/js/51.d223469b.js create mode 100644 assets/js/52.431b7581.js create mode 100644 assets/js/58.8bcb567a.js create mode 100644 assets/js/61.0d386b18.js create mode 100644 assets/js/62.17eb9b44.js create mode 100644 assets/js/63.fff784a9.js create mode 100644 assets/js/68.39d52c84.js create mode 100644 assets/js/69.fb6c89c0.js create mode 100644 assets/js/70.41c11761.js create mode 100644 assets/js/71.debaead8.js create mode 100644 assets/js/74.90e9d3b3.js create mode 100644 assets/js/75.cf55aad8.js create mode 100644 assets/js/83.ae8c92d7.js create mode 100644 assets/js/84.83ff6efb.js create mode 100644 assets/js/app.bb2a0f22.js diff --git a/404.html b/404.html index de2ba5914..c5bbd3791 100644 --- a/404.html +++ b/404.html @@ -18,13 +18,13 @@ - - + + -

404

How did we get here?
+ - + diff --git a/api.html b/api.html index 2c4e17e50..f4eb8a290 100644 --- a/api.html +++ b/api.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/assets/css/0.styles.7f8cbd9f.css b/assets/css/0.styles.7f8cbd9f.css new file mode 100644 index 000000000..0c9b3e20b --- /dev/null +++ b/assets/css/0.styles.7f8cbd9f.css @@ -0,0 +1 @@ +code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}.theme-default-content code{color:#545252;padding:.25rem .5rem;margin:0;font-size:.85em;background-color:rgba(27,31,35,.05);border-radius:3px}.theme-default-content code .token.deleted{color:#ec5975}.theme-default-content code .token.inserted{color:#07aab4}.theme-default-content pre,.theme-default-content pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:#282c34;border-radius:6px;overflow:auto}.theme-default-content pre[class*=language-] code,.theme-default-content pre code{color:#fff;padding:0;background-color:transparent;border-radius:0}div[class*=language-]{position:relative;background-color:#282c34;border-radius:6px}div[class*=language-] .highlight-lines{-webkit-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlighted{background-color:rgba(0,0,0,.66)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent;position:relative;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:hsla(0,0%,100%,.4)}div[class*=language-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlighted{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{content:" ";position:absolute;z-index:3;left:0;top:0;display:block;width:3.5rem;height:100%;background-color:rgba(0,0,0,.66)}div[class*=language-].line-numbers-mode pre{padding-left:4.5rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:3.5rem;text-align:center;color:hsla(0,0%,100%,.3);padding:1.25rem 0;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers-wrapper br{-webkit-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;-webkit-user-select:none;user-select:none;font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;z-index:2;top:0;left:0;width:3.5rem;height:100%;border-radius:6px 0 0 6px;border-right:1px solid rgba(0,0,0,.66);background-color:#282c34}div[class~=language-js]:before{content:"js"}div[class~=language-ts]:before{content:"ts"}div[class~=language-html]:before{content:"html"}div[class~=language-md]:before{content:"md"}div[class~=language-vue]:before{content:"vue"}div[class~=language-css]:before{content:"css"}div[class~=language-sass]:before{content:"sass"}div[class~=language-scss]:before{content:"scss"}div[class~=language-less]:before{content:"less"}div[class~=language-stylus]:before{content:"stylus"}div[class~=language-go]:before{content:"go"}div[class~=language-java]:before{content:"java"}div[class~=language-c]:before{content:"c"}div[class~=language-sh]:before{content:"sh"}div[class~=language-yaml]:before{content:"yaml"}div[class~=language-py]:before{content:"py"}div[class~=language-docker]:before{content:"docker"}div[class~=language-dockerfile]:before{content:"dockerfile"}div[class~=language-makefile]:before{content:"makefile"}div[class~=language-javascript]:before{content:"js"}div[class~=language-typescript]:before{content:"ts"}div[class~=language-markup]:before{content:"html"}div[class~=language-markdown]:before{content:"md"}div[class~=language-json]:before{content:"json"}div[class~=language-ruby]:before{content:"rb"}div[class~=language-python]:before{content:"py"}div[class~=language-bash]:before{content:"sh"}div[class~=language-php]:before{content:"php"}.custom-block .custom-block-title{font-weight:600;margin-bottom:-.4rem}.custom-block.danger,.custom-block.tip,.custom-block.warning{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-block.tip{background-color:#f3f5f7;border-color:#42b983}.custom-block.warning{background-color:rgba(255,229,100,.3);border-color:#e7c000;color:#6b5900}.custom-block.warning .custom-block-title{color:#b29400}.custom-block.warning a{color:#292828}.custom-block.danger{background-color:#ffe6e6;border-color:#c00;color:#4d0000}.custom-block.danger .custom-block-title{color:#900}.custom-block.danger a{color:#292828}.custom-block.details{display:block;position:relative;border-radius:2px;margin:1.6em 0;padding:1.6em;background-color:#eee}.custom-block.details h4{margin-top:0}.custom-block.details figure:last-child,.custom-block.details p:last-child{margin-bottom:0;padding-bottom:0}.custom-block.details summary{outline:none;cursor:pointer}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-bottom:6px solid #ccc}.arrow.down,.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent}.arrow.down{border-top:6px solid #ccc}.arrow.right{border-left:6px solid #ccc}.arrow.left,.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.arrow.left{border-right:6px solid #ccc}.theme-default-content:not(.custom){max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.theme-default-content:not(.custom){padding:2rem}}@media (max-width:480px){.theme-default-content:not(.custom){padding:1.5rem}}.table-of-contents .badge{vertical-align:middle}body,html{padding:0;margin:0;background-color:#fff}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:16px;color:#292828}.page{padding-left:20rem}.navbar{z-index:20;right:0;height:3.6rem;background-color:#fff;box-sizing:border-box;border-bottom:1px solid #eaecef}.navbar,.sidebar-mask{position:fixed;top:0;left:0}.sidebar-mask{z-index:9;width:100vw;height:100vh;display:none}.sidebar{font-size:16px;background-color:#fff;width:20rem;position:fixed;z-index:10;margin:0;top:3.6rem;left:0;bottom:0;box-sizing:border-box;border-right:1px solid #eaecef;overflow-y:auto}.theme-default-content:not(.custom)>:first-child{margin-top:3.6rem}.theme-default-content:not(.custom) a:hover{text-decoration:underline}.theme-default-content:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.theme-default-content:not(.custom) img{max-width:100%}.theme-default-content.custom{padding:0;margin:0}.theme-default-content.custom img{max-width:100%}a{font-weight:500;text-decoration:none}a,p a code{color:#07aab4}p a code{font-weight:400}kbd{background:#eee;border:.15rem solid #ddd;border-bottom:.25rem solid #ddd;border-radius:.15rem;padding:0 .15em}blockquote{font-size:1rem;color:#999;border-left:.2rem solid #dfe2e5;margin:1rem 0;padding:.25rem 0 .25rem 1rem}blockquote>p{margin:0}ol,ul{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25}.theme-default-content:not(.custom)>h1,.theme-default-content:not(.custom)>h2,.theme-default-content:not(.custom)>h3,.theme-default-content:not(.custom)>h4,.theme-default-content:not(.custom)>h5,.theme-default-content:not(.custom)>h6{margin-top:-3.1rem;padding-top:4.6rem;margin-bottom:0}.theme-default-content:not(.custom)>h1:first-child,.theme-default-content:not(.custom)>h2:first-child,.theme-default-content:not(.custom)>h3:first-child,.theme-default-content:not(.custom)>h4:first-child,.theme-default-content:not(.custom)>h5:first-child,.theme-default-content:not(.custom)>h6:first-child{margin-top:-1.5rem;margin-bottom:1rem}.theme-default-content:not(.custom)>h1:first-child+.custom-block,.theme-default-content:not(.custom)>h1:first-child+p,.theme-default-content:not(.custom)>h1:first-child+pre,.theme-default-content:not(.custom)>h2:first-child+.custom-block,.theme-default-content:not(.custom)>h2:first-child+p,.theme-default-content:not(.custom)>h2:first-child+pre,.theme-default-content:not(.custom)>h3:first-child+.custom-block,.theme-default-content:not(.custom)>h3:first-child+p,.theme-default-content:not(.custom)>h3:first-child+pre,.theme-default-content:not(.custom)>h4:first-child+.custom-block,.theme-default-content:not(.custom)>h4:first-child+p,.theme-default-content:not(.custom)>h4:first-child+pre,.theme-default-content:not(.custom)>h5:first-child+.custom-block,.theme-default-content:not(.custom)>h5:first-child+p,.theme-default-content:not(.custom)>h5:first-child+pre,.theme-default-content:not(.custom)>h6:first-child+.custom-block,.theme-default-content:not(.custom)>h6:first-child+p,.theme-default-content:not(.custom)>h6:first-child+pre{margin-top:2rem}h1:focus .header-anchor,h1:hover .header-anchor,h2:focus .header-anchor,h2:hover .header-anchor,h3:focus .header-anchor,h3:hover .header-anchor,h4:focus .header-anchor,h4:hover .header-anchor,h5:focus .header-anchor,h5:hover .header-anchor,h6:focus .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid #eaecef}h3{font-size:1.35rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0}a.header-anchor:focus,a.header-anchor:hover{text-decoration:none}.line-number,code,kbd{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}ol,p,ul{line-height:1.7}hr{border:0;border-top:1px solid #eaecef}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}tr{border-top:1px solid #dfe2e5}tr:nth-child(2n){background-color:#f6f8fa}td,th{border:1px solid #dfe2e5;padding:.6em 1em}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.no-navbar .theme-default-content:not(.custom)>h1,.theme-container.no-navbar h2,.theme-container.no-navbar h3,.theme-container.no-navbar h4,.theme-container.no-navbar h5,.theme-container.no-navbar h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .sidebar{top:0}@media (min-width:720px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page{padding-left:0}}@media (max-width:959px){.sidebar{font-size:15px;width:16.4rem}.page{padding-left:16.4rem}}@media (max-width:719px){.sidebar{top:0;padding-top:3.6rem;transform:translateX(-100%);transition:transform .2s ease}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translateX(0)}.theme-container.no-navbar .sidebar{padding-top:0}}@media (max-width:480px){h1{font-size:1.9rem}.theme-default-content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}img+span>.icon.outbound{display:none}body{font-family:Raleway;font-weight:400}strong{font-weight:550}h1,h2,h3,h4,h5,h6{font-family:IstokWeb;font-weight:400}.custom-block.tip{border-color:#23c8d2;background-color:#f7f7f3;color:#292828}.custom-block.tip .custom-block-title{color:#292828}.custom-block.warning{border-color:#f1f440;background-color:#f7f7f3;color:#292828}.custom-block.warning .custom-block-title{color:#292828}.custom-block.danger{border-color:#f5775b;background-color:#f7f7f3;color:#292828}.custom-block.danger .custom-block-title{color:#292828}.sidebar nav.nav-links div.nav-item{display:none}span.badge{font-family:Raleway;font-weight:500}.theme-code-group .token.string{color:#7ec699}.theme-code-group button.theme-code-group__nav-tab.theme-code-group__nav-tab-active{border-color:#7ec699}.navbar span.site-name{font-family:IstokWeb;font-weight:500;font-size:1.6em}p.sidebar-heading{font-weight:500;font-size:1em}a.sidebar-link.active{font-weight:500!important}@font-face{font-family:Raleway;src:url(/fonts/Raleway-VariableFont_wght.ttf)}@font-face{font-family:IstokWeb;src:url(/fonts/IstokWeb-Regular.ttf);font-weight:400}#nprogress{pointer-events:none}#nprogress .bar{background:#07aab4;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #07aab4,0 0 5px #07aab4;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border-color:#07aab4 transparent transparent #07aab4;border-style:solid;border-width:2px;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.icon.outbound{color:#aaa;display:inline-block;vertical-align:middle;position:relative;top:-1px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.algolia-search-wrapper>span{vertical-align:middle}.algolia-search-wrapper .algolia-autocomplete{line-height:normal}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu{background-color:#fff;border:1px solid #999;border-radius:4px;font-size:16px;margin:6px 0 0;padding:4px;text-align:left}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu:before{border-color:#999}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu [class*=ds-dataset-]{border:none;padding:0}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu .ds-suggestions{margin-top:0}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu .ds-suggestion{border-bottom:1px solid #eaecef}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion--highlight{color:#2c815b}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion{border-color:#eaecef;padding:0}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--category-header{padding:5px 10px;margin-top:0;background:#07aab4;color:#fff;font-weight:600}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--highlight{background:hsla(0,0%,100%,.6)}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--wrapper{padding:0}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--title{font-weight:600;margin-bottom:0;color:#292828}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{vertical-align:top;padding:5px 7px 5px 5px;border-color:#eaecef;background:#f1f3f5}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:after{display:none}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column-text{color:#555}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-footer{border-color:#eaecef}.algolia-search-wrapper .algolia-autocomplete .ds-cursor .algolia-docsearch-suggestion--content{background-color:#e7edf3!important;color:#292828}@media (min-width:719px){.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{float:none;width:150px;min-width:150px;display:table-cell}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content{float:none;display:table-cell;width:100%;vertical-align:top}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .ds-dropdown-menu{min-width:515px!important}}@media (max-width:719px){.algolia-search-wrapper .ds-dropdown-menu{min-width:calc(100vw - 4rem)!important;max-width:calc(100vw - 4rem)!important}.algolia-search-wrapper .algolia-docsearch-suggestion--wrapper{padding:5px 7px 5px 5px!important}.algolia-search-wrapper .algolia-docsearch-suggestion--subcategory-column{padding:0!important;background:#fff!important}.algolia-search-wrapper .algolia-docsearch-suggestion--subcategory-column-text:after{content:" > ";font-size:10px;line-height:14.4px;display:inline-block;width:5px;margin:-3px 3px 0;vertical-align:middle}}.home{padding:3.6rem 2rem 0;max-width:960px;margin:0 auto;display:block}.home .hero{text-align:center}.home .hero img{max-width:100%;max-height:280px;display:block;margin:3rem auto 1.5rem}.home .hero h1{font-size:3rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.8rem auto}.home .hero .description{max-width:35rem;font-size:1.6rem;line-height:1.3;color:#807d7d}.home .hero .action-button{display:inline-block;font-size:1.2rem;color:#fff;background-color:#07aab4;padding:.8rem 1.6rem;border-radius:4px;transition:background-color .1s ease;box-sizing:border-box;border-bottom:1px solid #0699a2}.home .hero .action-button:hover{background-color:#08c7d3}.home .features{border-top:1px solid #eaecef;padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:#3f3d3d}.home .feature p{color:#5f5d5d}.home .footer{padding:2.5rem;border-top:1px solid #eaecef;text-align:center;color:#5f5d5d}@media (max-width:719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width:480px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.page,.page[data-v-22624a70]{padding-bottom:2rem;display:block}.page-edit{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-edit{padding:2rem}}@media (max-width:480px){.page-edit{padding:1.5rem}}.page-edit{padding-top:1rem;padding-bottom:1rem;overflow:auto}.page-edit .edit-link{display:inline-block}.page-edit .edit-link a{color:#5f5d5d;margin-right:.25rem}.page-edit .last-updated{float:right;font-size:.9em}.page-edit .last-updated .prefix{font-weight:500;color:#5f5d5d}.page-edit .last-updated .time{font-weight:400;color:#767676}@media (max-width:719px){.page-edit .edit-link{margin-bottom:.5rem}.page-edit .last-updated{font-size:.8em;float:none;text-align:left}}.page-nav{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-nav{padding:2rem}}@media (max-width:480px){.page-nav{padding:1.5rem}}.page-nav{padding-top:1rem;padding-bottom:0}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid #eaecef;padding-top:1rem;overflow:auto}.page-nav .next{float:right}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .nav-links{display:none;border-bottom:1px solid #eaecef;padding:.5rem 0 .75rem}.sidebar .nav-links a{font-weight:600}.sidebar .nav-links .nav-item,.sidebar .nav-links .repo-link{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar>.sidebar-links{padding:1.5rem 0}.sidebar>.sidebar-links>li>a.sidebar-link{font-size:1.1em;line-height:1.7;font-weight:700}.sidebar>.sidebar-links>li:not(:first-child){margin-top:.75rem}@media (max-width:719px){.sidebar .nav-links{display:block}.sidebar .nav-links .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar>.sidebar-links{padding:1rem 0}}.sidebar-group .sidebar-group{padding-left:.5em}.sidebar-group:not(.collapsable) .sidebar-heading:not(.clickable){cursor:auto;color:inherit}.sidebar-group.is-sub-group{padding-left:0}.sidebar-group.is-sub-group>.sidebar-heading{font-size:.95em;line-height:1.4;font-weight:400;padding-left:2rem}.sidebar-group.is-sub-group>.sidebar-heading:not(.clickable){opacity:.5}.sidebar-group.is-sub-group>.sidebar-group-items{padding-left:1rem}.sidebar-group.is-sub-group>.sidebar-group-items>li>.sidebar-link{font-size:.95em;border-left:none}.sidebar-group.depth-2>.sidebar-heading{border-left:none}.sidebar-heading{color:#292828;transition:color .15s ease;cursor:pointer;font-size:1.1em;font-weight:700;padding:.35rem 1.5rem .35rem 1.25rem;width:100%;box-sizing:border-box;margin:0;border-left:.25rem solid transparent}.sidebar-heading.open,.sidebar-heading:hover{color:inherit}.sidebar-heading .arrow{position:relative;top:-.12em;left:.5em}.sidebar-heading.clickable.active{font-weight:600;color:#07aab4;border-left-color:#07aab4}.sidebar-heading.clickable:hover{color:#07aab4}.sidebar-group-items{transition:height .1s ease-out;font-size:.95em;overflow:hidden}.badge[data-v-6eb0829b]{display:inline-block;font-size:14px;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:#fff;background-color:#42b983}.badge.green[data-v-6eb0829b],.badge.tip[data-v-6eb0829b]{background-color:#23c8d2}.badge.error[data-v-6eb0829b]{background-color:#f5775b}.badge.warn[data-v-6eb0829b],.badge.warning[data-v-6eb0829b],.badge.yellow[data-v-6eb0829b]{background-color:#e9c400}.badge+.badge[data-v-6eb0829b]{margin-left:5px}.theme-code-block[data-v-311ec9b4]{display:none}.theme-code-block__active[data-v-311ec9b4]{display:block}.theme-code-block>pre[data-v-311ec9b4]{background-color:orange}.theme-code-group__nav[data-v-5cad0a2e]{margin-bottom:-35px;background-color:#282c34;padding-bottom:22px;border-top-left-radius:6px;border-top-right-radius:6px;padding-left:10px;padding-top:10px}.theme-code-group__ul[data-v-5cad0a2e]{margin:auto 0;padding-left:0;display:inline-flex;list-style:none}.theme-code-group__nav-tab[data-v-5cad0a2e]{border:0;padding:5px;cursor:pointer;background-color:transparent;font-size:.85em;line-height:1.4;color:hsla(0,0%,100%,.9);font-weight:600}.theme-code-group__nav-tab-active[data-v-5cad0a2e]{border-bottom:1px solid #42b983}.pre-blank[data-v-5cad0a2e]{color:#42b983}a.button[data-v-439d4a3b]{display:block;width:114px;height:38px;line-height:38px;background-color:#23c8d2;border-radius:6px;color:#fff;text-align:center;font-weight:600}@media only screen and (min-width:719px){.columns[data-v-6d930324]{display:flex}}.column[data-v-71066fea]{margin-bottom:22px}@media only screen and (min-width:719px){.column.left[data-v-71066fea]{width:33%;margin-right:5%}.column.right[data-v-71066fea]{width:62%}}.contributor[data-v-074475b8]{width:3.26em;height:3.26em;border-radius:50%;text-indent:-9999px;display:inline-block;background:no-repeat url(/assets/img/contributors.dce34075.jpg);background-size:auto 102%;margin:0 .67em .67em 0;border:2px solid var(--second)}@media only screen and (min-width:414px){.contributor[data-v-074475b8]{width:3.625em;height:3.625em;margin:0 .8em .8em 0}}div[data-v-20681dd8]{height:200px;box-sizing:border-box;padding:28px;border-radius:8px;position:relative;color:#fff;margin-bottom:25px}@media only screen and (min-width:480px){div[data-v-20681dd8]{height:160px}}@media only screen and (min-width:719px){div[data-v-20681dd8]{width:31.25%;height:225px;margin-right:3%;margin-bottom:0}}div h3[data-v-20681dd8]{margin:0}@media only screen and (min-width:959px){div h3[data-v-20681dd8]{font-size:1.75em}}div h3 .header-anchor[data-v-20681dd8]{display:none}@media only screen and (min-width:959px){div p[data-v-20681dd8]{font-size:1.25em}}div.less-code[data-v-20681dd8]{background-color:#23c8d2}div.fast-secure[data-v-20681dd8]{background-color:#409cff}div.multi-spec[data-v-20681dd8]{background-color:#f5775b}@media only screen and (min-width:719px){div[data-v-20681dd8]:last-child{margin-right:0}}a[data-v-20681dd8]{position:absolute;bottom:24px;right:24px;color:#fff}.features[data-v-30c230c6]{padding:60px 0}@media only screen and (min-width:719px){.features[data-v-30c230c6]{display:flex}}@media only screen and (min-width:719px){div[data-v-f7c18a96]{width:25%}}p a[data-v-f7c18a96]{color:#292828;font-weight:400}p a[data-v-f7c18a96]:hover{text-decoration:underline}@media only screen and (max-width:719px){p[data-v-f7c18a96]{margin:0;line-height:30px}}.column img[data-v-f7c18a96]{display:block;margin:0 auto}.column.ajv img[data-v-f7c18a96]{margin:0;width:100px}@media only screen and (max-width:719px){.column.ajv img[data-v-f7c18a96]{margin-bottom:34px}}.column.links a[data-v-f7c18a96]{color:#292828;font-weight:400}@media only screen and (max-width:719px){.column.sponsors a[data-v-f7c18a96]:first-child{display:block;margin-top:80px}}.column.sponsors img[data-v-f7c18a96]{width:140px;padding:0 20px 15px}.footer-columns[data-v-de1d7950]{padding:20px 0 60px;border-bottom:1px solid #c4c4c4}@media only screen and (min-width:719px){.footer-columns[data-v-de1d7950]{display:flex}}span[data-v-3ac601d9]{vertical-align:-8px;padding-left:20px}@media only screen and (max-width:719px){span[data-v-3ac601d9]{vertical-align:-21px}}.homepage[data-v-07ee638e]{padding:0;box-sizing:content-box}.hero-section[data-v-37c67372]{width:100%;padding:3.6rem 0 50px;overflow:hidden;background:linear-gradient(304.33deg,hsla(0,0%,92.9%,.31) -7.48%,#c6e1ff 30.07%,hsla(0,0%,92.9%,.26) 82.76%)}.hero-section .section-content[data-v-37c67372]{position:relative;max-width:1000px;padding:0 50px;margin:0 auto}@media only screen and (max-width:719px){.hero-section .section-content[data-v-37c67372]{padding:0 40px}}@media only screen and (max-width:480px){.hero-section .section-content[data-v-37c67372]{padding:0 30px}}.hero-section .section-content .section-content-wrapper[data-v-37c67372]{position:relative;z-index:2}.hero-section .hero-image[data-v-37c67372]{position:absolute;z-index:1;width:658px;top:-400px;left:-25px}@media only screen and (min-width:480px){.hero-section .hero-image[data-v-37c67372]{width:823px;top:-500px;left:50px}}@media only screen and (min-width:719px){.hero-section .hero-image[data-v-37c67372]{top:-430px;left:330px}}@media only screen and (min-width:959px){.hero-section .hero-image[data-v-37c67372]{width:1097px;top:-575px;left:425px}}.hero-section .header-anchor[data-v-37c67372]{display:none}.hero-section h1[data-v-37c67372]{font-size:2em;margin-top:200px}.hero-section h2[data-v-37c67372]{border-bottom:none}@media only screen and (min-width:480px){.hero-section h1[data-v-37c67372]{font-size:3em}.hero-section h2[data-v-37c67372]{font-size:1.75em}}@media only screen and (min-width:719px){.hero-section h1[data-v-37c67372],.hero-section h2[data-v-37c67372]{margin-left:48px}}@media only screen and (min-width:959px){.hero-section h1[data-v-37c67372]{font-size:4em}.hero-section h2[data-v-37c67372]{font-size:2.25em}.hero-section h1[data-v-37c67372],.hero-section h2[data-v-37c67372]{margin-left:64px}}.home-section[data-v-aed41194]{width:100%;padding:3.6rem 0 50px}.home-section .section-content[data-v-aed41194]{max-width:1000px;padding:0 50px;margin:0 auto}@media only screen and (max-width:719px){.home-section .section-content[data-v-aed41194]{padding:0 40px}}@media only screen and (max-width:480px){.home-section .section-content[data-v-aed41194]{padding:0 30px}}.home-section[data-v-aed41194] .theme-code-group button{position:relative;outline:none;z-index:1}.home-section.contributors[data-v-aed41194],.home-section.footer[data-v-aed41194],.home-section.testimonials[data-v-aed41194]{background:linear-gradient(295.26deg,hsla(0,0%,91%,.8) 26.65%,hsla(0,0%,100%,.04) 83.48%)}.home-section.footer p[data-v-aed41194]{padding:20px 0 0;text-align:center;color:#292828}.home-section.footer p a[data-v-aed41194]{color:#292828;font-weight:400}.home-section.footer p a[data-v-aed41194]:hover{text-decoration:underline}.post[data-v-a228e400]{display:flex;border-bottom:1px solid #eaecef}.post[data-v-a228e400]:last-child{border-bottom:none}.post a.read-more[data-v-a228e400]{float:right;margin:28px 0}p.subscribe[data-v-a228e400]{margin-top:2em}p.subscribe a.all-news[data-v-a228e400]{display:block;margin-top:1rem}@media only screen and (min-width:480px){p.subscribe a.all-news[data-v-a228e400]{display:inline-block;float:right;margin-top:0}}.post-meta>div[data-v-f7ce3066]{display:inline-flex}.pub-date[data-v-f7ce3066]{color:grey}.projects p[data-v-7ef3dfe8]{max-width:1100px;padding:0}.projects img[data-v-7ef3dfe8]{display:inline-block;max-width:240px;height:40px;line-height:40px;vertical-align:middle}@media only screen and (max-width:719px){.projects img[data-v-7ef3dfe8]{max-width:160px;height:30px;line-height:30px}}.projects a[data-v-7ef3dfe8]{display:inline-block;height:40px;line-height:40px;vertical-align:middle;margin:0 36px 30px 0;font-size:28px;font-weight:500;color:#292828}@media only screen and (max-width:719px){.projects a[data-v-7ef3dfe8]{margin:0 24px 20px 0;height:30px;line-height:30px;font-size:20px}}.projects a[data-v-7ef3dfe8]:hover{text-decoration:none}.projects a span[data-v-7ef3dfe8]{display:none}.sponsors[data-v-c1b00a8c]{max-width:800px;margin:0 auto}.sponsors h2[data-v-c1b00a8c]{margin-left:0;text-decoration:none}.sponsors h2 a.header-anchor[data-v-c1b00a8c]{width:auto;margin-right:0}.sponsors p[data-v-c1b00a8c]{font-size:24px}.sponsors.bronze img[data-v-c1b00a8c],.sponsors.gold img[data-v-c1b00a8c],.sponsors.platinum img[data-v-c1b00a8c]{width:100%}.sponsors.bronze a[data-v-c1b00a8c],.sponsors.gold a[data-v-c1b00a8c],.sponsors.platinum a[data-v-c1b00a8c]{margin-bottom:10px;display:inline-block}@media only screen and (min-width:480px){.sponsors.bronze a[data-v-c1b00a8c],.sponsors.gold a[data-v-c1b00a8c],.sponsors.platinum a[data-v-c1b00a8c]{margin-bottom:0}}.sponsors.bronze a[data-v-c1b00a8c]:last-child,.sponsors.gold a[data-v-c1b00a8c]:last-child,.sponsors.platinum a[data-v-c1b00a8c]:last-child{margin-right:0}.sponsors.platinum a[data-v-c1b00a8c]{width:100%;display:block}@media only screen and (min-width:480px){.sponsors.platinum a[data-v-c1b00a8c]{display:inline-block;width:45%;margin-right:8%}}.sponsors.gold a[data-v-c1b00a8c]{width:45%;margin-right:4%}@media only screen and (min-width:480px){.sponsors.gold a[data-v-c1b00a8c]{width:31%;margin-right:2%}}.sponsors.bronze a[data-v-c1b00a8c]{width:45%;margin-right:4%}@media only screen and (min-width:480px){.sponsors.bronze a[data-v-c1b00a8c]{width:22%;margin-right:3%}}form[data-v-410e8fc2]{display:inline-block}label[data-v-410e8fc2]{display:block;margin-bottom:1rem}@media only screen and (min-width:719px){label[data-v-410e8fc2]{display:inline-block;margin-bottom:0}}button[data-v-410e8fc2],input[data-v-410e8fc2]{font-family:Raleway;font-size:16px;border:0 solid;outline:none}input[data-v-410e8fc2]{border:1px solid #cfd4db;height:2rem;width:180px;border-radius:2rem;padding:0 .5rem;margin:0 .5rem 0 0}input[data-v-410e8fc2]:focus{border-color:#07aab4}@media only screen and (min-width:719px){input[data-v-410e8fc2]{width:200px;margin:0 1rem}}button[data-v-410e8fc2]{width:114px;height:36px;line-height:36px;padding-top:0;background-color:#23c8d2;border-radius:6px;color:#fff;text-align:center;font-weight:600;display:block;margin-top:1em}@media only screen and (min-width:414px){button[data-v-410e8fc2]{display:inline-block;margin-top:0}}div.testimonial-content[data-v-2c05e654]{background-position:50%;overflow:hidden;width:280px;background-repeat:no-repeat}div.testimonial-content.blue[data-v-2c05e654]{background-image:url(/assets/img/testimonials-blue.868231a8.svg)}div.testimonial-content.green[data-v-2c05e654]{background-image:url(/assets/img/testimonials-green.6fdaa89c.svg)}div.testimonial-content p[data-v-2c05e654]{margin:.9em 0;font-size:15px}@media only screen and (max-width:374px){div.testimonial-content.blue[data-v-2c05e654],div.testimonial-content.green[data-v-2c05e654]{background-image:none;padding:0}div.testimonial-content.blue p[data-v-2c05e654],div.testimonial-content.green p[data-v-2c05e654]{font-size:15px}}@media only screen and (max-width:500px){div.testimonial-content[data-v-2c05e654]{width:100%;background-size:350px 156px;padding:0 calc(50% - 100px);box-sizing:border-box}div.testimonial-content p[data-v-2c05e654]{font-size:12px}}@media only screen and (min-width:500px){div.testimonial-content[data-v-2c05e654]{height:212px;padding:0 75px;margin:40px auto 0}}@media only screen and (min-width:959px){div.testimonial-content[data-v-2c05e654]{padding:0 calc(25% - 140px)}}.header-anchor[data-v-2c05e654]{display:none}.testimonials[data-v-729b0721]{padding:20px 0}@media only screen and (min-width:959px){.testimonials[data-v-729b0721]{display:flex}}.searchbox{display:inline-block;position:relative;width:200px;height:32px!important;white-space:nowrap;box-sizing:border-box;visibility:visible!important}.searchbox .algolia-autocomplete{display:block;width:100%;height:100%}.searchbox__wrapper{width:100%;height:100%;z-index:999;position:relative}.searchbox__input{display:inline-block;box-sizing:border-box;transition:box-shadow .4s ease,background .4s ease;border:0;border-radius:16px;box-shadow:inset 0 0 0 1px #ccc;background:#fff!important;padding:0 26px 0 32px;width:100%;height:100%;vertical-align:middle;white-space:normal;font-size:12px;-webkit-appearance:none;-moz-appearance:none;appearance:none}.searchbox__input::-webkit-search-cancel-button,.searchbox__input::-webkit-search-decoration,.searchbox__input::-webkit-search-results-button,.searchbox__input::-webkit-search-results-decoration{display:none}.searchbox__input:hover{box-shadow:inset 0 0 0 1px #b3b3b3}.searchbox__input:active,.searchbox__input:focus{outline:0;box-shadow:inset 0 0 0 1px #aaa;background:#fff}.searchbox__input::-moz-placeholder{color:#aaa}.searchbox__input::placeholder{color:#aaa}.searchbox__submit{position:absolute;top:0;margin:0;border:0;border-radius:16px 0 0 16px;background-color:rgba(69,142,225,0);padding:0;width:32px;height:100%;vertical-align:middle;text-align:center;font-size:inherit;-webkit-user-select:none;-moz-user-select:none;user-select:none;right:inherit;left:0}.searchbox__submit:before{display:inline-block;margin-right:-4px;height:100%;vertical-align:middle;content:""}.searchbox__submit:active,.searchbox__submit:hover{cursor:pointer}.searchbox__submit:focus{outline:0}.searchbox__submit svg{width:14px;height:14px;vertical-align:middle;fill:#6d7e96}.searchbox__reset{display:block;position:absolute;top:8px;right:8px;margin:0;border:0;background:none;cursor:pointer;padding:0;font-size:inherit;-webkit-user-select:none;-moz-user-select:none;user-select:none;fill:rgba(0,0,0,.5)}.searchbox__reset.hide{display:none}.searchbox__reset:focus{outline:0}.searchbox__reset svg{display:block;margin:4px;width:8px;height:8px}.searchbox__input:valid~.searchbox__reset{display:block;animation-name:sbx-reset-in;animation-duration:.15s}@keyframes sbx-reset-in{0%{transform:translate3d(-20%,0,0);opacity:0}to{transform:none;opacity:1}}.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu{right:0!important;left:inherit!important}.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu:before{right:48px}.algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu{left:0!important;right:inherit!important}.algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu:before{left:48px}.algolia-autocomplete .ds-dropdown-menu{top:-6px;border-radius:4px;margin:6px 0 0;padding:0;text-align:left;height:auto;position:relative;background:transparent;border:none;z-index:999;max-width:600px;min-width:500px;box-shadow:0 1px 0 0 rgba(0,0,0,.2),0 2px 3px 0 rgba(0,0,0,.1)}.algolia-autocomplete .ds-dropdown-menu:before{display:block;position:absolute;content:"";width:14px;height:14px;background:#fff;z-index:1000;top:-7px;border-top:1px solid #d9d9d9;border-right:1px solid #d9d9d9;transform:rotate(-45deg);border-radius:2px}.algolia-autocomplete .ds-dropdown-menu .ds-suggestions{position:relative;z-index:1000;margin-top:8px}.algolia-autocomplete .ds-dropdown-menu .ds-suggestions a:hover{text-decoration:none}.algolia-autocomplete .ds-dropdown-menu .ds-suggestion{cursor:pointer}.algolia-autocomplete .ds-dropdown-menu .ds-suggestion.ds-cursor .algolia-docsearch-suggestion.suggestion-layout-simple,.algolia-autocomplete .ds-dropdown-menu .ds-suggestion.ds-cursor .algolia-docsearch-suggestion:not(.suggestion-layout-simple) .algolia-docsearch-suggestion--content{background-color:rgba(69,142,225,.05)}.algolia-autocomplete .ds-dropdown-menu [class^=ds-dataset-]{position:relative;border:1px solid #d9d9d9;background:#fff;border-radius:4px;overflow:auto;padding:0 8px 8px}.algolia-autocomplete .ds-dropdown-menu *{box-sizing:border-box}.algolia-autocomplete .algolia-docsearch-suggestion{display:block;position:relative;padding:0 8px;background:#fff;color:#02060c;overflow:hidden}.algolia-autocomplete .algolia-docsearch-suggestion--highlight{color:#174d8c;background:rgba(143,187,237,.1);padding:.1em .05em}.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl0 .algolia-docsearch-suggestion--highlight,.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl1 .algolia-docsearch-suggestion--highlight,.algolia-autocomplete .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight{padding:0 0 1px;background:inherit;box-shadow:inset 0 -2px 0 0 rgba(69,142,225,.8);color:inherit}.algolia-autocomplete .algolia-docsearch-suggestion--content{display:block;float:right;width:70%;position:relative;padding:5.33333px 0 5.33333px 10.66667px;cursor:pointer}.algolia-autocomplete .algolia-docsearch-suggestion--content:before{content:"";position:absolute;display:block;top:0;height:100%;width:1px;background:#ddd;left:-1px}.algolia-autocomplete .algolia-docsearch-suggestion--category-header{position:relative;border-bottom:1px solid #ddd;display:none;margin-top:8px;padding:4px 0;font-size:1em;color:#33363d}.algolia-autocomplete .algolia-docsearch-suggestion--wrapper{width:100%;float:left;padding:8px 0 0}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column{float:left;width:30%;text-align:right;position:relative;padding:5.33333px 10.66667px;color:#a4a7ae;font-size:.9em;word-wrap:break-word}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column:before{content:"";position:absolute;display:block;top:0;height:100%;width:1px;background:#ddd;right:0}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-inline{display:none}.algolia-autocomplete .algolia-docsearch-suggestion--title{margin-bottom:4px;color:#02060c;font-size:.9em;font-weight:700}.algolia-autocomplete .algolia-docsearch-suggestion--text{display:block;line-height:1.2em;font-size:.85em;color:#63676d}.algolia-autocomplete .algolia-docsearch-suggestion--no-results{width:100%;padding:8px 0;text-align:center;font-size:1.2em}.algolia-autocomplete .algolia-docsearch-suggestion--no-results:before{display:none}.algolia-autocomplete .algolia-docsearch-suggestion code{padding:1px 5px;font-size:90%;border:none;color:#222;background-color:#ebebeb;border-radius:3px;font-family:Menlo,Monaco,Consolas,Courier New,monospace}.algolia-autocomplete .algolia-docsearch-suggestion code .algolia-docsearch-suggestion--highlight{background:none}.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__main .algolia-docsearch-suggestion--category-header,.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__secondary{display:block}@media (min-width:768px){.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{display:block}}@media (max-width:768px){.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{display:inline-block;width:auto;float:left;padding:0;color:#02060c;font-size:.9em;font-weight:700;text-align:left;opacity:.5}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:before{display:none}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:after{content:"|"}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content{display:inline-block;width:auto;text-align:left;float:left;padding:0}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content:before{display:none}}.algolia-autocomplete .suggestion-layout-simple.algolia-docsearch-suggestion{border-bottom:1px solid #eee;padding:8px;margin:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--content{width:100%;padding:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--content:before{display:none}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header{margin:0;padding:0;display:block;width:100%;border:none}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl0,.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl1{opacity:.6;font-size:.85em}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl1:before{background-image:url('data:image/svg+xml;utf8,');content:"";width:10px;height:10px;display:inline-block}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--wrapper{width:100%;float:left;margin:0;padding:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--duplicate-content,.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--subcategory-inline{display:none!important}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--title{margin:0;color:#458ee1;font-size:.9em;font-weight:400}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--title:before{content:"#";font-weight:700;color:#458ee1;display:inline-block}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--text{margin:4px 0 0;display:block;line-height:1.4em;padding:5.33333px 8px;background:#f8f8f8;font-size:.85em;opacity:.8}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight{color:#3f4145;font-weight:700;box-shadow:none}.algolia-autocomplete .algolia-docsearch-footer{width:134px;height:20px;z-index:2000;margin-top:10.66667px;float:right;font-size:0;line-height:0}.algolia-autocomplete .algolia-docsearch-footer--logo{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='168' height='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cpath d='M78.988.938h16.594a2.968 2.968 0 012.966 2.966V20.5a2.967 2.967 0 01-2.966 2.964H78.988a2.967 2.967 0 01-2.966-2.964V3.897A2.961 2.961 0 0178.988.938zm41.937 17.866c-4.386.02-4.386-3.54-4.386-4.106l-.007-13.336 2.675-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-10.846-2.18c.821 0 1.43-.047 1.855-.129v-2.719a6.334 6.334 0 00-1.574-.199 5.7 5.7 0 00-.897.069 2.699 2.699 0 00-.814.24c-.24.116-.439.28-.582.491-.15.212-.219.335-.219.656 0 .628.219.991.616 1.23s.938.362 1.615.362zm-.233-9.7c.883 0 1.629.109 2.231.328.602.218 1.088.525 1.444.915.363.396.609.922.76 1.483.157.56.232 1.175.232 1.85v6.874a32.5 32.5 0 01-1.868.314c-.834.123-1.772.185-2.813.185-.69 0-1.327-.069-1.895-.198a4.001 4.001 0 01-1.471-.636 3.085 3.085 0 01-.951-1.134c-.226-.465-.343-1.12-.343-1.803 0-.656.13-1.073.384-1.525a3.24 3.24 0 011.047-1.106c.445-.287.95-.492 1.532-.615a8.8 8.8 0 011.82-.185 8.404 8.404 0 011.972.24v-.438c0-.307-.035-.6-.11-.874a1.88 1.88 0 00-.384-.73 1.784 1.784 0 00-.724-.493 3.164 3.164 0 00-1.143-.205c-.616 0-1.177.075-1.69.164a7.735 7.735 0 00-1.26.307l-.321-2.192c.335-.117.834-.233 1.478-.349a10.98 10.98 0 012.073-.178zm52.842 9.626c.822 0 1.43-.048 1.854-.13V13.7a6.347 6.347 0 00-1.574-.199c-.294 0-.595.021-.896.069a2.7 2.7 0 00-.814.24 1.46 1.46 0 00-.582.491c-.15.212-.218.335-.218.656 0 .628.218.991.615 1.23.404.245.938.362 1.615.362zm-.226-9.694c.883 0 1.629.108 2.231.327.602.219 1.088.526 1.444.915.355.39.609.923.759 1.483a6.8 6.8 0 01.233 1.852v6.873c-.41.088-1.034.19-1.868.314-.834.123-1.772.184-2.813.184-.69 0-1.327-.068-1.895-.198a4.001 4.001 0 01-1.471-.635 3.085 3.085 0 01-.951-1.134c-.226-.465-.343-1.12-.343-1.804 0-.656.13-1.073.384-1.524.26-.45.608-.82 1.047-1.107.445-.286.95-.491 1.532-.614a8.803 8.803 0 012.751-.13c.329.034.671.096 1.04.185v-.437a3.3 3.3 0 00-.109-.875 1.873 1.873 0 00-.384-.731 1.784 1.784 0 00-.724-.492 3.165 3.165 0 00-1.143-.205c-.616 0-1.177.075-1.69.164a7.75 7.75 0 00-1.26.307l-.321-2.193c.335-.116.834-.232 1.478-.348a11.633 11.633 0 012.073-.177zm-8.034-1.271a1.626 1.626 0 01-1.628-1.62c0-.895.725-1.62 1.628-1.62.904 0 1.63.725 1.63 1.62 0 .895-.733 1.62-1.63 1.62zm1.348 13.22h-2.689V7.27l2.69-.423v11.956zm-4.714 0c-4.386.02-4.386-3.54-4.386-4.107l-.008-13.336 2.676-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-8.698-5.903c0-1.156-.253-2.119-.746-2.788-.493-.677-1.183-1.01-2.067-1.01-.882 0-1.574.333-2.065 1.01-.493.676-.733 1.632-.733 2.788 0 1.168.246 1.953.74 2.63.492.683 1.183 1.018 2.066 1.018.882 0 1.574-.342 2.067-1.019.492-.683.738-1.46.738-2.63zm2.737-.007c0 .902-.13 1.584-.397 2.33a5.52 5.52 0 01-1.128 1.906 4.986 4.986 0 01-1.752 1.223c-.685.286-1.739.45-2.265.45-.528-.006-1.574-.157-2.252-.45a5.096 5.096 0 01-1.744-1.223c-.487-.527-.863-1.162-1.137-1.906a6.345 6.345 0 01-.41-2.33c0-.902.123-1.77.397-2.508a5.554 5.554 0 011.15-1.892 5.133 5.133 0 011.75-1.216c.679-.287 1.425-.423 2.232-.423.808 0 1.553.142 2.237.423a4.88 4.88 0 011.753 1.216 5.644 5.644 0 011.135 1.892c.287.738.431 1.606.431 2.508zm-20.138 0c0 1.12.246 2.363.738 2.882.493.52 1.13.78 1.91.78.424 0 .828-.062 1.204-.178.377-.116.677-.253.917-.417V9.33a10.476 10.476 0 00-1.766-.226c-.971-.028-1.71.37-2.23 1.004-.513.636-.773 1.75-.773 2.788zm7.438 5.274c0 1.824-.466 3.156-1.404 4.004-.936.846-2.367 1.27-4.296 1.27-.705 0-2.17-.137-3.34-.396l.431-2.118c.98.205 2.272.26 2.95.26 1.074 0 1.84-.219 2.299-.656.459-.437.684-1.086.684-1.948v-.437a8.07 8.07 0 01-1.047.397c-.43.13-.93.198-1.492.198-.739 0-1.41-.116-2.018-.349a4.206 4.206 0 01-1.567-1.025c-.431-.45-.774-1.017-1.013-1.694-.24-.677-.363-1.885-.363-2.773 0-.834.13-1.88.384-2.577.26-.696.629-1.298 1.129-1.796.493-.498 1.095-.881 1.8-1.162a6.605 6.605 0 012.428-.457c.87 0 1.67.109 2.45.24.78.129 1.444.265 1.985.415V18.17z' fill='%235468FF'/%3E%3Cpath d='M6.972 6.677v1.627c-.712-.446-1.52-.67-2.425-.67-.585 0-1.045.13-1.38.391a1.24 1.24 0 00-.502 1.03c0 .425.164.765.494 1.02.33.256.835.532 1.516.83.447.192.795.356 1.045.495.25.138.537.332.862.582.324.25.563.548.718.894.154.345.23.741.23 1.188 0 .947-.334 1.691-1.004 2.234-.67.542-1.537.814-2.601.814-1.18 0-2.16-.229-2.936-.686v-1.708c.84.628 1.814.942 2.92.942.585 0 1.048-.136 1.388-.407.34-.271.51-.646.51-1.125 0-.287-.1-.55-.302-.79-.203-.24-.42-.42-.655-.542-.234-.123-.585-.29-1.053-.503a61.27 61.27 0 01-.582-.271 13.67 13.67 0 01-.55-.287 4.275 4.275 0 01-.567-.351 6.92 6.92 0 01-.455-.4c-.18-.17-.31-.34-.39-.51-.08-.17-.155-.37-.224-.598a2.553 2.553 0 01-.104-.742c0-.915.333-1.638.998-2.17.664-.532 1.523-.798 2.576-.798.968 0 1.793.17 2.473.51zm7.468 5.696v-.287c-.022-.607-.187-1.088-.495-1.444-.309-.357-.75-.535-1.324-.535-.532 0-.99.194-1.373.583-.382.388-.622.949-.717 1.683h3.909zm1.005 2.792v1.404c-.596.34-1.383.51-2.362.51-1.255 0-2.255-.377-3-1.132-.744-.755-1.116-1.744-1.116-2.968 0-1.297.34-2.316 1.021-3.055.68-.74 1.548-1.11 2.6-1.11 1.033 0 1.852.323 2.458.966.606.644.91 1.572.91 2.784 0 .33-.033.676-.096 1.038h-5.314c.107.702.405 1.239.894 1.611.49.372 1.106.558 1.85.558.862 0 1.58-.202 2.155-.606zm6.605-1.77h-1.212c-.596 0-1.045.116-1.349.35-.303.234-.454.532-.454.894 0 .372.117.664.35.877.235.213.575.32 1.022.32.51 0 .912-.142 1.204-.424.293-.281.44-.651.44-1.108v-.91zm-4.068-2.554V9.325c.627-.361 1.457-.542 2.489-.542 2.116 0 3.175 1.026 3.175 3.08V17h-1.548v-.957c-.415.68-1.143 1.02-2.186 1.02-.766 0-1.38-.22-1.843-.661-.462-.442-.694-1.003-.694-1.684 0-.776.293-1.38.878-1.81.585-.431 1.404-.647 2.457-.647h1.34V11.8c0-.554-.133-.971-.399-1.253-.266-.282-.707-.423-1.324-.423a4.07 4.07 0 00-2.345.718zm9.333-1.93v1.42c.394-1 1.101-1.5 2.123-1.5.148 0 .313.016.494.048v1.531a1.885 1.885 0 00-.75-.143c-.542 0-.989.24-1.34.718-.351.479-.527 1.048-.527 1.707V17h-1.563V8.91h1.563zm5.01 4.084c.022.82.272 1.492.75 2.019.479.526 1.15.79 2.01.79.639 0 1.235-.176 1.788-.527v1.404c-.521.319-1.186.479-1.995.479-1.265 0-2.276-.4-3.031-1.197-.755-.798-1.133-1.792-1.133-2.984 0-1.16.38-2.151 1.14-2.975.761-.825 1.79-1.237 3.088-1.237.702 0 1.346.149 1.93.447v1.436a3.242 3.242 0 00-1.77-.495c-.84 0-1.513.266-2.019.798-.505.532-.758 1.213-.758 2.042zM40.24 5.72v4.579c.458-1 1.293-1.5 2.505-1.5.787 0 1.42.245 1.899.734.479.49.718 1.17.718 2.042V17h-1.564v-5.106c0-.553-.14-.98-.422-1.284-.282-.303-.652-.455-1.11-.455-.531 0-1.002.202-1.411.606-.41.405-.615 1.022-.615 1.851V17h-1.563V5.72h1.563zm14.966 10.02c.596 0 1.096-.253 1.5-.758.404-.506.606-1.157.606-1.955 0-.915-.202-1.62-.606-2.114-.404-.495-.92-.742-1.548-.742-.553 0-1.05.224-1.491.67-.442.447-.662 1.133-.662 2.058 0 .958.212 1.67.638 2.138.425.469.946.703 1.563.703zM53.004 5.72v4.42c.574-.894 1.388-1.341 2.44-1.341 1.022 0 1.857.383 2.506 1.149.649.766.973 1.781.973 3.047 0 1.138-.309 2.109-.925 2.912-.617.803-1.463 1.205-2.537 1.205-1.075 0-1.894-.447-2.457-1.34V17h-1.58V5.72h1.58zm9.908 11.104l-3.223-7.913h1.739l1.005 2.632 1.26 3.415c.096-.32.48-1.458 1.15-3.415l.909-2.632h1.66l-2.92 7.866c-.777 2.074-1.963 3.11-3.559 3.11a2.92 2.92 0 01-.734-.079v-1.34c.17.042.351.064.543.064 1.032 0 1.755-.57 2.17-1.708z' fill='%235D6494'/%3E%3Cpath d='M89.632 5.967v-.772a.978.978 0 00-.978-.977h-2.28a.978.978 0 00-.978.977v.793c0 .088.082.15.171.13a7.127 7.127 0 011.984-.28c.65 0 1.295.088 1.917.259.082.02.164-.04.164-.13m-6.248 1.01l-.39-.389a.977.977 0 00-1.382 0l-.465.465a.973.973 0 000 1.38l.383.383c.062.061.15.047.205-.014.226-.307.472-.601.746-.874.281-.28.568-.526.883-.751.068-.042.075-.137.02-.2m4.16 2.453v3.341c0 .096.104.165.192.117l2.97-1.537c.068-.034.089-.117.055-.184a3.695 3.695 0 00-3.08-1.866c-.068 0-.136.054-.136.13m0 8.048a4.489 4.489 0 01-4.49-4.482 4.488 4.488 0 014.49-4.482 4.488 4.488 0 014.489 4.482 4.484 4.484 0 01-4.49 4.482m0-10.85a6.363 6.363 0 100 12.729 6.37 6.37 0 006.372-6.368 6.358 6.358 0 00-6.371-6.36' fill='%23FFF'/%3E%3C/g%3E%3C/svg%3E");background-repeat:no-repeat;background-position:50%;background-size:100%;overflow:hidden;text-indent:-9000px;padding:0!important;width:100%;height:100%;display:block}.sidebar .sidebar-sub-headers{padding-left:1rem;font-size:.95em}a.sidebar-link{font-size:1em;font-weight:400;display:inline-block;color:#292828;border-left:.25rem solid transparent;padding:.35rem 1rem .35rem 1.25rem;line-height:1.4;width:100%;box-sizing:border-box}a.sidebar-link:hover{color:#07aab4}a.sidebar-link.active{font-weight:600;color:#07aab4;border-left-color:#07aab4}.sidebar-group a.sidebar-link{padding-left:2rem}.sidebar-sub-headers a.sidebar-link{padding-top:.25rem;padding-bottom:.25rem;border-left:none}.sidebar-sub-headers a.sidebar-link.active{font-weight:500}.navbar{padding:.7rem 1.5rem;line-height:2.2rem}.navbar a,.navbar img,.navbar span{display:inline-block}.navbar .logo{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:#292828;position:relative}.navbar .links{padding-left:1.5rem;box-sizing:border-box;background-color:#fff;white-space:nowrap;font-size:.9rem;position:absolute;right:1.5rem;top:.7rem;display:flex}.navbar .links .search-box{flex:0 0 auto;vertical-align:top}@media (max-width:719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .links{padding-left:1.5rem}.navbar .site-name{width:calc(100vw - 9.4rem);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}}.nav-links{display:inline-block}.nav-links a{line-height:1.4rem;color:inherit}.nav-links a.router-link-active,.nav-links a:hover{color:#07aab4}.nav-links .nav-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:2rem}.nav-links .nav-item:first-child{margin-left:0}.nav-links .repo-link{margin-left:1.5rem}@media (max-width:719px){.nav-links .nav-item,.nav-links .repo-link{margin-left:0}}@media (min-width:719px){.nav-links a.router-link-active,.nav-links a:hover{color:#292828}.nav-item>a:not(.external).router-link-active,.nav-item>a:not(.external):hover{margin-bottom:-2px;border-bottom:2px solid #08c1cd}}.search-box{display:inline-block;position:relative;margin-right:1rem}.search-box input{cursor:text;width:10rem;height:2rem;color:#5f5d5d;display:inline-block;border:1px solid #cfd4db;border-radius:2rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:none;transition:all .2s ease;background:#fff url(/assets/img/search.83621669.svg) .6rem .5rem no-repeat;background-size:1rem}.search-box input:focus{cursor:auto;border-color:#07aab4}.search-box .suggestions{background:#fff;width:20rem;position:absolute;top:2rem;border:1px solid #cfd4db;border-radius:6px;padding:.4rem;list-style-type:none}.search-box .suggestions.align-right{right:0}.search-box .suggestion{line-height:1.4;padding:.4rem .6rem;border-radius:4px;cursor:pointer}.search-box .suggestion a{white-space:normal;color:#757272}.search-box .suggestion a .page-title{font-weight:600}.search-box .suggestion a .header{font-size:.9em;margin-left:.25em}.search-box .suggestion.focused{background-color:#f3f4f5}.search-box .suggestion.focused a{color:#07aab4}@media (max-width:959px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (-ms-high-contrast:none){.search-box input{height:2rem}}@media (max-width:959px) and (min-width:719px){.search-box .suggestions{left:0}}@media (max-width:719px){.search-box{margin-right:0}.search-box input{left:1rem}.search-box .suggestions{right:0}}@media (max-width:480px){.search-box .suggestions{width:calc(100vw - 4rem)}.search-box input:focus{width:8rem}}.dropdown-wrapper{cursor:pointer}.dropdown-wrapper .dropdown-title,.dropdown-wrapper .mobile-dropdown-title{display:block;font-size:.9rem;font-family:inherit;cursor:inherit;padding:inherit;line-height:1.4rem;background:transparent;border:none;font-weight:500;color:#292828}.dropdown-wrapper .dropdown-title:hover,.dropdown-wrapper .mobile-dropdown-title:hover{border-color:transparent}.dropdown-wrapper .dropdown-title .arrow,.dropdown-wrapper .mobile-dropdown-title .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.dropdown-wrapper .mobile-dropdown-title{display:none;font-weight:600}.dropdown-wrapper .mobile-dropdown-title font-size inherit:hover{color:#07aab4}.dropdown-wrapper .nav-dropdown .dropdown-item{color:inherit;line-height:1.7rem}.dropdown-wrapper .nav-dropdown .dropdown-item h4{margin:.45rem 0 0;border-top:1px solid #eee;padding:1rem 1.5rem .45rem 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper{padding:0;list-style:none}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper .dropdown-subitem{font-size:.9em}.dropdown-wrapper .nav-dropdown .dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active,.dropdown-wrapper .nav-dropdown .dropdown-item a:hover{color:#07aab4}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid #07aab4;border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.dropdown-wrapper .nav-dropdown .dropdown-item:first-child h4{margin-top:0;padding-top:0;border-top:0}@media (max-width:719px){.dropdown-wrapper.open .dropdown-title{margin-bottom:.5rem}.dropdown-wrapper .dropdown-title{display:none}.dropdown-wrapper .mobile-dropdown-title{display:block}.dropdown-wrapper .nav-dropdown{transition:height .1s ease-out;overflow:hidden}.dropdown-wrapper .nav-dropdown .dropdown-item h4{border-top:0;margin-top:0;padding-top:0}.dropdown-wrapper .nav-dropdown .dropdown-item>a,.dropdown-wrapper .nav-dropdown .dropdown-item h4{font-size:15px;line-height:2rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width:719px){.dropdown-wrapper{height:1.8rem}.dropdown-wrapper.open .nav-dropdown,.dropdown-wrapper:hover .nav-dropdown{display:block!important}.dropdown-wrapper.open:blur{display:none}.dropdown-wrapper .nav-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:#fff;padding:.6rem 0;border:1px solid;border-color:#ddd #ddd #ccc;text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.dropdown-enter,.dropdown-leave-to{height:0!important}.sidebar-button{cursor:pointer;display:none;width:1.25rem;height:1.25rem;position:absolute;padding:.6rem;top:.6rem;left:1rem}.sidebar-button .icon{display:block;width:1.25rem;height:1.25rem}@media (max-width:719px){.sidebar-button{display:block}} \ No newline at end of file diff --git a/assets/img/contributors.dce34075.jpg b/assets/img/contributors.dce34075.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b8a3df8ae363de6286d14f7bade6231aca75f5c3 GIT binary patch literal 251445 zcmbrlbx>T-_B}f2U}5m!5ZrZe55e8t-QC@T2M_KREVx4;xVyW%yFNbm-mm=LUr%~! z>eNhkojSYvY*}lseqVUs0H8>UN{9j=AOHY}j}PE|84wJBg@%EJfrf>Jfdv9#;Sf*| z5a8hvFpxn=D4#K~u|H#AVc`;x6XD{K;$vYE(-D(WP*T%S;}Fp^(Ni&zQ&Cev0D(XR zI0SSA1avA~EL^Jp*W>*U02K}($OwRfKm|aeLO`KHy!SxleLN!!#J>jMKLY|1>f>2~ zaPSC-C;&(ZC@4s1C>R)M=#P~?A9Da`R2Z}`%tEl}3I;$D2Mm^gxLi2Wuhm_cijx;) ztcH$(@CaC+v2k$8DJZF^X~1mk9GqO-!rw$h#l$5fm6TOf)zmdKjf_o9&CD$H1HpLARyg7 zzEG&pFkhHq(S#I$1`g;XECFyBU*mGCyWmM#6)!Li9VZd6$iSQAm;adbFN^-485H>c z$)f)@=)diGUjiUOL40f&6e>Uf@I;sP=QpfB84?DTApk$#OTl4bhiyIl4P!EMJ6k!% zBBk7QV|ctsjHrS(W@PfBD(c1#UC?-%0raV^AjryjT+*<5%HGqF3I#$CgaPsRV z$yhY&}I*?h(W_2i40mXtYaCY8oOIhxXNYUKiEfOF5th1TD}cRtmzSh*kv zV);h*)r*QGY64P403Jkrpm5Es$O+_rok2h7KU*l7eQ zy*4IeY{1_cjD%jh*o4~_q)>#ZcR9%KfX#A#{@=4M1Ool6nroV3xb5{T0E2K!QcmbM zQZU59&m8DwK|)Qo6syjYQ)DUz+b%@5p8R|E6;PYln(Zc#zX^ZN@h+u~aNR*FemS;b7z8m%a-ba>8)G?*G<^X*V-_^?)AcC?b z`Un6x4E7(U{YuIo9vUc?)Seg1K3?Oj3EfqNTQXNmR`1dWZO70?6q-?R6s8{F9FX+8I3vy!52 zk~sP$Mj(Z&i%;!~y&&<0=S&O#l!G|e49T*|g-fQWDC8NU`S{S9>?3v-zlbR@GIwVE zG#q2Z9dlxf=Dx7S=5dKl&$N}AsI-x>A}KvT-0H+9j0CC^{j7! zuP+8b9zqZX@UIJ@Y-xr=+RMNz^p9_HmadrnblAtT-A!OikUVHE!NL}tz7YMRbiY%0 zVIs{7s%1r533FhTYg8rzov;q#mLtSP>m2z=HU3+Cfr)X{fZC4r@8{x9lBQCvpG!5i z+yspw6qod8r9~^2)vN~>t8LYzzp;>(tEV%(dwjtOtpw#!oiSLAeoG)S3tCM(HOAN^ z?Go&p18O-5mi+4e2VAKVyN+r2rG{ONpAh|Q!LvhrOSGw#-Yy9J#OzxutVl8LoUaxW zDZG#0EhoA3V&;b$?${l2SYD=B&2kQak2jSOEx(KNcssk7$d(FMvUK{Bz>);;IM6%D zK4p}-d3Mvq zwgbDgLbj1?;-4Nv0DUUfI* zb~XE`lFzGEpZgRABdSB6IeAOqZC zN*g)Q)|s$iAj1h%6?<9)QZ%H2LsZELZP$=lBc^sF2zl_-;3w3T1pC8C(gek;M1nb+ z@p0*BqZvg4qOY0PettJjyaPkrM_UR;iE@F#K*lX1%;m$%3Bf$CfElO|xze|!>&Ij- zDY!@K=cy|`IxICc^mD$?sXaR0LbD{jhz`~ zXWM;=(uan-IY%@^SD|HB8SXaW@ZjdWq!?{}CCR+n1nK3A`*0f`PC zW>+UMyrQX-cYtstPReX|YrXqDH$aqozAlzm6L5w4cJZS14ye!#7~#~vUGh6m(|25B zxGanfGmDuwTVl*~dz5%VeBC3y)Sf+lCO57eOT+fFyq&}k7WllOl_6oO0pB%tCP3$) zt*24Gw(mDvQb9L1FLap|UNzQmcXpx8&JNFijJ~{lTah2T>zc-t3{2HUT24o0rS&c^ zhIV)d%vFi9D5{BNlTFuBY0K5iV!!#ldb&~c(^jpb;(0y$-In3T?8S+u4RG$W^;pXw zI#NNTEY*i*#q-^+pwJmPof#w%HXRG%yOv&l?Xt}e5)Y|_%J8Up@%O>F65AC-J<>xx ztBYiIa3IL+@!_pQs%o7+$M!mY>*H6Ivk-f)v0A=22YYxdb z;*>Du&pTN^Gkwbuco|UlV~@)#_pIXdT$ej%7qQ=|eO6M{RPK9yD@DAyau{vE)pgob zGOnB=r3z_8%e2U`ZLt4aXe$Q3v`3}c`hlA254w08;&*`aKE^Z@L1IuKvSl#0l&Q$D z%S}-@A7WPv9eWG-zEO5a68{w6-yQSQYGRD#+Ajapno@(2FC6dfu@Y@!MfIV|ic<>s zlt^P{JHkdlyrroj#dR<-N42X@RNdiRS4VpvMzkznF;9ko7GC9VCOv|64PsH9x`|b< zYt$c<6r^Hk)Ma4vRx6ER$yD*F8Cm{HAI3hHW3NsoR_4Wd&r(Q6d|N|<>=AF%4s^iu zL(9`U0Az67KQh0y!pC*hO`qRxQX{n%-|Tq4Isg51+F3zU*RR%&pXkay|B9lOiB~4L zcQ|g1ajXxM$>mGso>^EMvrom^uytj!;C+LZqY(V)8=#p;|wuN2q?)y;;?A zl_@$G4vj3`AjL5Db`a0jy~+z&I1bu=5nV!+BQq<-sGL#IMBL!>lb_{PGqWqVME5fT zuCj=rrPy;VG!dv@KFrM+(WFSA8!g=GVLrH>3K%v{bo_NA^EH-YW#7Xg&E?Ozt^7HW zXyidJEBT}JQsltsTchJ@;P2s3Vz?orDnZWjg0xlCQ@q7=UyA9x_#QFqcy&uueH^2| zef<+b8LvV_(ZM z7qQLeg5NCaN3NGqJ=s)0YyoGAa#d?eu?kYDVC%}v)H@j`JQ#o@A?GFTK}&KhmO6-6 ziWw@F5vlkw;XzFmH@m$qF)9#Q2ysI0Kgc^-f&RS33JOP5A&C!^ zOAuR~gIGiZ2)tsv(db;U+Z7~ACszLMN$ByUXha#>XTd@$9I$c$!&ZVtHci1o6B_G4 zw1zLA0GS&q9t6}Wa2ch*LNWf9T3+F#Qtp&{UVfB*53*#dKM1<80Jw4 zF)bUTEgl||v~l^i82a>!1a=V4p{`h6(T(~23=O&Spy}+3o@qezv3R*MtockrR>n4% z(TE{vuRQ5YDY8$OIy^Row1MBQP0sHw9Mg9w4!J_{wW?PSL-RMf?GLDl%h>0AjMrfP zk#ZAiC!R6*m*_IasC!AVrLCVt3MizHd(D(7qO$wi%rP`e`MJ{_-~}pJ7g6i|U=u#( znah>g$-lBOabo<`(>+Cn^f%l(cw7A;=YDQ%v%Q^MH25eU3KC(gJ{WB=_9K>MV~UyAYI%fWtL&oYG5DV7-$FIt<{%Gu zXV(;!x!^0gr|Sg%A=F%(W8~^@*b)R@=YYTu`xm2c`0g=0UV07V1+vY7N1Mua`urwC zmwjRef+#QO4=G+3`#qN{cF8(~n}KUfW%k3b7XobpPcsltAQP8Qw;7*RIenWGM(47LNu2?{Gm zV83YYzM#!A8A{2T+GzT}vE2GothR=$uz=%p-6YPdUeXBH#B|C@0dqN2%~jATC*Ao5 z<(?knkUrn{x171Q@-U+V5a8il?6N*mrf^`;0UOrJg46x_rN60^JiqM2L0Jv}|8i5R z|Gpr5y`i0QyrsVb)`?y{uRH6hJTf}9iij>!EIM!2-yYrp$CIz6!Xx~R(gK?d(|(7Y zua_UyYW}lg*iRqZpMKpsMel%Vzvu0DK$X~CA&BW|l{FVgjJnp2UP1+Rokzg1br?KO zxZ~*k8~?`!@~WI<*C;*Uz!qHl8b@E5%88fEWhMsUn&HS{mgR*T!e`s3axwDRtq&0o zGmsrVwMgE+iRdYQz7z021&+T1_ALgGY7mWQZtCLv# zMuZ=p%5^Xg0jpEFd1rdz-EVB4kauFa-f+{Aw?yn!0w}^zwWq@57x=6wC3mkQ8Gem` zlq3|y`EqCGqdfnq?B&~MZBF*Ciq>0kHcXq3whSb-YnV#ILpX+sYi28|D6euqW_AoC z+)Gqa=tShu5#o2leOr+I|8Ls|=`X-pe#5hTV3sZ&XpvJJIocejoEYw-H9eKflZy#i zie@w52#fI!$V&8x=vSOqHK-^K?IusAV^{Vsx97jwt_HmMw(;OPu9P~|T)8$in_A%S zf4O(`DFw43rY>dv*5<|Ob%`}7f?50=hZ0WCQ`!fPd7QxFhkDGKsXT@m zB^&R+q>^c2RaiYwp&rTVPa@e{2k_SyMUD`MIt`8h3b}V zFtV49S50;FK;9)gF2H6ha-KZtbXUGt9cBY{#@?N6zn`TfyDe_+!v0_^MRImyMsyaI z>(5|xXYLv8bZ&Tv%h{QON1<$Q8eO96vTkF8}BxM zDkj+SS+rj>wzk?zYi?)ye6t}2dtsn8h&SEQ<5BQ91JVy+W0X}SrKCgG>J5%+@~&N0 zslO$wzRcax$_4@5%AH(vFx|pMDIS6#mY|=&LD%~s6kpn5yIT{;Ac zoL3y9v#Ve{aS>e861K69hq22?)4Cv_Io{(;Ay*8FrQE+>Bv2Tvl9^FdJ@+E)%CVFv zJ-i&^C=U?5aR|kCA%((u0_7a)_JKYl>5wZDU5s2>Dmm{CjnW*mvRZu!`8P!V7g7dx zos;z~QlclVNzmgtc6t2<2Ax^Os;9PV;5%ydT4M}BB+wuPx&|%0<<)qv%zwZ6-PmYl zuP#A$)&r2NT+80Cr|PW`Yp%*OzXn5kWtO54!|hn}Fm`Yel(~qdt_H>=gKfMya+mw} zw40ht@P9pJdG4=cPGT2SIFzVIT>o8?c?zjZEhje!fi~pePbC1&)jBj3US+h;WwJ#N zFY5-~C2c!3h|RMFFKbyFpRE-R>|P0?NbLO#MUr&Hz8+^A9V&R;ZT6m9ct(0-JA-o! zlmT#y#=xaXERdPAjI07~b3k;L`+b?81v>+WrQ>P$OxEcxGY5(CqFnep5+Mf1FQ1kz zt~Q&}zB1*6s3;wY@A>m_bY*c)dy5&@Xz6@Ogy>+`FTnTllm{wVd0?)XLP-d!t0gT@wv87xSw)sSAxR647`IUc!tu+LY=_(eexo6Z%9N zK`rBy>t__Yx^Z5KB@uk?mV@he?z`F|qyMs+jF}|CCE2gTSt9x>XBi|Sj;TN@$QL3< zb;kV;kT7kq2DlgM?}*#^Z7i4&`Kyf25#b z`k3QZZr)sKCNt30#42d**>5UjonY&*;s zEnO%7D3?^x!;!_9SMM*&;3hIFbT#aQD)zOKa z3nnchD$~WcF|QiT){D|epLuJ)Mk87O1r|3_-c%@Btp2#2L=hu4AzcbBm)4kY_xgK} z`<729KTs`#d+vcZO#nFaDV+%8o;S3TO3F0!X8mlgibo)7+Q(4_+HGiu<7S?YdwmC7 zAiMGJ6Zvi6&{MQV`0*hr)P*d-FrVTKBX1w-D3?wq#&^V4*{LjqNG(yCdK_OkXx~-$ zQkIBvu*3IRZk9=e(?*q$Q9-_DrGt;#O5txRj3kB?@u%2wCTdue(-!4fT|}~l5t^4o zI0P}3XwGHgG1qdE%E=`vWJq~Z_hahg4CR4G|MD^zo_0}04ew^Rvp#o>DeL{R@DOUp z0eTlIhQh0@e{z=mw2&MoLd|ZtW8B0?*a9Nz(fKg_51WO**Ssx*C^Sbp?GpLd!huZJ z5gaFwtVZT@!NerSMOso}@YN|6tTIxpiIPJ1^TB_sUD<=K6{QT-z`ZEgNN1Hdg_cZ_ zeTJ8c6gZPT5Fu#Odo5ZqfW#^dM2!#x0t+diZF5S2xmy8=&V?x_<_ZDB94hYs^Et&8 z(&_-eEe&3dEq7b273r(4T^mZM1TA4BYFpQoHHUD_O8)Gt8V!ZJ|2Ciso=|BDax!87a^zVz4)ZK3PDfBA5jKXu*lIt$ z)$jDt>!q%;PFB;n= zGqUAW1x06f)RdIY(V3K89mF%s;}LA?+ltDq-W5lJH}_>3q-^?XqRvmy4KmTPOeM`L z3PIP0y(at?l!bw-BQm0cY0uX3FaBmhebm!#Vc9>6Du+^3Ii!eFxpz7TRX*%O<9^x=3qARX87fe>V$|A*0Ga>|L>!87^Y&qgN+8A~ zM3oSX7vH|ngnGUMy8VLHbcwBegjJ&Bd;4y&pZ~Jaf4^nKdqJG4y7}Q8%zhsyiYd;^ zOfX7Dx(~v3XH~hVpAsoqZV4U3kNKq1?=&S~I{ee<@>_$UsQTIVlA*(k{)N!XJAgZx z^w8oagbT(`654@~@j@jl*M{NCw``zwfM55Iafb?o|D!kv-@ep&XlSXKNhPmoiX8f) zApdKh6GpIV(t(q6diKQqNPFzqDXpU+lzK;eLR*M<9r0|LV%>K1Kuni*$ZYdFxxjFt`*G?&{WlnAm=3#wa zT=exymD2`ox%NZ-?$2dgSg#G)y<`nrFH=0!c@vu!k4M8$8*K0zWN{5L+)bxQVH?`5 z*0V6}jxb)@XWXtr69}_WE)bt$qSF=a76sz)7f-0V&^Vr0$fmIGCs@1#u+LL8<0M}z zN0_c*M?5UW@dBU%9w%}53&-LcTPN-#Jyf^g_M(FDN=!(bNZG1Kpo?7rujUZ(VsY^n z0h>>HA-9n}s(o6?s^a^i)-qX8P*WYQX!o%>*|oc_d}el}&=Bhphi32}m<8)hq%j=2 z)8;B)%4CSHiBGFuI%n64)YCCg_wu7H!u;35`ulVZNfMngmjE-@tDofbLh4X~R*NWO z1h2_E03N0sRm6p_j5L{!T!3S!EM_hE4ZQoUL?!UR%k1xRB*ulz^pY&O`)OBVjJSSr zRlDP4R4%oX8^UyCeQXLZ#yzmlQxnT)(6OSCZ)X2VEx#~|u)nlib5qMF^n^N)wMo*0 z2ZHa_N&cSIl{0D5G-*7sl51Dpu>BQvzhE)nC}$NMQA6>$!}2xn>zz%evM!NGumS9e z5wWtDs$TWP(i9j`N=1UVttKPT3TG~1VhJN3-R~4N&%mBpU43D=qfHwH#3o5%-P6{= zQv*M0gN-BWN~NU(P63X%E_fNSwVhu3^|m-M6^C$$^%TtX#Q17Q|g* zuW~EW{mWK&MbWpyJbje|D&og_$lLD0dS=)XWdBrIe9qwuKmHE*<IE<^o(+)OP>=$G>TdWx38&G2mCG59^h!5XX>Ck~HTXdwKFUURMP>Vf(7*w&&b=QSMFs4iJoc2l(y21GdUypVdBpgoD6$0BP$pDexsb@*TjM zby*ztM&vFa^=w;fh{A#TH9>qz(g(xt)f2%A+}qjsz<32ZiK4vnWqcW@Zn|^}K1(c$ z+ei;{bZC*9$9{qJs8BVEI2P#g`_WlrpM8CP>9^;q3#z}UY}4d9|L{jMX;|gg8VS@+ z{6GPkR8!9SU)dX-0|GVnnHF!1FJmdH4}O~ubQJLfoV34oZ6p6tIZOSXuRl6XUW39iW?e*^Wt15)++Ixr^d){)j$ zH5TEDqbTOD@wXXrE@ZiJ4~DOiM6ACVaOv>e=%n_inlxE*S|}IevDsF&T=OlhahlYk z45QT;8PQS*8^s>#((?68jvNz#Zmg!R7VW0b@N$D+QtxH6lWD0Hr6*Zu^{0mO->RQ=&Qo{o;I9~DQ6+4>#t8l+hTVre#HO( z7jhFoY1GftMbE~j?gE)#j)Q(cyw&&X2A4?1du4)u^_6?%8Hjc=VTR}aeUWO9=gMu6 zPVDn51bDp8FxJHgpRAvLxLh^r%OJyRe^ks21YJ#g$&xbj8y0`4KbyBexm588Ma);Y z+e1OZFdxQco1CTi}TCVkez`le25(C$I z+)lq+A|;G$SNX}uavSlCV$2eRBRK*yV!l==`$>(`KzA<#w_8{A9FcvNm|g6n&fM{% zNmtK}Uo+}3hsL@NGbu17FzPgG>UqF7(s!rg28XNQxyVL+U4>z(v&;E4yWe!O>j{9G254c8~A zs{Wsp?hG$Jt%%qN)R*hwgE_RC?~yA63HdI8cSe_3;Yf|XpIc*f8U)q5YKNMj79EA( zpwSoPf&MF9^z}VIw0p@|`+5nvFv>`g;fSw30mKA}ekK0XCdT2Xxr9jxb>bBD{`=Pf3>UOLMp>>Ri=TMtAKo=DXUx17OV2;SZUbE(oZEqo7p$aN=ZGZQniZLiu28=f z7+Yoeb!drpfs9JeXT&l*;JoQtr>QLgHKh2IY+6^Q@e$u$dn=T}cZ|A9@4@L$-ZFH) zb0G1MsGL);_g;U~ExSp_wPB-a)@)$B==8X4-I>{tPJ5OHcv+l%dD}t%kjZAn=m)ni zSew3-GCWP}cTJs^YlC@!8`8!(_MiS^iEw&JHPv4#yu)7pkp8SFhr;3osj+-%(OnAf zfb)3PM|s6&jfpB1gMMk{m|j&=g)E_*PYdV-ci%P(K-j$(mGVDQ@@ z&7KM)3o}d!d?Pl0V`^y%6Z;G;Jm`T!WpKnbN>1AfrOLgh|4ZXL0;~kzuV4?NNM6^c zI_~z4?4rnagf%qsCd0#IY~mdw06XWAM$DcH9GXXA;BWaT2^cju;cI)=QzbZ2TbB4)7Z@|s$%}Tkbi6E#i;mK*$n#nYd0WI- z7PT$T{xYJ&x!*m87Mt6n>{gOdzgoZDeRTU?zD(RKOv$Ks6g#bZP-F8CalcVsR6%yw zsCp{ht8IBYUoge?mhqIyfFx?8jq0cAazzf%V2Gxg$aTvzcPZ~PX)>?|7;g9|uGnLa zrE600O58u#Pf1eUa-D6;`=DZA3#T5s_m_!Vsx=w1j#Q^*14bPFBTrx8MdcGty}E_c znqK&*5)`~QH){{C+NO_E_x-x*to{-nzxLpWBS=MHy29(hTZZ?WN6t7)1&*R?T$olW z(bpAq_CD=%ZMUk-Qi=S#R_t)P7V@qb`*ouqw?uz@EJ=N`_RxGsS5KsVSxzj4xTkwZ zF@3!v@Uft39u`i=j4l4UI)w62#AdR#afTnWRkom_W`4b$sq`#@M}#Q`TgYSWsxj~S zvW z#LDfGwXi@Vs(vWSKga7*hsidtmNI#nNa%d4uKJNU{Sacm6UPNHc+&c27@RC|3-1cI zr8rKpVjzg05idY<*xjo$c*9h_+N`jD=}mm8Y2I_hG1sE0UG3Un#z=g#+88@Ct5yML zIax#)d_+s(*q9CP!eimqU%EWpDB#Rwn}M2ri8)X`;R$x(?Xb{c(Stim!DS53opfon z(4BK*{<-*)OF5dz(*n^%P0^rTPqH+#+0!kxn#Q-?txM8eXCq7S^=iw!V&xGpn7B?j z#NZ2JTp#Nh0JDJHbeb!{$|?CFWqY}u1@Y(2Ne_cDp3Zm2t_0FORpLP4_Echn4Q`)W z_38Y)gND%FXsfBiRn*i+hBq1|u~b%`2S>dF9>h=l4y#_TKbjhqcBcrsrbIf$dqfv; z3mM2l1?GZL_@fh|(<|=SA|MvK=PD!rR z2!E^Gh`=Uk^*f-b^Zuid)s6kQtHJG(ufYdiAc%csdk1v*J>B@3D_(;tr?0_uj3gcY z!?35h4KIK3=VfpwD+tZgr^|55(kM9yR@C<+mbzQWv`W-B2+e<=X+(wUtWqP1B!BiP z1Dmu%#n2FlR~Ay$n8X6Ppgm&}x5?>)r?n#fQj`dOp7TddS^7zYp=L4mFCEc;-j|f-FnP;BS^f6UkOkbUS*tR05 z8ntDyN&Ml|=Yh9ulVRyD(`J0`g(3yk%T}5;M-udHTjKfH4Eeh!+;1ueubyd>86bFt zqmSSnoHpyyFvUL%Zlq-vb$?XBesu4X;JrMRzpPN6-=sHSl>LCu537WutTM3{!_uSK zIYir9v)OD>79wRUr5B>G&mwn{r&kZy`z7Ny<%g{@PnZh2M67FoDx`aO7=Vd;SWlWj z7=6#uTrNyrToSV5=-W|@+y)g?G!dRR8YOD|?GWS34f}ZGquEW~hFcm#b+J`4wMT)j zkel@@A;lP9ti4Y(z+4_O=tCli^fFZddms2hTk`N%o!d5HC%nhh)FRuGCJ=&bBdY)z z=!sXIsaah}XhB$A)fRj$OU|&`!Ts~(L!15QnA!5 zhiBQt0ON^U@rp?yG%YC_e=cler3brWbnTY>6tEUAMafOKKmTY{C|RJ7C7p&X2`2`G z30%M2+^?RMNcoux@IY{50-4kT`rs3CQDQ-U)Anb2lv764>Y2oJ+V6#=zk))E0`|TS zO6ezRyNTvGANDGcrexJY5GzQ-VamzVmhaJtq!qvnNMPp+VF5{gB5)S{L=^dBg{uZx zR}7ev2TU~) zA-kvar1h2;t@WKvX{o3tDF6~h##YKu<0dW~X7rtO`FQEMXov3kDxZ~<9n!*M$7-lvs8hXo&05u&<5U?mArD`2 zuFUY=2Ulx$?ln*mtZH$A6TZCaLGr`w6h*T68dbJ@Ph^7&4o33 zb-e7)7KQ<~`rsuX!p)C?jB6*JCN~$msZVWU?!hLn*Ntr5Dtfanh^6khaZh24>z<(b z3`WMHBMjeMDfg>Nh7Ik(^E==#+TjzOlh&D?=Chg%g|8P5d$d$L+NzDRKWmypl${Zm zlQRpw^8@ZSnhhL_#0_SI zRMAH=`3XY}S;fB>{crD=zVcMNk8Uq}a_)q&S)tQZPDXUGN`bpK4sERk9eRl6WUCf8}57&A>0%{q!$jqLJz}H`ZEwBod7K@>U<1n zTWU#yWfi;5`*tf5r_M+7T&hLsF4B<1bQ}m3$e*8f5ZF-+A`MP6b*{K;K2>ESk0|$Y zigyTjrO9iyh1cBo+w2U*4K0Hbk8}b@v_>rVs59yo6Z%j43Y%Yli_UB)*(=HO`#qk7 zCpS7xaL_c>Tt=8+gD>8QyyoSi8z6SehAcvr0t%fcYE6f}S%Cu{c)VKrsSvV!dxMzQM$-X8MRKHHTA4VrThDEr|HN82F4pJ|``abtUeI zu^#CCdWD}sX@FM@hT@XS{GWqiJ>1$$`4*QeP>uzaE2!7V`TT9lTm>g;r1c}?=nwm1 z7pH$3TH^{@h?zsb#OGJ@g($gV7&(nsbx4bG{s+TQw0__JPcdLb{5D>;Lv)e&!E@d$ z|65>jVobDn>mAL<{Y3C}Wz?=!->{RZYy6Q7Ei&>$!KRRe<2bNZ%7Op@Ndh+csUDW} zU>6spU<%ymov34xckLnfc@g^R)g(Ep4^4i8s+6724fR5G84~(%ReD$M25rb#J-kpG zk@WH3>Ppn^hPFmo-T^01ZIPu*Rgx>$As>C_sR$UyMy-c-u78<7-=DE zM&K1ZlGvaV-W}&a-iF8Lh}+VQ+3aUYa+}Up5bB2hlR_(-LJenyF1V#L-mZ@LnhOxy z8Uv_6pX#|v{mky9wLhXA2xUvamA5Tkv@WSe@LhenN!LA?7<=Y8lU73CZ#&v7jROK9Y$1hb)IqyhffDt!#os*;=8=+8aSu zR!;Lewg~Ni43)QcYMaA5~=p}np2k|sk zA6MXC($Fl0P;%vcyDf*)URes%-pSo!a@z_^o4||<><~H`_Et)lPNlH4DNwy8k8sCl z2aK{Tab7e2w)y=g4xD-Uw3g zh)#)gR~&SU^t6uLQ#2})V!Y=BmaySA^KKL5c4Bj^Hb7*3?2S{}!)}E#ExRkJC;LBZ zf{{pNO1?hopSUuxzNl;PYx}6s)x^-k12N5PUdGf^x@}liJ4(%Xz6BcKPt}qLGck*6 z2$EUr;}N5HIuqZJba+;x)#F|FmJ!fMoaj~>ga8Ch%{n8-mISzs!hYEPiQv6Dv3JNo z$uC1az>XDT9Nv%0Hm_LB)QrfmRhYJh=AaPva`A9L_{mU|nyRupuxW^d$pq`WPje)U zAMYc*3={)}>W;C`zl@YBCl;2L>4BZI3iXPzI6pWV?5C>l)^)>GwJVPurW5NlJNj>I z(^81s)qCO5l9xp%f2A%lV~SnrPutd+0@qnK93Cds;1v@+3Q($WT1gF?qyKTo{Wj9g z&JRYo`*Yrkj(LlOz~Y4jS-hs$JAij4UIG)IEHW{3tq8wC)3;9Rnep$FY<972_ey(| z4BhbSj$)I%7ka!8?G|eXV_`@_ez2sXjwjlzZhu&K+dy6&7mZq5ZsI_Bk_)N@Lzd?jvuFF%l085L?#s)`hsMHKz`W;Y*u=8eE zm!Gbddp2XMcXw0u_!gS%yqZR9!EKst$wf zkZV~{XvwXc#GmoNB=bQa&-L7>8L}v6MR^kP(cVLT;of&)EdVm4@?3rEm~$WwJcx&wmNWkll1I zeN*%FeB$rNuU&zU=%m2QyUG@9nxyS5{z}a;E5Nb!eh0qvEfrf2gP-6eSKf> zvA*SGEN_K=@%Iq1p_rJa(eD3>n=JKwp5wC3R}8$X&%)kiaY0(sf5-Cn!bjCU%O*A( zQ>0gE9DOE1^y3&I&Q7)G%qt>vo@Yf+Z*eghM%Vn!{q^HMk!-t!{{K*!PeoP5hv@=! zjKmG=_upbLvJ0i+Mf#An(6v^CU2GGUrSK;PI7s`tlEO+zBG>gTicPr#LcWB2z^M4; z@!~P#hA$FFoqs;I-DI zd??fF0=>M@YG6Y)Qm8MpIIy~YS-wk)+XwO@fQ_{)T9#lra^y_snQ`vl)fgOnp@>t^ z%7mZ7+GAzU@*Z|%;o8C9#@JTNr%-OmOU^dDyBaFb>Fc+@>g z9(;~sLHDO=&xkv29jv3JOKd;0zhou$eQdE7_jupg1{FAOd8q5zsv9tc02bf*fM@-; zIuv5?EiILz<(s5FU z+kQ@>LLP{1UDAi~Edp`4)3f+qF$L46@fWzA>E9cr2;={Iu*$3#t47~hW~s{P7V?g?nihP zdHv|?VT3Jo*1gQW17b%`7RNl@4i)&Vyz*6#CWP34JkN4sSNyYgKet}5Y;_9oFXIlCG;I+M9Mn8Bfq`wb#qI(k zZzEH@=d~WujOW=-ww&Xfgh}#&fi>uE9KU)nATBvVbK07xO={ETj>l9Pv1X9lVI9@t zrVq7g3JloDZn#Y(nikXTHdh_b_5>&;JDDFpB$;OV{9F4~?XGR#NE*3bGqQyzeen)( zJ5s9{*;Hv85TZ(O+Ik1^ih(f#%47l>d|KgL^R#>FX$2l_$do7Db z5Lt35ndI0+zRe)cxbEwP!=EZ$Y;MNYj#lr*e(qV4Gv#StX7`)~vdP1%zNprqZ)(KZ zM%jH?q)=Zo5|uoQmy6RISDz@Pnb9rxiywryd}FIt{+cj((LQPotJtM+5l!N|9QFxT zBK*|oa$=ZoRBoG`M3_vdmg?_BWdwh+^x^IsT1~^AUD8UnCRk+x+6o@)s(33FQuSIc z-ZUZQC6j_qk7U=RZh2O*_Pka}#`dlt>>R+7=O{K^5;%QU)yuhC^MS>R@{uiaj;Ev~ zh5v_)@gH@t)A~iqVfKIY*Yj>4eooS??$@nXknkH`wye&oBDxEJ{le$z~mng z5tJ16LjGj-%JFXu;%7E{g{Fsa28=b_1gB9kJ zNfwShL-pp9vEV4V2U+LXCy#eP=f@GSqqnh&9mfxa*W@*K2$#H=@Tfh(=08U#A%;I( z*{Q&9di>wv)$h*5jx^|5G&Z$9-!l2BJ-4ZDeK(ByIto9^FWPY~pN3^OZdSC;N-T|X zfXGr=h#TRKV~i@l>k*BG-}`{m#+?`n4COC4l~6xiuP%>LdrslM_c50!h0$^ zG*?a!iVRHF&yH=^a|nQux8=GIaG8BSYIS1l@amcJ)6ZtfZ(8no?*nN*-7+%$_xuNJ zy*<)3cy0Uuo-zXGX?#&Z$1`oCOpdG?1ObACY$l(dzyfEWT{R=Z!fF&K&SJwD0riKF zTnooG=_@%BG`R1OtheJ=rOm3Wb+)lP?*5Fl^8T-IoopC24wJRu|I5q&FWqie$_; zrEVt`1n&o^IAE^Aoystg;L!WS^9TOABVQ5DTp$iQuuN#CD|7O)f~KWwWG1tjNXCEV zv*7*_*p?ZZOWi7h-&eNXPBR$sZ4?~TxJtDBq(&~?m-c`;_RAe1{-KU5-H$-BrTjkH z^iBI$X&^F_0MVg#BvVP@$mHDBLDSO7EoR+arLYwmqO?;4AkM~V$=_VbtQP=YOanwM zdCAj$V)vbOMW0Zq!wVxgFvlt`nMwTLfElx*O~Ht-j`e$0uw#ykff+3%+_-!JF3?c# zK>}QTzaJ;C9w_o=B@&dBrF3c3%bm!bbq-n`Xs|<|ix;$)g6zjR?zKSHEs$k7@G!Xa zZG=~To9&bj3%Op8{mWLLz+{s@;Y;{%b*?gJ1Af(Ldo*hbemtGu;e`b1RhV#U=-^J5 zPG-Gfqy7*goQ=!fStoEQx;o(%uwB+Yc$~^w7IlpsL4QD4N@>Y>#*tf(4|D20@jm6y zYGl7cXK86c?H>UVl~k0DFNw6`s1%Y8BbUI;HGp^&cY))`;2pyQb=B9dx!|lk0CpgBv@gb>``7BJtZ~V)$HLIT&p3HJUm=q}#Kafwvc=5Ov`EI@n zlR*`Yt3q-ehciEe{BsMJk1Rf#gBXVsm&ln5$_H1K5RP=|qa-lY78X=Gai>ZGv%ss6 zH{z@HFfXt^G-vlo#hG3;=*ZYTy@wH8ZLtK?W8=Uyyh6P~qG#v1{3&G5t)vd)$ih6q zUF{G1l{VX4u7`uOUIzO7k=J|~c0TY!=DkTkZbZVPjmDhW*C-z;>S(=f2eTKwg<8D& zb~mefEBy z-=YAUA5%Vd)xR5lxe`x9tO9DBBfNxN z`sQd86_E3BJbP6dV5tci3VK|r3Bw}&2V$cA|AZups>Y`8|E8-cRm-#(Q#W^?>Y2@? zWSTn}WmXUf)J{}r-c|bt;AtrPDD;>(Mg_Mu1so^rX#hP48k)RnW-lM-KBUNJ6wLXf zZI2jZAD-FxSe34p51V5n0UgB$0b(WeM*}ULZ8C~&E7QB}txiUMkMPnlMMUAV;`vxN z`W+vUy`SM{jX*H)rV^-^*=VUYQXcSA4D{;BA4l5nB-+6brge>pTYJ*6 z!~=WqfTZR)d}3oP<-HKo$)qpg(zrZVWu|_~7?6H<;A)pmyeOc@w0DNara!c3jNvam z$ukmGFBg;bitGRrHOP^6jCp=3uO%$tN_8)K*Q8bXC8BgMB>y$b-ysKlh4v2swY4Bk zE&^|^2;d~l-jx2j7L65pm#)R1EoYAQ!F5#mK;&@Tzr;1uq^0mA3h(%~E!ZN3Ypxcx znzI2-BPr2BbG}AuJBCpZzR#0KyF`>UY{44uv1R@nXa3z?i8h#h+CN% ztYaQmU!)*;yWkuD7I5<_91)cJ4g?R;&Q?6&uhmM2 zkM{zFO#0rId1dLfN5chQophpS$ikr!4|kIljnx^~bVcDmK%_mA+mG%S<^@PcpYK#! za~#(F?zZ%_qf9zD^3zT?|10A1uM`R&HwAMySGSS%B{IHn2eCSqzO*lTFmR`upPyPa zo0mnc!12US>6*N)93nftN70C)n!0Ilj~tmdvKo$-h_dij7NZ}rp0bPvlOMnC>EiaY z@utuk{g?N8Ur#y1JZQcuof)``To`JYua~St)+U-gved}wmgt)0$aQZ4!B+hAEw|N{ zS$wKX6e)UTiEW%_7cr2;d{j0GGXnEZK?4omx~z_7HSvz~Rtg4C-LNw6j2XoaKb!ol zEODA#;vK8`rZ6-`H(C>yHkY+v>F2jckrZouFXGaqv3kGh~;J*rf*FIKRVx6uKB zW3{b;tXp=m&5zSN>Ca2FO+q!b)<5u8HVF7RlVl*AD{EE9a$7&ZSrBZ|&J-+eZm5Bb z8b`cOq2?&ZX4`g5_igNAMJhE~rWdf~d~5&(=lE-be7kYwPSTV*_n zW}StR1njsKu4}dysvRn8j|4Z&(k+p_#aR_jwFX^?YOBEf37BdeK z93p_OcTl}-SAC|{!&nClDi!gwe!S9B#-o5xGM}oe-1CX(9DI^bzozSl2p#eqYBO`z z6K2V9J>g*qaM|MIF#+#k7A{7zo(6dz1DK+eNd)M#n-N#HOLH;BP6A|G42KhA(b)wE z5QO;zQ$wkFcD_*4ATV9F++FA5ly~CU)!MycfA#rMAK&t==13e6H@SVDi+v;rXu>@d z|L{N32C}*R$WiV03DOn}va)DyVzAT2aHieDZgc{O+t3MWcP{2VkK8AZJZpdHUn@s_ zK5%9Rtd6-K?niWn!t37=U8#~exA>7Zn{i&sB0z*y+R+7YpjYb`#vn2<-THL;u=d38oH1pzrWXJr5^r$ z*F#9?#pqmbMPH0_=3&+ZW$gr+|d+xj%9xv-u*X_kHW5 zA6ECu=e4Ycf$Yk+v&xtkklH5O>(s$LD~@gAz3j0s#(ZbUOqOgBmEKm}ZU^g_Url{% zyuRsLTp9~`1>wwUPi*^Sf!LsVVI_$w0ZQ+nt^V(H6eHX8=cE=g|ANPi{Dk>?2}onU z3^AtyFgO51J1xqq96Z+>gnE<3U?y{`x2#9wv!*lebRF?Hjconr-XOc@tL`8D)xx+o z-`yc#cKZVN)@=F;8Z!}$?0ut}IP#ao0Qje0C{>V&qP_Q=f}c_3kfvLi>LE|*zXd-m z)gMtC1i4QTUX9vUkRpLeUOkQ|q$5uqjE>CWtF}n@%vKSkhgDmq^ldKmq%V`Y7N(;! zbjn>!c@FS&LCh0hKU2eKUI}L2NedKYEbpG~Yejj7Xln_Vp5-VPHyHNODA%X1h5kYQ z5s?l};Fj-0M&gWJ<9LptV*Vo8Q?az%OMD9La)Z-0N_`h;_ai(}-Ayb-o_s7^@v|hBU!$QYKs~Q>j;IN1)!CgfSx~-&|lVH6848 z&W=5j*joh>zJ9jbQTkjzTxM?MvY0avOk+J7RYX=bHyi>L+vmn~DBN4tjUISuCO&&r zWUq0wl9Rnuo%$ly#}1;}zvTY&^^L`Y*+-q)n;pFQ_(%`lczYx^Oi(<>A$;ds_<~vf z-6ED&$hCqoGCv*)&KN9@%_YvWjSuI4ND?i6_~1Efh`|hT(F5{A(epu3<_T+=dZVB_ zoXcOg_^UT%`-1`B9*jfj5$bb3K>P!ZG+VWm7q<)=*@JmapF^TZ z^Imk`WvyG8t`$O+7%{P`J6SF6QKNw=Tv^^FrRvV6>q+S0hkeP6C1;H+$_c zqkZZA{6C!9vIRDD99GKc!s#2t31Nkc&|X0jcTo1DH2*&UNVPu4lE&(YOOc*F z&j8M3p~Qi*Qf&PLytBSL?^#XL(gq&!SAvOB^Bf}z?~T<%`)MrnU9Dgl8z4~yO^F0+mYO|yKeXXP3gLSYu_-Ve!kActGHP zXJoW8xtouG^AEu6;Ek2Sb%84sfFUl$}NO3&(g(^xh7&Fs?VC$~bfO$DBh z%Wy%$O#;<~wrW3ljc~}K4vLYYipzx^pY~eZf;oNB4+_0-|0aYOx=6)IBqZtOlZt+g z;jfMmQc$e~xV~~+WKxi|gfCG&NuBVquf-HRTfg(<$HDg(pL42`o!L#D-ateTMY$?A zGk}bUeK^jr50?l4Ufo$dbU#1j4;qY7Tec;-TS6btAVi-uKLEA4$*brr zc|AL!9W`^@xhA_XxSS#dsh71k zhZ87R*YAXFtEoOuQ3O%kWTh8aL+fXGgj!Nevt`Dl2M=4TG|S|<0d)<16#1? z)$6k%#f!5_8MfPde(&3r8kf1LSj<4ph{HKgy8RM9HxR>p&!m@Tf5Lv(wAUR&#g;RXbvx`Y#lTGVx|yzc0z{ zq+q%=b^We97`{Z48Qi3v!ZU@8&?s={?vm7n7!_*X;YYY!*!cQVXNF^qZ_=SqX4!5< zoJ7C`0}@o{Zu zgieEaC60K6OOgNN2q+7S)!Zj!`9C5;#L2`W+db_Y(74yoCr*7DCdQ>J%{h~^pHfvKX;|+5txm*7cCxFHlXhOkPsB< zH?%kmyp`FK7OHtl7hB_|j{VeoKr~0}Yne3nv#xx~V70afXH5&b_tuEe?=Zti{E*cVHNc?;#H;Z=5^UJ?EheN|x2&o5Bo0^EAHw{KBRtlG`t;1TA4O)pv})bm?Y9@779>K7 z#VNU;8BIn?O!oIEhdatTaF`;)wtc<@(zJ|#L$qwf zqeAv6r`{edaNO^v??7;&*!04ru*S$S+tHq&`1>OlkpMwyU$w50Kh+&m2wQoFDOvyH z80+G({)%7M4X61{HxlK1c*d$tag9lo6{qLmezi`Qgx>aayk8Be{kVveV ziO>7hl>zV4II2_BJNrnNsQ>gN&4=lbVjuW>#N6}xOf7~y>QVa?YwM?$n1ep)+#ljZ z*1|w0kX|izWAAOu*FCDV42iG)0S7y)-(IQkWHDd7whL>wgcRH`tT6Rb{)DgS#P#XZ zwRNyf48{p-@D6K<+E>b=16+Z!M+v1?;4n=Rnn!fN8pVecYAhGQf*XeDE^DY;!eE7= zb+Nf^$xwpr@;jZS%2hr_H-wKmW$_xBH)IfJfeCd@^eA5sg2U$H$^J^r|JvY>j$Pt4 z7u#}(H0L6Ubko```VR;qJ>w1e}I0CAP3cx;n&gfHFRNJyG&ArntS?x0K(7X z)}0V#mhv_H;wbm4yZJ4#3f+HzNjE(ZZ*ON|du#0#+sd)8{WI;3_@lsL5M95AB>87Q z+5J?a3ckpYlJ%8U+p1JmIT{YkR>Fa^Ktb(3&BW9iZP6&EmF$l5?$op1wOR=31L2!pr@4f83}-a<`J zXSr&F=f3(6kR>X6`z{%>5<^Yx!}>6@^SvbycY6g8s_*G3PQ_;3pjn8P)9fitlb97`mW?Gnie-M2hU1*C=Pa6LRj z|MO>;my65R7t%*~sut!oyIU&Z&Tsv_SCIfLLz~ji2R-aADd{u* zvga>_f|?yiCa|2$@P1|^*G!!J&9;n!)Holv#O}_{f|`~LW}9iz z+6KG64*AQU?Gnn_K=&dw_O&!(0ei_Rn}t@zsVEJJrbM^Q*o`b#VX)KM;>x1Fn}E|6 zy`9X+S>_yw;H)Hz)&WBZQHI7y<*usLgJ5n7lE2-8!D?+Obtoy}cKSv8o39xK0)1|- zjAwO)&7%|sTd@~by}k1Pa&D}jNB2N=&v+_nYDhwU6#&#GqNY}eE-56vt_=~>YIGI?4n%) z`_DUdH!vSM(VS{bKd;Y&9zY68YfqjK$pVs91Q*RUd@?ESPcX=&t|t#2lKk#J-;X8Wd~W zlG~eVz0f*k(U7jHOQ&Txc##=SF^g$YFJ%xcf#gw2((r~*be4)fR+wY3I!z>B2Rw1F z_GZT>VGN+HfA5w2jYL0hA?l)jbO#t^f@=;D0E4X^_xGu71h7E3o*y)0~i ztIA}LAH0;oB+~s$3H1h7(_g=IxHy{{iz{+tf;u~9t9Vw5+vf|dovO?<8)s=EsnNK~ zV#>r3ZDX@puPt+v|w##8~BrV;{sDn!**|D+9T`#5MUQ}Vt;n8m8s^Vb_i zYCl7>+fAzuSqSIq2-~iQ>C`wojtEyjZpkh)H*ZQ+?1qJ-_z(5L?)+_L+xKsV2mEsA zblVF*?e_f4Iu~SsStIT#zxQ{!;MrYGZ53ue#6zY^g~)N<_BuXDJfdrp$L4IJ^oijc z9M89EL#RNFT}YDdrg%epU?wumH>gP1T$vhdAomzrlER-N4?s=YWB|1ErmU9h4Pyw# zpNRYSaB9F?;%eLd41Ub%y*K7@A|-ooEFwfo0cWgkp^!(*BBf7K!_J9os9>mVz6>rx zDFSFZ30wnPr@O%F48vXR^yo(TCZ2G4XXbKZHwtm|l$WOqPw~1vWt+bK)h(>RXt3`n zW5Z)*TI@0Ev(PsYm6}b4uX|WiId;p@5;sKh=vA%?qd&9v->5heyo-X-wss^wdZ%&X zyVc{E@Kc8Am!yWtBpG6Rl03J#eELyH(Sapu4jrCQybrj5>o&!&~~HE+5d4KVyftmo&NMF4Zj1 z3d*kz?I!xHcD!}J;%*>~Gh4AcbTYA=C6=n3THKT^M&3K2tMGw-@8mxGV6Kdu=7aOn3qPOdhJ-8Lavb*(t zDQTXejXi=}?nY$cwkFAgfEX#mdTR$#K0M*?o%(MjXYUA=4ZlToEosfqUkOTgM6$X1 zfYnM%icQ)UpRe9D(Wr~RzaC@SS1~h{+%0{`shu5`7fOML7aRHr3}#LxSru1LvY=QF z)l=2t8Vd(yiR>{7X`yYS;^&*P7^!PIjZ6BEY@^PJlvO{j$Cf;-3?UP}F7?Da;AIitWNTt*|vi$4e=Gs zl656ZfDkPDmj-bbOy6a{z-%~vC-6+LU9)&^)+;p)`>@cbZOc>hbM!F!PN^vtW`!=oYD>n)Mls2sUO8 zbPq;e4BS)`%yyQ5Dv8LVD8p+VJ_MeTMJxKfwgVWlgDOA-ubmq+SKn-9^=!L*g#?;L z5NDc@qkih?NnX-;TM{G5#HhCrNHV)vI0w3@W_0DHN3g+E>zn=d0%HKDWcYUePK_2~ zej@JU=vxEdeYYIX6k`_$hEM*!Q^TNc%3kvp7^ExPwEO8R3dft+a;)k>1sNU+JU)Bo zT)p~fT$RK7T_S0{6trpmmogVQjHh|#>A2fYRN(CNeMnSWe_B^d{AICOgNPRKteK~t_+E3iB{M5h<{D*f<_x2 zYaY(w0$OsbUS%}sHYKh?v7+Z~N$RQSwRqoVGPwH5xX9-rmFI6MQ>3wepp_#cYK;dO zX=9q;2IVtD<9SyY%){D4w~B&DVz*sFVzt|Mf4%*=ODL7CHGk7?qjV)^7#yB|RB8lG z(w?MXfWH%k4W>jIT^G0P3!pZ2<@=wq&qO-%ndnHq#XWIvte0=oZ?iytLm!>C{t)y3 zMZdBgS1Xwo5#-J<{nfiA7GhuD@djo{gFs#wvdT;R_mQIDP==zg<)rtWyl@&QHf7A0 z{)e`Sq*;QjUDOwxT7L;)_IpQCEZcGK>fDeFWJ|z%AFejUMucinK1Fi;Ij-WG1s3-# z+l4QNppk~paWsycxew+!Ke9y~+I^=XZCLpe{nfRr_xL{3YG#SnJJ_V9hy8Y9)WFW- zv}b|38QS`V{@EjoCpOd7`;T>tUi*ZQBJ&k)l|37&nVFlXXjTg+mfT2Q28h#0CYWUB z;$9oSPhN=Po3o3Zs<66;Sd=4VI=GJMRMQ~LL2I5Uf2mPv zO#2l!>dIjEp`o+Gk@NV7Wc7vrZ6jZ5QyQ|2l@d$Db-P&1cz=GPjeIv4AS=XEink5zQ*PhB>kWMTyD3%7YaBa7+H^UCiCHGvN{ z5dFo@HzK(23ltct=&77iH84m0GN9>vo}LW4dUTylo649+D#^_=tP4O&7VlS0C2OGK zjWB2{qUWarQ%`_ZFG(Muy>aa7O=u~l#29Y*nQr=Aex% zl6&AG=r*kVH!~R#V#p138keMd&+DIVv}``ibTVvllup|MQ7f>3%z%1>E|TM_3d#mg zDKbiQL(oYjM+WdUfqsax1{Q>VaRmvQJ>c!6&%YFMCN{2^uUm5TVX0%#HIGlKqaC^# zu)C6DR5H41vs$rH)U{W9AI`&SC8hA^HzL&rfmHlo&z*}gKZ4(mqSxj=9&Swj<5@B{CQ4AJ^oOq5uRQn6d`BhlWEknmUGVk9jscRHarl*s(yD|d_U9OlB z2Z3>4@qJpa^=JUri8?m%+G#yWe zDYLSM+rsWQW9B+R9NdkU0-a99Y<>M(a@*zSE&%!*Y~g8%#wM%^alJMIPR?L{rT-xD*~VE$krkUT~G&(vt-?=i>03 zTZKO>Tp)kEW%i+X=h_*t4PiV|7P){@$^%v}tp2?Cj(_4i^{kb}mQVx1D{!m}{#=!Z zGeSqW0_dFj0%R)4)jft5?i0j%k#4(dadqduTzGNw!J?3zZL+;!0!HLuQQHid&DCCw zOPeQ?fSMjQ>@nFqVS8lYXMu2zsv^5}x>KOXHMCkD&_Z)^)M>@M=vh3>oXmzU*N{4; zpHv?@`4p9{5w+LCoBoTps4PE)h7JQ~AUP|3S_Gt4Yp0AhL0He;_-6OlE(q8ZG+e8n z?87sj!ysjkYP>Z|$)UEoHGImllCEUr#ojoZ_ zgTyW+_Tk=wam6sZTWG>e|G)XouKB&(7Y{%EL5r$h^^CeB*wRTcnrszaC*crpT2{Z z=n{i?^bEp@*9s6!T)5FeO}gq8(9%znQ0~ zAC$AtfH?||Ob-@`cf^2uxtE)!@#H81Y{v@|zXXQes#Xk@+sejKiFb7({g|Lt+0IND zUta=j6>X7MU}Hg3IEXYEQ^R zbYg`U7(z$^#eD19^Rt+bfv;LJpD=R)2of^g^m0PPGPA)ZoZ zyOeX(kIpX7i{uN-ZJMh3gijTNw%+a=k1f(tmL*j@Ea=b}P^n8UAx?(VhoNsbrX}Rp zq(h^JYx9_?LQnzN z={I~LK@64=AajX#2^L}QLd!7ah?IN>Q-&$S1p?{&Q3gc(W(bG<{XX&O3^Ej}d^`m3W zhcjN7Ywagb$&J+@!JU4SUCDK&gA>R$t+$+1h=o2aAm`{0Hw(Ui{MB(_%NW)TZ{MlTRau1 z%C%5!A*+ac|IuydYvIuQ48V0(GQ!)fp!~7d?I0$=^CZAGZXg#+Uqr+|IW;K#XEG%4 z+oYPdkisYA`)IW~{cpcBn7y7L5-OnIXR4?8yfJ9pZg;IjO{T79sl!_42b!E>@_}<` zlNkqAhWhJz3SBAm0{qrEIGeO&BLp^;FO`v?<+rG+C2Buh|Uyj zsv9Y9ZI+_>#Wtz)7Z=?8%XvozZs0^y#pd%YwJ(f)*``Rj0ga$iBe@q2{1|em^(LfU zt-jUrWR7AX8zOC`|Hfmej$>#0YV1S0t9qZ!U<2B+RO$lf!Len|7c!MTK@RW9-?MjzIi`k4!OVZ?C}KI$DO_#g9ztxe)WBhpjcD( zg+c5a_~})f^1SaQzsz1IiR2e*gYL5RlI}|;Hlu#Ey~%NlpBH9!`PCldLeYnH36B(w z(#k?Ik&Gl)hY5v_n)=MK%AG+ynRXn4)(xBKjurmWR=ZMcX=6(}vie{vU_6dvSD0Wd zXK1s8Jg1h}XS*LsJ!1Ag`*E8FczrGeO&1lNf02PVZ-Rx4gYiN1-5VJ79N!mCnyIi0 zIgnoABds(La;mJC9XpDLz!ggpe%3E$>4-Qb*P_=54{H}rJ^1%PXhwGYV9$~{r(O-E zFP(sKm0%zN!maX2hmVWTxs?o`bYx^vBnH`Y$T$PyJi{9X7}%NJcdnV+;zNy9a^U1~ z7NxS21l&0eEvWjU+~aB5kZ|Q$TW4Sdb-+;%$@wx}Wb53KcRxSXrWwoW%V zu-;w)OH=##qwNy&gU@kQ9Dl}KD#gd9KNYlxC7y1FDHBU|lfBDvl@Xsnp z);Vy7FfGB)nz4W)Lv!Lq{cJ&xF*`7ObE-nPRy>3Vih>AGlkaw53n(IQ^CZ0S5;hxk zaoDERLsn=bf6M)C*K`Qz#m%4RhM%q^xL2Hj^TR4VcGfk5eUp(MGQBIgM>$lG@^(VH zI$gvW-r5rQ^bUS5R(=JDReIl_Z9T`)lRirb!&RXlC0;j+LS7ku2lWdc-6|XWFOkvz zl#jsg;Y?tW6iFwN+T2zS6U67i(H{FHJW-0A?^x`#QrS{R3iVb&?3&u^-H=4GuiE4Y z+fhr)^O9k!aSAi9M5mLcXdn3?h_Y_0w*<3}v7MSV3*MBQ7FktnJRkQIvI&F#l-9V& zk-v`Frl00pR93C1XIb1IJTb8Ly zkb1R3e%tG#f~|o0*CiAD{L0w$7jyiGh`vA6=wIoD{vhp|bM5!d7<~i1()(v+yJY z+I0qQe$`xxD0wBJP-2UU-ith}W?MY2dL*MWPkb{_XO9DM8Ol8)`~46}bxl&Z78Toy z+v~V)vb`R`ib8DbaJYh*r%yJIc_4fJ5Aas%qScuMVXx+=;Kz4!aNZObY9yGpCTgtC zNWEKB_|WmjP5fTD|?V4Katm04OnNjdKzwF}js(J6nO+-=}o-*z5SV^AUcf!RmNIYPJ- z{WlF5)|6K?I>E7ZB*3O)Jwbb66za8^gKK2NxBJ1*6Vcy_kvbl|HRm%b@K_^jeA$Cg zwiHO6Zgo`jf2{BSvDy)Oycb4am$peR-&^{6I2{`y+XdN?o`PrLR$8pbAM+Qi?ers& zk{s~50Fj8I3%y&}Jd4apkr6#3Tu-4soYAZ}lL)7-4l~J*p7@JZV!TYQI_Rey28+9# zX5XBdy2!WItzI5a-YP4`v>pre1T)&+9=cd+>GXZCAWtr(33eM0y3o}sP^$N_Wv;$t z!%w#GZsQn$(bmW<%9m_93)dPr{vk0i_t>B5ux`UhxzgG37?G=>Z|aQP#kVp|@A+!3 z8ng3>*hJ7-OmMG{9*ya@V2M1>yW&p?`J=kO6<)pP8?jY~>jh*KUNH><%J;r*NJ3y^h zg?)SUiM2~ zLu_A0=c78RP!jP&e@;%C-* zwP`fA8~*k~0`5Ts0HwH{%+ho&q?+Jf?@p;xBb6t$*9r4I9Gt9>RZm(RpgOp*8pCrd zwVNyEL%gH5x3{RMQxM?WbdH){=N$Z?3sJl-5I(pTgNuCwNG%c7urW4ms!7>AvGGZE` z_R?hQ(lH{Fo>x-TaL7+{`XiLr9jM4q-o>9XxV`$BHLUXr&^5GNcZF9gzWzk|_O)Ne z_Al(e87N_MeOir|%FdhAa1ts-Pb1A1{+aegKwq>e(B@H|{Fmw-+^t@H!k>$!V2o%z zMSnJJmnLE)hdQwv1*k6d{_tnOVum(#cvIBeVW%qKYVa{s9Q(YpiS;E5mQ^DA58&7! zgDi`!JL}ToG8b{L^0pFD5&xw9LwK{M{)^&D%D9L&Srp*#zknGE)VsmE8cPL#iAV7@ z=bG;%xMyRPcdB1Uq_O#`elK@j{fY3qtN-`g-~1MY6Tn#>5kXS#8hmOh;+_)XDrDa& zZ2{&H1`C!%>e?nG_CansJ_4UEh_DDz7Sot*o@o+Q?g5s^Cex)t%E<&DWyF3Q=Ng%R zb){U?i&F7$ zG8ItnJy13Z+H*St{Pu|$E?W1__NkI_A}%TPf=}5Kwh)PV2tQiNSnD+AB16>cF(@YY z^TWhe;v^m!5t@hX#qS+RREnaUj-!@U&N0!3WxK_I zKs9fLj|I3E`yfx3C@}YbSaW}@a&4~I3sAz2Rf`A45{R=Ma(OXsaGa?CThfshc*Kl@I zL(8Y)IO91s?t2=dqYGj%=Wys`@mVLf0}6r0H!<|NQ`R>xE1Tfi0|C^SdUC>_qOP)-`M@c|2`^ z4>t$ths*{2&%{bnMzUC0Zd&FJga&X(>jhX2XYtfwE)VbfBmP(j$v!t^+-T zsD?Z|KhA?}GXE>UWkA{2fv%njYd~%UJk^f9=OCeb(NMrr=$3Pp(XO${P-PTh@N1W} zsqHlY@-n$!~1DTunY9F9v6ChmnTdKfE&k_@6jY1J*G5-N@?RWzzr!8ka zh)j{ZNwrfwh2K(KPd87{cidO{mD+OX>nmVKTL4Wa>c$g5o!-yEkMr5%D@kJk-#72e zOROKuSCl=lo6Oo=n5B0`QIUc{&T?csE|SG_*!xx9`o=XEyonj%nffCvs#C9*>;n?d z-OqNs8LI^*tW@veBn6MgG&`Cz48t!!l4VAk{d;RBio9#8NoZ;6t;&bT$Q2Z_x28pC z%^)&~XWD8Q3WrHLYJF-+ZjgG`{`w@4`FzY~#~Vh`fu{F8>?O1YOhV4Nn4U+<4J@J* znY2tbYcb`zWR|5q7svx!a%ZB`ja~f&rt%>xfY6LHh)L=SD;XM};C zLQkmj%z35HJ1s6(%bTAz%irW!O!2~ZEiAg7T#Q9xQw(_Q`VHL$^G5iS&+4H>yTFue z@th;53bVYgVnzkY6@c%LsS6FA%Q z@{#+oqwr76T#>2$rgUChl`ggMTu|M{&jp8OQfvh?Zs_mI_5(aLE&gBU%5Dn!)Tu(s zrO|as$cfvPj9;n9OI%T4N?bKPr4{Q01%#(13G6}|_uEi(*6l~p#ADh?U_>6}Ec(Mx z+f$a(NI;=+h?)X)=4`0GJsB_>xS4EaM_El4i)#O38wLv0Vmuvw^hX8*CwL#OXZ2YDH#>p#Q^__ z7I0_eAj6TwHBUEOSs;gJD;U#JFAcMlo%FEe&*wm4`zq}nPV1enOKi@5ra7$42Tr_L z4{tqb47XMsYXxx*0ifgZU)!@$fHzeJUksB#M)>lu{q+6ubk%p~9uBIW-u}Y<%U#RWFjEBpBA<3W~%9F|(#TUoIu=H5JyXtp~+}Bn$ zr`34{Rrf1jYNmNee@f}@G<@bHbHERciOAfcXf8h4xuegbrerE)6O4sB+%ub=yk2www@DdGGEvyU+ z`Sma~AU|+_3}e=+2pgNcJw{bKn#Tywur>|Bqw&GU&BST_lP&)0F(e@B-by^odb~I= zYi{1mK!9y`fPZ8~r)Wu>kbU#{%W?=Yz%43VjU~^FU9MkJvW4I;=GT#&O0>75<(=Pl zv`W&6)0lzynmXG_*(qh#dx;jzZ!;&pYH}@Rl*;M+=w7|Sfh;!`-Ilr!(%R`07i<6l zL4GsMr{f&2)a`EV54S%4Ertm?VBwl$agq}v72P5Fhsn3vq^`&e2&Jj~d%-M77OJhm zB6YXUHC;b-{Z>5RjN_{XOk=th13u9U0JHf~;GL95O_Hz&@hFF6_F5Zotu z726UmU|6`k?ZuW*&&2inFrDFI#Y?T4sVAH@fQIswx#IHsP%bh@F3uEX=prRHx4|9$ zKfu94wIt8Xd$F{gI6j7d0Jn&VD=YmHLkZL3)pY~jMb>Q_gYEp1p;yg)m@jB>xqt31 zjwh0*!*no8i`fAnpaVt;7I{&2)72~=elYVTw*Mr!m$2*&>RI+EsO&3kk4Gjg-j-sP zo%Z$yfoD$Ku{a+`OB-VOfV$g>jYQ2cb zJLqYHxK2QMdI*>i1jWDS_i*~|J-xZqMB!!ngZ`@a@)sDT*id$$)9b!i+Fopyu(b8C zq>{ucT)reamncWtI3QQK$SXEY>9wu#vAk*t)RMjXwPZ;6T#Sh=RDDIlAH(Bq*>^is`Y66oMwnAwtau?=iZHa3PfRvwM+B8;TP8kk0 z{9@*~ylBwLB=aNBeX^`e{lHu*Ul)L8eqI?VY>N{2XcBZ^7NlX=yYfJO)}Ql0i1Ol3 zf5~&WYYcrLgZr#D{U=DO3x!So7hDVnd=G*fQ`&QGF5wVO^o4QD4X9Dho*zHXrvHe` z%cha(vhxPPNA|T9L!@DDorz|#ztR9#PnGvgAfSIDX6iL^FsuHd-H?z(F0!$X1*!KS zBJfQx|KcY@#|*Ccwwiu`A8(iwO9obfBP(SpAp$u^KS0{;9itfI#B{JINiL4rJMXKGak-h1Z^keV3xf8w= z(Zod6X6MGD@*KikFmrKgP6|>P=_Nm=*?;@Lcsk3VHo$Fb)6(LF;x5IV;ufHk;>F#I zy9Rek@!$lC1$PL=30mCU-QC^kmvirT?w@2blOLH$-n@J7wf3_J9V$+3GxphF0);d* zhRp=J8q1e5@phoNV^3rvN+@$2cTm+iUqRWrgtH~FF$`QV^mvH?c(ImiQE72XgcKU) ztlJ(Dey&^166rs}k@K*;K=7|+{iZFC%mbW_N8u=}YZ_@Cd~3QEr_pD6ENQi9v%hQI zvyiEoW!Lnx+tekfSJA8EI-mN<${ic`wnCDSyqfSK?d@KWo;ce`x3Zqph|)4?3R6@?q+;pJKLpa0?Bk-h^b+yy*JevaQ7l9KJcO{ok3e=Um@e zu%@BtgrUz6l3Y41aPb^!P*(c3?G5C6Q5vr(1cU2`TMWN}VJ)hoZFgRn5jCwH;yU z1j;!G86UAEV(PSY6Ux|ikeCyGdBx8jJ(90X&JA? zKasoSMHWN`Pb8dQ?dvy9<)>RXQ1BpTkUT89O$+JY7Ew6V3se$Y|J)eH;z>9mR+~n< zJ?C}Zt(H!YEb`+3M*NvFejSfwDH)4{0(#VfWA1s6g6wmWAa|DC3ca}?x4tS$9C^7Vl% zz8UP1qbA4X?-%TZjnL^aQJJzFo0sfY_~~Zl5*8f)*j2kfN4|`Wl4q-zZyS z9>xw-=pR2&GJB@?l4M1&CmWbNZXRm%s~#(k`(P<`CP;kNwOEu8#=hAt))FyYAL}M< zM_J}-KeMO(YZVE~$~jV@-#m?y+na-s&uq-`{C2G9dKc$v4ktjCfneZ%o6&AV+Hp4C z6Qnb_43ykPReowv$?G{qt-y+QGPK+inspAjlDW?*3g1pJpk~6kT;1s~;rsaAJ|;}C z&klQy_gBe)g3GaG|1>x@0YJL3REcN%$9gu4(J@WOIi3Ww;+0}s!^9c8YYGS_Z6%hm ztNRf~_%hhqZ~Q}ecdxl;*e>tv!Q-5Q-9=2xBBO>eDLVOO8HsZ)dn+e6+O^Dt*YQ+l z75Zt)e>6FQ5b$BMIe_4xLA4+$&F=*?^nN8B<`fcaZ_cpW*Z;T7EI3Bdb930`UNx+) zpvcwLm{T@z{Rd5K=Sm!{8PhQuw|ECwM&%gyx@Xi& zVBABMr@uKl+ZBJGoEX+I+m@Vrwn!v03d`Pts)OmpNd*TgCiROlmKt}=t=2|JN%)W* z6}osJk8Xq|u09(9;K7t;d<*bsQJ;G!1vL1cMR0%C<(<@STHB80`Ku%voOsz!{LI3t z)k==}OxU;>-)RG(p18ijF*HEAngAyF|7^LDQ(d3{m3E@9TJmqAmyt`lwi@E6o*Y-= zXCayf1@|+o;ZKDsW@PB>ZP^R?4&|gG$Etmc{-MS#mOLy@``$$MLH3m*@MiSAckMy% zT!-_ECFG zH7n_(fHD&4YC@NX)*TX`P+w*MT6jB54x{1u^^ASL^?B@EglDa_YbwuQv!@tRm?{oN z7ZYYiYG_TqhJ?b`1?O~2D0ayz{|q&UvwgC5D2zc#IRk+3rKi)X$Q0`?v^s^faBO~V zL{OnyEq-y{@7j5>foVg1TMfeggBPu`tM_3&T<9LmxVW&NZufS9jG@~oyOI3Ok|Yiwx$81mF?y2pFOhI_{V#}dz&Ss84$JugkoK=$!Q>6Kb8a*D{<}vdA3-&ryzXv-Xv|K*4Wq(>k=$zB;%5}*!OEHBe6Xe0*}Nafx@@+?mc|eovP*6!cphs9?AE&BQ*^g} zXto#I_LgU_XZ%}yU-G6G0ppfo`LGkhW1lE{&=~HMnt8) zLqMaB-QB0IyX4DeJK?;DrFyMLi^S#K-pi>9Vh&B9{Kkq3^f}mOeUG&NK@@hN;p)+1 zKw;=$EM`T@Xm;;}QDb5&xS7BipCab8cWx4Z_WRVUk+|Ky{!Y{^l0Qu{hSoAZ24CGQ zasR!}$*-ywt`?U(+Hkq*&mF2lKZQvUp6Iy~WN6OwxsCxR#Ddx1gm!aYQgc@g-@tM} z)g}9S*~k~vNtubJkFtI<3MX%0C49`k1s-c?06%dy_|ak*wF^SGs6f4-S(u7xVNs`)J$5 zez=DR&Wv_iogSe5&?oo9KESLx(0!|ccVgJsROF1O(b2Lt`E^qGH`0NrmpUHNn4oCJ zl&ZLKO4DkvIR@8?%`LVx`&-UTr-eSnfJMqM9^fbKLV(dm=4qb(pTXk+u0Tl*CdU`+M}pr?P{GTk*`4GnGPomi}uw_svp|DZ#@`^kEO9 zaF%TEvX*R@i5m};T7w6Q+?gC-x#*fHblJJxX@+AEOhdkvLxq`vpk$a~0>hhXuknyB zEgs|o70#?>1xznY+fk9+bWGTt+F$o59FS0QeoO|`0H;lVN{eRNh?IKsNpxK*rE;Xs zFWaPPW^Nn_5A|=yzhfckBmKRyBOFDsg-Cs3kh-De_5H zxMn9g{F7dqKGQV7&l9wJaJA z`}mnm@i{H286sG?|A8a+#}pvK;kw@ef^eMAFqAAP+DHzUw%ipb=79UA6xJ(t-lH}4 z8#+9;OFGvZw%Z)ZlND8}AWwwPXH%6oP^&8gau<+&RbBowe?w%CiS-U0o=YDxQDsRe zZzmc{&Sgz@0RzKy!rVqht>nDEjLhDd2B24UJS0TMcNMJ`Ch@*|(sX`OdqI2!?@z}5 z{p5SC5Y6u_rB#%x0Ij%{%nAD?m1r`BTx4|?#*8vS!7+-=rm5!JTD<4xAB)3$ZlyIIDIux?sT<#S7zuGqO&0Sz^8B8}XGj3a|3C5!Wvd9*l<-zD$dx;*eJ*={W4 z9K_J8_R=zI^oFJBfF01JQ&U35st*yUPHE}tcwOT?Xv58oHTn&^fgMZBQH zRcQrg!vppdOSYEqX0EZw$ub)H;m_+p?Gl|dmjxTHN%X9@ z_fT?@J)eW7z?C=T*kccSSI~Lc3PrSWy}XvqCMXbrI*yDA0TkThDP8yp?@i~k+6C`u zNRi&sK|bBh(#J~Bu?i^utpCMk1D~NdD}E=@)8guOb zm-i{LlVmmH-H`pBWN@R@QsblA?etzAwYFTmR@L$|BMaMX_P$G-y60A*?ACQjafK;k z=FPN@ag2y97w91Fp+{~VGi>&EtoKFAbI?D8lU(@1`N z5vA(rS>Ss$+B2OE!!$L6P8wD|LoJRB31?hApO>0_{|XHeFXtT{+|L;j@^qPGu?gBP z?2iI0)FL~eHt|zUGerHdpE_AMZ;7FMbnqpDVwhd%42~#cKK$y&v!?wY>cJCQs@!M& zNq0#pob;W@W+Ev}ETmKhPED%+j`7~YnFdcMCY!+-k$ZQ_GWVl140s>N3d_#V6$)7w zr@ZV2cHgO7nI*W`@Gc*L*vmcdB7CV?=fk1Z*_k;_LDIFPdGlMmM3t^Lq`zAX-XIs% z>1OeTsupf)*#{TE{4G=B+?16I)jewXcXSJNpG+a7?Hd;cM5 zPd&m3UM{(k7qgA+-ohS_-2pjyzXerpYUfIl8*Pqce>**sAqYMOQegBa)8@{#sTZt)qQf~hYz_2yMW}{-yRaY^tEH@BHbcY5U zYeucAqs19Ic=ss3|FwWtWx*PTl6P9SZG5*=wK586pp%lYA}!Ne%%}*irwd zN~jB3L(yFP;~Z@cbE2Cy8|Av|iw&N={Kw-t!+!{3!_D^QrXD7{A9#$)Pj+8&QU9pi zDXd7F<+h~_3Ek@-n$X!* ztr!i1%WnlUE}j6lt+bu4jYIkeHGB7C$KTT--(ZU%^BTv>_(aRyg)TQ*&Hmkfa6Hjv z_795nEy08PNtN9MM>R_O;~x*+);ZTBzD(O0t&an=kD!UtKF0w3){Hk$iKW&2$v(2g z2N{h9<|gRLa&+6wEli&dgVmJIa&LE3F4^U^nTQ1MmLtDIG|ja!_vh;7>cUxGV-OqJ z$Xgh#68%c&))@%9R|YXwn)uhPSW{`@)DA3^5T^=tkg3AAZv0xnJko&u_JGz^UL(-2 z@Q|ZMcX)(_MM!Qem=vKLWu^ABn4mCA_iK08LUT>gqT&J3BT`9#M@5wI(Yv2hqqatM zE8MzBU?W>*XIh8ugwm)_wB6frC~s*Jl^sUf+h5BB;8$_=#9^~Xw-UDn7PP_gyz40}RR-^e9iKwY6k5E&$LX1*PalwK5{Mw_* zGL_Zaei%E*+L5+;z~X|oO;?&W_UHFfR18sd%9Xd3gds81=|ybzb*(5lI-P>sh+2BkzEpP;Cc{7e|=T_lIJy!0pGM z#O|4Bfg8R&g@LuILF=~9X%o3Zh3U@Lj!bU~=ya4J>3=*aZq7FE-Akju{O&P}*X*#g zs#zPp3j^KcfE%{pjP;V^zqiyaB#H%sR&@eXO3UVnqzWbk`rJWxVFBKK8<|^G9}|Cp zNRJ4o?dW_Mw}e0{@!0V$r7x6EeC&Hwh$6TF_Mwjzp8gG`KkU|977 zg={O!8=fM53>VjL&Jc#d$>>#w<4s(;O$RM_P?-jghN(?^5D_#?B^vVrtVa`(sb% z?se8V7Ov}GwK3_IsW`f%te2`~-hBuf)N_eL-9}gnSm!;kAoe{_e_7Vk)T4ofxG_GB zsnyRE^qht(?-(9~f;%X_6}H^7(H%VId5q7LN1`DdlwD8l{msDq^}_f?W!j>#p`Kqa z-V`2JQ5DqKA4rDa*|8s>Z=m=ieFi(kt$UDa*#D zI=#OtxiFcXNNT>{)5Wy7qe`@|kel7PUra*_ZqZYIivdB`aSrn7FkiA;nj`(*p#Pl@ zA%mXb_@MamfVrjsZX-$XKLo^GFYU2SjC&3Ed9e$)>G_8M28`WP@(?L)QcM{Mc<20g zutX8C75nhvAHovdYu(}cKZH=v)UXTxubwQg5>fvU^cO)!=RJY1ocr)-pa0Zec+bOH z@xZAa!V!vEeL=a!`s_4!u$K=5lOwvEl=nJrBpnM&%;(*Nh%H0n^XOO*>62|wTFBPg zO3h~tBFXP@c>)4t&Xa#~G%sy#g)Xq+@FeL1D}Tc3bDwf=$>9-8;a|zC(#zQ40&dp_ z!8a7(8Pybqwx&~OshX10p`3}dpolL$+0vbJ?oqUM`M&us!X(!d-4g?BwZKEp#bUOf z>X7>}ITtW^;Fni{>9jA?1}SN}+simx#+%5iLrw6QZZyjLbu`w-O2}Vypo2U1G=?T- zIn>pMv7id(cCOU*_)F|^hLViWMbZ|nW`ESH6OI@#-fTxX4EVt7L*2mUoVVQ8L4)}V z4vN0(`%ko%9usr=DR2;wR+OWoW0o?kj9@y-l9w|$G!ZNJ#m~_ISwI;%Olvet^?&Yo ziZ#N=+DEiU{Hn_{=jm?WKXYF)NO#3R0UL$}EwP5LX1MaWC0OnTSQx0^u^-ePP>-hD zH$LEq0JZt}YTmk=FOdcsslDRofkAj2EZlQ;{-mBRv&&_R52I4(GHV+>s#h$@A|NFq z-_Mf{_6dF@vn;m#Fa*B^WH-l)BKLZ-lAgStgjEIM?wY0kYF)ecX75Tmw#cR6#$@6t zO>lHi8UVBk6V0={#*c1^iGptLpX2Y|s-5)RtJWM78jKYq;2%;5N_6Y~+@EaxcgR}PGns75OZMcZ#29i)8YuMA2Smtu*| zmJCUfdZES~1EN;+V9eSH##?X4q@h z+XtfYwezBvXUu?;in&FjOH!v=qXlow<<%n8^)Y-K(a*E(wb!u>uLM}h6aEi;3omh| z0JF>o-Xx3N(+1L5_9ybQXG5dM5|qfAJ*~+R?n1fN6{g-td-NwdD(vHNf-Z zc}Hj$(iy&@yc~_{2cl4!lDUd-&SlIr$r2Ch^7wTb6uvjm>}69@fK@fJe`<`*4PdLU zpZx6P zIoNx#ahmg;stPHzc3J*93H#Ws6;bpFmty=tHeVZW3h}fDL%wHejxLDq*qgBM#=H#2~D_wbU zViTfmjzX47ax@z>d0=Q%3UBI)R)QNo6UP5{vi|o8vA66n`ajucjEM7FaP7QZ+=%s# zi(Cea$T{+1YZ9=u#a`lOo7ZD(7MC5*Ta0hJtw1Qn>fOE!D-Z!;{-+5`dGf zjJ3e|2K$^<#hgJrBhAfRjV)Z6jXgG*Ggp{>e7;&M;o0W{4YWaBG*^8$?k#s|O;vHV zI7youPSMDFKPZ1Vfcr!D)(bVkC7syn4`g_wbW=%+t+X)OfBXv;-%7Px&HDJY?bp?R zn!^A4@G1APaG%H7OTE#N!Gp&|n>3Q?GiB;d-5CY(8FoOaQg&scPnLQ;xr{OVy6|N4 zv%U-~dgg`SH2zAD_m10j8x}@A4-~rw&m5_jBiu>d(+oa-IwW8HNB8j_F_pwrdd!)0 z<#xwodB~ec2q?&#W_WoZ)8#TCjLFXe{e4QR(l%E>vcY83vLp7s3h)kZ)t#-(-D`tT z*m-NeQNk&MXed`ZRKY8L({pXLsHpN8aW(~|*{9A8zVGwXD!`PtHyFQQb;9}MCnB(o&--He>1YC{<M()c1zaz&zaCEeK%rPW}-e!gx{QUIN$2dVOm?q`?vb+)SY3`!3 zW=Fb@Q4-UL4Mpbf*qt))0nI$iaW2^{1i@)$)%Snr6CUVy(vyu?xq9ed#^|b)uB`%= zDF^GTB6Tz7dPs+vu_Mc}Ro{K6Ly5D6G-{k{@kZtCtiQW@+<+KY^lfA_;#8<>~N zqbK|UeWPwHp%r6{}!e z?JxohfLj;Nno)rZ^Q7wPo>o;<%q%7TY-W+pr|6uB#QU8uq@ueu=}9ZwwkW;K6O4y< zw`n19eAP>%@l>6X<`&<^M@+y5fx!(iZpZh2)4-_|@s}@`EtrGY`i@!^T#rM3` zBVQ30|8GqM@4esbK@cx~kvImI8#lqM>0=NyNca$m`bn!IQx#mfcSyjS?#HB#uQtbnD{zX$_nDUo)sYeu`Ss{$)#Rv_n5w)htN!36e@w=DX{E3Bv4fO!#aBgv8t|D=)hU4nq<@6z;R;?!)ds^Oq+ zh~SglM1#Z-&ryEkg?YY1H$z%@k0RFUURG~IZiV7z_uvhdO?CZ2j~6LBoI`o}%@D)-Q?5 zX-9%J@~=gIo}1TH{=9Z(8uCkpFOax`il3{rhcx}#@Wo6C?y4#MkdbOE%6D!Ayf+It z3te>cwMV!pP0@_77Oxt-U&v-V_sj(WqIstZjE`|v)tK%^=X5QWnvH5H%&VG8-Xo_T zYW{~JMPI)}?Ii2(#n@_7#ZPqOF~NcIsnB0wkePE9_6hiyI{gy~JzRzUhcL}TGPv(# z3C5y0bm~9i%~yQW>mG0DGqibYQAYBZY7s(*`;CB>@pVgXGh-yM$IK1c?u^Ubc1q2Jt2S z{!#0%N!3+SYbI993*m?05DstMnlwKvDTu)@m9CEmms{8PJvUkm-q7PyCiwsl4mPK~ z1;w=;J*g0Z<6ozmPv0LNEK)>A19~eH$dwc9V78?;nj4v9qmf*u{_xO4-BE3CwaM9Q zyrfNNUDfoxsXG5;mvesp(j6n@Z4m;_n`I%>tX4hqA;PfkQl}ZQran>jdXhHcC%=|Q zF^(g($($M5I)%6r#3FsIB_XoKnsu;)L9EZ)Hs3oWeI@c*Hr7!bUSisDT|<~ojp1uzcnEU(>DSqrLLIfm^ZAo~* zd@HA}8tKIqRRf+w8?oUhUso6M2@Q?jeO=WHx#}FQ8tlII zs@by0_*){pE%!VB^32i(g5^5R#xCa5y}n2(CBpZ?K?KSF+0KIr_!{bQ=Px8N({4^J#D$^ zC5rq60$a%kl5uW)zHF8H2PD5#zbYjUBlbYZEMQeUG`b(So8Lr2D5{;kMZ?b)Yv_Q>#3KbmU3x4c#mPA%MfXt0zzTCF4)LTU1VY-P@_Tcg%(OzI#IYEs1v+T<6XEP{5xG1ECw9C_RKy9b{g#C}0$Hg@@KC3<^Tj=c>NeFSGt2?E-@ zO($D!!QdDH{o5nb-}b%&)nl|anq<$z$O4tRX>}}ZedDV7wGK~|pAIH7J$jl>%Y4Pt zsLhlEex;n;J8SU|D9}xBl`j8Cak)-e4@DLf5rq0nq{k&sbvx~!GQjGrjjR?Ao#bLN zJw;PX)gP`&ibl*#pCvA?SE(lxmBN%FX9vh+@1kTzV#=2>e_h0I8=ULWo(VW=8xWT#^NXDrN&G?D*)Rkt3CA)eLSfpTparACu~cym%|s0qp>Yv) zS;U4@s7HGW31)FNe_YA_gD)`%@a@uo-JG{~O6~lBGsP`ELs1>B<(F)|zH^P?eyheTX$HkQr+uWrcPl&~SiI?p zB;~SyRYhbpjWv9DoO|!!;HP8~97|n2z2mEsuc!a1c_KfOO?5irM;a>9_7Cyx*aAFD zM)`iukI^!sds8H|R|Zz~goIzvBkZ>lz6c>P!x>_R5nBYhfi%WnC~OOkyh{xv$$LSA z)y#ju^nbU_oV1P%U%mraA1rGugNd6B^7#AOxVZ0ybsG$X6egE=>vb+mC+)wG7J0pQ zF|qPN0m>Y7&D?_X6e!FqebHbIQ+a;q%1;`bZ+0bw!e_?(qL(Tq9_E5EEOpB0{aF8$ zKL7Es+F^gi_AFhJYHfr4T>NBD9KV4Znp8|o`@Vl)$f8!e$v(d+?z|4i{#t<8@iaFQ z#k4tIo0-60GryEPff^G08c#K0J|5bq*p+$XcDLyPxW^Cb9c}GWS zP^myZNH$BtTK64ls8MkFgDn@iOttfSJWa&W;i)OIWnv zEAAgCOJ*IXyAylk^NCqRHt71Nz}>HMoR#kaeP*Wew{N^Lc@hQ7ZtK9@@AynD&E7;j zT0XOkM>En@`Hv9a(kQmKKJhN2zF|O{XBib^ju=0BOD9XCy46wbJB0Cz=|F#=txz$_ zoC!eg8O*|5b&QfT@^Qb0Q03gcg4X5Z1PC}=qR40yEE+EnG|=N6LW$}tS=U^1QP7*^ zugmwO*vrt!Hn%U16v$uEV$2t9?hL2wt@43M?^4+RQuQOg@rGS5jTz?tCQ>;{i?T7Y z^7~5L>RWdDbv?_f4-s)XwgAB!KQyX*)zjbF%|Oz@4w^E=H|7u#(u?0_2;xEkToaGL z^QrC)HfGNIg6&xOBj{N6{G#3DG z`(u&9q3ibFQ( z5vLViN7~xyC*BPdBE5HA%9L05W2MT;WE&T{FrJJkoFE8gs;Zyv~ylKkkmW2xC#ate#ia(z0|eU6aV*?Ur*M6Jbn* zsc)GM`l7OJovO;(6)nV#Z4f>OtX$vy~S%(cy@BS zm-VLdgLP~`-nR=G{I73WbMf80?H+Yo zyL!T4V*jUS!;)2MY?r&4xH&SmB0k3oUS+Hu3Qd-jTp3kj2>SbCT^+x$FNdA; ztry|%3(Fwf7Xm!MIHQ|*m5rP5hG`p!-lGTYPg4ubWg6*bc3l&19svvfoX;lvD&hZf5~$U_!^3Gef&vee^OwORw97vh-mRifVm&u4 zI#0cjQSKQ|tk(}3ormdsJw9)7b|4aFn>O=y%~x1F#rR#r zVru!FpL8gd3}F~vyRF`~;xgH0TNRGR)P%rM1yxDv=7#B+d|gQ|)ZGf2Z;{oM6;{!? zk)yHz;B}eQgd|I+JK3IKSwstVJANrsx67YcK`O{R{zW}t)3K(5CqP)SRD2_y=a@71 z9pmVg0M%VD!q#F?fgg5=m%SIzbHB+YZ7zoU`a|{x%P|bG5?q&pph;3662=;)kUvB1sGC%Wll(FVXf1{wld^Z zGyDb3I1D3UjSq9RW{x}YhYnidi8m^GS6rZFly*D1<0n{Pd*kO~T;+x`@gDP0>W zq`^es0C>My!DsyWPaM~W!Sg?WNRe{!2|vult_C)r0=*%Dms_-UsCbXg7#neUIJaa3 z$I{nkX}q6%GoB;P3pKV;oi_qSKL8wC?U6g&ZPB(g`6@xX)Rydh$npDJVk9GlJC@@| zdGCitrq81)gf-fX#xxJ@n?%^%ib=nSfK6uu!^@|qa;OhSHwCS{XmLkiMpOgI;jjkQQ@kL zQw(+}s3Ku3?4TpCs;7ylO|JJVI-GnS6I< z6bodIyYn!39`l3B+SV}26_7c(ZhJ#XJM;SRwT|TFsHaD4uqZVbASz z&ilEVpiXI2an+LC`pU7Q{=LdDmjvsWNp?z!*`Alq2nOSb+`t`8E+i4IE{HeT^cEAV z1Lb_5YyythTHD9w*{=!Ds+>X z32VJi;I8C>-Rs+?(w&_7{(VxR_@~(Y70$%xI>m+pw&$GTT@d zc~XUtfsHSQ%wSn^O3jey5ps@ay+Q-ORMUjrMUhLXA`Izb@}oisHK%6$kZM?Ua#*@i z9^F(}Kh-6c{+vBSVF*_f21JbHIQUb{yP!i`SB2QzT-|%q+M-Q+6LLhEgi96JqZFj# z3k4d)qP0w(H6$Mfjv^ytez9`sSBVuCk?v~4n0nttns05^N1HYkBr9%)!eVpTpj)cMYJ(U{Mu7@zVWFjL`Rp3AbNSU0a0=bE&R+Jl4 z#px-ViF*vdK8}g1K~?;Av)M|L*Bz+oJ-<8BL1Y&n3>J%a)!v&9F<)YIn(yeRGDQmI zUVQy{zk8(u<}pwre4}2gR`t-!d6}g$m$qAiSH~A+ccV8)X;TfrKzap(XC@4Y-!(W( zxN)R2e_Cw8J+)QEvVrDh{72-byf1<4b6?;M4C?a;%|Uh6y6^m0$l4`u(Tj7y&X+5r zyMQ#2nAEHP`~~_u9VAy99DdZpYNZVl(;Zcn<7Z>=p%^H?w@1pdHgRONGx(#rswrIm zSpTNuaSpL$@N~2X(;mB^@R=j2GwVVy1RQ!Bxzbc}FsAR1pV;j#Rh6@nSr1;{Yl!%Y zP7e>%6+sky9+MlHPCT?d-fTiG^<(PA~MgnamGUFh|`=G0igdzPY2Roa4hy zt=bp>8HdRzHOT|9jm1hcYU1~3QgZQrZ9m)1%jcy-?9Y5ddsK>fF#%(BU%lrU-pv+5 zBhH@MrWtQ+2< z&%lm6p3^1Q7pg2J-Sm}Y%bsE(f>fl1@P5Xx+diAWBkj2qJ>+)0uiB|Iuj$Ibbtp(Z zZrk3$X`^zz4h)69jOSDBA$1=#)#})>k^+kb(L9YI8#NDqm#ah7Xr3unyKZtr65r_BT zKb1dKhR(B$cyD&wKLQMZ^rZm)Y(e?ZPwec3rIz>Vw_7F8EE@PkS2D6dQFS+p59ce; zRC^o=A_SLFFIGQUsE)$G3Zy`Qk%eZGr&iA$E!&<~#bUXE{m`2n(oi(?{@N6xF}36B zFkDnj-JqMt)FDE=yGT&xl-8TGaq=VfL>}qEtoMC)KWtkDg zj4=+^4HOK(v#o!89}a6`u;m*^R&`RM1S5F9tVMG;o@Q+4+jWPGBG)TT2J&1R;g47i zn`D~80Eoo2{(|eT>TixA*cabOK%6~Z)IC0#jQ~`vVmNLb;goux5pgdIS3j!4VL$vQ z(Mm30yB-z3?^;)kxUCc|WgxvJxl-FxsQm*ZPArHf>+rMjBEdOm?pI_|orq(HH-1}G z!8eF1&oRuMrqz?|&cm{9z}(Evz`C9=;Nrp>_eC>vihh>T-qg|x?plZtjgp)shq@Ty z07Nj$^5p@avtc3f7+5VLjM4IP`*i4K+;K0zEs~cukzmFcG4-J0I@>I>Y#GQ7S5K^}?X*Smg=7m-_v8-9?8mx3Fc`&51 z+|a7rL|FwNW-Qj~p5GKk7a{`QkZgpTTlHSmCg5?v4xPv37*vK_Ol76bZ2uwH=q?)! z(P~);N}SlQ2pDD+0*}&0S3a=X_4&|(5Nlo7WnBAI#$RCtKLpRP?;Yi4c5Q#NMJ^Z9 ze^ZI>0$dzT9qCGy=ayR>d{sQ|j_O?e-j5dDwV2i|3ua~g7}lAlR0r3#=uuSGpILZ&apSi?*Vy}0z&eM5_OsXsfB&fvwe*(91^|ACTz7* zWH5C}OE5}T`v9-nB~>zyLmNfWKQ8)0HmBEB@D6>O!^Ovvw;HBedAespE-WJ|j*THR zw9(K=vO;kx3L*7TOui7hTMUEX&k4KkDLa4Byo9+8Nnb-F438OZNTXzBrP5m4+td08yb z7)y))x%>||*L$#bOA%9*FGo>>J`dmB5Bt1Np=zRbfmg(0md@P$%PDuDfY@vc#bn)kDjAAS%hV6e>T^6Yd^RFU!E zPojor8FI<);cxHZ7mN`V6~vmd6~aiZI(s~uA=xH@1c4aJZ%yD21bipTHaLz|E%niz z?=icdyF>(_j3smys$rZ<){{mDLJs?6J*=vHx?E0}gydGGMMKC6(P|#n!Jbq4Qw6ma zX$J}G@r_k1%}cA9{02s8-v&_~BK?`~gEwKPv~^QwvqWk;@e^+|9ucRVW57!!2}ur} zJc(S_@LU)iqeJE3a)o9m8lZDlZ?3~)CUy~U*?*?YO7o8_w6|LC59I;2as9>ee{8ff zY88_f_>4C}6_%UAg2p;DFwC}o;Dbq%pxXS-o|Wq>bCf_NOIY8XDRo-muS4#}3&*e% zfJ)9-fz1czr9t&X>^E?Yuvip4m>HAU`z(LX|FwGZ47%0a9@l|5_z}EklNj54qBShL zDN1w>h7{zm=Xj$J&_>t!Fe2j*=;lRLi(rVLjPjfBjPpGCQ`g1@Pe<;#(cW2V{rR~- zd>hGQL~fOG+up2Gr04bX`csTpycpP31w8eAy}N@xO=NQYN80qZ)lg#}Pq(=~M1f1m z<|72gaL6K`7B+8|2-cr);&w}As}0XfQ3bPYC5z*5pA*M8iAhNInRda?LlWKa?J8xx z5feHUEGa9!{>$Ul2uo7la@BeBX4xU(P?2Yhc0|%i#&~XK@3%Kx? zXmR|9KxOn~(>@E~xHtJ5K)CIMzYCc-f^Tz|8D&>m+xZSH>zV+{j)(fl<|Ieuu?^bi zsce%JF0&ty+bcI_b6u)=iqHr9!q*Ikiq}SfUNk&0-Em%hbzZ!*+oxmRNqBHLhfJoZ zN`HB@9RKH}eSy;N$)KUeU=F#)8sf6}dk++*@N5Q$es3meT=M|9bK7c)QI@bfh}Kxc zvQ?H2Jt?CF=Ufw;mYoVl-9)Ko*C+FRzSWCr&Vs0@m_K&AlR=P0f8SP$twJg?btS&J zc-K91i8IS!)WE(}<7TjT1p5DibHsAkVvLkS-$n8TyDLgq&elpv+Oi~vst}v*2yVMS z&R*NN$YQJVOQoaTDAIo$5@%Q>s(g2&NV*vioqb*x-T*qCcKG-^C0nI`REgY1?^s<6 z*uxVGUmh22^@*TQkTDge&~zDWi3J01UTps#03AW%z6zDSnbk`V?RDsPsqkvuqEuO> zTo6uwr})=5wwrf5KCMkF8D1gyXM3i3hfa{s0XvK?$Dg69Ri9F2gS9p3e!9{ZiX0^d(3?IGA>x3Z$b2~`c$J$9yM%K>psZpB#mT@qbikd2qPeh z({rBfYx1JQOYMKK9Yp)k4avY&~Y>7>Hzh<85!Y>B9=Z{^cn0b zCUjw%Qg;(s(Ek9mZM?Z+xW@h8Am_igy%BF=)`Sw~Pg7$_@b#=ZZMC zvzYU*jy@yM{59Zxbu2ZVHM~P?v23uG>N74(iPj)PebP_UngHN_3wSEW#@4!D#0^wk zjczNJ+P35@AGB$7fE6-gxa6w+@*2bs^R-D?+9M{n|OK1>LE42+ZS(z@%@_B3pa z;rq$h?7S=R??{M&la z1?|5#*1lNwi4i_-lmUg}?M3Zc8yK5!nx*6*^S7WMk3W@ER+lcEZuKD1CzK-jaWet^ z(OlIdc6zkkm5%R3)E*)NMt3sf2eGXwdxll%s*6)QQ*#aAX$cI+2BjvM6{4jNKyFxl zD$hAH6T~c5=HDOPIj0bjkgn-}e2(zkZPhPKalE7mkJ=paqq#lLt$jmlsp2=O*VtIx zYOyb!cJU!l$I1Csc+V~0@S%IX0o|5mw1(c?874sg0DFmp55#w=^C6K8?*3>U)WmNo4+xD5uK`A<;WnC zc=gGrq_u367dS;~uh_uLcOFb@Vpt~fja|{Soa0nR4IUte6Efd_$>(I{DVbdVI zGfx!qTr&pS8;}o9cq5VOeQCF4xi&>B8^zT8Y2lfmoT9^es9<@7jNdDAa8F9kEjeyk z?k+eru#C8@nk~_$1Umw%fs7jGl?Nv~y&AWnq+C=|>vCvek~u+Q3IyBloYJ8|(MewE zD+J}t?_-1U1?R}VoP!kK;(P+*ClAnnWTC&8s$vp^?fSqQ}ITZ za|u|e zw%H6rb06tZI*JRKl?b`JBhB>>h&NN+=G!*#jum*%)cek0Om8d78~?%eMuuk)g$ ztc|HhQ`mHyNMg2C3xEbOjw_AG?=$ty2T#36-)@_T>$Z}UOd9TZ{r#WzHnT0U$$`00 zeJipP=0_ai%Fn9)2VOPTfUS|3xVLtRNjc-M^`vCgndlS<;KZ3cit0IuH!E;OAS-IO zQE9qu&Ew>Vkham>_8*DGOr^@3Dlz7EJf~Xl=C9%_rk?WQRI%I?;O!lUwRsb%Co8kv zr-zD#jQdZAH`ck7YZAiyxJbrR9k~1{I*+kS4<6@n@Y?fJgkEUcvEMC@(*(n$ksh4- zf(Wle4L)UNd04t$&RQMAN=H&_sN=Z=*J!9qFax0V}>);n}PH^S3tmodGyjp|JZBp;U`4|7_^D{G6I$C3P8d;L?yBSzDtlWb07jYmzm z>-_ou01DlEk+L+5dD+V99}jhfw^ojLH-LUagOAdq+8cdY^f_zq2x?G7>har?_qqae zOWFzH-&3pj3#`70c&frH{641z{ zeSQ@Z)-ul{keqfM&*fRlPS!;wsrl|Jpn-8f9GDHs3c(>CF2R6LxTP7pnbxA5 zPo4D}Ni1&Uf@Lb`a6zu<%b8s9XC7B#wrYtOXan>R*E1~RelB0hVes=>nieYlP)vi_ zm;?F~Qd&M(g2q{KG>he=fH^qz{{ZV!<~2~c9nXhmyjC{(c*h?q<0sONbcU(6QcncR zpFG2E2Llv)ONX+t*mz4!zVP3RJUYsy8sd1JbJRBBkwTUBCU9{+%}?0YTf zFmioGeT1TU%0rV*Qv(vCb~p#Oy>rP~f{~XzMj+9ZUVH5a@-+?!w9ilYV__A>k8qOZ z7&!<}7(TzJ>TAoyQ|6Os`W&^|noR1nolfUQ)I7+9Ydn7`S3tmzaBI%9O!VayQar7a z!F!?G%Xx4-J#N>RV1p+7geR`hRFU+_^x#&Sb~!$;IJNI+yuYiOwq8b`rpIk%Zm>b+ z?bymPInI5L{{UW;qIJb6t1XWg@TK&Z{wvjWD5W8#k^Hl}1yP&k$D!MS^vy){Ry_PS zzgAN|-cFUddVB?J+pbNk=#g|Vvz^kAdWg<`%njeXMJt2>iT8nrlk$kVP0=84Xla+h2-_> zz~|b4I@Rew3qT(*_=Ci^a9fi1t)kQSN$C!^SA|3oAGk7BLKaM{T1OH)yvNW6%6+ zV0<&;>uqOFPbv$vDJmxbxFG(c`B#1(r#xI)=3;5`zGQa39-15LSmaij;gl~W_F!^0 zjCaU6{{ZXN(@Ia3^f~8ru8y|CR)t3Mv;n{e0=r>K+Z?i)^TmFoetvHFU&4CNiXL^* zY|Q>Z21YKZtDb`-j(9c8ipJ5xB15B!d=?2K3P{wUq>Z-V|HcuQ4%Lrl`F-e-uyMDwFA(n0LwoT#o$W?`4(Df>E; zcD?jZ{EnP13mb)>JR+~Qt$&%`c!y2#Z;AdIYBoB(g``^4mkH%V1d0&GtcN))Mt=8x z)#TypVDOmO)TJiimaX^K%h2?z(!}C0vV};lYxM1>ndIN_sQhLB06^IP0PrS1{wltQ z`*Q{S--G`EBgFp5#eXm2j(f!(6V`k$Bnz!sm^|=IY#m)&9Y#Ss@+-3ojiZZA(Ut6S z;xLtP*7mB`FsrENI9o_VAPOt}eEkG%FgB4QdxV4*=IfI1Iq^v@x^O46@-Kt@JKG=U#)YuEaYo2AJYj4iG2 zEM}Ea1QGNck^>B5Z)}cnisFsgySGAJFHErUE~?trmuW0h>^oBWBG67Tv=Dn73Y8mZ zhs;5FKlXN>{u}Wof3xQ~^B`@^st-8)M@&|Ul6l^%qS@$I!W}Z|S)raJxbtOi;W^v% z;<&LgZP@O@MI_mJ(Kjey;l0Ihv(!sMb#RS@l|%mkcRZRk6s&YU0N1qrCG|(UR)vZ4 z9$3LGD8~qWIoxyaUXB`iS)NuVo#k|ne^=J#)UTkOO!ByWu_G~HiP#Uqx@EJu$d%f$ z%sD^_E>NC>u4_wNEp3J*ud@mcTc1jntTgo`@Rx_Ayzza_<-#%;!Z*w?akNyyN>kyN%lxU8XbqD^c%)5kh4tiQUEwt9uye_B(T*_8-A(Inc= zkEw68hDe>6O6+GFx_VM>`l2SSqdZdC9@@gvGDbpUX&iy+U55lqR(s`eq1j0|?T_U^ zrMcuwA&TQ6{ZqHBCG}y(cDnP*dwJBWcdKGnB zG&by{^V+58Qdc<%E*9F}OIM9gU8IcTKGa3(b5@5bj#rB4IY`|&^`-~j^`QqBkP&xtHzJjJvC_|Y$zeCIR>QcOs9oCN> z^_#(Vi7akDXxL;LA(TpV?%kUo)_Gmxb6SUmU?oMn7?~N4*5n+FV?LPx*U#3#D04$* zdQ|fomr|R#so+Zq>>#{~+BqcGY+bE2Ge}(#Lh-&k$;pTG-v` z7N{j@%r4}P2m=a6)12qqrClm@DK$8=I{cGP5~(n00fR}>M(Ja zv%Iuy`CLnnJ)^2d75;~0kvqGURRoeq;<~wCa|@&A-x_#^!usY|w6Qsj8w(>~2Eps= zS*Db(4P73Fm|EpE8+&CAqhWDrb_s%HD8O)VeLd&{*}MU#X?`5=UY}!P;u|!GI+nmM zk&?vsC#?W--Zk;Zg`l78jjTW}4;WHdgXzTpc|VJcI=z+bR(AqisUwUN`OpW9Xf|{I z0K!LNu=$&W>PbxHR31+qFf%|OQ^O>00z57rHW^k2Ac_E!wrB(9jWXHNXu(yHnB&Vi z2S3bIb0OI1@3bEvB$Hc6poS7>o(SON3WAIqFAvBPNhcc)-KZO>C#EWsC8JyW9wVkk z{{U(I^m}5INV`h091o>8D+P)PD0X`|l%u*juK}}OHKpbK%xu>Z z8RV6)iV$)=fZ7M*O@3*b#x(0njTNMHU)QPiczH|e{?cz&chmes@O%tbPZMbw9d_L# zeO43;-J~481orU$9PflZ{ z)Nf$ZtY^HukVkI<86B~lC>cCgn@*gn%|aW!4X$|=@9hDg$9B+JX*#vm2H@cpRIV~x zsW`_u#eGCLM-tWNIIq3_hYQEUqGy=Di}dYV#JBIK+DQPunXVQbWGfIibAi=?Jvz00 z&RyDZ1e+<>a&OEH> zlGLSdrOo0ydyA%6ptfauI96E#`9$<=cjPF?etF%I&0fg+V*~b@YcEO@wk#Tb?CqmUTao%J;d&=I*`l+N&uZ!fIfFulS=Oms0!4v^6g#1{#wx-sp9B?wW)3#0j0A7P1tpIIn-ZIy`IpRgq zEmL?bxY=rCW(T1kFyeqZFB84SsiEnbtcv1$Tj)!VDWf|}sBEd^bBX}R4*F5Htc2CMnhn6pQTMlrH$#Q zd!JO?HJDAZyfG*p2?G@d$jDtP$Ioe^5lXBuF@h?2QLi(#j1L>=I%cP$Tw7k+#A9_M zrU*TV^fiqA-BF|$K8*QuPVltyYuEZxNCQCQYcijiN#mz}Yk0xdNuZ;MjuV)m%ECa?gVv3wxb9d&~=X?os69KPX^N9r&rK z{6yJ!NI78SqrRp*#dD8Z=|{~n7ecrqsEZz>@SfTWoo3LydzdMaj&eTlACb*th<@SK zg;$zqxWtgS9#@sLdJ$Y4wr8rOnEQrEU@GqluWYatO*XU(r1d^}_{6B5B?$?_ykbTj ziRquxyD;tYYI&H%y{3l(s9AsmHM3_TS0-h`l>-$wDe0l;azrplI2HBQK1$>p(mpzx zOlwljn40cnh6wja$7+RKl4&JzNvNaHw9Nxe&@IK*v*q1iVEK0aVNgQy3W~=H&$0=GTIR+DBjE`^VLM zH7r*}Um-%4Ad!=hPvS945iVFiI5*%n6;#T05@S)Bg>3Ml1|(ttia z{i?OI;y)7U8jN~P?Su(z*8A?lt4P7O5wsFUHx9nE0q)J|D4Ly<$@* z{IeyA_VoR0nzZc&W445S_j2a7e-)(Ve5qM_WD3TWCoOJu&aW>+4&r6o=P+eM{o#t} zjCvSKOLlJjKDUEk@fC%NWr?_nh$9>;g2a9qu82j(MgM?>rC=r}@vI8TV5@-Khe zW&X7j*z~f${{Y(+{>7Ncis&df@IGgUi~bqs)$?bT6an9O6;$ZYkPq*hx3I6G%98dk)b#Lc_kS_oI8_=a01w`; zZ>>DhFJbc@Eq?6t`uW4l3IOyE0)NOA{{ZW=e<5E-m45~L{{WHdVE+Jz^F9-}xQAGl z0U{Wfk>@#=0P}!I;08Dz+}B!Mn;k}smX`Mr$t}D_BWWszD;PV#2N@$Lpz1iR?$-T8 zdiTQ3I^xalF7^Qm+eTwt=Xqh*BiTpiN*lQypJ66+T4t@SUTag@-P^{N=!L@wis##Q z>H602e(jmhINn+u70s*LGY3ZbPSSe=>6+O)oWwiJMzIAX=AE^; z@1>8tnk}b*Yw44@<1!|Ro3&_&Y-qP)am7AlMae$Sf4n~mT*wD~nU7OPIuP}>^`z!f zBv=6LQ_Nap{I6$!;2kxx0sZ0rLcNR%{ol;>a9_juj`27H zOyB|YkLyM`e(UBuYW>;CSB`lnp{LwmrF|mU`USAG#uNZh2g|j>ex4KnPys+6Ps9GE zKlepfF}IxO?t%rNXTgbFc_ z%%8@*g$`$_@2T=F4_12^;{)YfR-Be4RBXWU4u@%bYU?aYK^%-%JxXfVM)c}End0}_ zEFKm3hoW3*$W|+&A$8Bb-2PAcRblEiB%gDW8%;PidWGG_)I8U$+29$1<1Bfs!1)vo zO;O%jwJ4bLamQLz42A^Sm%wr2*Iov_U_M?>WeyuqBysf`o4+Hq0;)L;sjdcxT2n-g|6^;nbGO?nCT;sU|IPIFW ztdC0%OW9LVXDdwD{Zya~FBbTg-@^9xx0;L>4W~&jl|9TcG{0u~NmgZ0PSQYJDZ-I@&TiI$inuXGgm@M?`iChm}6CbSrcAgg3?L14P$Ej)QbsP@Nn=YVeWCR=> zs{m*M-miZKm8D+lH)M-zNFL%+I)z0ne?dSVNu>VLUk`8HQd_M`&6|KHvS$AP(R-)^ z)O;`E9WTW?EIPJ>bT0JyiwNcj$QY?0@W39Rj+6nbKm`C40myju?c+!$EarIrQjx~a zN}ino$4>tB=H^sX>8bTcW)7z;`Fot0)FSdrG*=*FKk8fgfyH?7gKo(5B{dY=A8gae zNDUNdpkxTkV?6)>^Ipoz>DyT|!G>>AZQ3ftvc1GtcIgu=ayQJ6k_g9M0qi~d(uP~f zE2-PDr1M84qse~fZ{gimThH9x6nO&fSrvBg1A~!Xl1(j4AyrMiEN)P027od(XS&n0 z_n%L)ZARoc0wUo~)?vE@`VMj570raf#*%TIo4b0wcj@SB9$CxYc0;ubIp(sswTwhk zXq*O=@f%cp8S1l$EO;UYg&DO6FL~0l;_IrX7xHx3~KRCW{x2ukh$|@JGUqx0zGnD_4F0z z=2%ax&)P~>jCv)1>tDd{SlBkyPW5$zr5G&)P_zOMFi3>{@a-o)**WWz&TH6~V6d`< z8gX2lw^sBxo!f1cFEtyDUrnFQmKaP}kx_EHz{ntz-=-^$rY5F04LMY5Hq~$Ud5P%k zi&`DtqpIIP-)IRHxEsJff9gAv`c-B4j7~PJUp16B^C{UI)$~M#0DPya_(#XT2fTTx z>plU~-&N4>*qocgYbeo68p zg{J{Y+!9FC?gdFWVcWkXQKQ@i)qEl2--F&f)HR;~>F=uOSL{iKI9hNJoP?1S?gdFW zVcWkXQFPXzCavKg9{e8h&ZDh(2TpxgM872YF~ZY;r0xkMYC{5~oG|U*k|?@+f%R=b z1pt11$E(Q@WrQNONY2oD^*K5A9C}wTv+hqb=!((6CxxVvR7D2>9<(`fyCi0I9|<(r zuRLp|iR4cr8NBx-_f;iF*LEtDuI*!LFIyi`Ip^g$9l56bj>L?uQU#U<6M)H%m5oQC zq;x)U_@`i&SH#4-QbUpTs-W&oZH^8L$u~#I+=uk8iAO`4_eQ!pO+S{xP*CRsqYuux zoLqG|uVd}h0GjkmK63r3{6OugY5FWoe7FYRnhrEp@ zJ5=$J$rJ%$Vg)6EhFUX_C318y)_;C25143EUn z2iRT>*FN3h>v?4*rEHcYW2w(h-9-R+560GeZy#!kB{8?HAtNa*90{5yU$KIJaPo|U8DYCtT7geRNH%4XmP>bI-f~+Ls<=`c@ekFpQx;!gtc@YO6 ztNl%^p|{a=PqW)bp;Al9Hs{}Hp~!M%6S6pAFx`62RD4E)_;MWDJw<%YKv$@8|&u>?jzd;B!D9 z2*x^Bs*jsx`z0P?k~7XIdkQa8=pTjGTBVMaJQ3*E2Mpe1@(rOds&EwGvH88L!Je{{ zKAx0ZVHmQet>T?gb$RTivy$j$*Kc)kVR(qvF~r5wVT?zC$3I+k$*-TpQ{<+V8Ef~R9U9dq zJ4<4&r{nJw>AKXZrFkoB<{v2qvdO)3!OH@3^ggw8sYX=&`8)O3sfB9Q6zyZtHQyKA z$s9t@Ot6f}2=i`U+%(MD<(IOiMmlp?QK2Pi%1yJbF;bP8t3sr-^aPhjf_;2hQ}79;EvtsZpz0Z8%UF__s& zCx?JG4Uj(h{z9{s=dpobyZMXa00oBteepzh408R~%;u{@#|i-Hd^`UD9u5Ba{z9{s z=dpnP7tHeSh(0Kj!y0X~T3g3)e|a~N0!YPB9i@vg9N+=aa(ETi!)*th1Xg8YhHsl`^EZ}ac^CnJ;<_r*glXQIzo`{z)T39H zte2I)Q`TaZIip!2b&(s8%5o3mTrFF2?{V}DCd1T>Dc zn9N-x?Ee5`iJgFEQb)~>=CYRHwlk~`nejVHDpYw;6OwQT4c@wF=&sDBn|4QI@hxO; z1Zsi_!n49#iF1$-BOaLkb+=hjk_(Vm7L zbm^-!bULNpg{WG|Z0{7P>w?F8TBX?k(l8?&m{e&bz6Nm z!L~~~o$q+8ktzA4!aq-8k(1jsYHACajX}-XA2LS(tt%!=Y^P;z6NET{A7_)@1{QF;!p5hbDYf9$iX!Kr9kuvu|%E(e=# zddKpOr|5ov`{uiOl;g~K&Mq#@_dqH{M|W`*ouv0yEw%_FX=H44RT(Gp6g>d=n$2G0 zRgI&yGD6*QZR^l`Osxs;V~a*wQ}r%9Au=!Z_}2 z!wAXT2Uf>=>xDSOX>KO0tj{01V(~-)XC$*bda)<^0bfFSrrwT^4zoM8#-C~AN#+l? zGZY&M01%*(dFhVS0rX$PuZ)_@-Nk9DYCaa#U^q}Mr+Zod0N^5JRdemZ_n=2>;vbB9 zEWQ=Ky71lf2UCt!xAN{HWmuT*C7AReDmlm`aZ2ELCb{vSP@d*M{vz=e^kne1CLKC4 z>@t!&4|9X{%Hn*CE-`UdgJxL|RnE)2u2<|}0C+R?sqW%o{ zgHF8~zlXH@$GnR~pX~6@CO1nDMPq;m1TyCw?aeCz-(HNV!0AXxgT~+T1^)oHtNm-c z1^iEu>1Dsh`5X;;=e~O6f9luhE9ai)$vwrSAfN((Jc_=E`s2OuKm388{<}Bw73AZ; ziSj%g%lO|T=9}LKcz47H&e1RJ(r4tYoW5$0tV~3U_-?PRSfwWYr{kmh_WX~N=BrI= zj(=77J+JvjT|MnDG5iZBmdEHM3tV;88N0>X`trH8JY-kJp;wwk4) zA1--eC1*kWJBLy`dXLnnPg~tJONs!jY&rj8`5i=zx+74l2-E*!kT7__N#mE5MO)WXw zC2VBnH#zGk_Zmsb`>{PX>%}^K*_nJP;PH8>Op5At8PnGRB>AGg8Y5rYvt9oJ0Wz;p%KNzUQ{4-RSMVudR897kJ_HU zGk9VtMRLUzu6`ftw?0a1nw7IWV`5@uEC=^VVmS91tf=7d^qX|_zU!e1tZBCC#@9VZ zPw_SG)@bgTRw2pHe?eaz3{^{RdhQYIVSG>VMdI1%*H1i+Do7Y8KPg`M9qZSkomwr= zsn5^s>Zcvi+G)Nq`(B9@`hCj03Zo@(Jh6}B^sJppr^yv|Y0DWtW@lY^^58_1+1&Zc zvquqQ%4Lbj&-F;iAG6(;BR8)5l8k&Qrsm7p|eViq~3GaFC+M9K-LN3}wA**sD#>+>){4#iaFDJ3Twa zlj?_kvczH`Tn-5U=Na_rUTo)D4$YgWLG(2f#FE3lZ#^Pd+i3%#H7gTQYs@J^J6OAG zcp<%+@EdN!gVUvL(H3!k6w=W&8+a`(;ItPPrdeJ+*=A*Z#N?j2HCJqE#;%R!#iqj) zC1Qp&01?L(<2$)KpFvK_D#Y`>gzJUW03)tPU;KKi$(kaC-JYE;78|8$Gt+K!_|lTL zz;GWDtRS{+HR4rC6__^OGCJ2*4Y@XtGaQmi$DsJLMezFQQEHdw?$}zYJgz5s0bBr7 zE_lfx@#$T&yN#CTnv%Y!G2w_IivIx5(7ZvXU*IwuJwP~654PZQjCQQOqF)j<_IKHu zdaj&hxg`cpde^lX*&LFM$*k;JATlz4l@4LbUdyaxEMTzjO5tLZ?{YZ+XCHM%Qn0LM z+)px$vXS2`YP1u%g?V);CuZ#XR*4x(On#MNs9w#1ovqZnQ0T8}NtNzy zR!I*~4slq@vwI_G(NW!=pYf~17dq#MC7RINK=#UHX(Z0)P&rZC^R5G9I|mqTnkqNnd3)2`@xKA)%G&Gur`JS-2F zg5`>wasGM7rE*4X?$1(G<7U!04SjU=(&M?Yf;gDOJkmOb#wwF-*utWUS4Wv#IC)&J z-6x9cS|iPy=96S3&`82)1N2wm`2PTlZK5CcW&Z%t&t2KO{{U*A%koE^lm7s@!{_<4 zTjB&CY48__VjWt-e0@R_TnO~9W_+KgUdv&pSj4|(Oh&HKPbSa{bAUUZYn{{Qn`f&E z&YTiG2f_M<=C;pg5Q<3wn}#aoOc-O z?_DuY#|>ng-&3;kRvmu%8)z3W86t1*dXK{&%C7nxZ5A|0e{(0+rl!D-XX4Cw@Ghu* zqyGTWi(PqF``kW%lRW(2{my?c%^d7(WqAq(!m#hxfmq*L9WFXtb2DUP4cLL}{OBa5 zsa%M3%ilO50w*Cy1pKGe(wwY695wjYB^6nilIr>vyRaAMFlGEqhB@9gJ zxXV<15j^F@m~1Ke#sTCJ{{YsluXJ(SQbK&lS{czxyoV18OZ?9886Adg~ zO5=JiKUx6%_Jsq@8WVub251C*f#JAP-WG}#3mj^wsyhHM1$k0;JxQx1jdSw@pTeYp z%rY^OK9mSWP@@AsiOm2Ep@*UDeJBIv?~NK)_HU0bBvjiK;;qW@#!n6Z0FMUz>(QYr zz~ri}BZaMukFxFG{U+=FyEpT$bEI|CgZr({tiX^|dSk!iO5=*^aX%2}iftT1+ni2( z#N3=N)Mxbn0A%~~R|j?zjkh{|KT6jP)uD$`ngnRnF&5wj7zeo8c*x?pT;i{EdUWAa zOEaH3cCT_D&Az#5Rmw^hHpAoHc>MinbB(k^_H(|h;JjsHHlMCW_jgY{$*_>IeWP#4 zzyXfDn&_b<)3N8`qT?lYT<~;?nr*m!%)%l-1Cn{IS^J$CX@r`|4ur;>I@X9CG4-rJq|&${jUPzMWr;{N~<>ds#8$6A|){tKI{ zkVpIlLn!Dk{{X-qPv$5C-~JVRX4d2JUW4J^7wQ^z zuDZf)j(b^Rd939uRb!Q+K3i_U#xTQh&!qr;D?lF>{@8vCk3{jMr--a#32m&SdErL_ z;W4=X0Kk-~_aTh{eWgGgZ^cg(UieqTg5yonukYu$W`Ij+9`R?CW9P}i0Th5qJXFqH zv2sfGDiP+Ai*~v4&7P0qYrhf8;+eczWqmdCA-bL@Qx^#y7ihrRI9zdx`252*p^A&6 zT8mO!UrRQ(K7v?EnQaMTDB>cnownB9758UdB(E+vwsF&n`Q;TIkBi3Un5=q=#Lt@B zXqNto9S@B44-a^6M)0kSnl!TNy7jv>cWE;PiI6EIsW>^^+PGs#lc&dCjD%6;o%s;HPreeO|*l>9tYBwT~D>G-JBCl2`RnGD`(}#Ip>P?@c4?D zYKpBVW`ey6c!)Z6Rnr$l@MeLb-wVwzPY_&%DZEPU!Rx_dE2k5hVzE&6b*FXczeIE4 z^4vBWe$td|{a^W?FIwu4s_J)IewLEUc>@J16W7z}iuk!vno0LQx)mVXPodHHa?;{G zaw#vM{oTIu#YlDY0N@-GgWm_zhe~wyk`HMKd@SiTi^!QVIP)YUoE!mORZK+OwAj`u z7`k-xSYI{eozuY_N=qE$Z{z8V*7#gaM*ZEwr6|dJ!KV0<9ZbscT#KL>jp4U*=uLG^ z)QrD)LW~;sIvVSwYWHd+iqXO_$Sy)>^EISt&RV2Ir5Nbh&1=njr$}SEh2oI?(0_~Q zd(=)ci?bYDUa0eH9~nV?t*xZ6x-5^eWG$Vo|*i=I@%gL9JB6vFN}ZTAbmM4{46b!_Ga4G7YF5mamxXNlj*^#o0r)$cj$AT z8t`VdqG}M|O|D6)UQHl3l1@ksANLeAn>H(UAbU z)Ejk(3 z9Ik@i?C5yvtXX^or7-y=yF={if11;IWe4By62{d>7vsN%8vN1NYCZ?o{{XY~?LDOs z%K1f-DK_qnuoxeicMObjayk*+hJv95O=^+PR&K1h+2`IE@IJ5Moqtu&?yftTtTdNpr{igM;m@$)G^WYNv&T6^o7%r-!k4nQOhgEi=4D=al9Q25Bh+Rn$* z{sHg?hh=23$!#2xpO~{KJlBH`d{nurNa>xRz0_~&-wk{*bnkSwF^k4hyYa{6(z@q| z<)zCBG-Vo(n^b(k@gKtL;f;CV4gQNM%HVz8c@@=x#LBc9m&Fr0&{39~GpF!Hk)Fmk z0hR(vj&q;zto@UnM%nh+YHJT0o$L^-5tSGmbQSATrl5}N-(%PsT=%IzB^q9(h`XW4 z2B`;{q{S#`81w^h{{RpN<62VOnH+AZ@b|*^e-SL8X7b;!kpRJRpt0QDdvi^+=g4+) zwMW|ZId6!57Sir~O(c?!DOOV&?8ec9z{PNTNmHDo6SYx|SjJN9V|c2@*H6&lw9_KW zG@;*W=YTq&Zk3#8Eo9BTlqDri?9Un3T?~@LZE$2rxe<}VXQ&6$fyYj3+M?{P_h-yo zTN(O$%^p@r#Ic^Lf5x;|8$U!y2dK?KLTz8}kII#htdBOYmOgyz{3Zd@8z3LvALJ|B z%a`uHXRCr=yZMgsPyFHlmlCks&D-Hk- zgA~Sj@B=kQ1wBA?KGo;q^qM-T{3cw|2++K)6&I4sZ~(4*wrgXV)jV^c>BO(vzSAK7 z8+G6M^!;l{(wh^KMs}I;D*EpEV9|7TX&CJViID#Q-zq~R&+thSF zk*mV0w4aeRd1QR$C&OPEx`qD5EQ;9yZr}r;2l)E%IrgtvSmbRLG|LOEQu-@BJ_oqE zl;I;mlE)e2@Du915!tn*2#t%J&`CzRN2i_2{1?+l*&^u>8i-_Yzz$BdsD-(6U0Ryx+8 zfhL|dMG=6YF7WCyGBOxe%9@OmiW8mHnM&HuEk-kGr$aRIJe!n6xneoSeQ*e^uiVU+ z;+?BO@VCPDvB*|qe3ze`J7=(3}Yia`&Ck{?OTkD z>rnPdN+wr|th_)qDIwKu+AFU)q?RKhoM+}ZtSm+Rbry9_N-dfs#P6 zs=ncpPIK-T^P){PVj&qt-1;#ZpxopBGWm`0$6pa2o5&gGw)M~HniwO@{4;kRg==SL z_961dip(XAH=J@nBokaSS9fgnDYq1oM{j?t#bs)jQKFPR43c?DKO7p#TITNQ9M_Gl zM~plvcN!!fYJntjM=HpTj&K-vtBd53l;iCn(X0C}Km1S^k@Ne#LP5{_h-RRKHL2uZ7W`Xh zH^n_SR?+5L#M2TGSsM!Mk~5VIJ79s4?@cWZ+$9+*4inPnqS^dPwef_KT4){>z16QF zi_Y02M;f5ua>Vh;0+ppv0x+ie>7J`F!hQ;B@J5=T|_A2vAj+DWHm zRA^z_yytdu-YnC8E9zI*ap~=-zL_Hih{q&Q9CgP9TL9#9*B$84-A4-trN1-Dd|{;P zx<0HS@kDnCs7V-?_wtDukdgu2liVKts*bvHgqOLo-~P^CAh*(dPkm!|Bv7UFE9J=T zkKQ5SN4XB)l}wIYd?e|o9*3jZd?3-`@qVMOYPTa$w4LOcEas02jO3OqbAkp=I32wy za~zKx{hEY#I@rJmfGW>qw;ya{Gy#e61;65ty-qVDM1urznHQSMw7Fo-XvNBD9Jhx2 zBYCE4dM(=OSa~iHB#jgAAvrwt>0EAc)N{{V!ROZcyqZTFHWldX1|(FnC<}m06&d%(v{VY8t`#aIm503(5S>2lJ?PS3u-_Mr!^Rc&{aj z-u(@_1R#eFRY(UcM?=GKaloxTt&-5VQs%z99k+lq4Km}x_FB!%7Pq$m5XbvV?Cy-L zc-qO-an4N==1%_rshY8OU-2cRs*vg0R8~6%)?;w;vwP7q1@A9A0EbX{-6 zv$T3uywj*ZJgj!cpH@769cmz_J&KczcROuk;$4(*snRZ@kYjTkbNFVoZIY}qk<4_xRZyGn8?_q>Eyatw6nBcd7cWrU-6gndDa9c;6nD4c4#hpeCAho0 zcIWp$*n9TO_nqV@nIX(PZ|-N^Yh5cr9?4^^;79AAKu*ncW^#dt28%@=U9S-#Ia*o> zZ1X71^E)Z%GeYzm4EV*MR^;u9uUWJ`>6OJ)yB^+1=z5 zUvDLLlLI9igQnCy2jz__N%@w#8D_R@Us|}Ak%E;m2qS=R$P}YVxT%EI$Dyi8=tY`V zt$b#BpZtk6jtmE`E7K zHLAkI)$AbWu%)Jbdv>7;$K$8BrcT$5@cfoXcf2tYzo`@QZ#(hpOm8Ghx%^e{fFw|xDR>HlRtEt0o@NEk8F-Yd zh=r2w7q{Iqsr0^V7s}mm!L4S2MJw9*l5;3X|K}o|5b*v~KOsltSoLry6&OV{6q(M)a^3yYG)F)^){iXDMjT=SMP2I#Q9;yARpk;qn(Q%Y^PLj!=6}loBJXGVcbF zY`9fxLlO)xmjoCK@hREuxz#Gy6i71*llZ7r%QTwvssx-1JGXcAyvE}rK1!$1F-)syme5*cWpSTxt)AT8>(qJ|%I*4#&TYfJg>B@407v5{1r zOO%UDN5>1^c(_LtH1!ZPJCjvy_aO;<_T<@=`Ivh`z<*OFzpo$w6xd=>R(N#y9AiSf z(kklax;PKiNy(bpT!Rr|S2fQb3zbliL_3iWIxP6vOtN7;C$|c8| zX{+QZ55gd8o0Bn3U(VS8(ueM^9(p$CEE_GR0L?hmSshq`yn>n9Hd{i0OlyW+p#u>Q zL=&}Y;o{YU-RfFt8^D-7eXhbT*hBoWw|XUOb!avqIYfrQ zkp8$padevPpe?%q7>L8`F^VM_9Tfa(M>vRPz*(1BF0Gj$s1S&=sJE_Ayo#i{=|$(D zbzPZEyTHMl>@}!gnXx&T`XQ}Y(Vu1%v6G)Y0U$nrVdSbwEH+lCc_VHJa{k}^bdY7#3 z^{@Nqn&5Sk;D+t1)s{EzJ&nXNp4j#=`bs=PjqHJcfRMJNY~qJt1YYlO*;6Zy>@RYE zAuk`1$57a;)RK-S8MY_>@W_CdlZ!%Kq4X%8PEHy7s8)6O zFh|Lt^lMi_(*pTLDR0rfb77%60y&K?b|}+=QOivhM*kOEPmGcWmw9@V5MJ+u>REWc zP5hcIDZgSi)@(AyE)K<}JH3}>Si!r0C1AW!nI(7F1iBiori;u9x9zvIf zY@s=sJ|kQYmC(;X-6vEY#o%Q6i9XH5x$Xz@_-n7qYf_@RpV<+O`355Y0OPY4R#Dt& zGFq{Ub7>A$XBvrnQV34UCd1n#3uHD)lX+4LebrjT!b{6ZR=AhA^W>i%3z(`>%?d6o zlhV2GINqxwo-cyOuNIqE>q^M@+=~N z5ndrrZ`J-xP9xSjc7_W70B}YNw`L)x+6ny$-qiOs1@cg;J-x2V-J=oY|F?h%#&w+h zk@?*Tyk!oZMP)WV{+eV5-RI^|dM{~ib^JV>Xk2N@`wN*c?7|B5QB5gP=Mtjp z$Kt9NM8ZwV&fTj^u#8XOH}K}Q0e4t|8YF$=RSwNSzYshCmj-B=2U>iE9CRWL17_15 zCW3*$FN-+ujgm-aCm&?XU$;N${~>n^KGxG8cgl=|hYf&^%FQ7B6t9}xhHRH;ok8@QjUIAR1qeWFSvniU5FpA7&(nE$F zQ__^T{qV?YCpbdU`08&4j#k7hONSPVMvkgihDSmm`ilwXsxB+jlM{aG+Ztq57f-9X zK}N>mRLa8K;oIDgtj0R2OhFU}YsvDO*jmDYn>7(RdNbKfOH|MHETI}3$tTW+XL#L> zp!OWP-zK<7Yl58Z5fzo!Iv4)lL(?#T9H1o^9tV*0e=6Yhqw(CrX!erluVhKy3;CNu z+1?9qZ3&)rURdkMfP+Wl@1vv@0BoSmbLLL-=xSA$ z1q~+XpunFeE{In78GfG6k|9cPu{usN3(J$>D8VII^45DpN_H=^PR|#&<2g>G&M;-d z9J~bmdUDRGG9ltF%lF}a5_P&c(8lc3rYSQsxF%k?0bUmiw23rP!P z6S2BuH|IU>!P8g8CKO0J@16RJ@;1L$j|$=-}CUE->HekaE2QH7F!%sAQ=sNb}%LKf%;zLaqD2 zzXC^qNI2kUh>s}HXk1nB+zltUq(4044n$F$X$;zm`Ze2_h}O9J(q^CVAqh!q#GHZ> zP<|1o5yUU#oOqWx73sH}*-@9MpU%eVsgx>VcdY#)US!+5c4txFXdty`#_vrLuP(#f zUn&7`Z78tcZ2hQY-F*J}YJ|Etsp*o8F zWQGUv`CmfCdd5Bo>W!PJ(H<6NymgF)ls8SoKq)^a?4pPbh@gXDL0=%h-y?8)mgTIN zg_9zJZWYH76S>RKP*o!5bB^^|>w;`yH0iF#?bS2PVULoNyi#s!!ogfgJ$PEHF4q9XQmKVr*Y)! zzxdC8u^WOC2mCAl>3bkOhLuJ!h^I;`0?fOkj^lmP&Dj+TO9{_*Hi=cZm+tF}o z@4xf*Kcb}%FD&r{*Zt}V>yq2rBZqa#fv`6SFTC;JJ}IC)Cq_jrn#Bi`g_mL?&e+C| zFN9ul;pk?ju6cr4#>An;<*5M#31@?Jk-p2pR`x@LG=*1vu@05O6?@rQzshJt)OUIB zsq*CIpwA?9AU0t4CgYS4xA{*!JsQq$UB=(@xd~W@az_xaD!=f_D&wj;X+}xhZF;L-_su6N{ZPcTrXxSi zV_YwtuwiaSQHo}iXB=62;)Ep2@i)2@CrsIN(a+jjGJa0}I$3)oEVG}!)vMOK$v($0 z+svdXW8vWQU_If`V1>JlWIF9fx7A`CFIVU4X)XQ_km8A~v2d6YI5XY3QjaO0bto;j z?kH&UNRp_UsA~Pt!jIG(?a#ChmjuX-7mM=5Zm5;Yw7^G*A9G#%!TUnTGCU3AQtEnX zB#jU_6~u|LoG`F+n)Nj;xEev_DMJZNR$I;}YWWb}LyTo8JPK(&pXM5x?s$3eJb|uW zU3vp3rzY482+qqOTNPT|^>D|T-m%ivRlUw7zoL%#GQc_132tONy#jr7e`fA+!M;hH7c!g5C?*_BxAu0(%Tr zuJ&$huy)}6`mfUuWlrxKJlC!53&`LAaFdxEiH4o12!BAA<&T<8wIc#Y)gXb4W~gv; zpChiEO|h4gSGJse!X;{1>#0XQgZ+C4&W8QS{TLgwgEFN6h@MY6UpZD?EPLxkpTX=K zmEHB4ovRFvkI>}=S|K~2)gs=Tj->}4*57FFkL*Qc%Qg3yxN!DJ^gXjeuGLMrxP$5s z{kwaZPi6-eq5~q{*37{&hnGwLCG&_4gRb+$NJ=6CcWC|r0Oa#svHvChPVz1yHX)Bl zHP6M_RxcRo$gsI#UTY%LM2s}-SN9Iy`t9sLz-Pk%rfrch#y1q$ai_9vg~-C#;UDUl zNb1T&wz3wraWR!N)X7bx7PZ|eV6z2$&gIZckmzYS%%*?T15?R2$3;V~h2A>V`h^2T zZ|!byH##AudL)P-(H-7@0Q=OZg|gr`!vCE=q>Y+KbhcMlTlT;{Joty9+=V3Hu-Jtz zzuNT&{5LVkKY&5TBl6W{PX8m>n$Zi}?}WAYd=q{ZrT%W#E3#)%WDE=|E=4A7s~NU! zq`Prc_m@fgd89+z)8)2m!3r)6@;FCjiq^&l#mkD*hNAV@{#ICepT|)D0We@7L|yF2 z=&a6DP=^#RLl50qr_v!6w(euSRGlg&m>?&E;2^NKv*dzj!K@eRq1-afUv1_L$VEgp z75Uue$ch+u^R5#+diRB&FyZRzQp+{A4Wo=USu0;^Qn$%{jco2k(t5zHmC_pyJT35w zXf)co`%xHNDsN}$vjEHRM$9O1Xdlnpp$&-cy`Z#{Pgpc~$xG9{z&1{EVZG{UMb} zM5ngn%W+#uhSR$aPM)5l)~$BD+HX5Pas@tw{s-`fj^RdEFv zTg0OO%-V4%Fkq?2n}T5z;zJR5WfWmW%-E0##_2pYU3W#)@BthX2cB?i`l-#|W?Kg^$IO6c%Gj5MI+Y1&!JmGdabFmId0b6}~XChV!w z*rG(49_}$`k_e8R=S3vdeRUp@5pjc&Da*^MY*lHWpg&GSbJs%@mPPQrgia% zt|;^&s{fBJRE8R}p^9QOm5%_-h|4XE$e062H;jCB_yolUpz%WcLq%8`}?g5O)uJgnNx}$5?r(d(4d!aq!wNX37qD zc_bUCqH=S4<9vwC^Ag!Vd1`6D=BWtSqv%8AI}>K4i7G+v8aPueq9b!1>hQj}R=Q9e zg6?sWBblh}ruq+MFWtdAymzv6V=DJsv@;r?|F!M=ZC2!?BK_GkXZu@*Tz03g*5Kwt zXoFF=WBVJ@K?fIMS)QL*_oU^sXv9m_BFkG8na|CUe~f>CQKlqT_XY{>A23li#Lg*| z-7!|s6(r>wv9e8DjELsXGXANz^q~6-zgqB5!C*sDxlsn~(`Yq^J^TnE8DRclo&FK_ z5D-Tm{dI}e7a(#eDnFtGJO5HwRS?#NE-sy+lF>GnhHHaX!EZ;nYAYK%IreYd3rfFs zUbjdR7I%e&w=2$xyb=`rRp&>=Qox?nR)905oy0}AD%(l*f^lF-mG{*R9|U(4U)$}O zaj3=d8jqv>k^guCD9;-*GBDwK^;?k@gEVlp3PuK}OKR2+P{&fXak%brW@o9Rxj9l6 zm)FClx-o1+g$P|*^?NluN3d}H*7Tk{wK0E=^bb=rxcQ@{mG-7+t+G#1U+%zKDhiGNDdrAESE>(NJlJ?5H; z+FO}cNwOeQY|C^%536Q%a0}lIvw7BOdLN`QR*(q(;{0bH_jJp)Z)s|0u4aymg`iQj zJSE~EAnmvdyD@TEF81Uue~lL|l{(cVc59eGWG<;3TwV7_=rUjrRF5u$74MR18AaDKsE*n=pJndQIf4Y>`Rxu z9%+d3)ro9iYE^cYX-I@^3Yqd4e;K}u3^j;^CO2qlx=4IC3E`6))Z#3APv79JvBKi$ zbSeAMf?BH)$(5;~KS|#p?UWorA{KQuW?j$#52_5T0E>!_cAPj4#vIa(xpu{AeJ(o{ z5rutg#Q(mvVX^3g5hp6fWq?eER;177fB&NY#!9l-i~Bb*W!O*E@*|5cf8a%zRXpg8 zZrHIu@DV@o6!wVKy>~g^_KU@4f5RBRg5Jl%VkI+gME?N8-E^;hyjQvx^=z=Guq!Jp z?h^R_eMkpZkSzZD9{_RB8|XU}iUW5Db6W)N7$v@S5kInc>7>H`kk-^dls&&Xo6O?W z&?>X8cGela2Afvupg-f=lQqRofyj@Q&%|RG=K1GsDI-4QdVOhuT(9lvjg{N&0VO7= zUzT*ks|vnKfoH)V{F!#FRNYG^R93r6puL&&k_qW@Zqil7@&2CXshVSs9K07ppI0!P zBmo>EjZ3fD&<+~cc(ck=`sJrb+%p!|)B3v%!SKu3la+#_vG}KXjvmceg(qSeLV3M* zg0|C%b{l->$J*2co*4Bnbj}3i+j_e#w)F!uDoTeX_XL)F>EC;2U2G?~?=y9^`w`Dk zMs9@yB)Y%t%IrCOtBWtRYsA&?2Mh>e`NtaaAA|sC=WfW8-_`NgeEPwSF51FW9^30p zu)YTAocT&VFqX<{;0)pqJtvV`$MR1AaE-0AHXS)ab<+01f<>6TKH9r zv5Y!QxXo32e(|87Rd?-esu;6sT<;&Cjlfxd$W3JuYDm-0q`>7YlW76sRGq-A@pP&m zF=0kzw1CQ1{q;pS1`l%w8rWa4O8Qw*RHLP>d055K zBipw0PFUR^&84^UuoJBW*&VM07Rx}9(FARp8E`Dh#q7-Xc+1XX@=giBRl(+m* zX9w0xV-O&YepX+{3{o+2MMpD`Q4QEk& zpgYPrns|u~|EjlB?YEvkLYq@m0Fgh9*p27X zkg(li){p#%y=Cgq1#R8qu@z%^``w@N8-7XoTlkag;7V+43-J=%4ILY}>1X=yxT{3x z5zB4_OxN>Kq4qs=G8uqEEcIqA8)t4UW{V@`#*I^?TsnYM{0Jm(!lkYbLe1`$m3=joTVEj|w;jDe{5Yv6Lu7@CQW zXi*pl${~Z}0PkWb(3$acmO5>DCmi(sQ-G!eAHm;yiUkV+^*_$?C{Nco)?-+!cl-)K z+TJ5?LboQKGD2hOmIN)c1LUNA!sGNQ(;1K29#- zAOL&yRrv>iCF1qFhJCG-!w`OH25N1EXJMsv@SoO5w;@4d8s$7v@jI@?w6N0L&lRkN zRbWYVLM2SudOm&SK_QB zBY$|15FcD0X8mM*<g;Ci#U!yPH!R#xShnt<5Tr2mVBUH1Nr!aX+Y;k4f^m&ohodS~P z$?T!pPb#zxv!{3(_;}3-*wMzWr}LSAt_-9|+-T|qj%%=L!fLuEEONCAFN0FsL`>{| zxB!OChPZJq%I(s>X@r4uLOCzr!iey9cb1i;_o9vD-}C#_`f=fo!KHk_n{MqHfs>T+E> z$$SOuUvA@`_&W&A%f#H;=$_oJYN`ZM(x|R@3TjhO;6Q5PSzcN6cdG?R`L2;Sc^tPI^Xxu0AA95vZx;7 zh$FyFjVOMA=P3Auqk(zqz;4@^5*7NbcYRzt+4QlHc@Z9-{ev#eDTr*YHx=A zh?dSAsP*X0Ek0^9zFU@Y)mKdiom`v9yYIYaI+_Wc5fbv_23T_FSC2VJblj^@_N<54tx?n+H!l;PfoLaS?`Bd=a`Uo zr1pAhJfD*3!9CNq z)!`MC1)GhkqhfcVZ&;}NvFNA6ts~g(kU2iPbS-;(^1cSWlTbCe&>xIJ zsEn_iO?+z*qsoL``EoSHYSP#xS51kPA4)7A3WyWq6CxoYA#15Dr=5$RP~mA15G4JM zX1uCflT^9%9RPntf{|OznDn~L8R-Ul(bK*JH6t|h*m)rn1XKUy)>1b{=K$d{gUh52$b&J}6~4H=)M%vbEA$wY zv>XMkFYTH_@xC|wk7i8kc{A&w4Vi=H*B{`SbJkTkh%XVexT{U<(uks;H<_}1iKf}> zSutn#V4iIkvfJtW>=M;Ts{^Bc@<#-i;A1fK_H*vYB!HIL@o%Tnhjz#pdid!Mm|2eU zw)+_-;p7or*OK>J)r7oZF}%Pu!?TGi{{fJQlY=I4;1aiNih{pk^~x?Y`(B7WD*OnP%<03)uroa@Tur;) zy)F7hM%9`wlfJh-9!J^{y>ksAf2-BUcF_8E$52|BPE|X@Y|NQq8K*Dr^u6{kL=v?A z)|SfazQg<8%Aut5K~-mO5}3W&%#OeSMI6iKBhku}R{E|alNkQXL}ie+Kr<8`4PaR* z--I{ljv0Q@pLj2(xs%=7wgOG8U)c%a74T4an!H}_6zqK}+POH!H(ld*@#I?~E>AKh zjC@_mJ7fB0maJW^RVR3{B*GDMG@8@ydsb6-z_UM)&eaUBI&B`S660!nt%o)66R z$mdBRcIW5zjNiZ#^6P%{*z(8`C4V%1s@eVO0MdAe1p&(ngp2YNv^WmLCYwr0r3tJ9 z+Um69bp+ia;;Li&^7Zn~PCKwW4O(d1f&ezO(OY;zU4 zmm+?t2di}VxBFB2@%IS*X+459mPr=Je7zXaF~(o!{e4tx<*VVIz9}2mW)WD@k8@)7 zpoeOKcolOnM@Y>qHSq6dy$+Y+c*QL(!xz~{W%-|a!UVjy$7$K_m!g|{$=hiBbSYGL zwYHp&&JIBlL!S-2P`krLLSf*?hr~_2a}41m4w2zv32NjLNPK&W&<^GcRnQEH^{MaPn3YgiFu@vj)gv=7ShXIg zQNY8({q74ugop9XZ*oyozJKrxXLBnkThzAo)C{q5$%pFT-^Vs2zgJfIvFf|sMGucY zV<5o$<7B%&hIT$}AW2hZciC-8M2EaLY6O&cekU3 zu6&;94=N_n>EUBy)y;|xY@o@>D;`bF(Yj|J5IL&Gy5~Kw&TcPOFf08^9V*6;h#Jk0TIf=VK>-raMGbs^r1jHo6;U^k zQ+>uGM=09A`~xJFM_38DNi;&)6xLBkT;}oMs!lr59w@(4a+&oIL!mZ>kzvdazq^wS zAmoM!Q-e!=r{qYgk1e-{hW=7*Wypcu!7V7d(vWlop~ zuxH?5=kk3ae|0PT?9NKf9`|Abw z{}bp99vpw%UqLorAVHPGQ8F!>PL+ATYa|nYbU$;uJ&~oYd%0{%HQ*x?KLsNBRLw%O$+-Uq{y~0c;$Ncp!IJw_e4QJ#NQqjr@gS|;1hu#8@9aPKxcS%meTa}q z918%Mtcb3%AEEyMF+Eyj`9Zkmvts=0vAV2Gaa~2rV@BYpsNZ+(;d)l*&p_oWrOIA#+(x>DQu(h+GzmX2QuYAA~x1>ep@y_F>qb?U9v8!H#7 z9?bQFA61n3N^`n#uQ=TwJ!OQ^ixcFHGre6w{TBhDohu@=xZ7U!)iJWOT2ai{t(_HB zq$*Ox*CB&SXg1jS9}jl|SBAyu_HMQt{cLulBbH`Z*7;5k#Rv_lXGI{wjp^iB*HjoL zGooraqxBU`R5gh28CDY(SNQ)r0VrECmxUi>R@-P3w(sq6e)^b}WV(RDa2&dZwhrJJ zhX=`C#SJP5ieA+rCXRw6#g1H$Z!XiC&`}J9O z#~~)i6#M+t5U4xtOSVhGY+4Q8AME(+w`oX9dL*Vgo1nUn57{4H6| zHrxdkAs3;9ot946HY@dM3bw>0-tpxUp&Dme5rDWwz3TeE_p4vIj^%iWf?e4$UTa~Z z+<#l4v<1mcVweag4a*}{D=U9_`*`d}SGw@aIUCzZ-3L~$3R^qHA>{lAvs{RPDQfsT zE?N(J*V^=J1aCc%&n=hr4 zZ7ZmL?23i9h`hqRyLXzQ(J5Sq2wq`6*6=r}9NGb>@~W-9|x zbdR4_DBgBfkP5a*_*P$P^?KImw=1itG=&^0*tuBRRN)Vg+aoA5M*pfrpH+KT%UJTO zH%r**{r-u;i9#!oecQ+ww_KLf*tH)$QKC2DTWVxDSbU^6GQzTmgdFrpUn7XME+{i) zJnc4>6M&hZL5!<)Rqfi!M1og^`a$ADUm~d#4Qj?Jjtqc*ng{xhp7>)x8VGPB z7UK-8PF!T7vBU>38+)oS>>ead(6W3tPZ-#K87RGV_CfxyecgyZ7Zx(b|EF7@V+NKh=hnpgW)+md z?YAa;>=;Vq(`V%;f6Ft9qZvaxdm@)AEHaNil|XEpIRkEc#Oy{CXsP`y{0WD?wR3I8WIy$n!)OfQgUM{RayR#rggWc-K!vcwlhL2tR*Ix< z^wkM8$|Dv!BM{2^s(vpqdn?qFjAuVj=uWtTD5)qicV9vMDGEEfM2==f?tEkRmY=GY zR<35}VBoV8Ei-_A_svAWel~KbE3i(3 z%Gi|m6KBr`38)1}t3pamJ6!PUxI~XdbTfwEzf#YaY=U{RcdD>%h?pN5^!we=q*Yab zFS0wM!63`BFBQKM`)az{Kfq8NIN*)L_pZ7PaxZZICF~M|HYB)Oyie;)W};p}zR9j) z7})pThJbbZwupDMT2e;mQuJ@CKyk3O+t1>yVeH-bw`P#@`GAYG&k;~wKl%#BY~?w4 z0@nhoblVJu;54pz>7iZ}HLkiN?X+nJQ#M(my*2OTyI49F$eeMb5oA!=9Slx`78ZTf z=gNvee&(s1vV#wo8)-CiiE5LlSjwx|o+N;GRSA-D{QPJB70vJwD)+Q5I`w^XB7T?+ z_jffeXjn^MqA22*Z>kHYGOVWJY5W-0U|cyow^lYkZt7YrB9c#l5q@FOPZNvO;4`sm4{2WxcSC7L~|Z?dMj6{3$^o>-Xb*Gbr6X4(_jJnq*tWF=xQZ) zIVk-EJN>8Rn?2-t#pd9cSvavspM`M08C$4D&)*S0jADT|?yUBpqWo2ecV0tct0y+c z&1ujZcVC3zFihGqPGE?=l$*Lxl%k3W^^q#Yc z)c}k8rifYDOnaj}rBM`a3A*%c3HaBqq|>q%%TY~dlOi9=UxTqCW71`(;dQ3*^BfU@ zEpXRBQU7{AtWpA6#Aqtu29P6@twCeOz zhuzBb0~g%hq}$NP|8v>UdfieT{`?{Ax+%}(Wh*gS_*&E!d#9Op?Oku%cJmLw{ttjN zrPaGpUMk|_Mm88^!O{l%koSA4Lx~^4zMG;iQ5=B_W3YS`)3?XU^@rn`7f9S2f!>g7 z)rdeG?ICfd->)let1ba@pPeeV1b)*RrY!RC4q@hIR_fWj;Q-!Rt0xjzO=)ZE{5+3} zKjiC!jQ-oro9C|pdTp;gKl^X4$+)@_VUeD45Yojd zT_z`5drs;BB$$ym%e4}K6nDU8Wx!w9nw~B8)`DlcH zuEIoVr@Oy^<%%go7PV=5KdoFJ>blV+>aAe~$hgy`|IsjyO$@^51sE@0BAwjilZZ zZNQ>_xtl&g*YCy>|E^}w!d?2q;Hh^^$k(9Sj6c>bu;wYtROW1+?#SJGSCVN(rsq(q zTiS*SHn(Loa3Zg%do$ z=FM5qZnQG;c36oS@z=}4@|hBNz+Y)uG)D`&K>NC&pVU2?A{)L7TzeZcR{ngh zQUyZ+lwK|hf!Nx*gJzb`Jlg$VI0%Ab$F-!18aI~DoVIPC@~g4(55Aw8LO(YB15^az zKO(QC)F!?)^U)RNgJ!B}F{3AM z(r35F(?>R_Q2i!i)Xy6i=Yor?K>hi}mWW06N_6RtJ8GLP!c4jC4?TH?*3<^f{~C*d z|03Urz-%|j#b++MgHZ!GKPux37*0kp9*=DFnT_o<v< zly8DN{(B$_ey?v)T{tR$_x?W7=W`YuHCkn`5b3Ia*LTKy&RVd|RI+9k{#Xc|wWg4p z{suXOJVYMU%{COkhP(0>y$!qa}NS1$@ zyy6Mp0L!S4J0$#ev15I8@vG0r8P@>dE1=qD<+KRl)-qazY~h=EPo@6gepzo^;5(+Q z*(4uQkwG@o{jd(;mLs~I(PDaQq<&cn{?e~xR|u&%>4oq7>@jS0o=`-rket1`nPn>M z`c1D;k~p|_h9A1FdlcOoKS6)hPSjFPT~=*pQ}Af1$8`M5NzT{0 zl|f!1Pt|$K1$Vtwm(5=2s9%(k;4ad;Omqy1i4+(qRv)Yn`F)_Wt6y5QXA1)v3J}gC z-cjr<0S(rawj>+|Pg@BFeVnCMTOEju(xI^l*C)UaCB=p-dJ_%3^*YittYHt%jX{Kj zU_Q#?yE!zbgDJE|SVfw{+Z68$wLqcWaEQ4ey6cNVv}u)GSEV9NQT&uO8QY~uJPxoN zLRJg-2hhPAkV_6+GzOTR^yR2%oD%s@v0|n`$r=lfc-oq>9Q{q`Q=sl^(W3FB;RiCd zt6Xza!Ah*-p`@+~8JdX-QQsT=rP*6gQ@)$4oC(|)jn^3OdbD1mY6`GqmUe0UiT8Qe z$34a%mz`;%#C(_YLv8Vphm1ligxHBu(tLkq_8$|lsIR;|RKY~+XjX)26JbkvVjHkN*7J*jvp7tj(O zlijH(9H)oZ>uo!QgmI4nm8LY-C?#QqMIK+NP)inrUn&F|=Ct_~EbXK#ODB{B3yuYW z5_;A&O(_IxmV{RxKMS$rqc;Mx8?Ub91dILEEhbvWy#4|DqlKudhJ?N(Ka<4u8`<)$ zhfwhkN{d4UqAv{|1U$+}m4y5j>QchSZqIV~VAcx6={A}ZSlF?j!{FNlO93SnJHNL;Z<~+Ee^1ta&3iM!R|O(GS6b$T3Y% z4a?FgY*g`z43jfv=uZu4L-NvEqQme~aGyZ?QfLAOM&QG~aMd#93Ol?qc<$jDY`+9{G&# zQv=M|QJ*L~<+p1`%GX2TZaOvm7c<+5Q~%|DrHFg-xTY$9|b;W6MPo76JOH-#I zkg~&j3t@90X-ua)-(GV%gY?0UM5VAe0XGfRj;s_oHP=wGD8>47Tbdc`kFN2vZ+C>M zqS*Q~yNRubYHB59hNXkEiQF;)Xj)uR~>#UT8!;dFCCrvL4Oo+9NMVNvL&l?l};V|i7A@Z(FVSZp-S zG+Tld2H|KXM>7Js1QV|&!%{{$hwU!THSlb3&fML8!yR$HK~+_Y-PvaG73rdL%+`=- z+A&)+duyISj*ovdIGckZ(aex#)aBE6get1+*s=o3&%aDINESdoklb9h=?4_!i`JXNq4}0tY`>=y zP#e2`x&s(SfC^q7;2F4$FtE=R{Y-rZX>OLkzU0d>e>7`d4()xGy;d+iYu~665k7nu zrxgvl9YD1|FFRCbD}h-fpzC2~Vm)%2@F1qCBBS3|6(+47d~#I%qg8{%AKLNuF+0YB z3`Z9?ed9T1J{O!oFOZdl&4m|*x)?rKLhE)s17A2nm?rf|H zPWy>bRfAXyfLW0Tne4oA0bLPX)k!Sk!_?Mqce?|(3Pdb%+ksu@VH@^nj9j|wYE&sH zHg_^GJo-lKjz`XWE*&=rTIXDEQo`-a-;$r7P}%lJUhMpYNX$H3%#H?K>x4-(4>m=d zWY@kuT2Fx5rEP*v$*?1S5YHufGtHV!2bGu=X+T}2g4#j3G82Ifu|4f5?QB>NXV7ES z3~dt>mQ33!LW&`L0NT2nRTaRS?MDEwSL|kU=+?!KE@>h)>($;RwT_5uwlu8b3y;Wy z<8~d_t{eM}$~u6eZE73__&SxVkCcu^NcE88-`~Hz$t7+*b0i*gIvDjIq{nPPlovDg zg1%PW1X8k^r#8dDbhisiWW1@Il*)OdUck?doekHSOo&v>Vk9o({@1bdO@kA@g18}C z8CE5S_jjqtA`mC)AsB@I(~Z53ft3>P2TT_{i<7@Wk2APw;D@Jkj}XfGpKxHGXq6q> zwzPD#;f{-eh!ybU1haACq+cNh%&2?fqUw}BkF2vfC%$OiI1&lFp<+xC6 zzpF}v0wEP0;;!`IEh;W1ZECL68+~70P$C18YX5RAdxu+IpjeewUdGL2K>8tX%fM8T zM87b9F}9PQRQTvKtjzGtgs6OFHqjfSS)V& z9ZSol{H65F$p_|gP)XK0J7|yRr_YD{@-wk0J^G#@SY|HglIyS;TP*1FhP$fwo=ClQ zrk(#lE9vM;P8)b1`I04d>TW=`TWG8`A$!jt9`{kSZ{+;g&`krP2#L#IAPTLnT@}Ck zecBtcID{A!G_v2QRd)vVRyx~_u_+0Y0oJC`#u;01$Upl|XR2vR$WU#JkxKamZXTzd znuo5Rh8OY@2omSs&~a^|u#+ov+Q0WmmQ1FI_B<6sCipTMXAK|z@Qc+xm)B_x#n;og zjx!LWuA=z`yoSovH~6#WA5-E9kO5GvN|#1 z99y7UpJn%W20B50S+W4bJ=*d)AanLvDZJZkE{pD$iGkn%k9Ee!RHWx7>gE!|VEFX;C)W@44*Of1s|0WvnpC6 z%f2DqHPrUkF|1(YmW{VBUti9;DQTh4RcUkAe`aqHfpK@G&n6aF{L~-qi~>Iq{EcXH z$!T-wPc?mLGdOLhwkxRR3@|*30LAgTli}BoExK9YL4p4OO;G;;AZr@UC^LLKTbj2+ z6*XHJE(9{&z$ZLxG5~YwUPIja7_`-kH+R;lgp%So*}4XBGfC<@+i~6!kj<~^IXjX& zXi5+=4(5|Q{{X;6ci@$iJef^FD^7_<%%hGWS&Xxed~!ky^i;x-PxN>J<8kLEOG6@2%vtIYBt!L zoHfO~7d|}Hrj8A5xCDt5Upfbkfk4{@ws^Ljq5wV*(7)uZe@kdCoYhISyxEOIR+g*X+*E zE0WSgGV8(QRx`3{#m95tkzFJTde8^ZKMYzZv@JVtEYSimGu-C5sxNrC{P?kt-K@uYj#=z$o$mD=Jb4kY9nYr^_9y#%oMe?SH zR)G{o?qZkMdE|d1T@<9YJlstdmp@I9G3#5LKt%w4fVse~V$sF?S%y20hx*iV{of~W z`hp1kK&dSrL8VV)4wGf}&6zN%04_-wu6ZYOz71Pbdr563c!{=9ul?3tr}C(G>TMf6 ziDcCDm@b4qQ^??FDIV-llVX&TIsX6_-h|aWKdM^BXIL)Oh`_-l5OMle)bzd1TFaW& zKB7k6io<|LaBFjgkEVotBNdukq=lFfjs`32>c!tf#*FS^UEGx{BOhO-VI*`$CVNiO zvaIaP2g zD3nc=lys4L{VR^99UinD(A&Fv9TEUR+dQF?IiHibDLi}N6UU`z?37UFB@>0Y@w7Ld z3BI^_Ry|4>Ofo`F3d(+5f$5W)!Mmf8;!~#IQ<3;{XePb0SiwM1o@p52RYA)!J%C(( zHH%kd;T4i++zM+`#vZLe9Nxdb>KZu|U6an#`zi}<> zqG==|C{$n`;11opf1WGBb(40stnF#V-o_49#|^!-q-1S| z=YQZnQBbhzD((IT>k!{h#Em{8+yzOOPH18wTXn(N!wif8obU}_u(Pv&aW4^dqWj4F zcdbjWcs=eF?GM?cNr#jhp2TN8aM{7f6|E@7GqKHCxkBeb;0<02Uk+QD;YVplm|HzK z9e*QErB@j=j%dS~CU?3{qL;9#5P&-JFma!+(zK_Ha(t}HR1|eQ4!>bPHa+k5Y5xF_ zUb+7OU8Da1&|1DriGPVt(Vt0>{1f#@v)9a?_)q~r1ps)*?JfTRAiWR%yGj25psjs3 z4Sy1+qC5=y;D@U`627$gvx>0!S#ij(&5yrEjD&CCP%)P&ybRDIqwrp^`UQ=})y=%O zdRde#sS)|3Y;eQa@(h$u+njj&bZs$c+0`snYFW9NasLpM9=d+#|(0M4B+$h ztRYcCqHNlvU05^4u5G2Za+9G}{K5Jj_39o=MF~d~n8<>R6H+tSue^7!YPN7%-`*Lc zgzjC#l6^_<_|{64Q9jw4`X|Ki6KK{+X=8q(1kTiWm9d{pjL_*I_N<2E$GYv_p)KUI z+xgOv&5Lx$10Ix}D6y)t9VVZDt00Y>vyql^gP*|Qab9IgvF5q#(!9e(K!c&}TP zJ&0`OOG4eQ$yIO^o!Qz(XtQW(tEPHZnQ8WG*zM+WH^=2EW0t@t zpKOwNu1!+2J!+CtmohN?LGbeGSz23L`;w#`hYpAie^?)E%+nBq8qv6y*_DZ z%7#4PHPA%%jT|+WDEUpM7 zlG*QFy$?M*GVQcW9teJO$iU=Nu%zyIzvEbx8;I{f&F=+Ft*tUja26oh^c%UTnY|aO z=@ILZiN&?Oyw0S3^BVv^5-Kjy)f+Z9QPkn{#B!qrUzD<`IQ)UB)s*cOxy5*T5`)T)^QEKEC zE~!3SjErWuGRm=~R?ll1)`ixB+`?B=OW}Jy)rF!Kp@)>jkav-c?ij~jgx9->#zK@E zPVD84Cgd)i36Ada<*#RzZVHhEj0!`A!3oAjdYqHZIykshf|GV(DsC-|ymfiWUPdvR z`TWYHYSp}UJ1Ixq)VHT5*h_zS*RPdBmX-UQ^`&_iE7USLn|Z%-gPxeKxX$J_&{mja zfWsrGt&<_2G5Gs!myNDwf+k4X>4(jMxG)6%q>sY999<2x=^a5li&XU)n8MW;w36epL63e)Z-ehMDfpwzAMyktTlZ;&11KQ(;j@A zj_DAvTn;@?HP-7lCl%1cl02#3Q-%0Zpjr64UbwK-B$7Dcgv*FX1-SzmAmgnOcXkGk zMF;Mhz-7p~f<*vd@aKTFJHHZG>-QSH%W2VNjj3W|F@(m#GwKg&0LHZNCXKCXw^tX8 zzG*BrFv_Z*Y|sULV@R;j)LYp$Vmf>c^A%&;;#}ywC@Lwwx!J7^B@G@3@S6)=0CWwVzp7k{he7>Zo?} zxZ~WOX)z+Kvi|^R=oi-SC9GP4%jQ7hKpBYs6Y2haDWMVgj{Y4=Nf3aO{hc?)4l>Ek ze>OjrNYOrlBovNYren0YjtK1*SjNvbQ07md9lo_G+d_(_f3}y7?lT?g4Cgq_D~)PZ z@g0=c+FQqOaMtoGEP=*X{EEpvNvCAS9d*`(afl^I}9Ui=gE zuaCp#)F)Z2Vo9g&yLq1FTpdVKQlQw=Cg~@o->V|nEMNBtzLVJiv(M767DY=>{#*lKt8+=QhM{rqi1FZx!U{~zZw(Y zUHF1&^%sP@1}wvooE*15$k)WniDMePkffAv{d7HuU}DvrozE1tx70Ncv+3Ghv2!R` z$~D20C=^eZJCDiq*5ov)Jx*e+@2|cV%Y;Qr&89B$96_2|Gr>HjHGhNgw2a zpVp~Tw5mHM?ei&8lN&;;#dq#vb{-G$BG|&ZOwdcR=%kA*IW2$)WjN;t zBd1(@*P(`|?P8+ctd0z9)FS0=Q$6wswA11ETqI2rfa`z=2eB2;X{wy36zbDhe`zPF zyrdO|4J-XHqy(ektbxorB`2uD@r0qBb@O@5mfNEnVwcNGK2`?ka z(?g#`@fEVji?y?sM##xbfu4sTfvg3l&+cWch8f z+W!DQ(|O$9%7<%5!tNnQPUDII%ZA@h(k`CoWNX+87OfISj_ z5NP_Yn;rL&4dU96vdGbfF%kzLp5ICU+@A8%>%-t$6eacq1mI+_$I^g0JtEO;bjxdG zEXx`N1e~0GXaZZo{)spHjr^zs^H)Q(xVfHHw~u*P$!}qhKd2v#Ly}vU2ug0zK92pJ z{5LA;dY-rxiRLEW*pbiy$^8ESm0>q_bW>JV?lZ+&4x-m@9sZRy+_Ev-G}lhVdxcSt zz#7HMM{FS%sya^vcyCzJ^b5J}CYsM;7LEpO#*HxmBy zhQ)QW&RP=~*h!XPYHn9uPfL4oA;99k#h)CCbJ!ijZ#k*4T-HaTcyCIN!@3{#jlzSd zPQSWRGGjyE9;f+zY9%YaRk4Hjw>;~`I^ERn%3Yap#w%9R*wT$PCUgFFZ4r=_B>c|D zB%eX;T(gt8=&EsA5x<&*NzTW@?Z?eox6r8Afo@hzAq0SMKBK?tY9Dh{T=QJSUvlmz zfu6N#n8{rFXy}%jbg1LzNl%kDv?T}4xrH1=DlSFt`ksC9 zGey-bwTJR;!SiD-@+mk7I}&1OECo%NovA`QE&x&I&a7S5xe2^p7;*elJG>(6rgEQA*otcC&_Px9!_1 z(v^)3pm^Tc*BgLSVzfQ4_CwS3+i!+#d8h9C zRn+J0WwZC!fChVDj-It;p5s6m$He+*A2h&K@-shZk3IOws#@xLC9>K{xT}y);<)}* z$&8DPH9KgmWn-(Zcs|2mvfibbj|lcZV%79 z8_DOI-i=n4hBc^0PVAS&RzLA9x3}{ERYEsst_>6?@3{sdm+sO!KY?)n0A~2Q-tI!i z2vN(N=NUo=>P2_ce$sY4+VJ*t&!a!#E3qdE82&Zc>>qQ__JhZX?L5GRSQ0bTdS;Jc z?R$r`Fuo#x$i4pnZI}AjEcQKYulWA}Bg|_f=+2pZYpQ?%`#uLB>i+=x^?dB}f3oO# znA*OjKC5^3i>;n!(7zzSz^QKMWeO3Y9!P8^lc>+7-V2*uo?ueHFv!87I|X_%uO3P4 zZT|qmZL5FNzy16F0PEFrvyb~OhndV&9+Byv4nO1o{{Z#fzmnFl*!j%Y_{-D$&Fxc9 zhf=ljE(?U*8{{}S6&2`4ym=+D>iJ!XKx9e&_!CAK_eo*;ISK>*QheI(}!L z*UlbUtEKDLnr*Ry+sfEjx6HXY{{SMpC}V0+k0dQ)dUfYbS|aLt_2#8*b2v^J6I}WCsA3MHO63f%i#?;s3q=sAKxG0UqrI1Hr<|@!PE0LG_5)vGT6ax zT%ls$ImyrY7286DXh)J88`Gw#t0VK+*!eKDaTStv$Cx91!H(>Y@+os%v!j<;eO`Nq zF!`48s-#$bgf`p*)PE4~pVG7B9O0hxSl9Paz`g6cC&3D;BEvF&$T$T zosrWQ%@0F!Tk$QHj=VdWl3 zKAFdU)e5UxSh-N@naKE>{@VWlS-rTpxJcD)jkE}GOsx6jdSd|o6erE7r2Ujy>d!u$ zSYF30SF(g?+@b`VkjI_CaxvFDcKo(ij;P@|IHLybBi>i%3%mo7&skqae#0R={{Sj}+9YzaMbp^zQTbH5$T=GyC8T!onJ09K0Lf<{0Z}YMTa_9u z?1ovjo#V1vT|qOiEU4g-{&7&TDeTL1B^}XlY3I_Pw-ThqT{x4#CmnH8@d*~F%b*)r zkm1Uy{{U#?`POe1ms3TCo9Jk3S8`d|d9dx>xDG~Z#l+Q>D04*V#ME@*%@YUve)s;F zf8RCd{d%vF!S&jPMR6R3`yEo^$`cejHj}&N8Lo<0nbKUbH>Zf5HOmma)ow2#@}}9h zIpAWQTukc6mO)b!I*XP?3g$31#=m#~AG-elzH77V)qIY>uGBYlOSvy>%(HFW9IwhT z*jJ&2t17VOk==%?Dv;)pm*f3r>q5|e*<XAMmVnFZt_z{{Vki{{V@j*u+293|D3M zKl2axRyr5_^}hcAzpMWM#L?_xAL|AyviqO;oLc-!*Ofw#vS18{{S=N4L3o&ztg6< zwOF161<49dRDI^ppsTirkd?>jaYS`{SmKa70<9TLs4vC=&!Or)jwpI;X+|njH?FUI zX>X{fmG+{9k%lXdJ%uNBv^!Pe&q%z|JVU5>Hs10pms__&S~X%nQBdO}Yo?69hMpVo z6ne3_xsd}S51vUJxd*N~f%x^N(=$=F=HJG97-Q2lX{{Y%a9^^u&Zb3O6v9~py z75mFGJXi49)!#^Pd9PAT`P5L1oz(~#@~AmAsoYAdxm1D<)5_FH=%()*7jAxZP&xrn zQ0pr@YlD)-Bpt_kS7@aa$h9(B?Gf0yMdLk%HG2uIPht32_PXYXkYB1h*tQ~&oHFOP z(y*H4dL5MQIGMk+HI#PNULR#YHtEJau$8VETIVh`X%od7x{d-m0Qb*=Uj{VK7I<81 z-XgfU@~$1y+6#6G!jh$!;FHK80gj#X#7b7t9&RrgDstq3q2a%R_WF0m-8#?DH##H` z9ZW3P-gY=q8)Jj>vJ!E~sdM*E%(B1MwUX6teM)&1f$knrU`}r6D02`|ItdFZlx#s@> z96k)`egp8-I=+#rUCa%_!0_FaCAR`WQlNClOn)k>5k!2`rcTT+i#Zt0B1JI@?hs9an3;MF`j4x+-L$D+gp3B zIG_(v_*tO;0Kzly@595C?NJ_?|P$BNzL*edO;Vw1H&-NWef(@;%LSVli^9B`E1*vkild7`V$@oo9n%jKw^y zlW?uHll{}r^!+Q=!r~ozcYC9Tt{G6BqtxkZq=KZ{jifipXDsNKF1wWp!6T4Ak^HJ$ zl6GuqHm+pNX=|oQs9er(E?fzP#b(S>O##;Qp-r(3T(n7e4v;yxocH+rSr z{nCiwxSZ?^aLhU`N2bsR;ptvBGMt>9Pw6g)J$yAt$J)s1ei-PZQn%EvW#Se?YYF$@ zmj3|IaroC(UxQMmCqK2J6k%m^S@gJK(umXuw7d(H|ZuS<&rFy^=0pR}t4t_aHdE)(F!`~4Gm!aKS zxr!MVbWxX9A=TN~f!L0NueDP^9}&JeNoV5iBg6jy4#t3ZeW(}<>!?v^m@z#^j~0DF_vbo4YO+z)uE0H66V3R_slk#jvJ4 zV5w3G&Tw))>w(Hr_+El-Eg6w_eJI+S6{8&#E;Cz3n%}7j9UsFx3!Qt#2G%nniC}qV z2ml*KFa|*x&e58u1eNS-N8>%dOCJ$w{tkg8)E-?=o_1jE{v6{x;<@TwG|}k6bZ0T5 zU-+N$8le7`Q-cMMK*{593>d8KZI%MPPS&F)g%%pIUY&V#5t zkHWC)spj=Q+LBKy7k`)K1pLPUW7PJqNYMDJ;@61d@h^(6F5>{HkjAX6NM#%Y`2PSZ z0OD8W9DXK%EZ9Pq7bqrWjZg6tKpoO}ZuZj9NER$@CwrffLH=fdIjFRWC%*Dxo!(+{ zSIZy~KpOWJX2ViTcv9gW0;&^X+RSmmKJ)?f7l7n@eHJ8;d2CpcigE{Ty-%)a1C9Np z>^z?v+RhgVac(4Ij-^Q-;aqajowQx!W6f=gKA{T4*elbH^*6FQp&PvqO0>JWgG|`7 zK^Z)55fVr1{VNR{*zUBuomYiCW#RoN!xwrq_V+h-Q!IkwMqIpwkIZrSo|Vx~c6yjp zq?%1Ku9@Ol{P7L7%y(93phDLORzjHLaUD3%MebpHSxX!rLVTkHy0^cW{6@Z1e{9ER_Q^cK^#JKN)Y_bGMCsptVY$vNhLC%-zK z)RS8cHqJ{k^5%K|`1Qb3KoZ+{e@V8LCW^w{B}0(gbAvz}zl|?o)I39_X=y5ADTB<# zfC_Rr&#p81iU95l6F|oT0H6kwlRzH}$6l&FZI`UhB~SN-Q`pTvc^_u@b|1BAFBFJl zXxj=@_6vZ25zpgaIUQ3+*wy&1bB(7*W2?=1bsff`Br0AwM!;Et7y~#S{G4%6ot~zN zb1e=ZT82B%5!}rJvQ8iGx`M6`IT$(bj?}JHp`f~*tWnv*FI6Q5RoXUmInI0fQO#|L zj1!UKdW)>Lw-PFaR*{$i&;o1esmGQHKF7t@l9fqGb!^X*y*4V+b2+h9Gvy&2v@5I6+Q3AD}EFmI^ic{{X==JRPRXsOmP$X2jeHFaYBNoc6ScKUJDI~lGRyxo>ng#1v|N1 zx8hw|)_WPQY^~BD50t0)Kpg=801EQ4ICn<8p!YpoC3RkcoK6DH<784R09lU> zjA!tyTvKFoTSKC^({3*`i6geUn$J{4V$4QAcaS#o_0Q+)UHCjYuP$5JoS2MCpsyo~ z@s^jX>o;$48B4vP5wR&Q84*t3$^+Uk?8O$Af>qe~_%@ zx$Iy+h4VbFZ-@3erPe%IKBuhhC(E8&u>??`RE{E>Pi*pi>&~O>?fayy_n%JT7P;K+ z{_n_TzJuT&3cc8C8!K>BX7cscV#lr(r6l9mwROrK;%VyoE{7#VrsWpe{`Q}R?sImt z=r>+8(Ldn^hA8JUyWUA-AC&~Q;aD+nfJVo2AQ;KcE0YwGr1}0s!z)QfF7K=I`Dl8j zc&Drs0myt-iQmCjGes1Vy{z{4J7ZGKwI)Kx1JQRH+Yj;Ez5f6s8vg(V`&;ukJu_Ih zl_R;ayivGiSziX6smW;3Dshs!X8pg3?_f}5nkiHMngRUADqumc0DD5)i>Fbshy-{2 zKD2UrtUy(*NQv^pr_Bh6`P z(BQR8TM1(zsNDYmz;To7gW9;1-OoeWLB$BVb)D7Bvhf=;XBgyuAmXV`&rweg8C{h; z6KHMxbE`(%aUHlt1G4WJAEk6o{D|_~T<+T%z96`>yOMDX>E|l0(f-oz{{R}eQCqTI zTPBenk>Tj?yeP10H|uKiHZT);A2-&jq~jN2AsIzXKNR#)tb9PWT|yr-56h#KN(B#wAT7z6{HgWO~sQ8#NYhP0A*eNDd(XkHhO#L!$vG;t(5q(qgMX=A_x zJxy$+w7B^qozbz&)nG)vPY6cOoavP(t?ewo~;1+-1 zNq)>5dY#yQ8}9%~_ve}bhfK4ZP}FU$EkGr&CbLC{CKHi5Bvp3XIB=GH5PPo$Vq_w+DI`SBO*Hh7y_fk0qnMS9E4b<1R*ADW1 zgGz6;yPvxr2sqEH5CHcy37wzp<*v`9{7UI%oHr_?SaGQgCrw1aprB%|GG)?H%l^JtH%Krd_OHcm&$Nly{!n!`aQ^@Q7(yioR zj}>Yl06dOA*#7|Q*I(4Bo&NyY)O^mP!&mcaI(toVw|J1R$}lm3{x!jgr5aP^iRI%c z#*I!`_8sC&>9p-T&$rvZcwd-gW12A3)k*TmSUNGSQ zerKuun@7ytUkT~uK`(L0{`mg@3gvj}o<|eRt6!n7rRnhLw#Ex`Gu4=Vi zSIr}mwP{wDG>?UBd^2};9!pEhUy*#$<(X72dV`Ak_W2`r&l%N8>X|N?qTfSylU!rp7(B?MG@4P*x%4T~BfmYhGfxCg}Uz+pI_UL-57tqr2ABHTo8!K7li_E#TK3m5lowz6O zU{}ykoU37N7iSZOr|zoz%J&=MTXoTV2`sRniDX#bMGN=9Y-2u{KZSEp#Y%Nklhri8 z1G*F=N}k)@{{WHYcGvoqw}u|pSl7sR7g02T?#jO1zT@XVt$OoZ@o{GyB;zZV{7vHh zR`X02vdtlj3IS|=(z#M`)a~P(`i^<1r|kWjQHoOP`~Lu!$aOuZw3BVP^j*KNGmM@W zw^Ugbm6&cIjD0G}UC!gfm#o$|7Fu~|?&g7H+`J9ZfT{rXIOe=uRJmmt)qd)B`}I8u zB`9*!TC|_tp}(r$T8|3o*73=*>Q>!5zwr{?Nv?L2lWA>p2|FXRzrGejQkjV<3`per z0CQdNPn9NAw{|?=O4ggiX7%sp-x46$C1Zqk&I*CwgZO5n5kF^Sj=U8GSxWn&-;8aq zq=F@eM~)bj0ypgivH6N%@$-N{r&Xu1t{O9q z`HU@9b%Cq8tg|3TE3h^P997el6m>DL3bU2E8XC2w+}*e_>&-?!8g|CK%3PDPqPD$#~7}r>~KO3ZqYo8!@6FXd;PU{saz~l zTS6p(OrbZv>|l2%9+e*d057|_rI$9RxL!2E;k>Y=eY*buI`qzQ$g`ey0Ke@T1Y3qB zAhVF543aZ}_|Qu@PZ9h`(zN@Qx6{zyFeE&Q!h`HjU&5C0}$4tD3k7dCpdmeQ<~F_l&(OyG{@fI1%^czS&sNwBw5B1JeV z--l`drQm%E8@*!AH@7k@Oowuj#tw2v9Gqi;^`H-+5wHS|!xRCvpyb|1>6!ri`X@BT zAv6Gh;N%<;&S(SJ^bZ;|ej2yA*YxSHYyR~=m*kH-DE|O-htKn6{{SEA*BW1fHCy{7ji-(*F7@2Juu@3x z!8PW$Xx#Pa!A_!!K4g~C)=bMR5fTUSC^!PR`J|qQxf)QC)g3p&E6YgyR?^El#~g7x zvVch=ze?VWA2r#IBHWHKJx58l(?8)Py8AQ{!7KdYL4)QibCK+8rC#

L#hDxzg)9 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 z9761scI

srZjkyzwQ@w3jnMdo+c^#^e+olpjDaKMMJ3 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%0DL6sck1H#8Mp?+Nb+8w!3SGXh+PL_Zbp%KGyQnE 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 BsTBYK literal 0 HcmV?d00001 diff --git a/assets/js/14.d239147b.js b/assets/js/14.d239147b.js new file mode 100644 index 000000000..a15beab3c --- /dev/null +++ b/assets/js/14.d239147b.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[14,21],{275:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return a})),n.d(e,"i",(function(){return s})),n.d(e,"f",(function(){return c})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return l})),n.d(e,"b",(function(){return d})),n.d(e,"e",(function(){return p})),n.d(e,"k",(function(){return f})),n.d(e,"l",(function(){return h})),n.d(e,"c",(function(){return m})),n.d(e,"j",(function(){return b}));n(114),n(16),n(25),n(61),n(40);const i=/#.*$/,r=/\.(md|html)$/,a=/\/$/,s=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(i,"").replace(r,"")}function c(t){return s.test(t)}function u(t){return/^mailto:/.test(t)}function l(t){return/^tel:/.test(t)}function d(t){if(c(t))return t;const e=t.match(i),n=e?e[0]:"",r=o(t);return a.test(r)?t:r+".html"+n}function p(t,e){const n=decodeURIComponent(t.hash),r=function(t){const e=t.match(i);if(e)return e[0]}(e);if(r&&n!==r)return!1;return o(t.path)===o(e)}function f(t,e,n){if(c(e))return{type:"external",path:e};n&&(e=function(t,e,n){const i=t.charAt(0);if("/"===i)return t;if("?"===i||"#"===i)return e+t;const r=e.split("/");n&&r[r.length-1]||r.pop();const a=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,i,r=1){if("string"==typeof e)return f(n,e,i);if(Array.isArray(e))return Object.assign(f(n,e[0],i),{title:e[1]});{const a=e.children||[];return 0===a.length&&e.path?Object.assign(f(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:a.map(e=>t(e,n,i,r+1)),collapsable:!1!==e.collapsable}}}(t,r,n)):[]}return[]}function g(t){const e=m(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function m(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function b(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},281:function(t,e,n){},282:function(t,e){t.exports=function(t){return null==t}},288:function(t,e,n){"use strict";n(281)},294:function(t,e,n){"use strict";n.r(e);var i=n(282),r=n.n(i),a=n(275),s={name:"PageEdit",computed:{lastUpdated(){return this.$page.lastUpdated},lastUpdatedText(){return"string"==typeof this.$themeLocaleConfig.lastUpdated?this.$themeLocaleConfig.lastUpdated:"string"==typeof this.$site.themeConfig.lastUpdated?this.$site.themeConfig.lastUpdated:"Last Updated"},editLink(){const t=r()(this.$page.frontmatter.editLink)?this.$site.themeConfig.editLinks:this.$page.frontmatter.editLink,{repo:e,docsDir:n="",docsBranch:i="master",docsRepo:a=e}=this.$site.themeConfig;return"string"==typeof t?t:t&&a&&this.$page.relativePath?this.createEditLink(e,a,n,i,this.$page.relativePath):null},editLinkText(){return this.$themeLocaleConfig.editLinkText||this.$site.themeConfig.editLinkText||"Edit this page"}},methods:{createEditLink(t,e,n,i,r){if(/bitbucket.org/.test(e)){return e.replace(a.a,"")+"/src"+`/${i}/`+(n?n.replace(a.a,"")+"/":"")+r+`?mode=edit&spa=0&at=${i}&fileviewer=file-view-default`}if(/gitlab.com/.test(e)){return e.replace(a.a,"")+"/-/edit"+`/${i}/`+(n?n.replace(a.a,"")+"/":"")+r}return(a.i.test(e)?e:"https://github.com/"+e).replace(a.a,"")+"/edit"+`/${i}/`+(n?n.replace(a.a,"")+"/":"")+r}}},o=(n(288),n(24)),c=Object(o.a)(s,(function(){var t=this,e=t._self._c;return e("footer",{staticClass:"page-edit"},[t.editLink?e("div",{staticClass:"edit-link"},[e("a",{attrs:{href:t.editLink,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.editLinkText))]),t._v(" "),e("OutboundLink")],1):t._e(),t._v(" "),t.lastUpdated?e("div",{staticClass:"last-updated"},[e("span",{staticClass:"prefix"},[t._v(t._s(t.lastUpdatedText)+":")]),t._v(" "),e("span",{staticClass:"time"},[t._v(t._s(t.lastUpdated))])]):t._e()])}),[],!1,null,null,null);e.default=c.exports},339:function(t,e,n){},410:function(t,e,n){"use strict";n(339)},506:function(t,e,n){"use strict";n.r(e);var i={components:{PageEdit:n(294).default}},r=(n(410),n(24)),a=Object(r.a)(i,(function(){var t=this,e=t._self._c;return e("main",{staticClass:"page"},[t._t("top"),t._v(" "),e("div",{staticClass:"theme-default-content",staticStyle:{"padding-bottom":"0px"}},[e("h1",[t._v(t._s(t.$page.frontmatter.title))]),t._v(" "),e("NewsPostMeta",{attrs:{date:t.$page.frontmatter.date}})],1),t._v(" "),e("Content",{staticClass:"theme-default-content",staticStyle:{"padding-top":"0px"}}),t._v(" "),e("PageEdit"),t._v(" "),t._t("bottom")],2)}),[],!1,null,"22624a70",null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/19.1c7f3cdf.js b/assets/js/19.1c7f3cdf.js new file mode 100644 index 000000000..409b78907 --- /dev/null +++ b/assets/js/19.1c7f3cdf.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{340:function(t,e,n){},411:function(t,e,n){"use strict";n(340)},412:function(t,e,n){t.exports=function(){"use strict";var t=6e4,e=36e5,n="millisecond",r="second",s="minute",i="hour",u="day",a="week",o="month",c="quarter",f="year",h="date",l="Invalid Date",d=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,$=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,v={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(t){var e=["th","st","nd","rd"],n=t%100;return"["+t+(e[(n-20)%10]||e[n]||e[0])+"]"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:""+Array(e+1-r.length).join(n)+t},D={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),s=n%60;return(e<=0?"+":"-")+m(r,2,"0")+":"+m(s,2,"0")},m:function t(e,n){if(e.date()1)return t(u[0])}else{var a=e.name;g[a]=e,s=a}return!r&&s&&(M=s),s||!r&&M},O=function(t,e){if(y(t))return t.clone();var n="object"==typeof e?e:{};return n.date=t,n.args=arguments,new b(n)},w=D;w.l=S,w.i=y,w.w=function(t,e){return O(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var b=function(){function v(t){this.$L=S(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[p]=!0}var m=v.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(w.u(e))return new Date;if(e instanceof Date)return new Date(e);if("string"==typeof e&&!/Z$/i.test(e)){var r=e.match(d);if(r){var s=r[2]-1||0,i=(r[7]||"0").substring(0,3);return n?new Date(Date.UTC(r[1],s,r[3]||1,r[4]||0,r[5]||0,r[6]||0,i)):new Date(r[1],s,r[3]||1,r[4]||0,r[5]||0,r[6]||0,i)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return w},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=O(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return O(t)({contributors:o.a})},t=(n(397),n(24)),s=Object(t.a)(i,(function(){var a=this,e=a._self._c;return e("div",a._l(a.contributors,(function(n,r){return e("a",{staticClass:"contributor",style:"background-position: "+100*r/(a.contributors.length-1)+"% 0",attrs:{href:"https://github.com/"+n}},[a._v("\n "+a._s(n)+"\n ")])})),0)}),[],!1,null,"074475b8",null);e.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/24.2547ea08.js b/assets/js/24.2547ea08.js new file mode 100644 index 000000000..eda91b945 --- /dev/null +++ b/assets/js/24.2547ea08.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{336:function(t,s,i){},406:function(t,s,i){"use strict";i(336)},407:function(t,s,i){t.exports=i.p+"assets/img/hero-image.b1edbb72.svg"},558:function(t,s,i){"use strict";i.r(s);i(406);var e=i(24),n=Object(e.a)({},(function(){var t=this._self._c;return t("div",{staticClass:"hero-section"},[t("div",{staticClass:"section-content"},[t("img",{staticClass:"hero-image",attrs:{src:i(407)}}),this._v(" "),t("div",{staticClass:"section-content-wrapper"},[this._t("default")],2)])])}),[],!1,null,"37c67372",null);s.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/26.4f21deb9.js b/assets/js/26.4f21deb9.js new file mode 100644 index 000000000..69ca81a5e --- /dev/null +++ b/assets/js/26.4f21deb9.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{328:function(t,s,n){},396:function(t,s,n){"use strict";n(328)},498:function(t,s,n){"use strict";n.r(s);var i={props:{side:{type:String}}},e=(n(396),n(24)),c=Object(e.a)(i,(function(){return(0,this._self._c)("div",{staticClass:"column",class:this.side},[this._t("default")],2)}),[],!1,null,"71066fea",null);s.default=c.exports}}]); \ No newline at end of file diff --git a/assets/js/27.1927cbbb.js b/assets/js/27.1927cbbb.js new file mode 100644 index 000000000..e435b4117 --- /dev/null +++ b/assets/js/27.1927cbbb.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{327:function(t,n,s){},395:function(t,n,s){"use strict";s(327)},554:function(t,n,s){"use strict";s.r(n);s(395);var u=s(24),c=Object(u.a)({},(function(){return(0,this._self._c)("div",{staticClass:"columns"},[this._t("default")],2)}),[],!1,null,"6d930324",null);n.default=c.exports}}]); \ No newline at end of file diff --git a/assets/js/29.7ab70007.js b/assets/js/29.7ab70007.js new file mode 100644 index 000000000..31b130855 --- /dev/null +++ b/assets/js/29.7ab70007.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{332:function(t,s,n){},402:function(t,s,n){"use strict";n(332)},501:function(t,s,n){"use strict";n.r(s);var c={props:{type:{type:String}}},i=(n(402),n(24)),e=Object(i.a)(c,(function(){return(0,this._self._c)("div",{staticClass:"column",class:this.type},[this._t("default")],2)}),[],!1,null,"f7c18a96",null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/30.494f3f73.js b/assets/js/30.494f3f73.js new file mode 100644 index 000000000..8c4e2b626 --- /dev/null +++ b/assets/js/30.494f3f73.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{333:function(t,n,s){},403:function(t,n,s){"use strict";s(333)},556:function(t,n,s){"use strict";s.r(n);s(403);var u=s(24),c=Object(u.a)({},(function(){return(0,this._self._c)("div",{staticClass:"footer-columns"},[this._t("default")],2)}),[],!1,null,"de1d7950",null);n.default=c.exports}}]); \ No newline at end of file diff --git a/assets/js/32.d0b77cdc.js b/assets/js/32.d0b77cdc.js new file mode 100644 index 000000000..559a7bbcc --- /dev/null +++ b/assets/js/32.d0b77cdc.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{335:function(t,n,s){},405:function(t,n,s){"use strict";s(335)},557:function(t,n,s){"use strict";s.r(n);s(405);var e=s(24),i=Object(e.a)({},(function(){var t=this._self._c;return t("main",{staticClass:"homepage"},[this._t("top"),this._v(" "),t("Content"),this._v(" "),this._t("bottom")],2)}),[],!1,null,"07ee638e",null);n.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/45.38b67184.js b/assets/js/45.38b67184.js new file mode 100644 index 000000000..866f424bc --- /dev/null +++ b/assets/js/45.38b67184.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[45],{514:function(e,t,o){"use strict";o.r(t);var a=o(24),i=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"contributor-covenant-code-of-conduct"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#contributor-covenant-code-of-conduct"}},[e._v("#")]),e._v(" Contributor Covenant Code of Conduct")]),e._v(" "),t("h3",{attrs:{id:"our-pledge"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#our-pledge"}},[e._v("#")]),e._v(" Our Pledge")]),e._v(" "),t("p",[e._v("We commit to creating and maintaining an open and welcoming environment. We, as contributors and maintainers, commit to building a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.")]),e._v(" "),t("h3",{attrs:{id:"our-standards"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#our-standards"}},[e._v("#")]),e._v(" Our Standards")]),e._v(" "),t("p",[t("strong",[e._v("Behaviour that contributes to creating a positive environment include")]),e._v(":")]),e._v(" "),t("ul",[t("li",[e._v("Using welcoming and inclusive language\n"),t("ul",[t("li",[e._v("Consider when identity words like race or ethnicity matter")]),e._v(" "),t("li",[e._v("Be conscious of language with discriminatory connotations (e.g. gendered, ableist, racialized phrases)")]),e._v(" "),t("li",[e._v("Be open to being corrected if you make a mistake - it’s okay to mess up, what matters is your follow up")])])]),e._v(" "),t("li",[e._v("Gracefully accepting constructive criticism")]),e._v(" "),t("li",[e._v("Showing empathy towards other community members")]),e._v(" "),t("li",[e._v("Treat other community members and project team members with respect")]),e._v(" "),t("li",[e._v("Report if you witness harassment or wrongdoing in our spaces")])]),e._v(" "),t("p",[t("strong",[e._v("Unacceptable behaviour by participants include")]),e._v(":")]),e._v(" "),t("ul",[t("li",[e._v("The use of sexualized language or imagery and unwelcome sexual attention or advances")]),e._v(" "),t("li",[e._v("Trolling, insulting/derogatory comments, and personal or political attacks")]),e._v(" "),t("li",[e._v("Public or private harassment")]),e._v(" "),t("li",[e._v("Publishing others' private information, such as a physical or electronic address, without explicit permission")]),e._v(" "),t("li",[e._v("Other conduct which could reasonably be considered inappropriate in a professional setting")])]),e._v(" "),t("h3",{attrs:{id:"our-responsibilities"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#our-responsibilities"}},[e._v("#")]),e._v(" Our Responsibilities")]),e._v(" "),t("p",[e._v("Project maintainers are responsible for clarifying the standards of acceptable behaviour and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behaviour.")]),e._v(" "),t("p",[e._v("Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.")]),e._v(" "),t("h3",{attrs:{id:"scope"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#scope"}},[e._v("#")]),e._v(" Scope")]),e._v(" "),t("p",[e._v("The goal of this Code of Conduct is to set standards and expectations around how we interact within this community. It’s scope applies to all project participants and covers all interactions within the community associated with this project including, but not limited to, email communication, issue trackers, source code repositories, forums, and social media.")]),e._v(" "),t("p",[e._v("Examples of representing a project or community include:")]),e._v(" "),t("ul",[t("li",[e._v("Using an official project e-mail address")]),e._v(" "),t("li",[e._v("Posting via an official social media account")]),e._v(" "),t("li",[e._v("Acting as an appointed representative at an online or offline event")])]),e._v(" "),t("p",[e._v("Representation of a project may be further defined and clarified by project maintainers.")]),e._v(" "),t("h3",{attrs:{id:"enforcement"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#enforcement"}},[e._v("#")]),e._v(" Enforcement")]),e._v(" "),t("p",[e._v("We will not tolerate abuse, harassment, or any other unacceptable behaviour made against community members, project maintainers, or members of our project team, either online or offline.")]),e._v(" "),t("p",[e._v("Violations of our Code of Conduct may be reported by contacting the project team at "),t("a",{attrs:{href:"mailto:ajv.validator@gmail.com"}},[e._v("ajv.validator@gmail.com")]),e._v(". The project team will review and investigate all complaints, to the best of our ability, and will respond in a way that it deems appropriate to the circumstances.")]),e._v(" "),t("p",[e._v("Reports of violations will be investigated in a respectful, professional manner as promptly and confidentially as possible. We will have zero tolerance for intimidation or retaliation against anyone who raises a concern, makes a report or cooperates in an investigation around a violation of our code of conduct. Further details of specific enforcement policies may be posted separately.")]),e._v(" "),t("p",[e._v("Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions or removal as determined by other members of the project's leadership.")]),e._v(" "),t("h3",{attrs:{id:"attribution"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#attribution"}},[e._v("#")]),e._v(" Attribution")]),e._v(" "),t("p",[e._v("This Code of Conduct is adapted from the "),t("a",{attrs:{href:"https://www.contributor-covenant.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("Contributor Covenant"),t("OutboundLink")],1),e._v(", version 1.4,\navailable at "),t("a",{attrs:{href:"https://www.contributor-covenant.org/version/1/4/code-of-conduct.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://www.contributor-covenant.org/version/1/4/code-of-conduct.html"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("For answers to common questions about this code of conduct, see\n"),t("a",{attrs:{href:"https://www.contributor-covenant.org/faq",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://www.contributor-covenant.org/faq"),t("OutboundLink")],1)])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/46.452b30ba.js b/assets/js/46.452b30ba.js new file mode 100644 index 000000000..da4e67536 --- /dev/null +++ b/assets/js/46.452b30ba.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[46],{515:function(t,e,s){"use strict";s.r(e);var a=s(24),n=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"code-generation-design"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#code-generation-design"}},[t._v("#")]),t._v(" Code generation design")]),t._v(" "),e("p"),e("div",{staticClass:"table-of-contents"},[e("ul",[e("li",[e("a",{attrs:{href:"#safe-code-generation"}},[t._v("Safe code generation")])]),e("li",[e("a",{attrs:{href:"#code-optimization"}},[t._v("Code optimization")])]),e("li",[e("a",{attrs:{href:"#user-defined-keywords"}},[t._v("User-defined keywords")])])])]),e("p"),t._v(" "),e("p",[t._v("Starting from v7 Ajv uses "),e("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/compile/codegen/index.ts",target:"_blank",rel:"noopener noreferrer"}},[t._v("CodeGen module"),e("OutboundLink")],1),t._v(" that replaced "),e("a",{attrs:{href:"https://github.com/olado/dot",target:"_blank",rel:"noopener noreferrer"}},[t._v("doT"),e("OutboundLink")],1),t._v(" templates used earlier.")]),t._v(" "),e("p",[t._v("The motivations for this change:")]),t._v(" "),e("ul",[e("li",[t._v("doT templates were difficult to maintain and to change, particularly for the occasional contributors.")]),t._v(" "),e("li",[t._v("they discouraged modularity within validation keywords code and also led to implicit dependencies between different parts of code.")]),t._v(" "),e("li",[t._v("they had risks of remote code execution in case untrusted schemas were used, even though all identified issues were patched.")]),t._v(" "),e("li",[t._v("ES6 template literals that are now widely supported offer a great alternative to both ASTs and to plain string concatenation - this option was not available when Ajv started.")])]),t._v(" "),e("h2",{attrs:{id:"safe-code-generation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#safe-code-generation"}},[t._v("#")]),t._v(" Safe code generation")]),t._v(" "),e("p",[t._v("CodeGen module defines two tagged templates that should be passed to all code generation methods and used in other tagged templates:")]),t._v(" "),e("ul",[e("li",[e("code",[t._v("_")]),t._v(" - to create instances of private _Code class that will not be escaped when used in code or other tagged templates.")]),t._v(" "),e("li",[e("code",[t._v("str")]),t._v(" - to create code for string expressions.")])]),t._v(" "),e("p",[t._v("For example, this code:")]),t._v(" "),e("div",{staticClass:"language-typescript extra-class"},[e("pre",{pre:!0,attrs:{class:"language-typescript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" x "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Name is a subclass of _Code that can be safely used in code - it only allows valid identifiers")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// gen.const creates a unique variable name with the prefix "num".')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" num"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Name "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" gen"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("const")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"num"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ngen"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("if")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// _`...` returns the instance of _Code with safe interpolation of `num` and `x`.")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// if `x` was a string, it would be inserted into code as a quoted string value rather than as a code fragment,")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// so if `x` contained some code, it would not be executed.")]),t._v("\n _"),e("span",{pre:!0,attrs:{class:"token template-string"}},[e("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),e("span",{pre:!0,attrs:{class:"token interpolation"}},[e("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("num"),e("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v(" > ")]),e("span",{pre:!0,attrs:{class:"token interpolation"}},[e("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("x"),e("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),e("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"greater"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"smaller or equal"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("comparison"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// msg creates a string expression with concatenation - see generated code below")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// type Code = _Code | Name, _Code can only be constructed with template literals")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" msg"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Code "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" str"),e("span",{pre:!0,attrs:{class:"token template-string"}},[e("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),e("span",{pre:!0,attrs:{class:"token interpolation"}},[e("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("num"),e("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v(" is ")]),e("span",{pre:!0,attrs:{class:"token interpolation"}},[e("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("comparison"),e("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v(" than ")]),e("span",{pre:!0,attrs:{class:"token interpolation"}},[e("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("x"),e("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),e("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// msg is _Code instance, so it will be inserted via another template without quotes")]),t._v("\n gen"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("code")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("_"),e("span",{pre:!0,attrs:{class:"token template-string"}},[e("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("console.log(")]),e("span",{pre:!0,attrs:{class:"token interpolation"}},[e("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("msg"),e("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("generates this javascript code:")]),t._v(" "),e("div",{staticClass:"language-javascript extra-class"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" num0 "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("num0 "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("num0 "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('" is greater than 0"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("num0 "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('" is smaller or equal than 0"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[e("code",[t._v(".const")]),t._v(", "),e("code",[t._v(".if")]),t._v(" and "),e("code",[t._v(".code")]),t._v(" above are methods of CodeGen class that generate code inside class instance "),e("code",[t._v("gen")]),t._v(" - see "),e("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/compile/codegen/index.ts",target:"_blank",rel:"noopener noreferrer"}},[t._v("source code"),e("OutboundLink")],1),t._v(" for all available methods and "),e("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/spec/codegen.spec.ts",target:"_blank",rel:"noopener noreferrer"}},[t._v("tests"),e("OutboundLink")],1),t._v(" for other code generation examples.")]),t._v(" "),e("p",[t._v("These methods only accept instances of private class "),e("code",[t._v("_Code")]),t._v(", other values will be rejected by Typescript compiler - the risk to pass unsafe string is mitigated on type level.")]),t._v(" "),e("p",[t._v("If a string variable were used in "),e("code",[t._v("_")]),t._v(" template literal, its value would be safely wrapped in quotes - in many cases it is quite useful, as it allows to inject values that can be either string or number via the same template. In the worst case, the generated code could be invalid, but it will prevent the risk of code execution that attacker could pass via untrusted schema as a string value that should be inserted in code (e.g., instead of a number). Also see the comment in the example.")]),t._v(" "),e("h2",{attrs:{id:"code-optimization"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#code-optimization"}},[t._v("#")]),t._v(" Code optimization")]),t._v(" "),e("p",[t._v("CodeGen class generates code trees and performs several optimizations before the code is rendered:")]),t._v(" "),e("ol",[e("li",[t._v("removes empty and unreachable branches (e.g. "),e("code",[t._v("else")]),t._v(" branch after "),e("code",[t._v("if(true)")]),t._v(", etc.).")]),t._v(" "),e("li",[t._v("removes unused variable declarations.")]),t._v(" "),e("li",[t._v('replaces variables that are used only once and assigned expressions that are explicitly marked as "constant" (i.e. having referential transparency) with the expressions themselves.')])]),t._v(" "),e("div",{staticClass:"custom-block warning"},[e("p",{staticClass:"custom-block-title"},[t._v("Optimizations assume no side effects")]),t._v(" "),e("p",[t._v("These optimizations assume that the expressions in "),e("code",[t._v("if")]),t._v(" conditions, "),e("code",[t._v("for")]),t._v(" statement headers and assigned expressions are free of any side effects - this is the case for all pre-defined validation keywords.")])]),t._v(" "),e("p",[t._v("See "),e("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/spec/codegen.spec.ts",target:"_blank",rel:"noopener noreferrer"}},[t._v("these tests"),e("OutboundLink")],1),t._v(" for examples.")]),t._v(" "),e("p",[t._v("By default Ajv does 1-pass optimization - based on the test suite it reduces the code size by 10.5% and the number of tree nodes by 16.7% (TODO benchmark the validation time). The second optimization pass changes it by less than 0.1%, so you won't need it unless you have really complex schemas or if you generate standalone code and want it to pass relevant eslint rules.")]),t._v(" "),e("p",[t._v("Optimization mode can be changed with "),e("RouterLink",{attrs:{to:"/api.html#options"}},[t._v("options")]),t._v(":")],1),t._v(" "),e("ul",[e("li",[e("code",[t._v("{code: {optimize: false}}")]),t._v(" - to disable (e.g., when schema compilation time is more important),")]),t._v(" "),e("li",[e("code",[t._v("{code: {optimize: 2}}")]),t._v(" - 2-pass optimization.")])]),t._v(" "),e("h2",{attrs:{id:"user-defined-keywords"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#user-defined-keywords"}},[t._v("#")]),t._v(" User-defined keywords")]),t._v(" "),e("p",[t._v("While tagged template literals wrap passed strings based on their run-time values, CodeGen class methods rely on types to ensure safety of passed parameters - there is no run-time checks that the passed value is an instance of _Code class.")]),t._v(" "),e("p",[t._v("It is strongly recommended to define additional keywords only with Typescript - using plain JavaScript would still allow passing unsafe strings to code generation methods.")]),t._v(" "),e("div",{staticClass:"custom-block warning"},[e("p",{staticClass:"custom-block-title"},[t._v("Optimization and side-effects")]),t._v(" "),e("p",[t._v("If your user-defined keywords need to have side-effects that are removed by optimization (see above), you may need to disable it.")])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/47.e3997d4d.js b/assets/js/47.e3997d4d.js new file mode 100644 index 000000000..07ed570e8 --- /dev/null +++ b/assets/js/47.e3997d4d.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[47],{513:function(e,t,o){"use strict";o.r(t);var a=o(24),r=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"type-coercion-rules"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#type-coercion-rules"}},[e._v("#")]),e._v(" Type coercion rules")]),e._v(" "),t("p",[e._v("To enable type coercion pass option "),t("code",[e._v("coerceTypes")]),e._v(" to Ajv with "),t("code",[e._v("true")]),e._v(" or "),t("code",[e._v("array")]),e._v(" (it is "),t("code",[e._v("false")]),e._v(" by default). See "),t("RouterLink",{attrs:{to:"/guide/modifying-data.html#coercing-data-types"}},[e._v("example")]),e._v(".")],1),e._v(" "),t("p",[e._v("The coercion rules are different from JavaScript:")]),e._v(" "),t("ul",[t("li",[e._v("to validate user input as expected")]),e._v(" "),t("li",[e._v("to have the coercion reversible")]),e._v(" "),t("li",[e._v("to correctly validate cases where different types are required in subschemas (e.g., in "),t("code",[e._v("anyOf")]),e._v(").")])]),e._v(" "),t("p",[e._v("Type coercion only happens if there is "),t("code",[e._v("type")]),e._v(" keyword and if without coercion the validation would have failed. If coercion to the required type succeeds then the validation continues to other keywords, otherwise the validation fails.")]),e._v(" "),t("p",[e._v("If there are multiple types allowed in "),t("code",[e._v("type")]),e._v(" keyword the coercion will only happen if none of the types match the data and some of the scalar types are present (coercion to/from "),t("code",[e._v("object")]),e._v("/"),t("code",[e._v("array")]),e._v(" is not possible). In this case the validating function will try coercing the data to each type in order until some of them succeeds.")]),e._v(" "),t("p",[e._v("Application of these rules can have some unexpected consequences. Ajv may coerce the same value multiple times (this is why coercion reversibility is required) as needed at different points in the schema. This is particularly evident when using "),t("code",[e._v("oneOf")]),e._v(", which must test all of the subschemas. Ajv will coerce the type for each subschema, possibly resulting in unexpected failure if it can coerce to match more than one of the subschemas. Even if it succeeds, Ajv will not backtrack, so you'll get the type of the final coercion even if that's not the one that allowed the data to pass validation. If possible, structure your schema with "),t("code",[e._v("anyOf")]),e._v(", which won't validate subsequent subschemas as soon as it encounters one subschema that matches.")]),e._v(" "),t("p",[e._v("Possible type coercions:")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("from type →"),t("br"),e._v("to type ↓")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("string")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("number")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("boolean")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("null")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("array*")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("string")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("-")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("x")]),e._v("→"),t("code",[e._v('""+x')])]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("false")]),e._v("→"),t("code",[e._v('"false"')]),t("br"),t("code",[e._v("true")]),e._v("→"),t("code",[e._v('"true"')])]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("null")]),e._v("→"),t("code",[e._v('""')])]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("[x]")]),e._v("→"),t("code",[e._v("x")])])]),e._v(" "),t("tr",[t("td",[e._v("number /"),t("br"),e._v("integer")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("Valid number /"),t("br"),e._v("integer: "),t("code",[e._v("x")]),e._v("→"),t("code",[e._v("+x")]),t("br")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("-")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("false")]),e._v("→"),t("code",[e._v("0")]),t("br"),t("code",[e._v("true")]),e._v("→"),t("code",[e._v("1")])]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("null")]),e._v("→"),t("code",[e._v("0")])]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("[x]")]),e._v("→"),t("code",[e._v("x")])])]),e._v(" "),t("tr",[t("td",[e._v("boolean")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v('"false"')]),e._v("→"),t("code",[e._v("false")]),t("br"),t("code",[e._v('"true"')]),e._v("→"),t("code",[e._v("true")]),t("br"),t("code",[e._v('"abc"')]),e._v("⇸"),t("br"),t("code",[e._v('""')]),e._v("⇸")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("0")]),e._v("→"),t("code",[e._v("false")]),t("br"),t("code",[e._v("1")]),e._v("→"),t("code",[e._v("true")]),t("br"),t("code",[e._v("x")]),e._v("⇸")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("-")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("null")]),e._v("→"),t("code",[e._v("false")])]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("[false]")]),e._v("→"),t("code",[e._v("false")]),t("br"),t("code",[e._v("[true]")]),e._v("→"),t("code",[e._v("true")])])]),e._v(" "),t("tr",[t("td",[e._v("null")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v('""')]),e._v("→"),t("code",[e._v("null")]),t("br"),t("code",[e._v('"null"')]),e._v("⇸"),t("br"),t("code",[e._v('"abc"')]),e._v("⇸")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("0")]),e._v("→"),t("code",[e._v("null")]),t("br"),t("code",[e._v("x")]),e._v("⇸")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("false")]),e._v("→"),t("code",[e._v("null")]),t("br"),t("code",[e._v("true")]),e._v("⇸")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("-")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("[null]")]),e._v("→"),t("code",[e._v("null")])])]),e._v(" "),t("tr",[t("td",[e._v("array*")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("x")]),e._v("→"),t("code",[e._v("[x]")])]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("x")]),e._v("→"),t("code",[e._v("[x]")])]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("false")]),e._v("→"),t("code",[e._v("[false]")]),t("br"),t("code",[e._v("true")]),e._v("→"),t("code",[e._v("[true]")])]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("null")]),e._v("→"),t("code",[e._v("[null]")])]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("-")])])])]),e._v(" "),t("p",[e._v("* Requires option "),t("code",[e._v('{coerceTypes: "array"}')])]),e._v(" "),t("h2",{attrs:{id:"coercion-from-string-values"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#coercion-from-string-values"}},[e._v("#")]),e._v(" Coercion from string values")]),e._v(" "),t("h4",{attrs:{id:"to-number-type"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#to-number-type"}},[e._v("#")]),e._v(" To number type")]),e._v(" "),t("p",[e._v("Coercion to "),t("code",[e._v("number")]),e._v(" is possible if the string is a valid number, "),t("code",[e._v("+data")]),e._v(" is used.")]),e._v(" "),t("h4",{attrs:{id:"to-integer-type"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#to-integer-type"}},[e._v("#")]),e._v(" To integer type")]),e._v(" "),t("p",[e._v("Coercion to "),t("code",[e._v("integer")]),e._v(" is possible if the string is a valid number without fractional part ("),t("code",[e._v("data % 1 === 0")]),e._v(").")]),e._v(" "),t("h4",{attrs:{id:"to-boolean-type"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#to-boolean-type"}},[e._v("#")]),e._v(" To boolean type")]),e._v(" "),t("p",[e._v("Unlike JavaScript, only these strings can be coerced to "),t("code",[e._v("boolean")]),e._v(":")]),e._v(" "),t("ul",[t("li",[t("code",[e._v('"true"')]),e._v(" -> "),t("code",[e._v("true")])]),e._v(" "),t("li",[t("code",[e._v('"false"')]),e._v(" -> "),t("code",[e._v("false")])])]),e._v(" "),t("h4",{attrs:{id:"to-null-type"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#to-null-type"}},[e._v("#")]),e._v(" To null type")]),e._v(" "),t("p",[e._v("Empty string is coerced to "),t("code",[e._v("null")]),e._v(", other strings can't be coerced.")]),e._v(" "),t("h2",{attrs:{id:"coercion-from-number-values"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#coercion-from-number-values"}},[e._v("#")]),e._v(" Coercion from number values")]),e._v(" "),t("h4",{attrs:{id:"to-string-type"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#to-string-type"}},[e._v("#")]),e._v(" To string type")]),e._v(" "),t("p",[e._v("Always possible, "),t("code",[e._v("'' + data")]),e._v(" is used")]),e._v(" "),t("h4",{attrs:{id:"to-boolean-type-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#to-boolean-type-2"}},[e._v("#")]),e._v(" To boolean type")]),e._v(" "),t("p",[e._v("Unlike JavaScript, only these numbers can be coerced to "),t("code",[e._v("boolean")]),e._v(":")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("1")]),e._v(" -> "),t("code",[e._v("true")])]),e._v(" "),t("li",[t("code",[e._v("0")]),e._v(" -> "),t("code",[e._v("false")])])]),e._v(" "),t("h4",{attrs:{id:"to-null-type-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#to-null-type-2"}},[e._v("#")]),e._v(" To null type")]),e._v(" "),t("p",[t("code",[e._v("0")]),e._v(" coerces to "),t("code",[e._v("null")]),e._v(", other numbers can't be coerced.")]),e._v(" "),t("h2",{attrs:{id:"coercion-from-boolean-values"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#coercion-from-boolean-values"}},[e._v("#")]),e._v(" Coercion from boolean values")]),e._v(" "),t("h4",{attrs:{id:"to-string-type-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#to-string-type-2"}},[e._v("#")]),e._v(" To string type")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("true")]),e._v(" -> "),t("code",[e._v('"true"')])]),e._v(" "),t("li",[t("code",[e._v("false")]),e._v(" -> "),t("code",[e._v('"false"')])])]),e._v(" "),t("h4",{attrs:{id:"to-number-integer-types"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#to-number-integer-types"}},[e._v("#")]),e._v(" To number/integer types")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("true")]),e._v(" -> "),t("code",[e._v("1")])]),e._v(" "),t("li",[t("code",[e._v("false")]),e._v(" -> "),t("code",[e._v("0")])])]),e._v(" "),t("h4",{attrs:{id:"to-null-type-3"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#to-null-type-3"}},[e._v("#")]),e._v(" To null type")]),e._v(" "),t("p",[t("code",[e._v("false")]),e._v(" coerces to "),t("code",[e._v("null")]),e._v(", "),t("code",[e._v("true")]),e._v(" can't be coerced.")]),e._v(" "),t("h2",{attrs:{id:"coercion-from-null"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#coercion-from-null"}},[e._v("#")]),e._v(" Coercion from null")]),e._v(" "),t("h4",{attrs:{id:"to-string-type-3"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#to-string-type-3"}},[e._v("#")]),e._v(" To string type")]),e._v(" "),t("p",[t("code",[e._v("null")]),e._v(" coerces to the empty string.")]),e._v(" "),t("h4",{attrs:{id:"to-number-integer-types-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#to-number-integer-types-2"}},[e._v("#")]),e._v(" To number/integer types")]),e._v(" "),t("p",[t("code",[e._v("null")]),e._v(" coerces to "),t("code",[e._v("0")])]),e._v(" "),t("h4",{attrs:{id:"to-boolean-type-3"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#to-boolean-type-3"}},[e._v("#")]),e._v(" To boolean type")]),e._v(" "),t("p",[t("code",[e._v("null")]),e._v(" coerces to "),t("code",[e._v("false")])]),e._v(" "),t("h2",{attrs:{id:"coercion-to-and-from-array"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#coercion-to-and-from-array"}},[e._v("#")]),e._v(" Coercion to and from array")]),e._v(" "),t("p",[e._v("These coercions require that the option "),t("code",[e._v("coerceTypes")]),e._v(" is "),t("code",[e._v('"array"')]),e._v(".")]),e._v(" "),t("p",[e._v("If a scalar data is present and array is required, Ajv wraps scalar data in an array.")]),e._v(" "),t("p",[e._v("If an array with one item is present and a scalar is required, Ajv coerces array into its item.")]),e._v(" "),t("ul",[t("li",[t("code",[e._v('"foo"')]),e._v(" -> "),t("code",[e._v('[ "foo" ]')])]),e._v(" "),t("li",[t("code",[e._v('[ "foo" ]')]),e._v(" -> "),t("code",[e._v('"foo"')])])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/48.a6fa3c8a.js b/assets/js/48.a6fa3c8a.js new file mode 100644 index 000000000..cc63b1901 --- /dev/null +++ b/assets/js/48.a6fa3c8a.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[48],{517:function(e,t,a){"use strict";a.r(t);var r=a(24),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"code-components"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#code-components"}},[e._v("#")]),e._v(" Code components")]),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#ajv-classes"}},[e._v("Ajv classes")])]),t("li",[t("a",{attrs:{href:"#schema-compilation"}},[e._v("Schema compilation")])]),t("li",[t("a",{attrs:{href:"#other-components"}},[e._v("Other components")])])])]),t("p"),e._v(" "),t("h2",{attrs:{id:"ajv-classes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ajv-classes"}},[e._v("#")]),e._v(" Ajv classes")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/core.ts",target:"_blank",rel:"noopener noreferrer"}},[e._v("lib/core.ts"),t("OutboundLink")],1),e._v(" - core Ajv class without any keywords. All Ajv methods for managing schemas and extensions are defined in this class.")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/ajv.ts",target:"_blank",rel:"noopener noreferrer"}},[e._v("lib/ajv.ts"),t("OutboundLink")],1),e._v(" - subclass of Ajv core with JSON Schema draft-07 keywords.")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/2019.ts",target:"_blank",rel:"noopener noreferrer"}},[e._v("lib/2019.ts"),t("OutboundLink")],1),e._v(" - subclass of Ajv core with JSON Schema draft-2019-09 keywords.")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/jtd.ts",target:"_blank",rel:"noopener noreferrer"}},[e._v("lib/jtd.ts"),t("OutboundLink")],1),e._v(" - subclass of Ajv core with JSON Type Definition support.")]),e._v(" "),t("h2",{attrs:{id:"schema-compilation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#schema-compilation"}},[e._v("#")]),e._v(" Schema compilation")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/compile",target:"_blank",rel:"noopener noreferrer"}},[e._v("lib/compile"),t("OutboundLink")],1),e._v(" - code for schema compilation")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/compile/index.ts",target:"_blank",rel:"noopener noreferrer"}},[e._v("lib/compile/index.ts"),t("OutboundLink")],1),e._v(" - the main recursive function code for schema compilation, functions for reference resolution, the interface for schema compilation context ("),t("code",[e._v("SchemaCxt")]),e._v(").")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/compile/context.ts",target:"_blank",rel:"noopener noreferrer"}},[e._v("lib/compile/context.ts"),t("OutboundLink")],1),e._v(" - the class for keyword code generation "),t("code",[e._v("KeywordCxt")]),e._v(". All pre-defined keywords and user-defined keywords that use "),t("code",[e._v("code")]),e._v(" function are passed an instance of this class.")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/compile/rules.ts",target:"_blank",rel:"noopener noreferrer"}},[e._v("lib/compile/rules.ts"),t("OutboundLink")],1),e._v(" - data structure to store references to all all keyword definitions that were added to Ajv instance, organised by data type.")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/compile/subschema.ts",target:"_blank",rel:"noopener noreferrer"}},[e._v("lib/compile/subschema.ts"),t("OutboundLink")],1),e._v(" - creates schema context ("),t("code",[e._v("SchemaCxt")]),e._v(") to generate code for subschemas - used by all applicator keywords in "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/vocabularies/applicator",target:"_blank",rel:"noopener noreferrer"}},[e._v("lib/vocabularies/applicator"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/compile/codegen",target:"_blank",rel:"noopener noreferrer"}},[e._v("lib/compile/codegen"),t("OutboundLink")],1),e._v(" - the api for "),t("RouterLink",{attrs:{to:"/codegen.html"}},[e._v("code generation")]),e._v(".")],1),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/compile/validate",target:"_blank",rel:"noopener noreferrer"}},[e._v("lib/compile/validate"),t("OutboundLink")],1),e._v(" - code to iterate the schema to generate code of validation function.")]),e._v(" "),t("h2",{attrs:{id:"other-components"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#other-components"}},[e._v("#")]),e._v(" Other components")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/standalone",target:"_blank",rel:"noopener noreferrer"}},[e._v("lib/standalone"),t("OutboundLink")],1),e._v(" - module to generate "),t("RouterLink",{attrs:{to:"/standalone.html"}},[e._v("standalone validation code")]),e._v(".")],1),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/vocabularies",target:"_blank",rel:"noopener noreferrer"}},[e._v("lib/vocabularies"),t("OutboundLink")],1),e._v(" - pre-defined validation keywords.")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/refs",target:"_blank",rel:"noopener noreferrer"}},[e._v("lib/refs"),t("OutboundLink")],1),e._v(" - JSON Schema meta-schemas.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/49.633e50de.js b/assets/js/49.633e50de.js new file mode 100644 index 000000000..9b12abb0c --- /dev/null +++ b/assets/js/49.633e50de.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[49],{518:function(e,t,a){"use strict";a.r(t);var s=a(24),i=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"contributing-guide"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#contributing-guide"}},[e._v("#")]),e._v(" Contributing guide")]),e._v(" "),t("p",[e._v("Thank you for your help making Ajv better! Every contribution is appreciated. There are many areas where you can contribute.")]),e._v(" "),t("p",[e._v("More than 100 people contributed to Ajv, and we would love to have you join the development. We welcome implementing new features that will benefit many users and ideas to improve our documentation.")]),e._v(" "),t("p",[e._v("At Ajv, we are committed to creating more equitable and inclusive spaces for our community and team members to contribute to discussions that affect both this project and our ongoing work in the open source ecosystem.")]),e._v(" "),t("p",[e._v("We strive to create an environment of respect and healthy discourse by setting standards for our interactions and we expect it from all members of our community - from long term project member to first time visitor. For more information, review our "),t("RouterLink",{attrs:{to:"/CODE_OF_CONDUCT.html"}},[e._v("code of conduct")]),e._v(" and values.")],1),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Submit issue first")]),e._v(" "),t("p",[e._v("If you plan to implement a new feature or some other change please create an issue first, to make sure that your work is not lost.")])]),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#documentation"}},[e._v("Documentation")])]),t("li",[t("a",{attrs:{href:"#issues"}},[e._v("Issues")]),t("ul",[t("li",[t("a",{attrs:{href:"#bug-reports"}},[e._v("Bug reports")])]),t("li",[t("a",{attrs:{href:"#security-vulnerabilities"}},[e._v("Security vulnerabilities")])]),t("li",[t("a",{attrs:{href:"#change-proposals"}},[e._v("Change proposals")])]),t("li",[t("a",{attrs:{href:"#browser-and-compatibility-issues"}},[e._v("Browser and compatibility issues")])]),t("li",[t("a",{attrs:{href:"#installation-and-dependency-issues"}},[e._v("Installation and dependency issues")])]),t("li",[t("a",{attrs:{href:"#using-json-schema-standard"}},[e._v("Using JSON Schema standard")])]),t("li",[t("a",{attrs:{href:"#ajv-usage-questions"}},[e._v("Ajv usage questions")])])])]),t("li",[t("a",{attrs:{href:"#code"}},[e._v("Code")]),t("ul",[t("li",[t("a",{attrs:{href:"#how-we-make-decisions"}},[e._v("How we make decisions")])]),t("li",[t("a",{attrs:{href:"#development"}},[e._v("Development")])]),t("li",[t("a",{attrs:{href:"#pull-requests"}},[e._v("Pull requests")])]),t("li",[t("a",{attrs:{href:"#contributions-license"}},[e._v("Contributions license")])])])])])]),t("p"),e._v(" "),t("h2",{attrs:{id:"documentation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#documentation"}},[e._v("#")]),e._v(" Documentation")]),e._v(" "),t("p",[e._v("Ajv has a lot of features and maintaining documentation takes time. If anything is unclear, or could be explained better, we appreciate the time you spend correcting or clarifying it.")]),e._v(" "),t("p",[e._v("There is a link in the bottom of each website page to quickly edit it.")]),e._v(" "),t("h2",{attrs:{id:"issues"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#issues"}},[e._v("#")]),e._v(" Issues")]),e._v(" "),t("p",[e._v("Before submitting the issue:")]),e._v(" "),t("ul",[t("li",[e._v("Search the existing issues")]),e._v(" "),t("li",[e._v("Review "),t("RouterLink",{attrs:{to:"/faq.html"}},[e._v("Frequently Asked Questions")]),e._v(".")],1),e._v(" "),t("li",[e._v("Provide all the relevant information, reducing both your schema and data to the smallest possible size when they still have the issue.")])]),e._v(" "),t("p",[e._v("We value simplicity - simplifying the example that shows the issue makes it more valuable for other users. This process helps us reduce situations where an error is occurring due to incorrect usage rather than a bug.")]),e._v(" "),t("h3",{attrs:{id:"bug-reports"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bug-reports"}},[e._v("#")]),e._v(" Bug reports")]),e._v(" "),t("p",[e._v("Please make sure to include the following information in the issue:")]),e._v(" "),t("ol",[t("li",[e._v("What version of Ajv are you using?")]),e._v(" "),t("li",[e._v("Does the issue happen if you use the latest version?")]),e._v(" "),t("li",[e._v("Ajv "),t("a",{attrs:{href:"./options"}},[e._v("options object")])]),e._v(" "),t("li",[e._v("Schema and the data you are validating (please make it as small as possible to reproduce the issue).")]),e._v(" "),t("li",[e._v("Your code sample (please use "),t("code",[e._v("options")]),e._v(", "),t("code",[e._v("schema")]),e._v(" and "),t("code",[e._v("data")]),e._v(" as variables).")]),e._v(" "),t("li",[e._v("Validation result, data AFTER validation, error messages.")]),e._v(" "),t("li",[e._v("What results did you expect?")])]),e._v(" "),t("p",[e._v("To speed up investigation and fixes, please include the link to the working code sample at runkit.com (please clone https://runkit.com/esp/ajv-issue).")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/new?template=bug-or-error-report.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("Create bug report"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"security-vulnerabilities"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#security-vulnerabilities"}},[e._v("#")]),e._v(" Security vulnerabilities")]),e._v(" "),t("p",[e._v("To report a security vulnerability, please use the\n"),t("a",{attrs:{href:"https://tidelift.com/security",target:"_blank",rel:"noopener noreferrer"}},[e._v("Tidelift security contact"),t("OutboundLink")],1),e._v(".\nTidelift will coordinate the fix and disclosure.")]),e._v(" "),t("p",[e._v("Please do NOT report security vulnerabilities via GitHub issues.")]),e._v(" "),t("p",[t("a",{attrs:{name:"changes"}})]),e._v(" "),t("h3",{attrs:{id:"change-proposals"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#change-proposals"}},[e._v("#")]),e._v(" Change proposals")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/new?template=change.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("Create a proposal"),t("OutboundLink")],1),e._v(" for a new feature, option or some other improvement.")]),e._v(" "),t("p",[e._v("Please include this information:")]),e._v(" "),t("ol",[t("li",[e._v("The version of Ajv you are using.")]),e._v(" "),t("li",[e._v("The problem you want to solve.")]),e._v(" "),t("li",[e._v("Your solution to the problem.")]),e._v(" "),t("li",[e._v("Would you like to implement it?")])]),e._v(" "),t("p",[e._v("If you’re requesting a change, it would be helpful to include this as well:")]),e._v(" "),t("ol",[t("li",[e._v("What you did.")]),e._v(" "),t("li",[e._v("What happened.")]),e._v(" "),t("li",[e._v("What you would like to happen.")])]),e._v(" "),t("p",[e._v("Please include as much details as possible - the more information, the better.")]),e._v(" "),t("p",[t("a",{attrs:{name:"compatibility"}})]),e._v(" "),t("h3",{attrs:{id:"browser-and-compatibility-issues"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#browser-and-compatibility-issues"}},[e._v("#")]),e._v(" Browser and compatibility issues")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/new?template=compatibility.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("Create an issue"),t("OutboundLink")],1),e._v(" to report a compatibility problem that only happens in a particular environment (when your code works correctly in the latest stable Node.js in linux systems but fails in some other environment).")]),e._v(" "),t("p",[e._v("Please include this information:")]),e._v(" "),t("ol",[t("li",[e._v("The version of Ajv you are using.")]),e._v(" "),t("li",[e._v("The environment you have the problem with.")]),e._v(" "),t("li",[e._v("Your code (please make it as small as possible to reproduce the issue).")]),e._v(" "),t("li",[e._v("If your issue is in the browser, please list the other packages loaded in the page in the order they are loaded. Please check if the issue gets resolved (or results change) if you move Ajv bundle closer to the top.")]),e._v(" "),t("li",[e._v("Results in the latest stable Node.js.")]),e._v(" "),t("li",[e._v("Results and error messages in your platform.")])]),e._v(" "),t("p",[t("a",{attrs:{name:"installation"}})]),e._v(" "),t("h3",{attrs:{id:"installation-and-dependency-issues"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#installation-and-dependency-issues"}},[e._v("#")]),e._v(" Installation and dependency issues")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/new?template=installation.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("Create an issue"),t("OutboundLink")],1),e._v(" to report problems that happen during Ajv installation or when Ajv is missing some dependency.")]),e._v(" "),t("p",[e._v("Before submitting the issue, please try the following:")]),e._v(" "),t("ul",[t("li",[e._v("use the latest stable Node.js and "),t("code",[e._v("npm")])]),e._v(" "),t("li",[e._v("try using "),t("code",[e._v("yarn")]),e._v(" instead of "),t("code",[e._v("npm")]),e._v(" - the issue can be related to https://github.com/npm/npm/issues/19877")]),e._v(" "),t("li",[e._v("remove "),t("code",[e._v("node_modules")]),e._v(" and "),t("code",[e._v("package-lock.json")]),e._v(" and run "),t("code",[e._v("npm install")]),e._v(" again")])]),e._v(" "),t("p",[e._v("If nothing helps, please submit:")]),e._v(" "),t("ol",[t("li",[e._v("The version of Ajv you are using")]),e._v(" "),t("li",[e._v("Operating system and Node.js version")]),e._v(" "),t("li",[e._v("Package manager and its version")]),e._v(" "),t("li",[e._v("Link to (or contents of) package.json and package-lock.json")]),e._v(" "),t("li",[e._v("Error messages")]),e._v(" "),t("li",[e._v("The output of "),t("code",[e._v("npm ls")])])]),e._v(" "),t("p",[t("a",{attrs:{name:"json-schema"}})]),e._v(" "),t("h3",{attrs:{id:"using-json-schema-standard"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-json-schema-standard"}},[e._v("#")]),e._v(" Using JSON Schema standard")]),e._v(" "),t("p",[e._v("Ajv implements JSON Schema standard draft-04 and draft-06/07.")]),e._v(" "),t("p",[e._v("If it is a general issue related to using the standard keywords included in JSON Schema specification or implementing some advanced validation logic please ask the question on "),t("a",{attrs:{href:"https://stackoverflow.com/questions/ask?tags=jsonschema,ajv",target:"_blank",rel:"noopener noreferrer"}},[e._v("Stack Overflow"),t("OutboundLink")],1),e._v(" (my account is "),t("a",{attrs:{href:"https://stackoverflow.com/users/1816503/esp",target:"_blank",rel:"noopener noreferrer"}},[e._v("esp"),t("OutboundLink")],1),e._v(") or submit the question to "),t("a",{attrs:{href:"https://github.com/json-schema-org/json-schema-spec/issues/new",target:"_blank",rel:"noopener noreferrer"}},[e._v("json-schema.org"),t("OutboundLink")],1),e._v(". Please mention @epoberezkin.")]),e._v(" "),t("p",[t("a",{attrs:{name:"usage"}})]),e._v(" "),t("h3",{attrs:{id:"ajv-usage-questions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ajv-usage-questions"}},[e._v("#")]),e._v(" Ajv usage questions")]),e._v(" "),t("p",[e._v("The best place to ask a question about using Ajv is "),t("a",{attrs:{href:"https://gitter.im/ajv-validator/ajv",target:"_blank",rel:"noopener noreferrer"}},[e._v("Gitter chat"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("If the question is advanced, it can be submitted to "),t("a",{attrs:{href:"http://stackoverflow.com/questions/ask?tags=jsonschema,ajv",target:"_blank",rel:"noopener noreferrer"}},[e._v("Stack Overflow"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"code"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#code"}},[e._v("#")]),e._v(" Code")]),e._v(" "),t("p",[e._v("Thanks a lot for considering contributing to Ajv! Our users have created many great features, and we look forward to your contributions.")]),e._v(" "),t("p",[e._v("For help navigating the code, please review the "),t("RouterLink",{attrs:{to:"/components.html"}},[e._v("Code components")]),e._v(" document.")],1),e._v(" "),t("h3",{attrs:{id:"how-we-make-decisions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-we-make-decisions"}},[e._v("#")]),e._v(" How we make decisions")]),e._v(" "),t("p",[e._v("We value conscious curation of our library size, and balancing performance and functionality. To that end, we cannot accept every suggestion. When evaluating pull requests we consider:")]),e._v(" "),t("ul",[t("li",[e._v("Will this benefit many users or a niche use case?")]),e._v(" "),t("li",[e._v("How will this impact the performance of Ajv?")]),e._v(" "),t("li",[e._v("How will this expand our library size?")])]),e._v(" "),t("p",[e._v("To help us evaluate and understand, when you submit an issue and pull request:")]),e._v(" "),t("ul",[t("li",[e._v("Explain why this feature is important to the user base")]),e._v(" "),t("li",[e._v("Include documentation")]),e._v(" "),t("li",[e._v("Include test coverage with any new feature implementations")])]),e._v(" "),t("p",[e._v("Please include documentation and test coverage with any new feature implementations.")]),e._v(" "),t("h3",{attrs:{id:"development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#development"}},[e._v("#")]),e._v(" Development")]),e._v(" "),t("p",[e._v("Running tests:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("npm")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" submodule update "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--init")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("npm")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("test")]),e._v("\n")])])]),t("p",[t("code",[e._v("npm run build")]),e._v(" - compiles typescript to dist folder.")]),e._v(" "),t("p",[t("code",[e._v("npm run watch")]),e._v(" - automatically compiles typescript when files on lib folder changes.")]),e._v(" "),t("h3",{attrs:{id:"pull-requests"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#pull-requests"}},[e._v("#")]),e._v(" Pull requests")]),e._v(" "),t("p",[e._v("We want to iterate on the code efficiently. To speed up the process, please follow these steps:")]),e._v(" "),t("ol",[t("li",[e._v("Submit an "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/new",target:"_blank",rel:"noopener noreferrer"}},[e._v("issue with the bug"),t("OutboundLink")],1),e._v(" or with the proposed change (unless the contribution is to fix the documentation typos and mistakes).")]),e._v(" "),t("li",[e._v("Describe the proposed api and implementation plan (unless the issue is a relatively simple bug and fixing it doesn't change any api).")]),e._v(" "),t("li",[e._v("Once agreed, please write as little code as possible to achieve the desired result. We are passionate about keeping our library size optimized.")]),e._v(" "),t("li",[e._v("Please add the tests both for the added feature and, if you are submitting an option, for the existing behaviour when this option is turned off or not passed.")]),e._v(" "),t("li",[e._v("Please avoid unnecessary changes, refactoring or changing coding styles as part of your change (unless the change was proposed as refactoring).")]),e._v(" "),t("li",[e._v("Follow the coding conventions even if they are not validated.")]),e._v(" "),t("li",[e._v("Please run the tests before committing your code.")]),e._v(" "),t("li",[e._v("If tests fail in CI build after you make a PR please investigate and fix the issue.")])]),e._v(" "),t("h3",{attrs:{id:"contributions-license"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#contributions-license"}},[e._v("#")]),e._v(" Contributions license")]),e._v(" "),t("p",[e._v("When contributing the code you confirm that:")]),e._v(" "),t("ol",[t("li",[e._v("Your contribution is created by you.")]),e._v(" "),t("li",[e._v("You have the right to submit it under the MIT license.")]),e._v(" "),t("li",[e._v("You understand and agree that your contribution is public, will be stored indefinitely, can be redistributed as the part of Ajv or another related package under MIT license, modified or completely removed from Ajv.")]),e._v(" "),t("li",[e._v("You grant irrevocable MIT license to use your contribution as part of Ajv or any other package.")]),e._v(" "),t("li",[e._v("You waive all rights to your contribution.")]),e._v(" "),t("li",[e._v("Unless you request otherwise, you can be mentioned as the author of the contribution in the Ajv documentation and change log.")])])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/50.6fb28fbe.js b/assets/js/50.6fb28fbe.js new file mode 100644 index 000000000..9c3753132 --- /dev/null +++ b/assets/js/50.6fb28fbe.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[50],{516:function(e,t,a){"use strict";a.r(t);var r=a(24),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"frequently-asked-questions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#frequently-asked-questions"}},[e._v("#")]),e._v(" Frequently Asked Questions")]),e._v(" "),t("p",[e._v("The purpose of this document is to help find answers quicker. I am happy to continue the discussion about these issues, so please comment on some of the issues mentioned below or create a new issue if it seems more appropriate.")]),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#using-json-schema"}},[e._v("Using JSON schema")]),t("ul",[t("li",[t("a",{attrs:{href:"#why-ajv-validates-empty-object-as-valid"}},[e._v("Why Ajv validates empty object as valid?")])]),t("li",[t("a",{attrs:{href:"#why-ajv-validates-only-the-first-item-of-the-array"}},[e._v("Why Ajv validates only the first item of the array?")])])])]),t("li",[t("a",{attrs:{href:"#ajv-api-for-returning-validation-errors"}},[e._v("Ajv API for returning validation errors")]),t("ul",[t("li",[t("a",{attrs:{href:"#why-ajv-assigns-errors-as-a-property-of-validation-function-or-instance-instead-of-returning-an-object-with-validation-results-and-errors"}},[e._v("Why Ajv assigns errors as a property of validation function (or instance) instead of returning an object with validation results and errors?")])]),t("li",[t("a",{attrs:{href:"#would-errors-get-overwritten-in-case-of-concurrent-validations"}},[e._v('Would errors get overwritten in case of "concurrent" validations?')])]),t("li",[t("a",{attrs:{href:"#can-we-change-extend-api-to-add-a-method-that-would-return-errors-rather-than-assign-them-to-errors-property"}},[e._v("Can we change / extend API to add a method that would return errors (rather than assign them to errors property)?")])]),t("li",[t("a",{attrs:{href:"#why-don-t-additionalproperties-false-errors-display-the-property-name"}},[e._v('Why don\'t "additionalProperties": false errors display the property name?')])])])]),t("li",[t("a",{attrs:{href:"#additional-properties-inside-compound-keywords-anyof-oneof-etc"}},[e._v("Additional properties inside compound keywords anyOf, oneOf, etc.")]),t("ul",[t("li",[t("a",{attrs:{href:"#why-the-keyword-additionalproperties-false-fails-validation-when-some-properties-are-declared-inside-a-subschema-in-anyof-etc"}},[e._v('Why the keyword additionalProperties: false fails validation when some properties are "declared" inside a subschema in anyOf/etc.?')])]),t("li",[t("a",{attrs:{href:"#why-the-validation-fails-when-i-use-option-removeadditional-with-the-keyword-anyof-etc"}},[e._v("Why the validation fails when I use option removeAdditional with the keyword anyOf/etc.?")])])])]),t("li",[t("a",{attrs:{href:"#generating-schemas-with-resolved-references-ref"}},[e._v("Generating schemas with resolved references ($ref)")]),t("ul",[t("li",[t("a",{attrs:{href:"#why-ajv-does-not-replace-references-ref-with-the-actual-referenced-schemas-as-some-validators-do"}},[e._v("Why Ajv does not replace references ($ref) with the actual referenced schemas as some validators do?")])]),t("li",[t("a",{attrs:{href:"#how-can-i-generate-a-schema-where-ref-keywords-are-replaced-with-referenced-schemas"}},[e._v("How can I generate a schema where $ref keywords are replaced with referenced schemas?")])])])])])]),t("p"),e._v(" "),t("h2",{attrs:{id:"using-json-schema"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-json-schema"}},[e._v("#")]),e._v(" Using JSON schema")]),e._v(" "),t("p",[e._v("Ajv implements JSON schema specification. Before submitting the issue about the behaviour of any validation keywords please review them in:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://tools.ietf.org/html/draft-handrews-json-schema-validation-00",target:"_blank",rel:"noopener noreferrer"}},[e._v("JSON Schema specification"),t("OutboundLink")],1),e._v(" (draft-07)")]),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/json-schema.html"}},[e._v("JSON Schema reference")]),e._v(" in Ajv documentation")],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://spacetelescope.github.io/understanding-json-schema/",target:"_blank",rel:"noopener noreferrer"}},[e._v("JSON Schema tutorial"),t("OutboundLink")],1),e._v(" (for draft-04)")])]),e._v(" "),t("h4",{attrs:{id:"why-ajv-validates-empty-object-as-valid"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-ajv-validates-empty-object-as-valid"}},[e._v("#")]),e._v(" Why Ajv validates empty object as valid?")]),e._v(" "),t("p",[e._v('"properties" keyword does not require the presence of any properties, you need to use "required" keyword. It also doesn\'t require that the data is an object, so any other type of data will also be valid. To require a specific type use "type" keyword. '),t("RouterLink",{attrs:{to:"/strict-mode.html#strict-types"}},[e._v("Strict types mode")]),e._v(' introduced in v7 requires presence of "type" when "properties" are used, so the mistakes are less likely.')],1),e._v(" "),t("h4",{attrs:{id:"why-ajv-validates-only-the-first-item-of-the-array"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-ajv-validates-only-the-first-item-of-the-array"}},[e._v("#")]),e._v(" Why Ajv validates only the first item of the array?")]),e._v(" "),t("p",[e._v('"items" keyword support '),t("RouterLink",{attrs:{to:"/json-schema.html#items"}},[e._v("two syntaxes")]),e._v(" - 1) when the schema applies to all items; 2) when there is a different schema for each item in the beginning of the array. This problem means you are using the second syntax.")],1),e._v(" "),t("p",[e._v("In v7 with option "),t("code",[e._v("strictTuples")]),e._v(" ("),t("code",[e._v('"log"')]),e._v(' by default) this problem is less likely to happen, as Ajv would log warning about missing "minItems" and other keywords that are required to constrain tuple size.')]),e._v(" "),t("h2",{attrs:{id:"ajv-api-for-returning-validation-errors"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ajv-api-for-returning-validation-errors"}},[e._v("#")]),e._v(" Ajv API for returning validation errors")]),e._v(" "),t("p",[e._v("See "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/65",target:"_blank",rel:"noopener noreferrer"}},[e._v("#65"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/212",target:"_blank",rel:"noopener noreferrer"}},[e._v("#212"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/236",target:"_blank",rel:"noopener noreferrer"}},[e._v("#236"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/242",target:"_blank",rel:"noopener noreferrer"}},[e._v("#242"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/256",target:"_blank",rel:"noopener noreferrer"}},[e._v("#256"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h4",{attrs:{id:"why-ajv-assigns-errors-as-a-property-of-validation-function-or-instance-instead-of-returning-an-object-with-validation-results-and-errors"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-ajv-assigns-errors-as-a-property-of-validation-function-or-instance-instead-of-returning-an-object-with-validation-results-and-errors"}},[e._v("#")]),e._v(" Why Ajv assigns errors as a property of validation function (or instance) instead of returning an object with validation results and errors?")]),e._v(" "),t("p",[e._v("The reasons are history (other fast validators with the same api) and performance (returning boolean is faster). Although more code is written to process errors than to handle successful results, almost all server-side validations pass. The existing API is more efficient from the performance point of view.")]),e._v(" "),t("p",[e._v("Ajv also supports asynchronous validation (with asynchronous formats and keywords) that returns a promise that either resolves to "),t("code",[e._v("true")]),e._v(" or rejects with an error.")]),e._v(" "),t("h4",{attrs:{id:"would-errors-get-overwritten-in-case-of-concurrent-validations"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#would-errors-get-overwritten-in-case-of-concurrent-validations"}},[e._v("#")]),e._v(' Would errors get overwritten in case of "concurrent" validations?')]),e._v(" "),t("p",[e._v("No. There is no parallel execution in JavaScript, and the cooperative concurrency model of javascript makes this pattern safe. While a validation is run, no other JavaScript code that can access the same memory can be executed. As long as the errors are used in the same execution block, the errors will not be overwritten.")]),e._v(" "),t("h4",{attrs:{id:"can-we-change-extend-api-to-add-a-method-that-would-return-errors-rather-than-assign-them-to-errors-property"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#can-we-change-extend-api-to-add-a-method-that-would-return-errors-rather-than-assign-them-to-errors-property"}},[e._v("#")]),e._v(" Can we change / extend API to add a method that would return errors (rather than assign them to "),t("code",[e._v("errors")]),e._v(" property)?")]),e._v(" "),t("p",[e._v("No. In many cases there is a module responsible for the validation in the application, usually to load schemas and to process errors. This module is the right place to introduce any user-defined API. Convenience is a subjective thing, changing or extending API purely because of convenience would either break backward compatibility (even if it's done in a new major version it still complicates migration) or bloat API (making it more difficult to maintain).")]),e._v(" "),t("h4",{attrs:{id:"why-don-t-additionalproperties-false-errors-display-the-property-name"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-don-t-additionalproperties-false-errors-display-the-property-name"}},[e._v("#")]),e._v(" Why don't "),t("code",[e._v('"additionalProperties": false')]),e._v(" errors display the property name?")]),e._v(" "),t("p",[e._v("Doing this would create a precedent where validated data is used in error messages, creating a vulnerability (e.g., when ajv is used to validate API data/parameters and error messages are logged).")]),e._v(" "),t("p",[e._v("Since the property name is already in the params object, in an application you can modify the messages in any way you need. ajv-errors package allows modifying messages as well.")]),e._v(" "),t("h2",{attrs:{id:"additional-properties-inside-compound-keywords-anyof-oneof-etc"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#additional-properties-inside-compound-keywords-anyof-oneof-etc"}},[e._v("#")]),e._v(" Additional properties inside compound keywords anyOf, oneOf, etc.")]),e._v(" "),t("p",[e._v("See "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/127",target:"_blank",rel:"noopener noreferrer"}},[e._v("#127"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/129",target:"_blank",rel:"noopener noreferrer"}},[e._v("#129"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/134",target:"_blank",rel:"noopener noreferrer"}},[e._v("#134"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/140",target:"_blank",rel:"noopener noreferrer"}},[e._v("#140"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/193",target:"_blank",rel:"noopener noreferrer"}},[e._v("#193"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/205",target:"_blank",rel:"noopener noreferrer"}},[e._v("#205"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/238",target:"_blank",rel:"noopener noreferrer"}},[e._v("#238"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/264",target:"_blank",rel:"noopener noreferrer"}},[e._v("#264"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h4",{attrs:{id:"why-the-keyword-additionalproperties-false-fails-validation-when-some-properties-are-declared-inside-a-subschema-in-anyof-etc"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-the-keyword-additionalproperties-false-fails-validation-when-some-properties-are-declared-inside-a-subschema-in-anyof-etc"}},[e._v("#")]),e._v(" Why the keyword "),t("code",[e._v("additionalProperties: false")]),e._v(' fails validation when some properties are "declared" inside a subschema in '),t("code",[e._v("anyOf")]),e._v("/etc.?")]),e._v(" "),t("p",[e._v("The keyword "),t("code",[e._v("additionalProperties")]),e._v(" creates the restriction on validated data based on its own value ("),t("code",[e._v("false")]),e._v(" or schema object) and on the keywords "),t("code",[e._v("properties")]),e._v(" and "),t("code",[e._v("patternProperties")]),e._v(" in the SAME schema object. JSON Schema validators must NOT take into account properties used in other schema objects.")]),e._v(" "),t("p",[e._v("While you can expect that the schema below would allow the objects either with properties "),t("code",[e._v("foo")]),e._v(" and "),t("code",[e._v("bar")]),e._v(" or with properties "),t("code",[e._v("foo")]),e._v(" and "),t("code",[e._v("baz")]),e._v(" and all other properties will be prohibited, this schema will only allow objects with one property "),t("code",[e._v("foo")]),e._v(" (an empty object and any non-objects will also be valid):")]),e._v(" "),t("div",{staticClass:"language-javascript extra-class"},[t("pre",{pre:!0,attrs:{class:"language-javascript"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token literal-property property"}},[e._v("type")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"object"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token literal-property property"}},[e._v("properties")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),t("span",{pre:!0,attrs:{class:"token literal-property property"}},[e._v("foo")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),t("span",{pre:!0,attrs:{class:"token literal-property property"}},[e._v("type")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"number"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token literal-property property"}},[e._v("additionalProperties")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token boolean"}},[e._v("false")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token literal-property property"}},[e._v("oneOf")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),t("span",{pre:!0,attrs:{class:"token literal-property property"}},[e._v("properties")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),t("span",{pre:!0,attrs:{class:"token literal-property property"}},[e._v("bar")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),t("span",{pre:!0,attrs:{class:"token literal-property property"}},[e._v("type")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"number"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),t("span",{pre:!0,attrs:{class:"token literal-property property"}},[e._v("properties")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),t("span",{pre:!0,attrs:{class:"token literal-property property"}},[e._v("baz")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),t("span",{pre:!0,attrs:{class:"token literal-property property"}},[e._v("type")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"number"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),t("p",[e._v("The reason for that is that "),t("code",[e._v("additionalProperties")]),e._v(" keyword ignores properties inside "),t("code",[e._v("oneOf")]),e._v(" keyword subschemas. That's not the limitation of Ajv or any other validator, that's how it must work according to the standard.")]),e._v(" "),t("p",[e._v("There are several ways to implement the described logic that would allow two properties, please see the suggestions in the issues mentioned above.")]),e._v(" "),t("h4",{attrs:{id:"why-the-validation-fails-when-i-use-option-removeadditional-with-the-keyword-anyof-etc"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-the-validation-fails-when-i-use-option-removeadditional-with-the-keyword-anyof-etc"}},[e._v("#")]),e._v(" Why the validation fails when I use option "),t("code",[e._v("removeAdditional")]),e._v(" with the keyword "),t("code",[e._v("anyOf")]),e._v("/etc.?")]),e._v(" "),t("p",[e._v("This problem is related to the problem explained above - properties treated as additional in the sense of "),t("code",[e._v("additionalProperties")]),e._v(" keyword, based on "),t("code",[e._v("properties")]),e._v("/"),t("code",[e._v("patternProperties")]),e._v(" keyword in the same schema object.")]),e._v(" "),t("p",[e._v("See the example in the "),t("a",{attrs:{href:"https://ajv.js.org/guide/modifying-data.html#removing-additional-properties",target:"_blank",rel:"noopener noreferrer"}},[e._v("Removing Additional Data"),t("OutboundLink")],1),e._v(" section of the docs.")]),e._v(" "),t("h2",{attrs:{id:"generating-schemas-with-resolved-references-ref"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#generating-schemas-with-resolved-references-ref"}},[e._v("#")]),e._v(" Generating schemas with resolved references ($ref)")]),e._v(" "),t("p",[e._v("See "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/22",target:"_blank",rel:"noopener noreferrer"}},[e._v("#22"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/125",target:"_blank",rel:"noopener noreferrer"}},[e._v("#125"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/146",target:"_blank",rel:"noopener noreferrer"}},[e._v("#146"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/228",target:"_blank",rel:"noopener noreferrer"}},[e._v("#228"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/336",target:"_blank",rel:"noopener noreferrer"}},[e._v("#336"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/454",target:"_blank",rel:"noopener noreferrer"}},[e._v("#454"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h4",{attrs:{id:"why-ajv-does-not-replace-references-ref-with-the-actual-referenced-schemas-as-some-validators-do"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-ajv-does-not-replace-references-ref-with-the-actual-referenced-schemas-as-some-validators-do"}},[e._v("#")]),e._v(" Why Ajv does not replace references ($ref) with the actual referenced schemas as some validators do?")]),e._v(" "),t("ol",[t("li",[e._v("The scope of Ajv is validating data against JSON Schemas; inlining referenced schemas is not necessary for validation. When Ajv generates code for validation it either inlines the code of referenced schema or uses function calls. Doing schema manipulation is more complex and out of scope.")]),e._v(" "),t("li",[e._v("When schemas are recursive (or mutually recursive) resolving references would result in self-referencing recursive data-structures that can be difficult to process.")]),e._v(" "),t("li",[e._v("There are cases when such inlining would also require adding (or modifying) "),t("code",[e._v("id")]),e._v(" attribute in the inlined schema fragment to make the resulting schema equivalent.")])]),e._v(" "),t("p",[e._v("There were many conversations about the meaning of "),t("code",[e._v("$ref")]),e._v(" in "),t("a",{attrs:{href:"https://github.com/json-schema-org",target:"_blank",rel:"noopener noreferrer"}},[e._v("JSON Schema GitHub organisation"),t("OutboundLink")],1),e._v(". The consensus is that while it is possible to treat "),t("code",[e._v("$ref")]),e._v(" as schema inclusion with two caveats (above), this interpretation is unnecessary complex. A more efficient approach is to treat "),t("code",[e._v("$ref")]),e._v(" as a delegation, i.e. a special keyword that validates the current data instance against the referenced schema. The analogy with programming languages is that "),t("code",[e._v("$ref")]),e._v(" is a function call rather than a macro. See "),t("a",{attrs:{href:"https://github.com/json-schema-org/json-schema-spec/issues/279",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(", for example.")]),e._v(" "),t("h4",{attrs:{id:"how-can-i-generate-a-schema-where-ref-keywords-are-replaced-with-referenced-schemas"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-generate-a-schema-where-ref-keywords-are-replaced-with-referenced-schemas"}},[e._v("#")]),e._v(" How can I generate a schema where "),t("code",[e._v("$ref")]),e._v(" keywords are replaced with referenced schemas?")]),e._v(" "),t("p",[e._v("There are two possible approaches:")]),e._v(" "),t("ol",[t("li",[e._v("Traverse schema (e.g. with json-schema-traverse) and replace every "),t("code",[e._v("$ref")]),e._v(" with the referenced schema.")]),e._v(" "),t("li",[e._v("Use a specially constructed JSON Schema with a "),t("RouterLink",{attrs:{to:"/keywords.html"}},[e._v("user-defined keyword")]),e._v(" to traverse and modify your schema.")],1)])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/51.d223469b.js b/assets/js/51.d223469b.js new file mode 100644 index 000000000..d5558fa77 --- /dev/null +++ b/assets/js/51.d223469b.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[51],{520:function(t,s,a){"use strict";a.r(s);var n=a(24),r=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"asynchronous-validation"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#asynchronous-validation"}},[t._v("#")]),t._v(" Asynchronous validation")]),t._v(" "),s("p",[t._v("You can define formats and keywords that perform validation asynchronously by accessing database or some other service. You should add "),s("code",[t._v("async: true")]),t._v(" in the keyword or format definition (see "),s("RouterLink",{attrs:{to:"/guide/api.html#api-addformat"}},[t._v("addFormat")]),t._v(", "),s("RouterLink",{attrs:{to:"/guide/api.html#api-addkeyword"}},[t._v("addKeyword")]),t._v(" and "),s("RouterLink",{attrs:{to:"/guide/keywords.html"}},[t._v("User-defined keywords")]),t._v(").")],1),t._v(" "),s("p",[t._v("If your schema uses asynchronous formats/keywords or refers to some schema that contains them it should have "),s("code",[t._v('"$async": true')]),t._v(" keyword so that Ajv can compile it correctly. If asynchronous format/keyword or reference to asynchronous schema is used in the schema without "),s("code",[t._v("$async")]),t._v(" keyword Ajv will throw an exception during schema compilation.")]),t._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[t._v("Use $async: true in referenced schemas")]),t._v(" "),s("p",[t._v("All asynchronous subschemas that are referenced from the current or other schemas should have "),s("code",[t._v('"$async": true')]),t._v(" keyword as well, otherwise the schema compilation will fail.")])]),t._v(" "),s("p",[t._v("Validation function for an asynchronous format/keyword should return a promise that resolves with "),s("code",[t._v("true")]),t._v(" or "),s("code",[t._v("false")]),t._v(" (or rejects with "),s("code",[t._v("new Ajv.ValidationError(errors)")]),t._v(" if you want to return errors from the keyword function).")]),t._v(" "),s("p",[t._v("Ajv compiles asynchronous schemas to "),s("a",{attrs:{href:"http://tc39.github.io/ecmascript-asyncawait/",target:"_blank",rel:"noopener noreferrer"}},[t._v("async functions"),s("OutboundLink")],1),t._v(". Async functions are supported in Node.js 7+ and all modern browsers. You can supply a transpiler as a function via "),s("code",[t._v("processCode")]),t._v(" option. See "),s("RouterLink",{attrs:{to:"/guide/api.html#options"}},[t._v("Options")]),t._v(".")],1),t._v(" "),s("p",[t._v("The compiled validation function has "),s("code",[t._v("$async: true")]),t._v(" property (if the schema is asynchronous), so you can differentiate these functions if you are using both synchronous and asynchronous schemas.")]),t._v(" "),s("p",[t._v("Validation result will be a promise that resolves with validated data or rejects with an exception "),s("code",[t._v("Ajv.ValidationError")]),t._v(" that contains the array of validation errors in "),s("code",[t._v("errors")]),t._v(" property.")]),t._v(" "),s("p",[t._v("Example:")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\najv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addKeyword")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("keyword")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"idExists"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("async")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("validate")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" checkIdExists"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("checkIdExists")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("schema"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" data")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// this is just an example, you would want to avoid SQL injection in your code")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" rows "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sql")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("SELECT id FROM ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("schema"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("table"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(" WHERE id = ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("rows"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// true if record is found")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$async")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("userId")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"integer"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("idExists")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("table")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"users"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("postId")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"integer"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("idExists")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("table")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"posts"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validate "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ajv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("compile")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("schema"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("userId")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("postId")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Data is valid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// { userId: 1, postId: 19 }")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("catch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("err")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("instanceof")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ValidationError")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throw")]),t._v(" err\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// data is invalid")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Validation errors:"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" err"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("errors"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"using-transpilers"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#using-transpilers"}},[t._v("#")]),t._v(" Using transpilers")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("processCode")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" transpileFunc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validate "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ajv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("compile")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("schema"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// transpiled es7 async function")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("successFunc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("catch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("errorFunc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("See "),s("a",{attrs:{href:"../options"}},[t._v("Options")]),t._v(".")])])}),[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/52.431b7581.js b/assets/js/52.431b7581.js new file mode 100644 index 000000000..2e42b0032 --- /dev/null +++ b/assets/js/52.431b7581.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[52],{519:function(t,a,s){"use strict";s.r(a);var e=s(24),r=Object(e.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"combining-schemas"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#combining-schemas"}},[t._v("#")]),t._v(" Combining schemas")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#a-name-ref-a-combining-schemas-with-ref"}},[a("a",{attrs:{name:"ref"}}),t._v("Combining schemas with $ref")])]),a("li",[a("a",{attrs:{href:"#extending-recursive-schemas"}},[t._v("Extending recursive schemas")])]),a("li",[a("a",{attrs:{href:"#data-reference"}},[t._v("$data reference")])]),a("li",[a("a",{attrs:{href:"#merge-and-patch-keywords"}},[t._v("$merge and $patch keywords")])])])]),a("p"),t._v(" "),a("h2",{attrs:{id:"combining-schemas-with-ref"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#combining-schemas-with-ref"}},[t._v("#")]),t._v(" "),a("a",{attrs:{name:"ref"}}),t._v("Combining schemas with $ref")]),t._v(" "),a("p",[t._v("You can structure your validation logic across multiple schema files and have schemas reference each other using "),a("code",[t._v("$ref")]),t._v(" keyword.")]),t._v(" "),a("p",[t._v("Example:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$id")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://example.com/schemas/schema.json"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$ref")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"defs.json#/definitions/int"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$ref")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"defs.json#/definitions/str"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" defsSchema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$id")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://example.com/schemas/defs.json"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("definitions")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("int")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"integer"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("str")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Now to compile your schema you can either pass all schemas to Ajv instance:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("schemas")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("schema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" defsSchema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validate "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getSchema")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://example.com/schemas/schema.json"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("p",[t._v("or use "),a("code",[t._v("addSchema")]),t._v(" method:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validate "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("addSchema")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("defsSchema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("compile")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("schema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("p",[t._v("See "),a("RouterLink",{attrs:{to:"/options.html"}},[t._v("Options")]),t._v(" and "),a("RouterLink",{attrs:{to:"/api.html#add-schema"}},[t._v("addSchema")]),t._v(" method.")],1),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("Reference resolution")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("$ref")]),t._v(" is resolved as the uri-reference using schema $id as the base URI (see the example).")]),t._v(" "),a("li",[t._v("References can be recursive (and mutually recursive) to implement the schemas for different data structures (such as linked lists, trees, graphs, etc.).")]),t._v(" "),a("li",[t._v("You don't have to host your schema files at the URIs that you use as schema $id. These URIs are only used to identify the schemas, and according to JSON Schema specification validators should not expect to be able to download the schemas from these URIs.")]),t._v(" "),a("li",[t._v("The actual location of the schema file in the file system is not used.")]),t._v(" "),a("li",[t._v("You can pass the identifier of the schema as the second parameter of "),a("code",[t._v("addSchema")]),t._v(" method or as a property name in "),a("code",[t._v("schemas")]),t._v(" option. This identifier can be used instead of (or in addition to) schema $id.")]),t._v(" "),a("li",[t._v("You cannot have the same $id (or the schema identifier) used for more than one schema - the exception will be thrown.")]),t._v(" "),a("li",[t._v("You can implement dynamic resolution of the referenced schemas using "),a("code",[t._v("compileAsync")]),t._v(" method. In this way you can store schemas in any system (files, web, database, etc.) and reference them without explicitly adding to Ajv instance. See "),a("RouterLink",{attrs:{to:"/guide/managing-schemas.html#asynchronous-schema-compilation"}},[t._v("Asynchronous schema compilation")]),t._v(".")],1)])]),t._v(" "),a("h2",{attrs:{id:"extending-recursive-schemas"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#extending-recursive-schemas"}},[t._v("#")]),t._v(" Extending recursive schemas")]),t._v(" "),a("p",[t._v("While statically defined "),a("code",[t._v("$ref")]),t._v(" keyword allows to split schemas to multiple files, it is difficult to extend recursive schemas - the recursive reference(s) in the original schema points to the original schema, and not to the extended one. So in JSON Schema draft-07 the only available solution to extend the recursive schema was to redefine all sections of the original schema that have recursion.")]),t._v(" "),a("p",[t._v("It was particularly repetitive when extending meta-schema, as it has many recursive references, but even in a schema with a single recursive reference extending it was very verbose.")]),t._v(" "),a("p",[t._v("JSON Schema draft-2019-09 and the upcoming draft defined the mechanism for dynamic recursion using keywords "),a("code",[t._v("$recursiveRef")]),t._v("/"),a("code",[t._v("$recursiveAnchor")]),t._v(" (draft-2019-09) or "),a("code",[t._v("$dynamicRef")]),t._v("/"),a("code",[t._v("$dynamicAnchor")]),t._v(' (the next JSON Schema draft) that is somewhat similar to "open recursion" in functional programming.')]),t._v(" "),a("p",[t._v("Consider this recursive schema with static recursion:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" treeSchema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$id")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://example.com/tree"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"data"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("data")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("children")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("items")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$ref")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"#"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("The only way to extend this schema to prohibit additional properties is by adding "),a("code",[t._v("additionalProperties")]),t._v(" keyword right in the schema - this approach can be impossible if you do not control the source of the original schema. Ajv also provided the additional keywords in "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv-merge-patch",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-merge-patch"),a("OutboundLink")],1),t._v(" package to extend schemas by treating them as plain JSON data. While this approach may work for you, it is non-standard and therefore not portable.")]),t._v(" "),a("p",[t._v("The new keywords for dynamic recursive references allow extending this schema without modifying it:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" treeSchema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$id")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://example.com/tree"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$recursiveAnchor")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"data"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("data")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("children")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("items")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$recursiveRef")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"#"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" strictTreeSchema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$id")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://example.com/strict-tree"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$recursiveAnchor")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$ref")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tree"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("unevaluatedProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" Ajv2019 "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv/dist/2019"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// const Ajv2019 = require("ajv/dist/2019")')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv2019")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("schemas")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("treeSchema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" strictTreeSchema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validate "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getSchema")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://example.com/strict-tree"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("p",[t._v("See "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/spec/dynamic-ref.spec.ts",target:"_blank",rel:"noopener noreferrer"}},[t._v("dynamic-refs"),a("OutboundLink")],1),t._v(" test for the example using "),a("code",[t._v("$dynamicAnchor")]),t._v("/"),a("code",[t._v("$dynamicRef")]),t._v(".")]),t._v(" "),a("p",[t._v("At the moment Ajv implements the spec for dynamic recursive references with these limitations:")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("$recursiveAnchor")]),t._v("/"),a("code",[t._v("$dynamicAnchor")]),t._v(" can only be used in the schema root.")]),t._v(" "),a("li",[a("code",[t._v("$recursiveRef")]),t._v("/"),a("code",[t._v("$dynamicRef")]),t._v(" can only be hash fragments, without URI.")])]),t._v(" "),a("p",[t._v("Ajv also does not support dynamic references in "),a("a",{attrs:{href:"#asynchronous-validation"}},[t._v("asynchronous schemas")]),t._v(" (Ajv extension) - it is assumed that the referenced schema is synchronous, and there is no validation-time check for it.")]),t._v(" "),a("h2",{attrs:{id:"data-reference"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#data-reference"}},[t._v("#")]),t._v(" $data reference")]),t._v(" "),a("p",[t._v("With "),a("code",[t._v("$data")]),t._v(" option you can use values from the validated data as the values for the schema keywords. See "),a("a",{attrs:{href:"https://github.com/json-schema-org/json-schema-spec/issues/51",target:"_blank",rel:"noopener noreferrer"}},[t._v("proposal"),a("OutboundLink")],1),t._v(" for more information about how it works.")]),t._v(" "),a("p",[a("code",[t._v("$data")]),t._v(" reference is supported in the keywords: const, enum, format, maximum/minimum, exclusiveMaximum / exclusiveMinimum, maxLength / minLength, maxItems / minItems, maxProperties / minProperties, formatMaximum / formatMinimum, formatExclusiveMaximum / formatExclusiveMinimum, multipleOf, pattern, required, uniqueItems.")]),t._v(" "),a("p",[t._v('The value of "$data" should be a '),a("a",{attrs:{href:"https://datatracker.ietf.org/doc/rfc6901/",target:"_blank",rel:"noopener noreferrer"}},[t._v("JSON-pointer"),a("OutboundLink")],1),t._v(" to the data (the root is always the top level data object, even if the $data reference is inside a referenced subschema) or a "),a("a",{attrs:{href:"http://tools.ietf.org/html/draft-luff-relative-json-pointer-00",target:"_blank",rel:"noopener noreferrer"}},[t._v("relative JSON-pointer"),a("OutboundLink")],1),t._v(" (it is relative to the current point in data; if the $data reference is inside a referenced subschema it cannot point to the data outside of the root level for this subschema).")]),t._v(" "),a("p",[t._v("Examples.")]),t._v(" "),a("p",[t._v("This schema requires that the value in property "),a("code",[t._v("smaller")]),t._v(" is less or equal than the value in the property larger:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$data")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("smaller")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("maximum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$data")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1/larger"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("larger")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validData "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("smaller")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("larger")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("7")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\najv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("schema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" validData"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// true")]),t._v("\n")])])]),a("p",[t._v("This schema requires that the properties have the same format as their field names:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("format")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$data")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0#"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validData "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"date-time"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1963-06-19T08:30:06.283185Z"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("email")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"joe.bloggs@example.com"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("code",[t._v("$data")]),t._v(" reference is resolved safely - it won't throw even if some property is undefined. If "),a("code",[t._v("$data")]),t._v(" resolves to "),a("code",[t._v("undefined")]),t._v(" the validation succeeds (with the exclusion of "),a("code",[t._v("const")]),t._v(" keyword). If "),a("code",[t._v("$data")]),t._v(' resolves to incorrect type (e.g. not "number" for maximum keyword) the validation fails.')]),t._v(" "),a("h2",{attrs:{id:"merge-and-patch-keywords"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#merge-and-patch-keywords"}},[t._v("#")]),t._v(" $merge and $patch keywords")]),t._v(" "),a("p",[t._v("With the package "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv-merge-patch",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-merge-patch"),a("OutboundLink")],1),t._v(" you can use the keywords "),a("code",[t._v("$merge")]),t._v(" and "),a("code",[t._v("$patch")]),t._v(" that allow extending JSON Schemas with patches using formats "),a("a",{attrs:{href:"https://datatracker.ietf.org/doc/rfc7396/",target:"_blank",rel:"noopener noreferrer"}},[t._v("JSON Merge Patch (RFC 7396)"),a("OutboundLink")],1),t._v(" and "),a("a",{attrs:{href:"https://datatracker.ietf.org/doc/rfc6902/",target:"_blank",rel:"noopener noreferrer"}},[t._v("JSON Patch (RFC 6902)"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("p",[t._v("To add keywords "),a("code",[t._v("$merge")]),t._v(" and "),a("code",[t._v("$patch")]),t._v(" to Ajv instance use this code:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv-merge-patch"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("p",[t._v("Examples.")]),t._v(" "),a("p",[t._v("Using "),a("code",[t._v("$merge")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$merge")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("source")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("p")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("with")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("q")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Using "),a("code",[t._v("$patch")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$patch")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("source")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("p")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("with")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("op")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"add"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("path")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/properties/q"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("value")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("The schemas above are equivalent to this schema:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("p")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("q")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("The properties "),a("code",[t._v("source")]),t._v(" and "),a("code",[t._v("with")]),t._v(" in the keywords "),a("code",[t._v("$merge")]),t._v(" and "),a("code",[t._v("$patch")]),t._v(" can use absolute or relative "),a("code",[t._v("$ref")]),t._v(" to point to other schemas previously added to the Ajv instance or to the fragments of the current schema.")]),t._v(" "),a("p",[t._v("See the package "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv-merge-patch",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-merge-patch"),a("OutboundLink")],1),t._v(" for more information.")])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/58.8bcb567a.js b/assets/js/58.8bcb567a.js new file mode 100644 index 000000000..3458a6a4e --- /dev/null +++ b/assets/js/58.8bcb567a.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[58],{526:function(e,t,a){"use strict";a.r(t);var s=a(24),n=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"choosing-schema-language"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#choosing-schema-language"}},[e._v("#")]),e._v(" Choosing schema language")]),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#json-type-definition"}},[e._v("JSON Type Definition")])]),t("li",[t("a",{attrs:{href:"#json-schema"}},[e._v("JSON Schema")]),t("ul",[t("li",[t("a",{attrs:{href:"#draft-04"}},[e._v("draft-04")])]),t("li",[t("a",{attrs:{href:"#draft-07-and-draft-06"}},[e._v("draft-07 (and draft-06)")])]),t("li",[t("a",{attrs:{href:"#draft-2019-09-and-draft-2020-12"}},[e._v("draft 2019-09 (and draft-2020-12)")])])])]),t("li",[t("a",{attrs:{href:"#comparison"}},[e._v("Comparison")]),t("ul",[t("li",[t("a",{attrs:{href:"#json-schema"}},[e._v("JSON Schema")])]),t("li",[t("a",{attrs:{href:"#json-type-definition"}},[e._v("JSON Type Definition")])])])])])]),t("p"),e._v(" "),t("h2",{attrs:{id:"json-type-definition"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#json-type-definition"}},[e._v("#")]),e._v(" JSON Type Definition")]),e._v(" "),t("p",[e._v("Ajv supports the new specification focussed on defining cross-platform types of JSON messages/payloads - JSON Type Definition (JTD). See the informal reference of "),t("a",{attrs:{href:"../json-type-definition"}},[e._v("JTD schema forms")]),e._v(" and formal specification "),t("a",{attrs:{href:"https://datatracker.ietf.org/doc/rfc8927/",target:"_blank",rel:"noopener noreferrer"}},[e._v("RFC8927"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"json-schema"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#json-schema"}},[e._v("#")]),e._v(" JSON Schema")]),e._v(" "),t("p",[e._v("Ajv supports most widely used drafts of JSON Schema specification. Please see the informal reference of available "),t("a",{attrs:{href:"../json-schema"}},[e._v("JSON Schema validation keywords")]),e._v(" and "),t("a",{attrs:{href:"https://json-schema.org/specification.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("specification drafts"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"draft-04"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#draft-04"}},[e._v("#")]),e._v(" draft-04")]),e._v(" "),t("p",[e._v("Draft-04 is not included in Ajv v7, because of some differences it has with the following drafts:")]),e._v(" "),t("ul",[t("li",[e._v("different schema member for schema identifier ("),t("code",[e._v("id")]),e._v(" in draft-04 instead of "),t("code",[e._v("$id")]),e._v(")")]),e._v(" "),t("li",[e._v("different syntax of exclusiveMaximum/Minimum")])]),e._v(" "),t("p",[e._v("You can still use draft-04 schemas with Ajv v6 - while this is no longer actively developed, any security related issues would still be supported at least until 30/06/2021.")]),e._v(" "),t("p",[e._v("To install v6:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("npm")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" ajv@6\n")])])]),t("p",[e._v("You can migrate schemas from draft-04 to draft-07 using "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv-cli",target:"_blank",rel:"noopener noreferrer"}},[e._v("ajv-cli"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"draft-07-and-draft-06"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#draft-07-and-draft-06"}},[e._v("#")]),e._v(" draft-07 (and draft-06)")]),e._v(" "),t("p",[e._v("These are the most widely used versions of JSON Schema specification, and they are supported with the main ajv export.")]),e._v(" "),t("div",{staticClass:"language-javascript extra-class"},[t("pre",{pre:!0,attrs:{class:"language-javascript"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("import")]),e._v(" Ajv "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("from")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"ajv"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("const")]),e._v(" ajv "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("new")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("Ajv")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),t("p",[e._v("If you need to support draft-06 schemas you need to add additional meta-schema, but you may just change (or remove) "),t("code",[e._v("$schema")]),e._v(" attribute in your schemas - no other changes are needed:")]),e._v(" "),t("div",{staticClass:"language-javascript extra-class"},[t("pre",{pre:!0,attrs:{class:"language-javascript"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("const")]),e._v(" draft6MetaSchema "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("require")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"ajv/dist/refs/json-schema-draft-06.json"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\najv"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("addMetaSchema")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("draft6MetaSchema"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),t("h3",{attrs:{id:"draft-2019-09-and-draft-2020-12"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#draft-2019-09-and-draft-2020-12"}},[e._v("#")]),e._v(" draft 2019-09 (and draft-2020-12)")]),e._v(" "),t("p",[e._v("The main advantage of this JSON Schema version over draft-07 is the ability to spread the definition of records that do not allow additional properties across multiple schemas. If you do not need it, you might be better off with draft-07.")]),e._v(" "),t("p",[e._v("To use Ajv with the support of all JSON Schema draft-2019-09/2020-12 features you need to use a different export:")]),e._v(" "),t("div",{staticClass:"language-javascript extra-class"},[t("pre",{pre:!0,attrs:{class:"language-javascript"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("import")]),e._v(" Ajv2019 "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("from")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"ajv/dist/2019"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("const")]),e._v(" ajv "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("new")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("Ajv2019")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),t("p",[e._v("Optionally, you can add draft-07 meta-schema, to use both draft-07 and draft-2019-09 schemas in one Ajv instance:")]),e._v(" "),t("div",{staticClass:"language-javascript extra-class"},[t("pre",{pre:!0,attrs:{class:"language-javascript"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("const")]),e._v(" draft7MetaSchema "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("require")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"ajv/dist/refs/json-schema-draft-07.json"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\najv"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("addMetaSchema")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("draft7MetaSchema"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),t("p",[e._v("Draft-2019-09 support is provided via a separate export in order to avoid increasing the bundle and generated code size for draft-07 users.")]),e._v(" "),t("p",[e._v("With this import Ajv supports the following features:")]),e._v(" "),t("ul",[t("li",[e._v("keywords "),t("RouterLink",{attrs:{to:"/json-schema.html#unevaluatedproperties"}},[t("code",[e._v("unevaluatedProperties")])]),e._v(" and "),t("RouterLink",{attrs:{to:"/json-schema.html#unevaluateditems"}},[t("code",[e._v("unevaluatedItems")])])],1),e._v(" "),t("li",[e._v("keywords "),t("RouterLink",{attrs:{to:"/json-schema.html#dependentrequired"}},[t("code",[e._v("dependentRequired")])]),e._v(", "),t("RouterLink",{attrs:{to:"/json-schema.html#dependentschemas"}},[t("code",[e._v("dependentSchemas")])]),e._v(", "),t("RouterLink",{attrs:{to:"/json-schema.html#maxcontains-mincontains"}},[t("code",[e._v("maxContains")]),e._v("/"),t("code",[e._v("minContains")])])],1),e._v(" "),t("li",[e._v("dynamic recursive references with ["),t("code",[e._v("recursiveAnchor")]),e._v("/"),t("code",[e._v("recursiveReference")]),e._v("] - see "),t("RouterLink",{attrs:{to:"/guide/combining-schemas.html#extending-recursive-schemas"}},[e._v("Extending recursive schemas")])],1),e._v(" "),t("li",[e._v("draft-2019-09 meta-schema is the default.")])]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("Draft-2019-09 features performance cost (even when not used)")]),e._v(" "),t("p",[e._v("Supporting dynamic recursive references and "),t("code",[e._v("unevaluatedProperties")]),e._v("/"),t("code",[e._v("unevaluatedItems")]),e._v(' keywords adds additional generated code even to the validation functions where these features are not used (when possible, Ajv determines which properties/items are "unevaluated" at compilation time, but support for dynamic references always adds additional generated code). If you are not using these features in your schemas it is recommended to use default Ajv export with JSON-Schema draft-07 support.')])]),e._v(" "),t("h2",{attrs:{id:"comparison"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#comparison"}},[e._v("#")]),e._v(" Comparison")]),e._v(" "),t("p",[e._v("Both "),t("RouterLink",{attrs:{to:"/json-schema.html"}},[e._v("JSON Schema")]),e._v(" and "),t("RouterLink",{attrs:{to:"/json-type-definition.html"}},[e._v("JSON Type Definition")]),e._v(" are cross-platform specifications with implementations in multiple programming languages that define the shape of your JSON data.")],1),e._v(" "),t("p",[e._v("You can see the difference between the two specifications in "),t("a",{attrs:{href:"./getting-started"}},[e._v("Getting started")]),e._v(" section examples.")]),e._v(" "),t("p",[e._v("This section compares their pros/cons to help decide which specification fits your application better.")]),e._v(" "),t("h3",{attrs:{id:"json-schema-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#json-schema-2"}},[e._v("#")]),e._v(" JSON Schema")]),e._v(" "),t("p",[t("strong",[e._v("Pros")]),e._v(":")]),e._v(" "),t("ul",[t("li",[e._v("Wide specification adoption.")]),e._v(" "),t("li",[e._v("Used as part of OpenAPI specification.")]),e._v(" "),t("li",[e._v("Support of complex validation scenarios:\n"),t("ul",[t("li",[e._v("untagged unions and boolean logic")]),e._v(" "),t("li",[e._v("conditional schemas and dependencies")]),e._v(" "),t("li",[e._v("restrictions on the number ranges and the size of strings, arrays and objects")]),e._v(" "),t("li",[e._v("semantic validation with formats, patterns and content keywords")]),e._v(" "),t("li",[e._v("distribute strict record definitions across multiple schemas (with unevaluatedProperties)")])])]),e._v(" "),t("li",[e._v("Can be effectively used for validation of any JavaScript objects and configuration files.")])]),e._v(" "),t("p",[t("strong",[e._v("Cons")]),e._v(":")]),e._v(" "),t("ul",[t("li",[e._v("Defines the collection of restrictions on the data, rather than the shape of the data.")]),e._v(" "),t("li",[e._v("No standard support for tagged unions.")]),e._v(" "),t("li",[e._v("Complex and error prone for the new users (Ajv has "),t("a",{attrs:{href:"../strict-mode"}},[e._v("strict mode")]),e._v(" enabled by default to compensate for it, but it is not cross-platform).")]),e._v(" "),t("li",[e._v("Some parts of specification are difficult to implement, creating the risk of implementations divergence:\n"),t("ul",[t("li",[e._v("reference resolution model")]),e._v(" "),t("li",[e._v("unevaluatedProperties/unevaluatedItems")]),e._v(" "),t("li",[e._v("dynamic recursive references")])])]),e._v(" "),t("li",[e._v("Internet draft status (rather than RFC)")])]),e._v(" "),t("p",[e._v("See "),t("RouterLink",{attrs:{to:"/json-schema.html"}},[e._v("JSON Schema")]),e._v(" for more information and the list of defined keywords.")],1),e._v(" "),t("h3",{attrs:{id:"json-type-definition-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#json-type-definition-2"}},[e._v("#")]),e._v(" JSON Type Definition")]),e._v(" "),t("p",[t("strong",[e._v("Pros")]),e._v(":")]),e._v(" "),t("ul",[t("li",[e._v("Aligned with type systems of many languages - can be used to generate type definitions and efficient parsers and serializers to/from these types.")]),e._v(" "),t("li",[e._v("Very simple, enforcing the best practices for cross-platform JSON API modelling.")]),e._v(" "),t("li",[e._v("Simple to implement, ensuring consistency across implementations.")]),e._v(" "),t("li",[e._v("Defines the shape of JSON data via strictly defined schema forms (rather than the collection of restrictions).")]),e._v(" "),t("li",[e._v("Effective support for tagged unions.")]),e._v(" "),t("li",[e._v("Designed to protect against user mistakes.")]),e._v(" "),t("li",[e._v("Supports compilation of schemas to efficient "),t("RouterLink",{attrs:{to:"/guide/getting-started.html#parsing-and-serializing-json"}},[e._v("serializers and parsers")]),e._v(" (no need to validate as a separate step).")],1),e._v(" "),t("li",[e._v("Approved as "),t("a",{attrs:{href:"https://datatracker.ietf.org/doc/rfc8927/",target:"_blank",rel:"noopener noreferrer"}},[e._v("RFC8927"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[e._v("Substantial industry adoption since it was standardized in 2020, Ajv v8.12.0 fixed all reported JTD bugs.")])]),e._v(" "),t("p",[t("strong",[e._v("Cons")]),e._v(":")]),e._v(" "),t("ul",[t("li",[e._v("Limited, compared with JSON Schema - no support for untagged unions"),t("sup",[e._v("1")]),e._v(", conditionals, references between different schema files"),t("sup",[e._v("2")]),e._v(", etc.")]),e._v(" "),t("li",[e._v("No meta-schema in the specification"),t("sup",[e._v("3")]),e._v(".")])]),e._v(" "),t("p",[t("sup",[e._v("1")]),e._v(' Ajv defines non-standard keyword "union" that can be used inside "metadata" object.')]),e._v(" "),t("p",[t("sup",[e._v("2")]),e._v(" You can still combine schemas from multiple files in the application code.")]),e._v(" "),t("p",[t("sup",[e._v("3")]),e._v(" Ajv defines meta-schema for JTD schemas.")]),e._v(" "),t("p",[e._v("See "),t("RouterLink",{attrs:{to:"/json-type-definition.html"}},[e._v("JSON Type Definition")]),e._v(" for more information and the list of defined schema forms.")],1)])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/61.0d386b18.js b/assets/js/61.0d386b18.js new file mode 100644 index 000000000..b2521e837 --- /dev/null +++ b/assets/js/61.0d386b18.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[61],{530:function(e,t,a){"use strict";a.r(t);var r=a(24),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"why-use-ajv"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-use-ajv"}},[e._v("#")]),e._v(" Why use AJV")]),e._v(" "),t("h2",{attrs:{id:"write-less-code"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#write-less-code"}},[e._v("#")]),e._v(" Write less code")]),e._v(" "),t("p",[t("strong",[e._v("Ensure your data is valid as soon as it's received")])]),e._v(" "),t("p",[e._v("Instead of having your data validation and sanitization logic written as lengthy code, you can declare the requirements to your data with concise, easy to read and cross-platform "),t("a",{attrs:{href:"https://json-schema.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("JSON Schema"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://jsontypedef.com",target:"_blank",rel:"noopener noreferrer"}},[e._v("JSON Type Definition"),t("OutboundLink")],1),e._v(" specifications and validate the data as soon as it arrives to your application.")]),e._v(" "),t("p",[e._v("TypeScript users can use validation functions as type guards, having type level guarantee that if your data is validated - it is correct.")]),e._v(" "),t("p",[e._v("Read more in "),t("RouterLink",{attrs:{to:"/guide/getting-started.html"}},[e._v("Getting started")]),e._v(" and "),t("RouterLink",{attrs:{to:"/guide/typescript.html"}},[e._v("Using with TypeScript")])],1),e._v(" "),t("h2",{attrs:{id:"super-fast-secure"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#super-fast-secure"}},[e._v("#")]),e._v(" Super fast & secure")]),e._v(" "),t("p",[t("strong",[e._v("Compiles your schemas to optimized JavaScript code")])]),e._v(" "),t("p",[e._v("Ajv generates code to turn JSON Schemas into super-fast validation functions that are efficient for v8 optimization.")]),e._v(" "),t("p",[e._v("Currently Ajv is the fastest and the most standard compliant validator according to these benchmarks:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/ebdrup/json-schema-benchmark",target:"_blank",rel:"noopener noreferrer"}},[e._v("json-schema-benchmark"),t("OutboundLink")],1),e._v(" - 50% faster than the second place")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/pandastrike/jsck#benchmarks",target:"_blank",rel:"noopener noreferrer"}},[e._v("jsck benchmark"),t("OutboundLink")],1),e._v(" - 20-190% faster")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://rawgit.com/zaggino/z-schema/master/benchmark/results.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("z-schema benchmark"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://cdn.rawgit.com/playlyfe/themis/master/benchmark/results.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("themis benchmark"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("Ajv was designed at the time when there were no validators fully complying with JSON Schema specification, aiming to achieve the best possibly validation performance via just-in-time compilation of JSON schemas to code. Ajv achieved both speed and rigour, but initially security was an afterthought - many security flaws have been fixed thanks to the reports from its users.")]),e._v(" "),t("p",[e._v("Ajv version 7 was rebuilt to have secure code generation embedded in its design as the primary objective - even if you use untrusted schemas (which is still not recommended) there are type-level guarantees against remote code execution.")]),e._v(" "),t("p",[e._v("Read more in "),t("RouterLink",{attrs:{to:"/codegen.html"}},[e._v("Code generation design")])],1),e._v(" "),t("h2",{attrs:{id:"multi-standard"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#multi-standard"}},[e._v("#")]),e._v(" Multi-standard")]),e._v(" "),t("p",[t("strong",[e._v("Use JSON Type Definition or JSON Schema")])]),e._v(" "),t("p",[e._v("In addition to the multiple "),t("RouterLink",{attrs:{to:"/json-schema.html"}},[e._v("JSON Schema")]),e._v(" drafts, including the latest draft 2020-12, Ajv has support for "),t("RouterLink",{attrs:{to:"/json-type-definition.html"}},[e._v("JSON Type Definition")]),e._v(" - a new "),t("a",{attrs:{href:"https://datatracker.ietf.org/doc/rfc8927/",target:"_blank",rel:"noopener noreferrer"}},[e._v("RFC8927"),t("OutboundLink")],1),e._v(" that offers a much simpler alternative to JSON Schema. Designed to be well-aligned with type systems, JTD has tools for both validation and type code generation for multiple languages.")],1),e._v(" "),t("p",[e._v("Read more in "),t("RouterLink",{attrs:{to:"/guide/schema-language.html"}},[e._v("Choosing schema language")])],1)])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/62.17eb9b44.js b/assets/js/62.17eb9b44.js new file mode 100644 index 000000000..d2f2909ba --- /dev/null +++ b/assets/js/62.17eb9b44.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[62],{531:function(t,a,e){"use strict";e.r(a);var s=e(24),r=Object(s.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"json-schema"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#json-schema"}},[t._v("#")]),t._v(" JSON Schema")]),t._v(" "),a("p",[t._v("In a simple way, JSON Schema is an object with validation keywords.")]),t._v(" "),a("p",[t._v("The keywords and their values define what rules the data should satisfy to be valid.")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#json-schema-versions"}},[t._v("JSON Schema versions")]),a("ul",[a("li",[a("a",{attrs:{href:"#draft-07"}},[t._v("draft-07 "),a("Badge",{attrs:{text:"default"}})],1)]),a("li",[a("a",{attrs:{href:"#draft-2019-09"}},[t._v("draft-2019-09 "),a("Badge",{attrs:{text:"NEW"}})],1)]),a("li",[a("a",{attrs:{href:"#draft-2020-12"}},[t._v("draft-2020-12 "),a("Badge",{attrs:{text:"BREAKING",type:"warning"}})],1)]),a("li",[a("a",{attrs:{href:"#draft-06"}},[t._v("draft-06")])]),a("li",[a("a",{attrs:{href:"#draft-04"}},[t._v("draft-04")])])])]),a("li",[a("a",{attrs:{href:"#openapi-support"}},[t._v("OpenAPI support")])]),a("li",[a("a",{attrs:{href:"#json-data-type"}},[t._v("JSON data type")]),a("ul",[a("li",[a("a",{attrs:{href:"#type"}},[t._v("type")])]),a("li",[a("a",{attrs:{href:"#nullable"}},[t._v("nullable "),a("Badge",{attrs:{text:"OpenAPI"}})],1)])])]),a("li",[a("a",{attrs:{href:"#keywords-for-numbers"}},[t._v("Keywords for numbers")]),a("ul",[a("li",[a("a",{attrs:{href:"#maximum-minimum-and-exclusivemaximum-exclusiveminimum"}},[t._v("maximum / minimum and exclusiveMaximum / exclusiveMinimum")])]),a("li",[a("a",{attrs:{href:"#multipleof"}},[t._v("multipleOf")])])])]),a("li",[a("a",{attrs:{href:"#keywords-for-strings"}},[t._v("Keywords for strings")]),a("ul",[a("li",[a("a",{attrs:{href:"#maxlength-minlength"}},[t._v("maxLength / minLength")])]),a("li",[a("a",{attrs:{href:"#pattern"}},[t._v("pattern")])]),a("li",[a("a",{attrs:{href:"#format"}},[t._v("format")])])])]),a("li",[a("a",{attrs:{href:"#keywords-for-arrays"}},[t._v("Keywords for arrays")]),a("ul",[a("li",[a("a",{attrs:{href:"#maxitems-minitems"}},[t._v("maxItems / minItems")])]),a("li",[a("a",{attrs:{href:"#uniqueitems"}},[t._v("uniqueItems")])]),a("li",[a("a",{attrs:{href:"#items"}},[t._v("items")]),a("ul",[a("li",[a("a",{attrs:{href:"#items-in-draft-04-06-07-and-2019-09"}},[t._v("items in draft-04, -06, -07 and -2019-09")])]),a("li",[a("a",{attrs:{href:"#items-in-draft-2020-12"}},[t._v("items in draft-2020-12 "),a("Badge",{attrs:{text:"NEW"}})],1)])])]),a("li",[a("a",{attrs:{href:"#prefixitems"}},[t._v("prefixItems "),a("Badge",{attrs:{text:"NEW: draft 2020-12"}})],1)]),a("li",[a("a",{attrs:{href:"#additionalitems"}},[t._v("additionalItems")])]),a("li",[a("a",{attrs:{href:"#contains"}},[t._v("contains")])]),a("li",[a("a",{attrs:{href:"#maxcontains-mincontains"}},[t._v("maxContains / minContains "),a("Badge",{attrs:{text:"NEW: draft 2019-09"}})],1)]),a("li",[a("a",{attrs:{href:"#unevaluateditems"}},[t._v("unevaluatedItems "),a("Badge",{attrs:{text:"NEW: draft 2019-09"}})],1)])])]),a("li",[a("a",{attrs:{href:"#keywords-for-objects"}},[t._v("Keywords for objects")]),a("ul",[a("li",[a("a",{attrs:{href:"#maxproperties-minproperties"}},[t._v("maxProperties / minProperties")])]),a("li",[a("a",{attrs:{href:"#required"}},[t._v("required")])]),a("li",[a("a",{attrs:{href:"#properties"}},[t._v("properties")])]),a("li",[a("a",{attrs:{href:"#patternproperties"}},[t._v("patternProperties")])]),a("li",[a("a",{attrs:{href:"#additionalproperties"}},[t._v("additionalProperties")])]),a("li",[a("a",{attrs:{href:"#dependencies"}},[t._v("dependencies "),a("Badge",{attrs:{text:"deprecated in draft 2019-09",type:"warning"}})],1)]),a("li",[a("a",{attrs:{href:"#dependentrequired"}},[t._v("dependentRequired "),a("Badge",{attrs:{text:"NEW: draft 2019-09"}})],1)]),a("li",[a("a",{attrs:{href:"#dependentschemas"}},[t._v("dependentSchemas "),a("Badge",{attrs:{text:"NEW: draft 2019-09"}})],1)]),a("li",[a("a",{attrs:{href:"#propertynames"}},[t._v("propertyNames")])]),a("li",[a("a",{attrs:{href:"#unevaluatedproperties"}},[t._v("unevaluatedProperties "),a("Badge",{attrs:{text:"NEW: draft 2019-09"}})],1)]),a("li",[a("a",{attrs:{href:"#discriminator"}},[t._v("discriminator "),a("Badge",{attrs:{text:"NEW: OpenAPI"}})],1)])])]),a("li",[a("a",{attrs:{href:"#keywords-for-all-types"}},[t._v("Keywords for all types")]),a("ul",[a("li",[a("a",{attrs:{href:"#enum"}},[t._v("enum")])]),a("li",[a("a",{attrs:{href:"#const"}},[t._v("const")])])])]),a("li",[a("a",{attrs:{href:"#compound-keywords"}},[t._v("Compound keywords")]),a("ul",[a("li",[a("a",{attrs:{href:"#not"}},[t._v("not")])]),a("li",[a("a",{attrs:{href:"#oneof"}},[t._v("oneOf")])]),a("li",[a("a",{attrs:{href:"#anyof"}},[t._v("anyOf")])]),a("li",[a("a",{attrs:{href:"#allof"}},[t._v("allOf")])]),a("li",[a("a",{attrs:{href:"#if-then-else"}},[t._v("if/then/else")])])])]),a("li",[a("a",{attrs:{href:"#metadata-keywords"}},[t._v("Metadata keywords")])])])]),a("p"),t._v(" "),a("h2",{attrs:{id:"json-schema-versions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#json-schema-versions"}},[t._v("#")]),t._v(" JSON Schema versions")]),t._v(" "),a("h3",{attrs:{id:"draft-07"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#draft-07"}},[t._v("#")]),t._v(" draft-07 "),a("Badge",{attrs:{text:"default"}})],1),t._v(" "),a("p",[t._v("This version is provided as default export:")]),t._v(" "),a("code-group",[a("code-block",{attrs:{title:"JavaScript"}},[a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" Ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]),t._v(" "),a("code-block",{attrs:{title:"TypeScript"}},[a("div",{staticClass:"language-typescript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-typescript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" Ajv "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])])],1),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("draft-07 has better performance")]),t._v(" "),a("p",[t._v("Unless you need the new features of later versions, you would have more efficient generated code with this draft.")])]),t._v(" "),a("h3",{attrs:{id:"draft-2019-09"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#draft-2019-09"}},[t._v("#")]),t._v(" draft-2019-09 "),a("Badge",{attrs:{text:"NEW"}})],1),t._v(" "),a("p",[t._v("Ajv supports all new keywords of JSON Schema draft-2019-09:")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"#unevaluatedproperties"}},[t._v("unevaluatedProperties")])]),t._v(" "),a("li",[a("a",{attrs:{href:"#unevaluateditems"}},[t._v("unevaluatedItems")])]),t._v(" "),a("li",[a("a",{attrs:{href:"#dependentrequired"}},[t._v("dependentRequired")])]),t._v(" "),a("li",[a("a",{attrs:{href:"#dependentschemas"}},[t._v("dependentSchemas")])]),t._v(" "),a("li",[a("a",{attrs:{href:"#maxcontains--mincontains"}},[t._v("maxContains/minContains")])]),t._v(" "),a("li",[a("RouterLink",{attrs:{to:"/guide/combining-schemas.html#extending-recursive-schemas"}},[t._v("$recursiveAnchor/$recursiveRef")])],1)]),t._v(" "),a("p",[t._v("To use draft-2019-09 schemas you need to import a different Ajv class:")]),t._v(" "),a("code-group",[a("code-block",{attrs:{title:"JavaScript"}},[a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" Ajv2019 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv/dist/2019"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv2019")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]),t._v(" "),a("code-block",{attrs:{title:"TypeScript"}},[a("div",{staticClass:"language-typescript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-typescript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" Ajv2019 "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv/dist/2019"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv2019")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])])],1),t._v(" "),a("p",[t._v("You can use draft-07 schemas with this Ajv instance as well, draft-2019-09 is backwards compatible. If your schemas use "),a("code",[t._v("$schema")]),t._v(" keyword, you need to add draft-07 meta-schema to Ajv instance:")]),t._v(" "),a("code-group",[a("code-block",{attrs:{title:"JavaScript"}},[a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" draft7MetaSchema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv/dist/refs/json-schema-draft-07.json"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\najv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMetaSchema")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("draft7MetaSchema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]),t._v(" "),a("code-block",{attrs:{title:"TypeScript"}},[a("div",{staticClass:"language-typescript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-typescript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" draft7MetaSchema "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv/dist/refs/json-schema-draft-07.json"')]),t._v("\najv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMetaSchema")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("draft7MetaSchema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])])],1),t._v(" "),a("h3",{attrs:{id:"draft-2020-12"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#draft-2020-12"}},[t._v("#")]),t._v(" draft-2020-12 "),a("Badge",{attrs:{text:"BREAKING",type:"warning"}})],1),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("draft-2020-12 is not backwards compatible")]),t._v(" "),a("p",[t._v("You cannot use draft-2020-12 and previous JSON Schema versions in the same Ajv instance.")])]),t._v(" "),a("p",[t._v("Ajv supports all keywords of JSON Schema draft-2020-12:")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"#prefixItems"}},[t._v("prefixItems")]),t._v(" that replaced array form of items keyword")]),t._v(" "),a("li",[t._v("changed "),a("a",{attrs:{href:"#items-in-draft-2020-12"}},[t._v("items")]),t._v(" keyword that combined parts of functionality of items and additionalItems")]),t._v(" "),a("li",[a("RouterLink",{attrs:{to:"/guide/combining-schemas.html#extending-recursive-schemas"}},[t._v("$dynamicAnchor/$dynamicRef")])],1)]),t._v(" "),a("p",[t._v("To use draft-2020-12 schemas you need to import a different Ajv class:")]),t._v(" "),a("code-group",[a("code-block",{attrs:{title:"JavaScript"}},[a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" Ajv2020 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv/dist/2020"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv2020")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]),t._v(" "),a("code-block",{attrs:{title:"TypeScript"}},[a("div",{staticClass:"language-typescript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-typescript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" Ajv2020 "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv/dist/2020"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv2020")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])])],1),t._v(" "),a("h3",{attrs:{id:"draft-06"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#draft-06"}},[t._v("#")]),t._v(" draft-06")]),t._v(" "),a("p",[t._v("You can use JSON Schema draft-06 schemas with Ajv v7/8. If your schemas use "),a("code",[t._v("$schema")]),t._v(" keyword, you need to add draft-06 meta-schema to Ajv instance. This example shows how to support both draft-06 and draft-07 schemas:")]),t._v(" "),a("code-group",[a("code-block",{attrs:{title:"JavaScript"}},[a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" Ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" draft6MetaSchema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv/dist/refs/json-schema-draft-06.json"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\najv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMetaSchema")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("draft6MetaSchema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]),t._v(" "),a("code-block",{attrs:{title:"TypeScript"}},[a("div",{staticClass:"language-typescript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-typescript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" Ajv "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" draft6MetaSchema "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv/dist/refs/json-schema-draft-06.json"')]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\najv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMetaSchema")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("draft6MetaSchema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])])],1),t._v(" "),a("h3",{attrs:{id:"draft-04"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#draft-04"}},[t._v("#")]),t._v(" draft-04")]),t._v(" "),a("p",[t._v("You can use JSON Schema draft-04 schemas with Ajv from v8.5.0 and the additional package "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv-draft-04",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-draft-04"),a("OutboundLink")],1),t._v(" (both ajv and ajv-draft-04 should be installed).")]),t._v(" "),a("code-group",[a("code-block",{attrs:{title:"JavaScript"}},[a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" Ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv-draft-04"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]),t._v(" "),a("code-block",{attrs:{title:"TypeScript"}},[a("div",{staticClass:"language-typescript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-typescript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" Ajv "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv-draft-04"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])])],1),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Ajv cannot combine multiple JSON Schema versions")]),t._v(" "),a("p",[t._v("You can only use this import with JSON Schema draft-04, you cannot combine multiple JSON Schema versions in this ajv instance.")])]),t._v(" "),a("h2",{attrs:{id:"openapi-support"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#openapi-support"}},[t._v("#")]),t._v(" OpenAPI support")]),t._v(" "),a("p",[t._v("Ajv supports these additional "),a("a",{attrs:{href:"https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("OpenAPI specification"),a("OutboundLink")],1),t._v(" keywords:")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"#nullable"}},[t._v("nullable")]),t._v(" - to avoid using "),a("code",[t._v("type")]),t._v(" keyword with array of types.")]),t._v(" "),a("li",[a("a",{attrs:{href:"#discriminator"}},[t._v("discriminator")]),t._v(" - to optimize validation and error reporting of tagged unions")])]),t._v(" "),a("h2",{attrs:{id:"json-data-type"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#json-data-type"}},[t._v("#")]),t._v(" JSON data type")]),t._v(" "),a("h3",{attrs:{id:"type"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#type"}},[t._v("#")]),t._v(" "),a("code",[t._v("type")])]),t._v(" "),a("p",[a("code",[t._v("type")]),t._v(" keyword requires that the data is of certain type (or some of types). Its value can be a string (the allowed type) or an array of strings (multiple allowed types).")]),t._v(" "),a("p",[t._v("Type can be: "),a("code",[t._v("number")]),t._v(", "),a("code",[t._v("integer")]),t._v(", "),a("code",[t._v("string")]),t._v(", "),a("code",[t._v("boolean")]),t._v(", "),a("code",[t._v("array")]),t._v(", "),a("code",[t._v("object")]),t._v(" or "),a("code",[t._v("null")]),t._v(".")]),t._v(" "),a("p",[a("strong",[t._v("Examples")])]),t._v(" "),a("ol",[a("li",[a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "number"}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("1")]),t._v(", "),a("code",[t._v("1.5")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('"abc"')]),t._v(", "),a("code",[t._v('"1"')]),t._v(", "),a("code",[t._v("[]")]),t._v(", "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v("null")]),t._v(", "),a("code",[t._v("true")])])])]),t._v(" "),a("ol",{attrs:{start:"2"}},[a("li",[a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "integer"}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("1")]),t._v(", "),a("code",[t._v("2")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('"abc"')]),t._v(", "),a("code",[t._v('"1"')]),t._v(", "),a("code",[t._v("1.5")]),t._v(", "),a("code",[t._v("[]")]),t._v(", "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v("null")]),t._v(", "),a("code",[t._v("true")])])])]),t._v(" "),a("ol",{attrs:{start:"3"}},[a("li",[a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: ["number", "string"]}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("1")]),t._v(", "),a("code",[t._v("1.5")]),t._v(", "),a("code",[t._v('"abc"')]),t._v(", "),a("code",[t._v('"1"')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("[]")]),t._v(", "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v("null")]),t._v(", "),a("code",[t._v("true")])])])]),t._v(" "),a("p",[t._v("All examples above are JSON Schemas that only require data to be of certain type to be valid.")]),t._v(" "),a("p",[t._v("Most other keywords apply only to a particular type of data. If the data is of different type, the keyword will not apply and the data will be considered valid.")]),t._v(" "),a("p",[t._v("In v7 Ajv introduced "),a("RouterLink",{attrs:{to:"/strict-mode.html#strict-types"}},[t._v("Strict types")]),t._v(" mode that makes these mistakes less likely by requiring that types are constrained with type keyword whenever another keyword that applies to specific type is used.")],1),t._v(" "),a("h3",{attrs:{id:"nullable"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#nullable"}},[t._v("#")]),t._v(" nullable "),a("Badge",{attrs:{text:"OpenAPI"}})],1),t._v(" "),a("p",[t._v("This keyword can be used to allow "),a("code",[t._v("null")]),t._v(" value in addition to the defined "),a("code",[t._v("type")]),t._v(".")]),t._v(" "),a("p",[t._v("Ajv supports it by default, without additional options. These two schemas are equivalent, but the first one is better supported by some tools and is also compatible with "),a("code",[t._v("strictTypes")]),t._v(" option (see "),a("RouterLink",{attrs:{to:"/strict-mode.html#strict-types"}},[t._v("Strict types")]),t._v(")")],1),t._v(" "),a("div",{staticClass:"language-json extra-class"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"nullable"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("and")]),t._v(" "),a("div",{staticClass:"language-json extra-class"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"null"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("nullable does not extend enum and const")]),t._v(" "),a("p",[t._v("If you use "),a("a",{attrs:{href:"#enum"}},[t._v("enum")]),t._v(" or "),a("a",{attrs:{href:"#const"}},[t._v("const")]),t._v(" keywords, "),a("code",[t._v('"nullable": true')]),t._v(" would not extend the list of allowed values - "),a("code",[t._v("null")]),t._v(" value has to be explicitly added to "),a("code",[t._v("enum")]),t._v(" (and "),a("code",[t._v("const")]),t._v(" would fail, unless it is "),a("code",[t._v('"const": null')]),t._v(")")]),t._v(" "),a("p",[t._v("This is different from how "),a("code",[t._v("nullable")]),t._v(" is defined in "),a("RouterLink",{attrs:{to:"/json-type-definition.html"}},[t._v("JSON Type Definition")]),t._v(", where "),a("code",[t._v('"nullable": true')]),t._v(" allows "),a("code",[t._v("null")]),t._v(" value in addition to any data defined by the schema.")],1)]),t._v(" "),a("h2",{attrs:{id:"keywords-for-numbers"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#keywords-for-numbers"}},[t._v("#")]),t._v(" Keywords for numbers")]),t._v(" "),a("h3",{attrs:{id:"maximum-minimum-and-exclusivemaximum-exclusiveminimum"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#maximum-minimum-and-exclusivemaximum-exclusiveminimum"}},[t._v("#")]),t._v(" "),a("code",[t._v("maximum")]),t._v(" / "),a("code",[t._v("minimum")]),t._v(" and "),a("code",[t._v("exclusiveMaximum")]),t._v(" / "),a("code",[t._v("exclusiveMinimum")])]),t._v(" "),a("p",[t._v("The value of keyword "),a("code",[t._v("maximum")]),t._v(" ("),a("code",[t._v("minimum")]),t._v(") should be a number. This value is the maximum (minimum) allowed value for the data to be valid.")]),t._v(" "),a("p",[t._v("The value of keyword "),a("code",[t._v("exclusiveMaximum")]),t._v(" ("),a("code",[t._v("exclusiveMinimum")]),t._v(") should be a number. This value is the exclusive maximum (minimum) allowed value for the data to be valid (the data equal to this keyword value is invalid).")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("NO support for boolean keyword values")]),t._v(" "),a("p",[t._v("Boolean values for keywords "),a("code",[t._v("exclusiveMaximum")]),t._v(" ("),a("code",[t._v("exclusiveMinimum")]),t._v(") are not supported.")])]),t._v(" "),a("p",[a("strong",[t._v("Examples")])]),t._v(" "),a("ol",[a("li",[a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "number", maximum: 5}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("4")]),t._v(", "),a("code",[t._v("5")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("6")]),t._v(", "),a("code",[t._v("7")])])]),t._v(" "),a("li",[a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "number", minimum: 5}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("5")]),t._v(", "),a("code",[t._v("6")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("4")]),t._v(", "),a("code",[t._v("4.5")])])]),t._v(" "),a("li",[a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "number", exclusiveMinimum: 5}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("6")]),t._v(", "),a("code",[t._v("7")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("4.5")]),t._v(", "),a("code",[t._v("5")])])])]),t._v(" "),a("h3",{attrs:{id:"multipleof"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#multipleof"}},[t._v("#")]),t._v(" "),a("code",[t._v("multipleOf")])]),t._v(" "),a("p",[t._v("The value of the keyword should be a number. The data to be valid should be a multiple of the keyword value (i.e. the result of division of the data on the value should be integer).")]),t._v(" "),a("p",[a("strong",[t._v("Examples")])]),t._v(" "),a("ol",[a("li",[a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "number", multipleOf: 5}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("5")]),t._v(", "),a("code",[t._v("10")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("1")]),t._v(", "),a("code",[t._v("4")])])])]),t._v(" "),a("ol",{attrs:{start:"2"}},[a("li",[a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "number", multipleOf: 2.5}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("2.5")]),t._v(", "),a("code",[t._v("5")]),t._v(", "),a("code",[t._v("7.5")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("1")]),t._v(", "),a("code",[t._v("4")])])])]),t._v(" "),a("h2",{attrs:{id:"keywords-for-strings"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#keywords-for-strings"}},[t._v("#")]),t._v(" Keywords for strings")]),t._v(" "),a("h3",{attrs:{id:"maxlength-minlength"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#maxlength-minlength"}},[t._v("#")]),t._v(" "),a("code",[t._v("maxLength")]),t._v(" / "),a("code",[t._v("minLength")])]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Grapheme clusters will count as multiple characters")]),t._v(" "),a("p",[t._v("Certain charsets have characters that are made up of multiple Unicode code points. These "),a("a",{attrs:{href:"https://www.unicode.org/reports/tr29/tr29-17.html#Grapheme_Cluster_Boundaries",target:"_blank",rel:"noopener noreferrer"}},[t._v("grapheme clusters"),a("OutboundLink")],1),t._v(" are counted as multiple in length calculations.")])]),t._v(" "),a("p",[t._v("The value of the keywords should be a number. The data to be valid should have length satisfying this rule. Unicode pairs are counted as a single character.")]),t._v(" "),a("p",[a("strong",[t._v("Examples")])]),t._v(" "),a("ol",[a("li",[a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "string", maxLength: 5}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v('"abc"')]),t._v(", "),a("code",[t._v('"abcde"')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('"abcdef"')])])])]),t._v(" "),a("ol",{attrs:{start:"2"}},[a("li",[a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "string", minLength: 2}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v('"ab"')]),t._v(", "),a("code",[t._v('"😀😀"')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('"a"')]),t._v(", "),a("code",[t._v('"😀"')])])])]),t._v(" "),a("h3",{attrs:{id:"pattern"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#pattern"}},[t._v("#")]),t._v(" "),a("code",[t._v("pattern")])]),t._v(" "),a("p",[t._v("The value of the keyword should be a string. The data to be valid should match the regular expression defined by the keyword value.")]),t._v(" "),a("p",[t._v("Ajv uses "),a("code",[t._v('new RegExp(value, "u")')]),t._v(" to create the regular expression that will be used to test data.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "string", pattern: "[abc]+"}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v('"a"')]),t._v(", "),a("code",[t._v('"abcd"')]),t._v(", "),a("code",[t._v('"cde"')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('"def"')]),t._v(", "),a("code",[t._v('""')])]),t._v(" "),a("h3",{attrs:{id:"format"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#format"}},[t._v("#")]),t._v(" "),a("code",[t._v("format")])]),t._v(" "),a("p",[t._v("The value of the keyword should be a string. The data to be valid should match the format with this name.")]),t._v(" "),a("p",[t._v("Ajv does not include any formats, they can be added with "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv-formats",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-formats"),a("OutboundLink")],1),t._v(" plugin.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "string", format: "ipv4"}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v('"192.168.0.1"')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('"abc"')])]),t._v(" "),a("h2",{attrs:{id:"keywords-for-arrays"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#keywords-for-arrays"}},[t._v("#")]),t._v(" Keywords for arrays")]),t._v(" "),a("h3",{attrs:{id:"maxitems-minitems"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#maxitems-minitems"}},[t._v("#")]),t._v(" "),a("code",[t._v("maxItems")]),t._v(" / "),a("code",[t._v("minItems")])]),t._v(" "),a("p",[t._v("The value of the keywords should be a number. The data array to be valid should not have more (less) items than the keyword value.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "array", maxItems: 3}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("[]")]),t._v(", "),a("code",[t._v("[1]")]),t._v(", "),a("code",[t._v('["1", 2, "3"]')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("[1, 2, 3, 4]")])]),t._v(" "),a("h3",{attrs:{id:"uniqueitems"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#uniqueitems"}},[t._v("#")]),t._v(" "),a("code",[t._v("uniqueItems")])]),t._v(" "),a("p",[t._v("The value of the keyword should be a boolean. If the keyword value is "),a("code",[t._v("true")]),t._v(", the data array to be valid should have unique items.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "array", uniqueItems: true}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("[]")]),t._v(", "),a("code",[t._v("[1]")]),t._v(", "),a("code",[t._v('["1", 2, "3"]')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("[1, 2, 1]")]),t._v(", "),a("code",[t._v("[{a: 1, b: 2}, {b: 2, a: 1}]")])]),t._v(" "),a("h3",{attrs:{id:"items"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#items"}},[t._v("#")]),t._v(" "),a("code",[t._v("items")])]),t._v(" "),a("h4",{attrs:{id:"items-in-draft-04-06-07-and-2019-09"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#items-in-draft-04-06-07-and-2019-09"}},[t._v("#")]),t._v(" "),a("code",[t._v("items")]),t._v(" in draft-04, -06, -07 and -2019-09")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("items keyword changed in JSON Schema draft-2020-12")]),t._v(" "),a("p",[t._v("This section describes "),a("code",[t._v("items")]),t._v(" keyword in all JSON Schema versions prior to draft-2020-12.")])]),t._v(" "),a("p",[t._v("The value of the keyword should be a schema or an array of schemas.")]),t._v(" "),a("p",[t._v("If the keyword value is a schema, then for the data array to be valid each item of the array should be valid according to the schema. In this case the "),a("code",[t._v("additionalItems")]),t._v(" keyword is ignored.")]),t._v(" "),a("p",[t._v("If the keyword value is an array, then items with indices less than the number of items in the keyword should be valid according to the schemas with the same indices. Whether additional items are valid will depend on "),a("code",[t._v("additionalItems")]),t._v(" keyword.")]),t._v(" "),a("p",[a("strong",[t._v("Examples")])]),t._v(" "),a("ol",[a("li",[a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "array", items: {type: "integer"}}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("[1,2,3]")]),t._v(", "),a("code",[t._v("[]")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('[1,"abc"]')])])]),t._v(" "),a("li",[a("p",[a("em",[t._v("schema")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("items")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"integer"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("[1]")]),t._v(", "),a("code",[t._v('[1, "abc"]')]),t._v(", "),a("code",[t._v('[1, "abc", 2]')]),t._v(", "),a("code",[t._v("[]")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('["abc", 1]')]),t._v(", "),a("code",[t._v('["abc"]')])])])]),t._v(" "),a("p",[t._v("The schema in example 2 will log warning by default (see "),a("code",[t._v("strictTuples")]),t._v(" option), because it defines unconstrained tuple. To define a tuple with exactly 2 elements use "),a("code",[t._v("minItems")]),t._v(" and "),a("code",[t._v("additionalItems")]),t._v(" keywords (see example 1 in "),a("code",[t._v("additionalItems")]),t._v(").")]),t._v(" "),a("h4",{attrs:{id:"items-in-draft-2020-12"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#items-in-draft-2020-12"}},[t._v("#")]),t._v(" "),a("code",[t._v("items")]),t._v(" in draft-2020-12 "),a("Badge",{attrs:{text:"NEW"}})],1),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("items keyword changed in JSON Schema draft-2020-12")]),t._v(" "),a("p",[t._v("This section describes "),a("code",[t._v("items")]),t._v(" keyword in JSON draft-2020-12.")])]),t._v(" "),a("p",[t._v("The value of the keyword must be a schema.")]),t._v(" "),a("p",[t._v("For the data array to be valid:")]),t._v(" "),a("ul",[a("li",[t._v("if "),a("a",{attrs:{href:"#prefixItems"}},[t._v("prefixItems")]),t._v(" keyword is not used in the schema, then each item of the array must be valid according to the schema in "),a("code",[t._v("items")]),t._v(".")]),t._v(" "),a("li",[t._v("if "),a("a",{attrs:{href:"#prefixItems"}},[t._v("prefixItems")]),t._v(" keyword is used in the schema, then each item with the index starting from the size of "),a("code",[t._v("prefixItems")]),t._v(" schema must be valid according to the schema in "),a("code",[t._v("items")])])]),t._v(" "),a("p",[a("strong",[t._v("Examples")])]),t._v(" "),a("ol",[a("li",[a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "array", items: {type: "integer"}}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("[1,2,3]")]),t._v(", "),a("code",[t._v("[]")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('[1,"abc"]')])])]),t._v(" "),a("li",[a("p",[a("em",[t._v("schema")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("prefixItems")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"integer"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"integer"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("minItems")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("items")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("[1, 2]")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("[]")]),t._v(", "),a("code",[t._v("[1]")]),t._v(", "),a("code",[t._v("[1, 2, 3]")]),t._v(", "),a("code",[t._v('[1, "abc"]')]),t._v(" (any wrong number of items or wrong type)")])]),t._v(" "),a("li",[a("p",[a("em",[t._v("schema")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("prefixItems")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"integer"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"integer"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("items")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("[]")]),t._v(", "),a("code",[t._v("[1, 2]")]),t._v(", "),a("code",[t._v('[1, 2, "abc"]')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('["abc"]')]),t._v(", "),a("code",[t._v("[1, 2, 3]")])]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v('\n_valid_: `[1]`, `[1, "abc"]`, `[1, "abc", 2]`, `[]`\n\n_invalid_: `["abc", 1]`, `["abc"]`\n\n')])])])])]),t._v(" "),a("p",[t._v("The schema in example 3 will log warning by default (see "),a("code",[t._v("strictTuples")]),t._v(" option), because it defines unconstrained tuple. To define a tuple with exactly 2 elements use "),a("code",[t._v("minItems")]),t._v(" and "),a("code",[t._v("items")]),t._v(" keywords (see example 2).")]),t._v(" "),a("h3",{attrs:{id:"prefixitems"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#prefixitems"}},[t._v("#")]),t._v(" "),a("code",[t._v("prefixItems")]),t._v(" "),a("Badge",{attrs:{text:"NEW: draft 2020-12"}})],1),t._v(" "),a("p",[t._v("The value of the keyword must be an array of schemas.")]),t._v(" "),a("p",[t._v("For the data array to be valid, the items with indices less than the number of schemas in this keyword must be valid according to the schemas with the same indices. Whether additional items are valid will depend on "),a("code",[t._v("items")]),t._v(" keyword.")]),t._v(" "),a("p",[a("strong",[t._v("Examples")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("prefixItems")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"integer"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("[1]")]),t._v(", "),a("code",[t._v('[1, "abc"]')]),t._v(", "),a("code",[t._v('[1, "abc", 2]')]),t._v(", "),a("code",[t._v("[]")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('["abc", 1]')]),t._v(", "),a("code",[t._v('["abc"]')])]),t._v(" "),a("p",[t._v("The schema in example will log warning by default (see "),a("code",[t._v("strictTuples")]),t._v(" option), because it defines unconstrained tuple. To define a tuple with exactly 2 elements use "),a("a",{attrs:{href:"#minitems"}},[t._v("minItems")]),t._v(" and "),a("a",{attrs:{href:"#items-in-draft-2020-12"}},[t._v("items")]),t._v(" keywords (see example 2 in "),a("a",{attrs:{href:"#items-in-draft-2020-12"}},[t._v("items")]),t._v(").")]),t._v(" "),a("h3",{attrs:{id:"additionalitems"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#additionalitems"}},[t._v("#")]),t._v(" "),a("code",[t._v("additionalItems")])]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("additionalItems is not supported in JSON Schema draft-2020-12")]),t._v(" "),a("p",[t._v("To create and equivalent schema in draft-2020-12 use keywords "),a("a",{attrs:{href:"#prefixItems"}},[t._v("prefixItems")]),t._v(" and the new "),a("a",{attrs:{href:"#items-in-draft-2020-12"}},[t._v("items")]),t._v(" keyword")])]),t._v(" "),a("p",[t._v("The value of the keyword should be a boolean or an object.")]),t._v(" "),a("p",[a("code",[t._v("additionalItems")]),t._v(" keyword is ignored if "),a("code",[t._v("items")]),t._v(" keyword is not present or is an object. By default Ajv will throw exception in this case - see "),a("RouterLink",{attrs:{to:"/strict-mode.html"}},[t._v("Strict mode")])],1),t._v(" "),a("p",[a("code",[t._v("additionalItems")]),t._v(" keyword is ignored if "),a("code",[t._v("items")]),t._v(" keyword has more elements than data array.")]),t._v(" "),a("p",[t._v("If the data array has more elements than the "),a("code",[t._v("items")]),t._v(" keyword value then the result of the validation depends on the value of "),a("code",[t._v("additionalItems")]),t._v(" keyword:")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("false")]),t._v(": data is invalid")]),t._v(" "),a("li",[a("code",[t._v("true")]),t._v(": data is valid")]),t._v(" "),a("li",[t._v('an object: data is valid if all additional items (i.e. items with indices greater or equal than "items" keyword value length) are valid according to the schema in "additionalItems" keyword.')])]),t._v(" "),a("p",[t._v("The schemas in examples 2-3 log warning by default, use option "),a("code",[t._v("strictTuples: false")]),t._v(" to allow)")]),t._v(" "),a("p",[a("strong",[t._v("Examples")])]),t._v(" "),a("ol",[a("li",[a("p",[a("em",[t._v("schema")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("items")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"integer"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"integer"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("minItems")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalItems")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("[1, 2]")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("[]")]),t._v(", "),a("code",[t._v("[1]")]),t._v(", "),a("code",[t._v("[1, 2, 3]")]),t._v(", "),a("code",[t._v('[1, "abc"]')]),t._v(" (any wrong number of items or wrong type)")])]),t._v(" "),a("li",[a("p",[a("em",[t._v("schema")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("items")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"integer"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"integer"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalItems")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("[]")]),t._v(", "),a("code",[t._v("[1, 2]")]),t._v(", "),a("code",[t._v("[1, 2, 3]")]),t._v(", "),a("code",[t._v('[1, 2, "abc"]')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('["abc"]')]),t._v(", "),a("code",[t._v('[1, "abc", 3]')])])]),t._v(" "),a("li",[a("p",[a("em",[t._v("schema")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("items")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"integer"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"integer"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalItems")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("[]")]),t._v(", "),a("code",[t._v("[1, 2]")]),t._v(", "),a("code",[t._v('[1, 2, "abc"]')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('["abc"]')]),t._v(", "),a("code",[t._v("[1, 2, 3]")])])])]),t._v(" "),a("h3",{attrs:{id:"contains"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#contains"}},[t._v("#")]),t._v(" "),a("code",[t._v("contains")])]),t._v(" "),a("p",[t._v("The value of the keyword is a JSON Schema. The array is valid if it contains at least one item that is valid according to this schema.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "array", contains: {type: "integer"}}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("[1]")]),t._v(", "),a("code",[t._v('[1, "foo"]')]),t._v(", any array with at least one integer")]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("[]")]),t._v(", "),a("code",[t._v('["foo", "bar"]')]),t._v(", any array without integers")]),t._v(" "),a("h3",{attrs:{id:"maxcontains-mincontains"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#maxcontains-mincontains"}},[t._v("#")]),t._v(" "),a("code",[t._v("maxContains")]),t._v(" / "),a("code",[t._v("minContains")]),t._v(" "),a("Badge",{attrs:{text:"NEW: draft 2019-09"}})],1),t._v(" "),a("p",[t._v("The value of these keywords should be an integer.")]),t._v(" "),a("p",[t._v("Without "),a("code",[t._v("contains")]),t._v(" keyword they are ignored (logs error or throws exception in ajv "),a("RouterLink",{attrs:{to:"/strict-mode.html"}},[t._v("strict mode")]),t._v(").")],1),t._v(" "),a("p",[t._v("The array is valid if it contains at least "),a("code",[t._v("minContains")]),t._v(" items and no more than "),a("code",[t._v("maxContains")]),t._v(" items that are valid against the schema in "),a("code",[t._v("contains")]),t._v(" keyword.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("contains")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"integer"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("minContains")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("maxContains")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("[1, 2]")]),t._v(", "),a("code",[t._v('[1, 2, 3, "foo"]')]),t._v(", any array with 2 or 3 integers")]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("[]")]),t._v(", "),a("code",[t._v('[1, "foo"]')]),t._v(", "),a("code",[t._v("[1, 2, 3, 4]")]),t._v(", any array with fewer than 2 or more than 3 integers")]),t._v(" "),a("h3",{attrs:{id:"unevaluateditems"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#unevaluateditems"}},[t._v("#")]),t._v(" "),a("code",[t._v("unevaluatedItems")]),t._v(" "),a("Badge",{attrs:{text:"NEW: draft 2019-09"}})],1),t._v(" "),a("p",[t._v("The value of this keyword is a JSON Schema (can be a boolean).")]),t._v(" "),a("p",[t._v("This schema will be applied to all array items that were not evaluated by other keywords for items ("),a("code",[t._v("items")]),t._v(", "),a("code",[t._v("additionalItems")]),t._v(" and "),a("code",[t._v("contains")]),t._v(") in the current schema and all sub-schemas that were valid for this data instance. It includes:")]),t._v(" "),a("ul",[a("li",[t._v("all subschemas schemas in "),a("code",[t._v("allOf")]),t._v(" and "),a("code",[t._v("$ref")]),t._v(" keywords")]),t._v(" "),a("li",[t._v("valid sub-schemas in "),a("code",[t._v("oneOf")]),t._v(" and "),a("code",[t._v("anyOf")]),t._v(" keywords")]),t._v(" "),a("li",[t._v("sub-schema in "),a("code",[t._v("if")]),t._v(" keyword")]),t._v(" "),a("li",[t._v("sub-schemas in "),a("code",[t._v("then")]),t._v(" or "),a("code",[t._v("else")]),t._v(" keywords that were applied based on the validation result by "),a("code",[t._v("if")]),t._v(" keyword.")])]),t._v(" "),a("p",[t._v("The only scenario when this keyword would be applied to some items is when "),a("code",[t._v("items")]),t._v(" keyword value is an array of schemas and "),a("code",[t._v("additionalItems")]),t._v(" was not present (or did not apply, in case it was present in some invalid subschema).")]),t._v(" "),a("p",[t._v('Some user-defined keywords can also make items "evaluated".')]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("items")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("unevaluatedItems")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("anyOf")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("items")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("items")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"boolean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("[1, 2, 3]")]),t._v(", "),a("code",[t._v("[1, 2, true]")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(":")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("[1, 2]")]),t._v(" - the third item is not present")]),t._v(" "),a("li",[a("code",[t._v('[1, 2, "3"]')]),t._v(' - the third item is "unevaluated"')])]),t._v(" "),a("p",[t._v("See "),a("a",{attrs:{href:"https://github.com/json-schema-org/JSON-Schema-Test-Suite/blob/master/tests/draft2019-09/unevaluatedItems.json",target:"_blank",rel:"noopener noreferrer"}},[t._v("tests"),a("OutboundLink")],1),t._v(" for "),a("code",[t._v("unevaluatedItems")]),t._v(" keyword for other examples.")]),t._v(" "),a("h2",{attrs:{id:"keywords-for-objects"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#keywords-for-objects"}},[t._v("#")]),t._v(" Keywords for objects")]),t._v(" "),a("h3",{attrs:{id:"maxproperties-minproperties"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#maxproperties-minproperties"}},[t._v("#")]),t._v(" "),a("code",[t._v("maxProperties")]),t._v(" / "),a("code",[t._v("minProperties")])]),t._v(" "),a("p",[t._v("The value of the keywords should be a number. The data object to be valid should have not more (less) properties than the keyword value.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "object", maxProperties: 2 }')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v("{a: 1}")]),t._v(", "),a("code",[t._v('{a: "1", b: 2}')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("{a: 1, b: 2, c: 3}")])]),t._v(" "),a("h3",{attrs:{id:"required"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#required"}},[t._v("#")]),t._v(" "),a("code",[t._v("required")])]),t._v(" "),a("p",[t._v("The value of the keyword should be an array of unique strings. The data object to be valid should contain all properties with names equal to the elements in the keyword value.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "object", required: ["a", "b"]}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("{a: 1, b: 2}")]),t._v(", "),a("code",[t._v("{a: 1, b: 2, c: 3}")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v("{a: 1}")]),t._v(", "),a("code",[t._v("{c: 3, d: 4}")])]),t._v(" "),a("h3",{attrs:{id:"properties"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" "),a("code",[t._v("properties")])]),t._v(" "),a("p",[t._v("The value of the keyword should be a map with keys equal to data object properties. Each value in the map should be a JSON Schema. For data object to be valid the corresponding values in data object properties should be valid according to these schemas.")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Properties are not required")]),t._v(" "),a("p",[a("code",[t._v("properties")]),t._v(" keyword does not require that the properties mentioned in it are present in the object (see examples).")])]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("minimum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v('{foo: "a"}')]),t._v(", "),a("code",[t._v('{foo: "a", bar: 2}')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("{foo: 1}")]),t._v(", "),a("code",[t._v('{foo: "a", bar: 1}')])]),t._v(" "),a("h3",{attrs:{id:"patternproperties"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#patternproperties"}},[t._v("#")]),t._v(" "),a("code",[t._v("patternProperties")])]),t._v(" "),a("p",[t._v("The value of this keyword should be a map where keys should be regular expressions and the values should be JSON Schemas. For data object to be valid the values in data object properties that match regular expression(s) should be valid according to the corresponding schema(s).")]),t._v(" "),a("p",[t._v("When the value in data object property matches multiple regular expressions it should be valid according to all the schemas for all matched regular expressions.")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Unexpected validation results")]),t._v(" "),a("ol",[a("li",[a("code",[t._v("patternProperties")]),t._v(" keyword does not require that properties matching patterns are present in the object (see examples).")]),t._v(" "),a("li",[t._v("By default, Ajv does not allow schemas where patterns in "),a("code",[t._v("patternProperties")]),t._v(" match any property name in "),a("code",[t._v("properties")]),t._v(" keyword - that leads to unexpected validation results. It can be allowed with option "),a("code",[t._v("allowMatchingProperties")]),t._v(". See "),a("RouterLink",{attrs:{to:"/strict-mode.html"}},[t._v("Strict mode")])],1)])]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("patternProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"^fo.*$"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"^ba.*$"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v('{foo: "a"}')]),t._v(", "),a("code",[t._v('{foo: "a", bar: 1}')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("{foo: 1}")]),t._v(", "),a("code",[t._v('{foo: "a", bar: "b"}')])]),t._v(" "),a("h3",{attrs:{id:"additionalproperties"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#additionalproperties"}},[t._v("#")]),t._v(" "),a("code",[t._v("additionalProperties")])]),t._v(" "),a("p",[t._v("The value of the keyword should be either a boolean or a JSON Schema.")]),t._v(" "),a("p",[t._v("If the value is "),a("code",[t._v("true")]),t._v(" the keyword is ignored.")]),t._v(" "),a("p",[t._v("If the value is "),a("code",[t._v("false")]),t._v(' the data object to be valid should not have "additional properties" (i.e. properties other than those used in "properties" keyword and those that match patterns in "patternProperties" keyword).')]),t._v(" "),a("p",[t._v('If the value is a schema for the data object to be valid the values in all "additional properties" should be valid according to this schema.')]),t._v(" "),a("p",[a("strong",[t._v("Examples")])]),t._v(" "),a("ol",[a("li",[a("p",[a("em",[t._v("schema")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("patternProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"^.*r$"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v("{foo: 1}")]),t._v(", "),a("code",[t._v("{foo: 1, bar: 2}")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("{a: 3}")]),t._v(", "),a("code",[t._v("{foo: 1, baz: 3}")])])]),t._v(" "),a("li",[a("p",[a("em",[t._v("schema")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("patternProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"^.*r$"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v('{a: "b"}')]),t._v(", "),a("code",[t._v("{foo: 1}")]),t._v(", "),a("code",[t._v("{foo: 1, bar: 2}")]),t._v(", "),a("code",[t._v('{foo: 1, bar: 2, a: "b"}')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("{a: 3}")]),t._v(", "),a("code",[t._v("{foo: 1, baz: 3}")])])]),t._v(" "),a("li",[a("p",[a("em",[t._v("schema")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("anyOf")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("baz")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v("{foo: 1}")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("{bar: 2}")]),t._v(", "),a("code",[t._v("{baz: 3}")]),t._v(", "),a("code",[t._v("{foo: 1, bar: 2}")]),t._v(", etc.")])])]),t._v(" "),a("h3",{attrs:{id:"dependencies"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#dependencies"}},[t._v("#")]),t._v(" "),a("code",[t._v("dependencies")]),t._v(" "),a("Badge",{attrs:{text:"deprecated in draft 2019-09",type:"warning"}})],1),t._v(" "),a("p",[t._v("This keyword is deprecated. The same functionality is available with keywords "),a("code",[t._v("dependentRequired")]),t._v(" and "),a("code",[t._v("dependentSchemas")]),t._v(".")]),t._v(" "),a("p",[t._v('The value of the keyword is a map with keys equal to data object properties. Each value in the map should be either an array of unique property names ("property dependency" - see '),a("a",{attrs:{href:"#%60dependentrequired%60"}},[a("code",[t._v("dependentRequired")])]),t._v(' keyword) or a JSON Schema ("schema dependency" - see '),a("a",{attrs:{href:"#%60dependentschemas%60"}},[a("code",[t._v("dependentSchemas")])]),t._v(" keyword).")]),t._v(" "),a("p",[t._v("For property dependency, if the data object contains a property that is a key in the keyword value, then to be valid the data object should also contain all properties from the array of properties.")]),t._v(" "),a("p",[t._v("For schema dependency, if the data object contains a property that is a key in the keyword value, then to be valid the data object itself (NOT the property value) should be valid according to the schema.")]),t._v(" "),a("p",[a("strong",[t._v("Examples")])]),t._v(" "),a("ol",[a("li",[a("p",[a("em",[t._v("schema (property dependency)")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("dependencies")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bar"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"baz"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("{foo: 1, bar: 2, baz: 3}")]),t._v(", "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v("{a: 1}")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("{foo: 1}")]),t._v(", "),a("code",[t._v("{foo: 1, bar: 2}")]),t._v(", "),a("code",[t._v("{foo: 1, baz: 3}")])])]),t._v(" "),a("li",[a("p",[a("em",[t._v("schema (schema dependency)")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("dependencies")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v("{foo: 1}")]),t._v(", "),a("code",[t._v("{foo: 1, bar: 2}")]),t._v(", "),a("code",[t._v("{a: 1}")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('{foo: 1, bar: "a"}')])])])]),t._v(" "),a("h3",{attrs:{id:"dependentrequired"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#dependentrequired"}},[t._v("#")]),t._v(" "),a("code",[t._v("dependentRequired")]),t._v(" "),a("Badge",{attrs:{text:"NEW: draft 2019-09"}})],1),t._v(" "),a("p",[t._v("The value of this keyword should be a map with keys equal to data object properties. Each value in the map should be an array of unique property names.")]),t._v(" "),a("p",[t._v("If the data object contains a property that is a key in the keyword value, then to be valid the data object should also contain all properties from the corresponding array of properties in this keyword.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("dependentRequired")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bar"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"baz"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("{foo: 1, bar: 2, baz: 3}")]),t._v(", "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v("{a: 1}")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("{foo: 1}")]),t._v(", "),a("code",[t._v("{foo: 1, bar: 2}")]),t._v(", "),a("code",[t._v("{foo: 1, baz: 3}")])]),t._v(" "),a("h3",{attrs:{id:"dependentschemas"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#dependentschemas"}},[t._v("#")]),t._v(" "),a("code",[t._v("dependentSchemas")]),t._v(" "),a("Badge",{attrs:{text:"NEW: draft 2019-09"}})],1),t._v(" "),a("p",[t._v("The value of the keyword should be a map with keys equal to data object properties. Each value in the map should be a JSON Schema.")]),t._v(" "),a("p",[t._v("If the data object contains a property that is a key in the keyword value, then to be valid the data object itself (NOT the property value) should be valid according to the corresponding schema in this keyword.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("dependentSchemas")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v("{foo: 1}")]),t._v(", "),a("code",[t._v("{foo: 1, bar: 2}")]),t._v(", "),a("code",[t._v("{a: 1}")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('{foo: 1, bar: "a"}')])]),t._v(" "),a("h3",{attrs:{id:"propertynames"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#propertynames"}},[t._v("#")]),t._v(" "),a("code",[t._v("propertyNames")])]),t._v(" "),a("p",[t._v("The value of this keyword is a JSON Schema.")]),t._v(" "),a("p",[t._v("For data object to be valid each property name in this object should be valid according to this schema.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(" (requires "),a("code",[t._v("email")]),t._v(" format from "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv-formats",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-formats"),a("OutboundLink")],1),t._v("):")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("propertyNames")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("format")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"email"')]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v('{"foo@bar.com": "any", "bar@bar.com": "any"}')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('{foo: "any value"}')])]),t._v(" "),a("h3",{attrs:{id:"unevaluatedproperties"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#unevaluatedproperties"}},[t._v("#")]),t._v(" "),a("code",[t._v("unevaluatedProperties")]),t._v(" "),a("Badge",{attrs:{text:"NEW: draft 2019-09"}})],1),t._v(" "),a("p",[t._v("The value of this keyword is a JSON Schema (can be a boolean).")]),t._v(" "),a("p",[t._v("This schema will be applied to all properties that were not evaluated by other keywords for properties ("),a("code",[t._v("properties")]),t._v(", "),a("code",[t._v("patternProperties")]),t._v(" and "),a("code",[t._v("additionalProperties")]),t._v(") in the current schema and all sub-schemas that were valid for this data instance. It includes:")]),t._v(" "),a("ul",[a("li",[t._v("all subschemas schemas in "),a("code",[t._v("allOf")]),t._v(" and "),a("code",[t._v("$ref")]),t._v(" keywords")]),t._v(" "),a("li",[t._v("valid sub-schemas in "),a("code",[t._v("oneOf")]),t._v(" and "),a("code",[t._v("anyOf")]),t._v(" keywords")]),t._v(" "),a("li",[t._v("sub-schema in "),a("code",[t._v("if")]),t._v(" keyword")]),t._v(" "),a("li",[t._v("sub-schemas in "),a("code",[t._v("then")]),t._v(" or "),a("code",[t._v("else")]),t._v(" keywords that were applied based on the validation result by "),a("code",[t._v("if")]),t._v(" keyword.")])]),t._v(" "),a("p",[t._v('Some user-defined keywords can also make properties "evaluated".')]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"foo"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("unevaluatedProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("anyOf")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bar"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"baz"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("baz")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("{foo: 1, bar: 2}")]),t._v(", "),a("code",[t._v("{foo: 1, baz: 2}")]),t._v(", "),a("code",[t._v("{foo: 1, bar: 2, baz: 3}")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(":")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("{foo: 1}")]),t._v(" - neither "),a("code",[t._v("bar")]),t._v(" nor "),a("code",[t._v("baz")]),t._v(" are present")]),t._v(" "),a("li",[a("code",[t._v("{foo: 1, bar: 2, boo: 3}")]),t._v(" - "),a("code",[t._v("boo")]),t._v(" is unevaluated")]),t._v(" "),a("li",[a("code",[t._v('{foo: 1, bar: 2, baz: "3"}')]),t._v(" - not valid against the 2nd subschema, so "),a("code",[t._v("baz")]),t._v(' is "unevaluated".')])]),t._v(" "),a("p",[t._v("See "),a("a",{attrs:{href:"https://github.com/json-schema-org/JSON-Schema-Test-Suite/blob/master/tests/draft2019-09/unevaluatedProperties.json",target:"_blank",rel:"noopener noreferrer"}},[t._v("tests"),a("OutboundLink")],1),t._v(" for "),a("code",[t._v("unevaluatedProperties")]),t._v(" keyword for other examples.")]),t._v(" "),a("h3",{attrs:{id:"discriminator"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#discriminator"}},[t._v("#")]),t._v(" discriminator "),a("Badge",{attrs:{text:"NEW: OpenAPI"}})],1),t._v(" "),a("p",[t._v("Ajv has a limited support for "),a("code",[t._v("discriminator")]),t._v(" keyword: to optimize validation, error handling, and "),a("RouterLink",{attrs:{to:"/guide/modifying-data.html"}},[t._v("modifying data")]),t._v(" with "),a("a",{attrs:{href:"#oneof"}},[t._v("oneOf")]),t._v(" keyword.")],1),t._v(" "),a("p",[t._v("Its value should be an object with a property "),a("code",[t._v("propertyName")]),t._v(" - the name of the property used to discriminate between union members.")]),t._v(" "),a("p",[t._v("When using discriminator keyword only one subschema in "),a("code",[t._v("oneOf")]),t._v(" will be used, determined by the value of discriminator property.")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Use option discriminator")]),t._v(" "),a("p",[t._v("To use "),a("code",[t._v("discriminator")]),t._v(" keyword you have to use option "),a("code",[t._v("discriminator: true")]),t._v(" with Ajv constructor - it is not enabled by default.")])]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("discriminator")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("propertyName")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"foo"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"foo"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("oneOf")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"x"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("a")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"a"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("enum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"y"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"z"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("b")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"b"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v('{foo: "x", a: "any"}')]),t._v(", "),a("code",[t._v('{foo: "y", b: "any"}')]),t._v(", "),a("code",[t._v('{foo: "z", b: "any"}')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(":")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("{}")]),t._v(", "),a("code",[t._v("{foo: 1}")]),t._v(" - discriminator tag must be string")]),t._v(" "),a("li",[a("code",[t._v('{foo: "bar"}')]),t._v(" - discriminator tag value must be in oneOf subschema")]),t._v(" "),a("li",[a("code",[t._v('{foo: "x", b: "b"}')]),t._v(", "),a("code",[t._v('{foo: "y", a: "a"}')]),t._v(" - invalid object")])]),t._v(" "),a("p",[t._v("From the perspective of validation result "),a("code",[t._v("discriminator")]),t._v(" is defined as no-op (that is, removing discriminator will not change the validity of the data), but errors reported in case of invalid data will be different.")]),t._v(" "),a("p",[t._v("There are following requirements and limitations of using "),a("code",[t._v("discriminator")]),t._v(" keyword:")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("mapping")]),t._v(" in discriminator object is not supported.")]),t._v(" "),a("li",[a("a",{attrs:{href:"#oneof"}},[t._v("oneOf")]),t._v(" keyword must be present in the same schema.")]),t._v(" "),a("li",[t._v("discriminator property should be "),a("a",{attrs:{href:"#required"}},[t._v("required")]),t._v(" either on the top level, as in the example, or in all "),a("code",[t._v("oneOf")]),t._v(" subschemas.")]),t._v(" "),a("li",[t._v("each "),a("code",[t._v("oneOf")]),t._v(" subschema must have "),a("a",{attrs:{href:"#properties"}},[t._v("properties")]),t._v(" keyword with discriminator property. The subschemas should be either inlined or included as direct references (only "),a("code",[t._v("$ref")]),t._v(" keyword without any extra keywords is allowed).")]),t._v(" "),a("li",[t._v("schema for discriminator property in each "),a("code",[t._v("oneOf")]),t._v(" subschema must be "),a("a",{attrs:{href:"#const"}},[t._v("const")]),t._v(" or "),a("a",{attrs:{href:"#enum"}},[t._v("enum")]),t._v(", with unique values across all subschemas.")])]),t._v(" "),a("p",[t._v("Not meeting any of these requirements would fail schema compilation.")]),t._v(" "),a("h2",{attrs:{id:"keywords-for-all-types"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#keywords-for-all-types"}},[t._v("#")]),t._v(" Keywords for all types")]),t._v(" "),a("h3",{attrs:{id:"enum"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#enum"}},[t._v("#")]),t._v(" "),a("code",[t._v("enum")])]),t._v(" "),a("p",[t._v("The value of the keyword should be an array of unique items of any types. The data is valid if it is deeply equal to one of items in the array.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{enum: [2, "foo", {foo: "bar" }, [1, 2, 3]]}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("2")]),t._v(", "),a("code",[t._v('"foo"')]),t._v(", "),a("code",[t._v('{foo: "bar"}')]),t._v(", "),a("code",[t._v("[1, 2, 3]")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("1")]),t._v(", "),a("code",[t._v('"bar"')]),t._v(", "),a("code",[t._v('{foo: "baz"}')]),t._v(", "),a("code",[t._v("[1, 2, 3, 4]")]),t._v(", any value not in enum")]),t._v(" "),a("h3",{attrs:{id:"const"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#const"}},[t._v("#")]),t._v(" "),a("code",[t._v("const")])]),t._v(" "),a("p",[t._v("The value of this keyword can be anything. The data is valid if it is deeply equal to the value of the keyword.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{const: "foo"}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v('"foo"')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": any other value")]),t._v(" "),a("p",[t._v("The same can be achieved with "),a("code",[t._v("enum")]),t._v(" keyword using the array with one item. But "),a("code",[t._v("const")]),t._v(" keyword is more than just a syntax sugar for "),a("code",[t._v("enum")]),t._v(". In combination with the "),a("RouterLink",{attrs:{to:"/guide/combining-schemas.html#data-reference"}},[t._v("$data reference")]),t._v(" it allows to define equality relations between different parts of the data. This cannot be achieved with "),a("code",[t._v("enum")]),t._v(" keyword even with "),a("code",[t._v("$data")]),t._v(" reference because "),a("code",[t._v("$data")]),t._v(" cannot be used in place of one item - it can only be used in place of the whole array in "),a("code",[t._v("enum")]),t._v(" keyword.")],1),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$data")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1/foo"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("{foo: 1, bar: 1}")]),t._v(", "),a("code",[t._v("{}")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("{foo: 1}")]),t._v(", "),a("code",[t._v("{bar: 1}")]),t._v(", "),a("code",[t._v("{foo: 1, bar: 2}")])]),t._v(" "),a("h2",{attrs:{id:"compound-keywords"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#compound-keywords"}},[t._v("#")]),t._v(" Compound keywords")]),t._v(" "),a("h3",{attrs:{id:"not"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#not"}},[t._v("#")]),t._v(" "),a("code",[t._v("not")])]),t._v(" "),a("p",[t._v("The value of the keyword should be a JSON Schema. The data is valid if it is invalid according to this schema.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "number", not: {minimum: 3}}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("1")]),t._v(", "),a("code",[t._v("2")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("3")]),t._v(", "),a("code",[t._v("4")])]),t._v(" "),a("h3",{attrs:{id:"oneof"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#oneof"}},[t._v("#")]),t._v(" "),a("code",[t._v("oneOf")])]),t._v(" "),a("p",[t._v("The value of the keyword should be an array of JSON Schemas. The data is valid if it matches exactly one JSON Schema from this array. Validators have to validate data against all schemas to establish validity according to this keyword.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("oneOf")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("maximum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"integer"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("1.5")]),t._v(", "),a("code",[t._v("2.5")]),t._v(", "),a("code",[t._v("4")]),t._v(", "),a("code",[t._v("5")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("2")]),t._v(", "),a("code",[t._v("3")]),t._v(", "),a("code",[t._v("4.5")]),t._v(", "),a("code",[t._v("5.5")])]),t._v(" "),a("h3",{attrs:{id:"anyof"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#anyof"}},[t._v("#")]),t._v(" "),a("code",[t._v("anyOf")])]),t._v(" "),a("p",[t._v('The value of the keyword should be an array of JSON Schemas. The data is valid if it is valid according to one or more JSON Schemas in this array. Validators only need to validate data against schemas in order until the first schema matches (or until all schemas have been tried). For this reason validating against this keyword is faster than against "oneOf" keyword in most cases.')]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("anyOf")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("maximum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"integer"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("1.5")]),t._v(", "),a("code",[t._v("2")]),t._v(", "),a("code",[t._v("2.5")]),t._v(", "),a("code",[t._v("3")]),t._v(", "),a("code",[t._v("4")]),t._v(", "),a("code",[t._v("5")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("4.5")]),t._v(", "),a("code",[t._v("5.5")])]),t._v(" "),a("h3",{attrs:{id:"allof"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#allof"}},[t._v("#")]),t._v(" "),a("code",[t._v("allOf")])]),t._v(" "),a("p",[t._v("The value of the keyword should be an array of JSON Schemas. The data is valid if it is valid according to all JSON Schemas in this array.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("allOf")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("maximum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"integer"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("2")]),t._v(", "),a("code",[t._v("3")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("1.5")]),t._v(", "),a("code",[t._v("2.5")]),t._v(", "),a("code",[t._v("4")]),t._v(", "),a("code",[t._v("4.5")]),t._v(", "),a("code",[t._v("5")]),t._v(", "),a("code",[t._v("5.5")])]),t._v(" "),a("h3",{attrs:{id:"if-then-else"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#if-then-else"}},[t._v("#")]),t._v(" "),a("code",[t._v("if")]),t._v("/"),a("code",[t._v("then")]),t._v("/"),a("code",[t._v("else")])]),t._v(" "),a("p",[t._v("These keywords allow to implement conditional validation. Their values should be valid JSON Schemas (object or boolean).")]),t._v(" "),a("p",[t._v("If "),a("code",[t._v("if")]),t._v(" keyword is absent, the validation succeeds.")]),t._v(" "),a("p",[t._v("If the data is valid against the sub-schema in "),a("code",[t._v("if")]),t._v(" keyword, then the validation result is equal to the result of data validation against the sub-schema in "),a("code",[t._v("then")]),t._v(" keyword (if "),a("code",[t._v("then")]),t._v(" is absent, the validation succeeds).")]),t._v(" "),a("p",[t._v("If the data is invalid against the sub-schema in "),a("code",[t._v("if")]),t._v(" keyword, then the validation result is equal to the result of data validation against the sub-schema in "),a("code",[t._v("else")]),t._v(" keyword (if "),a("code",[t._v("else")]),t._v(" is absent, the validation succeeds).")]),t._v(" "),a("p",[a("strong",[t._v("Examples")])]),t._v(" "),a("ol",[a("li",[a("p",[a("em",[t._v("schema")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("minimum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("then")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bar"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"baz"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(":")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("{foo: 10, bar: true }")])]),t._v(" "),a("li",[a("code",[t._v("{}")])]),t._v(" "),a("li",[a("code",[t._v("{foo: 1, baz: true }")])])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(":")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("{foo: 10}")]),t._v(" ("),a("code",[t._v("bar")]),t._v(" is required)")]),t._v(" "),a("li",[a("code",[t._v("{foo: 10, baz: true }")]),t._v(" ("),a("code",[t._v("bar")]),t._v(" is required)")]),t._v(" "),a("li",[a("code",[t._v("{foo: 1}")]),t._v(" ("),a("code",[t._v("baz")]),t._v(" is required)")])])])]),t._v(" "),a("ol",{attrs:{start:"2"}},[a("li",[a("p",[a("em",[t._v("schema")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"integer"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("minimum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("maximum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("minimum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("100")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("then")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("multipleOf")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("100")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("minimum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("then")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("multipleOf")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("1")]),t._v(", "),a("code",[t._v("5")]),t._v(", "),a("code",[t._v("10")]),t._v(", "),a("code",[t._v("20")]),t._v(", "),a("code",[t._v("50")]),t._v(", "),a("code",[t._v("100")]),t._v(", "),a("code",[t._v("200")]),t._v(", "),a("code",[t._v("500")]),t._v(", "),a("code",[t._v("1000")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(":")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("-1")]),t._v(", "),a("code",[t._v("0")]),t._v(" (<1)")]),t._v(" "),a("li",[a("code",[t._v("2000")]),t._v(" (>1000)")]),t._v(" "),a("li",[a("code",[t._v("11")]),t._v(", "),a("code",[t._v("57")]),t._v(", "),a("code",[t._v("123")]),t._v(" (any integer with more than one non-zero digit)")]),t._v(" "),a("li",[t._v("non-integers")])])])]),t._v(" "),a("h2",{attrs:{id:"metadata-keywords"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#metadata-keywords"}},[t._v("#")]),t._v(" Metadata keywords")]),t._v(" "),a("p",[t._v("JSON Schema specification defines several metadata keywords that describe the schema itself but do not perform any validation.")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("title")]),t._v(" and "),a("code",[t._v("description")]),t._v(": information about the data represented by that schema")]),t._v(" "),a("li",[a("code",[t._v("$comment")]),t._v(": information for developers. With option "),a("code",[t._v("$comment")]),t._v(" Ajv logs or passes the comment string to the user-supplied function. See "),a("RouterLink",{attrs:{to:"/api.html#options"}},[t._v("Options")]),t._v(".")],1),t._v(" "),a("li",[a("code",[t._v("default")]),t._v(": a default value of the data instance, see "),a("RouterLink",{attrs:{to:"/guide/modifying-data.html#assigning-defaults"}},[t._v("Assigning defaults")]),t._v(".")],1),t._v(" "),a("li",[a("code",[t._v("examples")]),t._v(": an array of data instances. Ajv does not check the validity of these instances against the schema.")]),t._v(" "),a("li",[a("code",[t._v("readOnly")]),t._v(" and "),a("code",[t._v("writeOnly")]),t._v(": marks data-instance as read-only or write-only in relation to the source of the data (database, api, etc.).")]),t._v(" "),a("li",[a("code",[t._v("contentEncoding")]),t._v(": "),a("a",{attrs:{href:"https://tools.ietf.org/html/rfc2045#section-6.1",target:"_blank",rel:"noopener noreferrer"}},[t._v("RFC 2045"),a("OutboundLink")],1),t._v(', e.g., "base64".')]),t._v(" "),a("li",[a("code",[t._v("contentMediaType")]),t._v(": "),a("a",{attrs:{href:"https://datatracker.ietf.org/doc/rfc2046/",target:"_blank",rel:"noopener noreferrer"}},[t._v("RFC 2046"),a("OutboundLink")],1),t._v(', e.g., "image/png".')])]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Ignored keywords")]),t._v(" "),a("p",[t._v("Ajv does not implement validation of the keywords "),a("code",[t._v("examples")]),t._v(", "),a("code",[t._v("contentEncoding")]),t._v(" and "),a("code",[t._v("contentMediaType")]),t._v(" but it reserves them. If you want to create a plugin that implements any of them, it should remove these keywords from the instance.")])])],1)}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/63.fff784a9.js b/assets/js/63.fff784a9.js new file mode 100644 index 000000000..d2b4ed04b --- /dev/null +++ b/assets/js/63.fff784a9.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[63],{529:function(t,a,s){"use strict";s.r(a);var e=s(24),r=Object(e.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"json-type-definition"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#json-type-definition"}},[t._v("#")]),t._v(" JSON Type Definition")]),t._v(" "),a("p",[t._v("This document informally describes JSON Type Definition (JTD) specification to help Ajv users to start using it. For formal definition please refer to "),a("a",{attrs:{href:"https://datatracker.ietf.org/doc/rfc8927/",target:"_blank",rel:"noopener noreferrer"}},[t._v("RFC8927"),a("OutboundLink")],1),t._v(". Please report any contradictions in this document with the specification.")]),t._v(" "),a("p",[t._v("To use JTD schemas you need to import a different Ajv class:")]),t._v(" "),a("code-group",[a("code-block",{attrs:{title:"JavaScript"}},[a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" Ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv/dist/jtd"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]),t._v(" "),a("code-block",{attrs:{title:"TypeScript"}},[a("div",{staticClass:"language-typescript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-typescript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" Ajv "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv/dist/jtd"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])])],1),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#jtd-schema-forms"}},[t._v("JTD schema forms")]),a("ul",[a("li",[a("a",{attrs:{href:"#type-form"}},[t._v("Type form "),a("Badge",{attrs:{text:"primitive values"}})],1)]),a("li",[a("a",{attrs:{href:"#enum-form"}},[t._v("Enum form")])]),a("li",[a("a",{attrs:{href:"#elements-form"}},[t._v("Elements form "),a("Badge",{attrs:{text:"arrays"}})],1)]),a("li",[a("a",{attrs:{href:"#properties-form"}},[t._v("Properties form "),a("Badge",{attrs:{text:"objects"}})],1)]),a("li",[a("a",{attrs:{href:"#discriminator-form"}},[t._v("Discriminator form "),a("Badge",{attrs:{text:"tagged union"}})],1)]),a("li",[a("a",{attrs:{href:"#values-form"}},[t._v("Values form "),a("Badge",{attrs:{text:"dictionary"}})],1)]),a("li",[a("a",{attrs:{href:"#ref-form"}},[t._v("Ref form "),a("Badge",{attrs:{text:"reference definitions"}})],1)]),a("li",[a("a",{attrs:{href:"#empty-form"}},[t._v("Empty form "),a("Badge",{attrs:{text:"any data"}})],1)])])]),a("li",[a("a",{attrs:{href:"#jtdschematype"}},[t._v("JTDSchemaType")]),a("ul",[a("li",[a("a",{attrs:{href:"#most-schemas"}},[t._v("Most Schemas")])]),a("li",[a("a",{attrs:{href:"#ref-schemas"}},[t._v("Ref Schemas")])]),a("li",[a("a",{attrs:{href:"#notable-omissions"}},[t._v("Notable Omissions")])])])]),a("li",[a("a",{attrs:{href:"#extending-jtd"}},[t._v("Extending JTD")]),a("ul",[a("li",[a("a",{attrs:{href:"#metadata-schema-member"}},[t._v("Metadata schema member")])]),a("li",[a("a",{attrs:{href:"#union-keyword"}},[t._v("Union keyword")])]),a("li",[a("a",{attrs:{href:"#user-defined-keywords"}},[t._v("User-defined keywords")])])])]),a("li",[a("a",{attrs:{href:"#validation-errors"}},[t._v("Validation errors")])])])]),a("p"),t._v(" "),a("h2",{attrs:{id:"jtd-schema-forms"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#jtd-schema-forms"}},[t._v("#")]),t._v(" JTD schema forms")]),t._v(" "),a("p",[t._v("JTD specification defines 8 different forms that the schema for JSON can take for one of most widely used data types in JSON messages (API requests and responses).")]),t._v(" "),a("p",[t._v("All forms require that:")]),t._v(" "),a("ul",[a("li",[t._v("schema is an object with different members, depending on the form")]),t._v(" "),a("li",[t._v("each form can have:\n"),a("ul",[a("li",[t._v("an optional member "),a("code",[t._v("nullable")]),t._v(" with a boolean value that allows data instance to be JSON "),a("code",[t._v("null")]),t._v(".")]),t._v(" "),a("li",[t._v("an optional member "),a("code",[t._v("metadata")]),t._v(' with an object value that allows to pass any additional information or extend the specification (Ajv defines keyword "union" that can be used inside '),a("code",[t._v("metadata")]),t._v(")")])])])]),t._v(" "),a("p",[t._v("Root schema can have member "),a("code",[t._v("definitions")]),t._v(" that has a dictionary of schemas that can be references from any other schemas using form "),a("code",[t._v("ref")])]),t._v(" "),a("h3",{attrs:{id:"type-form"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#type-form"}},[t._v("#")]),t._v(" Type form "),a("Badge",{attrs:{text:"primitive values"}})],1),t._v(" "),a("p",[t._v("This form defines a primitive value.")]),t._v(" "),a("p",[t._v("It has a required member "),a("code",[t._v("type")]),t._v(" and an optional members "),a("code",[t._v("nullable")]),t._v(" and "),a("code",[t._v("metadata")]),t._v(", no other members are allowed.")]),t._v(" "),a("p",[a("code",[t._v("type")]),t._v(" can have one of the following values:")]),t._v(" "),a("ul",[a("li",[a("code",[t._v('"string"')]),t._v(" - defines a string")]),t._v(" "),a("li",[a("code",[t._v('"boolean"')]),t._v(" - defines boolean value "),a("code",[t._v("true")]),t._v(" or "),a("code",[t._v("false")])]),t._v(" "),a("li",[a("code",[t._v('"timestamp"')]),t._v(" - defines timestamp ( accepting either an "),a("a",{attrs:{href:"https://datatracker.ietf.org/doc/rfc3339/",target:"_blank",rel:"noopener noreferrer"}},[t._v("RFC3339"),a("OutboundLink")],1),t._v(" JSON string or a Date object, configurable via the "),a("code",[t._v("timestamp")]),t._v(" Ajv option)")]),t._v(" "),a("li",[a("code",[t._v("type")]),t._v(" values that define integer numbers:\n"),a("ul",[a("li",[a("code",[t._v('"int8"')]),t._v(" - signed byte value (-128 .. 127)")]),t._v(" "),a("li",[a("code",[t._v('"uint8"')]),t._v(" - unsigned byte value (0 .. 255)")]),t._v(" "),a("li",[a("code",[t._v('"int16"')]),t._v(" - signed word value (-32768 .. 32767),")]),t._v(" "),a("li",[a("code",[t._v('"uint16"')]),t._v(" - unsigned word value (0 .. 65535)")]),t._v(" "),a("li",[a("code",[t._v('"int32"')]),t._v(" - signed 32-bit integer value")]),t._v(" "),a("li",[a("code",[t._v('"uint32"')]),t._v(" - unsigned 32-bit integer value")])])]),t._v(" "),a("li",[a("code",[t._v("type")]),t._v(" values that define floating point numbers:\n"),a("ul",[a("li",[a("code",[t._v('"float32"')]),t._v(" - 32-bit real number")]),t._v(" "),a("li",[a("code",[t._v('"float64"')]),t._v(" - 64-bit real number")])])])]),t._v(" "),a("p",[t._v("Unlike JSON Schema, JTD does not allow defining values that can take one of several types, but they can be defined as "),a("code",[t._v("nullable")]),t._v(".")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h3",{attrs:{id:"enum-form"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#enum-form"}},[t._v("#")]),t._v(" Enum form")]),t._v(" "),a("p",[t._v("This form defines a string that can take one of the values from the list (the values in the list must be unique).")]),t._v(" "),a("p",[t._v("It has a required member "),a("code",[t._v("enum")]),t._v(" and optional members "),a("code",[t._v("nullable")]),t._v(" and "),a("code",[t._v("metadata")]),t._v(", no other members are allowed.")]),t._v(" "),a("p",[t._v("Unlike JSON Schema, JTD does not allow defining "),a("code",[t._v("enum")]),t._v(" with values of any other type than string.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("enum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"foo"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bar"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h3",{attrs:{id:"elements-form"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#elements-form"}},[t._v("#")]),t._v(" Elements form "),a("Badge",{attrs:{text:"arrays"}})],1),t._v(" "),a("p",[t._v("This form defines a homogenous array of any size (possibly empty) with the elements that satisfy a given schema.")]),t._v(" "),a("p",[t._v("It has a required member "),a("code",[t._v("elements")]),t._v(" (schema that elements should satisfy) and optional members "),a("code",[t._v("nullable")]),t._v(" and "),a("code",[t._v("metadata")]),t._v(", no other members are allowed.")]),t._v(" "),a("p",[t._v("Unlike JSON Schema, the data instance must be JSON array (without using additional "),a("code",[t._v("type")]),t._v(" keyword), and there is no way to enforce the restrictions that cannot be present on type level of most languages, such as array size and uniqueness of items.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[t._v("Schema:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("elements")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Valid data: "),a("code",[t._v("[]")]),t._v(", "),a("code",[t._v('["foo"]')]),t._v(", "),a("code",[t._v('["foo", "bar"]')])]),t._v(" "),a("p",[t._v("Invalid data: "),a("code",[t._v('["foo", 1]')]),t._v(", any type other than array")]),t._v(" "),a("h3",{attrs:{id:"properties-form"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#properties-form"}},[t._v("#")]),t._v(" Properties form "),a("Badge",{attrs:{text:"objects"}})],1),t._v(" "),a("p",[t._v("This form defines record (JSON object) that has defined required and optional properties.")]),t._v(" "),a("p",[t._v("It is required that this form has either "),a("code",[t._v("properties")]),t._v(" member, or "),a("code",[t._v("optionalProperties")]),t._v(", or both, in which case the cannot have overlapping properties. Additional properties can be allowed by adding an optional boolean member "),a("code",[t._v("additionalProperties")]),t._v(" with a value "),a("code",[t._v("true")]),t._v(". This form, as all other, can have optional "),a("code",[t._v("nullable")]),t._v(" and "),a("code",[t._v("metadata")]),t._v(" members.")]),t._v(" "),a("p",[t._v("Unlike JSON Schema, all properties defined in "),a("code",[t._v("properties")]),t._v(" schema member are required, the data instance must be JSON object (without using additional "),a("code",[t._v("type")]),t._v(" keyword) and by default additional properties are not allowed (with the exception of discriminator tag - see the next section). This strictness minimises user mistakes.")]),t._v(" "),a("p",[a("strong",[t._v("Example 1.")])]),t._v(" "),a("p",[t._v("Schema:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Valid data: "),a("code",[t._v('{foo: "bar"}')])]),t._v(" "),a("p",[t._v("Invalid data: "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v("{foo: 1}")]),t._v(", "),a("code",[t._v('{foo: "bar", bar: 1}')]),t._v(", any type other than object")]),t._v(" "),a("p",[a("strong",[t._v("Example 2.")])]),t._v(" "),a("p",[t._v("Schema:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("optionalProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("enum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Valid data: "),a("code",[t._v('{foo: "bar"}')]),t._v(", "),a("code",[t._v('{foo: "bar", bar: "1"}')]),t._v(", "),a("code",[t._v('{foo: "bar", additional: 1}')])]),t._v(" "),a("p",[t._v("Invalid data: "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v("{foo: 1}")]),t._v(", "),a("code",[t._v('{foo: "bar", bar: "3"}')]),t._v(", any type other than object")]),t._v(" "),a("p",[a("strong",[t._v("Example 3: invalid schema (overlapping required and optional properties)")])]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("optionalProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h3",{attrs:{id:"discriminator-form"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#discriminator-form"}},[t._v("#")]),t._v(" Discriminator form "),a("Badge",{attrs:{text:"tagged union"}})],1),t._v(" "),a("p",[t._v("This form defines discriminated (tagged) union of different record types.")]),t._v(" "),a("p",[t._v("It has required members "),a("code",[t._v("discriminator")]),t._v(" and "),a("code",[t._v("mapping")]),t._v(" and optional members "),a("code",[t._v("nullable")]),t._v(" and "),a("code",[t._v("metadata")]),t._v(", no other members are allowed.")]),t._v(" "),a("p",[t._v("The string value of "),a("code",[t._v("discriminator")]),t._v(" schema member contains the name of the data member that is the tag of the union. "),a("code",[t._v("mapping")]),t._v(" schema member contains the dictionary of schemas that are applied according to the value of the tag member in the data. Schemas inside "),a("code",[t._v("mapping")]),t._v(' must have "properties" form.')]),t._v(" "),a("p",[t._v("Properties forms inside "),a("code",[t._v("mapping")]),t._v(" cannot be "),a("code",[t._v("nullable")]),t._v(" and cannot define the same property as discriminator tag.")]),t._v(" "),a("p",[a("strong",[t._v("Example 1.")])]),t._v(" "),a("p",[t._v("Schema:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("discriminator")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"version"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("mapping")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"1"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"2"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"uint8"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Valid data: "),a("code",[t._v('{version: "1", foo: "1"}')]),t._v(", "),a("code",[t._v('{version: "2", foo: 1}')])]),t._v(" "),a("p",[t._v("Invalid data: "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v('{foo: "1"}')]),t._v(", "),a("code",[t._v('{version: 1, foo: "1"}')]),t._v(", any type other than object")]),t._v(" "),a("p",[a("strong",[t._v("Example 3: invalid schema (discriminator tag member defined in mapping)")])]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("discriminator")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"version"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("mapping")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"1"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("version")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("enum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"2"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("version")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("enum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"uint8"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h3",{attrs:{id:"values-form"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#values-form"}},[t._v("#")]),t._v(" Values form "),a("Badge",{attrs:{text:"dictionary"}})],1),t._v(" "),a("p",[t._v("This form defines a homogenous dictionary where the values of members satisfy a given schema.")]),t._v(" "),a("p",[t._v("It has a required member "),a("code",[t._v("values")]),t._v(" (schema that member values should satisfy) and optional members "),a("code",[t._v("nullable")]),t._v(" and "),a("code",[t._v("metadata")]),t._v(", no other members are allowed.")]),t._v(" "),a("p",[t._v("Unlike JSON Schema, the data instance must be JSON object (without using additional "),a("code",[t._v("type")]),t._v(" keyword), and there is no way to enforce size restrictions.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[t._v("Schema:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("values")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"uint8"')]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Valid data: "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v('{"foo": 1}')]),t._v(", "),a("code",[t._v('{"foo": 1, "bar": 2}')])]),t._v(" "),a("p",[t._v("Invalid data: "),a("code",[t._v('{"foo": "bar"}')]),t._v(", any type other than object")]),t._v(" "),a("h3",{attrs:{id:"ref-form"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ref-form"}},[t._v("#")]),t._v(" Ref form "),a("Badge",{attrs:{text:"reference definitions"}})],1),t._v(" "),a("p",[t._v("This form defines a reference to the schema that is present in the corresponding key in the "),a("code",[t._v("definitions")]),t._v(" member of the root schema.")]),t._v(" "),a("p",[t._v("It has a required member "),a("code",[t._v("ref")]),t._v(" (member of "),a("code",[t._v("definitions")]),t._v(" object in the root schema) and optional members "),a("code",[t._v("nullable")]),t._v(" and "),a("code",[t._v("metadata")]),t._v(", no other members are allowed.")]),t._v(" "),a("p",[t._v("Unlike JSON Schema, JTD does not allow to reference:")]),t._v(" "),a("ul",[a("li",[t._v("any schema fragment other than root level "),a("code",[t._v("definitions")]),t._v(" member")]),t._v(" "),a("li",[t._v("root of the schema - there is another way to define a self-recursive schema (see Example 2)")]),t._v(" "),a("li",[t._v("another schema file (but you can still combine schemas from multiple files using JavaScript).")])]),t._v(" "),a("p",[a("strong",[t._v("Example 1.")])]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("propFoo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("ref")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"foo"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("nullable")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("definitions")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("strong",[t._v("Example 2: self-referencing schema for binary tree")])]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("ref")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tree"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("definitions")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("tree")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("value")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"int32"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("optionalProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("left")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("ref")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tree"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("right")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("ref")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tree"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("strong",[t._v("Example 3: invalid schema (missing reference)")])]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("ref")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"foo"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("definitions")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h3",{attrs:{id:"empty-form"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#empty-form"}},[t._v("#")]),t._v(" Empty form "),a("Badge",{attrs:{text:"any data"}})],1),t._v(" "),a("p",[t._v("Empty JTD schema defines the data instance that can be of any type, including JSON "),a("code",[t._v("null")]),t._v(" (even if "),a("code",[t._v("nullable")]),t._v(" member is not present). It cannot have any member other than "),a("code",[t._v("nullable")]),t._v(" and "),a("code",[t._v("metadata")]),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"jtdschematype"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#jtdschematype"}},[t._v("#")]),t._v(" JTDSchemaType")]),t._v(" "),a("p",[t._v("The type "),a("code",[t._v("JTDSchemaType")]),t._v(" can be used to validate that the written schema matches the type you expect to validate. This type is strict such that if typescript compiles, you should require no further type guards. The downside of this is that the types that "),a("code",[t._v("JTDSchemaType")]),t._v(" can verify are limited to the types that JTD can verify. If a type doesn't verify, "),a("code",[t._v("JTDSchemaType")]),t._v(" should resolve to "),a("code",[t._v("never")]),t._v(", throwing an error when you try to assign to it. This means that types like "),a("code",[t._v("1 | 2 | 3")]),t._v(", or general untagged unions (outside of unions of string literals) cannot be used with "),a("code",[t._v("JTDSchemaType")]),t._v(".")]),t._v(" "),a("h3",{attrs:{id:"most-schemas"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#most-schemas"}},[t._v("#")]),t._v(" Most Schemas")]),t._v(" "),a("p",[t._v("Most straightforward types should work with "),a("code",[t._v("JTDSchemaType")]),t._v(", e.g.")]),t._v(" "),a("div",{staticClass:"language-typescript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-typescript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyType")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n num"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v("\n optionalStr"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),t._v("\n nullableEnum"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"v1.0"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"v1.2"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),t._v("\n values"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Record"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" JTDSchemaType"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("MyType"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n properties"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n num"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("type"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"float64"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n nullableEnum"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("enum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"v1.0"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"v1.2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nullable"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n values"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("values"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("type"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"int32"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n optionalProperties"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n optionalStr"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("type"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("will compile. Using "),a("code",[t._v("schema")]),t._v(" with AJV will guarantee type safety.")]),t._v(" "),a("h3",{attrs:{id:"ref-schemas"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ref-schemas"}},[t._v("#")]),t._v(" Ref Schemas")]),t._v(" "),a("p",[t._v("Ref schemas are a little more advanced, because the types of every definition must be specified in advance.\nA simple ref schema is relatively straightforward:")]),t._v(" "),a("div",{staticClass:"language-typescript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-typescript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" JTDSchemaType"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("val"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("num"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n definitions"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n num"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("type"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"float64"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n properties"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n val"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("ref"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"num"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("note that the type of all definitions was included as a second argument to "),a("code",[t._v("JTDSchemaType")]),t._v(".")]),t._v(" "),a("p",[t._v("This also works for recursive schemas:")]),t._v(" "),a("div",{staticClass:"language-typescript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-typescript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("LinkedList")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("val"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" next"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" LinkedList"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" JTDSchemaType"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("LinkedList"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("node"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" LinkedList"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n definitions"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n node"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n properties"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n val"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("type"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"float64"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n optionalProperties"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n next"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("ref"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"node"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n ref"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"node"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h3",{attrs:{id:"notable-omissions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#notable-omissions"}},[t._v("#")]),t._v(" Notable Omissions")]),t._v(" "),a("p",[a("code",[t._v("JTDSchemaType")]),t._v(" currently validates that if the schema compiles it will verify an accurate type, but there are a few places with potentially unexpected behavior.\n"),a("code",[t._v("JTDSchemaType")]),t._v(" doesn't verify the schema is correct. It won't reject schemas that definitions anywhere by the root, and it won't reject discriminator schemas that still define the descriminator in mapping properties. It also won't verify that enum schemas have every enum member as this isn't generally feasible in typescript yet.")]),t._v(" "),a("h2",{attrs:{id:"extending-jtd"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#extending-jtd"}},[t._v("#")]),t._v(" Extending JTD")]),t._v(" "),a("h3",{attrs:{id:"metadata-schema-member"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#metadata-schema-member"}},[t._v("#")]),t._v(" Metadata schema member")]),t._v(" "),a("p",[t._v("Each schema form may have an optional member "),a("code",[t._v("metadata")]),t._v(" that JTD reserves for implementation/application specific extensions. Ajv uses this member as a location where any non-standard keywords can be used, such as:")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("union")]),t._v(" keyword included in Ajv")]),t._v(" "),a("li",[t._v("any user-defined keywords, for example keywords defined in "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv-keywords",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-keywords"),a("OutboundLink")],1),t._v(" package")]),t._v(" "),a("li",[t._v("JSON Schema keywords, as long as their names are different from standard JTD keywords. It can be used to enable a gradual migration from JSON Schema to JTD, should it be required.")])]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Extensions are non-portable")]),t._v(" "),a("p",[t._v("Ajv-specific extension to JTD are likely to be unsupported by other tools, so while it may simplify adoption, it undermines the cross-platform objective of using JTD. While it is ok to put some human readable information in "),a("code",[t._v("metadata")]),t._v(" member, it is recommended not to add any validation logic there (even if it is supported by Ajv).")])]),t._v(" "),a("p",[t._v("Additional restrictions that Ajv enforces on "),a("code",[t._v("metadata")]),t._v(" schema member:")]),t._v(" "),a("ul",[a("li",[t._v("you cannot use standard JTD keywords there. While strictly speaking it is allowed by the specification, these keywords should be ignored inside "),a("code",[t._v("metadata")]),t._v(" - the general approach of Ajv is to avoid anything that is ignored.")]),t._v(" "),a("li",[t._v("you need to define all members used in "),a("code",[t._v("metadata")]),t._v(" as keywords. If they are no-op it can be done with "),a("code",[t._v('ajv.addKeyword("my-metadata-keyword")')]),t._v(". This restriction can be removed by disabling "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/docs/strict-mode.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("strict mode"),a("OutboundLink")],1),t._v(", without affecting the strictness of JTD - unknown keywords would still be prohibited in the schema itself.")])]),t._v(" "),a("h3",{attrs:{id:"union-keyword"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#union-keyword"}},[t._v("#")]),t._v(" Union keyword")]),t._v(" "),a("p",[t._v("Ajv defines "),a("code",[t._v("union")]),t._v(" keyword that is used in the schema that validates JTD schemas ("),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/refs/jtd-schema.ts",target:"_blank",rel:"noopener noreferrer"}},[t._v("meta-schema"),a("OutboundLink")],1),t._v(").")]),t._v(" "),a("p",[t._v("This keyword can be used only inside "),a("code",[t._v("metadata")]),t._v(" schema member.")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Union keyword is non-portable")]),t._v(" "),a("p",[t._v("This keyword is non-standard and it is not supported in other JTD tools, so it is recommended NOT to use this keyword in schemas for your data if you want them to be cross-platform.")])]),t._v(" "),a("h3",{attrs:{id:"user-defined-keywords"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#user-defined-keywords"}},[t._v("#")]),t._v(" User-defined keywords")]),t._v(" "),a("p",[t._v("Any user-defined keywords that can be used in JSON Schema schemas can also be used in JTD schemas, including the keywords in "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv-keywords",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-keywords"),a("OutboundLink")],1),t._v(" package.")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("User-defined keywords are non-portable")]),t._v(" "),a("p",[t._v("It is strongly recommended to only use it to simplify migration from JSON Schema to JTD and not to use non-standard keywords in the new schemas, as these keywords are not supported by any other tools.")])]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Parsing does NOT support non-standard JTD keywords")]),t._v(" "),a("p",[t._v("compileParser method does not support non-standard JTD keywords, you will have to use JSON.parse and then validates.")])]),t._v(" "),a("h2",{attrs:{id:"validation-errors"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#validation-errors"}},[t._v("#")]),t._v(" Validation errors")]),t._v(" "),a("p",[t._v("TODO")])],1)}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/68.39d52c84.js b/assets/js/68.39d52c84.js new file mode 100644 index 000000000..e179adffb --- /dev/null +++ b/assets/js/68.39d52c84.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[68],{537:function(t,e,i){"use strict";i.r(e);var a=i(24),n=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("p",[t._v("JSON Type Definition (JTD) is a new specification for defining JSON structures that is very simple to use, comparing with JSON Schema, less error prone, and it is published as "),e("a",{attrs:{href:"https://datatracker.ietf.org/doc/rfc8927/",target:"_blank",rel:"noopener noreferrer"}},[t._v("RFC8927"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("See "),e("a",{attrs:{href:"/guide/schema-language.html"}},[t._v("Choosing schema language")]),t._v(" for a detailed comparison between JSON Schema and JSON Type definition and "),e("a",{attrs:{href:"/json-type-definition.html"}},[t._v("informal specification")]),t._v(".")]),t._v(" "),e("p",[t._v("In addition to validation, Ajv also supports:")]),t._v(" "),e("ul",[e("li",[t._v("generation of "),e("RouterLink",{attrs:{to:"/api.html#jtd-serialize"}},[t._v("serializers")]),t._v(" and "),e("RouterLink",{attrs:{to:"/api.html#jtd-parse"}},[t._v("parsers")]),t._v(" from JTD schemas/ This is more efficient than native JSON serialization/parsing - you can combine JSON string parsing and validation in one function call.")],1),t._v(" "),e("li",[t._v("utility type "),e("RouterLink",{attrs:{to:"/guide/typescript.html#utility-types-for-schemas"}},[t._v("JTDSchemaType")]),t._v(" to convert your data type to the type of JTD schema and "),e("RouterLink",{attrs:{to:"/guide/typescript.html#utility-type-for-jtd-data-type"}},[t._v("JTDDataType")]),t._v(" to convert the type of schema to the type of data.")],1)])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/69.fb6c89c0.js b/assets/js/69.fb6c89c0.js new file mode 100644 index 000000000..7c9f33823 --- /dev/null +++ b/assets/js/69.fb6c89c0.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[69],{536:function(e,t,s){"use strict";s.r(t);var r=s(24),a=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("Ajv version 8 has these new features:")]),e._v(" "),t("ul",[t("li",[e._v("support of JSON Schema draft-2020-12: "),t("a",{attrs:{href:"/json-schema.html#prefixitems"}},[e._v("prefixItems")]),e._v(" keyword and changed semantics of "),t("a",{attrs:{href:"/json-schema.html#items-in-draft-2020-12"}},[e._v("items")]),e._v(" keyword, "),t("a",{attrs:{href:"/guide/combining-schemas.html#extending-recursive-schemas"}},[e._v("dynamic recursive references")]),e._v(".")]),e._v(" "),t("li",[e._v("OpenAPI "),t("a",{attrs:{href:"/json-schema.html#discriminator"}},[e._v("discriminator")]),e._v(" keyword.")]),e._v(" "),t("li",[e._v("improved JSON Type Definition support:\n"),e._v(" "),t("ul",[t("li",[e._v("errors consistent with JTD specification.")]),e._v(" "),t("li",[e._v("error objects with additional properties to simplify error handling")]),e._v(" "),t("li",[e._v("internationalized error messages with "),t("a",{attrs:{href:"/packages/ajv-i18n"}},[e._v("ajv-i18n")])])])]),e._v(" "),t("li",[e._v("TypeScript: support type unions in "),t("RouterLink",{attrs:{to:"/guide/typescript.html#type-safe-unions"}},[e._v("JSONSchemaType")])],1)]),e._v(" "),t("p",[e._v("See "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/releases/tag/v8.0.0",target:"_blank",rel:"noopener noreferrer"}},[e._v("release notes"),t("OutboundLink")],1),e._v(" for the details.")]),e._v(" "),t("p",[e._v("To install the new version:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("npm")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" ajv\n")])])]),t("p",[e._v("See "),t("RouterLink",{attrs:{to:"/guide/getting-started.html"}},[e._v("Getting started")]),e._v(" for code examples.")],1)])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/70.41c11761.js b/assets/js/70.41c11761.js new file mode 100644 index 000000000..8566cc82b --- /dev/null +++ b/assets/js/70.41c11761.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[70],{539:function(e,t,r){"use strict";r.r(t);var n=r(24),o=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("We will talk about:")]),e._v(" "),t("ul",[t("li",[e._v("new features of Ajv version 8.")]),e._v(" "),t("li",[e._v("the improvements sponsored by Mozilla's MOSS grant.")]),e._v(" "),t("li",[e._v("how Ajv is used in JavaScript applications.")])]),e._v(" "),t("p",[e._v("Speakers:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/epoberezkin",target:"_blank",rel:"noopener noreferrer"}},[e._v("Evgeny Poberezkin"),t("OutboundLink")],1),e._v(", the creator of Ajv.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/mehan",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mehan Jayasuriya"),t("OutboundLink")],1),e._v(", Program Officer at Mozilla Foundation, leading the "),t("a",{attrs:{href:"https://www.mozilla.org/en-US/moss/",target:"_blank",rel:"noopener noreferrer"}},[e._v("MOSS"),t("OutboundLink")],1),e._v(" and other programs investing in the open source and community ecosystems.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/mcollina",target:"_blank",rel:"noopener noreferrer"}},[e._v("Matteo Collina"),t("OutboundLink")],1),e._v(", Technical Director at NearForm and Node.js Technical Steering Committee member, creator of Fastify web framework.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/kinlane",target:"_blank",rel:"noopener noreferrer"}},[e._v("Kin Lane"),t("OutboundLink")],1),e._v(", Chief Evangelist at Postman. Studying the tech, business & politics of APIs since 2010. Presidential Innovation Fellow during the Obama administration.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/ucarion",target:"_blank",rel:"noopener noreferrer"}},[e._v("Ulysse Carion"),t("OutboundLink")],1),e._v(", the creator of JSON Type Definition specification.")])]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/gajus",target:"_blank",rel:"noopener noreferrer"}},[e._v("Gajus Kuizinas"),t("OutboundLink")],1),e._v(" will host the event.")]),e._v(" "),t("p",[e._v("Please "),t("a",{attrs:{href:"https://us02web.zoom.us/webinar/register/4216192074976/WN_erJ_t4ICTHOnGC1SOybNnw",target:"_blank",rel:"noopener noreferrer"}},[e._v("register here"),t("OutboundLink")],1),e._v(".")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/71.debaead8.js b/assets/js/71.debaead8.js new file mode 100644 index 000000000..7d667101b --- /dev/null +++ b/assets/js/71.debaead8.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[71],{538:function(t,e,o){"use strict";o.r(e);var n=o(24),s=Object(n.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("p",[this._v("Huge thanks to everybody who joined, and to the speakers! The video of the event is "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=KxSKqXEBB7A",target:"_blank",rel:"noopener noreferrer"}},[this._v("available on YouTube"),t("OutboundLink")],1),this._v(".")])])}),[],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/74.90e9d3b3.js b/assets/js/74.90e9d3b3.js new file mode 100644 index 000000000..b82e7ae54 --- /dev/null +++ b/assets/js/74.90e9d3b3.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[74],{543:function(t,e,a){"use strict";a.r(e);var s=a(24),r=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"ajv-options"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ajv-options"}},[t._v("#")]),t._v(" Ajv options")]),t._v(" "),e("p"),e("div",{staticClass:"table-of-contents"},[e("ul",[e("li",[e("a",{attrs:{href:"#usage"}},[t._v("Usage")])]),e("li",[e("a",{attrs:{href:"#option-defaults"}},[t._v("Option defaults")])]),e("li",[e("a",{attrs:{href:"#strict-mode-options"}},[t._v("Strict mode options "),e("Badge",{attrs:{text:"v7"}})],1),e("ul",[e("li",[e("a",{attrs:{href:"#strict"}},[t._v("strict")])]),e("li",[e("a",{attrs:{href:"#strictschema"}},[t._v("strictSchema")])]),e("li",[e("a",{attrs:{href:"#strictnumbers"}},[t._v("strictNumbers")])]),e("li",[e("a",{attrs:{href:"#stricttypes"}},[t._v("strictTypes")])]),e("li",[e("a",{attrs:{href:"#stricttuples"}},[t._v("strictTuples")])]),e("li",[e("a",{attrs:{href:"#strictrequired"}},[t._v("strictRequired")])]),e("li",[e("a",{attrs:{href:"#allowuniontypes"}},[t._v("allowUnionTypes")])]),e("li",[e("a",{attrs:{href:"#allowmatchingproperties"}},[t._v("allowMatchingProperties")])]),e("li",[e("a",{attrs:{href:"#validateformats"}},[t._v("validateFormats")])])])]),e("li",[e("a",{attrs:{href:"#validation-and-reporting-options"}},[t._v("Validation and reporting options")]),e("ul",[e("li",[e("a",{attrs:{href:"#data"}},[t._v("$data")])]),e("li",[e("a",{attrs:{href:"#allerrors"}},[t._v("allErrors")])]),e("li",[e("a",{attrs:{href:"#verbose"}},[t._v("verbose")])]),e("li",[e("a",{attrs:{href:"#discriminator"}},[t._v("discriminator")])]),e("li",[e("a",{attrs:{href:"#unicoderegexp"}},[t._v("unicodeRegExp")])]),e("li",[e("a",{attrs:{href:"#timestamp"}},[t._v("timestamp "),e("Badge",{attrs:{text:"JTD only"}})],1)]),e("li",[e("a",{attrs:{href:"#parsedate"}},[t._v("parseDate "),e("Badge",{attrs:{text:"JTD only"}})],1)]),e("li",[e("a",{attrs:{href:"#allowdate"}},[t._v("allowDate "),e("Badge",{attrs:{text:"JTD only"}})],1)]),e("li",[e("a",{attrs:{href:"#specialnumbers"}},[t._v("specialNumbers "),e("Badge",{attrs:{text:"JTD only"}})],1)]),e("li",[e("a",{attrs:{href:"#int32range"}},[t._v("int32range "),e("Badge",{attrs:{text:"JTD only"}})],1)]),e("li",[e("a",{attrs:{href:"#comment"}},[t._v("$comment")])]),e("li",[e("a",{attrs:{href:"#formats"}},[t._v("formats")])]),e("li",[e("a",{attrs:{href:"#keywords"}},[t._v("keywords")])]),e("li",[e("a",{attrs:{href:"#schemas"}},[t._v("schemas")])]),e("li",[e("a",{attrs:{href:"#logger"}},[t._v("logger")])]),e("li",[e("a",{attrs:{href:"#loadschema"}},[t._v("loadSchema")])])])]),e("li",[e("a",{attrs:{href:"#options-to-modify-validated-data"}},[t._v("Options to modify validated data")]),e("ul",[e("li",[e("a",{attrs:{href:"#removeadditional"}},[t._v("removeAdditional")])]),e("li",[e("a",{attrs:{href:"#usedefaults"}},[t._v("useDefaults")])]),e("li",[e("a",{attrs:{href:"#coercetypes"}},[t._v("coerceTypes")])])])]),e("li",[e("a",{attrs:{href:"#advanced-options"}},[t._v("Advanced options")]),e("ul",[e("li",[e("a",{attrs:{href:"#meta"}},[t._v("meta")])]),e("li",[e("a",{attrs:{href:"#validateschema"}},[t._v("validateSchema")])]),e("li",[e("a",{attrs:{href:"#addusedschema"}},[t._v("addUsedSchema")])]),e("li",[e("a",{attrs:{href:"#inlinerefs"}},[t._v("inlineRefs")])]),e("li",[e("a",{attrs:{href:"#passcontext"}},[t._v("passContext")])]),e("li",[e("a",{attrs:{href:"#looprequired"}},[t._v("loopRequired")])]),e("li",[e("a",{attrs:{href:"#loopenum"}},[t._v("loopEnum "),e("Badge",{attrs:{text:"v7"}})],1)]),e("li",[e("a",{attrs:{href:"#ownproperties"}},[t._v("ownProperties")])]),e("li",[e("a",{attrs:{href:"#multipleofprecision"}},[t._v("multipleOfPrecision")])]),e("li",[e("a",{attrs:{href:"#messages"}},[t._v("messages")])]),e("li",[e("a",{attrs:{href:"#uriresolver"}},[t._v("uriResolver")])]),e("li",[e("a",{attrs:{href:"#code"}},[t._v("code "),e("Badge",{attrs:{text:"v7"}})],1)])])])])]),e("p"),t._v(" "),e("h2",{attrs:{id:"usage"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#usage"}},[t._v("#")]),t._v(" Usage")]),t._v(" "),e("p",[t._v("This page describes properties of the options object that can be passed to Ajv constructor.")]),t._v(" "),e("p",[t._v("For example, to report all validation errors (rather than failing on the first errors) you should pass "),e("code",[t._v("allErrors")]),t._v(" option to constructor:")]),t._v(" "),e("div",{staticClass:"language-javascript extra-class"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("allErrors")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("h2",{attrs:{id:"option-defaults"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#option-defaults"}},[t._v("#")]),t._v(" Option defaults")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Do NOT pass default options")]),t._v(" "),e("p",[t._v("Passing the value below for some of the options is equivalent to not passing this option at all. There is no need to pass default option values - it is recommended to only pass option values that are different from defaults.")])]),t._v(" "),e("div",{staticClass:"language-javascript extra-class"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// see types/index.ts for actual types")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" defaultOptions "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// strict mode options (NEW)")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("strict")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// *")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("strictSchema")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// *")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("strictNumbers")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// *")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("strictTypes")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"log"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// *")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("strictTuples")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"log"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// *")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("strictRequired")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// *")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("allowUnionTypes")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// *")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("allowMatchingProperties")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// *")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("validateFormats")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// *")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// validation and reporting options:")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$data")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// *")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("allErrors")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("verbose")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("discriminator")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// *")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("unicodeRegExp")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// *")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("timestamp")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// **")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("parseDate")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// **")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("allowDate")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// **")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("int32range")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// **")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$comment")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// *")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("formats")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("keywords")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("schemas")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("logger")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("loadSchema")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// *, function(uri: string): Promise {}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// options to modify validated data:")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("removeAdditional")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("useDefaults")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// *")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("coerceTypes")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// *")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// advanced options:")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("meta")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("validateSchema")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("addUsedSchema")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("inlineRefs")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("passContext")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("loopRequired")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("200")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// *")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("loopEnum")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("200")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// NEW")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("ownProperties")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("multipleOfPrecision")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// *")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("messages")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// false with JTD")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("uriResolver")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("code")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// NEW")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("es5")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("esm")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("lines")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("source")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("process")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// (code: string) => string")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("optimize")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("regExp")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" RegExp\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[e("sup",[t._v("*")]),t._v(" only with JSON Schema")]),t._v(" "),e("p",[e("sup",[t._v("**")]),t._v(" only with JSON Type Definition")]),t._v(" "),e("h2",{attrs:{id:"strict-mode-options"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#strict-mode-options"}},[t._v("#")]),t._v(" Strict mode options "),e("Badge",{attrs:{text:"v7"}})],1),t._v(" "),e("h3",{attrs:{id:"strict"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#strict"}},[t._v("#")]),t._v(" strict")]),t._v(" "),e("p",[t._v("By default Ajv executes in strict mode, that is designed to prevent any unexpected behaviours or silently ignored mistakes in schemas (see "),e("RouterLink",{attrs:{to:"/strict-mode.html"}},[t._v("Strict Mode")]),t._v(" for more details). It does not change any validation results, but it makes some schemas invalid that would be otherwise valid according to JSON Schema specification.")],1),t._v(" "),e("p",[t._v("Option values:")]),t._v(" "),e("ul",[e("li",[e("code",[t._v("true")]),t._v(" - throw an exception when any strict mode restriction is violated.")]),t._v(" "),e("li",[e("code",[t._v('"log"')]),t._v(" - log warning when any strict mode restriction is violated.")]),t._v(" "),e("li",[e("code",[t._v("false")]),t._v(" - ignore all strict mode violations.")]),t._v(" "),e("li",[e("code",[t._v("undefined")]),t._v(" (default) - use defaults for options strictSchema, strictNumbers, strictTypes, strictTuples and strictRequired.")])]),t._v(" "),e("h3",{attrs:{id:"strictschema"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#strictschema"}},[t._v("#")]),t._v(" strictSchema")]),t._v(" "),e("p",[t._v("Prevent unknown keywords, formats etc. (see "),e("RouterLink",{attrs:{to:"/strict-mode.html#strict-schema"}},[t._v("Strict schema")]),t._v(")")],1),t._v(" "),e("p",[t._v("Option values:")]),t._v(" "),e("ul",[e("li",[e("code",[t._v("true")]),t._v(" (default) - throw an exception when any strict schema restriction is violated.")]),t._v(" "),e("li",[e("code",[t._v('"log"')]),t._v(" - log warning when any strict schema restriction is violated.")]),t._v(" "),e("li",[e("code",[t._v("false")]),t._v(" - ignore all strict schema violations.")])]),t._v(" "),e("h3",{attrs:{id:"strictnumbers"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#strictnumbers"}},[t._v("#")]),t._v(" strictNumbers")]),t._v(" "),e("p",[t._v("Whether to accept "),e("code",[t._v("NaN")]),t._v(" and "),e("code",[t._v("Infinity")]),t._v(" as number types during validation.")]),t._v(" "),e("p",[t._v("Option values:")]),t._v(" "),e("ul",[e("li",[e("code",[t._v("true")]),t._v(" (default) - fail validation if "),e("code",[t._v("NaN")]),t._v(" or "),e("code",[t._v("Infinity")]),t._v(" is passed where number is expected.")]),t._v(" "),e("li",[e("code",[t._v("false")]),t._v(" - allow "),e("code",[t._v("NaN")]),t._v(" and "),e("code",[t._v("Infinity")]),t._v(" as number.")])]),t._v(" "),e("h3",{attrs:{id:"stricttypes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#stricttypes"}},[t._v("#")]),t._v(" strictTypes")]),t._v(" "),e("p",[t._v("See "),e("RouterLink",{attrs:{to:"/strict-mode.html#strict-types"}},[t._v("Strict types")])],1),t._v(" "),e("p",[t._v("Option values:")]),t._v(" "),e("ul",[e("li",[e("code",[t._v("true")]),t._v(" - throw an exception when any strict types restriction is violated.")]),t._v(" "),e("li",[e("code",[t._v('"log"')]),t._v(" (default) - log warning when any strict types restriction is violated.")]),t._v(" "),e("li",[e("code",[t._v("false")]),t._v(" - ignore all strict types violations.")])]),t._v(" "),e("h3",{attrs:{id:"stricttuples"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#stricttuples"}},[t._v("#")]),t._v(" strictTuples")]),t._v(" "),e("p",[t._v("See "),e("RouterLink",{attrs:{to:"/strict-mode.html#unconstrained-tuples"}},[t._v("Unconstrained tuples")])],1),t._v(" "),e("p",[t._v("Option values:")]),t._v(" "),e("ul",[e("li",[e("code",[t._v("true")]),t._v(" - throw an exception when any strict tuples restriction is violated.")]),t._v(" "),e("li",[e("code",[t._v('"log"')]),t._v(" (default) - log warning when any strict tuples restriction is violated.")]),t._v(" "),e("li",[e("code",[t._v("false")]),t._v(" - ignore all strict tuples violations.")])]),t._v(" "),e("h3",{attrs:{id:"strictrequired"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#strictrequired"}},[t._v("#")]),t._v(" strictRequired")]),t._v(" "),e("p",[t._v("See "),e("RouterLink",{attrs:{to:"/strict-mode.html#defined-required-properties"}},[t._v("Defined required properties")])],1),t._v(" "),e("p",[t._v("Option values:")]),t._v(" "),e("ul",[e("li",[e("code",[t._v("true")]),t._v(" - throw an exception when strict required restriction is violated.")]),t._v(" "),e("li",[e("code",[t._v('"log"')]),t._v(" - log warning when strict required restriction is violated.")]),t._v(" "),e("li",[e("code",[t._v("false")]),t._v(" (default) - ignore strict required violations.")])]),t._v(" "),e("h3",{attrs:{id:"allowuniontypes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#allowuniontypes"}},[t._v("#")]),t._v(" allowUnionTypes")]),t._v(" "),e("p",[t._v('Pass true to allow using multiple non-null types in "type" keyword (one of '),e("code",[t._v("strictTypes")]),t._v(" restrictions). see "),e("RouterLink",{attrs:{to:"/strict-mode.html#strict-types"}},[t._v("Strict types")])],1),t._v(" "),e("h3",{attrs:{id:"allowmatchingproperties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#allowmatchingproperties"}},[t._v("#")]),t._v(" allowMatchingProperties")]),t._v(" "),e("p",[t._v('Pass true to allow overlap between "properties" and "patternProperties". Does not affect other strict mode restrictions. See '),e("RouterLink",{attrs:{to:"/strict-mode.html"}},[t._v("Strict Mode")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"validateformats"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#validateformats"}},[t._v("#")]),t._v(" validateFormats")]),t._v(" "),e("p",[t._v("Format validation.")]),t._v(" "),e("p",[t._v("Option values:")]),t._v(" "),e("ul",[e("li",[e("code",[t._v("true")]),t._v(" (default) - validate formats (see "),e("RouterLink",{attrs:{to:"/guide/formats.html"}},[t._v("Formats")]),t._v("). In "),e("RouterLink",{attrs:{to:"/strict-mode.html"}},[t._v("strict mode")]),t._v(" unknown formats will throw exception during schema compilation (and fail validation in case format keyword value is "),e("RouterLink",{attrs:{to:"/guide/combining-schemas.html#data-reference"}},[t._v("$data reference")]),t._v(").")],1),t._v(" "),e("li",[e("code",[t._v("false")]),t._v(" - do not validate any format keywords (TODO they will still collect annotations once supported).")])]),t._v(" "),e("h2",{attrs:{id:"validation-and-reporting-options"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#validation-and-reporting-options"}},[t._v("#")]),t._v(" Validation and reporting options")]),t._v(" "),e("h3",{attrs:{id:"data"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#data"}},[t._v("#")]),t._v(" $data")]),t._v(" "),e("p",[t._v("Support "),e("RouterLink",{attrs:{to:"/guide/combining-schemas.html#data-reference"}},[t._v("$data references")]),t._v(". Draft 6 meta-schema that is added by default will be extended to allow them. If you want to use another meta-schema you need to use $dataMetaSchema method to add support for $data reference. See "),e("a",{attrs:{href:"#ajv-constructor-and-methods"}},[t._v("API")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"allerrors"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#allerrors"}},[t._v("#")]),t._v(" allErrors")]),t._v(" "),e("p",[t._v("Check all rules collecting all errors. Default is to return after the first error.")]),t._v(" "),e("h3",{attrs:{id:"verbose"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#verbose"}},[t._v("#")]),t._v(" verbose")]),t._v(" "),e("p",[t._v("Include the reference to the part of the schema ("),e("code",[t._v("schema")]),t._v(" and "),e("code",[t._v("parentSchema")]),t._v(") and validated data in errors (false by default).")]),t._v(" "),e("h3",{attrs:{id:"discriminator"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#discriminator"}},[t._v("#")]),t._v(" discriminator")]),t._v(" "),e("p",[t._v("Support "),e("RouterLink",{attrs:{to:"/json-schema.html#discriminator"}},[t._v("discriminator keyword")]),t._v(" from "),e("a",{attrs:{href:"https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("OpenAPI specification"),e("OutboundLink")],1),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"unicoderegexp"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#unicoderegexp"}},[t._v("#")]),t._v(" unicodeRegExp")]),t._v(" "),e("p",[t._v('By default Ajv uses unicode flag "u" with "pattern" and "patternProperties", as per JSON Schema spec. See '),e("a",{attrs:{href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/unicode",target:"_blank",rel:"noopener noreferrer"}},[t._v("RegExp.prototype.unicode"),e("OutboundLink")],1),t._v(" .")]),t._v(" "),e("p",[t._v("Option values:")]),t._v(" "),e("ul",[e("li",[e("code",[t._v("true")]),t._v(' (default) - use unicode flag "u".')]),t._v(" "),e("li",[e("code",[t._v("false")]),t._v(' - do not use flag "u".')])]),t._v(" "),e("h3",{attrs:{id:"timestamp"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#timestamp"}},[t._v("#")]),t._v(" timestamp "),e("Badge",{attrs:{text:"JTD only"}})],1),t._v(" "),e("p",[t._v("Defines which Javascript types will be accepted for the "),e("a",{attrs:{href:"./json-type-definition#type-form"}},[t._v("JTD timestamp type")]),t._v(".")]),t._v(" "),e("p",[t._v("By default Ajv will accept both Date objects and "),e("a",{attrs:{href:"https://datatracker.ietf.org/doc/rfc3339/",target:"_blank",rel:"noopener noreferrer"}},[t._v("RFC3339"),e("OutboundLink")],1),t._v(" strings. You can specify allowed values with the option "),e("code",[t._v('timestamp: "date"')]),t._v(" or "),e("code",[t._v('timestamp: "string"')]),t._v(".")]),t._v(" "),e("h3",{attrs:{id:"parsedate"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#parsedate"}},[t._v("#")]),t._v(" parseDate "),e("Badge",{attrs:{text:"JTD only"}})],1),t._v(" "),e("p",[t._v("Defines how date-time strings are parsed by "),e("RouterLink",{attrs:{to:"/api.html#jtd-parse"}},[t._v("JTD parsers")]),t._v(". By default Ajv parses date-time strings as string. Use "),e("code",[t._v("parseDate: true")]),t._v(" to parse them as Date objects.")],1),t._v(" "),e("h3",{attrs:{id:"allowdate"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#allowdate"}},[t._v("#")]),t._v(" allowDate "),e("Badge",{attrs:{text:"JTD only"}})],1),t._v(" "),e("p",[t._v("Defines how date-time strings are parsed and validated. By default Ajv only allows full date-time strings, as required by JTD specification. Use "),e("code",[t._v("allowDate: true")]),t._v(" to allow date strings both for validation and for parsing.")]),t._v(" "),e("div",{staticClass:"custom-block warning"},[e("p",{staticClass:"custom-block-title"},[t._v("Option allowDate is not portable")]),t._v(" "),e("p",[t._v("This option makes JTD validation and parsing more permissive and non-standard. The date strings without time part will be accepted by Ajv, but will be rejected by other JTD validators.")])]),t._v(" "),e("h3",{attrs:{id:"specialnumbers"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#specialnumbers"}},[t._v("#")]),t._v(" specialNumbers "),e("Badge",{attrs:{text:"JTD only"}})],1),t._v(" "),e("p",[t._v("Defines how special case numbers "),e("code",[t._v("Infinity")]),t._v(", "),e("code",[t._v("-Infinity")]),t._v(" and "),e("code",[t._v("NaN")]),t._v(" are handled.")]),t._v(" "),e("p",[t._v("Option values:")]),t._v(" "),e("ul",[e("li",[e("code",[t._v('"fast"')]),t._v(" - (default): Do not treat special numbers differently to normal numbers. This is the fastest method but also can produce invalid JSON if the data contains special numbers.")]),t._v(" "),e("li",[e("code",[t._v('"null"')]),t._v(" - Special numbers will be serialized to "),e("code",[t._v("null")]),t._v(" which is the correct behavior according to the JSON spec and is also the same behavior as "),e("code",[t._v("JSON.stringify")]),t._v(".")])]),t._v(" "),e("div",{staticClass:"custom-block warning"},[e("p",{staticClass:"custom-block-title"},[t._v("The default behavior can produce invalid JSON")]),t._v(" "),e("p",[t._v("Using "),e("code",[t._v('specialNumbers: "fast" or undefined')]),t._v(" can produce invalid JSON when there are any special case numbers in the data.")])]),t._v(" "),e("h3",{attrs:{id:"int32range"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#int32range"}},[t._v("#")]),t._v(" int32range "),e("Badge",{attrs:{text:"JTD only"}})],1),t._v(" "),e("p",[t._v("Can be used to disable range checking for "),e("code",[t._v("int32")]),t._v(" and "),e("code",[t._v("uint32")]),t._v(" types.")]),t._v(" "),e("p",[t._v("By default Ajv limits the range of these types to "),e("code",[t._v("[-2**31, 2**31 - 1]")]),t._v(" for "),e("code",[t._v("int32")]),t._v(" and to "),e("code",[t._v("[0, 2**32-1]")]),t._v(" for "),e("code",[t._v("uint32")]),t._v(" when validating and parsing.")]),t._v(" "),e("p",[t._v("With option "),e("code",[t._v("int32range: false")]),t._v(" Ajv only requires that "),e("code",[t._v("uint32")]),t._v(" is non-negative, otherwise does not check the range. Parser will limit the number size to 16 digits (approx. "),e("code",[t._v("2**53")]),t._v(" - safe integer range).")]),t._v(" "),e("div",{staticClass:"custom-block warning"},[e("p",{staticClass:"custom-block-title"},[t._v("Option int32range is not portable")]),t._v(" "),e("p",[t._v("This option makes JTD validation and parsing more permissive and non-standard. The integers within a wider range will be accepted by Ajv, but will be rejected by other JTD validators.")])]),t._v(" "),e("h3",{attrs:{id:"comment"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#comment"}},[t._v("#")]),t._v(" $comment")]),t._v(" "),e("p",[t._v("Log or pass the value of "),e("code",[t._v("$comment")]),t._v(" keyword to a function.")]),t._v(" "),e("p",[t._v("Option values:")]),t._v(" "),e("ul",[e("li",[e("code",[t._v("false")]),t._v(" (default): ignore $comment keyword.")]),t._v(" "),e("li",[e("code",[t._v("true")]),t._v(": log the keyword value to console.")]),t._v(" "),e("li",[t._v("function: pass the keyword value, its schema path and root schema to the specified function")])]),t._v(" "),e("h3",{attrs:{id:"formats"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#formats"}},[t._v("#")]),t._v(" formats")]),t._v(" "),e("p",[t._v("An object with format definitions. Keys and values will be passed to "),e("code",[t._v("addFormat")]),t._v(" method. Pass "),e("code",[t._v("true")]),t._v(" as format definition to ignore some formats.")]),t._v(" "),e("h3",{attrs:{id:"keywords"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#keywords"}},[t._v("#")]),t._v(" keywords")]),t._v(" "),e("p",[t._v("An array of keyword definitions or strings. Values will be passed to "),e("code",[t._v("addKeyword")]),t._v(" method.")]),t._v(" "),e("h3",{attrs:{id:"schemas"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#schemas"}},[t._v("#")]),t._v(" schemas")]),t._v(" "),e("p",[t._v("An array or object of schemas that will be added to the instance. In case you pass the array the schemas must have IDs in them. When the object is passed the method "),e("code",[t._v("addSchema(value, key)")]),t._v(" will be called for each schema in this object.")]),t._v(" "),e("h3",{attrs:{id:"logger"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#logger"}},[t._v("#")]),t._v(" logger")]),t._v(" "),e("p",[t._v("Sets the logging method. Default is the global "),e("code",[t._v("console")]),t._v(" object that should have methods "),e("code",[t._v("log")]),t._v(", "),e("code",[t._v("warn")]),t._v(" and "),e("code",[t._v("error")]),t._v(". See "),e("RouterLink",{attrs:{to:"/api.html#error-logging"}},[t._v("Error logging")]),t._v(".")],1),t._v(" "),e("p",[t._v("Option values:")]),t._v(" "),e("ul",[e("li",[t._v("logger instance - it should have methods "),e("code",[t._v("log")]),t._v(", "),e("code",[t._v("warn")]),t._v(" and "),e("code",[t._v("error")]),t._v(". If any of these methods is missing an exception will be thrown.")]),t._v(" "),e("li",[e("code",[t._v("false")]),t._v(" - logging is disabled.")])]),t._v(" "),e("h3",{attrs:{id:"loadschema"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#loadschema"}},[t._v("#")]),t._v(" loadSchema")]),t._v(" "),e("p",[t._v("Asynchronous function that will be used to load remote schemas when "),e("code",[t._v("compileAsync")]),t._v(" "),e("a",{attrs:{href:"#api-compileAsync"}},[t._v("method")]),t._v(" is used and some reference is missing (option "),e("code",[t._v("missingRefs")]),t._v(" should NOT be 'fail' or 'ignore'). This function should accept remote schema uri as a parameter and return a Promise that resolves to a schema. See example in "),e("RouterLink",{attrs:{to:"/guide/managing-schemas.html#asynchronous-schema-compilation"}},[t._v("Asynchronous compilation")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"options-to-modify-validated-data"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#options-to-modify-validated-data"}},[t._v("#")]),t._v(" Options to modify validated data")]),t._v(" "),e("h3",{attrs:{id:"removeadditional"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#removeadditional"}},[t._v("#")]),t._v(" removeAdditional")]),t._v(" "),e("p",[t._v("Remove additional properties - see example in "),e("RouterLink",{attrs:{to:"/guide/modifying-data.html#removing-additional-properties"}},[t._v("Removing additional properties")]),t._v(".")],1),t._v(" "),e("p",[t._v("This option is not used if schema is added with "),e("code",[t._v("addMetaSchema")]),t._v(" method.")]),t._v(" "),e("p",[t._v("Option values:")]),t._v(" "),e("ul",[e("li",[e("code",[t._v("false")]),t._v(" (default) - not to remove additional properties")]),t._v(" "),e("li",[e("code",[t._v('"all"')]),t._v(" - all additional properties are removed, regardless of "),e("code",[t._v("additionalProperties")]),t._v(" keyword in schema (and no validation is made for them).")]),t._v(" "),e("li",[e("code",[t._v("true")]),t._v(" - only additional properties with "),e("code",[t._v("additionalProperties")]),t._v(" keyword equal to "),e("code",[t._v("false")]),t._v(" are removed.")]),t._v(" "),e("li",[e("code",[t._v('"failing"')]),t._v(" - additional properties that fail schema validation will be removed (where "),e("code",[t._v("additionalProperties")]),t._v(" keyword is "),e("code",[t._v("false")]),t._v(" or schema).")])]),t._v(" "),e("h3",{attrs:{id:"usedefaults"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#usedefaults"}},[t._v("#")]),t._v(" useDefaults")]),t._v(" "),e("p",[t._v("Replace missing or undefined properties and items with the values from corresponding "),e("code",[t._v("default")]),t._v(" keywords. Default behaviour is to ignore "),e("code",[t._v("default")]),t._v(" keywords. This option is not used if schema is added with "),e("code",[t._v("addMetaSchema")]),t._v(" method.")]),t._v(" "),e("p",[t._v("See examples in "),e("RouterLink",{attrs:{to:"/guide/modifying-data.html#assigning-defaults"}},[t._v("Assigning defaults")]),t._v(".")],1),t._v(" "),e("p",[t._v("Option values:")]),t._v(" "),e("ul",[e("li",[e("code",[t._v("false")]),t._v(" (default) - do not use defaults")]),t._v(" "),e("li",[e("code",[t._v("true")]),t._v(" - insert defaults by value (object literal is used).")]),t._v(" "),e("li",[e("code",[t._v('"empty"')]),t._v(" - in addition to missing or undefined, use defaults for properties and items that are equal to "),e("code",[t._v("null")]),t._v(" or "),e("code",[t._v('""')]),t._v(" (an empty string).")])]),t._v(" "),e("h3",{attrs:{id:"coercetypes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#coercetypes"}},[t._v("#")]),t._v(" coerceTypes")]),t._v(" "),e("p",[t._v("Change data type of data to match "),e("code",[t._v("type")]),t._v(" keyword. See the example in "),e("RouterLink",{attrs:{to:"/guide/modifying-data.html#coercing-data-types"}},[t._v("Coercing data types")]),t._v(" and "),e("RouterLink",{attrs:{to:"/coercion.html"}},[t._v("coercion rules")]),t._v(".")],1),t._v(" "),e("p",[t._v("Option values:")]),t._v(" "),e("ul",[e("li",[e("code",[t._v("false")]),t._v(" (default) - no type coercion.")]),t._v(" "),e("li",[e("code",[t._v("true")]),t._v(" - coerce scalar data types.")]),t._v(" "),e("li",[e("code",[t._v('"array"')]),t._v(" - in addition to coercions between scalar types, coerce scalar data to an array with one element and vice versa (as required by the schema).")])]),t._v(" "),e("h2",{attrs:{id:"advanced-options"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#advanced-options"}},[t._v("#")]),t._v(" Advanced options")]),t._v(" "),e("h3",{attrs:{id:"meta"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#meta"}},[t._v("#")]),t._v(" meta")]),t._v(" "),e("p",[t._v("Add "),e("a",{attrs:{href:"http://json-schema.org/documentation.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("meta-schema"),e("OutboundLink")],1),t._v(" so it can be used by other schemas (true by default). If an object is passed, it will be used as the default meta-schema for schemas that have no "),e("code",[t._v("$schema")]),t._v(" keyword. This default meta-schema MUST have "),e("code",[t._v("$schema")]),t._v(" keyword.")]),t._v(" "),e("h3",{attrs:{id:"validateschema"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#validateschema"}},[t._v("#")]),t._v(" validateSchema")]),t._v(" "),e("p",[t._v("Validate added/compiled schemas against meta-schema (true by default). "),e("code",[t._v("$schema")]),t._v(" property in the schema can be http://json-schema.org/draft-07/schema or absent (draft-07 meta-schema will be used) or can be a reference to the schema previously added with "),e("code",[t._v("addMetaSchema")]),t._v(" method.")]),t._v(" "),e("p",[t._v("Option values:")]),t._v(" "),e("ul",[e("li",[e("code",[t._v("true")]),t._v(" (default) - if the validation fails, throw the exception.")]),t._v(" "),e("li",[e("code",[t._v('"log"')]),t._v(" - if the validation fails, log error.")]),t._v(" "),e("li",[e("code",[t._v("false")]),t._v(" - skip schema validation.")])]),t._v(" "),e("h3",{attrs:{id:"addusedschema"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#addusedschema"}},[t._v("#")]),t._v(" addUsedSchema")]),t._v(" "),e("p",[t._v("By default methods "),e("code",[t._v("compile")]),t._v(" and "),e("code",[t._v("validate")]),t._v(" add schemas to the instance if they have "),e("code",[t._v("$id")]),t._v(" (or "),e("code",[t._v("id")]),t._v(') property that doesn\'t start with "#". If '),e("code",[t._v("$id")]),t._v(" is present and it is not unique the exception will be thrown. Set this option to "),e("code",[t._v("false")]),t._v(" to skip adding schemas to the instance and the "),e("code",[t._v("$id")]),t._v(" uniqueness check when these methods are used. This option does not affect "),e("code",[t._v("addSchema")]),t._v(" method.")]),t._v(" "),e("h3",{attrs:{id:"inlinerefs"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#inlinerefs"}},[t._v("#")]),t._v(" inlineRefs")]),t._v(" "),e("p",[t._v("Affects compilation of referenced schemas.")]),t._v(" "),e("p",[t._v("Option values:")]),t._v(" "),e("ul",[e("li",[e("code",[t._v("true")]),t._v(" (default) - the referenced schemas that don't have refs in them are inlined, regardless of their size - it improves performance.")]),t._v(" "),e("li",[e("code",[t._v("false")]),t._v(" - to not inline referenced schemas (they will always be compiled as separate functions).")]),t._v(" "),e("li",[t._v("integer number - to limit the maximum number of keywords of the schema that will be inlined (to balance the total size of compiled functions and performance).")])]),t._v(" "),e("h3",{attrs:{id:"passcontext"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#passcontext"}},[t._v("#")]),t._v(" passContext")]),t._v(" "),e("p",[t._v("Pass validation context to "),e("em",[t._v("compile")]),t._v(" and "),e("em",[t._v("validate")]),t._v(" keyword functions. If this option is "),e("code",[t._v("true")]),t._v(" and you pass some context to the compiled validation function with "),e("code",[t._v("validate.call(context, data)")]),t._v(", the "),e("code",[t._v("context")]),t._v(" will be available as "),e("code",[t._v("this")]),t._v(" in your keywords. By default "),e("code",[t._v("this")]),t._v(" is Ajv instance.")]),t._v(" "),e("h3",{attrs:{id:"looprequired"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#looprequired"}},[t._v("#")]),t._v(" loopRequired")]),t._v(" "),e("p",[t._v("By default "),e("code",[t._v("required")]),t._v(" keyword is compiled into a single expression (or a sequence of statements in "),e("code",[t._v("allErrors")]),t._v(" mode) up to 200 required properties. Pass integer to set a different number of properties above which "),e("code",[t._v("required")]),t._v(" keyword will be validated in a loop (with a smaller validation function size and worse performance).")]),t._v(" "),e("h3",{attrs:{id:"loopenum"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#loopenum"}},[t._v("#")]),t._v(" loopEnum "),e("Badge",{attrs:{text:"v7"}})],1),t._v(" "),e("p",[t._v("By default "),e("code",[t._v("enum")]),t._v(" keyword is compiled into a single expression with up to 200 allowed values. Pass integer to set the number of values above which "),e("code",[t._v("enum")]),t._v(" keyword will be validated in a loop (with a smaller validation function size and worse performance).")]),t._v(" "),e("h3",{attrs:{id:"ownproperties"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ownproperties"}},[t._v("#")]),t._v(" ownProperties")]),t._v(" "),e("p",[t._v("By default Ajv iterates over all enumerable object properties; when this option is "),e("code",[t._v("true")]),t._v(" only own enumerable object properties (i.e. found directly on the object rather than on its prototype) are iterated. Contributed by @mbroadst.")]),t._v(" "),e("h3",{attrs:{id:"multipleofprecision"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#multipleofprecision"}},[t._v("#")]),t._v(" multipleOfPrecision")]),t._v(" "),e("p",[t._v("By default "),e("code",[t._v("multipleOf")]),t._v(" keyword is validated by comparing the result of division with "),e("code",[t._v("parseInt()")]),t._v(" of that result. It works for dividers that are bigger than 1. For small dividers such as 0.01 the result of the division is usually not integer (even when it should be integer, see issue "),e("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/84",target:"_blank",rel:"noopener noreferrer"}},[t._v("#84"),e("OutboundLink")],1),t._v("). If you need to use fractional dividers set this option to some positive integer N to have "),e("code",[t._v("multipleOf")]),t._v(" validated using this formula: "),e("code",[t._v("Math.abs(Math.round(division) - division) < 1e-N")]),t._v(" (it is slower but allows for float arithmetic deviations).")]),t._v(" "),e("h3",{attrs:{id:"messages"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#messages"}},[t._v("#")]),t._v(" messages")]),t._v(" "),e("p",[t._v("Include human-readable messages in errors. "),e("code",[t._v("true")]),t._v(" by default. "),e("code",[t._v("false")]),t._v(" can be passed when messages are generated outside of Ajv code (e.g. with "),e("a",{attrs:{href:"https://github.com/ajv-validator/ajv-i18n",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-i18n"),e("OutboundLink")],1),t._v(").")]),t._v(" "),e("h3",{attrs:{id:"uriresolver"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#uriresolver"}},[t._v("#")]),t._v(" uriResolver")]),t._v(" "),e("p",[t._v("By default "),e("code",[t._v("uriResolver")]),t._v(" is undefined and relies on the embedded uriResolver "),e("a",{attrs:{href:"https://github.com/fastify/fast-uri",target:"_blank",rel:"noopener noreferrer"}},[t._v("fast-uri"),e("OutboundLink")],1),t._v(". Pass an object that satisfies the interface "),e("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/types/index.ts",target:"_blank",rel:"noopener noreferrer"}},[t._v("UriResolver"),e("OutboundLink")],1),t._v(" to be used in replacement. One alternative is "),e("a",{attrs:{href:"https://github.com/garycourt/uri-js",target:"_blank",rel:"noopener noreferrer"}},[t._v("uri-js"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h3",{attrs:{id:"code"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#code"}},[t._v("#")]),t._v(" code "),e("Badge",{attrs:{text:"v7"}})],1),t._v(" "),e("p",[t._v("Code generation options:")]),t._v(" "),e("div",{staticClass:"language-typescript extra-class"},[e("pre",{pre:!0,attrs:{class:"language-typescript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CodeOptions")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n es5"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("boolean")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// to generate es5 code - by default code is es6, with "for-of" loops, "let" and "const"')]),t._v("\n esm"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("boolean")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// how functions should be exported - by default CJS is used, so the validate function(s) ")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// file can be `required`. Set this value to true to export the validate function(s) as ES Modules, enabling ")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// bunlers to do their job.")]),t._v("\n lines"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("boolean")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// add line-breaks to code - to simplify debugging of generated functions")]),t._v("\n source"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("boolean")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// add `source` property (see Source below) to validating function.")]),t._v("\n process"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("code"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" schema"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" SchemaEnv"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// an optional function to process generated code")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// before it is passed to Function constructor.")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// It can be used to either beautify or to transpile code.")]),t._v("\n optimize"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("boolean")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// code optimization flag or number of passes, 1 pass by default,")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// code optimizations reduce the size of the generated code (bytes, based on the tests) by over 10%,")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// the number of code tree nodes by nearly 17%.")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// You would almost never need more than one optimization pass, unless you have some really complex schemas -")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// the second pass in the tests (it has quite complex schemas) only improves optimization by less than 0.1%.")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// See [Code optimization](./codegen.md#code-optimization) for details.")]),t._v("\n formats"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Code\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Code snippet created with `_` tagged template literal that contains all format definitions,")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// it can be the code of actual definitions or `require` call:")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// _`require("./my-formats")`')]),t._v("\n regExp"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" RegExpEngine\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Pass non-standard RegExp engine to mitigate ReDoS, e.g. node-re2.")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// During validation of a schema, code.regExp will be ")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// used to match strings against regular expressions.")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The supplied function must support the interface:")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// regExp(regex, unicodeFlag).test(string) => boolean")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Source")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n code"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// unlike func.toString() it includes assignments external to function scope")]),t._v("\n scope"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Scope "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// see Code generation (TODO)")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/75.cf55aad8.js b/assets/js/75.cf55aad8.js new file mode 100644 index 000000000..f648c81ed --- /dev/null +++ b/assets/js/75.cf55aad8.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[75],{542:function(t,e,a){"use strict";a.r(e);var r=a(24),n=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"extending-ajv"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#extending-ajv"}},[t._v("#")]),t._v(" Extending Ajv")]),t._v(" "),e("h2",{attrs:{id:"plugins"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#plugins"}},[t._v("#")]),t._v(" Plugins")]),t._v(" "),e("p",[t._v("Ajv can be extended with plugins that add "),e("RouterLink",{attrs:{to:"/guide/user-keywords.html"}},[t._v("user defined schema keywords")]),t._v(", "),e("RouterLink",{attrs:{to:"/guide/formats.html"}},[t._v("validation formats")]),t._v(" or functions to process generated code. When such plugin is published as npm package it is recommended that it follows these conventions:")],1),t._v(" "),e("ul",[e("li",[t._v("it exports a function that accepts ajv instance as the first parameter - it allows using plugins with "),e("RouterLink",{attrs:{to:"/packages/ajv-cli.html"}},[t._v("ajv-cli")]),t._v(".")],1),t._v(" "),e("li",[t._v("this function returns the same instance to allow chaining.")]),t._v(" "),e("li",[t._v("this function can accept an optional configuration as the second parameter.")])]),t._v(" "),e("p",[t._v("You can import "),e("code",[t._v("Plugin")]),t._v(" interface from ajv if you use Typescript.")]),t._v(" "),e("p",[t._v("If you have published a useful plugin please submit a PR to add it to the next section.")]),t._v(" "),e("h2",{attrs:{id:"related-packages"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#related-packages"}},[t._v("#")]),t._v(" Related packages")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://github.com/ajv-validator/ajv-formats",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-formats"),e("OutboundLink")],1),t._v(" - formats defined in JSON Schema specification")]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/ajv-validator/ajv-keywords",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-keywords"),e("OutboundLink")],1),t._v(" - additional validation keywords (select, typeof, etc.)")]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/ajv-validator/ajv-errors",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-errors"),e("OutboundLink")],1),t._v(" - defining error messages in the schema")]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/ajv-validator/ajv-i18n",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-i18n"),e("OutboundLink")],1),t._v(" - internationalised error messages")]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/ajv-validator/ajv-cli",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-cli"),e("OutboundLink")],1),t._v(" - command line interface")]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/BoLaMN/ajv-bsontype",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-bsontype"),e("OutboundLink")],1),t._v(" - MongoDB's bsonType formats")]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/luzlab/ajv-formats-draft2019",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-formats-draft2019"),e("OutboundLink")],1),t._v(" - formats for draft-2019-09 that are not included in "),e("RouterLink",{attrs:{to:"/packages/ajv-formats.html"}},[t._v("ajv-formats")]),t._v(" ("),e("code",[t._v("idn-hostname")]),t._v(", "),e("code",[t._v("idn-email")]),t._v(", "),e("code",[t._v("iri")]),t._v(" and "),e("code",[t._v("iri-reference")]),t._v(")")],1),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/ajv-validator/ajv-merge-patch",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-merge-patch"),e("OutboundLink")],1),t._v(" - keywords $merge and $patch")])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/83.ae8c92d7.js b/assets/js/83.ae8c92d7.js new file mode 100644 index 000000000..21f1446b2 --- /dev/null +++ b/assets/js/83.ae8c92d7.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[83],{552:function(t,a,s){"use strict";s.r(a);var e=s(24),r=Object(e.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"strict-mode"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#strict-mode"}},[t._v("#")]),t._v(" Strict mode")]),t._v(" "),a("p",[t._v("Strict mode intends to prevent any unexpected behaviours or silently ignored mistakes in user schemas. It does not change any validation results compared with the specification, but it makes some schemas invalid and throws exception or logs warning (with "),a("code",[t._v('strict: "log"')]),t._v(" option) in case any restriction is violated.")]),t._v(" "),a("p",[t._v("To disable all strict mode restrictions use option "),a("code",[t._v("strict: false")]),t._v(". Some of the restrictions can be changed with their own options")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#json-type-definition-schemas"}},[t._v("JSON Type Definition schemas")])]),a("li",[a("a",{attrs:{href:"#json-schema-schemas"}},[t._v("JSON Schema schemas")]),a("ul",[a("li",[a("a",{attrs:{href:"#prohibit-ignored-keywords"}},[t._v("Prohibit ignored keywords "),a("Badge",{attrs:{text:"strictSchema option"}})],1),a("ul",[a("li",[a("a",{attrs:{href:"#unknown-keywords"}},[t._v("Unknown keywords")])]),a("li",[a("a",{attrs:{href:"#ignored-additionalitems-keyword"}},[t._v('Ignored "additionalItems" keyword')])]),a("li",[a("a",{attrs:{href:"#ignored-if-then-else-keywords"}},[t._v('Ignored "if", "then", "else" keywords')])]),a("li",[a("a",{attrs:{href:"#ignored-contains-maxcontains-and-mincontains-keywords"}},[t._v('Ignored "contains", "maxContains" and "minContains" keywords')])]),a("li",[a("a",{attrs:{href:"#unknown-formats"}},[t._v("Unknown formats")])]),a("li",[a("a",{attrs:{href:"#ignored-defaults"}},[t._v("Ignored defaults")])])])]),a("li",[a("a",{attrs:{href:"#prevent-unexpected-validation"}},[t._v("Prevent unexpected validation")]),a("ul",[a("li",[a("a",{attrs:{href:"#overlap-between-properties-and-patternproperties-keywords"}},[t._v('Overlap between "properties" and "patternProperties" keywords '),a("Badge",{attrs:{text:"allowMatchingProperties option"}})],1)]),a("li",[a("a",{attrs:{href:"#defined-required-properties"}},[t._v("Defined required properties "),a("Badge",{attrs:{text:"strictRequired option"}})],1)]),a("li",[a("a",{attrs:{href:"#unconstrained-tuples"}},[t._v("Unconstrained tuples "),a("Badge",{attrs:{text:"strictTuples option"}})],1)])])]),a("li",[a("a",{attrs:{href:"#strict-types"}},[t._v("Strict types "),a("Badge",{attrs:{text:"strictTypes option"}})],1),a("ul",[a("li",[a("a",{attrs:{href:"#union-types"}},[t._v("Union types "),a("Badge",{attrs:{text:"allowUnionTypes option"}})],1)]),a("li",[a("a",{attrs:{href:"#contradictory-types"}},[t._v("Contradictory types")])]),a("li",[a("a",{attrs:{href:"#require-applicable-types"}},[t._v("Require applicable types")])])])]),a("li",[a("a",{attrs:{href:"#strict-number-validation"}},[t._v("Strict number validation "),a("Badge",{attrs:{text:"strictNumbers option"}})],1)])])])])]),a("p"),t._v(" "),a("h2",{attrs:{id:"json-type-definition-schemas"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#json-type-definition-schemas"}},[t._v("#")]),t._v(" JSON Type Definition schemas")]),t._v(" "),a("p",[t._v("JTD specification is strict - whether Ajv strict mode is enabled or not it will not allow schemas with ignored or ambiguous elements, including:")]),t._v(" "),a("ul",[a("li",[t._v("unknown schema keywords")]),t._v(" "),a("li",[t._v("combining multiple schema forms in one schema")]),t._v(" "),a("li",[t._v("defining the same property as both required and optional")]),t._v(" "),a("li",[t._v("re-defining discriminator tag inside properties, even if the definition is non-contradictory")])]),t._v(" "),a("p",[t._v("See "),a("RouterLink",{attrs:{to:"/json-type-definition.html"}},[t._v("JSON Type Definition")]),t._v(" for informal and "),a("a",{attrs:{href:"https://datatracker.ietf.org/doc/rfc8927/",target:"_blank",rel:"noopener noreferrer"}},[t._v("RFC8927"),a("OutboundLink")],1),t._v(" for formal specification descriptions.")],1),t._v(" "),a("p",[t._v("The only change that strict mode introduces to JTD schemas, without changing their syntax or semantics, is the requirement that all members that are present in optional "),a("code",[t._v("metadata")]),t._v(" members are defined as Ajv keywords. This restriction can be disabled with "),a("code",[t._v("strict: false")]),t._v(" option, without any impact to other JTD features.")]),t._v(" "),a("h2",{attrs:{id:"json-schema-schemas"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#json-schema-schemas"}},[t._v("#")]),t._v(" JSON Schema schemas")]),t._v(" "),a("p",[t._v("JSON Schema specification is very permissive and allows many elements in the schema to be quietly ignored or be ambiguous. It is recommended to use JSON Schema with strict mode.")]),t._v(" "),a("p",[t._v("Option "),a("code",[t._v("strict")]),t._v(" with value "),a("code",[t._v("true")]),t._v("/"),a("code",[t._v("false")]),t._v("/"),a("code",[t._v('"log"')]),t._v(" can be used to set all strict mode restriction to be the same, otherwise individual strict mode options can be used. See "),a("RouterLink",{attrs:{to:"/options.html#strict-mode-options"}},[t._v("Strict mode options")]),t._v(".")],1),t._v(" "),a("h3",{attrs:{id:"prohibit-ignored-keywords"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#prohibit-ignored-keywords"}},[t._v("#")]),t._v(" Prohibit ignored keywords "),a("Badge",{attrs:{text:"strictSchema option"}})],1),t._v(" "),a("h4",{attrs:{id:"unknown-keywords"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#unknown-keywords"}},[t._v("#")]),t._v(" Unknown keywords")]),t._v(" "),a("p",[t._v("JSON Schema "),a("a",{attrs:{href:"https://tools.ietf.org/html/draft-handrews-json-schema-02#section-6.5",target:"_blank",rel:"noopener noreferrer"}},[t._v("section 6.5"),a("OutboundLink")],1),t._v(" requires to ignore unknown keywords. The motivation is to increase cross-platform portability of schemas, so that implementations that do not support certain keywords can still do partial validation.")]),t._v(" "),a("p",[t._v("The problems with this approach are:")]),t._v(" "),a("ul",[a("li",[t._v("Different validation results with the same schema and data, leading to bugs and inconsistent behaviours.")]),t._v(" "),a("li",[t._v("Typos in keywords resulting in keywords being quietly ignored, requiring extensive test coverage of schemas to avoid these mistakes.")])]),t._v(" "),a("p",[t._v("By default Ajv fails schema compilation when unknown keywords are used. Users can explicitly define the keywords that should be allowed and ignored:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[t._v("ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("addKeyword")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"allowedKeyword"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("p",[t._v("or use the convenience method "),a("code",[t._v("addVocabulary")]),t._v(" for multiple keywords")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[t._v("ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("addVocabulary")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"allowed1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"allowed2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// simply calls addKeyword multiple times")]),t._v("\n")])])]),a("h4",{attrs:{id:"ignored-additionalitems-keyword"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ignored-additionalitems-keyword"}},[t._v("#")]),t._v(' Ignored "additionalItems" keyword')]),t._v(" "),a("p",[t._v("JSON Schema section "),a("a",{attrs:{href:"https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.1.2",target:"_blank",rel:"noopener noreferrer"}},[t._v("9.3.1.2"),a("OutboundLink")],1),t._v(' requires to ignore "additionalItems" keyword if "items" keyword is absent or if it is not an array of items. This is inconsistent with the interaction of "additionalProperties" and "properties", and may cause unexpected results.')]),t._v(" "),a("p",[t._v('By default Ajv fails schema compilation when "additionalItems" is used without "items" (or if "items" is not an array).')]),t._v(" "),a("h4",{attrs:{id:"ignored-if-then-else-keywords"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ignored-if-then-else-keywords"}},[t._v("#")]),t._v(' Ignored "if", "then", "else" keywords')]),t._v(" "),a("p",[t._v("JSON Schema section "),a("a",{attrs:{href:"https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.2",target:"_blank",rel:"noopener noreferrer"}},[t._v("9.2.2"),a("OutboundLink")],1),t._v(' requires to ignore "if" (only annotations are collected) if both "then" and "else" are absent, and ignore "then"/"else" if "if" is absent.')]),t._v(" "),a("p",[t._v("By default Ajv fails schema compilation in these cases.")]),t._v(" "),a("h4",{attrs:{id:"ignored-contains-maxcontains-and-mincontains-keywords"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ignored-contains-maxcontains-and-mincontains-keywords"}},[t._v("#")]),t._v(' Ignored "contains", "maxContains" and "minContains" keywords')]),t._v(" "),a("p",[t._v("JSON Schema sections "),a("a",{attrs:{href:"https://json-schema.org/draft/2019-09/json-schema-validation.html#rfc.section.6.4.4",target:"_blank",rel:"noopener noreferrer"}},[t._v("6.4.4, 6.4.5"),a("OutboundLink")],1),t._v(' require to ignore keywords "maxContains" and "minContains" if "contains" keyword is absent.')]),t._v(" "),a("p",[t._v('It is also implied that when "minContains" is 0 and "maxContains" is absent, "contains" keyword is always valid.')]),t._v(" "),a("p",[t._v("By default Ajv fails schema compilation in these cases.")]),t._v(" "),a("h4",{attrs:{id:"unknown-formats"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#unknown-formats"}},[t._v("#")]),t._v(" Unknown formats")]),t._v(" "),a("p",[t._v("By default unknown formats throw exception during schema compilation (and fail validation in case format keyword value is "),a("RouterLink",{attrs:{to:"/guide/combining-schemas.html#data-reference"}},[t._v("$data reference")]),t._v("). It is possible to opt out of format validation completely with options "),a("code",[t._v("validateFormats: false")]),t._v(". You can define all known formats with "),a("code",[t._v("addFormat")]),t._v(" method or "),a("code",[t._v("formats")]),t._v(" option - to have some format ignored pass "),a("code",[t._v("true")]),t._v(" as its definition:")],1),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("formats")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("reserved")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("p",[t._v("Standard JSON Schema formats are provided in "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv-formats",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-formats"),a("OutboundLink")],1),t._v(" package - see "),a("a",{attrs:{href:"./guide/formats"}},[t._v("Formats")]),t._v(" section.")]),t._v(" "),a("h4",{attrs:{id:"ignored-defaults"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ignored-defaults"}},[t._v("#")]),t._v(" Ignored defaults")]),t._v(" "),a("p",[t._v("With "),a("code",[t._v("useDefaults")]),t._v(" option Ajv modifies validated data by assigning defaults from the schema, but there are different limitations when the defaults can be ignored (see "),a("RouterLink",{attrs:{to:"/guide/modifying-data.html#assigning-defaults"}},[t._v("Assigning defaults")]),t._v("). In strict mode Ajv fails schema compilation if such defaults are used in the schema.")],1),t._v(" "),a("h3",{attrs:{id:"prevent-unexpected-validation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#prevent-unexpected-validation"}},[t._v("#")]),t._v(" Prevent unexpected validation")]),t._v(" "),a("h4",{attrs:{id:"overlap-between-properties-and-patternproperties-keywords"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#overlap-between-properties-and-patternproperties-keywords"}},[t._v("#")]),t._v(' Overlap between "properties" and "patternProperties" keywords '),a("Badge",{attrs:{text:"allowMatchingProperties option"}})],1),t._v(" "),a("p",[t._v('The expectation of users (see #196, #286) is that "patternProperties" only apply to properties not already defined in "properties" keyword, but JSON Schema section '),a("a",{attrs:{href:"https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2",target:"_blank",rel:"noopener noreferrer"}},[t._v("9.3.2"),a("OutboundLink")],1),t._v(' defines these two keywords as independent. It means that to some properties two subschemas can be applied - one defined in "properties" keyword and another defined in "patternProperties" for the pattern matching this property.')]),t._v(" "),a("p",[t._v('By default Ajv fails schema compilation if a pattern in "patternProperties" matches a property in "properties" in the same schema.')]),t._v(" "),a("p",[t._v("In addition to allowing such patterns by using option "),a("code",[t._v("strict: false")]),t._v(" or "),a("code",[t._v("strictSchema: false")]),t._v(", there is an option "),a("code",[t._v("allowMatchingProperties: true")]),t._v(" to only allow this case without disabling other strict mode restrictions - there are some rare cases when this is necessary.")]),t._v(" "),a("p",[t._v("To reiterate, neither this nor other strict mode restrictions change the validation results - they only restrict which schemas are valid.")]),t._v(" "),a("h4",{attrs:{id:"defined-required-properties"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#defined-required-properties"}},[t._v("#")]),t._v(" Defined required properties "),a("Badge",{attrs:{text:"strictRequired option"}})],1),t._v(" "),a("p",[t._v("With option "),a("code",[t._v("strictRequired")]),t._v(" set to "),a("code",[t._v('"log"')]),t._v(" or "),a("code",[t._v("true")]),t._v(' Ajv logs warning or throws exception if the property used in "required" keyword is not defined in "properties" keyword in the same or some parent schema relating to the same object (data instance).')]),t._v(" "),a("p",[t._v("By default this option is disabled.")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Property defined in parent schema")]),t._v(" "),a("p",[t._v("There are cases when property defined in the parent schema will not be taken into account.")])]),t._v(" "),a("h4",{attrs:{id:"unconstrained-tuples"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#unconstrained-tuples"}},[t._v("#")]),t._v(" Unconstrained tuples "),a("Badge",{attrs:{text:"strictTuples option"}})],1),t._v(" "),a("p",[t._v('Ajv also logs a warning if "items" is an array (for schema that defines a tuple) but neither "minItems" nor "additionalItems"/"maxItems" keyword is present (or have a wrong value):')]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("items")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"boolean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v('The above schema may have a mistake, as tuples usually are expected to have a fixed size. To "fix" it:')]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("items")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"boolean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("minItems")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalItems")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// or")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// maxItems: 2")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Sometimes users accidentally create schema for unit (a tuple with one item) that only validates the first item, this restriction prevents this mistake as well.")]),t._v(" "),a("p",[t._v("Use "),a("code",[t._v("strictTuples")]),t._v(" option to suppress this warning ("),a("code",[t._v("false")]),t._v(") or turn it into exception ("),a("code",[t._v("true")]),t._v(").")]),t._v(" "),a("p",[t._v("If you use "),a("code",[t._v("JSONSchemaType")]),t._v(" this mistake will also be prevented on a type level.")]),t._v(" "),a("h3",{attrs:{id:"strict-types"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#strict-types"}},[t._v("#")]),t._v(" Strict types "),a("Badge",{attrs:{text:"strictTypes option"}})],1),t._v(" "),a("p",[t._v("An additional option "),a("code",[t._v("strictTypes")]),t._v(' ("log" by default) imposes additional restrictions on how type keyword is used:')]),t._v(" "),a("h4",{attrs:{id:"union-types"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#union-types"}},[t._v("#")]),t._v(" Union types "),a("Badge",{attrs:{text:"allowUnionTypes option"}})],1),t._v(" "),a("p",[t._v("With "),a("code",[t._v("strictTypes")]),t._v(' option "type" keywords with multiple types (other than with "null") are prohibited.')]),t._v(" "),a("p",[t._v("Invalid:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Valid:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"null"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("and")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("nullable")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Unions can still be defined with "),a("code",[t._v("anyOf")]),t._v(" keyword.")]),t._v(" "),a("p",[t._v('The motivation for this restriction is that "type" is usually not the only keyword in the schema, and mixing other keywords that apply to different types is confusing. It is also consistent with wider range of versions of OpenAPI specification and has better tooling support. E.g., this example violating '),a("code",[t._v("strictTypes")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("minimum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("items")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("minimum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("is equivalent to this complying example, that is more verbose but also easier to maintain:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("anyOf")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("minimum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("items")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("minimum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("It also can be refactored:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$defs")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("item")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("minimum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("anyOf")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$ref")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"#/$defs/item"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("items")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$ref")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"#/$defs/item"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("This restriction can be lifted separately from other "),a("code",[t._v("strictTypes")]),t._v(" restrictions with "),a("code",[t._v("allowUnionTypes: true")]),t._v(" option.")]),t._v(" "),a("h4",{attrs:{id:"contradictory-types"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#contradictory-types"}},[t._v("#")]),t._v(" Contradictory types")]),t._v(" "),a("p",[t._v("Subschemas can apply to the same data instance, and it is possible to have contradictory type keywords - it usually indicate some mistake. For example:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("anyOf")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("The schema above violates "),a("code",[t._v("strictTypes")]),t._v(' as "array" type is not compatible with object. If you used '),a("code",[t._v("allowUnionTypes: true")]),t._v(" option, the above schema can be fixed in this way:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("anyOf")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v('"number" vs "integer"')]),t._v(" "),a("p",[t._v('Type "number" can be narrowed to "integer", the opposite would violate '),a("code",[t._v("strictTypes")]),t._v(".")])]),t._v(" "),a("h4",{attrs:{id:"require-applicable-types"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#require-applicable-types"}},[t._v("#")]),t._v(" Require applicable types")]),t._v(" "),a("p",[t._v("This simple JSON Schema is valid, but it violates "),a("code",[t._v("strictTypes")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"foo"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bar"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("This is a very common mistake that even people experienced with JSON Schema often make - the problem here is that any value that is not an object would be valid against this schema - this is rarely intentional.")]),t._v(" "),a("p",[t._v('To fix it, "type" keyword has to be added:')]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"foo"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bar"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v('You do not necessarily have to have "type" keyword in the same schema object; as long as there is "type" keyword applying to the same part of data instance in the same schema document, not via "$ref", it will be ok:')]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("anyOf")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"foo"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bar"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v('Both "properties" and "required" need '),a("code",[t._v('type: "object"')]),t._v(" to satisfy "),a("code",[t._v("strictTypes")]),t._v(" - it is sufficient to have it once in the parent schema, without repeating it in each schema.")]),t._v(" "),a("h3",{attrs:{id:"strict-number-validation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#strict-number-validation"}},[t._v("#")]),t._v(" Strict number validation "),a("Badge",{attrs:{text:"strictNumbers option"}})],1),t._v(" "),a("p",[t._v("Strict mode also affects number validation. By default Ajv fails "),a("code",[t._v('{"type": "number"}')]),t._v(" (or "),a("code",[t._v('"integer"')]),t._v(") validation for "),a("code",[t._v("Infinity")]),t._v(" and "),a("code",[t._v("NaN")]),t._v(".")])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/84.83ff6efb.js b/assets/js/84.83ff6efb.js new file mode 100644 index 000000000..c8ec3dfa6 --- /dev/null +++ b/assets/js/84.83ff6efb.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[84],{551:function(e,t,a){"use strict";a.r(t);var n=a(24),r=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"what-users-say"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-users-say"}},[e._v("#")]),e._v(" What users say")]),e._v(" "),t("p",[e._v("In the past 6 years of working on the JSON Schema Specification itself, Ajv stands out as the implementation of choice. It is very well documented and provides a rich API for extending JSON Schema which many thousands of people use in production today. A huge effort was put into testing, with many tests now forming part of the official test suite.")]),e._v(" "),t("p",[e._v("I've personally used Ajv in production to validate requests for a federated undiagnosed genetic disease program that has lead to new scientific discoveries and literally changed lives.")]),e._v(" "),t("p",[e._v("Ajv development can inform the future tooling and specification changes. There's no doubt that Ajv is partly responsible for the ubiquity and success of JSON Schema.")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/relequestual",target:"_blank",rel:"noopener noreferrer"}},[e._v("Ben Hutton"),t("OutboundLink")],1),e._v(", JSON Schema Specification Lead")]),e._v(" "),t("br"),e._v(" "),t("p",[t("a",{attrs:{href:"https://eslint.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("ESLint"),t("OutboundLink")],1),e._v(" has used Ajv for validating our complex configurations. Ajv has proven to be reliable over the years we’ve been using it and ESLint is proud to sponsor Ajv’s continued development.")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/nzakas",target:"_blank",rel:"noopener noreferrer"}},[e._v("Nicholas C. Zakas"),t("OutboundLink")],1),e._v(", ESLint creator and TSC member")]),e._v(" "),t("br"),e._v(" "),t("p",[e._v("I always thought that built-in data validation is a key feature of any web framework. We decided to leverage JSON Schema in "),t("a",{attrs:{href:"https://www.fastify.io",target:"_blank",rel:"noopener noreferrer"}},[e._v("Fastify"),t("OutboundLink")],1),e._v(", and Ajv fits our needs wonderfully: it’s fast, stable and well maintained.")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/mcollina",target:"_blank",rel:"noopener noreferrer"}},[e._v("Matteo Collina"),t("OutboundLink")],1),e._v(", technical Director "),t("a",{attrs:{href:"https://github.com/nearform",target:"_blank",rel:"noopener noreferrer"}},[e._v("@nearform"),t("OutboundLink")],1),e._v(" and TSC member")]),e._v(" "),t("br"),e._v(" "),t("p",[e._v("Ajv has become a centerpiece of all data-validation logic in my open-source projects and businesses. It is spec-compliant, extensible, fast and has amazing support.")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/gajus",target:"_blank",rel:"noopener noreferrer"}},[e._v("Gajus Kuizinas"),t("OutboundLink")],1),e._v(", Tech / Product Founder – building\n"),t("a",{attrs:{href:"https://twitter.com/contrahq",target:"_blank",rel:"noopener noreferrer"}},[e._v("@contrahq"),t("OutboundLink")],1)])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/app.bb2a0f22.js b/assets/js/app.bb2a0f22.js new file mode 100644 index 000000000..dd756a7fe --- /dev/null +++ b/assets/js/app.bb2a0f22.js @@ -0,0 +1,10 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(e){function t(t){for(var r,a,s=t[0],l=t[1],u=t[2],f=0,p=[];f

'};function o(e,t,n){return en?n:e}function i(e){return 100*(-1+e)}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=o(e,r.minimum,1),n.status=1===e?null:e;var l=n.render(!t),u=l.querySelector(r.barSelector),c=r.speed,f=r.easing;return l.offsetWidth,a((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(u,function(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+i(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+i(e)+"%,0)"}:{"margin-left":i(e)+"%"}).transition="all "+t+"ms "+n,o}(e,c,f)),1===e?(s(l,{transition:"none",opacity:1}),l.offsetWidth,setTimeout((function(){s(l,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,a=t.querySelector(r.barSelector),l=e?"-100":i(n.status||0),c=document.querySelector(r.parent);return s(a,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&p(o),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){c(document.documentElement,"nprogress-busy"),c(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 a=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(n){return n=n.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()})),t[n]||(t[n]=function(t){var n=document.body.style;if(t in n)return t;for(var r,o=e.length,i=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+i)in n)return r;return t}(n))}function r(e,t,r){t=n(t),e.style[t]=r}return function(e,t){var n,o,i=arguments;if(2==i.length)for(n in t)void 0!==(o=t[n])&&t.hasOwnProperty(n)&&r(e,n,o);else r(e,i[1],i[2])}}();function l(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=f(e),r=n+t;l(n,t)||(e.className=r.substring(1))}function c(e,t){var n,r=f(e);l(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})?r.call(t,n,t,e):r)||(e.exports=o)},function(e,t,n){"use strict";n(145)},function(e,t,n){"use strict";var r=n(153),o=n(11),i=n(1),a=n(45),s=n(155),l=n(33),u=n(30),c=n(156),f=n(86),p=n(51),d=TypeError,v=function(e,t){this.stopped=e,this.result=t},h=v.prototype;e.exports=function(e,t,n){var m,g,y,b,_,w,x,j=n&&n.that,k=!(!n||!n.AS_ENTRIES),S=!(!n||!n.IS_RECORD),O=!(!n||!n.IS_ITERATOR),C=!(!n||!n.INTERRUPTED),P=r(t,j),E=function(e){return m&&p(m,"normal",e),new v(!0,e)},$=function(e){return k?(i(e),C?P(e[0],e[1],E):P(e[0],e[1])):C?P(e,E):P(e)};if(S)m=e.iterator;else if(O)m=e;else{if(!(g=f(e)))throw new d(a(e)+" is not iterable");if(s(g)){for(y=0,b=l(e);b>y;y++)if((_=$(e[y]))&&u(h,_))return _;return new v(!1)}m=c(e,g)}for(w=S?e.next:m.next;!(x=o(w,m)).done;){try{_=$(x.value)}catch(e){p(m,"throw",e)}if("object"==typeof _&&_&&u(h,_))return _}return new v(!1)}},function(e,t,n){"use strict";var r=n(0),o=n(14),i=n(75),a=n(47);e.exports=function(e,t,n,s){s||(s={});var l=s.enumerable,u=void 0!==s.name?s.name:t;if(r(n)&&i(n,u,s),s.global)l?e[t]=n:a(t,n);else{try{s.unsafe?e[t]&&(l=!0):delete e[t]}catch(e){}l?e[t]=n:o.f(e,t,{value:n,enumerable:!1,configurable:!s.nonConfigurable,writable:!s.nonWritable})}return e}},function(e,t,n){"use strict";var r=n(44),o=TypeError;e.exports=function(e){if(r(e))throw new o("Can't call method on "+e);return e}},function(e,t,n){"use strict";e.exports=function(e){return null==e}},function(e,t,n){"use strict";var r=String;e.exports=function(e){try{return r(e)}catch(e){return"Object"}}},function(e,t,n){"use strict";var r=n(18),o=n(2),i=n(47),a=e.exports=o["__core-js_shared__"]||i("__core-js_shared__",{});(a.versions||(a.versions=[])).push({version:"3.39.0",mode:r?"pure":"global",copyright:"© 2014-2024 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.39.0/LICENSE",source:"https://github.com/zloirock/core-js"})},function(e,t,n){"use strict";var r=n(2),o=Object.defineProperty;e.exports=function(e,t){try{o(r,e,{value:t,configurable:!0,writable:!0})}catch(n){r[e]=t}return t}},function(e,t,n){"use strict";var r=n(70),o=n(71),i=r("keys");e.exports=function(e){return i[e]||(i[e]=o(e))}},function(e,t,n){"use strict";e.exports={}},function(e,t,n){"use strict";e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(e,t,n){"use strict";var r=n(11),o=n(1),i=n(31);e.exports=function(e,t,n){var a,s;o(e);try{if(!(a=i(e,"return"))){if("throw"===t)throw n;return n}a=r(a,e)}catch(e){s=!0,a=e}if("throw"===t)throw n;if(s)throw a;return o(a),n}},function(e,t,n){var r=n(178),o=n(17),i=Object.prototype,a=i.hasOwnProperty,s=i.propertyIsEnumerable,l=r(function(){return arguments}())?r:function(e){return o(e)&&a.call(e,"callee")&&!s.call(e,"callee")};e.exports=l},function(e,t,n){var r=n(15)(n(12),"Map");e.exports=r},function(e,t){e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},function(e,t,n){var r=n(198),o=n(205),i=n(207),a=n(208),s=n(209);function l(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t-1&&e%1==0&&e<=9007199254740991}},function(e,t,n){var r=n(10),o=n(59),i=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,a=/^\w*$/;e.exports=function(e,t){if(r(e))return!1;var n=typeof e;return!("number"!=n&&"symbol"!=n&&"boolean"!=n&&null!=e&&!o(e))||(a.test(e)||!i.test(e)||null!=t&&e in Object(t))}},function(e,t,n){var r=n(21),o=n(17);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},function(e,t){e.exports=function(e){return e}},function(e,t,n){"use strict";n(152)},function(e,t,n){"use strict";var r=n(5),o=n(11),i=n(122),a=n(27),s=n(28),l=n(64),u=n(8),c=n(72),f=Object.getOwnPropertyDescriptor;t.f=r?f:function(e,t){if(e=s(e),t=l(t),c)try{return f(e,t)}catch(e){}if(u(e,t))return a(!o(i.f,e,t),e[t])}},function(e,t,n){"use strict";var r=n(4),o=n(3),i=n(22),a=Object,s=r("".split);e.exports=o((function(){return!a("z").propertyIsEnumerable(0)}))?function(e){return"String"===i(e)?s(e,""):a(e)}:a},function(e,t,n){"use strict";var r=n(123),o=n(65);e.exports=function(e){var t=r(e,"string");return o(t)?t:t+""}},function(e,t,n){"use strict";var r=n(29),o=n(0),i=n(30),a=n(66),s=Object;e.exports=a?function(e){return"symbol"==typeof e}:function(e){var t=r("Symbol");return o(t)&&i(t.prototype,s(e))}},function(e,t,n){"use strict";var r=n(67);e.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},function(e,t,n){"use strict";var r=n(68),o=n(3),i=n(2).String;e.exports=!!Object.getOwnPropertySymbols&&!o((function(){var e=Symbol("symbol detection");return!i(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&r&&r<41}))},function(e,t,n){"use strict";var r,o,i=n(2),a=n(69),s=i.process,l=i.Deno,u=s&&s.versions||l&&l.version,c=u&&u.v8;c&&(o=(r=c.split("."))[0]>0&&r[0]<4?1:+(r[0]+r[1])),!o&&a&&(!(r=a.match(/Edge\/(\d+)/))||r[1]>=74)&&(r=a.match(/Chrome\/(\d+)/))&&(o=+r[1]),e.exports=o},function(e,t,n){"use strict";var r=n(2).navigator,o=r&&r.userAgent;e.exports=o?String(o):""},function(e,t,n){"use strict";var r=n(46);e.exports=function(e,t){return r[e]||(r[e]=t||{})}},function(e,t,n){"use strict";var r=n(4),o=0,i=Math.random(),a=r(1..toString);e.exports=function(e){return"Symbol("+(void 0===e?"":e)+")_"+a(++o+i,36)}},function(e,t,n){"use strict";var r=n(5),o=n(3),i=n(73);e.exports=!r&&!o((function(){return 7!==Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},function(e,t,n){"use strict";var r=n(2),o=n(7),i=r.document,a=o(i)&&o(i.createElement);e.exports=function(e){return a?i.createElement(e):{}}},function(e,t,n){"use strict";var r=n(5),o=n(3);e.exports=r&&o((function(){return 42!==Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))},function(e,t,n){"use strict";var r=n(4),o=n(3),i=n(0),a=n(8),s=n(5),l=n(125).CONFIGURABLE,u=n(126),c=n(76),f=c.enforce,p=c.get,d=String,v=Object.defineProperty,h=r("".slice),m=r("".replace),g=r([].join),y=s&&!o((function(){return 8!==v((function(){}),"length",{value:8}).length})),b=String(String).split("String"),_=e.exports=function(e,t,n){"Symbol("===h(d(t),0,7)&&(t="["+m(d(t),/^Symbol\(([^)]*)\).*$/,"$1")+"]"),n&&n.getter&&(t="get "+t),n&&n.setter&&(t="set "+t),(!a(e,"name")||l&&e.name!==t)&&(s?v(e,"name",{value:t,configurable:!0}):e.name=t),y&&n&&a(n,"arity")&&e.length!==n.arity&&v(e,"length",{value:n.arity});try{n&&a(n,"constructor")&&n.constructor?s&&v(e,"prototype",{writable:!1}):e.prototype&&(e.prototype=void 0)}catch(e){}var r=f(e);return a(r,"source")||(r.source=g(b,"string"==typeof t?t:"")),e};Function.prototype.toString=_((function(){return i(this)&&p(this).source||u(this)}),"toString")},function(e,t,n){"use strict";var r,o,i,a=n(127),s=n(2),l=n(7),u=n(19),c=n(8),f=n(46),p=n(48),d=n(49),v=s.TypeError,h=s.WeakMap;if(a||f.state){var m=f.state||(f.state=new h);m.get=m.get,m.has=m.has,m.set=m.set,r=function(e,t){if(m.has(e))throw new v("Object already initialized");return t.facade=e,m.set(e,t),t},o=function(e){return m.get(e)||{}},i=function(e){return m.has(e)}}else{var g=p("state");d[g]=!0,r=function(e,t){if(c(e,g))throw new v("Object already initialized");return t.facade=e,u(e,g,t),t},o=function(e){return c(e,g)?e[g]:{}},i=function(e){return c(e,g)}}e.exports={set:r,get:o,has:i,enforce:function(e){return i(e)?o(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!l(t)||(n=o(t)).type!==e)throw new v("Incompatible receiver, "+e+" required");return n}}}},function(e,t,n){"use strict";var r=n(8),o=n(128),i=n(62),a=n(14);e.exports=function(e,t,n){for(var s=o(t),l=a.f,u=i.f,c=0;cu;)o(r,n=t[u++])&&(~a(c,n)||l(c,n));return c}},function(e,t,n){"use strict";var r=n(132);e.exports=function(e){var t=+e;return t!=t||0===t?0:r(t)}},function(e,t,n){"use strict";var r=n(8),o=n(0),i=n(32),a=n(48),s=n(137),l=a("IE_PROTO"),u=Object,c=u.prototype;e.exports=s?u.getPrototypeOf:function(e){var t=i(e);if(r(t,l))return t[l];var n=t.constructor;return o(n)&&t instanceof n?n.prototype:t instanceof u?c:null}},function(e,t,n){"use strict";var r,o,i,a=n(3),s=n(0),l=n(7),u=n(82),c=n(80),f=n(42),p=n(13),d=n(18),v=p("iterator"),h=!1;[].keys&&("next"in(i=[].keys())?(o=c(c(i)))!==Object.prototype&&(r=o):h=!0),!l(r)||a((function(){var e={};return r[v].call(e)!==e}))?r={}:d&&(r=u(r)),s(r[v])||f(r,v,(function(){return this})),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:h}},function(e,t,n){"use strict";var r,o=n(1),i=n(139),a=n(50),s=n(49),l=n(141),u=n(73),c=n(48),f=c("IE_PROTO"),p=function(){},d=function(e){return" + diff --git a/codegen.html b/codegen.html index cb2976a79..163079055 100644 --- a/codegen.html +++ b/codegen.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/coercion.html b/coercion.html index b265eb61c..2db2b0720 100644 --- a/coercion.html +++ b/coercion.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/components.html b/components.html index 802530c0c..105a8e93d 100644 --- a/components.html +++ b/components.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/contributing/index.html b/contributing/index.html index 6132f1bd9..17a43d448 100644 --- a/contributing/index.html +++ b/contributing/index.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/faq.html b/faq.html index 8570c020b..d5dc3a1d1 100644 --- a/faq.html +++ b/faq.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/guide/async-validation.html b/guide/async-validation.html index d5735134f..fbaf3a6a0 100644 --- a/guide/async-validation.html +++ b/guide/async-validation.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/guide/combining-schemas.html b/guide/combining-schemas.html index 6e105ab1e..19fe72f12 100644 --- a/guide/combining-schemas.html +++ b/guide/combining-schemas.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/guide/environments.html b/guide/environments.html index a456ee678..3b08bf115 100644 --- a/guide/environments.html +++ b/guide/environments.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/guide/formats.html b/guide/formats.html index 28033b0a8..2d6b6d1f7 100644 --- a/guide/formats.html +++ b/guide/formats.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/guide/getting-started.html b/guide/getting-started.html index 834a0a83a..2c68e1eaf 100644 --- a/guide/getting-started.html +++ b/guide/getting-started.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/guide/managing-schemas.html b/guide/managing-schemas.html index 9f34af76e..30b174842 100644 --- a/guide/managing-schemas.html +++ b/guide/managing-schemas.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/guide/modifying-data.html b/guide/modifying-data.html index 962b1f94c..6a0919258 100644 --- a/guide/modifying-data.html +++ b/guide/modifying-data.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/guide/schema-language.html b/guide/schema-language.html index bdfc4f123..36b652419 100644 --- a/guide/schema-language.html +++ b/guide/schema-language.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/guide/typescript.html b/guide/typescript.html index babc97bb6..9570b10b8 100644 --- a/guide/typescript.html +++ b/guide/typescript.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/guide/user-keywords.html b/guide/user-keywords.html index 54fdb429a..c7a1966c3 100644 --- a/guide/user-keywords.html +++ b/guide/user-keywords.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/guide/why-ajv.html b/guide/why-ajv.html index abd762ec7..46c5a54e2 100644 --- a/guide/why-ajv.html +++ b/guide/why-ajv.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/index.html b/index.html index 1b468b622..f853292f1 100644 --- a/index.html +++ b/index.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/json-schema.html b/json-schema.html index 503293a84..6527cce1b 100644 --- a/json-schema.html +++ b/json-schema.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/json-type-definition.html b/json-type-definition.html index 3b06e4588..4b3fcd473 100644 --- a/json-type-definition.html +++ b/json-type-definition.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/keywords.html b/keywords.html index 5384d03f0..2ba017dfa 100644 --- a/keywords.html +++ b/keywords.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/license.html b/license.html index 14c611a72..241abe260 100644 --- a/license.html +++ b/license.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/news/2020-08-14-mozilla-grant-openjs-foundation.html b/news/2020-08-14-mozilla-grant-openjs-foundation.html index f3ca9badc..800d43541 100644 --- a/news/2020-08-14-mozilla-grant-openjs-foundation.html +++ b/news/2020-08-14-mozilla-grant-openjs-foundation.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/news/2020-12-15-ajv-version-7-released.html b/news/2020-12-15-ajv-version-7-released.html index ebf8dbb6d..50bb7c006 100644 --- a/news/2020-12-15-ajv-version-7-released.html +++ b/news/2020-12-15-ajv-version-7-released.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/news/2021-03-07-ajv-supports-json-type-definition.html b/news/2021-03-07-ajv-supports-json-type-definition.html index d85eb8a43..a87a071d0 100644 --- a/news/2021-03-07-ajv-supports-json-type-definition.html +++ b/news/2021-03-07-ajv-supports-json-type-definition.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/news/2021-03-27-ajv-version-8-released.html b/news/2021-03-27-ajv-version-8-released.html index 99bc0a2b6..1374ec6cc 100644 --- a/news/2021-03-27-ajv-version-8-released.html +++ b/news/2021-03-27-ajv-version-8-released.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/news/2021-04-24-ajv-online-event.html b/news/2021-04-24-ajv-online-event.html index 4592f8d52..8f7ecbdef 100644 --- a/news/2021-04-24-ajv-online-event.html +++ b/news/2021-04-24-ajv-online-event.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/news/2021-05-24-ajv-online-event-video.html b/news/2021-05-24-ajv-online-event-video.html index 11e5b88ba..e8f5ae9a5 100644 --- a/news/2021-05-24-ajv-online-event-video.html +++ b/news/2021-05-24-ajv-online-event-video.html @@ -18,8 +18,8 @@ - - + + - + diff --git a/news/2021-07-22-ajv-microsoft-foss-fund-award.html b/news/2021-07-22-ajv-microsoft-foss-fund-award.html index 8e825afe0..5194f51e8 100644 --- a/news/2021-07-22-ajv-microsoft-foss-fund-award.html +++ b/news/2021-07-22-ajv-microsoft-foss-fund-award.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/news/index.html b/news/index.html index dd330e97f..52c1fede0 100644 --- a/news/index.html +++ b/news/index.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/options.html b/options.html index 4568ab4b7..5052cf3a4 100644 --- a/options.html +++ b/options.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/packages/ajv-cli.html b/packages/ajv-cli.html index 409f7d8c1..c7269e65d 100644 --- a/packages/ajv-cli.html +++ b/packages/ajv-cli.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/packages/ajv-errors.html b/packages/ajv-errors.html index e8c319933..be546157f 100644 --- a/packages/ajv-errors.html +++ b/packages/ajv-errors.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/packages/ajv-formats.html b/packages/ajv-formats.html index 71c11fa6f..3d826518b 100644 --- a/packages/ajv-formats.html +++ b/packages/ajv-formats.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/packages/ajv-i18n.html b/packages/ajv-i18n.html index 0aa30f530..ac45c4871 100644 --- a/packages/ajv-i18n.html +++ b/packages/ajv-i18n.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/packages/ajv-keywords.html b/packages/ajv-keywords.html index dd13caf7b..0fd7ff910 100644 --- a/packages/ajv-keywords.html +++ b/packages/ajv-keywords.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/packages/index.html b/packages/index.html index 759d946c9..ea4eaf5d4 100644 --- a/packages/index.html +++ b/packages/index.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/security.html b/security.html index baad38299..6cceaaa13 100644 --- a/security.html +++ b/security.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/standalone.html b/standalone.html index 356388f25..7cb5aa58a 100644 --- a/standalone.html +++ b/standalone.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/strict-mode.html b/strict-mode.html index b0d6c1530..1f2b247f6 100644 --- a/strict-mode.html +++ b/strict-mode.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/testimonials.html b/testimonials.html index ac78b571c..40275d209 100644 --- a/testimonials.html +++ b/testimonials.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/v6-to-v8-migration.html b/v6-to-v8-migration.html index 13e9a3fa5..3fbedf89e 100644 --- a/v6-to-v8-migration.html +++ b/v6-to-v8-migration.html @@ -18,8 +18,8 @@ - - + +