From 7117fd2aabd91aba568d052a793fdc777cab7590 Mon Sep 17 00:00:00 2001 From: Diptesh Choudhuri Date: Fri, 22 Sep 2023 21:59:26 +0530 Subject: [PATCH 01/34] feat(backend): allow starting hanko without config file --- backend/config/config.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/config/config.go b/backend/config/config.go index 7da400688..badd66210 100644 --- a/backend/config/config.go +++ b/backend/config/config.go @@ -43,8 +43,9 @@ func Load(cfgFile *string) (*Config, error) { if cfgFile == nil || *cfgFile == "" { *cfgFile = "./config/config.yaml" } + if err = k.Load(file.Provider(*cfgFile), yaml.Parser()); err != nil { - return nil, fmt.Errorf("failed to load config from: %s: %w", *cfgFile, err) + log.Println("failed to load config, skipping...") } else { log.Println("Using config file:", *cfgFile) } From 84a4d14980af03816c9c4b05be46942642242185 Mon Sep 17 00:00:00 2001 From: Ashutosh Bhadauriya Date: Fri, 22 Sep 2023 22:00:22 +0530 Subject: [PATCH 02/34] Update community link (#1038) --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4a4ed24ab..7cbe3dee8 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ Schedule a Hanko demo. Learn how Hanko will speed up your registration and login # Roadmap -We are currently in **Beta** and may introduce breaking changes. Watch our releases, leave a star, join our [Slack community](https://www.hanko.io/community), or sign up to our [product news](https://www.hanko.io/updates) to follow the development. Here's a brief overview of our roadmap: +We are currently in **Beta** and may introduce breaking changes. Watch our releases, leave a star, join our [Discord community](https://www.hanko.io/community), or sign up to our [product news](https://www.hanko.io/updates) to follow the development. Here's a brief overview of our roadmap: | Status | Feature | |:------:| :--- | @@ -97,8 +97,8 @@ Additional features that have been requested or that we would like to build but ## Questions, bugs, ideas If you have any questions or issues, please check this project's [Q&A section in discussions](https://github.com/teamhanko/hanko/discussions/categories/q-a) and the [open issues](https://github.com/teamhanko/hanko/issues). Feel free to comment on existing issues or create a new issue if you encounter any bugs or have a feature request. For yet unanswered questions, feedback, or new ideas, please open a new discussion. -## Slack community & Twitter -We invite you to join our growing [Slack community](https://www.hanko.io/community) if you want to get the latest updates on passkeys, WebAuthn, and this project, or if you just want to chat with us. You can also [follow us on Twitter](https://twitter.com/hanko_io). +## Discord community & Twitter +We invite you to join our growing [Discord community](https://www.hanko.io/community) if you want to get the latest updates on passkeys, WebAuthn, and this project, or if you just want to chat with us. You can also [follow us on Twitter](https://twitter.com/hanko_io). # Licenses [hanko-elements](frontend/elements) and [hanko-frontend-sdk](frontend/frontend-sdk) are licensed under the [MIT License](frontend/elements/LICENSE). Everything else in this repository, including [hanko backend](backend), is licensed under the [AGPL-3.0](/LICENSE). From 88510874b32e8a6bd77a851bbdb86cfb694eaa3e Mon Sep 17 00:00:00 2001 From: Diptesh Choudhuri Date: Fri, 22 Sep 2023 22:10:52 +0530 Subject: [PATCH 03/34] fix(backend): ignore error only if default config selected --- backend/config/config.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/backend/config/config.go b/backend/config/config.go index badd66210..f4d5e1049 100644 --- a/backend/config/config.go +++ b/backend/config/config.go @@ -41,10 +41,13 @@ func Load(cfgFile *string) (*Config, error) { k := koanf.New(".") var err error if cfgFile == nil || *cfgFile == "" { - *cfgFile = "./config/config.yaml" + *cfgFile = DefaultConfigFilePath } if err = k.Load(file.Provider(*cfgFile), yaml.Parser()); err != nil { + if *cfgFile != DefaultConfigFilePath { + return nil, fmt.Errorf("failed to load config file: %w", err) + } log.Println("failed to load config, skipping...") } else { log.Println("Using config file:", *cfgFile) From 662109103f6e85fab3b31733a443af3ced700ec2 Mon Sep 17 00:00:00 2001 From: Diptesh Choudhuri Date: Fri, 22 Sep 2023 22:16:20 +0530 Subject: [PATCH 04/34] chore(backend): improve error message returned --- backend/config/config.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/config/config.go b/backend/config/config.go index f4d5e1049..1a131ec08 100644 --- a/backend/config/config.go +++ b/backend/config/config.go @@ -46,7 +46,7 @@ func Load(cfgFile *string) (*Config, error) { if err = k.Load(file.Provider(*cfgFile), yaml.Parser()); err != nil { if *cfgFile != DefaultConfigFilePath { - return nil, fmt.Errorf("failed to load config file: %w", err) + return nil, fmt.Errorf("failed to load config from: %s: %w", *cfgFile, err) } log.Println("failed to load config, skipping...") } else { From 728e18315dfbdf73f27a52b6cbf14ef61da9ad2e Mon Sep 17 00:00:00 2001 From: Esther Lizardo <100808713+Esther-Lita@users.noreply.github.com> Date: Sat, 23 Sep 2023 10:19:46 +0200 Subject: [PATCH 05/34] improved Hanko Elements default styles (#1036) * hanko-auth component styled slightly different Changing the max-width and adding padding around in the container can bring a nicer UI for the user's first impression of the Hanko components * Removed Prettier formatting --------- Co-authored-by: Felix Magedanz --- frontend/elements/README.md | 20 +++--- frontend/elements/example.css | 70 +++++++++---------- frontend/elements/src/_preset.sass | 18 ++--- .../elements/src/components/link/styles.sass | 2 +- .../src/components/spacer/styles.sass | 1 + 5 files changed, 56 insertions(+), 55 deletions(-) diff --git a/frontend/elements/README.md b/frontend/elements/README.md index 0424bc57a..18ee7fbc9 100644 --- a/frontend/elements/README.md +++ b/frontend/elements/README.md @@ -349,7 +349,7 @@ variables including default values can be found below: hanko-auth, hanko-profile { /* Color Scheme */ - --color: #171717; + --color: #333333; --color-shade-1: #8f9095; --color-shade-2: #e5e6ef; @@ -363,11 +363,11 @@ hanko-profile { /* Font Styles */ --font-weight: 400; - --font-size: 14px; + --font-size: 16px; --font-family: sans-serif; /* Border Styles */ - --border-radius: 4px; + --border-radius: 8px; --border-style: solid; --border-width: 1px; @@ -376,17 +376,17 @@ hanko-profile { --item-margin: 0.5rem 0; /* Container Styles */ - --container-padding: 0; - --container-max-width: 600px; + --container-padding: 30px; + --container-max-width: 410px; /* Headline Styles */ --headline1-font-size: 24px; --headline1-font-weight: 600; - --headline1-margin: 0 0 0.5rem; + --headline1-margin: 0 0 1rem; - --headline2-font-size: 14px; + --headline2-font-size: 16px; --headline2-font-weight: 600; - --headline2-margin: 1rem 0 0.25rem; + --headline2-margin: 1rem 0 0.5rem; /* Divider Styles */ --divider-padding: 0 42px; @@ -397,7 +397,7 @@ hanko-profile { --link-text-decoration-hover: underline; /* Input Styles */ - --input-min-width: 12em; + --input-min-width: 14em; /* Button Styles */ --button-min-width: max-content; @@ -768,4 +768,4 @@ Found a bug? Please report on our [GitHub](https://github.com/teamhanko/hanko/is ## License -The `elements` project is licensed under the [MIT License](LICENSE). +The `elements` project is licensed under the [MIT License](LICENSE). \ No newline at end of file diff --git a/frontend/elements/example.css b/frontend/elements/example.css index 675df421e..ce9d50b92 100644 --- a/frontend/elements/example.css +++ b/frontend/elements/example.css @@ -1,7 +1,7 @@ .hanko_container { background-color: var(--background-color, white); padding: var(--container-padding, 0); - max-width: var(--container-max-width, 600px); + max-width: var(--container-max-width, 410px); display: flex; flex-direction: column; flex-wrap: nowrap; @@ -56,15 +56,15 @@ .hanko_button { font-weight: var(--font-weight, 400); - font-size: var(--font-size, 14px); + font-size: var(--font-size, 16px); font-family: var(--font-family, sans-serif); - border-radius: var(--border-radius, 4px); + border-radius: var(--border-radius, 8px); border-style: var(--border-style, solid); border-width: var(--border-width, 1px); white-space: nowrap; width: 100%; min-width: var(--button-min-width, 7em); - height: var(--item-height, 34px); + height: var(--item-height, 42); outline: none; cursor: pointer; transition: .1s ease-out; @@ -91,7 +91,7 @@ .hanko_button.hanko_primary:focus { color: var(--brand-contrast-color, white); background: var(--brand-color, #506cf0); - border-color: var(--color, #171717) + border-color: var(--color, #333333) } .hanko_button.hanko_primary:disabled { @@ -101,19 +101,19 @@ } .hanko_button.hanko_secondary { - color: var(--color, #171717); + color: var(--color, #333333); background: var(--background-color, white); - border-color: var(--color, #171717) + border-color: var(--color, #333333) } .hanko_button.hanko_secondary:hover { - color: var(--color, #171717); + color: var(--color, #333333); background: var(--color-shade-2, #e5e6ef); - border-color: var(--color, #171717) + border-color: var(--color, #333333) } .hanko_button.hanko_secondary:focus { - color: var(--color, #171717); + color: var(--color, #333333); background: var(--background-color, white); border-color: var(--brand-color, #506cf0) } @@ -134,13 +134,13 @@ .hanko_input { font-weight: var(--font-weight, 400); - font-size: var(--font-size, 14px); + font-size: var(--font-size, 16px); font-family: var(--font-family, sans-serif); - border-radius: var(--border-radius, 4px); + border-radius: var(--border-radius, 8px); border-style: var(--border-style, solid); border-width: var(--border-width, 1px); - height: var(--item-height, 34px); - color: var(--color, #171717); + height: var(--item-height, 42px); + color: var(--color, #333333); border-color: var(--color-shade-1, #8f9095); background: var(--background-color, white); padding: 0 .5rem; @@ -153,7 +153,7 @@ .hanko_input:-webkit-autofill, .hanko_input:-webkit-autofill:hover, .hanko_input:-webkit-autofill:focus { - -webkit-text-fill-color: var(--color, #171717); + -webkit-text-fill-color: var(--color, #333333); -webkit-box-shadow: 0 0 0 50px var(--background-color, white) inset } @@ -167,8 +167,8 @@ } .hanko_input:focus { - color: var(--color, #171717); - border-color: var(--color, #171717) + color: var(--color, #333333); + border-color: var(--color, #333333) } .hanko_input:disabled { @@ -214,7 +214,7 @@ .hanko_loadingSpinnerWrapperIcon .hanko_secondary.hanko_loadingSpinner, .hanko_secondary.hanko_exclamationMark, .hanko_secondary.hanko_checkmark { - fill: var(--color, #171717) + fill: var(--color, #333333) } .hanko_icon.hanko_disabled, @@ -309,7 +309,7 @@ } .hanko_headline { - color: var(--color, #171717); + color: var(--color, #333333); font-family: var(--font-family, sans-serif); text-align: left; letter-spacing: 0; @@ -320,27 +320,27 @@ .hanko_headline.hanko_grade1 { font-size: var(--headline1-font-size, 24px); font-weight: var(--headline1-font-weight, 600); - margin: var(--headline1-margin, 0 0 0.5rem) + margin: var(--headline1-margin, 0 0 1rem) } .hanko_headline.hanko_grade2 { - font-size: var(--headline2-font-size, 14px); + font-size: var(--headline2-font-size, 16px); font-weight: var(--headline2-font-weight, 600); - margin: var(--headline2-margin, 1rem 0 0.25rem) + margin: var(--headline2-margin, 1rem 0 0.5rem) } .hanko_errorMessage { font-weight: var(--font-weight, 400); - font-size: var(--font-size, 14px); + font-size: var(--font-size, 16px); font-family: var(--font-family, sans-serif); - border-radius: var(--border-radius, 4px); + border-radius: var(--border-radius, 8px); border-style: var(--border-style, solid); border-width: var(--border-width, 1px); color: var(--error-color, #e82020); background: var(--background-color, white); padding: .25rem; margin: var(--item-margin, 0.5rem 0); - min-height: var(--item-height, 34px); + min-height: var(--item-height, 42px); display: flex; align-items: center; box-sizing: border-box @@ -356,9 +356,9 @@ .hanko_paragraph { font-weight: var(--font-weight, 400); - font-size: var(--font-size, 14px); + font-size: var(--font-size, 16px); font-family: var(--font-family, sans-serif); - color: var(--color, #171717); + color: var(--color, #333333); margin: var(--item-margin, 0.5rem 0); text-align: left; word-break: break-word @@ -366,22 +366,22 @@ .hanko_accordion { font-weight: var(--font-weight, 400); - font-size: var(--font-size, 14px); + font-size: var(--font-size, 16px); font-family: var(--font-family, sans-serif); width: 100%; overflow: hidden } .hanko_accordion .hanko_accordionItem { - color: var(--color, #171717); + color: var(--color, #333333); margin: .25rem 0; overflow: hidden } .hanko_accordion .hanko_accordionItem .hanko_label { - border-radius: var(--border-radius, 4px); + border-radius: var(--border-radius, 8px); border-style: none; - height: var(--item-height, 34px); + height: var(--item-height, 42px); background: var(--background-color, white); box-sizing: border-box; display: flex; @@ -485,7 +485,7 @@ .hanko_link { font-weight: var(--font-weight, 400); - font-size: var(--font-size, 14px); + font-size: var(--font-size, 16px); font-family: var(--font-family, sans-serif); color: var(--link-color, #506cf0); text-decoration: var(--link-text-decoration, none); @@ -500,7 +500,7 @@ } .hanko_link.hanko_disabled { - color: var(--color, #171717); + color: var(--color, #333333); pointer-events: none; cursor: default } @@ -523,7 +523,7 @@ .hanko_divider { font-weight: var(--font-weight, 400); - font-size: var(--font-size, 14px); + font-size: var(--font-size, 16px); font-family: var(--font-family, sans-serif); display: var(--divider-display, flex); visibility: var(--divider-visibility, visible); @@ -545,4 +545,4 @@ background: var(--background-color, white); padding: var(--divider-padding, 0 42px); line-height: .1em -} +} \ No newline at end of file diff --git a/frontend/elements/src/_preset.sass b/frontend/elements/src/_preset.sass index de7430546..e0d7c89f4 100644 --- a/frontend/elements/src/_preset.sass +++ b/frontend/elements/src/_preset.sass @@ -1,5 +1,5 @@ // Color Scheme -$color: #171717 +$color: #333333 $color-shade-1: #8f9095 $color-shade-2: #e5e6ef @@ -13,30 +13,30 @@ $link-color: #506cf0 // Font Styles $font-weight: 400 -$font-size: 14px +$font-size: 16px $font-family: sans-serif // Border Styles -$border-radius: 4px +$border-radius: 8px $border-style: solid $border-width: 1px // Item Styles -$item-height: 34px +$item-height: 42px $item-margin: .5rem 0 // Container Styles -$container-padding: 0 -$container-max-width: 600px +$container-padding: 30px +$container-max-width: 410px // Headline Styles $headline1-font-size: 24px $headline1-font-weight: 600 -$headline1-margin: 0 0 .5rem +$headline1-margin: 0 0 1rem -$headline2-font-size: 14px +$headline2-font-size: 16px $headline2-font-weight: 600 -$headline2-margin: 1rem 0 .25rem +$headline2-margin: 1rem 0 .5rem // Divider Styles $divider-padding: 0 42px diff --git a/frontend/elements/src/components/link/styles.sass b/frontend/elements/src/components/link/styles.sass index bb77f2b48..a513f74d2 100644 --- a/frontend/elements/src/components/link/styles.sass +++ b/frontend/elements/src/components/link/styles.sass @@ -28,7 +28,7 @@ flex-direction: row justify-content: space-between align-items: center - height: 1.2rem + height: 1.8rem &.reverse flex-direction: row-reverse diff --git a/frontend/elements/src/components/spacer/styles.sass b/frontend/elements/src/components/spacer/styles.sass index 22bcd724a..104c1b10b 100644 --- a/frontend/elements/src/components/spacer/styles.sass +++ b/frontend/elements/src/components/spacer/styles.sass @@ -11,6 +11,7 @@ visibility: variables.$divider-visibility color: variables.$color-shade-1 margin: variables.$item-margin + padding: .5em .line border-bottom-style: variables.$border-style From d8b928e74cb30e9f6f5163dd397c50d99d71d73d Mon Sep 17 00:00:00 2001 From: Felix Magedanz Date: Sat, 23 Sep 2023 10:21:57 +0200 Subject: [PATCH 06/34] Update en.ts (#1034) * Update en.ts Shortened some texts for better looks --------- Co-authored-by: Esther Lizardo <100808713+Esther-Lita@users.noreply.github.com> --- frontend/elements/src/i18n/en.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/frontend/elements/src/i18n/en.ts b/frontend/elements/src/i18n/en.ts index c4abf5180..bbc1d8762 100644 --- a/frontend/elements/src/i18n/en.ts +++ b/frontend/elements/src/i18n/en.ts @@ -36,25 +36,25 @@ export const en: Translation = { passwordFormatHint: "Must be between {minLength} and {maxLength} characters long.", manageEmails: - "Your email addresses are used for communication and authentication.", + "Used for passcode authentication.", changePassword: "Set a new password.", managePasskeys: "Your passkeys allow you to sign in to this account.", isPrimaryEmail: - "Used for communication, passcodes, and as username for passkeys. To change the primary email address, add another email address first and set it as primary.", + "This email address will be used as username for your passkeys.", setPrimaryEmail: - "Set this email address primary so it will be used for communications, for passcodes, and as a username for passkeys.", + "Set this email to be used as username for new passkeys.", emailVerified: "This email address has been verified.", emailUnverified: "This email address has not been verified.", emailDelete: - "If you delete this email address, it can no longer be used for signing in to your account. Passkeys that may have been created with this email address will remain intact.", + "If you delete this email address, it can no longer be used to sign in.", emailDeleteThirdPartyConnection: - "If you delete this email address, it can no longer be used for signing in. You can also no longer sign in with or reconnect your {provider} account. Passkeys that may have been created with this email address will remain intact.", + "If you delete this email address, it can no longer be used to sign in.", emailDeletePrimary: - "The primary email address cannot be deleted. Add another email address first and make it your primary email address.", + "The primary email address cannot be deleted.", renamePasskey: - "Set a name for the passkey that helps you identify where it is stored.", + "Set a name for the passkey.", deletePasskey: - "Delete this passkey from your account. Note that the passkey will still exist on your devices and needs to be deleted there as well.", + "Delete this passkey from your account.", deleteAccount: "Are you sure you want to delete this account? All data will be deleted immediately and cannot be recovered.", noAccountExists: From 7ac731670942faec55e7928a35f416143d68b288 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Sep 2023 18:05:35 +0200 Subject: [PATCH 07/34] chore(deps): bump github.com/invopop/jsonschema in /backend Bumps [github.com/invopop/jsonschema](https://github.com/invopop/jsonschema) from 0.8.0 to 0.9.0. - [Commits](https://github.com/invopop/jsonschema/compare/v0.8.0...v0.9.0) --- updated-dependencies: - dependency-name: github.com/invopop/jsonschema dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: lfleischmann <67686424+lfleischmann@users.noreply.github.com> --- backend/go.mod | 7 +++++-- backend/go.sum | 16 +++++++++++----- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/backend/go.mod b/backend/go.mod index 974f6e95a..f38bcc8f2 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -16,7 +16,7 @@ require ( github.com/gofrs/uuid v4.4.0+incompatible github.com/gomodule/redigo v1.8.9 github.com/h2non/gock v1.2.0 - github.com/invopop/jsonschema v0.8.0 + github.com/invopop/jsonschema v0.9.0 github.com/jackc/pgconn v1.14.1 github.com/kelseyhightower/envconfig v1.4.0 github.com/knadh/koanf v1.5.0 @@ -51,7 +51,9 @@ require ( github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect github.com/andybalholm/brotli v1.0.5 // indirect github.com/aymerick/douceur v0.2.0 // indirect + github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect + github.com/buger/jsonparser v1.1.1 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/containerd/continuity v0.3.0 // indirect @@ -87,7 +89,6 @@ require ( github.com/google/uuid v1.3.0 // indirect github.com/gorilla/css v1.0.0 // indirect github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 // indirect - github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 // indirect github.com/imdario/mergo v0.3.13 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect @@ -111,6 +112,7 @@ require ( github.com/lestrrat-go/iter v1.0.2 // indirect github.com/lestrrat-go/option v1.0.1 // indirect github.com/luna-duclos/instrumentedsql v1.1.3 // indirect + github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/mattn/go-sqlite3 v2.0.3+incompatible // indirect @@ -143,6 +145,7 @@ require ( github.com/spf13/pflag v1.0.5 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.2.2 // indirect + github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect diff --git a/backend/go.sum b/backend/go.sum index 8950f248a..a69258455 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -39,6 +39,8 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.7.2/go.mod h1:8EzeIqfWt2wWT4rJVu3f21 github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= +github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -46,6 +48,8 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/brianvoe/gofakeit/v6 v6.23.2 h1:lVde18uhad5wII/f5RMVFLtdQNE0HaGFuBUXmYKk8i8= github.com/brianvoe/gofakeit/v6 v6.23.2/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8= +github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -274,15 +278,13 @@ github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKe github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/hjson/hjson-go/v4 v4.0.0 h1:wlm6IYYqHjOdXH1gHev4VoXCaW20HdQAGCxdOEEg2cs= github.com/hjson/hjson-go/v4 v4.0.0/go.mod h1:KaYt3bTw3zhBjYqnXkYywcYctk0A2nxeEFTse3rH13E= -github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 h1:i462o439ZjprVSFSZLZxcsoAe592sZB1rci2Z8j4wdk= -github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/invopop/jsonschema v0.8.0 h1:9Vblm5uNqURXUSaX0QUYcI/Hcu5rrvOz5MbpWgw0VkM= -github.com/invopop/jsonschema v0.8.0/go.mod h1:O9uiLokuu0+MGFlyiaqtWxwqJm41/+8Nj0lD7A36YH0= +github.com/invopop/jsonschema v0.9.0 h1:m1Fe5PN4X9V7P1TCF+pA8Xly3Vj3pY905klC++8oOpM= +github.com/invopop/jsonschema v0.9.0/go.mod h1:uMhbTEOXoPcOKzdYRfk914W6UTGA/cVcgEQxXh1MJ7g= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= @@ -344,6 +346,7 @@ github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqx github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -408,6 +411,8 @@ github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/luna-duclos/instrumentedsql v1.1.3 h1:t7mvC0z1jUt5A0UQ6I/0H31ryymuQRnJcWCiqV3lSAA= github.com/luna-duclos/instrumentedsql v1.1.3/go.mod h1:9J1njvFds+zN7y85EDhN9XNQLANWwZt2ULeIC8yMNYs= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= @@ -589,7 +594,6 @@ github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -610,6 +614,8 @@ github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQ github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc= +github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= From 1ec313770d6c10ffcffec53f4565f5230d721580 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Sep 2023 10:11:25 +0200 Subject: [PATCH 08/34] chore(deps): bump github.com/rs/zerolog in /backend Bumps [github.com/rs/zerolog](https://github.com/rs/zerolog) from 1.30.0 to 1.31.0. - [Release notes](https://github.com/rs/zerolog/releases) - [Commits](https://github.com/rs/zerolog/compare/v1.30.0...v1.31.0) --- updated-dependencies: - dependency-name: github.com/rs/zerolog dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- backend/go.mod | 2 +- backend/go.sum | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/backend/go.mod b/backend/go.mod index f38bcc8f2..2b9503a0a 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -29,7 +29,7 @@ require ( github.com/nicksnyder/go-i18n/v2 v2.2.1 github.com/ory/dockertest/v3 v3.10.0 github.com/pkg/errors v0.9.1 - github.com/rs/zerolog v1.30.0 + github.com/rs/zerolog v1.31.0 github.com/sethvargo/go-limiter v0.7.2 github.com/sethvargo/go-redisstore v0.3.0 github.com/spf13/cobra v1.7.0 diff --git a/backend/go.sum b/backend/go.sum index a69258455..6b79026fa 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -419,7 +419,6 @@ github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -546,8 +545,8 @@ github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= -github.com/rs/zerolog v1.30.0 h1:SymVODrcRsaRaSInD9yQtKbtWqwsfoPcRff/oRXLj4c= -github.com/rs/zerolog v1.30.0/go.mod h1:/tk+P47gFdPXq4QYjvCmT5/Gsug2nagsFWBWhAiSi1w= +github.com/rs/zerolog v1.31.0 h1:FcTR3NnLWW+NnTwwhFWiJSZr4ECLpqCm6QsEnyvbV4A= +github.com/rs/zerolog v1.31.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= From 84e8f19e68e19d655d5a1435a62f68471c6de3e6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Sep 2023 19:23:40 +0000 Subject: [PATCH 09/34] chore(deps): bump github.com/lestrrat-go/jwx/v2 in /backend Bumps [github.com/lestrrat-go/jwx/v2](https://github.com/lestrrat-go/jwx) from 2.0.12 to 2.0.13. - [Release notes](https://github.com/lestrrat-go/jwx/releases) - [Changelog](https://github.com/lestrrat-go/jwx/blob/develop/v2/Changes) - [Commits](https://github.com/lestrrat-go/jwx/compare/v2.0.12...v2.0.13) --- updated-dependencies: - dependency-name: github.com/lestrrat-go/jwx/v2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- backend/go.mod | 4 ++-- backend/go.sum | 13 +++++-------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/backend/go.mod b/backend/go.mod index 2b9503a0a..efe37318c 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -23,7 +23,7 @@ require ( github.com/labstack/echo-contrib v0.15.0 github.com/labstack/echo-jwt/v4 v4.2.0 github.com/labstack/echo/v4 v4.11.1 - github.com/lestrrat-go/jwx/v2 v2.0.12 + github.com/lestrrat-go/jwx/v2 v2.0.13 github.com/lib/pq v1.10.9 github.com/mocktools/go-smtp-mock/v2 v2.1.0 github.com/nicksnyder/go-i18n/v2 v2.2.1 @@ -106,7 +106,7 @@ require ( github.com/kr/text v0.2.0 // indirect github.com/labstack/gommon v0.4.0 // indirect github.com/leodido/go-urn v1.2.4 // indirect - github.com/lestrrat-go/blackmagic v1.0.1 // indirect + github.com/lestrrat-go/blackmagic v1.0.2 // indirect github.com/lestrrat-go/httpcc v1.0.1 // indirect github.com/lestrrat-go/httprc v1.0.4 // indirect github.com/lestrrat-go/iter v1.0.2 // indirect diff --git a/backend/go.sum b/backend/go.sum index 6b79026fa..4b098402d 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -389,16 +389,16 @@ github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8 github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= -github.com/lestrrat-go/blackmagic v1.0.1 h1:lS5Zts+5HIC/8og6cGHb0uCcNCa3OUt1ygh3Qz2Fe80= -github.com/lestrrat-go/blackmagic v1.0.1/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU= +github.com/lestrrat-go/blackmagic v1.0.2 h1:Cg2gVSc9h7sz9NOByczrbUvLopQmXrfFx//N+AkAr5k= +github.com/lestrrat-go/blackmagic v1.0.2/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU= github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE= github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= github.com/lestrrat-go/httprc v1.0.4 h1:bAZymwoZQb+Oq8MEbyipag7iSq6YIga8Wj6GOiJGdI8= github.com/lestrrat-go/httprc v1.0.4/go.mod h1:mwwz3JMTPBjHUkkDv/IGJ39aALInZLrhBp0X7KGUZlo= github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI= github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4= -github.com/lestrrat-go/jwx/v2 v2.0.12 h1:3d589+5w/b9b7S3DneICPW16AqTyYXB7VRjgluSDWeA= -github.com/lestrrat-go/jwx/v2 v2.0.12/go.mod h1:Mq4KN1mM7bp+5z/W5HS8aCNs5RKZ911G/0y2qUjAQuQ= +github.com/lestrrat-go/jwx/v2 v2.0.13 h1:XdxzJbudGaHEoNmyJACAT8aFCB+DmviiaiMoZwuJoUo= +github.com/lestrrat-go/jwx/v2 v2.0.13/go.mod h1:UzXMzcV99p9/xe1JsIb336NJDGXLsleR+Qj3ucEDtfI= github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU= github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= @@ -670,7 +670,6 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -787,7 +786,6 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= @@ -796,7 +794,7 @@ golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuX golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= @@ -808,7 +806,6 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From b923b3dc925b6aea85c954184b9b4e76c8e77cb8 Mon Sep 17 00:00:00 2001 From: Felix Magedanz Date: Wed, 27 Sep 2023 11:12:28 +0200 Subject: [PATCH 10/34] docs: updated roadmap, minor text edits --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 7cbe3dee8..8acac591e 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,9 @@ [![npm (scoped)](https://img.shields.io/npm/v/@teamhanko/hanko-frontend-sdk?label=hanko-frontend-sdk)](https://www.npmjs.com/package/@teamhanko/hanko-frontend-sdk) # About Hanko -Hanko is an open-source authentication and user management solution with a focus on moving the login beyond passwords, while being 100% deployable today. +Hanko is an open source authentication and user management solution with a focus on moving the login beyond passwords, while being 100% deployable today. -- Built around [passkeys](https://www.passkeys.io) as introduced by Apple, Google, and Microsoft +- Built for [passkeys](https://www.passkeys.io) as introduced by Apple, Google, and Microsoft - Fast integration with Hanko Elements web components (login box and user profile) - API-first, small footprint, cloud-native @@ -31,7 +31,7 @@ With most devices and browsers now shipping with passkey support and convenient # Architecture The main building blocks of the Hanko project are -- [backend](/backend/README.md) - An authentication API for passkeys, passcodes, and (optional) passwords, as well as user management and JWT issuing +- [backend](/backend/README.md) - An authentication API for passkeys, passcodes, and (optional) passwords, OAuth SSO, as well as user management and JWT issuing - [hanko-elements](/frontend/elements/README.md) - Web components made for Hanko backend that provide onboarding and login functionality and are customizable with CSS - [hanko-frontend-sdk](/frontend/frontend-sdk/README.md) - A client package for using the Hanko API @@ -78,6 +78,7 @@ We are currently in **Beta** and may introduce breaking changes. Watch our relea |✅| i18n & custom translations | |✅| User import | |✅| Disable sign-ups | +|⚙️| Enterprise SSO (OIDC/SAML) | |⚙️| API-supported auth flows | |⚙️| Mobile SDKs | |⚙️| Basic email templating & i8n | @@ -86,7 +87,6 @@ We are currently in **Beta** and may introduce breaking changes. Watch our relea | | Refresh tokens / sessions | | | Sign in with Microsoft | | | OIDC support | -| | Enterprise SSO (OIDC/SAML) | Additional features that have been requested or that we would like to build but are currently not on the roadmap: - Priviledged sessions & step-up authentication @@ -97,8 +97,8 @@ Additional features that have been requested or that we would like to build but ## Questions, bugs, ideas If you have any questions or issues, please check this project's [Q&A section in discussions](https://github.com/teamhanko/hanko/discussions/categories/q-a) and the [open issues](https://github.com/teamhanko/hanko/issues). Feel free to comment on existing issues or create a new issue if you encounter any bugs or have a feature request. For yet unanswered questions, feedback, or new ideas, please open a new discussion. -## Discord community & Twitter -We invite you to join our growing [Discord community](https://www.hanko.io/community) if you want to get the latest updates on passkeys, WebAuthn, and this project, or if you just want to chat with us. You can also [follow us on Twitter](https://twitter.com/hanko_io). +## Discord community & X +We invite you to join our growing [Discord community](https://www.hanko.io/community) if you want to get the latest updates on passkeys, WebAuthn, and this project, or if you just want to chat with us. You can also [follow us on Twitter](https://x.com/hanko_io). # Licenses [hanko-elements](frontend/elements) and [hanko-frontend-sdk](frontend/frontend-sdk) are licensed under the [MIT License](frontend/elements/LICENSE). Everything else in this repository, including [hanko backend](backend), is licensed under the [AGPL-3.0](/LICENSE). From c54c970ea0a403dafe7ba245b6f7b6c3718b3c8c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 27 Sep 2023 18:39:47 +0200 Subject: [PATCH 11/34] chore(deps): bump github.com/invopop/jsonschema in /backend Bumps [github.com/invopop/jsonschema](https://github.com/invopop/jsonschema) from 0.9.0 to 0.10.0. - [Commits](https://github.com/invopop/jsonschema/compare/v0.9.0...v0.10.0) --- updated-dependencies: - dependency-name: github.com/invopop/jsonschema dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: lfleischmann <67686424+lfleischmann@users.noreply.github.com> --- backend/go.mod | 2 +- backend/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/go.mod b/backend/go.mod index efe37318c..af88fe2bf 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -16,7 +16,7 @@ require ( github.com/gofrs/uuid v4.4.0+incompatible github.com/gomodule/redigo v1.8.9 github.com/h2non/gock v1.2.0 - github.com/invopop/jsonschema v0.9.0 + github.com/invopop/jsonschema v0.10.0 github.com/jackc/pgconn v1.14.1 github.com/kelseyhightower/envconfig v1.4.0 github.com/knadh/koanf v1.5.0 diff --git a/backend/go.sum b/backend/go.sum index 4b098402d..b3ae3a017 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -283,8 +283,8 @@ github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/invopop/jsonschema v0.9.0 h1:m1Fe5PN4X9V7P1TCF+pA8Xly3Vj3pY905klC++8oOpM= -github.com/invopop/jsonschema v0.9.0/go.mod h1:uMhbTEOXoPcOKzdYRfk914W6UTGA/cVcgEQxXh1MJ7g= +github.com/invopop/jsonschema v0.10.0 h1:c1ktzNLBun3LyQQhyty5WE3lulbOdIIyOVlkmDLehcE= +github.com/invopop/jsonschema v0.10.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= From 60d6f2488d08e234de12a1bdbb1b3b42a8aaa990 Mon Sep 17 00:00:00 2001 From: lfleischmann <67686424+lfleischmann@users.noreply.github.com> Date: Thu, 28 Sep 2023 15:51:51 +0200 Subject: [PATCH 12/34] fix: create volume dynamically in x domain kind cluster --- .../k8s/base/postgres/persistent-volume.yaml | 20 +++---------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/deploy/k8s/base/postgres/persistent-volume.yaml b/deploy/k8s/base/postgres/persistent-volume.yaml index 9032e351c..73c0d759f 100644 --- a/deploy/k8s/base/postgres/persistent-volume.yaml +++ b/deploy/k8s/base/postgres/persistent-volume.yaml @@ -1,19 +1,5 @@ ---- -kind: PersistentVolume -apiVersion: v1 -metadata: - name: postgres-pv - namespace: hanko - labels: - type: local -spec: - storageClassName: standard - capacity: - storage: 100M - accessModes: - - ReadWriteOnce - hostPath: - path: "/mnt/data" +# Persistence Volume definition removed because it somehow made problems with the postgres container. +# Volume now gets created dynamically (based on the claim). --- apiVersion: v1 kind: PersistentVolumeClaim @@ -28,4 +14,4 @@ spec: - ReadWriteOnce resources: requests: - storage: 100M \ No newline at end of file + storage: 100M From 85eb057bf32cc4757fa979d93c241097d604e815 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Oct 2023 14:02:26 +0200 Subject: [PATCH 13/34] chore(deps): bump github.com/go-playground/validator/v10 in /backend Bumps [github.com/go-playground/validator/v10](https://github.com/go-playground/validator) from 10.15.4 to 10.15.5. - [Release notes](https://github.com/go-playground/validator/releases) - [Commits](https://github.com/go-playground/validator/compare/v10.15.4...v10.15.5) --- updated-dependencies: - dependency-name: github.com/go-playground/validator/v10 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- backend/go.mod | 2 +- backend/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/go.mod b/backend/go.mod index af88fe2bf..f5ed79a8a 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -5,7 +5,7 @@ go 1.20 require ( github.com/brianvoe/gofakeit/v6 v6.23.2 github.com/fatih/structs v1.1.0 - github.com/go-playground/validator/v10 v10.15.4 + github.com/go-playground/validator/v10 v10.15.5 github.com/go-sql-driver/mysql v1.7.1 github.com/go-testfixtures/testfixtures/v3 v3.9.0 github.com/go-webauthn/webauthn v0.8.6 diff --git a/backend/go.sum b/backend/go.sum index b3ae3a017..1858ddb68 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -130,8 +130,8 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.15.4 h1:zMXza4EpOdooxPel5xDqXEdXG5r+WggpvnAKMsalBjs= -github.com/go-playground/validator/v10 v10.15.4/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-playground/validator/v10 v10.15.5 h1:LEBecTWb/1j5TNY1YYG2RcOUN3R7NLylN+x8TTueE24= +github.com/go-playground/validator/v10 v10.15.5/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= From 1e3912d2f43984443b6c8fb908d33bbd2960ba3a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Oct 2023 14:05:14 +0200 Subject: [PATCH 14/34] chore(deps): bump github.com/invopop/jsonschema in /backend Bumps [github.com/invopop/jsonschema](https://github.com/invopop/jsonschema) from 0.10.0 to 0.11.0. - [Commits](https://github.com/invopop/jsonschema/compare/v0.10.0...v0.11.0) --- updated-dependencies: - dependency-name: github.com/invopop/jsonschema dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- backend/go.mod | 2 +- backend/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/go.mod b/backend/go.mod index f5ed79a8a..8b242e4b2 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -16,7 +16,7 @@ require ( github.com/gofrs/uuid v4.4.0+incompatible github.com/gomodule/redigo v1.8.9 github.com/h2non/gock v1.2.0 - github.com/invopop/jsonschema v0.10.0 + github.com/invopop/jsonschema v0.11.0 github.com/jackc/pgconn v1.14.1 github.com/kelseyhightower/envconfig v1.4.0 github.com/knadh/koanf v1.5.0 diff --git a/backend/go.sum b/backend/go.sum index 1858ddb68..11c1d32d3 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -283,8 +283,8 @@ github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/invopop/jsonschema v0.10.0 h1:c1ktzNLBun3LyQQhyty5WE3lulbOdIIyOVlkmDLehcE= -github.com/invopop/jsonschema v0.10.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= +github.com/invopop/jsonschema v0.11.0 h1:tdAVvos5ttrsYLyEuVymkVVK31EFpwnTu5hWiyYLGWA= +github.com/invopop/jsonschema v0.11.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= From 24989b21adc33a0b1df77c29e5c3130f1d228ff2 Mon Sep 17 00:00:00 2001 From: Ikko Eltociear Ashimine Date: Wed, 4 Oct 2023 21:47:20 +0900 Subject: [PATCH 15/34] docs: fix typo in README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8acac591e..8284dac7f 100644 --- a/README.md +++ b/README.md @@ -89,7 +89,7 @@ We are currently in **Beta** and may introduce breaking changes. Watch our relea | | OIDC support | Additional features that have been requested or that we would like to build but are currently not on the roadmap: -- Priviledged sessions & step-up authentication +- Privileged sessions & step-up authentication - Bot protection / Captcha - SMS passcode delivery From 994c1ddcf49d8013e16b49597ebfe26afd5dc711 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Oct 2023 15:35:46 +0200 Subject: [PATCH 16/34] chore(deps): bump postcss from 8.4.19 to 8.4.31 in /docs Bumps [postcss](https://github.com/postcss/postcss) from 8.4.19 to 8.4.31. - [Release notes](https://github.com/postcss/postcss/releases) - [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/postcss/postcss/compare/8.4.19...8.4.31) --- updated-dependencies: - dependency-name: postcss dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/package-lock.json | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index dbcba69f0..c774fbfdd 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -8310,9 +8310,15 @@ } }, "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -9096,9 +9102,9 @@ } }, "node_modules/postcss": { - "version": "8.4.19", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", - "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -9107,10 +9113,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, From 3eaa7bc2104deef46c868a4fe4a4b32bc8b4f4b1 Mon Sep 17 00:00:00 2001 From: Vishal Khoje <36984676+vishalkhoje@users.noreply.github.com> Date: Wed, 4 Oct 2023 21:20:45 +0530 Subject: [PATCH 17/34] fix: change passkey wording Update i18n property 'Save a passkey' to 'Create a passkey' and 'Add passkey' to 'Create a passkey' in three locations: headline, button, and link, across multiple languages. --- e2e/pages/RegisterAuthenticator.ts | 4 ++-- e2e/tests/passwordless.spec.ts | 2 +- .../src/components/accordion/AddPasskeyDropdown.tsx | 2 +- frontend/elements/src/i18n/de.ts | 6 +++--- frontend/elements/src/i18n/en.ts | 6 +++--- frontend/elements/src/i18n/fr.ts | 6 +++--- frontend/elements/src/i18n/translations.ts | 2 +- frontend/elements/src/i18n/zh.ts | 6 +++--- 8 files changed, 17 insertions(+), 17 deletions(-) diff --git a/e2e/pages/RegisterAuthenticator.ts b/e2e/pages/RegisterAuthenticator.ts index 0a297060a..0b2de8225 100644 --- a/e2e/pages/RegisterAuthenticator.ts +++ b/e2e/pages/RegisterAuthenticator.ts @@ -11,12 +11,12 @@ export class RegisterAuthenticator extends BasePage { constructor(page: Page) { super(page); this.setUpPasskeyButton = page.locator("button[type=submit]", { - hasText: "Save a passkey", + hasText: "Create a passkey", }); this.skipLink = page.locator("button", { hasText: "Skip", }); - this.headline = page.locator("h1", { hasText: "Save a passkey" }); + this.headline = page.locator("h1", { hasText: "Create a passkey" }); } async registerPasskey() { diff --git a/e2e/tests/passwordless.spec.ts b/e2e/tests/passwordless.spec.ts index 162c4b2d5..66e615aeb 100644 --- a/e2e/tests/passwordless.spec.ts +++ b/e2e/tests/passwordless.spec.ts @@ -20,7 +20,7 @@ test.describe("@nopw", () => { }, }); - test(`Register, add passkey, logout, login with passkey with authenticator transport ${transport}`, async ({ + test(`Register, Create a passkey, logout, login with passkey with authenticator transport ${transport}`, async ({ loginEmailPage, registerConfirmPage, loginPasscodePage, diff --git a/frontend/elements/src/components/accordion/AddPasskeyDropdown.tsx b/frontend/elements/src/components/accordion/AddPasskeyDropdown.tsx index d302864f3..63b8530e7 100644 --- a/frontend/elements/src/components/accordion/AddPasskeyDropdown.tsx +++ b/frontend/elements/src/components/accordion/AddPasskeyDropdown.tsx @@ -62,7 +62,7 @@ const AddPasskeyDropdown = ({ return ( diff --git a/frontend/elements/src/i18n/de.ts b/frontend/elements/src/i18n/de.ts index a6675ff5b..ff3df55ef 100644 --- a/frontend/elements/src/i18n/de.ts +++ b/frontend/elements/src/i18n/de.ts @@ -8,7 +8,7 @@ export const de: Translation = { loginFinished: "Login erfolgreich", loginPasscode: "Passcode eingeben", loginPassword: "Passwort eingeben", - registerAuthenticator: "Passkey einrichten", + registerAuthenticator: "Erstellen Sie einen passkey", registerConfirm: "Konto erstellen?", registerPassword: "Neues Passwort eingeben", profileEmails: "E-Mails", @@ -76,7 +76,7 @@ export const de: Translation = { forgotYourPassword: "Passwort vergessen?", back: "Zurück", signInPasskey: "Anmelden mit Passkey", - registerAuthenticator: "Passkey einrichten", + registerAuthenticator: "Erstellen Sie einen passkey", signIn: "Anmelden", signUp: "Registrieren", sendNewPasscode: "Neuen Code senden", @@ -93,7 +93,7 @@ export const de: Translation = { newPasskeyName: "Neuer Passkey Name", addEmail: "E-Mail-Adresse hinzufügen", changePassword: "Password ändern", - addPasskey: "Passkey hinzufügen", + createPasskey: "Erstellen Sie einen passkey", webauthnUnsupported: "Passkeys werden von ihrem Browser nicht unterrstützt", signInWith: "Anmelden mit {provider}", deleteAccount: "Ja, dieses Konto löschen.", diff --git a/frontend/elements/src/i18n/en.ts b/frontend/elements/src/i18n/en.ts index bbc1d8762..2a0822230 100644 --- a/frontend/elements/src/i18n/en.ts +++ b/frontend/elements/src/i18n/en.ts @@ -8,7 +8,7 @@ export const en: Translation = { loginFinished: "Login successful", loginPasscode: "Enter passcode", loginPassword: "Enter password", - registerAuthenticator: "Save a passkey", + registerAuthenticator: "Create a passkey", registerConfirm: "Create account?", registerPassword: "Set new password", profileEmails: "Emails", @@ -74,7 +74,7 @@ export const en: Translation = { forgotYourPassword: "Forgot your password?", back: "Back", signInPasskey: "Sign in with a passkey", - registerAuthenticator: "Save a passkey", + registerAuthenticator: "Create a passkey", signIn: "Sign in", signUp: "Sign up", sendNewPasscode: "Send new code", @@ -91,7 +91,7 @@ export const en: Translation = { newPasskeyName: "New passkey name", addEmail: "Add email", changePassword: "Change password", - addPasskey: "Add passkey", + createPasskey: "Create a passkey", webauthnUnsupported: "Passkeys are not supported by your browser", signInWith: "Sign in with {provider}", deleteAccount: "Yes, delete this account.", diff --git a/frontend/elements/src/i18n/fr.ts b/frontend/elements/src/i18n/fr.ts index ad15bd99c..4d14a75e5 100644 --- a/frontend/elements/src/i18n/fr.ts +++ b/frontend/elements/src/i18n/fr.ts @@ -8,7 +8,7 @@ export const fr: Translation = { loginFinished: "Connexion réussie", loginPasscode: "Entrez le code d'accès", loginPassword: "Entrez le mot de passe", - registerAuthenticator: "Enregistrer une clé d'identification", + registerAuthenticator: "Créer une clé d'identification", registerConfirm: "Créer un compte ?", registerPassword: "Définir un nouveau mot de passe", profileEmails: "Adresses e-mail", @@ -76,7 +76,7 @@ export const fr: Translation = { forgotYourPassword: "Mot de passe oublié ?", back: "Retour", signInPasskey: "Se connecter avec une clé d'identification", - registerAuthenticator: "Enregistrer une clé d'identification", + registerAuthenticator: "Créer une clé d'identification", signIn: "Se connecter", signUp: "S'inscrire", sendNewPasscode: "Envoyer un nouveau code", @@ -93,7 +93,7 @@ export const fr: Translation = { newPasskeyName: "Nouveau nom de clé d'identification", addEmail: "Ajouter une adresse e-mail", changePassword: "Changer le mot de passe", - addPasskey: "Ajouter une clé d'identification", + createPasskey: "Créer une clé d'identification", webauthnUnsupported: "Les clés d'identification ne sont pas prises en charge par votre navigateur", signInWith: "Se connecter avec {provider}", diff --git a/frontend/elements/src/i18n/translations.ts b/frontend/elements/src/i18n/translations.ts index 5e8b74d22..ffe124038 100644 --- a/frontend/elements/src/i18n/translations.ts +++ b/frontend/elements/src/i18n/translations.ts @@ -82,7 +82,7 @@ export interface Translation { newPasskeyName: string; addEmail: string; changePassword: string; - addPasskey: string; + createPasskey: string; webauthnUnsupported: string; signInWith: string; deleteAccount: string; diff --git a/frontend/elements/src/i18n/zh.ts b/frontend/elements/src/i18n/zh.ts index ae0e8a99e..75c0b2425 100644 --- a/frontend/elements/src/i18n/zh.ts +++ b/frontend/elements/src/i18n/zh.ts @@ -8,7 +8,7 @@ export const zh: Translation = { loginFinished: "登录成功", loginPasscode: "输入验证码", loginPassword: "输入密码", - registerAuthenticator: "保存一把密钥", + registerAuthenticator: "创建密钥", registerConfirm: "创建账号?", registerPassword: "设置新密码", profileEmails: "电子邮件", @@ -68,7 +68,7 @@ export const zh: Translation = { forgotYourPassword: "忘记密码了吗?", back: "返回", signInPasskey: "使用密钥登录", - registerAuthenticator: "设置新密钥", + registerAuthenticator: "创建密钥", signIn: "登录", signUp: "注册", sendNewPasscode: "发送新代码", @@ -85,7 +85,7 @@ export const zh: Translation = { newPasskeyName: "新密钥名称", addEmail: "添加电子邮件", changePassword: "更改密码", - addPasskey: "添加密钥", + createPasskey: "创建密钥", webauthnUnsupported: "您的浏览器不支持密钥", signInWith: "通过 {provider} 登录", deleteAccount: "是的,删除此帐户。", From c1d1a18eed0f7edd2cae3e7e99be5e5568dce150 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Oct 2023 13:54:20 +0200 Subject: [PATCH 18/34] chore(deps): bump github.com/invopop/jsonschema in /backend Bumps [github.com/invopop/jsonschema](https://github.com/invopop/jsonschema) from 0.11.0 to 0.12.0. - [Commits](https://github.com/invopop/jsonschema/compare/v0.11.0...v0.12.0) --- updated-dependencies: - dependency-name: github.com/invopop/jsonschema dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- backend/go.mod | 2 +- backend/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/go.mod b/backend/go.mod index 8b242e4b2..6338e8389 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -16,7 +16,7 @@ require ( github.com/gofrs/uuid v4.4.0+incompatible github.com/gomodule/redigo v1.8.9 github.com/h2non/gock v1.2.0 - github.com/invopop/jsonschema v0.11.0 + github.com/invopop/jsonschema v0.12.0 github.com/jackc/pgconn v1.14.1 github.com/kelseyhightower/envconfig v1.4.0 github.com/knadh/koanf v1.5.0 diff --git a/backend/go.sum b/backend/go.sum index 11c1d32d3..29d9613c7 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -283,8 +283,8 @@ github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/invopop/jsonschema v0.11.0 h1:tdAVvos5ttrsYLyEuVymkVVK31EFpwnTu5hWiyYLGWA= -github.com/invopop/jsonschema v0.11.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= +github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10CvzRI= +github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= From 9225d9475590afafb178fa896640ec03668d7c2e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Oct 2023 09:00:41 +0200 Subject: [PATCH 19/34] chore(deps): bump golang.org/x/crypto from 0.13.0 to 0.14.0 in /backend Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.13.0 to 0.14.0. - [Commits](https://github.com/golang/crypto/compare/v0.13.0...v0.14.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- backend/go.mod | 4 ++-- backend/go.sum | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/backend/go.mod b/backend/go.mod index 6338e8389..72f2a0f29 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -34,7 +34,7 @@ require ( github.com/sethvargo/go-redisstore v0.3.0 github.com/spf13/cobra v1.7.0 github.com/stretchr/testify v1.8.4 - golang.org/x/crypto v0.13.0 + golang.org/x/crypto v0.14.0 golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 golang.org/x/oauth2 v0.12.0 golang.org/x/text v0.13.0 @@ -155,7 +155,7 @@ require ( golang.org/x/mod v0.11.0 // indirect golang.org/x/net v0.15.0 // indirect golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.12.0 // indirect + golang.org/x/sys v0.13.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.7.0 // indirect google.golang.org/appengine v1.6.7 // indirect diff --git a/backend/go.sum b/backend/go.sum index 29d9613c7..153c59b5a 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -670,8 +670,9 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 h1:MGwJjxBy0HJshjDNfLsYO8xppfqWlA5ZT9OhtUUhTNw= golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= @@ -786,8 +787,9 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= From db4491565dc3f8e6dfeb171ef558e2d5740c33c6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Oct 2023 09:01:28 +0200 Subject: [PATCH 20/34] chore(deps): bump golang.org/x/oauth2 from 0.12.0 to 0.13.0 in /backend Bumps [golang.org/x/oauth2](https://github.com/golang/oauth2) from 0.12.0 to 0.13.0. - [Commits](https://github.com/golang/oauth2/compare/v0.12.0...v0.13.0) --- updated-dependencies: - dependency-name: golang.org/x/oauth2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- backend/go.mod | 4 ++-- backend/go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/go.mod b/backend/go.mod index 72f2a0f29..1adf87ffc 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -36,7 +36,7 @@ require ( github.com/stretchr/testify v1.8.4 golang.org/x/crypto v0.14.0 golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 - golang.org/x/oauth2 v0.12.0 + golang.org/x/oauth2 v0.13.0 golang.org/x/text v0.13.0 gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df gopkg.in/yaml.v3 v3.0.1 @@ -153,7 +153,7 @@ require ( go.opentelemetry.io/otel v1.15.0 // indirect go.opentelemetry.io/otel/trace v1.15.0 // indirect golang.org/x/mod v0.11.0 // indirect - golang.org/x/net v0.15.0 // indirect + golang.org/x/net v0.16.0 // indirect golang.org/x/sync v0.1.0 // indirect golang.org/x/sys v0.13.0 // indirect golang.org/x/time v0.3.0 // indirect diff --git a/backend/go.sum b/backend/go.sum index 153c59b5a..42891144a 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -716,13 +716,13 @@ golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfS golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.16.0 h1:7eBu7KsSvFDtSXUIDbh3aqlK4DPsZ1rByC8PFfBThos= +golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= -golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= +golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= +golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= From 261eae0c0bd801b7c803441630015b74d6fd57bc Mon Sep 17 00:00:00 2001 From: Amju <86785660+amjed-ali-k@users.noreply.github.com> Date: Mon, 9 Oct 2023 12:43:51 +0530 Subject: [PATCH 21/34] fix: typo in doc urls --- backend/docs/Config.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/docs/Config.md b/backend/docs/Config.md index fce964e62..c0c77a06d 100644 --- a/backend/docs/Config.md +++ b/backend/docs/Config.md @@ -491,7 +491,7 @@ third_party: ## # # The client ID (Services ID) of your Apple credentials. - # See: https://docs.hanko.io/guides/social/apple + # See: https://docs.hanko.io/guides/authentication-methods/oauth/apple # # Required if provider is enabled. # @@ -501,7 +501,7 @@ third_party: # # The generated secret of your Apple credentials. # Valid for max. 6 months. Must be regenerated before expiration. - # https://docs.hanko.io/guides/social/apple + # https://docs.hanko.io/guides/authentication-methods/oauth/apple # # Required if provider is enabled. # @@ -521,7 +521,7 @@ third_party: ## # # The client ID of your Google OAuth credentials. - # See: https://docs.hanko.io/guides/social/google + # See: https://docs.hanko.io/guides/authentication-methods/oauth/google # # Required if provider is enabled. # @@ -529,7 +529,7 @@ third_party: ## # # The secret of your Google OAuth credentials - # See: https://docs.hanko.io/guides/social/google + # See: https://docs.hanko.io/guides/authentication-methods/oauth/google # # Required if provider is enabled. # @@ -549,7 +549,7 @@ third_party: ## # # The client ID of your GitHub OAuth credentials. - # See: https://docs.hanko.io/guides/social/github + # See: https://docs.hanko.io/guides/authentication-methods/oauth/github # # Required if provider is enabled. # @@ -557,7 +557,7 @@ third_party: ## # # The secret of your GitHub OAuth credentials. - # See: https://docs.hanko.io/guides/social/github + # See: https://docs.hanko.io/guides/authentication-methods/oauth/github # # Required if provider is enabled. # From 81847cb389e45ef04db20c82101c3b0d6286f395 Mon Sep 17 00:00:00 2001 From: "Matthew H. Irby" Date: Mon, 9 Oct 2023 03:34:25 -0400 Subject: [PATCH 22/34] test: backfill unit tests for email handler create --- backend/handler/email_test.go | 148 ++++++++++++++++++++++++ backend/test/fixtures/email/emails.yaml | 10 ++ 2 files changed, 158 insertions(+) diff --git a/backend/handler/email_test.go b/backend/handler/email_test.go index bb5e7ee00..bce6ef061 100644 --- a/backend/handler/email_test.go +++ b/backend/handler/email_test.go @@ -1,6 +1,7 @@ package handler import ( + "bytes" "encoding/json" "fmt" "github.com/gofrs/uuid" @@ -84,6 +85,147 @@ func (s *emailSuite) TestEmailHandler_List() { } } +func (s *emailSuite) TestEmailHandler_Create() { + if testing.Short() { + s.T().Skip("skipping test in short mode.") + } + + auditLogRecordsKey := "email_created" + + err := s.LoadFixtures("../test/fixtures/email") + s.Require().NoError(err) + + tests := []struct { + name string + email string + userId uuid.UUID + maxNumberOfAddresses int + requiresVerification bool + expectedStatusCode int + upsertsRecords bool + expectedEmailUserId uuid.UUID + }{ + { + name: "should reject the request when the user has already reached the maximum number of email addresses", + email: "rejection1@example.com", + userId: uuid.FromStringOrNil("b5dd5267-b462-48be-b70d-bcd6f1bbe7a5"), + maxNumberOfAddresses: 0, + requiresVerification: false, + expectedStatusCode: 409, + upsertsRecords: false, + }, + { + name: "should error if email address is already in use", + email: "john.doe@example.com", + userId: uuid.FromStringOrNil("d41df4b7-c055-45e6-9faf-61aa92a4032e"), + requiresVerification: false, + maxNumberOfAddresses: 100, + expectedStatusCode: 400, + upsertsRecords: false, + expectedEmailUserId: uuid.FromStringOrNil("b5dd5267-b462-48be-b70d-bcd6f1bbe7a5"), + }, + { + name: "should assign the email address to the user if not yet assigned and does not require verification", + email: "john.doe+6@example.com", + userId: uuid.FromStringOrNil("d41df4b7-c055-45e6-9faf-61aa92a4032e"), + requiresVerification: false, + maxNumberOfAddresses: 100, + expectedStatusCode: 200, + upsertsRecords: true, + expectedEmailUserId: uuid.FromStringOrNil("d41df4b7-c055-45e6-9faf-61aa92a4032e"), + }, + { + name: "should not assign the email address to the user if not yet assigned and requires verification", + email: "john.doe+7@example.com", + userId: uuid.FromStringOrNil("d41df4b7-c055-45e6-9faf-61aa92a4032e"), + requiresVerification: true, + maxNumberOfAddresses: 100, + expectedStatusCode: 200, + upsertsRecords: false, + expectedEmailUserId: uuid.Nil, + }, + { + name: "should create email record with nil user ID if verification required", + email: "test.email.verification@example.com", + userId: uuid.FromStringOrNil("d41df4b7-c055-45e6-9faf-61aa92a4032e"), + requiresVerification: true, + maxNumberOfAddresses: 100, + expectedStatusCode: 200, + upsertsRecords: true, + expectedEmailUserId: uuid.Nil, + }, + { + name: "should create email record with user ID if verification not required", + email: "test.email.noverification@example.com", + userId: uuid.FromStringOrNil("d41df4b7-c055-45e6-9faf-61aa92a4032e"), + requiresVerification: false, + maxNumberOfAddresses: 100, + expectedStatusCode: 200, + upsertsRecords: true, + expectedEmailUserId: uuid.FromStringOrNil("d41df4b7-c055-45e6-9faf-61aa92a4032e"), + }, + } + + for _, currentTest := range tests { + s.Run(currentTest.name, func() { + cfg := test.DefaultConfig + cfg.AuditLog.Storage.Enabled = true + cfg.Emails.RequireVerification = currentTest.requiresVerification + cfg.Emails.MaxNumOfAddresses = currentTest.maxNumberOfAddresses + e := NewPublicRouter(&cfg, s.Storage, nil) + jwkManager, err := jwk.NewDefaultManager(cfg.Secrets.Keys, s.Storage.GetJwkPersister()) + s.Require().NoError(err) + sessionManager, err := session.NewManager(jwkManager, cfg) + s.Require().NoError(err) + + token, err := sessionManager.GenerateJWT(currentTest.userId) + s.Require().NoError(err) + cookie, err := sessionManager.GenerateCookie(token) + s.Require().NoError(err) + + body := dto.EmailCreateRequest{ + Address: currentTest.email, + } + bodyJson, err := json.Marshal(body) + s.Require().NoError(err) + + req := httptest.NewRequest(http.MethodPost, "/emails", bytes.NewReader(bodyJson)) + req.Header.Set("Content-Type", "application/json") + req.AddCookie(cookie) + rec := httptest.NewRecorder() + + auditLogsCountBefore := s.getAuditLogRecordsCount(auditLogRecordsKey) + + e.ServeHTTP(rec, req) + + auditLogsCountAfter := s.getAuditLogRecordsCount(auditLogRecordsKey) + + s.Equal(currentTest.expectedStatusCode, rec.Code) + + email, err := s.Storage.GetEmailPersister().FindByAddress(currentTest.email) + s.Require().NoError(err) + + if currentTest.upsertsRecords { + s.NotNil(email) + } + + if email != nil { + if currentTest.expectedEmailUserId != uuid.Nil { + s.Equal(currentTest.expectedEmailUserId, *email.UserID) + } else { + s.Nil(email.UserID) + } + } + + if rec.Code == http.StatusOK { + s.Equal(auditLogsCountBefore+1, auditLogsCountAfter) + } else { + s.Equal(auditLogsCountBefore, auditLogsCountAfter) + } + }) + } +} + func (s *emailSuite) TestEmailHandler_SetPrimaryEmail() { if testing.Short() { s.T().Skip("skipping test in short mode.") @@ -185,3 +327,9 @@ func (s *emailSuite) TestEmailHandler_Delete() { } } + +func (s *emailSuite) getAuditLogRecordsCount(code string) int { + logs, lerr := s.Storage.GetAuditLogPersister().List(0, 0, nil, nil, []string{code}, "", "", "", "") + s.Require().NoError(lerr) + return len(logs) +} diff --git a/backend/test/fixtures/email/emails.yaml b/backend/test/fixtures/email/emails.yaml index ac30172c2..ba6cdb228 100644 --- a/backend/test/fixtures/email/emails.yaml +++ b/backend/test/fixtures/email/emails.yaml @@ -34,3 +34,13 @@ verified: true created_at: 2020-12-31 23:59:59 updated_at: 2020-12-31 23:59:59 +- id: 5458fbb3-a58b-45df-ab06-937a3e1a140e + address: john.doe+6@example.com + verified: false + created_at: 2020-12-31 23:59:59 + updated_at: 2020-12-31 23:59:59 +- id: 7c4473b8-ddcc-480b-b01f-df89e99f74c9 + address: john.doe+7@example.com + verified: false + created_at: 2020-12-31 23:59:59 + updated_at: 2020-12-31 23:59:59 From 111f3868dffba99e5613f72bcbc81c27d82f4d9b Mon Sep 17 00:00:00 2001 From: Esther Lizardo <100808713+Esther-Lita@users.noreply.github.com> Date: Mon, 9 Oct 2023 09:48:15 +0100 Subject: [PATCH 23/34] docs: create nextjs tutorial --- docs/docs/guides/tutorials/nextjs.mdx | 774 ++++++++++++++++++ docs/sidebars.js | 4 +- .../img/next-tutorial/cloud-organization.png | Bin 0 -> 43867 bytes docs/static/img/next-tutorial/dashboard.png | Bin 0 -> 75373 bytes docs/static/img/next-tutorial/hanko-auth.png | Bin 0 -> 15993 bytes .../img/next-tutorial/hanko-profile.png | Bin 0 -> 30932 bytes docs/static/img/next-tutorial/new-project.png | Bin 0 -> 67489 bytes docs/static/img/next-tutorial/next-config.png | Bin 0 -> 130664 bytes 8 files changed, 775 insertions(+), 3 deletions(-) create mode 100644 docs/docs/guides/tutorials/nextjs.mdx create mode 100644 docs/static/img/next-tutorial/cloud-organization.png create mode 100644 docs/static/img/next-tutorial/dashboard.png create mode 100644 docs/static/img/next-tutorial/hanko-auth.png create mode 100644 docs/static/img/next-tutorial/hanko-profile.png create mode 100644 docs/static/img/next-tutorial/new-project.png create mode 100644 docs/static/img/next-tutorial/next-config.png diff --git a/docs/docs/guides/tutorials/nextjs.mdx b/docs/docs/guides/tutorials/nextjs.mdx new file mode 100644 index 000000000..1e3c7302e --- /dev/null +++ b/docs/docs/guides/tutorials/nextjs.mdx @@ -0,0 +1,774 @@ +--- +title: Next.js and Hanko Tutorial +sidebar_label: Next.js +keywords: [next, next.js] +--- + +# Using Hanko for a Todo app with Next.js 13 and Prisma + +In this tutorial, you’ll learn how to build a Todo app with the Next.js 13 popular “App Router” structure and understand some of the most important changes that come with it. We will build a fully functional todo app, handling the creation, updating when completed and the option to delete the todos. + +## Let’s set it up + +At Hanko, we understand that finding the right stack for the project is a big step. In this guide, we will bring Next.js as the main character of the project, we will test the Client vs Server Components. For the style, we will use Tailwind CSS. We will use Hanko for the login and registration, user management and logout. Prisma will handle the storage. + +### Initialize the Next.js app + +To create a new Next.js app, we can use the `create-next-app` or `create-next-app@latest` command-line tool followed by the name of your choice for the app. Open your terminal in Visual Studio Code and run the following command: + +```shell +npx create-next-app@latest todo-nextjs-hanko + +Then you’ll be asked some prompts on what you will use for the app. The project configuration options should look something like this: + +![Pre-config Next.js prompts](/img/next-tutorial/next-config.png) + +The above choices will create a new Next.js app with the chosen name, all the required dependencies for this project will also be installed. + +#### Understanding the project structure + +When using the version 13 of Next.js, we have the option to work with the App Router directory instead of the Pages Router, for a quick summary we could say that: + +- The new directory named “app” is replacing “pages” +- “page.tsx|page.jsx” is the new “index.tsx|index.jsx” +- “layout.tsx” is the new “\_app.tsx” +- Everything is a Server Component unless you make it a Client Component using the “use client” directive at the top of the file. +- API Routes are now Server Components or Route Handlers (... More info on how this is very important) + +Remove unnecessary files, such as logos, icons, etc. If you are going to use Tailwind CSS make sure to bring your desired configuration to the `tailwind.config.ts` file, defining your color palette, fonts, breakpoints, ect. + +ℹ️ For more information about the App Router of Next.js click [here](https://nextjs.org/docs). + +### Setting up Prisma + +Install the Prisma CLI as a development dependency in the project: + +```shell npm2yarn +$ npm install prisma --save-dev +``` + +Set up Prisma with the init command of the Prisma CLI: + +```shell +npx prisma init --datasource-provider sqlite + +This creates a new `prisma` directory with your Prisma schema file and configures SQLite as your database. Once we also create the "Todo" model, the Prisma schema file should look like this: + +``` +// This is your Prisma schema file, +// learn more about it in the docs: https://pris.ly/d/prisma-schema + +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "sqlite" + url = env("DATABASE_URL") +} + +model Todo { + + id String @id @default(uuid()) + title String + complete Boolean + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} +``` + +At this point, you have a Prisma schema but no database yet. Run the following command in your terminal to create the SQLite database and the Todo table: + +``` +npx prisma migrate dev --name init +``` + +This command did two things: + +1. It creates a new SQL migration file for this migration in the `prisma/migrations` directory. +2. It runs the SQL migration file against the database. + +Because the SQLite database file didn't exist before, the command also created it inside the `prisma` directory with the name `dev.db` as defined via the environment variable in the `.env` file. + +To prevent problems when instantiating PrismaClient, on the Prisma Docs there’s a [section](https://www.prisma.io/docs/guides/other/troubleshooting-orm/help-articles/nextjs-prisma-client-dev-practices) dedicated to the best practice to do it. Let’s try it by creating a `db.ts` file in the root of the app and add the following code inside: + +```js +import { PrismaClient } from "@prisma/client"; + +const globalForPrisma = globalThis as unknown as { + prisma: PrismaClient | undefined; +}; + +export const prisma = globalForPrisma.prisma ?? new PrismaClient(); + +if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma; +``` + +ℹ️ For more information about Prisma integration click [here](https://www.prisma.io/docs/getting-started). + +## Building the user interface + +The goal is to build a simple "todo app" with a nice login to protect the todos, for this we will only need two pages: + +- The login page where the Hanko-auth component will play its part in handling authentication. +- The todo page where all the todos will be displayed. + +### App structure + +In the App Router directory, the `page.tsx` is like the new `index.tsx`, which means that this name will play an important role when creating a new route. You can define a page by exporting a component from a `page.tsx` file. + +Now you can update the `page.tsx` file to display "Hello World" as done below. + +```js +export default function Home() { + return ( +
+

Hello World

+
+ ); +} +``` + +We will get back to it later to add a nice login with Hanko. + +### The Todo page + +We will style this page using Tailwind CSS classes to create a centered container to display the todos. We need a form with an input to create the new todos, and every todo element will have a checkbox and a delete button. Inside the `app` directory, create a new `todo` folder with a `page.tsx` file inside of it. Use the code below as the `todo/page.tsx` contents: + +```js +export default function Todo() { + return ( +
+
+

My to dos

+
+
+ + +
+
+
    +
  • + + + + + +
  • +
+
+
+ ); +} +``` + +ℹ️ For a better understanding of the Tailwind CSS classes click [here](https://tailwindcomponents.com/cheatsheet/). + +## Todos in the making + +To make our app functional, we need to be able to create a new todo, then check the todo once it’s completed and finally be able to remove a single todo from the list. + +### API Routes in Next.js 13 + +What we know as API Routes are replaced by Route Handlers and they are defined in a `route.ts|js` file inside the `app` directory. Read more about the Route Handlers in the [Next.js Docs](https://nextjs.org/docs/app/building-your-application/routing/route-handlers). + +Inside the `app` directory create an `api` folder. We will group our Route Handlers as follows: one directory `todo` with a `route.tsx` which will contain the `POST` HTTP method handler for creating a new todo, and in that same directory we will use a dynamic route to `GET` and `DELETE` todos. Should look like the following example: + +``` +api +└── todo + ├── [id] + │ └── route.ts + └── route.ts +``` + +### New Todo + +This is a good moment to start breaking it down into components, let’s first create a `components` folder at the root directory, then create a `components/todos/NewTodo.tsx` file and use the following as its contents: + +```js +"use client"; +import { useState } from "react"; +import { useRouter } from "next/navigation"; + +export const NewTodo = () => { + const [newItem, setNewItem] = useState(""); + + const router = useRouter(); + const create = async (e: React.SyntheticEvent) => { + e.preventDefault(); + await fetch(`/api/todo`, { + method: "POST", + credentials: "include", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + title: newItem, + }), + }); + + router.refresh(); + setNewItem(""); + }; + return ( +
+
+ setNewItem(e.target.value)} + placeholder="New todo" + className=" border border-slate-400 rounded-full flex-1 py-1 px-2 outline-none focus-within:border-slate-100 bg-slate-50 focus-within:bg-slate-100 placeholder:text-slate-300" + required + /> + +
+
+ ); +}; +``` + +This is a good example of where to use the "use client" directive since we are using `useState()` and subscribing to interactive events. + +This is how we call Prisma to create the todo inside the `api/todo/route.ts` Route Handler: + +```js +import { NextResponse } from "next/server"; +import { prisma } from "@/db"; + +export async function POST(req: Request) { + const { title } = await req.json(); + + await prisma.todo.create({ + data: { title, complete: false }, + }); + + return NextResponse.json({ message: "Created Todo" }, { status: 200 }); +} +``` + +By default, Next.js uses Server Components, thanks to that we can now call Prisma from the `todo/page.tsx` file to get all our todos, then we pass them to our `components/todos/TodoItem.tsx` file to be displayed. This is how the `todo/page.tsx` should look after our changes: + +```js +import { NewTodo } from "@/components/todos/NewTodo"; +import { TodoItem } from "@/components/todos/TodoItem"; +import { prisma } from "@/db"; + +export default async function Todo() { + const todos = await prisma.todo.findMany(); + + return ( +
+
+

My to dos

+ +
    + +
+
+
+ ); +} +``` + +🚨 Client Components themselves cannot be async functions ([official FAQ](https://nextjs.org/docs/messages/no-async-client-component)). Prisma will break the app if you try to call it inside a Client Component. + +### Update and Delete todo by ID + +In the next step, we need a way to handle marking a todo as completed and to handle the deletion of a todo. Accordingly, we create `update` and `delete` functions that fetch our dynamic route. This would be the `components/todos/TodoItem.tsx` file: + +```js +"use client"; +import { useRouter } from "next/navigation"; +import { Todo } from "@prisma/client"; + +export const TodoItem = ({ todos }: { todos: Todo[] }) => { + const router = useRouter(); + const update = async (todo: Todo) => { + await fetch(`/api/todo/${todo.id}`, { + method: "PATCH", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + completed: !todo.complete, + }), + }); + router.refresh(); + }; + + const deleteTodo = async (todo: Todo) => { + await fetch(`/api/todo/${todo.id}`, { + method: "DELETE", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + id: todo.id, + }), + }); + + router.refresh(); + }; + return ( + <> + {todos.map((todo) => { + return ( +
  • + + update(todo)} + className="peer cursor-pointer accent-slate-300 " + /> + + + +
  • + ); + })} + + ); +}; +``` + +Add the following code inside the `api/todo/[id]/route.tsx` Route Handler: + +```js +import { NextResponse } from "next/server"; +import { prisma } from "@/db"; + +export async function PATCH( + req: Request, + { params: { id } }: { params: { id: string } } +) { + const { completed } = await req.json(); + + await prisma.todo.update({ + where: { + id: id, + }, + data: { + complete: completed, + }, + }); + return NextResponse.json({ message: "Updated" }, { status: 200 }); +} + +export async function DELETE(req: Request) { + const { id } = await req.json(); + + await prisma.todo.delete({ + where: { + id: id, + }, + }); + return NextResponse.json({ message: "Deleted Item" }, { status: 200 }); +} +``` + +ℹ️ For more information on the Prisma Client Api click [here](https://www.prisma.io/docs/reference/api-reference/prisma-client-reference). + +## Authentication with Hanko + +Now is time to start working on the security. + +### Hanko Cloud setup + +Visit [Hanko Cloud](https://cloud.hanko.io/login) and create an account. Then create an organization to manage your Hanko project. + +![Hanko Cloud Organization](/img/next-tutorial/cloud-organization.png) + +Then create a new project and set the App URL to your development URL (example: http://localhost:3000): + +![Hanko Cloud Project](/img/next-tutorial/new-project.png) + +And that’s all! Now you can always return to your Hanko Cloud dashboard to see your API URL and other insights about your project, you can also change the app URL in the settings, so that once you want to move from "development" to "production", you can change it to a proper domain/URL. Take the time to discover all the features. + +![Hanko Cloud dashboard](/img/next-tutorial/dashboard.png) + +### Adding Hanko to the Next.js app + +Let’s bring Hanko to the game by installing the `@teamhanko/hanko-elements` package running the code below: + +```shell npm2yarn +npm install @teamhanko/hanko-elements +``` + +First, let’s update our "Home" page and rename the function to "Login". Import the register function from `@teamhanko/hanko-elements`, and call the function with the Hanko API URL as an argument to register the ``. Now include it in your JSX: + +```js +"use client"; +import { useEffect } from "react"; +import { register } from "@teamhanko/hanko-elements"; + +const hankoApi = "YOUR_HANKO_API_URL"; +export default function Login() { + useEffect(() => { + // + register(hankoApi ?? "").catch((error) => { + console.log(error); + }); + }, []); + + return ( +
    + +
    + ); +} +``` + +The code snippet above should display the Hanko authentication component: + +![Hanko Authentication component](/img/next-tutorial/hanko-auth.png) + +The `` component offers a page for managing email addresses and passkeys. Let's create a profile button component by creating a file `components/Profile.tsx` and use the following code as its content: + +```js +"use client"; +import { useEffect, useState } from "react"; +import { register } from "@teamhanko/hanko-elements"; + +const hankoApi = "YOUR_HANKO_API_URL"; + +export const Profile = () => { + const [openState, setOpenState] = useState(false); + + useEffect(() => { + register(hankoApi ?? "").catch((error) => { + console.log(error); + }); + }, []); + + const openProfile = () => { + setOpenState(!openState); + }; + + return ( + <> + + {openState && ( +
    +
    + +
    +
    + )} + + ); +}; +``` + +It should look like this: + +![Hanko Profile Component](/img/next-tutorial/hanko-profile.png) + +Now let’s use `@teamhanko/hanko-elements` to manage user logouts by creating a logout button component. Create a file `components/Logout.tsx` and use the following as its content: + +```js +"use client"; +import { useState, useEffect, useCallback } from "react"; +import { useRouter } from "next/navigation"; +import { Hanko } from "@teamhanko/hanko-elements"; + +const hankoApi = "YOUR_HANKO_API_URL"; + +export const Logout = () => { + const router = useRouter(); + const [hanko, setHanko] = useState(); + + useEffect(() => { + import("@teamhanko/hanko-elements").then(({ Hanko }) => + setHanko(new Hanko(hankoApi ?? "")) + ); + }, []); + + const logout = () => { + hanko?.user + .logout() + .then(() => { + router.push("/"); + router.refresh(); + return; + }) + .catch((error) => { + console.log(error); + }); + }; + return ( + <> + + + ); +}; +``` + +When a user logs out, a specific event is triggered that you can subscribe to, like redirecting to a specific page after logout: + +```js +const renewSession = useCallback(() => { + router.replace("/"); +}, [router]); + +useEffect( + () => + hanko?.onSessionExpired(() => { + renewSession(); + }), + + [hanko, renewSession] +); +``` + +ℹ️ For more information about all the events that you can "listen" from the Hanko client click [here](https://github.com/teamhanko/hanko/blob/main/frontend/elements/README.md#events). + +ℹ️ You can also find information on how to customize Hanko Components by clicking [here](https://github.com/teamhanko/hanko/blob/main/frontend/elements/README.md#ui-customization). + +## Verifying JWT with jose library + +Hanko issues a cookie after a successful login. The value of this cookie is a JWT and to secure our app we still need to verify the JWT. + +> **What are JWTs?** > _A JSON Web Token (JWT) is a compact and self-contained way for transmitting information between parties as a JSON object in a secure way. The purpose of a JWT is to ensure the authenticity of the data._ + +Hanko handles the authentication and signing of the JWT. On successful authentication with Hanko a cookie, which contains said JWT as its value, is set. We don’t really need to know a lot about JWTs, but it’s worth getting familiar with the parts of a JWT (header, payload and signature), and with what a [JWKS](https://auth0.com/docs/secure/tokens/json-web-tokens/json-web-key-sets) is. For more information you can visit [JWT.io](https://jwt.io/). + +To verify the JWT we need to install the `jose` package: + +```shell npm2yarn +npm install jose + +`jose` is a JavaScript module that supports JWT and provides functionality for signing and verifying tokens. + +ℹ️ For more information about `jose` click [here](https://www.npmjs.com/package/jose). + +### Middleware + +Create a new file `middleware.tsx` in the root of your project and use the following code: + +```js +import * as jose from "jose"; +import { NextRequest } from "next/server"; + +const hankoApi = "YOUR_HANKO_API_URL"; + +export default async function middleware(req: NextRequest) { + const token = req.cookies.get("hanko")?.value; + + const JWKS = jose.createRemoteJWKSet( + new URL(`${hankoApi}/.well-known/jwks.json`) + ); + + try { + const verifiedJWT = await jose.jwtVerify(token, JWKS); + console.log(verifiedJWT); + } catch { + return NextResponse.redirect(new URL("/", req.url)); + } +} +``` + +To verify the JWT we need the token and the JWKS. We get the token from the "hanko" cookie, and then we obtain the JSON Web Key Set (JWKS) calling the `createRemoteJWKSet` function from jose. Then we call `await jose.jwtVerify(token, JWKS)`. If the token can be verified, then the promise returned from the function resolves to a decoded token. If it cannot be verified, then the promise rejects and we can catch the error and handle it appropriately, e.g. by redirecting the user to the login/home page. If you console.log the const `verifiedJWT` you should see the decoded token showing the payload, the protectedHeader and the key. Inside the key, you should be able to see a "true" if it’s verified. + +ℹ️ For more information about Next.js Middleware click [here](https://nextjs.org/docs/app/building-your-application/routing/middleware#conditional-statements). + +### Securing the application and redirecting + +To prevent unauthorized users from getting access to private user data, we can add the paths to be protected in the Middleware configuration. Following the example on the Next.js Docs about the [middleware](https://nextjs.org/docs/app/building-your-application/routing/middleware#example), copy the following code to the bottom of your `middleware.tsx` file: + +```js +export const config = { + matcher: ["/todo"], +}; +``` + +Update the `Login` page to subscribe to the events of the Hanko client and redirect to the `Todo` page after a successful login: + +```js +"use client"; +import { useEffect, useState, useCallback } from "react"; +import { useRouter } from "next/navigation"; +import { register } from "@teamhanko/hanko-elements"; + +const hankoApi = "YOUR_HANKO_API_URL"; +export default function Login() { + const router = useRouter(); + const [hanko, setHanko] = useState(); + + useEffect(() => { + import("@teamhanko/hanko-elements").then(({ Hanko }) => + setHanko(new Hanko(hankoApi ?? "")) + ); + }, []); + + const redirectAfterLogin = useCallback(() => { + router.replace("/todo"); + }, [router]); + + useEffect( + () => + hanko?.onAuthFlowCompleted(() => { + redirectAfterLogin(); + }), + [hanko, redirectAfterLogin] + ); + + useEffect(() => { + // + register(hankoApi ?? "").catch((error) => { + console.log(error); + }); + }, []); + + return ( +
    +
    + +
    +
    + ); +} + +``` + +## Time to display the right Todos + +Lastly, we should only display the todos for the user that is logged in. To do so, we need to link the todos to the correct "user ID". The first step is to update the Todo model in the `prisma schema`: + +``` +model Todo { + userId String + id String @id @default(uuid()) + title String + complete Boolean + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} +``` + +Then run the following command to create a migration: + +``` +npx prisma migrate +``` + +Or the following to push the schema changes directly to the database: + +``` +npx prisma db push +``` + +The next step is to update the `api/todo/route.tsx` file to get the user ID from the token, then create a new todo if there is a user ID: + +```js +import { NextResponse } from "next/server"; +import { cookies } from "next/headers"; +import * as jose from "jose"; +import { prisma } from "@/db"; + +export async function userId() { + const token = cookies().get("hanko")?.value; + const payload = jose.decodeJwt(token ?? ""); + + return payload.sub; +} + +export async function POST(req: Request) { + const userID = await userId(); + const { title } = await req.json(); + + if (userID) { + if (typeof title !== "string" || title.length === 0) { + throw new Error("That can't be a title"); + } + await prisma.todo.create({ + data: { title, complete: false, userId: userID ?? "" }, + }); + + return NextResponse.json({ message: "Created Todo" }, { status: 200 }); + } else { + return NextResponse.json({ error: "Not Found" }, { status: 404 }); + } +} +``` + +The final step is to update the Prisma call to fetch all the todos from the `todo/page.tsx`: + +```js +import { Logout } from "@/components/Logout"; +import { Profile } from "@/components/Profile"; +import { NewTodo } from "@/components/todos/NewTodo"; +import { TodoItem } from "@/components/todos/TodoItem"; +import { prisma } from "@/db"; +import { userId } from "../api/todo/route"; + +export default async function Todo() { + const userID = await userId(); + + const todos = await prisma.todo.findMany({ + where: { + userId: { equals: userID }, + }, + }); + + return ( +
    +
    +
    + + +
    +
    +
    +

    My to dos

    + +
      + +
    +
    +
    + ); +} +``` + +That’s all, you’ve successfully created a Todo app with Next.js, Hanko, Prisma and Tailwind CSS! diff --git a/docs/sidebars.js b/docs/sidebars.js index 4dd6aa649..1abaabf3f 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -69,9 +69,7 @@ const sidebars = { { type: "category", label: "Tutorials", - items: [ - "guides/tutorials/php", - ], + items: ["guides/tutorials/php", "guides/tutorials/nextjs"], }, ], }; diff --git a/docs/static/img/next-tutorial/cloud-organization.png b/docs/static/img/next-tutorial/cloud-organization.png new file mode 100644 index 0000000000000000000000000000000000000000..5c6386099715dba5ff5ece86e4bd49f08fe68766 GIT binary patch literal 43867 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

    Uo7BNx-5Rk~Y(_Z9Ag(3x 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 literal 0 HcmV?d00001 diff --git a/docs/static/img/next-tutorial/dashboard.png b/docs/static/img/next-tutorial/dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..d5616cde618a22f4b2bbde159bde7ea2acb7ec1b GIT binary patch literal 75373 zcmeFZcT|(z(l-o9M4E^+0To06>C$^s0g>Ko=%I%mdRIWYN)wPSy@nDXbfie{z4zWB zlu*8SpL3pb&Moiy{`l7W$G6s#ERu_BU%Slgy=Q(idnUn(@>2LX6gX&TX!z3a-YTP^ zVIt7bFgowuMcsjJ&sCtI;lM23yit^X^M+c{!PeBm8ia=SE;uF*OEqfZq3_y_3N|+S zLmFz@W4d?rzR?e~(EuCNjL)ziy#JJzGal1QqKivIqe<$d_O?llp;Vn&Q^|Uq%!E*B ztkoZ1W0v4?^KSjotf1|+W8c;F`C4yx-I{zarf(bZFB9?{MzJg|si#lpe@29dnnhjs z;xVWC369_UIKg3~sd>+UL*xc1G7T^>sRs!!Zp}5^Xebc{mj$4`d(Fy7tVyRGN0UgDoA&H1`ri-w|tYGru3F~^?N z^k}hN>%~64dO^=OLXO^!hd%Yq3im}FzPC1pXRYClV7v-;cG0j#oj%WZ8_1{7Uo2)H6vz?XJtQYCjZ8s+JvY7LenFxX^ZimcMoJ%)}@MxwHF<+L7RSY2V=oyK=P z5x`)Vg^Y?%CGzs?r6m-Lo{gI(OCMQtiBoeQh#fV3>~+OLt3ykLs(oYXqZ|s4CVJqD z;bh=Xy6#8#?F0At2TsJ)d^qSaX4(U6`&U>WKjXwx2c4HZQWtwh{PXTO9!Uw2bCU?) zy`VJgh@a$DXd3f(r~QKZ0d@Ni@6O-Bdv@>jYx8?|23{W%61Ct!rT9M4F9v<2UU>KT z>!%;o$}h;Y!U|r8e0lf-BlorC=aetTzsQ##4*E??!M}Jfvm63i(^R8_H`BA$Rii&R z3>a`dObX9RJ?i%?M*{}MW{j+(mlFzq&=cQF1+L3DJ;34vJ;pWjEo-y46ViRj`ZO*q zYAJRx#12$tsr#e|Fcw%7u+?1G?A1nefG0$08}8DMwV1L0`cmjp`BK{x;7wIe=yTr( zcP^Z&(dT*pJpoK6e@Z`vPqaTCtPyxZ*7{Ny#;!ksVgObB~Ev9^dAJ!TKD z`cxHLm87X4B)3hCcz`AS;wx!K$g(&NE%rP9AFl`12hj%^2IZ95Hi)$13lw1V$f%_b z<-_+5GlsUaE2b-kfI(k%SN&R6En8dJZ5Y#%74ihacEWWca`Gfx zk~7n7Xwibd98yj(sWnM7Nly|O5{{!U@uO5WQ#n&Z5BTHw?G|PBPs}V##P}!qMUYS?zRD~>;EN4$yG=KJI zBYW5*p}^135NM)(@<7)Mj-GFxrW9r0+&)kAKJHf>vm5?2s+p>kYyUbUG{88%^sE4H z)P2-&6gV0u4UejdYKa<^%}aE09F*$mNSIA9>Y?dz?-5MUFCW+T*51&jtVk$-YPD3s zQekG$U2&3MZaBCRE3r3msV=O_9FEjgWx1I)_rm=43{J@<5p@5T@bIiT6eoGkL~1h9O(T z8_}B#Nu#P(MUZ4jA*2$&i>}2qQ!c7!E4NK$Dck1zB+p4=VH7xU$7U+XdDB_knQ2FR zdv;Q15_gAb$5yca@#T|PelEdU`*H_j!CkxBwHCXC-SWxYkqreiGP7#OB*%tOs7!hn zPn`VyD55s4uIlyob|?10Rrl$Wvcxi-h$+KL(dojOp_$Vf(G*i2IU(?A`BQ>71b$L6 zQgQTCoC8NveXMME*!(mq##C&d+kQEHx+hWu;0^ciMNYPlO6?BKAAMPC(`gpm2|dE! zXE_9)s+@)%=I?tf+ODT8>TiiYm?tiIIqyXM>=mD#u>rk)9NY5PK9;|(e=KGaZq{8X zObtv?d??K9zp)qV2`5!X@K95>?#0 zQD@RqU+;btS|DAJ`BIsqI?RT65cdiBRrssS*OYA6AJ*?T6i(i=$av8%NHe~$9mE)N z&hnBakef>s`A!(6lp@_L+bu+=7MCT{2igF!{M!7i)qw*79!;-;lX+g5+)`Gh`b0~`zP76~D-s#(eGj}?_#_Vad7FaU$vuNt|9|0R(Dgqb- z4x4*NcJp1lBX9H$y^s_^+&W{PObT{Gx)U zVo^R*0d&Qa1h#^CO|wpVI|iLbz?0yDp)TI%N{35zdA@mVmP4DRz!soeP4Z5}>>j}xR7O+1;1hZvh=j7 z>7bK{f_^mR$9HBveow}m;dzUR4GlBp-sAFKu$L8*Mt5%%~(`Ksc4&YrUtCU5&+5%aS@3k9{qi&Wt9Wt9E zTm5RzCHeN5oSIVsB7vIS;9cQ{6#JW=54Bit2;xL(gc#imE~>VJd!sh>S-cDP9Cif; zcBZ^eELw(wgqxG&8bCLQipqKN9WAXCZ~Y!eOGwGtehp2b)oD+D&bGH0uH7G4oBBfkp2ibi-ji6nXnd`qS z{!zT*qkTDX$Z|H7vCzF>7%#^92n?_r7mJEQpWOwdwxYkXK~pphKN-&O54$3GM0=(n zH0lx=!r53P@B2#v?b#R_Ox=KmWi=%k?SW+b@vg4`-^(`F8^Ou^$WNQ-zKk9^tZd7( zc0V1?g2GM?d^(URoMEnzk3PLO7z*#OUB}WZ^H4z62&5@(Dkq1=h`PRqhJpSN?GEY+ z9rZ>FvOvT9>lzJ>4)u+OcIRs#8W!sNA?i;t72{u}n26Ln|GLKL{QaP~${T5E)VGSU z0|;c}Xm0DY_R=E?1)fDLR5hJ6%u`o5jt>=21&v5@HgoVhTF9J`JyQpNR)`F&_!0^ua5?d+b%u2`-iN39Ws9CoL_Vsq{b$4IT53 zk5nyeVy^trLCrslem}mCfr)T^M(vA+aqsUR{dji*O}`-O{QrnxC-Voj*GJJpisZ=olV7`)LCvw~qDR_5sCh0})Fl$9XVr6-W?H z_xv_G#0({zKu_dZyg9`LK>Q1o#|P>Ime&Vgz5=3h4_D;y}t(Vzf<^s zVG2L-{Nx#079w6B$Ox*i8e?7PZMZ_{=)kPCnt9a!TrYl}grB0Lqg7YCdK^-EH0BXg zwv|5#M1>aa_KF~_Yxe4q4`ERMKNsk7C>qfIXhqsF<+epe8G~98;hXjjoVS&p(})?c z=_hlY2LIVEb%_%8gYl`Hr}VrZZYllDhFVUC|L1PSoHF2v?p5)KohhB0>nm{YcYc`N zLbE&HQeaYZkG3_i#$ws%8{3=o5~A;xawZE3m~($zk&8WOrtY=F2A^J)Cs8c#hU&_f3YHn`>mg z@K48H{&so3g^wS1pqkwgA{XXVCGW=<)QhSXai+{tydLt1UY{*_d$?x!o3AB%6g{zT zA%vZ;CI-30_ulmI&YdBqordIK))S>4uNGod$7;4qyS9VrllOP7cWiyOKDalrQ~6v% zf!^mUh-t?@K%zBrr?L{4t+pRAZX9{W18Co^JJr*#Oi!n&7uMw4F8R4V)^H6e+4R{; zfFtAucTD2++;hP-JFtT*eXo<4y6cOr>qmh5TlvS^6GPr7`T7$)Q`So#+y~4@y1Wh+ zTM-LERFgWkbs*kpyAOrH8dyDRhubadP?G3VRanU|gLe4n$E=#q7{X+_c79ivYoffM z;t|!hNGjX46rcJ+y*dHCLb*g9L>r~;SwZEQWaa+xkiwLG`xCNRlb?b3Wn_A;O*lBC zr{34s$UU!AnT8MPcy(A$T^l9C9uZo+!Qvh z-&~)H)*yFl3UhK^8tRvDIIhYHqPPhjEzoMpI@@zP{kki1U*yc7W*5HYnPq(Wf`OEH zUU1__)UQPu!=H42sFPn{zZ0dbX&bW-<-5rqyHNehMY4*!Cr$?$5dxjbUI;A}9-yLn zk*G1Z5dv?@M>lNQw;c79AvhA|MaJ|0#XQw3p}J{%r8ND_dQHeBu4 zqLwpnp{eR{rUrVklLUHiei6L$F5V*p-dR`U$<*YCIgh?Ao2xw^PWPwS^a|SN8wx&_E;A5~LUG|IS-xALZ1v`Eg6_)+;O76i*~M&dm%#?M z+vCtIG+hTJ*o^-5A(=|Q0#N=ZXn(#*B$1_dCq_f>0P=IH{IXs2dLSe;^lJ4Df$*?o z6DEGS9P1p(B_-+5QIz}s*hezHFB zGcqRI9#bVeH`_5Uw4^OlMQPuDBu|Z@F9)wtwzJB9$$ChR_e5<4Zqo5JIw+UvSRCs~ zw1Yk!CAVHGMpg&taJj?z>SQdD<3YpOV(7;ioX>im2d&ssn&N+IL+Z~V1`yL&% zajG6X*(u)ez1PS!(VGdE8Z}96H#fJ}!r`sitW^t#HFHz`*~p5GVz`Bh8v`) zsQ9P0>M6IiByf{IV8oIMcYh^LAJNn&{^71xgZCA)TBSw>+jL#kWbi0h@w1|zEMO-Z zKL`7LgwWxyv%0{@C>>xIo6ot7)f5ceyx=nHmfgoXeCCHUZ&BO0F_cX|JmJ_UTnA~E zyiHL&CjHgbm`rEa|CW5=5VhDQP-^1wtVxQ`b#)zT@ncU#_hi{rFO(X!;t1~59yKRk zmSUK9PRsN*54AkZ^|uf(AN(OL@-1t(6o)3TJ#omos&d*vref=OW2hbL0csYZ;!XVF zj%2d#X=r2M${F=SQwxh+Di8V7;sOx>9|^HcviWPE73T&{0W&{9e$Ml#=d6O{m+T6U z!}7Z!%?}f#00IS}gO-m!xvD?WZT0_nE=`30oHto>0EGIIxtABH$(d-=F9{1Q>Sz|8fsr$<`y~7ZHw}b&6HC`$LS7p^HskTe5IxYgmB)EQ!msG&`@Eecd@vyG5E+oVfeYOQy)q_*t@C} zc6ICwq67Y$RJ%-S4_(hZo&j1{tuap_!wkX`gEW+zFi;f>fQ~MTuX9 zb5Cx2i9GCA%`x0eJLp)C=jk^T;}%vGl|iJYL%XU?ZB9)C3B8G%)r_w^nz8AJoisgD z+T@3qDLcr&9N;kDf*Sc>e2(+0Gk5xFBk1N3xPP=gSz+bMZFs&_+#s*1pr=$boTL%u zyzHUm%Q;n=)~7Z$R7P78S15Gyhn0}ZfXTz$JVMM;6l7&d6SU0Xed+3fIwp$Z&DPbg zuvF{ZNqGC3vp9>%=W0tI90zoU#xQAQ6&z-ZUgc^l+MaBVc)!LE4<`$A%a-OImUA&? z$n|%v0Eny1)X)h^v#MmtLVru#j>Ms&?8M<0JLucDm^ntNecee z^6^hNCPEot&5bZPv~J&+Y;yiXuZX4cWB-VRab?&1DlN>#@bK7%24!|W#+COv?4Z}F zao+JCv1}mmrR25IZAPF}_DC!WrIqYNtH>W{d0n-AZ5@>8bR0a~5!>+&qcf^I??v=giU=rqy1A_EPIqUPdd7`H zS+=thZ9;yL;j-mtHs-9K>LxZ|sOPpqlF09v^~7!YOZ}!da>opX zNDL1Ry>;uB8^8A!Z%w1_Wr?X(y)=mP^a9dXo73D6ui-WAel%s82;SZ<>w`%>b!$oC zt=>hU42ww7YuCfo@7kg$k-CkVa2T1s=fH0a@LLbcHPtPri&;9vb6cq&(jk|qZq~uY zC;)I)-^E(fje;LU`eV(#f_v6P^z!95C@dv{#zdc_u=I>kMy2mfUoF4sYr5%|On=PG zXAKND^6?=eb-T52-q{>P3CS}5asL}Rpl#)>yOqpS%H0+s1uoD50CYOzQq03Mi_*v7 zNMXdcVr4x&n}&;#V*ky9If0v^nq3P0o6Y>Io#;LOI-yfq{YjYT0r?*!=Mu5b1p?k!i_@$6AG3(8(flix`PGT|M^=+R#=b?8Fgn z?ReLnsme&(6kglp8P}!ogA)VssPJu+wch-tZfFCjjjI*n4bFEoV4}Az@;AG)Xlt*Xn`AX^3 zF=GE4bTPYyRedC?jzR7<%<1`DL28bA1*2S6j^U;lqb<+4NdPCmA$&A>aObg1Oh??N z=jL^Rfu+N$ULJgs$LqrBHpt}4=WV+*7jP(0l5H?_zLv6g$CJwY%&^mUFkK?l zlX~a7V=sG;Wd6L0qBnAC?!xAK6WlwJN_3V^A^Gv_avXQPu0t%)Ax;-^XY|Em94=Zi zxn_G5pqWCEx#eOZ+kj%x6e+XjXI*Zyu@MsWnIx2PIQ5Z7T~+mrwclf>B5sc(v4pdn z<_$=;9)&1*Tz01|$vwr@08%3W?TP43M53jqh%m04YOJp)~22SsFPR+ zY9wLQ`WUFfYb?j}khPObXse*?l1@&S-KgcBs7_%U9J!tmnFkR5**@A{>Ywu_5bt1V zodIbJOBAB5wzBoo4RX9iYlPE202knL2W^=P)hdXbx7=`nJYt#NNW;j*v!4 zYB2-b=dPcoF>WapyGEJ4T@7ZvPj2%PSz}_zCPN8@T6Ajy_8M+x`xYr}$cQvPa%c#!X-}|%n-Sc_C;IS(L&MTYl!3+(mDf{hf?6_e#Y)$)% z95RAdT~Slhcql}tygas0drVVGP^Z$uEMOpAdrJxZPd#PM=x441tYRphDw`v{J{%JD zWCL^J;NV!#k3QcnQ^?YE)6%Nd8Uc5ZO&OXca$jYfiZ1L`Yg46RAF4N+#_t)iF+!{vWQ^Tt7=U4TAqXLPuV`)JlPfPcNX2p8ijdD zp`<&H%cvRRdw!*J&*n#WVdQb;ok)?9bO{MW^Af>$7{Q#vcpuK6yQjY&!z~^fhiz%d zWob+x(y3i;9;4{h_!(^7zkkt#P_Z+Q((?lMu5n&gd>tdA_)O0f&nHDgNTw^;I$8t- zFWnqy)SLz~fj2#DCv$`moFJjQw2S`bSX4f6f{^Q@Hm04TE!Hx?TzADA1-_rrO=QvX zK={P9RFd^jcCGDA)uxN{9E*ldqVtaR9M$&+ss{}*P}fER1!$#yf&t0O3O4dK1Cl}p z<=>^)NKYqaI3*?_%bu=(Mj3NeVRWvn19wdml{>r${9aT2G%?r_1j?*CZux+?e0~Gn zTk9($>53h%DHd7dV3q+7%_g?ndJXklXbHyoWp~3-Ws{p~OgowMR2+c2KhebiL~&KJ z^})qL#+g=QRoyLnJ2BbUR&~=y7E|>fL{m8Kv_El7kaItxMcOTH9axq8>A$+i1ryVA zZpHr`<5sz|K2r$V;z4v^5$zLor+@jH4k2ltk z1+`1rP4m z>{wl45tOB;8zB$NHh4N9O86L`Xp54j_DbUj{8@Bg&50mgL-v%lm6RMw6KcwL%1_0! z#5Ch^)8#zR$&trP9pYWx65W>I#9gI$NRoid$&As;%>dH2+I}b9B54GLjs{E(T1fUL~yhD}<7IZk54B;xCJkS4qWlc@UkgUAWnOs)|rK zuTzM}UIke}2Cn84=fQXp#mx5s0ZLY5X;F~%;R!0D>ps&&g7RXK6!N*~+NX1b+T(6} z_B_+!UD=K48171O(ylGJYnn`CKkzztm%I&h@W^fU>Mm;QE{-#HFP_ZsIntl;Fg&-J z9>_j77(0rbU2FeJSvKa!W0WoI|8wa2DWB7iz6g(0M_s*kDM&@ z<_rBKucPS%(dpaGsKhOT(KC-Ley4kwN$zj zog1fHUMN?CIOtJ3iESCX^2a?c!W&7v+Tg;CXLWI;h0QD5CJ5XJ7oo(y^m3lMELP0*$UP?VV0siEIpo;DSE091?_K{Okm z)@-SRYQ4C(ROVv6ZL9?#W`(&ghrpeJ#pjHjc7i)(aRPBHo-iFc@K&j`LdwYLD6T?$ z=^aoJ0*grXhod(#GkYiFbheZlm&1H1i6kqm>O=$ZnEzG=gZT54d_;MwC6dMM+xw)%J|b1gc8{#SIM)SMjwq zct>D6d33;cF6pyZSd-t`@=SlKB`u$*wlm}_XnnMFtYW^t))7rkhE+hKBwp+hjEx+| zzL6S#HI`Ia*R`u6ChNxncu~fJ61Z(Oi>8A-a*Ap8cU>OWG=SII&W7+R5QD$ z-!H4H|DIis3>4koAxkM$@xB(E%j8?gU*;y5+r@aJ9Q?iw)dIyU9V1ciPvGgAfUI-+W7sFEfjf&C<`( zQ%xpjbRymh*VPAxjR^AzF%@ypax1-au$X}*p#Vyc zHd0k#>T77*f=)$ko}lxg$mlI%FYDp2siLYAe7))P04iQqzT(na_v+LcqqwBlqMWHb zQ#0WH&RG5XLwEQRsW&ow&vMeZtR7p9OJufrul`^vx-NUdyT(GOMsdPqhFy5tgi40Y zYmaketf!=!I{(T#oh+ z=7&W97w&vkK+cyq>6_;t&6=(bk2btxr&A-mU3Tk(se)|Z+=*ClEWPFAcsK|J{kcML z1ai%@hR-l@ZGcmuA=+o;rrbkdMI0dSEMbPrDUhH0`K}F;YPSX^pK@4KoNiMelys~z zK$5(kIoo9J)c( zy47=L_my*cIQ*(In*hW4<%W?lfk3CitMvKo5Db6dbXaFoB%G~_RWlMUt$K^0C1!k& z7-l)L`L(S|krilsB(8&8?M{G-halx zL}me(d8T6{Q2lBs@}k<~Nd>ar1~xr&RZz($dQw6)WRtn2orjjZt59}>m^G5|*d4ez zD{6WJd$MA7rB*q4{UPuIy1$%WP`{Ajd{Q><-C&ai1WKXvf_|N+{?I8d1c#D#pMuFz z3KdpIX>8kN_}tTX=W0yPj=eXps5SRH*8Q2$3tR4C!Tc*3QtvghrWxb8Zx15UK+!r>CmoG~~EH^I_L&_$jjbXvgf$ zO!v>uD$mt4pNsDINiyQYOMUSEp7*sGH%g5v@jgv(jI3O`vwkS?ElO4dKtoGQJA!49 z-^aAvR1KRn#Y$mt-oy9VCkJ-UYr~xEg^1Xw%~$+iCz!t$XJSe5oNaYJJ&8j?SH6yY zFt$V%O0zi?(0zWVL9D8pmD2WEhP6}MY6K2WqU(7lqH*Y62zH#X*#W}z81t7MEr1jD zg_Grl&Qv%>YI4fT7F{!V)#7(e@*H2j%04R42ucjzE{)X}r{d=fM@CyP?vp@E(v4$j#-0_L;ue^0Sk{k?*lP-^|%Z^(aO;#6!vw3>#J(n8Im%{y4KjX2Ov z(0SW@^Q(@g=J-dK*3AEeHmKtzRD4>1z}R1Pf9ary=Z?W4TkbVJ94DLMUy1%BPNaVu zbG>qC`zbm8E#ABbVvS*_$SaInx6A)VUj1JPo*OV7UzN0Q_(5&d%A%wB1sO~#QAn+A z4gj=>Qvy;#sY~RkNkg>?YMVQ|It#6Pw3#5HG0^v(f9(E7?6>dVzdvK*KUV%kN}|=} zTv!N7R8K2prtuXkx>ul8Jvqv(zvAx&svdkX>G$t-_t%wJ6iTY#LMu1Md$lX9h$fq9 zFzzkqHEymjfmgn+R8I;`{@r&g_5rt_WQ>qWrWh>k5lTwN&BsTE+9Vf*iVx~@B%p!9- zqKuZ01bsbh5f}->l6%H=DGYyW_1w2l_$oHu=4fN3x6Y;j!<}mDO7`!O6x1mw zBfTU$nB$QOTZ-Q1^i~^d>S@{R7%?V=N@{88;CmSvxrYC4UCbDFd1aY=vs5E{!Zrh- z&X*oUg12D_s1x`Gu>kEB^OptWvmiz|LcPix8AZ<83j9U)DUbo(Cl5aR&W>4W6d7{h z>)j8hEAc#cU}9sdH0QG1nTq0`G~d^~_n#7@R_w=*A20UO6~QtBnq54sFXJQ_#^L!S zPiiV81S*RTaykJ_h1+vfTH8^3Rt4?ysL;zte%wqNHSrE{Jl!4qOc>G_GO^51O=i=8 zfPm4o56I@A{|=?&N*9|2AZP%DThnD8>MaBIcUau}(R^fA(nr(}X2(d8c7AHT`8ZGC zx>rLl0#8etza(n@P?6CuzD!dnxU6O?h2M`M6ifBSB<)3xG8(&`CP`e)+s77QGBPrH zYD_OK8c|JmZ5lBCw*sMj`Ps#fP0UHy7-n=5AGG3lq>hJaQPJp(9zc%p^cyg!r?dI}`lG*wK;!Y>~` z4j@H38FHF~hq&#}n`vRrBMDhnXc~W)YN>>nhc;n#>9H&vrYw&~d(1Y~V%0P!Qs&CX z$GWUUMnU%&5{nO!YU-W~k3ygFj|1{hezO#oyz{F5*>%GY1$JX1>h1%$>eYEdgTPCuDZ8f0rO4bP zn^=#(0ia(xezmyUByVv!-Nyq25vA{fNJ){V0cx_}<0jZyKdE|Nn}ofEC9G3;pZ{oO;@i4OBS=Way%m0-)MI|C{O+IVPC(W=_^;;$0<=y3_Fk zruDfF7yO87n>Nr*(r!w2@q>#v4*_Oh}xpqUMgXm9Fja1 zR>4y1%knc+`m%`E#|C=HO$3=4&~x@Blg}pS>GwBF`x3a8TuNy0^_*v<8*4=sPT{T7 zR+U*D`suyz`YIRCPyAM!g^^m~W23wLUfYQ(`JlUfeBSz6tR@#CeTU_$e@D91*_a%m z4lAlrl-cZG^mZ--{HZmXe7}~HjapZ=X4@>?(Oh9IQN4bv_W32>XrxsvVx3rUG`6O( zdyNzVv?Up4ns#v{+h>6IrJVSs(eQew>?H_pP%=UMqTku4Rh*sliu@w`4iz)*uFy_7 z$=)F(vkP(3740?fOB~=8$cmGQ9Pb3+cX=r?^3}uUa0;}tN!6=c!p~RVw*VkGFlOi? zm95n({JsWj0S<@hu=?12z{?L0g*#_bx)O#Td4pUO5T{C>3-YGoZSlBoN%i?Akrfy~51=1?WCD6F(FAX*I8LH2;ySQ$uH`lFoqs(k*K>bz0Lo&jgb^oMXk3kB(Zy< zJn#PrL?Bys7-xz^0}pKUvb=;h+)#o6!c*1r>uc(}a08|)D^}`9(cg|(-fdbIH0rhh zFpTx-fs8M%;-Uobe z7vMq2jhIk=>D{^`HJL1}q@f4emhdTwu~;2F^nu&YM`N#ta8%>CY%R3~CN9FUH9%G| z@ZDyX>+)<|3`C_v_+Feut`m`LwB_pv?e}RI0jxwyw2K&l0VvWKAo0Ob4Z&1e{e^{v z)n_287sn@?{px^E(Fc`?&M~h_{Umxs$7`l~XWPoU%Dxv&P7?uyWXnufQyy6za;l6C zx<-U#)CErD9*0chd7)I1ie2%<04ZD^E89$sh9@bIQL_hkwZ2-&EAv}HV`eVAJ#7aF zKTLO5%(ZiFcXGQ)fx1KPPd8V}1g$-DdRpa->?v|wIx|STlyOja)TReKJZE~u) zuBTR^UX`6@Z`5n&;nBr8IMacB8dDD7*m$9($)YCjzr+4Rpl?_mS1}rh?|c!Cs}7%! z*^|F`9tWzBi##L5*(9+#yay5p;5hNeY2v4WD5>wagThE6c2~-JiLJ5Un;gj(2@{6O z$!&AwQ>!jC_KH`8`LydwYSCr(1HMFuXH!A^xZ|KOggY6YgLqnMi>W6S!KQ@{a8kR! zIAcp&XLD~VWcu5uT`7gDN+nX<{5dt@fswZ=iTLIGZa7f5V> z_sO-X?D!93G4JDIvYDHj7q;}GSgUkPcIdoKS5xKb8lLZRtFY5T6CJt>rF0uBQ&VtP zN7IH)<2yKueuDTh{}aOfHWO_o?1XnCd(S8j0`Vnf<~;N1!OKZksxS z*6EPqK5O05ozS`l5kWS!k>y94z{xzk_IF6q(Zj5(JYc%=gl*AVfr`@3m8}oDBaEZ= zZzgu43fH3zM;8ZYu3WuIio2b)oE`JD=#xb{6v%^Y@C2@2kj>ff>Lp|7P|PU+(|RD4 z>hpZMG*5KeI8U0VqT)#QSsqXPjEvVzwW%u1Q2#=_FDF9hCOkNy1s{{IQe}1VQ{(*- zTI~g4;np%e4BK)CM!fl(`lZ%K*`=9ogHV2%!v1hFb-o{=F?~9#^iV}77WYOpQA2-@ z)#E7Eoa`aest#h+Xf3tuhmPpauT)hbKKQ+99pnWu9!{)@{d@YA&j))U9mDmhRWEhk zLJ~?$rbiViAz^K6I>^Mh*E&RGF#}{zZCUMYXU2?DSdVA)aox)cDfIioxykIyh>+M^ z9KwZGJ`+ovLuLfeS{+8kfeD&1v7w0MB)O6{5-uwi3RlyKl-B)h!(0d(nndjW>g2;Ar}AWvwo&e7Y{#WPA8l>7VYu zJj~5OX)d;H|6n#8mkl6^n4=5udR$gC*bknX&^4dWkdvLNlSWA(FTt5VY8G5AmO-#= zy#QYhe7{h#OPZ*`U6jJpKK;msa4eHkmkXg~94k9TVWYA#*452L_3TauoPV8BV{9XIn&{OqB;WFwOjUGD0V7zl1Ic zSC?Z}Dv{Pn(aH`MANCq|IaNdBRlU3dD=oH9}NQE&K0i#h}lB^ z3=SuAPj()cYLbFPfWWwB&H?sF0N=4Y4q~G+IX~q)Z7usog<2Gdu8+^t^3QYURQPWz z#0c85UAg%}O=ozed=QcrUNs?#D|Hg4!Q^vB#CyjKO*)UD#r$|h<5RfSNJZ(_z2H9FX4D|Q2k<nXOx8@gllv3U)S`T{TX_^QxB7Gt{oZgNf zj%9T9mWp-!$J%^*4X*x+)>2a^mg^x+rfF{#A32B>%i}@r3|8pEP>kr3Dc7tUCzDgz zaVKz$O$1Vv0@XOV469&$UTjb!cXbw)uu*9zbxPp~6`l!-$aVEdPPEM!42hVU#Nmp9 z;+CFw3!Ms9n?DTCp}bM_D<7v1USg#ilLILqY_E~pi?=ijUnEppzpm38-qAJYVQl=C zXRa$5?xHzQ$9~Y)4p8-aWd~fDWae~h%PmUWfXU9S#V1F)|6v@biy7vt7qWJ=26C$= zYM0ws00KrnJRd2_#$)8oFZ4GA;Oth31-3m=3GUG}hsN7DeB_eQGHw;MU)rlyF^3KB zW8Sm4FI~eAZ@?|73MOL&j?LQzdtD}x+}|;k2*N)^rvjE;?lP!F@f76eG@AI~Dof0S z)#D7SdRGp*FsYT$AvS3AWze6^$gDh$qm9clclf+sg`Q=T62ltB0zB|zuH;1cZQZ9} zj4$V|enMh%clV1FGkcF^%9opGy^YH!{BK-rF_QI~$G>lu_dn`InD`3V-1_-_? zXb-a1;vOnad?^7mC&?LRuCK=}OI*)wB;`gZ}F+VR(cNU#@LVy!g(lrN0-NdYLa zn;vuD50{K<;4R6Di##lZz-nDRzkrX|O=95SXZQ4(3Fy?vnuM*#W}MPNOB*N4ToxYP zdZIe=765AlG^-Eam=G}($J-d=gTV*c!ZXZ`HoEXJAe~;$+3xqg zB6^~BxlFn##DFn)O9 zRdC$q;?>VzFFX~HT8Cp$+|#Wb_5CF!$Iez?MH7%~vG0=4CZVZ(y@F(S zrYI|L-%rN5em;* zZ)3QTjWZSgq`F)wO8n6l5(;OZrU7c#6s2AD97md*J!iy^dAyH)n@$5u-0rgpupYu@!a zn{F;@Z?wrcE=5^{!9y%?QNK(fGX~=DrXgL#DC%>dz8U2PFekGM4kjM)vPSy0ts(s37tXxn!XU)4pVIC>a|M-A!j}cB}_j8LbKx zmp@u*tN%M#-MVtd`N(h4=LR|FJO!?tD7P4LC>}^7JrKEPSfXj>w|Xs-a}=J<{|c4j zFpy5OHJ;%}@sQ`aub3mLCWlX2Oq`lr>frai53ql_ryARy+ihgVO-j=znf%TcoIzzH z!R(&ZdGI7>PaV4qRy&&ATnL;_J6>&Voi^Nf4e>Hc;JQ-%5HnP%!{&-R6|bAITYu{o zzgH-Fp~0q4Ze&1+j>&Tuy{;I06O5X4Ouah)zhErG*|wDt7Puai^pH=AUCok<7QiWMc-Sj**-R9YGW z0s^Wh-~M*SYTb*Di=8+OkSXQ!&-<6a7yF65U9}W}nEya9iOSBj*3fgyEY$1iXTZ zbY8tgh41=eP(+!YpURLYW}%1kbN|z7Ght1|qXnF>*6zO^8aMmxKSlK_QsQ>BIx%;1 z?eaUf<#*m#xZC+zg)3DHgC;7i$bjy#>%V>rK-Z0mtF3Tt<&lTsxVin8ioMBTt(@kU z%+LG7Fo}nCU^WVoX?Gy;Joi0>&bG9@IkRztnlV;iP8t=A*bS`JyY{}ZYfYQQq@(x zjm?VHyE8}Ro(o>gsFiHlt}-c6?dGc1;C278?HE>A(SWk-!4RR z3cstqU;IIFhA$H3v*s>mH%KRZ~m%Bfzcaiy}ZdS-_5egAH+`^gVcEAb29 z_TL=+zup>je`7~PEqL|!H-GnegGsUFRq_n{|FHL-QBAE~ z+o&QD1rZBHL5c-b5Kw7KM?^$GdM}|!Z;JG4KtMr?6hXT5-V-2n6%Y_9{SlF zBCV(Wkj<5Ra|C5m@ri21KahToz;vZsd&QsH%G4l?y+n&aAneZ}KOloZAoL;45B~38 zwcBxZG0<)PbHINsDVuUSNIf&U5B(ce9&A5S{=aknLH-{j{wn~^Q32V~P*L2!RP=$= zvk=I`&(6L4r18g0|8-*&NhRYEi_4XNOT;p>>r;Qi1ObDCH?C|&18Ye81v$(p!{oyf8Uc7=re*5^?&>F z$L<9mKZ8BK7Fqk&nS5R86<+E2UTaJIEU`eB#iED&Wuvp4odhr_2PhB)s zRZRfT4ps*kGA>K-!4XV<{>uV5|Me8|VEK`eNhr%RW(xdfW!+4Awcrx(VRtF!h^u7n z(fiH3KE{37N_dI+Bv-=+9oC~M%J)NJ)Re^f0auAdWF|to0A$6?zsDJi;7a_Hd=GX7 z0dbMU=%u$v=Oo*@o|-zoAo8@bD4jxEC1~Iv8~gN_9coDek+xlkS$VLmkid*gqHZ8O z#@6o}y>uYgyR+|!t=cjlSb3df_f?}+*BJZLqmJdeG~0RbkatzmPXGCk$H-!#KGjL? zb060}=mT=Jrna`_p#ICy3C+=i9hlB7pf|wd(yyU43~0`{APK@J#l(9(tc6D72Cir` z)7CIJU}}#0Y^JlCz0l0NqAWpn%okZnB6sV$*f{7ViVuia@3qYsIP3CW>=`^xBpl&_ zRu72p%=+54$wGHGZo~-@dao94oF>|>LMVn&@~lODyZ2APkdzUnT3Yx27u><9Gntbf zmgmxZ{^`BT^@RxHTCmQoM5kW4`t2^C?Q%C|B__=RZR1u}-`dU;iHVj_CJR6+|M9ax zT?Qo8o;=!=_e|qSKc0b(T?$L42;B@)*zcHLOHCG3FW`i?F^C!2G(hdqF3iuGne{9@ ztua?iq`;dY_$J){kG&6TIsc~Fq@M@StY}H|=IdjnAsT_5ScHkkYN zsB^ucN3P)mHAlOSlQXJ0&jG?gUz ziVV4^f`VIHUysB~N}Hi_RNzTr#1p8R#x#8WW6vJ}=OvVCcoUeHDC|uj%_pRxsk&@&m5iFb@q#Bcdx!gXFc`TCXlavpXY2sC9kUBtw=x;u;X$qQ_zOumPl*lvt@4kR zqEOygyPnJ>38lp}I;$=%WR>;tarJ3prq~yDX zn0qmQN8vx_-pKUqiF##~#@hxbx9_+=626QOs(8gw)U5!g)<|R4?f1brubk!R%1H`l z+~NZBxP@&S{==HXJQ%v~xwbO9CX)Q&Uve6s1E`2y(Kpoy2oi@8NG41VYG@hs%T-Dk zmVO8T1u=uFro?5ljt_-UBkxwSY-RQe>fb3nkRdNS10YeVTX}z4_t2ZE zuac4DEG|RFKIcMaZ19-=j!i!Mv3oUpn0&?aW`sGRhEftQIPlcPpZ>7iZ5yw8g(tTW zh6#dpy_z)J5a&M4XB1>xx4M10vj*%2r3Q@ilLzc2X}GMlVsx_YOFJxnRA%zkBX+wK z;dIap)~k1;I0_Af5QfJ2TYSpbS+$1pI7a zP$Dt=BO{cu#pYBUkab{R(rG~UYwGRBI1TDSqu9v>^^Kyu1BVA1?ti^?u5ITT^KpFH zlD%jf$Kl@5{evYXK5?F$s&#pMK(r@o#p0;IkouDAXlK6PJFfbicy^>NM3AjplFXfX zXp}^U2DIh3ePJwOBj!I6F9NPGIA+WMZ}!QMrlzL(-mAWf^>FdMoC$o&A)$2}?K<(= z<8W`V0cRnx57dMT34o8iHj$wi&)>E^?zyt#liA(?c8ZTTI6ce37r*f!7p{mL5;mrt zD^h6&cpC`4EFKG&Q|ybkbI9#95;lz$ho8gFD~a}ici-qdhr(meGLkqCuoANSKxHHz zaa!a*uY#o|3}H7qa#{pu1g=unY*HFnuTLQCxkmbVka)+3AVVh`4h&k-fiUDo+QTv9*oO#qf^K(JIQ7JWAzFUxlyGqXC+Kh_>2O&x3V28)0rFx z*ingLzWh|f=fuZSFlteo6=BG>W*5{XB-_g>39*PZA77f~JL11_yulL(heHW_A8$5s z_+0J2@oPqX4~gd^@PG?#4Xb-iiPa1a4z|S>R&M7mL4ApEa1P$lfFB>Fe=(u3ximWH zvlar46EBEKo=}!)YL_4`DrM2Ef}yv<4Ih=8a~swUQLy%DXbL5{ER76Dvdi~sw7p%j zo(9p6J>X2Mhc1zHEfml+e#4E{1>b);J+Mb-zin^ii!;K3bj?oJGf4lYLvYKoy+`9w ziXl=A$aKf#^&we_`0~xDmkSdzoRqjlQbh_=%B#o=v_myO%V#M<`t(|qBf0BtK9txV zKAYX}R(u~$VSEthem-lbaeNXQR*vtg8GI635S)^K zm|LS)bAa~Nn$Uo9zjLrS3TpwymGjZ_T`3M?9-FHdT|sOw{RB@VzS9Trk_W1!qZX}>4j2bBt| zBdPs#m1Q=$@!iDeZjf|VNP;aD{aZmngh;+ieJtG%MZy4u{xCf1xu%7q+9q`#k~Rrw zEVb2W|H@NaK7iRuG+@$m+mRAeug`mJdt(O*vD48yNz-7z!zB)PyACD+u0GJcd?Dfm@~9 zdUn<}=zCs$MIKiM9sIZLUX!^q4fRO~R!;bM9zF*6%o8<9CG6g0U&U&hi~&^Oi@Gv@ z*lRNNCbx5xr#U@&Z#>Z%3^MSJ5wID!rVl-Qqgf;Hrm$=VocHS3Op?e>P+3_AZ3JQU z3yqD~qr+~^7OBRN)!m$h%0O9#p*#M zc>KmH5ts&1Gs{)A_ZJhw_k9#rRo2{~TTeZ#oVW!8(sJSC5VRhcy!>zQn zJroi3uwJ3DLS1+nIPyF0USztmW3DrA8GKG3>idw~6xTlxW``JV$?nb{2Tp&SiV^R< z?1P>noTOP+p?-C*ef2DT4UmBFM+-iml$1ykSPOSi8&zd@57d4!!9j$<=ZTdee_!V;8plZI%tHXdgIID zeKx17ge`evK)Yg?PaqE2E<-ve@tTuOMi-QFS;xL+BM7*5T^+m*rg<|ATb$mrB~DK&_MOFZHq(0Q9kNAtbywZj;s9I7g0s?)yhmUmyYTQ%cM` z%-Sym0E^8ug`c_@sSi_eD**SqXKYfOp_ZkeB<6`Y{I2>+Atk8C5*6OWROGeUBRdKf zb0O$dkHW{j+WJX9DlaB}d(EP7Po{bXl4r6A**s(h;u+s8U>eXGoGAF!(&U%qiFU@( zB8^QN8#>4i?NFbKvyNi2)RUu^JI$GRD0Ky9zS2$E+>8UlCXh`~2gs03k(M*IT9B?f}#8P)PFl5~o=sS)tm zPPwoX2FjHID})ZE&C-5Gy{C$q^5rC5sx6rZY$~n`{-=e%9lno#{@Ixe z=}RY88NUqe(lrerMS9pU1)}`)B~BX^yUbtM&P?$jTc~ZW95tim^fZLkvDt{<3pzlb_Y&li=DopqRU5iGOdW?*pi z>vJHK?0=5@lb^GJ+ToEw*0Ur9j08Gu)ibw7&k@eP?|ebo-g(-aOUSDC+C=D$gqP3s zv_3{jDJ!*dzR8l%1`hM|F;5^NQNLKd5PsRYsbBk*b^1Y-oCbetHS#hkJnBDKI60_= zNJbI{`0YO-w>THvrUDoOY0Q4fkg~Os-`yqjHc&j86Y-a`3f=(U?7Ji9Noq%{}#xZP{S@wA(2gXld%@8hEq#C<8#iGUFCd4AD= z`hxV|m>a(m%x`WOM{VQWO|502qD4!*DlR%D-Mz)(MF-hK^{Y#?k-;$|4J2%OgJvXCm#^f@>vCcDKs?O=tFQ>A7lQFk_$Wn&Zg8YLnjB741Z)iErZ=X zN4wC+dY!Y~MfrG|`BeW52j)uQMe8luSmb4P2FSstteRV7)QoWayN9NSneFu_1~pvA zfo9jxSoO;<2|B+jSpjegOmH-@kS)>Ao$-|6M;FRfc2c8 zhzdjx((MH~n+^g!E;Us-QHmQlwz2!DQkX?1x&3^55ZQkEv5lVKjp07i3v=FCLD7QVPmC9=afh}j%-j_#dCTrCvKxUgSXIUWqXs=yzlu{9y!Ji*e+ul4vEFNRI5OY z^n6)OOlEf19cuaa`W1>zjR8~)9Jt=95@B#_=u%MMvfn8wu^<%AU()a> zAd#b;-6n)u(oB)qb5#21HxjGwcQSADV&=!$sE`A6nvRP>_^QMQG>j8jzHHr)=+%^HK2#P=lKwl<*Ew6&T` zC`10ptM|dyw#gh-Qv9sa_pWJAS_S>Q-~5+_mh7WkprUtX??0@GI&4T;oR1Y}B8h-X zAd(IYQcLv(wu{7D`HvNmdB-bX{e~H|cwIl#8>^I;Jvk2I=h@3H6W*>8VflCa{J(ob zsJ2#)df(415Q(u!c5m@nk4lLna{)%sA|o)S+ajm_h5`>Vs|Bm37gdg>^-|X}JL?5D zkp;YHsVRarUR1igZUUraeOwH^n{w_1Y^|L2rdRt755;FoekGd1%iIOMr!CWe8xke*G z^CB%})_~w#QrQ*1Hu=x#zd&!8N@!%6AeKOpfg*S6V7&(t z_#qmw7PnBr76HfpSQh~rSm>GnqaDj8lLJ?O<~B)yw1Nq>wb|F5nf1yLDByD)KmV3| z^mBtvf{}D9RxvkHwCB-|=+vx}lvuw?7Sv9rNy}{eKZ@jz(vlyCq&V<_6^~PBLYYx& zo;G`zPE9BQ7h%c+&fW3kqwki^CM3z{b0(tedB29_hu>DI#F&f_V*Q114|$Xv74Z1t zDMnXiSj`BMLrC)cJ@!9f^Iut%hz+u5xLLy0_J-rux1B<(8KT*^c(v#Ms=A#idWDps zVdTGIEI6rNNR7ND_(;i5eb9pGuPc?@0i2-G3&}qpxzJ!*66CbTLve^|=KsKrf|N%? zi?iE`e0Dpa10E84wKV26#qhgyzc))BN!IDn=i`6FlK?cgL`)>uBisDmR#*#n0U((0 zu0f#RnDwtazLN9+sMez0&~GUyWeOMx6FM#X;>7R&LI8QH_x}&Mq}?boQU=2S#OsRa zQ$^tb?7rmq?Q&L1AP-5cmL$GQQgf?_ZJ+TLvK_ij5*6)DPQSmr(3=@z;M}i~HIe&E zkx)r&D;mUd=D9BA+}8kM@^us7O8s^z*t*rpKn#`7tzUI}sS9kDIF-J%o*ZUi;s)|G z^50=7Vve7_WJ$tQO4>n|R-f(M+aX|*h@K_@geX??1i%**J6h@Rxs)W3wwV2?LkvGQ zef_P+bf^#^6Wo|djg43TuKNTvvoNY5n~E~t;)DgznT5ZYZV7N09f8|eWG8#%9VV5S zqT50IWdblB30xBeD?d>pG}7=$(xxCzip_?ERTqR$9r=5Cj*?${zB?QH%T>R#xzbLO z1^gj~*H5@>7CZqe5jYQP5Qi0(J)f0KHhSfG??@@yY2&)AU}vvB(%#=*QZ%h(@mg&n z>DgMK$4Ls$_P~fGh7zw*X{l*z%jixzEAbn}gNi8--ItKGTkDlfHPJviSJ1TO6zh%qYhTY7R#n}rZ$Jd3 zhl`JZc>lv|>vY+01aP*6jT7$LitkJwOSzo6)(l+cs1jeGak&k!l6}cpkiW7AAfoQ) z11J%rmBs3;R|}r_r)fwo*BprS74bw6wT-YItOgZ~q&z>X86WV9%#+b#sqK17#nhJ| zJ&=sfhwF`Q39C)&T{O;4bPO&|=P3pUOqN|~GyOIedN^VTJno&fCL0C17`lAh;h8kt z@YQh9UI$HvAu67##&P#~W`N0c;Xte&yM-I(+l|=qP*Him1X6DY#N5#KG>zj+;MA}H zve&5&ALuKz zTCEkN%xHdm<}KVFC?*%qLa&A5_j5g{6uy}SXwz16h>)CkLgV<~(Ob*O3N3QCWx zT7SytBxZ8~ZTHQlm!p5Yy#(@2icO%MKIQ+Cq|$w8sx1{LwmtM^;`>Znl((c37p6V` zNPO^Jb6Q%x3d{Gznd=gz;BotTYH)WCWowEfntVMr7mO*}1LT8FGkYE38A43>?C(m9 zIaEy@XZ@<|NvmKxiYP2jgRRoNQ@{NH_5fo03%CaGs-N1stxDy6}}H+|yj z19vV3>GU&f=1);57K)ZWh`$-v}650FN8#R9Y6 z?Jb3;Sn~ze+`vd0R>kB{d#B=y78e_wpu+HweMzZsnUs5E$=?e13#OdAX@v$tzau2^ zO)_eqN*RbP$%1oMMv}2oZsv$&`JS3?4R>wDXihfNo>vYLgun8LRzhOVMlxM?8&U>oTTvH`XL6D*p|*QMaJlCY-EW*a-sWIIXb z8*eLZ@H3_&G+9k@H4HRC>+n0gd7?-%HpMA4{}$yVF6GSqri@n~$t*y=(wW<+KTZ%!dZ>Gb24*vA=bzL0Y`tbbFA4cDT9QEW8pCxB1odV^f9Fa7?V`l7! z9pw!_fQ?_){kj|erAkBS0b~Yc(w-872h!m;+jR|G>ByCBSPqp6-BHZEL(NLC^Ab7P zp$xo+IKOCXv5eG|NWXKGaS`ikl1%~<-C0*rL{cXO$XmkI0aF96rVRUPOkR?usK)6XOx9B+2PkH zISyacuC@AMnL(!2-nLjSievcQMZU2rt)}@eRfjv%;WYzd){u+=Aq>YQf?u)eg?rCa zZB#OOH}}-E#Mt3y)}zR-m&zG%_b(|;d*_GzMc#YH_4TeO$Le^SyfA{?U0y6tt4(6yZ zxOM+d(ye|w4emn}<5MXlNJ0*SUJHq+WmK@>wsV#lBdfC9%5_QtMDK@H^|%88e?=@T zR{h{v%gW}4cGN)nQd>6Q60+D;2M-Et=O98);g0~YZTCO4!B>%2_=%ShwulgLgErf zvOmZ%rYo3*5!GDV$|7|y2ITQ<{NS z$?9Af015}3L;A4~%3A|JI*l<(^9fev;912O%px<3C{(>*J5v)o*fQEb+!9GPX);DW zg+dFI>SNPqyK>=x$H-NZ4V&**<=vT;K)}ONpjMTX1vyLw9H&-m+FD!=HMC@A^Bp;r zvzLQ0pL0r^QOL(f8J+K-c6@zQeL|UpT)4vtW^49zjVkhN@C&^ue(yjxigyX**T(m5 zbr>9V{-SY4m%GnT&fuBsy9-mg{fi!2tBU0h_NTvE8HB#gwz++;#o%_h8(sjBj*QzY zTqTrZD~gJA;HT8(>nCj#3S|Z84QdD9w`banG?-5>m0#%~c=da%0z>FpY*#leD~Gn zV>VmTK=tZpDuaBfS>K(hpc(?LIM~?H&dX3APL5%9SHc{uDL5cJ%YzULU=ej%XD2guIX zVAZ+%QQY`=o1#*Xld2hvX-F9wRY`wT&F1pF+B`-Bs}UoEo>r5ibj)Q!PMB%87S^gi zQcOE*u9|#z(8i$HJ=7-mqa$(fW!ir4{(Hk>;bkA<9y{`*o{|K4&X#%Yhxc-3(XCus z>uE*ovh1DH$L6~Kw8|wA+B0fGRXLHzW3}>GAzl1M25EAmx$>V{7M=+7=c=`avSu9# z(*5~W-a7Oe4MgrIJAAHhlE4`>@%i?+$Jz&wVg0Un=}e*w|G393E}k>Z0*uY#!L0r9 zvY4XWlgv(aF)oTNqddcA7_xk<#QVW;zc-|^LMm~t$+)nL0SC%=`_m3trmXF1tp)U+ z9-Xou`9~``p7z|TZW@MjsRk+-q|@De={|aHh)e0s{6CM|BQQtu^|cO@`$6CP?sNR- z#*S|d(3-5E%3{#KkQ@8>EmcncDk&5FGlW+Vo^^_Ac3MDJ;MS$}KTB2rGb7qpQ+e_+ zx(Y(QsG<|0Q@KU>j51JC8M72s*<}yn+#=uF7SsiPOXYEv>lA^1Rf_&kq%E06&YvJ~ z(;WufUXBJ8n7vAOl!a|s8;AXKZGmP~il0HLod3hUuKh~jmQ{j)yrWZcwz#;-f;dkc zb>nNk1R5FHiz!AGmU8>$TJ>egxLa~0J7tlAvrePTi}w8VNB^ZWh9p}hIVBKFznSN6 z1!_7@i{IL+Kc0vtDd~fZ*~>ohSfokfb$+II=6O9vrKL?GhiiTisxe!Y7lJf)@6Erd zK37p2nE%Opg7G#!kjcJ;ggQJGUd*7ZE@(K|v-fc7`Z|m!-d_z~uTA zxIp2J`#`o*N}6K0==x(JxMz=_@5+rhaI2JRSrC<5lxEjBE&gP&G5Yq*B9QZg3KuJ*sQ|;ZxDI zhn@f;8LQ|WnYYSL(%ej3eh0$I&NJzfKku|&G6m5#59X&QV4Wn8$#V{ZJK2CfLfjtq zpdL^F&a&C@)4~HZ1)*J1+85iMi6Ul?***8A%(?k^7i0{oy(zS6=i+T}pnJrf7%m(N z6oshe%P~)Yaw22Q(}E*5p^O5N;~L>CV)_x=KsNtHt2c>T0?LPensYx9ET`krB=K@^ z@A!V)cAnBq)tV-|1R7$rnK%DKP3=BMs^R@T1*HdUOb{nKfY7`CbdIn$UN3$lsb1_K z9DOIojtViiI8d07?9EA7!Ew5h#uJ|ry6x<5|` zzy=1f%FfiFq#@4+?K1YFbr{tA%_92h;RYoFI;3W2Adt4#SsH<(mq2#clG0_jZ6d`_ zgG4#OBJwmHIKhGmpsgu2^E`1L*g^}&4&L`pa~~~`FQ^1urnoD|ehM!3=f_eZtUmfh z9B9A7+$~H^pU6|eJAW76e%7}>+hJhDtKF6>kX01)EQ;(S$Xwg?n8)uvMklIOKMKA( z^}AA7^6821Ng{*Z$z5+htA6u4-|ebskiPh|_H-||!U5gcHyCH-_jj|(?7)sAtZmWK zswLZ3?1Zr-(F%c1}CGDu$vI?v;P zPuQW$O%C^MsL9pMYew8s$4W4Fkjji1)0GNGqEVlfj|zrPWDmH+>N~#GW7$vPc@A$> zV+75W?CN*tNR*}OR!U^^)6Gw8$$swvNR*=|3xk7fS$XbkR9A5NbdPPlk1lY0J)cf5vnTKmr255C8rs*cwG_pm zNv-3iTSDap^Uq;z?$Up}X03eX82xW>a^_tlsN)<9AHT0=M5(Jx#$Eg3t8-|U$eQru z%G_NJ!C3HDv|4qqiZsCQ-TwYDWHVL@QA-2m+NS zKfRP0Nvo_n0-V;dB>;i^v?mUDjigMFJvA_(8{1oJWkm~P9P?6jZ{IxQ{Oxj3)#L=| zcZUP#{F?YdqY|woA2KY!k@=Si_GtQ%kQSJZZb5rBAj}+tpW!@$`UC#3<~g;TgLZ+J(XW7!nnTFU;)-Lw&Mvm1(DXv zu*1(li)dtwyWra7Oz>()_Lt^sB$Guy!7vsse~AYI#}y4j-iuy)vnPu5#=Rk|&eSN!h=Dl&diywbA*hym;Iy!x$!^{75jDEy0((!|AKkAttNy9C)BVY+DWYjREGp3nJFsQ z{M~i4Qa|cm%`;0+@ta+X4e-u?K}B*kM1H=xs&AxFPRmurFv_hN75NqMqtCP<-~R4w z?>!#?&)I*&JSaGV0ex9!#!#wvWB36|B&0bF8sTXDtj&yM9sT`6JZpHx(Wn+qy~T6V z2l3+|Qth)BL$^TgN+YAmP4wGADP%yKga+&elp^=To&F`tqUK~>wVOs68JfBj%udQZ zDHFOse8n|T4-tJ|X?*Y#Zg zyP}|UE~|7AwWZCs$=N-xr2f+(ou`~qeNT?>{9wLTS7$etcf$cYSnL1@i{V@yd)VR? zULIsj6j{JQDfVryTJ{Iav$?agvzgBPHAUv<25cKCi#T`rSZgQ4x*^3PJ;$LsB+ZLCL$^h}lB=rG5b!_@o+}t(it;XM z5gXoLl@*qC_SZ1F`7z^_dP#nPpUZ4$!#u@$ypY4P%dEt}F~!rLPTq*-=PT6R0gd)# z?Z;|JJ#9Lju*vT>Qpn^e^A;H{LSm!C%?mYD#n+I5))8vHzL>DQbsLE%-~e|iJc;%v zKj=H4IDKishfbBM=~<-T2kTF+Yt0NbJUx`SW)5dX%|SDG0m|(S4n?n?HMx}o77odO>{7O5()&{^vR+@hMvXSRl- zzm>$kNgO4n7IgVqUwi-#XL2WQOgsvHQRAocnHc_kIdwMhYCP>efEF_s7TY)f#2zVj5~X7>eHkhnNfO9)uQneTF76z;nBQ3_?VC>qrgt#>aF>a<9)Y zIh+e2wReKZ$Ha0hb(=0}MLB=XT3?SWk3>F|02zzr70?{a(Vz%@{-0Z9kZiA@s4Hgg z)Z_o_OvKdMC)?~n1K%^bXUIq%eV}Ogi7mFJUY^4$Q4}tTLNNC6zR%EnKJv&wl}=qj z;AUJLX2>f(Q%kC*ti9l)&up4~htDg1Lmh#qDZ10UQloCzoPzkr(yf&I zG!BXUopS`6pB7LgO4WGJP+y#;aaHSPyW}-P#u)ZkT9}mW=pFEAIyUQk1~uu!L0&fH ze5Uz@)|$B~^O@$bA&Ng7TjdjEjFgYQRGk9dq_!k?K@3DWRdT=O)>&n$%>3f|5yiB) zHklT;~rRUQVz@xG_mBlpf>RA`DHqo?Yg976q%r9cO&SDVr(~3 zQ3?_nqoAUDn!^TUVLZz?QyIb&2Bk#lKCp8|V2k~qg;&;Yoy5gl|GM!f^6;1paC4kt zaiju$;5u1=^nN8MTurFYi9B;dN%H7q^~?DY;LG4ZehdMCgbCUk$r8Rk?g{4o8?~p) zFitc2#_M3!=tW_5CD+>iOyd0yjSqGLvZHh3fvwB`*0%g*4<)rh{_k_-HP(MZiGLFS zuK>~^!)3vm2Y)jS|NavoJKh3mY-71dnm@M3uUHNII14z3A!iZ{ejl~J&m*=oAeQ^T zJ@5&f%$v@lKOlv_fWQ-^1~1x?GryDPf87yGt>kMknk!$;wf>mqzYPCtc96)vCHJpk zx+L2JFq*R_3s(KV8D{OarWf0HS$n;8W4U=0^Og%lXJ8#onKFaR~+n;Tk*motA-%RCxut9?|A;g%amSjqA4=`kv=r zxcT_k<%fAozT4CZt*ltRr;qlyqH6C#0_fBqzw$_X;AKl{STR#4$$@#BqfF)aP7L12 zmc!7`-r_?_O9fLci0Q4MRoKB_Gloef@=Vx~t%vu*W=N$@Gx?IJt%uQJz>#`s%HBg1 zY`1ymO|q1qPFOCG*9B#Zs3>LV#Sy^S1lv5Jtd!9jqfh!B^p(#`elwCkN#+@U!~Zq7 z5*wh6tJDU`mWGd^vQglvCAX;_uCcH*iYEYaD^uW3eYnbNq%8;=qkZ#J zOf=YgCQCe%K&(Cam|{l}bquU%>F6+ddQH zhmhFwj_Pcz6JMx!N@CLoS(<-)q5n8yQsaPSHMu1EkB@$zL~KGNo%a^^wCG=t_rHJ8 zo(F{acm5Rr`}1EWd?pZFcmR?t#z?aEO!IG5e|u*C zI2M#iYU+1Rv;5;DFn9m+5D`q^!j99TDo_69u1Cp(!BN50(sb-!|L7KDoFx6Cr1 z#NgUHc%J(rmHy)puxY?PFjWG47um{lufZWtr-Yd_Qb|g(y-Uz>3wLpR_K^+_(kIDO z>YW?YA-Gi@oG-$zrc=}2m-wUZ>p?Q#^)hdVk^>Ky&G$h_qS$Kp^!7fh+SO4ZkzcpC z!BcYRgI+3;rnyyLk|?Wns*2Q=Q}u^#k0?;(;IbTP>`yv0cyp3R+Fnl&su6)WYvYqp# zKo@S!Q(0HzTG}cr&ivrVq1h+OhSqv?Vb?GbH0HEA6q`b;u{nJ8rl~O_-wN*ewMX9Q zr|Ohv4b-Dg%Pm#96za+qvg%hC>|L&6!T*}@GI^s`m(fuoe#~%_*`$5NcL>NH6i)wG zLPJ-k!zx~OHK4}bu;?_ujp~Lsej>j%%OUWesHRjG2ApZME=%A)-xDbr^f5eAq_+U8 z;|OIMrB86M?jO)SFZzyqd-Bs46Na@5q?KhmMus0he3QH7blVQ)b&LuB`3C-r0-hy^ zJjD?YYEe{7bkeBW^I6Yz25tRX@3iwdYS{?1$A%=H`R9PK>*&Ir>80>oUnCj7ZFl4L zXl1^E<5aav>yrNxitk6M>%@LZ&huQKWi3;3=h-A7Umq32v0r(QZ{A>|Tu%H#td&gm zF{qhEOdE_5-*w-zLt4R0W8;%w9Zc$*` z|JmVkaNlC2e&0y|K5~PrzZlx(vQ$xS2k)QDg3e`mH1vit9p(|&u`_9%NZjynyyvtX zuE(9BvcPjt%x(bJU^|r-u-)5HOjqbC+2xHU&dW9|*wYz}IfisDbrjbl)v1!i!KCkWOA!K z!fCP01e@2fez3n}w^0YBg6>W*H7ED^gWk>GD~KLgf%1!>5K8ELJv>}ucWkaRJDJh*%Qeo99ZUkct$c+3nCU2`hLYflf}1LAzo6ASWQvT%*zrEZxHT06 zTjK3C&*ID$itWLP=2m;f3LoWd>&#C)P!YI;jes?(WWqPadK$V5efx>oBsjAB%ldfV zAhhA5vt>hi{%HNqI@ZKJYuzv(k4qA%sI)_jn{;Zc8#1pU@Xc<^WA4rC1IPMbev)AjoSW6D;5j~HXMo3~9HV$6-N)m@xXjy$(e}&3YFhxPD zMV1c&?|zJ~)H>{iD3+$|`*&fzHB!>I#w)|{Vlt+i0PpW*^pN^$k<7%b4qI+nxTxWJp&}Ga>Y)E(u50sv|_Xqjp-Quf~Tom<2~&9vDPy8CN`O6H`T^?$O`Xm z`yLvQKyhoINjGgkm$%q6*s)d5ovLAZ{}gzCp;cS?Kk%3Zj1}=7dM26 z0k+cCQo8FP`EC60VTnnX0jeP-X~;7);nwEVL#vkWIxcg=3{|`qP1Lk!>Z~UF5%Srm z?MtDCVi8l$$AW07ZegUu!T`f%q8uiKwys2b`P(5E<82FxCt_)$aRT(Y*T z4ceU^Ozzj|YUYXi%vIlMx>XHK(0#TDs;!5Wb=xJQ4%I!1RfE+X2PY}Izq0OEPe`y^ zAHC-_6p{A9eS_iFjXb4IfBgH_M4ZRPT`a}K)j_>ttDa|G2OAPZ{3NTk9ZW`aZYLFt)>DjP9ct}@Jj+!L-G>8SbZFJM*x_Z=q#i*e`jNd3OD_g4W>=*q zuixAJc3#xqU}-g7sX~_3x0hR@6o2Q%#xqjFS^4Zy`1g9}Z`9+q6(I$OGFsa6JYu%t z_H|?Xb$F2=^vii=A(VeZ_(Kc@{B<`&tCb;_NOnDFudnz+D^`*D`%wo56)!ifE7 zA@SDLI>qfeO>X7m6K5d!Y2FMHF}33#TD@aHbegS@hSN83AW`s3lxdi z;_5MaH$I~H)_1Dyq4P@BTNwAP)zCrcY(IAl&M&06EJ-ZI06*6CW6AfUR?rVY;!p;C zG|AGi*}{~>_dg%(S`=a7FPHjbaq2alIb4?xYRFUKtJN(yLaWi z#n(G2#x<^^ef#ywqo>6QZuoRU>Gi}Z-G;@wjanaXPThjnh!qS(c#9~vubF-~Fx}F!>TlX^pE$^@1-svAlHc^)wC}#RQaQ-#xlPN@8`=ay zYwgPiPgS7?tWe$Dc;BRT-#XRif<`TOxoMHy1Qp;g0rvSA+VDboR!C8UL9y>KC)3)p zyNp2mq(K)Mhb>lGfl48__1hO>}F(OG<m-MSf|-E|HFYiWbfK}& z2NWzC{I}~4Yg-aj>x4XTZuog#E#mIl^_1$%>?p-B5CI#IoKbQ{at1LWk|aw;az;Wop$Q@x1SB@l zG$1+Wrhz8hx$u3zy}$4Eo*(z#{o{;#24gUK_3AZ4t(sLetDdSU>JwNI#i89`L(w{E zG-@gADqfz2?jNMoXQAlZB+9vG%6Dl|PcOG-kh57!THI#W7v@8aDLBLt8TATcgKGxQ zG*=PZG(%^-(O(4h3(G=K!cyW&N7L1_R+B-L`J-$&j04hZZM%J7b}L-R@Rj6tfAREV z8#pKwQF$k8);9C`7Xoi;4^ii>M>1A>4IX0r^Ch+J7tOtbJQ7wIh{UrfM^G4?*qoS$ zrRPe@)~cyp(5x<+I`-ygaPm;Hp5j|Pkd@~k!}?{EhpVqJ?BaSYD&Xv|Eu!9Ly>=n^ z`=6g}>ZV*s_pqq3*8#ou`nC4i{nE_|Xr#&Ep*+I21nkV}_6m>-DN+F=6Ek|6{cxw@ z((4&EmFtHy9ojs1cbhl{JYTMD5-o1i*uHcn?AY>sJV}ADEql~mPQSk0-NWYBR#+4@ z5$Q5i%cEdZW!JjFxm9Tx88y1yG^Sj+UdfiwfckvQl69JJ2FDZ%~TKg&>f*It*@;f=(U@;l4_`~2P=@ugJ7F& za5V2-WaanlnhN6v`I@D>Q58<&|(?MLDx~frk(__M<=^^yi6$oVyjlwg}Qfb%d40YZtMK(O%WO6f{z(Q88>H^Ehw1Ky#iFU=yB{)4P!wcCm)nS!fyV>th zS085A%P%iY7b)NaCP#CK?1jR#>gV6UjvTspVX`UWATQk5YGg-!$=8pTYwvE#J=|92 zR?i@xA!DRk1~z;@@|mI2+&;}2`;M^=P3sQFTC%2AxZ%7|JyHs}?hBLA)#{XiVn zlI`*oH?_;^U*%Pc)4#XJF*T7N7i_!`ocnEbbTqk~ie0DH$Z6B$jtbE`mnyqE`%`5m zKR-XbU3G7zP1eVi)I5zXJ8*#(A=jK>C2Z>%xQrMYRvpl`DT;w_Ha+QSxG4)DPj(rb z)%PB#6h%jt%5%$LPHe-E2XmHbnrCjO7V^Y*VR+T)QlzK1CSqXA2%)= zDO)KWWo@kW^`7{&NJOr}z{$*dK)G z79xg`I-QQg9POba_@vfrR4oDnJ~H{Z?=JA=FegNwAyt#;p}Vc9dx5sx<@0ilHZ$6@ z1U4dh&Ei3(O+73&&vMmg&92B$#@#R7DtZ0PK`Rfd8|Q@{kn@ya$?@=cAsH_Ps8}mY z;0^FhCQ@6?2V2M~rsC9+y?84s+2<`BE)my4RNe&mT^ZD_Fi2&{$G19|FvKc1UIzO4-7x2dwp9-3>mPN(zUspxZh zt)SyJMCknN$Q#kDCkmUyW}keRRKoQ#++jz&@+^vE(>uq>SN}Z|j2iC}fXNAc>;B|m zg1G3i$a~jS43)>~;aNHd^x0Y-vi47qJ6eJk`1a&}rLEvrt;#3$5A|cTYXuKgah@)P zi@D+-@>$b7Ryco7g<`e(Mot+SJt0$a7S(m9~sI1#Nnk>sOsHc6{BBm;7!K!d9<~^*t7KPU2&kJf-|n zyt2?U(READ<9Wl^t0(1&H42}9(K36CNf$!I0}P4p{?(rzaVDPqgHNRC+|2yn2v4U? zTJ^%TDhCGEwb&yD$HxejtLdyGDm_+@>eAF&q-hZ*ChOxHDyu$6^&y;D&Lj7v$=V<0 z?_3gkd1TPOML&eo3d&C7G^di2!OB|o6pc7FcZ^aFml!6oZWcA!d*QKm6t>$tok%A~ zwEW&QihFZh2GWk?C%s7KM)L!LJg4+DSXsA4%m$EzevywZEf_EC z7F+EW4=&wui?;%s>WKIEKU!Z-9>=_5<8;o&9Q}-al|b7v(@&WMZ|A&U+kgw})FYu| z97WQcI=cBv!uQ-ya)DOT{3zSl4-b96uImvM6omCxE%g@n}#S>!Ro;tp*s-b0DsvVydqM`-aj@Z%Gc4cf!Uv}@vdUV_sHptqLxd6OE)BJPqPp&xN z$|)aL;C2+MadU)36oX8o>n55J9BvD1S!*R9C`FWktC*ikO6#R7c1SHo@Z=G-EPSrCm17J2vl ze7qOBSe{B!mQd~gW%Ovx5Z{k}?3Au$Yw7yVuX>UJiXFbY1poo9JeWG78uLIQuluqL z&(l`oKs7@3EYz4QdKuQyKq9^;iQIYZFj9U!=T+pE)GVWIlPWyE_u#qv)_Uehp+-X0 zx6d^#4MaZ(Q6bgh1Jot*Cxz1QP3nF08WvTv{649$U^weq^3CGsTDUviWKV>BXST z%sSghUW()(9DbSd%z6;4@Rv&A6>RKw$0hi}93I zPg?6heO&iW@+tT76M2Z3#h_*0wG8blk_)%n+g{H?kAz6n8C7F71(Z@y4R zSJVe{CNY8oAxgSJoJ!s|TXN{A9jtAYq{0l@6YLhwXB16rW#YD;DTtXWxIL&HDmf~y zF-=?`@JEqU4b8ZE^liR*KVrgs!=+SvCB#;J;DOh8&{!Hyo{*96*V{vt6>S^pm5#f@ z)eRorfYJ7fo{FI^mH)ukWv0gccw($n{e{a@V9edLM_)}fn$CMmCgb@RrcTAn{R*q@ z;&*jD>OZAzZk5eafYowG4wS@;M;~!hmM&CTGUHA)-aLDN+uiY_^Vw!XUW@80PodNm z0@&c)=l<)pmIFC2&}BoNgf&~cdtX!K?-CN!%eM{?)*W_zWZ=)QUM4vv95#i)O*Wyossg&1V>{!^ITZ_l-EYm%cJtf{iiNl3 zq$-yU1ZnfS7*=NEEs9Sf9cco+Z;qIy66YfXqDF9fmJi@ra*Ql=K{tEy%t-~VNZqPa zT$VN*F@H*|I=6@IPP$i|$8Gl2VOefkb&WSLjk7w=dZ6ua&oY?$t%m+%(Ca5n-=SWn zbohxOMFo|7t$u!VX(awuYLU*H$qVWBYgAqGtMhF*;nlOTDr3Fv=&}vl{^EDkHU?qp zE0U(+kbA9O8&p$6Rjzx}DZF;}&JUS~Cwz6tS{mISg530( zAmaR+W=tNUieWJ)b!VT5+Srt@$O_L^$$exZxR5A}HLB>MR+3IC>{@d1T|7_fDfR>3 z+DFKo^fFKPrMEtcyE`dfzJ4w%J+X$Gabrk(jE8^lxhSelOEgj~eW#l7=_wGo@?D~M z;v#wl+uduxWwHMGAba9`Fg4|-V-qbn*yssc(8h%<&px<@Pb&lAR?VLKL+-e8^Hsia zx6d;AvWCsKFY@>thrcGyXQkVxaHLII(;=UVJI@g*Rff0at1-1^7>!wCr4)E-{9;t} z54JYBUYN+}K~}|gg1tJ%nAT7O9vJFT#)_0Dg!#qMn&zkE6wrT?oK3}~J3&f0i=2r|Z&WSuDs zjnt;h)h-K;Q&q1&+~;vAK*_G273lt1PO0CSb8pV%2pdhU_24gdo+koxsEcp&*9sMGT7rWpSp5e)P^z)!+G+4*mEJpL7f z&-w&l2p86i?m^Mef1w2a{uFZs01d9YY(sdJf83UM2X>>XA3}ou7}9SE1P%WvFH!%u z!T;SaE2!vF_!olZpADOUhK-vNs{agcxapfiK3pjwPyo^x_$-G(BsRvuS*nWv2bX zRLR-qC~AT#KSq~CCAS2__;@?9!h|+#co*#r?Lz>FklTpQc|GXatG3;o)N8dd#e(P| z(h6;($eJJ&r!MIIS#hw|n`ZyU<688xrdb!0#{pR^NpqYR)S{1km=|cV%1+ESbP2Rb zaYNhY+!}4vzMJf}Q?T7e({7biF-k#9`=!+`i(XM$2QE@j{u2AKEp(5`|ZLU!cf&bt&Hc){(q(aiPP4|32~ztG#5ao;djsC3@z) zMCGD?7WtfXY+8Bc*x@qa_LEkk7MS-mV_-We>yKGd(15aEYA4gl(Rw9uYX6$fd-52; zq_U@5d#$FYf;j|EyOPKqh%oL6H48dTdX92;FES?)3nKObgfn`|t^c#TV=e6J@>u_L zRLkeL*D`0~R<#-352lc(nxhW@vC_SRuR_GC1jLG&1H?M>7qRx-WVZmZ767q~Qvk83 zA!31*D&EB={U=E2r&+-98~djnT>r_mCkX!ceKeAg0FySE3^q`m(LD zizqhBNbV$I{14@PFC<8T;BySJUjiTx;7&tBfGmX);Wriy1Ij28aXn%Qx8e5osufh|+hf z8+EtNtKQrbbnyYZZ;qmly+wf%)5oGlNmWO&URx`<+Y@ul)|(ytEJb>5MBA%HW!9DE zxf^PeZUD<;e{#WpD~TTbqb@lM4D=)bN!znJh|gyBJP(8-y*gO>Ql1$Z`-gs5p&c`v z%W%x>FbI>G2Q`d(Ex3Osl<)oJ}rZ2F$9oU4k{aU zY9EH9M`QUd4g6?_kaJb~-u>9^Iy4uWR&TN9o}oUggSZHQS^9V6-_TlV{aO>VLn80ze6wBm$}%;(ICwloiBnkM?;`mzMfd&BPbf+!jAkFTHWm zL!4c$uD>Kabwb-RA3m~~;5^z&d+pv25c^Uotyx(@x~L;}Gb}O1LHxr%SE?7)@cXF( z%aL|ngCNkXUFua7bYaO?>pOAzhJnYyG^N#6NeFsAGyZwdfVsxgUk#(u$k~3?y8JdI;=GhMG9|x%s-)DYcx^gQEMix=0r0cXu}_%lkpLhF+=rEJkSP?fEeZ zLhM!pgrs;AB39IibY|7!+7517M&dia6yR4{q*vhs=twJ3jqb%vAO)Q}UddswxKVAc zA?rtHwMcFAB!Cmi=rLe#A(w^oC6Z#MiVBi0uwv%ZSFa=|K9OXJcgkYUV*Xwc)}zXBuNK&!(PVOjlhH%b{&EwUGrh2~k@|j4*0X-!l zTsiLZtInHeaix%>Z*hcs$DMLVcrl*HdT`An-_UQ{dA~@ye6|f=Xq%+`vFYT+;Pcn2 z3Z3ll5m$P@g0EG!>A6gHY_}Mu=Bami=}>AOX>5-e3J4#?^H{${eP0QzIk5g-Ha5he z_X_U3tOZJ0J@wdHXSQCSXxwhi)F15a3g)~pxQlK^_D@~+k{9j<05k(S5A?3g$;$a& z(;bokn@qR%SYCfR$y|W05Z(KUK@2f*EU#Q489pEpGij!E`mA1aRJror?jXJw$GiAd zS(y4|2R(AX%`)F2lGPamY{?^w@`QIi4{ zitwpE(mv8|UF)Uuz7416KE{1k9!A9;pvDk-C4Bj{pcJ_grH*4d<>|eVWn49hSTQlb zMwe4p)j{VKe%nJ&58Ocr1XtK@R39sM8qh=5IGK%g+LYU6_2)gSM-1CL2qSRwQf^fc zEXcKc;%)FFyrNKU#5m^es+&*3Tkanzk?+SgUs12xwDzPIs8rI3tR0Pfb|#`=FGT>P z7X&y;bluRz?KdZRnz*>3*>%cW4n*%QTo=YI@ho|*#s^-<*~dsbe_xj#`sGJ!#=&o4 zV_UmfLxaKdqHcAKnI*g@wq8i;-S?9!8;(v4h~AzbZG??{DZ(Fq-pkaUPH+)_$+5VP zWph8clSCupN7)pJt0b+RDfVh-^Rea{kAJdJ801;yef7Tgzyo?+AXw(ZI1;(AlDkPf z439;h?N|P~LNG)xA$p}lGdVFi@xzR)A=fzuPG|||_ta!)8Sb`{EbNBV9-5>8^v*XQ zGp=Bt{z?~2>fE}XhciOoJH|@r4T4 zR#R^;1GTpjk%&`}O0slh0Kv1#rrHT{>sfu*cf?gItkmK&GRmk{CxFLreifJ+E4nb|xk-Z@i|dmNk7tPM+feW! z5#4wTz?=Ehg$nsx{og_5k=hxJAgX>jBkf*o05|iA)+iu^Q3-HT^aUWp%D$$cx?qoN zO1``)bl};_Aslz$3M@HG=ly+g;Xv9P$zCLanAQ{15of#d5a()`u{$}*a?Y{$TduBp z%cI~qYhmXl1C)p1cfxS3aTbZvG89dj_kp{ONU5D3o0xcZqgr$|$=3sS8XKJG+6QXC zk{?$oU22KWFzbyeF-2D{^0T@xjdd4;0ugwU08D3s zK-a?Qre3z~salfn<=$kHVhiQU`3}*viOp~X2BD1}r#|8uU1`&aQa~xhoNWs~CkYlq zsJGFA|50E&KK_B|dJ;MAatp<=rEnhlHkQ!ewOuEh1WOk&WZ?uu6TrIM`rY%cUh9Ld~mz?(kmX>MQq^!Qq)~$qjRh^e9IZ6HQ+O-)h4<_!e(SG|;Noy^vXg0~a zkER}2^*cz|9KU`+(%VZ>k(Zx@19K$yxnXg7;+;!jEwdLF{3lFA9?~lV;nLlrtU%_H zk$7jN?)GVJMj%B#OoNTWOr>uQTb7nB_Wl8b?Z*4u<(pg|aI>|fEM^9QGaUjiF^^TN zOki;uv%12SF*0vBs`PM`{`}ZP;ifopzCmL3$%X3O+IxsGG0an6R>BhJ<-R)aBg2ls ziYs*XQ%EAJc1@oP2-xSH1ZpnZv1(+c-6XHa(n(RAldnj}L+v4Ixs}+H(Zjm+@5?1} zE9Y60GxcX)JGWP>c~XTd)C~?6R0$1+D+qP2R5)ZU&m{0HKROkt@4dcjGZ6?pg_$jr zKyM+2Mh9I%wSw#RsP!hrs=c;=>P?+~JvVGn3ih>2BHcj>HJjbHY09AtJ+>~Y{#>+7 zbqLEqdKp-cT9*07U1Gam6HtXA!p@>A!^SSA0xm06&+WD|Vag6M54BpN{AOOr+W28H-c zQWM<^G!|QVx&(*hg)7SN2IabFU90&X<3pQ~{4*S4tMOvaeOLU*VBgl;3&WRV7teZ> z%zNutVTc7Z#@=IuS_tW|Z<$u-Tt*oS2u+H}Pmws!mxmK?m~8Y{^z-qK4^v~xeW^~Z z7BMH2y9=(cJjkinj_kB?nlRZ+!u3@Xqq^bGJi~X_9w8n*2bd1?N9ec)mt~0p}I5O4?XR zM{68?ygvb z!Hv4_lKWRRGgG8gErnsM#X@>?rd$qiN2@uf1XapZm2mHQ%NYRV8EIRr$?+HAB`s+B zCC8ARJ`NDha9~`;HW3C!12NV&tXzUS-0T{0MSk$qBtt!(I@@?D9QfI!;#Q% z)tSvak*lnbXUDSYa0V;6zv!19L!O+t)0N~tAs+B`^_fE6mGs1O__kZMcOWRFq}|0j zue(ipinrTW3N?ySek3P;%;gNTSXb9#WxJy>%>VA|ewTS~yT}i4;+HB=zd!oJ6bu=e z!orB-S?IF|-WsRhEl6_PoQ;MPB?9Q`MWVOs&|cr?D$pY35xDz6-yUM?l};B+0o&Ni z^fl179AL9maL@iR{j-xzgK{dY?E}3#)^s(SANjVlwt}wXl%gVoCybCMPzs2on{9p) zjfAcV>LXu2IgIbIOqFyMQGPs8xcTsY@BDrFf~2kTFgAkhbHMdR4rd>n0VQ}5kar$b zra^LOR`L?bN?x&-d9}zK-AQ3AMbCFqZ#KK4sGsU&0bRlA(;ND)P;Q4wla91EQ3^s% zt<=6#z%*x^1t;5d>3{te=Q=r?$3jBb%5kzFX+%grg2Gqjv};0UN)vz02~-GI9S6ZK z+qXp#pDt@M=_V}cJ8rxL{k@Zw6HGG=T7TO0pEHUC{-``58nQG0-Mjd=pAlHHp!ff= zXBiZl7gTfeWQ_;Ij2v>?|3C4mJdB)j1KAHXd^(vg!nBJjPfsz`Zd`4eK2JWg>8~gL zF1!AjX*lq9WhVtm>d#)ww2AN1W&-Y(l9Ru^UFqJ5|8Tc>Lt){KD)~6EUVe?jn0%zo zZLJkXvrPTRQ;Y(;k|8c;PaCzsCUE2R zk=n5k*}q^#DLi;c{_}yd!qix+{Irw2Xs8eBL5_3;@Z&829Gk%LlFJ8PBMZCj<3bFI zH+>z|8(shmnd7VDOgehSo51Aw%NP0yM=)Q&oN^|O%?4z(L$Snvd8GgT-U7_#SwM;S9|`dg&VbbHEExOx;8d;(i)lbo_iGgJD_Eck61usk zCV`T+U(Hiem>Rt=m(kEi+G<9wAMKt}F0By)Tts1koOBERb9p>P%nSZ~{n^Y{OHv#4 z4CF)eom%RumxgAWwYm;)GVVz{CO=qI4gCeKPTTffP$+yT`oHEj&co0mQuyX z{;X%16#mW#LvT*2Rew%Dp+gnGQf>!3g@ObtA?2whN|55&N7^W8KXDQ(DIcE^K_nv@ z%1uL^Ap__F`)d9p%KcVQx#lN6tRzMJTM;e-j_u;P)3zXyORdrJ09zj-Zu%_y&hL{g z5Ws9QYL7|20nys|0=SrU`=SC}2!TbNt}NhR#pdR9a7na0Q}kfuGXugv6|!pa%oNZ;b*I zX&{W{eUJ_vN}B2a5NhNLkUvBTyzq;-HIq8sBKveG!p->xi?THFyD`|S=RVB`Jg>+; zZsX%B2fkHc1TAsOt-jF0HHWsrL~JooLz-MbYRJiVgXAMF{$8{24A@dYVNDSzPh~1| zp5+WA{3MuwJBmBIs|JdtEm4Ao4jm-VLl=%<@yq#HTyQ%C$#VwU%gC2sV0+W*_{G)x zjZvG&Vl??Kc=*C*mBVqyate4A{<1~1pxICQK$sP8d5-cl^{{X zNg%XZ^uWcEs6fOq`c@f;lFzZ4pViaZ*-52-|C$#1!F|ez)6lOULywBEML-a;9fjl# zAD4>%Dg*>(3TE=xzlvL6_oj1SnI+1>=_9)6`tc-RfOkvQc;Duzjoe9@}4dcIkddmvlf{Hx% zpEVH`klo#aB~ae$F-`yN-$U}}Y9osGOSnp8htwHle`ktI0Xl0sav!tpr+3hWtI{0^ z19T?1!BfmCv@#jUE6haaT22?Yd-GiaxB;| zn?)Ew7gOorvtFXwB~amFw2d`(%G==sSpZsteA>-abwz|BsGZZiCtW&pZkU zB_fWB+}Pg{6oJO&`w=WJl^-Gb&@1r=I9flc<%)r zPz&H2*NIEe3AJ~m!Np%UxY;GtM=mCva6V2${hP=BCa?r6c<)Nj45|M>h?A$mv(LHe znO|X`1^)LV|N8U^dLJr%gMYT9FG7P{JO3Q_kLRGa(jbTsIUnLrg-Rvp>%pM7JqZk4 z^i$oPa+NckmnI_U)He`)#{f(TdQkh7d1F$N=K&wxn6dT zTD}Ey!plJGnjt2HLE{DOug||=gqCdLgkAK0y?EJhJSax+r0l1!$DBkDd1AkfbAo9q zN)VI|wugo5*6Qhk!z|t>`1~SwhHyV1=Mdpi#!1eJvEVv;5PHmm_S!&BmvzylL*?vx zIDiZU1tg)*#ma!kH0|{c_dJ4wXoYLCctJp>Y);JOH|r)Rj#C}8)*U(UuGne7)(!Bb zI#{k0320DkUlYpmp`hj~@Sz73d5JIW0X0B~NQ0i3d(juv5CvXI^aMkF^}gd%+e}_;nawANMJ>L4JZgYXwG- zBKA!+w}5qhD-#-@a(54Kv~WHFQ8XGu zu)!j0)nZdGC>4G`W=W~<4Cl}-?z=Px*Jr>RGatX13P_p!UD+V!Dwt!02p(FF+{{2W z{uqj`n6+i{HpL)UG-rg06gofOV{;C*l*s@!{5aXyb%ZEYauHD+T2(DkoVrn+7$d1s zRaW&PD!v?PoA~TEg*p{sV2YK`gUjR-hDVDyS+mqW##AB(ZS8?9YIQTVw_fmnx{&EJ z2AuW+CM3UAVw8VA&@*3XF=E-wDJ7hJqTL2ua-I8nx$f~tzIOa2`hX# z-{_aXlo(*e%3kPo*Foqi7GFt_XLkVF2`G(kO;VxFHGJQjllxgN%3vD1a{W)v-{_ zr|z}m>T9Ub2PlZ40e<4AKr00?@+|;Q`EVje7wS%v0i0p}x8(k(Oz?;HjVd31=kx#O z^Zyc`Ew{kF+@!npiS#qp^xMiCQ00xwE!2PVq27hSrO1S1fCx|zSjmETmNuv?#c?2zXJv^TqOuBDiGQi}e~wub zI#eh?{*2V0MbR@L?*E6L{gzh_NZIo&LUtao_wV-%#V>8;8P7tEzn zq1~T%TF-&`{1-|8`s6!z+N_8&!RhgKsnBf?k{K0Qo^PhbIQhxiNdiE}x4MjqrBU!qV5I3U&G|m5ev+&D# z;BMlTBJ=uG4YiB(sEQ-Mi!Yfy&lcNlhUU zsNbn1umFqa;%R?6=%dpO&uRlJK3}8gJJ3bnGrB&P#r++M(+sAt%%DJ65`i7i9&U_2O49Wl>fi21kuCxBY}#k)xMLT^R2=BICgE8y zR5TfeKe|% zbo#t8YO{}Y$Vu!wCo#~dDPU_d1XRww%$5NykL5k*nR(`+`jDVvP=7-Tq3`_LvZe<7 z0czyjfzGGd$4K=+t~#nyeD*1|=r$vMX_ITRKzZQ%bspI> z1gH(IFcwh6=4&48kxzjZ9B$P;Aq5ox`MKGNxR|R_V8Cag5;7vFd=q?QaGGzMcfw_<1Ajy9L3MMPIc zup-z_XTQX1%B7T7A6{>bTFx=P{dv^I^GjFYMQ;>FAPzI;DfX!Y94TG1nJ`4N{bGiO zz~f#|@)&IY!4e6y;{(D>ksy%ti;63x_a(lOK965x*nu<^L(~a5JJQ_hY!2|s{!_|G z#DgttK=}JKs(;=)LEsOS5iA;x8$Q;5|M75xKafs>=1+3|(j?u2Qx(TlWDXB3tBcqIkMb2uIs_JfODeq930=2*c zB@37(`eMGrYZbxQ{ZCOf#noT$zGhVFs{>@Xk@wuSnMeNZteS4HLHxPe^lQxD%K`>M z14+BXIFLF`{>5H7_}oC!UuE=@l8s9mAGPl>+aK%p|By@cmz4>A3vMcL`KcQ3Ed*Frx6M95$xvXa8H4PoHl00{!i5&IL4=5 zi+$PoP8?6NG(W2LmkHW#5nf|XvAwZy5t6VIv-g|)cg*E1ZhaSg##jByF2!QxK!|Pf zt$vTc2d&8xqYYZw0g}kaV)?)R`C71l3#`6oUIoyFErmAaow_g+6Wxm43~J-m#OjSD zBCZPp--ALQPjExTW+elJf9NR>RRC5w1>U>G&nG(2$)uMFfm!xUf;h7UoI%kFD;uHc z{Bq;CM(n2(Km(lr*`fj!gA_amo_X_aQW13{O>Fcbjw(O~Ui z@uwjv1_6Fnoot%yIo`GWN7Gj!FUABylu8Z2HUB%N_qYnG?PZ^=p9H z@Y#rP()@vj^mc#{{|kl!*$w}Dy;h~1b-2Sk`Q@xi2V^_aW|1enSgVzLbyg*fPUUvcI*NU}q~-bg$aeEW}6$l?b4ruvv} zuK^U2`xF=$_>*gc9pWE}??iXy89XUZKqBOhGMLj-T0LmTGa>&fz5HHZniqa6;+H8& z`2N19jJ$kQ^UkOS!Z zwpZbuQ6rDEke0DqL->t#P!f%PtlLzd{nYzQ;d?OcmiPT^Mib4eEtG{K9ui_Diyr&t zVF_r-fdY+Nq+*`RHExTIr#2E?=dnG@Ep^4->o;002DF-Laj~BGU(}5ojEsz}Eb99Y zE9pd47W&$wB8g^N%3buM=(ecdDCY+b+xN6kr{P1JWwjEXYKpmJcphxuiP^@Q)(xfE zIG?)iKJU~sz4kzfP4rRJk9bx?y`zvHu{*FLPi!1-G$8!#ggrV&7Cy_i@8;pt?Wn|X zLggB+s4lCJ+HqF%vDue0IiU=jnNK6S^bgC}6GW>uY90wWM;dk^A961aL{hP^6nn!G zJ@+Phi{01v4R(jO=W@NKxy^g?qnAeEawc9lxMzxWk$3-w!7iv8d}n}`L)ayn2I#@2 z9WLXoO@)?$pvE^tm|!9KV4=x}=A$(wWHYv**@oh%nvJZbJA-O@RbtHv6MM3~2pR^T z-p4WACZ(QhtI|f`V4=nh8s{EO`6;2~nryWxI0NI0C?83Erk zePRO+)|(F?8S%(6dhBteA>Ls=@^qk3hiNRxTdt-D&`bU&VlE%0QTW2JRlD*DzHf1u zM2{r~CSSAvc%E-gGCN#%Y)DJL$eSwOA|t~>zv3Cb?{c=TKznszts9}8P*424ht$H^qDwrj3xZ0@j1qHa0T{AM7g?oR~a) z{P)&N@veLX-Y(|r^=r(3|6O%B_hjJYc(7!S`(sS}=RBL$L=5A7M$IN4;cnfrg(^P# z!?ltrP&zXd5W6ggg_DSJ1Zg88r%RXuV9l#u-(#p$1T|;8#l_|J+^{M(kV~Y9md<#Z!AAdjVl%H@oaPc#nHyyH-}-MmhV-gPe%i?4C3y;d#%& zZtm&a5Z&Z1?rmDnVx2W4UT54uZuCN{)z2qdE{nI9J?J>aJ@*pNXnb6-+sUq* z{IN%jfv0Dr%LQE0O@pCEHx4pa&nyVdjkHf~<@%)h=IwDN5f*7VFK}`UyL6vulJ@na z(4ls3?MjnZdv^II?9{bo7NCXd`}PqYqpObd zZAOlV6Q1HoH}303c*zc9Z_x88TbkD}wA%DZx?3bW2Av7mh~jhvWm0}bS|06}mM-+w z6Jo(>>gnF$CI)qd=?)oZUt0yis|&kpdh%drt&hlv2N>kunD{-RBev+ouL}=Vadt(T zt_);S@msPG#-Wg6KV{JfzeJbdGbq{rN z`Ch~iaTp+?y7EZo2Vq)HD>uW%j_5yi5qxI0`~;V;PU$*n*{eo1Vl!M>{d9LPT%ty~ za6g^MSqojL%dMbgc7H&f-PQEu6RrfWdOBV~x6nno?RadybM=`g%X#kHvv@l_elPtI zHopY>V2!a-BQN-)vD@*fgi6)C8^N^|{KYjk*snEXns2O;E~{aU59&&CS3Mq95{t+$ zRU7UuRrg^(7#gFaV4U<;(?j^aJqc-1g$}I&b&GPGNl2=~C*oYSmYl}T5%Xm&c71AV z1>vUA$!)z=(H#cOikAg>x-|{cmdSN%mc05z#9xO^-(ks#KH+HWW7*@yWcX+D?RQ^` z`&=m1*AV~OTXvU(3wO8a{J;MEi_Z}K>*74vKs24N)t{vG@D7N! zuUT4hx5-GvZPa+-jdD3#JKEZ|5_8rR;;c=4!=k7jnH3#{h$3c}__&BG#w~DPgPIEE zMJ1=wC~kFZZF_G^`K-A`dki_gmw#4siHbxRwwdr#he1GB=ab=@+ijn=OdfA`r-2=< zq%%SRoa&o>S1C{5;N4fk#dd5I(Z{E+P-$NuP?{RdxD}H28<(8@tR>Mvpc2J?ZaNZE_@yN#*7mt!XrB?sQPxc=Pm!kSlIP>Us5FWk zHBwVN{T92Z_B?7yJAVQT7pLVx+_ojQZ6q^58Qiy6wy|ef5oL8InlPKaqS(pVAXYCV zvKO{!;Dj)$yG@j*Sv>TD|4n}I40RgH7Q6h6OxgZYHr2Nx-nn==oo~g7LN_vL)y4`I z%*^K+rS!I4zn&4c9#E+-O>q{~ZC}*r((4}MV%;cf<_}=c^}cPM(n!+3UF>YBPSzE1 z)7?u?XnUWHLHEtO4$H-hC#;W@w-hXwN%-4eK2g*MHioJVe^NESgy<#I!q7eEyvSdS zg;v7R3B8@xsOKmH)D+{Y*79)vrGd;mc{PFD)aa_3p8h@A+*{N<#oN3*awc=rJlZ_` zi$Z)-%lHcZubu-;1N>2W`FYkMJvCt&Ug;%>ba*zSrJ<#z+yUGgX(oK*i+H|*#@JUe zgVw!3LfU*1O}eiedA6ED`w_oZsFsVc57^LqX;@ghsaJm(R(G*JDo;Us3?XLYg;}ul z8VdtnI?)%cqqivne<+>xSk>@at~P4Du_S8J+J-n$Red(ZmdXD8ObIR{{U&}acYAQO zp5kjMt`zTv#&dwoaQ1$_4Q_S*+rmiyusKhvzAs@V_D zQ$6ju4yx_$_6EX*ZIM!mUcaO?t6a_B72FpnyQB47|64vgQNh!_7hz;8gEv7{m2l(T zvlOY}u4(VQpOuZjO~(vVt6BA)-Ii4B`kMTn(7vkFu&`x;U{&CtLfi*NOfJwbA)h!( zeYYg|F{yH|QO9<&C!TJghhEx{m;t2m*n~R08?_Zbc#66vb(?s{)qIgNlvucG%zIB$ z`;8zm@2g+w9l}!l^K`3~RkMp0VnmLv=BYD72D??IwX_txMO+GcT7|PeP!1lgldS{A z+!jk$;$93@#c-ngg~-fwWi$3-y9i)rMV zs!AWC4ayKQtpprdQB-6#`WetXd@t)G6&&XQv-v$SNc=tARh*6?sHdJaYz1 zZpmd?7S>vGS@UwYoHp;+rDY$iMAC-D9r1K4{BmCx+iAyiR0}Na_7cKaPuA~(5Dj~O$ zYl@Z72I?PbdNj}}YKr=r1zyGqV1W7|<243c+DSb}euDIx`a{KTB^QO4$;?qjsa3Tq zT}TJN{q?-mOD)<%%mevaibIcBBa`e>1Sx^x@)rAH949s@+3oQba9PSurg8sK6As|u zHMpkm4Zf>VH41B9DMp1KwsHPpvjN+y5A-Kfyja_~?G3x&JoUZe2ilx`6Jt{xFN(-)lz6z?>FhzJ=VX1sO{M!9q=)=<* zYWbbv6`Qvx&$SjrGit_2wMW$Fln{RS{zN&W;}eWZWlNZ*CnbhK(COArs|iH{o9KHR-$ex~W(x-Ji}3F0w}|)xvMO?(z>E%;V5x_ZQHiJlp$5avE8I9d|y51*lMDebTO7` zA2Cvx5M^Gn#+1(%`@%GieUMI@$rUY^RF3Z-+Ne{_U5)&bnaCNp0Cy_+lE=>08%1-t z-q>BBqaAGKRHUg&3jfG|yR)F9pgZc`=+=}aXA*~PspdO=%N5}cQyz?7`E1#Ww=X}( z!Jc1|)2>xTT8B}|b-%F!me|ibQyi$4l=*NBcYFJ)cOM6GDMs^7I1?=NMYImfn7Npo z4}O=>=Fur_Epr^KMAN}pFHRJ$;^p&mPiwEYrPq-(M5OGZ;~=)Ie8}AkPRnm;8QOF& zGpht6y;49V|0$u;?kxwK=z4Jy5@j7@rrRN)ALm^;Q-Vif9DXUPugJvCUhA;r>HN{y zDXwm)TOu%jq{ykyN}}r#+zv8~9A0srLb%&}-iu_{tV+8nH!mHqm_A*WaS>%n#Vp4Q_07t8|Go3}eQ(`Vr6}7MM&{@jz+j; z=}_#LC0z^HGesr#^79sfnlO^;?0j|y16KAC7tto! zgL%q}Z2WJQW5h@49henf%GoW`Mw*y-wV70DigF~SH~WYxMRg?niki@~UwmW3Vv||Q z!R;_}lSJ1cI8VE%kE4<1Fc*zc(pgmIr|uj5zuNoGpeEaHT}4rpt_acu z3nE=bDN`i8v zgW0ox(w;`nwq2Gs{X@c*V?C^rY_Vo!tf;vNy32Wq7s3pxo*oRRNmF91^G7Fwln}SH zx7mdJkN)Q|EMi&d{@Dq&|9Y*mQKnQ9?Ud@Ct{yKBcbK{=>$`D1abwp8Yi@My*cRnu zR1^cJbREeeOiayEIuBPZ_`q)7iPMD3DBn-Df`K>?zQo{^TI${@yqgi2NB=dO2=HrlvunKlIvOFq7 zZwmVG6Us7_b)4@{Q4aL9m#SIK1Zvc?1A5+Ak-h|Uq&f6f8fqsBU17UxT=6x8c0=^M z?dD>(z;Kw=2&A~OWuaWl2UXhq(iN6z;)^aQR@E>->5VudM2ad{UpYUq;ug1&cAV(~ z&-kG=#e!w^d>IjC{(GXM>Xq634!<9>FL-wvaJW{@hj%LoM`meyY_fMJPZEm_^35-E z=)+010v$_=yCuWwnD}hDnW5eB=QjPG1k0|mGqV+YE6SGSsDbJmq0XVOd^_hvxMjq2 zA?}JpA*9+9x%USd(kVG8ZXv30BJJ9+zyNK4=<>6>rN|+zLA$Y8&e`6%4Lw`9xN5ol zdJD9~MWWR=plMkCr%xgwGfCVijlA_vETVj_P#)-l9Zl|$S!N%C!N~rE3|7}0#Y{bxmuWvbzr z2cuS@NtHhNHq@IQtbxoDvwhQbrOY2P(4c{!&!L4nVGM`8uUQ<6l3GC1s5G?soGU+K zp@7borr^HAKQ<$`VYO?GX|Lc_!Rd_4h^cIXjcrKV4cDk%{s~;<4BSk+v%~I%SfacE z7h*x!qL!4Leyh^H27cAyLy_CC9pm|>Sm_HjhO^px;(+_@;dwRMyKc6^b;-Pf zT+DfL>9-@{x+|%oTEp=e#)aK0C9`J2IL#Pob2q(qEgy=`;QUmseY@ZP{VJcnoXu8c zx0#|VMj!1I(sPb%S5^O+u;+NULg<+y)Ns%GsO@`uf;NKNZ4CB$Xo(B`CX;+6Usp0Q z6JBTDqgbt)Q2w&5$otvYBVXsiC9<@0+>%nDhWQ?vP$Y)*N0^kZeOnx9F6v@;+c9|M z#=gj)h1f1N(?cL$6QUe3d!54)Z4fRSMlD1VDRs2QEDeS*L3t!5J=j>G*FFyRtdSgk zb0v}S)-~BRxi$yvUB!JI$_#b7%RZpVr@CD6xsstoss!Ku+$l~<7rFu4|GaGYB6cg) z`5pY;u~xq4N~s$wasWuAmX;;QnvH4mm=RcDYSI8}4sarZP8~lh2B)0`+grkY450bN zW^?yaLcn(w7P!q}%KM8;bv+cLXfmAA>OU&GS*}X-kzB9!KexNHLJB8K4jpqZAo{e* zH2mwKTdMoYJ#^`;x%R=7p*l*ZmdN}Y;Ifv8anH?_&z+JxIz^4L&;KB6@%=>vpT@#Q zt4zB!ss3f?JoHQHJ9C*bGj341b-9zsuUy?5(Ad~d-!-zMZ#r*voCgY-nrZEB$r1y@ z(Fw%`BOy1SHHG3&yZbaBk;oM7@~F~<{MMP@yXWP+>?MHAjXbsW=V^k*X-YkHSmy$l z)Cq68=2O}k_@J9w`T^X>Esjp9lssH}(ILZ{;$xlsHri1p^QKnVH+JMRfNTVF7slo< z$gqmV^tNjX6KGS5xsE2$!f#t(SY!X9!{{#7%dpbC&OUfW1K|BfPal-xI&~3X8N=-D zgsH(FjWNm@-M=H#px+OQQ+WZ@M8?#kTq?&b(}@$&>XO%D1g=46zkeN>`PhR1_N9g9sd(R zq3rKeCBWbX0t5!xB$<3T^?MXxR9Kb2(;eEJ9e~Q5tJt`kTnt3z0s!9`*l~zhp+Vt? z;@8_Y3kG6Md-_*^e46_=B^Tc9u8OP?2kzqs(0RY+JDQ_*9=9+l-m%U`x3<1D0+kx; zTIb+$<%Z`&1MtR3$*NBqGy8@Blx(|LCYc{*dPE{*&7`1P27^k}+d!qT|!Q)y_4S0_w zt}Cel-;Gfkg(P_`4T1ubpRnz$h}#aWCVKRVRa9AM z%LJAfr3;(^T<^ZBU@le4hLKD1qxP*>Vqj0`pbVPaEL#o3RW z*LlR3IgCDG7d16CSpQHA=wcQ0_a??H)l#flF&dCw8eb)h)NL~P4YM4-3CLSC5ld5| zm)-Rtns=xQo6lZQ`1q05qgZ-XhJ-};Tq{Ls$7td{At;@1n~xAQMsj zzLOVTUfGy`!bc&D-Un)aanJYFWcx4o2xiWT5NPS~O!C&j@+7SUuBBL&bDHdy)obezGo9|}Lz1 z%Lmf|$=3()O&W=~m3q7H03Ce&!xR*^_e9i4x5uX8A-#&9WPd1_k~uHhqRu7CSl9dx z>bSXhCoqUCaV-2+Kh_>IzgVp%U^3)HaB_BP!^2**J>lqw;UsSvRXCeq;U@q$5*Q?v z*yK-FwLjJcyga9n82Z zH0OOq9(q=@e(G${2U+s021cCsm_))rOkp(puYf-xH8VuHeQhbHk?*@+=HtKL$*c9& zn_F3Z-Pv8q27+vOPx4F-Wh8SZkKH9A^Jl11X2xl$V|_$0Xm>Q!Z;*+3#5X)SVAg@O zUNaLkFSM`=!tPlZ^9iHJgwI7N>N7-G+ylt<>sm%FmdVry-6m_>C*gWv!?$uh{?|Eq zgXatoE%M5TF*V+1U$3_SbQV-+Z9Cq+fInkeqtuwm5yL{iqnRWnxoqsmEP5n?*DI}h zs9e&^z%qrzB(h#j%Uo+?K_U+p^o+M?QTnBy1)V;QeKNdsRm%flNrL>8xNqfHEY^iq zRWS+(<$6$7;8+6%h?h4yz&R^{R$mnKVF})i@`(AliEejJPU4m+%MxEGv_J)pQ(gsF z9xc_}PGEr8I*-+YJl4ArWe~N+0nl5H5_itz*E5M&_FDc3MNeILc^WcTb|i-!~~W-=VL0%*u98 zl<=Qjr1&Htr{gp!0|++Va5zeHK!`Rf{E%rF*LiY)UN4;WPaEG38)bUy{sW@g*rE-@ z*A(zd{IadW;T7;w_=3w4Ah$;73^wXZl_$qr+KYLYupB#{-JDsH(~5V-SJ|ga_TD0#!XPKVgYb-Hu}w!r6roMor{DAi&+`>KYoJGbTE%P&1QX zP6K%P%}sAZbx<d7BM^s@z)&5ilP2oyyX*KAJ#!;_~wi%&o^-sGsw>37I@9yLiFx z`^@m#@*qt)5aM zzofoks|76V{_O5AD*C^Q;XF_JrHB-5H7;ZLO%oRoN)vaH`IjJ}?vtD^!Dkn{h1}^Q?;bb@iA^P_%mnNr7s)Q1^SQKHQo6az(Yi=cZKr?v<|H z0hXy@;BHwY^Ha6?6|k6 z6`POFSTW)WBcQU5a+|MG;~j%X?u(?ne|ob7Y_Ul2){v@cg}NETQhfB*u5O+DB>L8U z?OZ}-qUC-cwRK>MT zYup&pOK>s*=7c>>>D{4?oUUw8ZCh}yGqK}cyujl#^5AlpcMY?NTUl*NutsW4El$K( zRkB2&(Y0lA9?JjY&*A%=84Coy4z5^%K zQ{p?j;NulyO>4bx$v_cNCyi%l{1R}4e8Zr$%~1N@-05fXyD`C%OH0~I#*el^=6u2g z$;KE({h`}}ljNwgA051#PxWX5p`Dldk{(ICcF$;iw!aOqn+)r+G(BRQeo89k@XwV( zFQm%t^GoTWX|DK4Aj-L3l$0s&uZ)pC%yP+Vc%!7T7SQcXnjny0f`!l5;l>G+L>(8M zGA-ZpIl_0z^{Zi@+rXPl4n3wWd!3Bp_I7d$WzK!ZqH4Adsp7JWBc-n(PVkiH3js62 zpBDM9hco_JU=ljbBX#RVv} z?Urtz9?bbTO&l;X;QfLpjhZUVDNvNA?ZS*rRPMwZsxJA5Bb>z+FvSU_Q-a6wD-Gdk zYQ?FerYNC&zTs_f-k2|GPibE>)z3x0)OOK)^W=7)op7=bKBDM6JQ;1qp z(_H!M-Qy2wsb)2fvaD2 zFv)MbZ%{X86!>6cR%>KUxAwL>cs@=Atc2J7K)jv;3w8{?`YrU#lrNI_*)WKGJg@J2 z@vj|Sd4erG-eJjZJC>B}z+IliB6znCzWJP?d0+&OyOEOYTt}ZRzJH!H@kcw-EWguE zc*Ojg;h#>5c0aEx{pkvHeldz*w~V!;^IqLE1BxbwjD0K4U&JC?2wM))saic)d-j47 z?t&rY{5=7aNA?X(1qGtA6P0&E7T}tE1_h=wOr?rgmqRHADuMGRLSZ08Vgv2tg;1%X8qf-14`R?dUkugve46@UIp`x%}0%`iFzM*^|5 zX$;OHBFWE@sB~u)U1KE#rM0};q_mvCBGwYxfi^5~lf>1+gh_p4mpR^_7e{){rjNpZ zZFzHyCSsteCc(XUuOT79I}%B(!*_4sjvP7vPF>}${x(jxm@Uc75#u|{ncaTP?A}6W zeHnRZ>YEp!ZRdXW5n-ujEdUETR>pzf4Chf&TgvtO3bBL5av%+6LmbTTY?U3O|1O zq*r#eZ%NXyXOruegUJJM^q7OQL3BV!g|hZC(`SKhdkvBkMT`Dk++(RJbSP`47+EY) zi3>Gc&~T+N(s@wlCe}%zrrW5p&5qHS1wI|s(jEt{`9=KYNQT~mv}VWpsIGS5)YEXd7c@ic90{s399@X2Ub#~t;^;T?n*7qi zyWlbC>()xA^ysy2)N(BS9tb4$s?TR5fcTn2M9=FrX{e|d(Y|Y$AeykaBqiBLECx$5 ziGdV?D8m-5-(r*qP$$DblNrfEaRFspzp9_oXBcw>N8|`Mx${(y)Gr_$pn6faIR)Dn zZtNkuC=sN>O+{SW;89o)&@Rsk9KXb zQm3Je)E>FIU`u!hZHl+rs~UBpX|^M=Sfi@XRvD#88o)fe&l9k$ z{UDDo4rrfTkB>Y;Q*x1~^NW-ZT+2Cp%1Hg|;x6%isWodPra?wGFdqoLb8eK;MQA^; zuuZ-u-Xxo(uuvSm;1RGqiqvp%3k>Q|hvNqJq1GaK&sic2uN?sN~?#)@w@)eD{%S z<3de;1Y`f5E6Z@ z;R!Vum_?AL=YrslowcDUs!8^65h7Nqe$i2tcZWcDKq{CkfQkLjg7{?S4i^%k0T9be z!D_6B;fiz{fRI+Vt9#esY0Jl{$vHcTM@_Lia_PY#U?v^^ zc*T(rh5y%%J)@s)juf3AfI~tD%^UH!8p9aj!k~(x6al!48Ls%^<;y=Qo*qC!#hgF@ zCyqKhP>k_t0=_$&8pRrxwp(~7MI`f%nJ5Ox1Ru~#*K1h^GIMkm=f0FXW~N)#IE_@Q zQ$d2*xVS6Z>%>oHHNNPmMEJ}A1{cdK=K}@xj67t_RR3hU>E6D2libuB$%vn8P5%}X zr~WBhA8T7KSN7iNccm_Xm>7R`l==R^vuX!MKNDTUM>p*{SP)_AIb-WFoI*k0HZ;2m zl(1sW)xD3mwQUCqt(n!WoUKd1;QUp$)(8SWyA|)BMsPeT?APC%hD%WK!{hCfM}b)~ zehQFpqrwC)mQDs<3a$@1Xs3Ug%yPhl!hOr`Pve3#bSe+h-<${-;vF)m_FcHd$lafy z&oRFFgLZu}jIuj#1wvVUyCNuv2L05E|CnHUZQp+jd$YJH^ks^icY#3&@}|giU!-g8 znz>5%>U3Xs73n#q>%;a^m8MJe3_^KRGwGJkUF69N{*C3uokM`kIkzowWE1A!)UK>} z0L(|7E$usbUeG#Qtnv(y_^lr7J}DTP7YM9h17a*&JIB}W)hq)uUPa9kR~JA%_GD_z zG2IMmxCf|}GQ+H!@{T>i!NDabdgGe(t0h3S=;IBG7*BXT zP)tqU*MGqvycNlHz6=xuPV@V+x`Z(SGPMMXYu63<|M(JRe@?glJlTo}btVBv##ZU6 zt88+V!>gdK1ySy|`Kof0oA z@QjvOa+)8`&c5^5V{Noh@*H7HEXS{LVmDIqEjdjE%o|5k_>mq@2cUQCyNz8?htL@?$zbn^Zeh z{eI>cb2gfg`o&gx5l^dg>0wlN4sm zD7R}fH^)1-TekH*YtRcdGC2ba076k?F$X?ovEQbEbjldA)XK75g#TP9^M zB05qfyJ;JrXML~4x~W%pV2JY^_z|G?a-1|S5Z8GnNh%<##?Tay6*z|3NbGWhgWmY; zSN3+DZ7pDKzcYs)@N+?A#INl#E8#sRnTWrBGB3=9zC&E`+Y5aFFdq&#(}Va7waF#H zS&Wn9{(2$=jAk7|I22x`KbD;;>6=(Z@@l zk<~{d5~N(Q!knD*W5tJyC#rwr9*SuaWHOV zieJta$o6VWcP;n&{p^mb_QqH8 z>!*z=nDMs}KUD;5`&8%;qQOc8MNdRx810&q&~p&Hn`1{ zFsn;hMkWX1)vGlKUZ7f=#AN^8Q>4f=i_27Uuy%i<#e?wla;A1M@y@rxETbb`QjKa_ zJ(d%j;DxT@S1N+NRX0V0Ig*{SN2$1zPo5dd<<;=*L7%pAPJaPChq+T-;5o4aqm*{m z)@UW1!TC}OsiYGwDrFpRS?r9h9&nDcLc56-_H;gQI_2tsjy21o+qH!=?{81$d(6ym zpoIjP^uOOkw1qk6 zvDWqvM#C+!T8w|NOt4G=xj`v>j+!t*zM;inn%cXi0|U_9=E)~dliKVNW3eN#81uoU zMDK;_BeozvVe$~*y9s|n_WE%O3TrkWrPI#^*5i26Nv$p!*7R}Uz|;5{xZre4?b7?R zfstqbixB6D1Gw{7lT(%e0nSeZCgx;aL@qzj)owaeH-ZU2`9tP2Wbt)K^Tk6C!TMCO z(>#}>U5AUgod*ukKa{6f4yD)gsA{KAD~`+^mX=E`;7$XvN_VH~F#TPH;t0)C;P73X zXA(?4EH9UzNgKfvZT8Y+|_w|p8uoN+P`l>`6)F; z8P7fr%<_NU6kXUwV5?)e#dN50Q+ggXN7o*kKG_K_;4lJ=puhjp8K5R9 zSJTQU{qsHG^HzYzK!5E0{eLzVFhCAf%J%6fO)^!8@1NGVP8AFO|Ixi6Vf2eYI)Mbk z)xYfZmiDNU;?G?fRZ%041F-}7(;F+C#1`4fQsgeu4dg^J$}eTn zM!g6Z@ctln#fttn7!lyJ9Srg_^5AA8h~d{X1K(?zcC5#N=bt;gimGbU1X(Cm+T=Jfv`a$0*RG9S9W$ z0HWTB+rZoPK|tv4ey8kZ!0b9H$E}@{-y+O@oLtXfe7t#ZAAkR)a-aX=QYijH*ud7FM?A7#Q!u5|VH<3-?90{lYlVpZZfhz#v_pr{Z=rU(DCp+0TYuhg^QNVPpxNF+Rt^>Y$qu{kg82| z1Q6-W6VtZtHXqK5+Fv^lUR|H95A-#yD-U4%bw23+Kvlpl1>=*Yr(bM~ij1&~JNF}e zp5-q(i5oQa(oRX(9b~t^KEWbxi9II)-eSoU3or;uhTA{c=&zg`4^S;ex+#j4UG=( zPdAri-N}vvaWaFC)_0CV7x8E^UU3f+>HOwSymzYDj@H=`=e^**Nci*6###NzorhkO zia?bUo3}+5yAyes&lRg}_JiXpT81~z_1-488m5tE4Oy z5H>I3Jf3U|e(HcBTX9F{hcc^dqw()3EN+EbRW3QXeiP?PcJk^o^>6(TYMV-%?)-Sy zA7v2cwv+=8tx#6psH&h|_WrT;VI_#G@Ih7~iPYiGpaFLrj3$h%O08s$L7LIXcybay zEEnSdiVc6#~AD^jxTV6zTkgl3^}WKq%HOMLEF7a!iN>)u0JJ& za6`V~MYU0V$Iw~4H|rlVbhqgb*}cU(gpYAwz50lIXZY0-DS117rL0gW+j2+{wvwcVgasAngz3YL_yl<%#?r z`aSV`x~__t(hlP>3630dEXA+z-_rOjc<+RBUyW#wV2(T+QBvpLB-i^|qEgFt5x4S7 z{XpJ{%0u#u`HZzbS}ZrW=tK5z*n=Wwbx=W#p;euF#0VtMFz<0Vb;svr>9E{fHEq?N zXOQ^Ac-eTjo}QlIp0Xa^1eTuOgx&<=XGWU4+SiI&`5<+VF>Grt2pxnQ&4-pi(?!1J z&GQ&twi2#^)KE|BO_NWvJq!+y#5a1ATcwz%o~O17>#;$Q%>@nQ4Sri6?cI>wnAj}W zOwd%)@+iU@&nrqO>e3X|!Wn;L?P~qa`m43g_;Im;x>uR9x}esH24x{-!JfKg@qF74 zp3jfOg1=OTSEf2<4EHj>>`(T#psr5#_%by>JES_{Fcyl`%~C6Le3cXN$?R*@X$c|H z6KR4pKqko{;=aeV#~~GqQeB)!Wcz=m%%_<4GxdA+i>4UWOoE`GO%M${rH0;S1u$8|K?+OG5%rg!^yAKUvJ`wRiIgcTe@38+s{X)@|?9SRdrMZrF38oS|=sD9O8)? zb%rU1h4XSvP@mxD{AQUJ&71gZg4%njy#vNc)q|Bdgf4_wL{3CSgwsU9g#Cm$ggVqn z8VP~yM~?T8^Hw1oV?9&yrtrBUGklZq?FXCj zThG#wnl@#S3`i-Yj;NQl-6BsZu7A6*Q)4CHE^S%>omv_P4o2C{gt%_GO1pBPKs)o( z`qKm`4wSv<5bY&hqA;ImqhpQJ1JPZF#`SiGl--)?!tqTNOG?Xn=XB?mh)RX*UV$X# z`*Gx*dcE}<@(yT6gEh}tbaiUAe$>wBS9d3Ue_=JZ26Z@DG`aOxVyMmEkeizeSNZH-d#lx8OPW@I6dBb?yEVKu_DeNelg&H{n zNO=TJecMCcWp<-uh;#aKoN_=po5Og+{KE`p-e&Tq2-EyduCOMud^)x;n<%yp*{;1X zhO|{do5PZM?EIkCpoZ#x3+`ketEl6&&%$hLBkTBU^m5G1oy@x`m+ZI?H3{y;oyyI` z-U||2qF7RhsVmSN<31)y3cZLGk5!1x%y-YVmETlB%X2FDuq?^3Guw|~jk>~o6p57< zQYF$z$@rTWja(iE7oO{AQ2`RccY?EX z8*oRXFpwNnZVf~ouVgkmeXMM@oK+*WS!mQIh+Z;temG} zekG6&wyE`*<(h^%hnz$q(h;H&ZqPHegO#QtzoJg-(XA?jb_0)w3{=$o+%frjev0_C zSNO?gy$+(z#^|)!nV*ZF{{nJcUjD|$+2(?nnfANm(222gI>bOrytw(4gtkZgXnDOo zbC3SM#H?qKbM9`zuVFCJ=iuzOxsE0)QX1A8I?nH%yDGEHN;!8qiCQKvt4_ZE-0vZ$ zW2d?BiU}r?fk?H>&4d zQSO>6XgCoe7iriH+ZAugbiC;gY{Yp@oFvI4#_m~i{(UEGAa2Wu6I#0Gv@0@lUd{dU}~qqkiX$^{$Jn3;V`oboNQ!&gxKc>%us6;duHIJuKOH z^Ie2Qbm-#kwZ$oF+6}aK-0bGPAo57y^!MwvkZ;j%GHWDI7ky{5$1H0K3qzOXx#g?A zpv$QP&eNHkrM@MTuTor(z;_)crQ+f+=XdXBbzr`*!%($|M33bJe7+)n#B!=4hIES# z=lxNp?AQGU#%nn_;J1dElexK_^GAD^u8TXsS22-R znz}B!N{S+8_FyiP5B8?!T<&0p+b$Sl?jk@DZ0=&h=nl5Ea~5$IXZqVh1SsFW=4N92 z+r-62oJm(nmGQN`lR2XR*9)!}OcMBvjErJVA1p-FW#0bV9r#O}>7$E_g9tabo0}V# z8!wl=lO;Egu&^-qi+Zt{jt{2?@`E8)9*zH>pRV#OMTRj;o zFd!aa42hQl!eW2h{~tB~HR6Bksrz3&`2>Xid(Zz?^S}4hayEB*Z4U;9bdmV4o%y%( zf3N(vqZs$?%Kw`r{t@%vw}6}_@Wr_QbI&C3u{T@*E#VQ7labbR$3&&$BtOtX1mBo+ zQ^hmmVr^w(^CI5%36}|PZ;g-hTb6I87y#a2mfw=6f%S92^YBnT(udd&zr6U}ye|40 ztvS(m)OVzL(x=%XsWPesIq=7f`-M`I%R;%>?)8&68_J5ti^g9vv zWlBm$a46rZIwOWZK2|@+ec|)1;_@9>s$G?e!m%<{IWm1g1Ye*`9A|h@=r5*lpO8NEP#N znjX}%Oi!@e#q;u+9yYi9)}}P5Zu~4FE8&}jA1j6+zE%hH~yK%P6T&z z1q1Z-=lRj*3RUPQdiiXa_q~-76BzZ(^?nz_)g2W+MXhyDV=}kAvn~c--DrC85~CI< zvd(@%e!hAi&nrXN8Rk1Q0++nnR6&;N3zE0oC7^J(FDiFvdP?jcR@cKpUnC3R*9HVaJ!qOjhg)tY-P@@x&vE8!PIbznxd%q*z%dhV{Y+IJW z$HltyGnMp<=EoTRAd;u&Tt@wiL^D&CnW)SS!3FQb&-q8A%A);8g~bMr9S>nDV`J)b zmYF^;xf;&pGmGEQOpdBZg3o1?%n-^ylnm1jA&3lk&UWpyD$1Y z<^B14@@Ch04@+kzGaLqQhjY(Uz>BOIzILJ-V(Bl3J3< zA4o>%(^v1SMYjWrojR;QDg!<27sLrkXwGpobYJ=eJ$4^kNiu?3UF@~AG@Y%bHcRB} z4j($GydG0pUpglQ4QQQ-ZWZJd^$q4kOIYt>wi)_fLAJ*VHMFGb0mGER)!em-aDR8c z>4$meWq1L@>60j-R=0cvGSmQiwt6l5X6_S&AEKho0+V)2!LH zOq^>>P#h9T?|ZpVCA=|SoU|vQQ)e^D7gf5uQ>18+1K|nN6*5Rz8G233Ke2Vtn-%cA z-Ke_O#!Sb^2g1Tbv{fmvbVpJ;z4(%&ywS;F%D0zO%uK9}M};QpchFqN4WMMz zfVm2J*N;?o>Y|MwOadNhx2@o0X(d`xx$fO+S)#2H>@aY{RrX3^*~ow-nr8cLZq@<-T=s=S!kkY`Ug z*&O3uc@wDinhMN1v{`Qg?%jOe9!{SYXrUXdPg7jp?3q_tK>FnEhX^JV%x+{uNV}$& z4<#H7On>yV9;YzAqF9dkP@e{vi!_;@a8@RHk#9wx_$8dbe{q~Fxnk4gUF#C7=ow=C zPCWgq?CVyOfR%!*lBVNn|F|3E=lSW+CcVy@CDU*l9UGp3cYHAN@dyi+5G5uW0r-0! zT&XMzEL`i*m_*_YoV`8Yn+7ZOV8r?Cb7Rr{c5;rZjW_y6-#%WNXg(?e!G`Od*FRRU z4;F*CiyGH@m*3d~?we|AG-bX>Q9-$t!f=n~{e-UBP!&;``9cN5cr-#}F@$X%11wFZS@PFLJmHI*c(Qt>B zk3eh1!@uw$`Q?U{x0cu3R`pgv!wX_GO zl$z+MSGrO#4tq#Nlw)TyUW{-VPq+jEhPO?p&Jf2U1;JS~EqWs{=EHmS2=GvrG}T0Q zcIr~{dYo~SmC)B|S2`X3DP^-Z6M}2{)(N3t3~YAtZX@1&Cs5=;&!FVZ4jYTrXJrN@ zilQE*u36;gUVbhYos3wZ^`;Uks@)2Lz6qCR3AAdYKKOB_IT)L@SfF5p| zzwbK?>v@>W`u0Qse8qOOE!6b#dvM z{-@zz64S>#_amBP2T**g6W^?9_2=MAg1b+}!SJO18u9GJ(;&g5p^@~I#Jvv@)y;O> zWesI}MfaD7*B((P4pBs4?)@l**^9du=o`d!wvul?*bO3A?w+izfPHrek>a_Hz=~Ka zW<9q{6Id%YWaT8e)Og1GnQqQwN`LXuCxcDAwN^gycTC04qVLdwKiP~76L2@G7AmNh zj(-QeO8Hd`&o?1RoCBgVI;w!2Jh5T7+2FRjU1SvE?pl`hpAWSub--l|?u-6Z1{3%> zIJJmyt1pSWhXu*j-Pw;p3(^^s*vHV;*(|7y;NkcxHs)-G>lxF`0`Ur4&V}BEb+B=NuO32 z8AN2@TxTzUqH?(=|F}C%M$@xr0HI2W`GOkY zIW+4bD~OHkh@#o#SH#TIiIoDxG)t#K!GA?t*Du3iL~dU5{w)I>#&`Cblg$U=ilRmv zt~;0d5C&;@jRm_+4G+kBLf)$@nRTV0O6=q~`-cw*@vJpnmY=tPY*W7Ef{EaluLE*w z(69{KR~j1heA>_U39waPV@%(bhsi1aOtw(kZ(k}i!9!)|<%uFx0xyb-zK`S283z)L zC{NqUi0WGLekPW@9FlA-+!hkse1`gZ2Um)b!#|thb>xVejkIL#`Pf7alwZtDeJ=CK z+s}W7<-fyA^(U9N4hXxZlB34SRX1230d&K%p38xr!S@0VNXyl+0*<4-C(p^fZ#Bu* zcg~~~SDzsyT||sC?vKIC_~B?C@%IJAw1F7dPHcWzYXfDSUqHo==I?0h4_Ng|!HxN5 z1RKNr%idVVA(Jua@n1>pm8J9BXnT6AqhUz61&__0hz*Lk;r*F_53w@95qXd8$0KX{ zVn&i72Qtvf`h0!LW7yX5*noueiOHm77mRIB!yFU}|0#`6_kQgg5GlMhYSvZ`powYBGZQa-{$ zn3M!YVf0EJ2g1-f%|~BUaNFPb$;mm!l)Mp35zFR09U~i0>9&oNwI-!Aqz?6CO|pufPlx>C^sg>cj+WXHcZnzjIf_Qd(E){(2UL-bpGPwLRJ(1~0eE)qWh#)?HzJ z37oM3eumBS#^qrKM z#|<^L{yuYfYj_W?E>u}y(P9Td;F{s{+McY0QUHU^Qj_>eW#B&7t@y#}eVrFcjgA7M zt}--*R@kPMPCpmrNPMr0T*gb~ny=W2Rf!dbuBKixkZ0-Hdk0#*nx=^9ipQZ=YngFD`#iO*?XNrxfCFX8rZ(Gn~N!ER$3A*}P%(FH>v zrMX5Jk_`C*o7T$+hbYc7M*+TZSIZ3Mawvefh$Uo6^SfSKPA*^6&#zIW*|l@r85PGS zN{V#2l~OPQrgMv<`(EE}ft1-}zbt{o6h?->avjPAHbe<=-Yxcb zL-;6weKsq^JHY&Z?)n262rmc|c3zv_Yf&jjTJFs^mFQKwXDUIjJ*wb)L-Qi88;hfc zzt>=Hd$qQ3j~|#=B%w)C7qu+4^VXcU3I2Hk_RUjlM$fBGB=sKIGbxza%plseX~t$H zuB>DFQ`%am8>P6Ua&fIW8KW6)zBV21Zdm)!dv;?YE6qZz=bRnge-E>P$F*>#67_AZ zxtlH-;tFoiLwB6R!e0Q3qr?0BXukEj*vHK_H!1u zY|#Ba{s|s#Y`62R>AU938dJWq(Qnu_GC!WaAlORQZxp;00-d#K^qiYx>r|zB=>0Ml zsyY;+Hwsy((a1#SMju9uCC6N$-l8tL>sNc+wG)4}5b3-#!$6q|D)yZ!N&0s>3xNuraO>^ zHbgWvE;Q{E3y;hLamr0?O6xu8oI-T~qiDvCnrkVIUM{h*oXLGw=CNgaJR3i^a$JHM z%^6GFHson^-nj;_&E=BKaZ_+{TrP&#as-xv^!E~8+3GlSNz<5(S z>*bl5_8F0w4bpaWzhN)ZwY5Ht!#=EOPv8c+Dp@}BveyN^JJ&GN&cOOLNay$`j@gcx z+iblvoBl*okM;HC+3^8KIjqhsRl?^j(ovrQ?*{NGmE;>pczd+jJyUAs#cchx$zjU) zn|_6M0fV|cpOaBjuigH;we41W!xy!c-#C)$G(_Osm0&?@t5W@hNw%`pDTH|#9YWuR z!*K@f!v~F_oP1;Fdc0F3!p3Y~>}Ju)glucyjS24$^tb0tt8an4A|+nY!Cm zTdj;rox)k6nC{biworAwZ3M!ZKN}#&1QkFqF8aFHInH*csvA&E6T6$+Ku`}Sq8(aj z&O8kiKl}Y|8`Z95(4jDEG=mnLHPv9fF|7@*&+mM>z2JLy#v>o)JxR|+e>M@kbO+~H zrK<}Q@FBWboCbnB<-9%muqpL<7k7n={xeZj&(!=(;9!5X7dPr-$jm$1J z7GL+1E7yaU`G)ECGxj4Rkh7Gz<9A<6E3H>Em$zEayQ?nU#w5UvA2S^` zOI!%_Ip_OtW=D42KWkf4xS(B&-bbLLUe=S^R-WP7Of(z3#T2a>q?JTXl$W~^mz6h; zgkQg}_EVT6#DUA0)7aPe`|Pjk2pmjNf;&HlBR{fh-Tb;Qfq8v%oApvdsl2{Z zd;_JBH7f2&Jcxd%int! z32p|xO>nP%XO4+iod*h8!85EaVS@0V4v}DACpWbtT-Yi5HV#qdZ1B1Sou}|a`;?Vxf${!x zqEs0HT9_?#m$(~(S1hODUr%}FZZpUJ-BbX5!a{Xcn9eN0%z43M9NDq^h#cv*9;*3O3xbxaQ(hvN-oScMJS%#*^2@CJxdBe8Px!^sQ-1$6E($#rLxg zxR7jyg(OS1XPOgENy;qE9jX0BW8eV8qFvhsl>Q9uL`UN{g_g+F(;A1uq2}{>teKhB zt61{sne^zSvoH<)(uJ2f7sAwR>-!{9sx}>!jiM~c-)M-k(_@SHukHqyeAqnm+$O36 z5@IvE-wzG}k{4(4LH>LFzY-rk~hVtJ+|2Phr_R3vfHypq+gk@Jans{%^P;<3gpbVCv)iHP?~HVDNQ7{MA;wfx?Fm#P!-}=Z8_nMJirP z&;*wOHM1l$zW*z-&=q_82{Vf|{@x}8{~>3$TwKyA5q)-;RoAfeRjR(u#K`6E-ZxO* z(1J|c^{uyd$ddL!ih;Fq_PPN&c}0UJBc&40fH=^2aha~Qq>6#55!48tS+v~0I!!*| z*2AK^+&c6M{DXZQ8z$l7neUwS^+%``H4YBRM+dC9d`=#pBHmK*tDV$5pVD!U9w(o3 z2J6A!NZ8jUP&%)L7I%C~C?CWH?J*e3ndZc-$`hMzhK>Di5GVD6PiiKeTiQ&7LSN)sz<;`n#0|Vf3IiEPzMqHue7*uaWiUJVbv_N}jf(Bcj zZ>9RRzRnuLJ`&7tX*!?I!c>l*k|}9^2>PYMKqWcw2SZ`X;SuZYMLQ*2>ufF-# zpJXp;-Jg97gc&>7WBtX6h3z%6Cw7(XH<4cJ8wM%^)q``e{b_s3UP(;6LJ*8hqlpoN z1HdFsZ2z)@ri`jb2F*M#nDPG!xiR#KorwRfTV|9Z;J+W<{!ifb2H+Su&-F1d{sw6z zI6zSU|7)H9dCQVu)O!*fY(`@s_^63_VpPH4d;Uv(7p-f6aH$1y>eC3>VeVVm91%Y94V#=e&ZqZ2}aeNb~_V#D{5M8X_QSa)zrjPvsPcdmvR zPN|xzE&6ML;BB?RErgKjy$thHcI*@`e*i~-5n8gq-O{W#5frs30sSfG!Ilqh3&0f< zJ|(ef*Hq3@t>VOoE3l>O1!l~w=Ophi{A1&*vEu`oq!>xDYh*0KQ?oQdAnUmXx06z& z%!ALbq_S`U4ERR%*8|eOcoiV9qO!OQ(Q``|qzc*_UKhq;-Oh(qF$=Pd6fkYay-l2gCo4>pzBBJz zGy(3z6ammAQy%N-mV&bmfpGf;3B%U*TL{W%f^9LF0gje9FStQ@pKs=qj_0BEk5X3{ zy#M^XmQz>&5En47v5X&cZVM={eDq8W6H}f+`Uapqkt^xoS1$iPLx=Aho zMr!-f%dhhhQ1#eO#mzOPwSJ|-TUn6}*|Qxgvp=G2%F@nS{0|f@3P{4uHR!KAF>!Cf zmem8=e@)(rP4%eP!bw(#-U-O@-cm7>05xOG396}x6qxRgk~rTuf2-jBSEL_J0kL^% zP6pwT+X5+(>P+8jVY&!`kVnE!x#CAduK{?}bp*Npcc&Pqus04$Wv?MOz1nKQqx@8R6GTdA1pyU0twN$(o z$)Mh|icIMFFDO8;dCR0n9rkj!)ByYgrw_fvBSE_~rF0Q~@4{aUzQA2^0q3O`(wocDuUasZ6jgu%ng2B2Js4JOgUKHhEGGA>Mjh7$DxCgMW^zUwgunaB&gW#_IR zGxPS7!wlahN1=nBcLK_ ztBd0qdsL+0{2zPEg5KsNBOi1^wB_laB|}BXNQk)*ZTj8&wLY}KEw1mBP4bY<=f=X$zB;}Qz)Xn1!4oj^rr+@sh4N{GJ%Nh^l z8`e^6E>k@ooOIII+q%s`bSAydPXR9fU=y42NUGv+KvaLoK-{A5k#E`V7C;*z-$v7e z0TQ>$!1oF*5qf#gpox8ur;B!_PG~fOaNhUkig8+gVL2}ZBSC?fk!&3xfi(~E3APe- zB5npm_iFkDX8M2wz##K_xg%oqTB{k5>Ri6hn3}A)%VBXbsMHPI1p8w`F*Q39({KlJ zMejOk((D~U!C9rrZtgbg7y_^+!JvBW6Z$(N7P~Q$C%{J*`UjHdUr^U zB140n#hxssONq|K2bwr@$J z5T>#)sXU!yJL&uazz(LS02xMkJ9)EApJO>;9+g5`gmyxG2v#QBs>+g<#HS`8C0KNj z;Y5r(Z%~r<2sR+JLg)+KF0J#tQIR;ym7IW_sK!hKRJXYPMEc&g6r>7JPR}~PFHT+1 z@mp(Z3%)54d)6#@ecCn=z10g@xZvw}v#TuTlM#T>oZ@OaQr{D>9H89;nD_eY_a-lJ z`5s`-mFo&)ijz{pI~;kxYa8{zA87#Gtw#?81@k~uO5FtJ^D$SQFCio{8sBtGY3ZuFPy%MREA1^HJ~zMCME&kP~X4q)eTE@j{AP+~r? zl5@{q10~F(0JBi6r%064)}6>cFf>r$g$xL%7-}@2#BIn)og=B^(0L~O&=heN0WA2Zmy5^0d^uuqO9NF27b1yaT2&C_+<#2 zzNtaWpc^2jyx%@ZA(}1L;ih?EEOm~sk<%0M5iY4;OR;i0E451mPmhiS!jT}3reUCu{Z!YX+R-#0?Xmh7mUX-sU>JMCKq{u(9 zO&5V2%yp#@T>%{7O!M`*&0qlxPaojCm1L^{7B>Y^&tJIXcjtb^$-LL#dxD`BrPnr} z&8aoCr?;TmlqFstD@yC;r`^6a;9%^rrKXA%aOk*hdJf}Je@-jPUg}l z)xm^g9c8C;uRp1%K)5^4je!%cjog@!ze~hnE(ZEs&CJK=;uxMG?sXmw{lmAm1`3BR z4*@(;VoZR{MsA#P&-X->%!*Ta^Lf$jRhgr66e%>nf!~T)ag$l=y9FY?SvPr zDy>Ba0NJcB;VmHOp$oXrt4EEU_UJ5TXM-Qt`T?aArkgn-#7)J5$=K_lZJ6F1qKr~> z4?bZiL3o=TB2oe3&HE5WX^rioB6yIUckfMswRU;CmZax7DIx2K*g^M`HN+W!44`5O zQLIftO0ACxuo)e;NAsiW?KC7~@|@QPuB%uv_=Btpqd_An4|2cu+ldWXzUGvu2T}_H zNL#Dg3YmADzoY~2oqZo?8n7T|Q$AWAgDKJMagwNr3(Z0=P_@8ijZ=H!dyoP%IO{kW z(kCmiq}{u2&Xrg2daI*Oq)uwlz^yKN210s)^L*TSDCZmfCu8;0T{c0AG`mO+$&@cJ zJX7}Kfm_bmk)*(9G}rNW-B0Iz;1s6sKeS=&(QNl?NX4rOAF!`hlxEu{kANK zQ>~wMoKTyyEyj35Rx6-XWip`5lCv=8%NCAd_B=`LfXMdghlCqIS~H+JJ22UUbbH|9 zl9q*BzJjjkUk9>SKG5ylwdb(SNQij+Rx5`LcEGW+! z&u04_ULKO1V{n>E0cK-uvh`DnH-6lp>_XZm4*pgsRsTzwC+?Bdx2Y*>c!Q&Zq?bN1 z-82mdQbNQSC3)?hsr<(w_gq`$6TRk<>O-&z&i-vs^B@BVF=f}bmPd(Qz|Y?fAng5clBw%}_;npJ`r#_5r6_q)M=of>q6t%v}5Q3u%QHd>Q$X z7X)B3Re0?YnJHeRqB*Yb1^J25P(tyl^g%g~9A{GD0M?C(TV%pk4n@w0*X4efxIO1D zJZ=vB5H*lzrGMho$M?Lt3mlSLDK{HA(U%9z;sqb$@FI1J;H7p4)q@f<5$T?^M?bQ( zZ|U9T2ESrwjYfIi4U35pdN^{9nU{OkE;ep2%8k6xwmp;-Mp3f$!d+L@o#`MoaR#Flo~HpEY%Wsm+A5? zM{KdTYz8BoI`S2gxDrOjbcJw~Z{YIG zQQZ42>JX?!<~l z)>qK6^fqYM^9x?P<~o@g7*{R9+_|{N*FlN+&TyG`eW8t>!P1rm(kCeSUOT|}t}sd^ z+0$)Hb0#7{f6PiN`RlGL%6@MDHj0botIfv~p)Ma&mP$!4n)<2BiV4?kGbsF87P+UW zU^zBdGSxmUjDL${DKQb=+moxsQwSEOZ_{+znaWpe~jN2Bxy3)N|4@SEfomaII^T2Q_U zHeJOIhnnG_gmOyHK1`29b{wn<-n+TwdkUibZZi?6z&TZ~PdZ6;!HtFh=D=QP5}Ixa zSE7l5IowZk;<0as%x zEG#b}EKDqKXKie1VFUv5DfnkRv~tWm+PBl!{6K#Y*i7L)nMhd>8j>1$h<##O5?B;T z7@rJXH7qq7hM=HtO|h6LkZQRDpDT4mEA@0DMMbo+;nn3``E6iM+AdePtzYa%pI`2G zM}D{N%8o#Qu!PZJ<#)n?^q( z4I(pAPfzLj{CN9H8{#2|g$zOsu@2#d#YC{4J>W8oE>#68Fiq@+D04-;wym z(x1bN8gtnh-zu_#8PZE85b<;iy~I9aP)R+L8Yjf}hNtTB&C&_fu~~YpAyC12a#e84ok7vEZpC;gU>J!E>;@y8c>MU`-+Wk;31tQK$!6&1RAK zg%t7UHWSLd+eqJa)G;sbVe>N_XI1U|uXV4gR(q36>>%}OzUnNa#&gIoE7feMEbg{- z`Sfud3?jx%pDusySKDcynQ*R6^+>dn)tO3mG8}}N? z9=P8c#XC>~U3_0+e39=3k+?bFI6^y-h&}#G#Maa(Z~^)mF4VASf{I@uYY1t5Lo)3O z;LN^x1%wNlWJt*)I}jZNe$T8QGkFIYql;StiPvebNBP?qe9guMH3h;tSK zBv1I|2tq;c?#TB^@9clDe)kLR zBiD=5hhxr7@Jzt^?fRSGH?c87XzxU2pSpMn5gSypuXgyd|8kgRUs~UdE_6jU2fi$# zNw|G4difY2@II%4I+VsWR&fw@&~cCs($_Z%Ow*^hLNZfmJwd3vtAJEx z{PTPD_u95G8(zIqA)`NSB*i3GBt3FHa&dF3CBc<3RMH3YE(#6{Yo{)!1aaexr8mbE zzlzrQ)mSYARYg~&+T~oZY{PA%4|+OaEC-Eb=8xBpAy1x8@E3nAtWbua#ZyUAwkq#+RrcGAZrwU6SpHMJhKJ)fIvM$B3#^32`8=6{XgP_&CvU(QMInie;8DyHum( z?ZZYWdxKr8B{2xhD;e_Ob)VY1a*{;K1vE4Ey;T%Ai? zggv^MTdvMufS$LmIIVd-Slc7E{c88l>4VJ==Msk_qlpBP-!i{LW#3WBUgTl-8gr0WXH?-1q9$4$zXkmgtB2HGH%ttSsfYB{C+ZyUOo-G_oSmc2vy4I+ z8B}#r>h5~b2GLHU$<7n*3htiIbs9RC%uc?7QDw5|`SrUi2^LTh46-}+;z$naZ zpdl79r=>-FGUPC_6vasj8+kP3TZLs*Ycd(RvsW}F^59p)-_MXwy1O|skSiWX!-&q% zoMax?{N9;*ldiJiYP)ABDx#?zs ztJtykaHTxr^J-N2&vr`hHRx3$T=*?`a>!OZEw-a))aUH8{*$meJZH-%)d8j!EkhOM z&sRq1)|1=mCEm1;ruz09J0}cCnl~1`R+yHp&BLCWo|XExU(P#jGLB0renfXg-*U$t zH7J{@H91q+<~x|^Xy|G@GWuz2I(yQ{F}5qMYm93ZYBW|}bX&cgB)jw6d^nz7(5$(= z9PLU!Rk>HKRmD?@pV2k9GfSHmn{j&Xddk&He`w3{)HxJ!^t{fz-o?eo!@V&-S)G7k zm&6N1?jdNf9Xr%@j}cW;VQp>PL*XFjz1o<)(>WzX;#hL^cg@)^SRWt6GLzDyn@U>b znuuGPnI)WDvH$(5ZW1UZK4cx&K20#o`^8r1z9%lGC+41tN_IOHmzRO>`9OLi(PxAr z6?s%Fz17pIv+?8-beHMNS))x|=(OWO)?x2vd{k7 z>hkHXV)QHw8(s$iuon2j@?Z#H82_J$h13oz~9|`CH2%7`u)=;|1&5C%UX{J z$jS_;Kse|(H*k=RuKhGO$&CG1P$h^Lbh+DQr40}P877eRAyAkWsE#tboLtc-;5V2| zVmEA%#f8B>=~wRQV!4nmP>>>v67{1FcXS5x4t~R?h*!o_?-AXJVuHKfCnjobSjXjz zzB0g#RW(wVFqV-4p#{FffPe;?fjZ;=eJzgNLXGr<3T z2i1DJQBX-(LIU_yGO#l;va`!svf4rn$9UN@9n3$ZMof(~38LjP1nBH@8axyWqFtM;O0CzCh zyIMKuxiDDSll`ZXzx9Y1*&EoI+Ble6TM@t2tEX@6=)g-#`qt3D|NhfYBNx;Ewq#}h z=dpkXWO}>8^q!HK>EF76qC9WEa><*z7+GkDm|6nE1GK@%`hkPzpZouhEB|frf0R`J zZ^@4z*#2k9|8eF2T~fu~$WGYW5@^za@4qwir||#0_@^Kb)7z8(kCFJ#F#q!_FwT5% zJWT)286RAiSsfV&hyaL$h@i3y=us+Ug39!4;4Fx6AY_n4;XCS}i~?#(CtxO=ogc;d zH7lDj<)u3WV&#RR&>&GO_Ha+?S9y=R6Ngf{yML!9a?h^1rE%}3EI;yA&T6z*PZeo&o6QVJ!A)nv1bzGSiVYL!jP_?>RIk$7`FtMP(!w)To@io0K}rnv=M_l< z_Kw4BYq~-d5>|>lZeGC5AI^+pJKL!gS5XKI#ZpuNLgb$pizJ9JbQ2VpI7)eti&Ri( z42EV2t-7W%H9zc;U|g?dyLFK!9;n>~ID~84;3^ zh-sptfc|+EK!DjH6haIX3H_~v_#-F{X<;L^^4}ja&|p5H{{QWksX;@6$$Ytbs&o&# zfDnu2rdk4zvrf9$d=|9Zqxs3caDu~PvxS;MZO3U9FYk-3UpGtkqoOi%*6q(0eu!*A z;k9Icr&Hby3`b4mr1f@XV)jJwq+v5$qcF(hYFwP{>lpEByyL8PeGn1H3EHNB`| zz(@mH=zrEq2MbtIl1879`@c)$r!;XkR@7D@ChWdcD$X=xEWYWUm~b&-;n$4vLBw4vNdIju&b#ugkt_NHYED zS)*iz5M~r+fYZED{CxE&-(mH7yzQ#z?Ys>8vLW!Pt*jh~L~s;LmBw7cK$Yf_g^16= z971-~2~AW($m=Gecl0}zdzMZF=o~HD2&ii~_X$Vy)r3?iH95yvpQlLIiyb66Xx0eKAIq2q|hRdI^>|k!Q_t8ZS4TfyrEj-WSkLH(v^J z#vI<8IfLV2_SKp)?dAt+div($y5uk%R?4&w3sj@v$UJMMKI?*QfZX(=DxTe z*J>pTYh3NuOv+XRbFr}EeoEk5i}|08cqAI5Ju!Ms!&jO4LlbEWKpCn4trzUv5^E$bDf$J8>->XtDdtjPnUB1VQ5U|qBqv9 z*E6KYJbM{_B}PMWGtJJ{{IwW^O~-YMIYAKb7DE16K2Q0u$_1pp7m*gV>Zl7QX|BdK z7B{}|j1|~A9`6UkeJ_CFR8MBJwAdPms+*MM7PajTM2@&oVBYZ6pU4u0Cvtc^uGjRS zVf3QrD2!9tn0!zDN&RzVC}Y!r+%wPf)#QuIQiCm<NzP)A{+m8oC}iMxZ(+?K?oB=hECyOjEg?>*&fFx<>e4pHM762cu_>h5vJ; zc6cWU1kjRdH#wa9+1h$YeGaRd`D`w#F{^G6_BB0Kwe&M4C!>|_s@)L7vx7vt*YlH_ z&M4pG5ow5Il+d7SNB{ha>uzd6EK~c_#2qB(R-|ytDtt)rzl$ZqH&sPry(=WPO0wd6 zB$0P?L(XSAya?pS*O$lg|vg6l!L@^}1sW_J?*Ij2R| z+GTZn`6CsEgHpX7_C;e+JR}oH^%8Ad)qas@>n`NWrSpAff*JDm%eJ&@YCdTif4R3jWWDA|Q)WATR1Km|*P|OYZTl#OwKifd=2qzB3(ipyp31 z;M=bwXONS3^&)qM9=5*OrWygSj`pLxx9?WDVTD@Hn}j)Z+?Ii|U72-%i>6aVDws^) z(Z*wv;9gLa|A1YO#a!Lxa5W>lPxvrE;Jl>AecEEbE_lQ=*bzx0tWUD@N`(0O4q3uV z>Qh1)!Bb3oAfelUrnb<-7Q;}W`^{0KmUr~zzWU$w4i9mWqSI65eHPu#yW>6lgMfPm z_oLYszl|y?9}Otc;P1QhO-sN)uvspAFkfn@e2x5kI8$0G5kpCm_}@-aouw;?yj+@m z2KlpOh~Z%k9n2`T0qZJQSf6iwOX@QVWSn2p5 zW&S*)UFtWCC@uc(gY-W>%>T8H5F3OH^aP_@0#+*S6M5X>$<_X(=TZu%eOzd98E6cZ zTpciu_dCE&JiQrWYB$WGgU4p9ArbyQ*W!Aq779lF#euPM_{e z&DSWvq>Q})OHF_BX_l<-2abXF%e{%%dmEy29@-PW!LLT!^d&j&Z7IFjzh1hL`R8g( zCqw*IrUajG5`S^g7A;BFDHxT$^Z7wTn(qD5cnlczxBZW83W~e|7>6+=&Mg$pDnp5= zh64|q%VG9KOf{|bW}Dqq=LMs9?YO9ur#B1PPv}194~q`;^A}b694It?W{ z)4KJeQ7?57o>fC8fy0>K&7yUCu5`A*U?+xFu2Aj?0%BOx6Ia zWl>og7bmi`ZaM!>6zRNRO7-Rpc#cQ#Tm+r>U3S4Usb`CYv8ZVOjJMyQBl+W2<@Jb$k_UPvp53`l^yn*Q5tn`f4-@%o&B=N_jD!aGP5(a&>QxNPjrNGa`%ki%0qmFsb#xjJ15~ zu4Lgk??LA~0$hx0gK*A1zK1#+-{aowhwbuu~3_ zq}A!E@&jj^MT`tvCAus}=L;|!1?nZpHSrB(;T&CnDQcuX0gM{(T<#29vh|l!N^`IjX>8t#}1X zc@-Q80)|&YIpqu-vG+dAhC(zw(ZcxFKWZ30H8nU`{E|yuUpfK0f3qF0^IboFaRQo< zQVSgDL4G?Dvm9A$%mEMj7p?SYx;3rd)rarML?@g9`%w;-Mh|C2#bp<};C#2s&gl$a zS~!aIJHCNB?PUf&xQyV1h|%hC?Er4mnL^5??PlLRV0w>$<$L@5oqspR9gOBg>tSGy zXasu}?!J*9uvq!jH}|{gx4W^A@TzYP8b*IIEjZeuO)2W@m@xAFCg6FD_^RlOp8kwJ z(LV4e8-+f|E4y5Weg_uON; z#h+Ml~UoE>$$Iocmu<3!Cf)U^XF-=mjZ zITG#%>LQk9&$Mv#Ns1KYt(MD?%UjzE){Eluwu@WtS*l%_?}8zliABi2w)2`#T;p_e z`EQr(pFPzks%dJ(7bPjz7+Zb}0^2q6>q?7jm$pN2Hxf7fc%DqMzdJSg(s2CVSf+56 zX1x_G`!}kW)7O{LeD2q$OV4LHzWW^haCT#03(9JFUQhGwO{?i#pT{2OxuRu@M}$*d zKRPcv#>;Kiy!yNA-api>xE=Z@6G}EDa}J(Db^14>W^Hap@bj$`625Ru?Z#4jdu&CC zQx-g43^CpIpLCucasmDodJoB!Pg@?E3GL1OfLyx-H1w_R)h}W05w61$h~qr(rzK4X z{gb6eK8AkTMk$W!q6j~ljVJW1tE+0jp9p?=etcwRCx~+arVriX*C|w&e=@Gr5im+= zM3#+vS)m>&cv_Qv3Tj++tR^E@+hhIlU)+Ah%cWKu50jdsu4|2{miYm0Bjq}jQ2On> zN&5A^V(PAgC#~Y$1o(jyoGHe39-=3~h#E~)S?QTAGOhRUir3>YEW68thZfU75GvWz z``u9*&tOLFraOcDBT>fy0+(j!s)$`4`P)R3wEc)iwsjFNbq)&p?M4Kn0EU)5yxBcq zSWYgL!~_KeyLf+irYM!6TesckwU2x{#IQ_HJ^Z=(<`bt60f)gHQFSiUI+v~AG~6m3 z#d33|)d;8QKC30{E%PkvC^)$`(d4p}7Ma%K)H;2&0#Qo)PbPMP$GhrInh@B0-G>`n z>%8a*9=tsr+h-Z)QL0(BiRb9>R`<$JDQ*XaZA>=XUj82~?cw6v+c;m>U4@qSPc9u& zmf+Ld!>NJ_MTq% z_j_ijEE{y*yEQ+)H2A119t=O`3}zIP6GVp2-cYcBF(yV`30S?}3k}h8Ss>#hXJflQ!1A3H_0#wA8!nS^VWY%`g3mnW5rwHf=P-?{t2)4~`&rH#m`7p*KGM!erD9bEYhNR`9vbo; zC{&{D6|WLtx@LeVF>;E_@nGwg3S%&+JRKlRIlApO zqm~|(b*<5MUY@=rM@y&5`z=X!LUIz**vTMyLYU>XiYU7xJtD{vuaK3?EloF^@V;Bl z(x0OY4d^{}K`wvx_O^3sC3 zto;t2q<8sJ0X*&`_Qp$MB>seBW%NvIOUu8oVB_R6k}Zv&Am0T~y;Qi(?fT$e_o26y z$p6qtt7l^+3_1*zd{LnIEfAM-o1 z^9q#yIM+)_^z;gkooWYM4x@#=kqF77*Nc&X!xspmr8i{cM_BfoIuRh`N&& z1%L};2x}F9`*Gif5*Y2r1nVmQDWSSQokUwp!UE?ip}6nV@7`o52*(gdJvxBTUVANl zb0xe*4t!9p3IZv2U&(G|Ytw~$qV{7>Hx;>-@Yycz1{Vn*&ktdOP8x1}?0Q6_X7)a6 z33)Sx5I=u=obc|rM`#HZ9cpebf~Xmd^EnZ;1Tj!6s(Y_b*lJ6yXrt&iF{jHDTQala zgEG!c0d7i`;OWtG_LdOA=`ko+b-Au=7_+O13r)e-%bMD2YW&-D9z z$lI}TN}ootUSl(k`nuni%*QH5IOd)OcP+>5Pq1t;-N z+LlxVi1AAYxH`I7`T1ArP}ePMKFDNyK+qu|Ny1n=b8P+;y>z5>*epfeRj}fL5@Cnj z9AY>og2JuwzyPiLwDkUm7ukr2wK_V=N|Rp+5OVM2(LN<>Gz4#kmyu}C*>&p)t`CpP zocrsZzJnnu5mP6%S?W^k7Dmb!Gs(OC5fW-YsohqxF{i)X8HLFARAJ+IyfD4wkdkUQ zNTa|#rxyU>$K&ejh!9w_k(0xhI|vPa0E1RfoNG?kg33-|f@e|Tvubir6<)3dU#eNp zxZxjK3q`>=pR~zJ`3$>@dx$n8L{86ucui?UWB0C1uM87I(;xaS0Q<{V0QI`)*W#vs z7L(8Wiib3Z$w1xqN#k^Rtj)pGVduW)R*{-)x~}CYW{7^YnxrPT!JV(MEczr~x-x%7 znqPR+v-7~e+AQ+yXkDYnEWe7!yjx08Mf*0BX(2AXgXL1>en?Uite6bt_XPqPLP&{C z=hSerq`GlG$RK!9{UIhQl#cW$J+^U0Cc?_^L^Rlt(U92w3)WcV6-M<&v;{vqbb3yT zpZ$wa)|pEVC6)a=zd{iFnWbBnzEMjhyi_J}r27}lbs*3|6@w%UuI0&4jjVR1=!A2= zqLt&Xb)Ket^29puh2H&k;ga34G+NI%(fhLpD>TmD<73Nwr4S^#HM48~BHoImUWh9O zMGz=@+4(fhInVwBh8*?{`?7=5C|sJ$=HxE%{=#4lc9%0;f}{gdq!$Iqq`ErN9U&53 zs5(QhW9LCdLl^qNr`lzY%i-3lT@Sk_2e?^qI$rstgh5&fv)Qs^wRBs=j5WQDe6KPx zdM|3K61R2S?uo6ZZyr%4XN6yBPFwL7;>#isqW4cI1`Cw(!@bLFn0j+tjy8=dbXl^gxGROHOYXM_a_cfYVR5r#4I%NByLOwISOzkq;CC_GEF>K4Q25n4{4muy4rek>T;io$D;)_$j4XCnJ%#ixw@P0;R6?tx z>32&)u-#}oIYXTM+19CX7xttxVNFPA&`zxo(y?|0A$I#B;~D6*sgZ4oEH7+N!a9g9 z16gdV!gg(k*s|{`ifDQ^2evVwiP9Mv2{iKsT*QCLQ)=S7Ec-DPu^+8nNu`o7%nGQd z`YKr$U1}+&3(f1{rEnC2o3N?2R-DF`iAY#FN{UBac7FVZPS|yTRe$u}jC(dhDLRBB z_&ZxguR^k0>c)Yetz8ap=4p!fF8|i1VyYAo>Z6|$`^Xdte{sPQnpV26{lGKY#@xoh zI|yk0vQXj@dJ;rWA$5lCN=-04PPe$5FEslrGG)mR1)=76KH%Ypfb$UNz_flP)tC}* z)4qxFBgcSfqVEyD*(UuSOy3(Y7(vyP<}HAZ;qd9C-H`Qfbm-=n<6;B?|EXdLx;lx#P$kTp#2E}VmIHoVHR$MS#VFzwC zfV-r$-q1w|5UQx;fnk)8cyz!hS$Kp;JDq(GZ+t(k#Va*aq1QVih4Tyn7GT|izvR1 z{yh6T_LJ8%v3PaN`A8}IiuZ44R2=gNx3xaA+(-lw!sUKX>42laVpna4V@IRL_){#X zfjVTqTo($xqk57MV4q7db{Jn*FIJk*u`p))JIWi}gLmO0YLtoO5L}14`BwTac<>~f zb~mppbl!Yy-dWc6tz7{-g7t=+N1hxytI%@fr|udB9)elQc4kq`2&sNnZK9%wrifd? zM2G;RA^e#yTzZ<7&==6F2CYW_=Y;RA45EO=Vge;{>$EsKo+ zpsuw#oSRwnnfv*lRLo7&?ynT;ZTt9SnADA$8WGUofZJu`6&snO zPcy#FZ~+ULD=d|Ysyh_j%SrR;5fJCs-W)G3Mu`*dORX5j$ovp|0P3#=9BgK?+BZal zZPmkGXJ)EU$#Nn`VkTEAe(&zI{k0B2@0O990H4jW@Ib`$4u}Ac{E+!7hS?TNlwCj7 zxSZ>|13>t3l6hGrKnTvVt+*HzYu1+m;DXxC<7xY1Zu}QB06k3G-roM%^jn$=h(EKf zhkz^A44-SLyBH@Ojm%v~d0(p-v>L`_IbQZGEVC9Uz(^y(A$Eq7O#leH;2%;Bh%Xo4 zD7XGBi_^~|>LPs+MAm>uQRR6vPo*eA3+@Hbd`G`oM}I&)CbF75IDG(^M#6C6iNF;*_rnm>+s0i$yRV4#crMBWz3R!xOO9yk{5FAwJK8^Kf_xEFS$R*lfDbkVKK%1E9@ARRrhGyT`rkh$CRq zYk+8qfi|8XPdNcguLz0`f{HMa*S+q|lWQXYf{wb^=Tq;M4WEEK``wYc%Moro$6T~L zcdOQG)x*X5@{eD~I?9?3Xx#w_haT`n0f3M*9rAD#&$>lV+EW*&vqiy)fhk0D#uq zT!6!RqYs+zcao2Rm2`c);C5JgoZ*LbaZIB7JK;T>=YxZ=Qa%#}?4)UpEdX126`2JR zIGy40!4Y+Rw0V8L#hcW)s&>CUdGQFmdqXvEFM*i79-sop0nCPd)D=MWu0u$+t*VFF zUU1b-bAL*jjo6*Hzi`d-9o<$s&Xu$x65O;7r*e;K7Z=a-xu34*Pm6`)TdpF!jA(dq zH5}fVFP1H`-7Id=c!k)M^Ey|rwDQ;VLWY*A4u59z>JsU%FLPXNOJ055&rfd^YIf}( zE-{}KqQl$vzBkiK0Ygz*1H2ApUTLkM4?A9k_BbWek4f&)uc9{B|5vj%s0G@V}Rsj&+8)Llv69t0>$_s-k zmN>5v1%u~FOp?}lB!x50)K1&S9VVZNL9^}(t{)%=jyTZ*(fny5i3V{zpEp98JQgc3 ze&z&ad;(&82IbAm_od(Mf@|r#5F>*wudXKL+((GK?lLpqU7sv3?(QzY_-+KFVU{t> zWi7>R%jk_PHL?NcARhA>T|RZ`DQ4h!wznNzXR^~$rT9aG_iO5Y9{3|SA!5ldNtu?e zF2`?A+j%F(zwaie)2&N2YilYu`xcu|ug^m)lG#cv24f4^_L8laKWK6b`*@x{w}p2r zJBQWR0?_?JMds>aAd#1aIDu<{nw7kAL1>%vUPYly>O&wR5g)0dNMBg;+G35{rE#0r zGe9E_c!IrQ(v7J^&BSij^l%$nGESF|vnLHm$A!&(xt7zU|tUFXq)xKk_J7&|i><(MNEDZd>(V6Dj_iJXnHhUTB z5NB}Ww?=i4U0n9~mtTTWQGkE*#15mIX~JVrM5y<)fs<4k{V@bai40~W?W@gsAtuzq z8p;D8Y`CYv$os@xuLGDTiYifsbxZtEc(j!tmFmRObh?7N3(%do-5*3FSw}d!>jQn- z>APwM0si20*sz8~T^TgSk^KFDoOl%p%SdZUMT4 z%Co~o=S0%Dl)6&QV9XrL#ThR^kh76z9D=SYHeIUO5K0e2T$E`!BiHjKvEma$??@?RJ_`uS^n(G_g#o0wF@@y0pi7YD!bdsU{ z5io`R#NNFA;IZ`N8kI1|vMYUyM1w)r$>rfnmg_=Q(-ZXdmSei}EQcBLeLu?|uH*Sl zGSi-(vSvxv9S<-b1OqhOE`H^I*MM_4Zx_e2>;DP}V%-3d4$s=#E8i zbtJ6?yZB;i84yY0;~cp=-;BBSYK708`QK^qW5G+9)NSv?;FVO>H4lMV5Fv*2AvZ`5!V!K-;u^O~0uvaWw$Cy?nkpv`oKCd94SgihqmRRx?LBz?q zVs#&oR+0Sc-BexIGJZ|S;nTZz8~lXeL;vlV>A&_ZnEAS+p0x{)+Y6*bo+b?6X-G0h=spkbF14dv_UlMgHgbTOag=iEf8rMfA%LpZm}|pj{kYndW?i0P*BKLs=t#b zPgsz^$`h=pskr!l(-m4syD(gY59J(-;lU6&5tpnbXWM^8N6jv6aL$XqfKINmDx@{1 zUnw}Ak)9(?B0?Ry&;0QHCj_AuxE>A*o%f1Bks{LtRr$J1r;!@eKaju}0eRCndXF_h27r73o_fK|9VMd{Fq_!$l} zs>;U{b^LZF!S%jru%Iz95LJ2C4!=nRPlF>Ia9FbJ>A?zalBMNlBQzoWZb@Xd;eFW4 z7HxpG_n7-W0MHKO>EuwXszzr{;c}qc{S;|TZE{Ilo6Mqu_^S9&2z>P4GtSmFyBy%U zLLv<_c`hJ}VZoV4Y6|^NW5-V3_%Th43b+jXHBFx?;d|*tVmd{umNG+g`8_7h*qjUj z7R$b(}0`}?}pHg`;{7`3`b z4iMc?>g)D<84g%mP-(m#qOWq9U9&wH|Av2J@ zU}eU0Pj}Q&-9|rXp}903%}C-wdAXj|`GTWI0rLWGI|R8Z-4XwdM^Bd)(E$VXzz~Vy zE+&>zr|E+W^(MCfcOy!JKti7B{)&9JZVWBI<^F1WdqkHw6a_*r0v+nkN2onzUmZju zM*|cgl2CgRPmLiN6*aqeO2#Sd_~xu6(ovNU`KFV3G(#fmndK=4Wj=!~<6aJ{54vt! za|YpOvp9S*iFN+utUb6a_B-_a*TPExE&W`hY-1rKJNjP7K6N+lCe7o*wlE8m@-5cZ z5GFSF5CKDll7A8jL2qkCS;(8NN6C2qCQjRiLAzRFJ6k0V)I=#HAhA33j2!>C= zHc%N~^F9}?jgw{mKCZ%7oQPRU^phUYgLyIHLyRa3aOL@9LA{QH&MSmC)V$DyFYDdr zo#I*amPG}2LlbcaDO9VaEkf(13S_2y*0$}MYR*`<>5jNeqa0+L`F z>>p#Qe!i{?q;PbjO-bt)6xgxOi~R(mI6xX4`3OJ}TQ8id$bT>nVslswZNcF{iX-%tuEsGs|Wf>0)QS#Dbyd8{;GZc zx03&RW5SsmME}_W2!X5PDTUMZ>&{%ck`nTP4x;APrW9>{ z)+Uu4-PtqFt+`M6LCE9IoO?P$$)1@CV1WOT1}ek(q$rBGdAE(3H4zRc#SqN=kWT5u zk};oS*!@_+W&2Yc>sK zMJhLmXyF;fR6J{Ez&dkPMETWsPu;kid8aleklh)KnZet#$l%)aM zn6AMZo;dv4&M7tM$23wK922iztztIE$30V*T32*D0;6{`I5QIP`6Sxx1B4g4fNGKkws+2i{XRspb&^QF4jeQ20`DS?PSs_vhoh zAVN>awp4cqUh~Gh*eFsenLjGS=`?|daW?oS_MQ0Nn_n5x`J{Xf;5;*tC#mL|yEpf2 z9W)@20o6Ed*zCL?X6Yc+u~bc?O-9?<`40$Qu(4O(FN$%dN0udTFY2(yzuU&7qK4jG z<{F}WZtI~VR%ak|@k+b4A4KkQKz`Ig(l%VQjIx$4*P65sZ++eeJDj0eP5MxxM@{Gb zqQt>)GXZfBy|&i zWh6O$Gp1U47q&50E8MotP1h5yxxF~sjXh6nqBpk?AoI}LAr`J}@p!DBwq`lKJJ%DULAoQsrCbv>F=6_F_(HoS+G zmU=6Vm*{++MNR)XxPjxWQG}Qd6IC@Bfk34}-zXtjGV!nk6k+RA_IKAh_xdhS?vx-@ z*tNgThTUIy1`*Y`-EfqS7fbT+9diEH}?}s$2Pa2TI`)xEO$?;1CxZj`Vq{g!5-R@ih(tRN zxPJ$7iM+yMYdGsAEKyyz{F*L>OJk$YumpMCB`oh_ypqVn4U_V_@6Qc$cO>fM2^$@+ z`r(fx#id#WC>5&}f|)EGe5MCezp9hoWB(9CjLW5v(UNyFYpA)5qebg^zdh-+Yy>$a zwLYOZsv)ijOXqoJJ)fZ>quFl6U`=taA7sz+7JvO?3c}F`Bt;>pM%D)I^-u3-`e|@S zmu5J&3w0%p#%@DP`q^raYq}3aP4A#!q_p{oS_V{gO63bX?5c$0h0Ni?vjuIWMSVJN z$<*n-hckXbRqxK-)g;7Dm0!JxJHP^O*ECeh%TF7Gz0O&<&_;=kBulYB=;S@PBbRG! z{OwJlLKyJZHk6@IztpxTUDP+Owr2!HY)L$;nZHN;a>ZdwbKf-r}y!WM`p=%Th|n4kDlbzTXl|&{v+C7ZL1NOhAFBB>KYLTf25dIl2Pki4a|L|a)rq4 zW;wRoYZ#rZsV=Y;`(@j`;+VV^hcBNq=&KG$j0tz~}8IJszDz%!&u_`4fsXObaPUzsyPR+6-Pv4t+Fp zF_+|FoaWp2PW`;*$<=iwSLBcj+l|}hFv`VX=0*`hlYc+LTs5KCKQj@V`QgpF126ey zn5TS* zX!LNJX8&7@9pD30JwX(@{%I+4=*^Y5m{(c-D-s@ha|$ldb9VktJmZ^4c*sP}^RGyl z{!Ju2Bo~?VS0wzu9r-^;Btw;wn;l4qa0i0)P=+c%*HgEXWd3<5j=?gNp|0ZT=}CXm z*g)j<<=GM-CfZD|52mZ%bbxrtg=~LEzLq31-X^+m28oDo$?a-Sp=e{F#?*j)#U=Yq zWSlFRju>3lumShR7I-S*vRQmJ=no(MZd{1?cNtm2D$h^-Zm``v3L*=yc!L2Kx|F*A zON@yVXDhM(lF_iNowfj!$+w+SarBkt?Jo<)qiNdY^N`qDy3Y^SbZB|tf7TBWh(f(3 zuQ;uGIyVFGH(7KjHq(uy_))%!Dt(LbZzJCJ*P&hM*fPQ=acOq-4>*Y?}Nz>s1AZ|pD zHgtG=BR%B!pADy)frNoYT=SAjt$P4}59_+PxQH_lHsnEU1BQAk_@aW*-159>?clVNR8az1Okw^2Z%( zdK@0%+{J&>Ujp2=pAM`oK$v`mxmW}kh9N+}gLF7utQKX1bhgcLJ*9LED0tZqBH-f^ z091bvNG*zYsaRcoL*y6C%WDBj$D*-88FW_5KI|>{RKS?YU~0STO8Q{B(G3WuEKE`z zXY3rKPTshUH(7GNFpc?glcO>c_gOHV8NT!J!biz!KpHO6Mh84p_UUAY5BOWJd>w(7 z76G^(+qdR#S`jUUJVkjwU1^PClq@y|#+^Y4+H$kAT%ms?$WU+NZkndZx_X06=Iuv` zT>nVup+SIGu%w2wy?>)VfcF>K_b{gN{zyD$0y-uzbXJc&=yDheLh@c;08soBtm}FJ zw#A#sRbv()(^^Ph=-MhAk_!x zds>#v@GqDh{g~I%omX5H2oE^d{n6hjsSorRf?uUt%1{Vbz0NwJowk3f_4yqEOj;cx z+gwMW0+koDZ6;C)w=MA8?ngkn-K8KjzKsCSAm7W~W=%hkkFi1b$VBW zi>}4U@m0#Eas^QHmv&=7bzO;T5xVV>Gy~)qB3%!lKF5!!dLtMO^1LfVAoM!gfW(<2 zAn%JUj=29P1U*$REZi6XDQl7^xoui{0Vpqa>od&q{iT?NAtt&= zzF?gPxQ0NEz@=>7TdtBPAoP2|o~Seu2!E9E=O}@Fs#~&?TGR_92$>?v^B=&&&T|C* zTn~}8=(?~uK;pFxr}M8;N!-xE-dDuo1AyxKm^IE_OnWF={YwUOipxguc;FHsH03^= z$dxiA5!z4W^KANPxiBR+nlVMp(XjF8v&lfefmWaPJLw}`h(7N32HxAHNiOFT3lDHe z{zT#_lD{r&(Oc%wCyCVV;HyYsq~PfHU-e5}0PeF@6dZc=PFW_Fxvrb|5m;uTBrV7N zY6ouwA^>m&&I1`_c%|?3XknzJmuN3$G_7&?{W2^_62fU9#g8c^nwNoa`G_m zs~>F^Rlg`n2CZWr19QPB^Z;D=7C~qOIAx~jNYg!UG+-`N(I2oODE3mFS6~BIW+_ju z;LV@(bt(UL(}Gw&Q;Ag_#AOqipB_UU)rEUEnG~QPS}S=z!h}F$1;5d}?_6S__ahnG zc!5;DV}NCgfX18$_^i=mfS0*7^`-Ea8v^$Ars$L4Mxs3P8^OS@o1dH%ysMY4!e*<- zX=6vk5&pWdKaV_Qr-A7wgh4Ld-_zdMbr647rR`E@y~<~(VKtk$?64`jdg8eOleTmJ(V zdjle zG=Th*r@?os6B#zTpzB1pkWx^KK@oe2OAq z41aQ~i$Vlus7ddfdLYF|h}Ah6RE6Y6t;AU_cmJknWZc5s*eekO8Di zDTk6lKndwCr9(mirI9WXmF~Xx{ET(4=Xv)$Z|-}o|4WBCb7s!jXYcR6zSrkcScH;& zWK6j{ZcZr(+8V`ziwtRfMVgily6opEIbE{kvR|xh$Y!}@T|2;qyc-R}--=BxcaQML zxdL6^kfnE1GHGh1ux)j}Z-AABzqQEb?zZw(&u{zrAmnc$s(@wuCZecu|EuD==MZdc z5ev)CT2>>N925~0w)b@8M(dA2q4vj0S~76}1PEX9XF#QGUbx6DVVa4_G>aX*EA#C_ zU&#g@CNALEJmp5!4Pj{4Ux~!IHis0B4U$dzK?(AA-5f}kt-nN;;Xx$COCgvO?X zdgUCC67srAc>Vfrh;!o#b@HJ94bfLhCx5F;do1HcHX+-7#!0V9r|7*6<#qV%s7zK1 zMSR13QSs|tYBrVx_M=6qu^$ZCo4#`DGqa2OAmjOY;Y40;fVDlx$Mi2$gogr=$+-I$yfP8;!{V zFlP5HqY!+$=$-0F9>H~+n?+qqE`m+E_wsTc1r_ZeSg<%bNE2=AeaLgJD(^4Sm8KvLKXPT zL_z3_@;UDs29-EaNNJjr9{%9RIyll=)!QAj zi&}maXi@=_;$5>Eq0q{xFwuL$!lPVXNs`5GlW)BFUcu=KS)gOfjdgG@af zAqf%Pf@_Iy^>9)~=NWiTcN#K7;^JK@|MPSJTL+6FuvYa93P*CV^PLc@-pVKzMC2-TNa`5=0-V5ja)Zatp!VPO197pu@;`}4(DsQaOnr?!;Lz0(#AH^SK zqY7+PvOC`>|Eol!*faA}qp}Mt{?)UC6kw-96AS(K0#5?i5d9zgmhKd&5U5xgfFXf{ zB667r4HnJVG=Si^yNyWAfkM0jG>RU0iunT|G3|zRn2R-1x{%>+=W|f9K05<#RC7OK zBKb9MsZOAaRQ3Zd4gxSZxQ%|=Fdg|}DH*sF?jQ$Y65xRL$#=a{&j7ne-mJvz)8YMo z>GD@F{lm;|LAA`WjQG|Yb~FI2ZsHSd!Y@t8N$8PlgK2OAr&nUW5mh|K+NI{xGYqIh z-^J%*Dv8aKYkc}wjFY|tJ5D?_!DdCF?`Q*aLY+6ai5DLLt47VV_u}(cEJGr|HT>j&)+)JqUW&<4S9*Iu7)bd7`Dfcs!>igsg6?u@3L zBv)dbpS`CkzDzXBEiptc2R}fmEe^m}Sp8`M%5Z@&?i^q^!xSw)cbFefxqUEY zOW^P4ia2Y9D$s+h!-FhA_-ghGWI7&`N8FY{6!L6u3^5G~l%?1s`IGKj-kX-~H~S~g z!4_kYx&gR)D~yCCd@`Q=;C_QV_WM9@I}RK@vaXTapxp3PrCC{eicJ#1{Gox>y(CET zbhEw5Nw%k>NYm8b)(mce@r1b{f;MS1OiG>u>)bf#1#S3z9tBwdeHOIY>4H{4nqmN$ zjT^zl7Jzt@N3R#lgn=n(Rx@S*RMX#|z)GZ9Es)Vc$WCfQ?+0cXf>+%^O*JVti(DkF zzg_x%T_S+LjvwQBxdm!?sOr@*j+HZzld*U9)i%TL7Z`0<6{#mMJ6-4IGcU-8y(`H8 zt?RHT+=K%H6Uw~x3??AuyT2>DM9^z!fAX>M2;7Tfug(G9v1%je}2G!y{$B1iI1nBES(x zDtT2VC5YbJhwKfXC5IJ@jCUD^lJu88ZCzOcZ`uk!gm1De%Qp7%6pn+spE=>^Iw?D| z-Bptg3y&{~qV|LA;ORJX1oWQ27`L<5t2xuvi{+Sx*jdndzg6@qd@+2dRZKNm6r z(C|RVUErot)fJema-10C6%WaD9gOiv*Cyq0 zwgqYjiuEjXru6E9-D8lNLZOkh=_$^^TQJ+0b0m07+o5iCV^n7GK-{0>H|9 zT_7ss4x`UfJi&_LVr)7G$NbFro2sq!|6or(P3<`0`I9GLgJlZ2eZuTL7r49+rD3&W_WG0RV>oH{qu_i}H|*yE;i3|%;j^&^ z?c7krReuo2cg`aCYqZ!D&R5|X96RuHX2#F^-8ogycM`b^v^%Y0Yd5#ic?tqvs5Sfz zwAr~;x;!tF=5;98w|gqcWFY*IlAi2DV*)dEmjG{zy=l$0#-Bm_Vo2`R-z0 zs@O-c&U+IP4N+D*jP0MfVy7Os;3p9kUF%86$k>=IDIbK}unWCkd~}JlgSbjtR4nD# zFW1`Jm%k7-oU!D-3K=a0p#!bxisfS7sxQRKiV0!)jo^pgo<~#WmMl~N2}LO!5bn9N zT|$ad90V>0vZKJzs#82_{N+4s`$a8!gT?4}9pXg}@S8S4-fuL$Z_X%}v2tsdi04Bo zfmj~t^xK=0302Hi;)e}Ic(fhqf)?2FijZk{vsn=IhzEev&ro@Ohpy1G=cb_)^-*X^*7 zNRM0MD%oMTodyVw;dMrM%~i^!ZQZr}++oX}C<$0tf5L|VrT1@9Ue=9AZ_EZY2WM)9y#>_ndTm=E{8{m%gqpqQZ;| z0}y<|Lrb+pepGsibkC9C*5a>T%LqBSi?(4kWrkb`kW9&fPKPZ#$~?H3GZ+mAZ;UC& zExi$j=;#&a5x|$n{fWU9ea#lAPhfyCPJ@YR;_de)Uj|A=I94J(@+WHCM+n zLV%m!IG^a?G3-{8`bdqp#iD&R=pSoU<0RQ%p`If7wwc(KvY5xd8;#8+cU>0N)Y*6W*lFUAax-cl%rNufj$Sh0$&O~* zd01Hd?aUlwhu$zGM-ifbY+_sHv;&dtTY!-XP-mnpxJVx+oey$~g)Xo3`g~v1lxGkd zx5VD)+6KeoNi>lYArg6cofKQ#B?HXz$s24M#c578#u5Bp(K->C_i^T1`(>U9T&@5? z6TTT_e7INnjiSl;1UkN)>s55pn0j-THtxSPTyOh9*)JUQ#)0fO34a(56 z&%SvUncVK##sF_3MOzffz#;)~Y$us&_=+H+Hr3&EfsNvc>8t&FR_(UmKn-<3NZ@av zY(&8t%AG7rAuzKZlYi)<x~8i%xAQ4G3#^(UT-H6JgD%RHRr zo{(+JeCvny=*x6ns*DI9Wg)T!_Q*_`oM<-UA#(hfDmAi*Orx@;N)qeWsUthuoFcGajDX@k~P1dZ_-33M&L=%(5cPB6!5J&36`}W z8gG}f8e8d;^aYd!Cn;my0~121BdtH}bP}j=U`y)W#m6QNVq3$B-28@(0d<>a;Aacm8R}JmqwWDe+7hQW6}I8fcJ9K^IZ%%$rpLEI?K8#V8+G;;G8sJ%suBgZXHRI=#cOX)4jQL+&fD}muBMmJLcc6 zBB9Xm?ztk9?3Qs^SA))05mexd+%)H{{3)5`^bt8m&-a%H@;WaM6_;@@+>d5siFpe$ zIp&IfP`;A}Ypjh#XfIwpp7SvCk6erOEXITr|3#RRU)2qKjTa%I`|nnthnOZXypDEs zPw@63o*(@jIXUuI7_Z*O@L8+-^4|PJ50@RzY8Adc3OVG^}cF z&3fs;qCX9H2z$4<<`MPo@xz!(_tE$e)6@zxVK-&3(aH$k6$qE!wghivbIcSAr1J%h zl75IoQ5}5Ur54K5tK@@XK;KIrTuevGGq@ew%oaOu+a!C$phpJt@+|O4+Tkr2A%N%A zrQ9?u>@Dk%HRB?CaIFMDg{?*~KMc$g%=rOVs(ZqrM)S<1H#FBj2hGZjr) zvRK8bf?MBXzu4t0(M$TkYA&j4YtzP3!{Dp3e1_4{LhjoIW1aOENrAD~_id$ zneiOrxirR<6StHOf}2N^u!+HbYJ0qIkB^sT-u7|BXACppT;0^%wFQGhPT{&Y&L!ZN zh1XghE2gOY0u3mA5!F2mh$hod_Vy+uK8o{$WmiK$ic;zKVE!@UGIyUs z(SNVdfmZYly03q_RRE_l1FdMD?g4;VgZ_1*^Q>6o%o3>QSXwB#mT}WQftrfSsL-G|imKA?3-kmCNltwt zV^y5$FR3C`Jp~_pq5~V85ywP*18xdp-~Lw6Y;k&iO@xO+=?MQB`(JUF8_U>+TpUnI zPF+lopZVYVRTk_7db*fq+}B?dmBJ${%e}G$Su#E)N1-r?2(`&~Te>FkZ~^&GhKgjhY_Lv~djdhKUh0noqZ*1-R;^bn`R-Q1$Kza`M|T68MWv&}Bw)5-1CfAlj)am_(u*UP6+f zABEpSBDJfP26uaX@tj%eE2iUup~ijzkfE4FQq_@7MY+_x(Gi@w0u-y0bmO2;X2Brl zY!>OGnwIG@+vEl6Tc4Z-zzP8W-SNjqHqi|r9J2ntb2XD5(_&`r9qd$$oazUn*e{^!lwF)OU+lC#`u3?D z(}aFY`mqPB&bFA&yc>qpn+E-qtzR<>Zmm~nsR)ShU<5`Y{Pjx|7BolXROD3rROMQt z^G5tydIlZPU7%2yU=lZh!Ju+|`aOda>jeNa6ywe786-U3&I+t*LgULYW^oOvJ-tcr zrPsin;o**6_$|5?M6?)~I@w?v-lbcs&n1 z1e*FLwjkl^aqv%Pv!Mm7^FRnxDtSfod7Nk?|wO4?O+JGz{Ihk zxOJnJxYsX*Ug216!6x11(;h6-`xEF`@uI~(FZ}^fW71rvK%>k7(5IjJ!@>;e14SJ= z8aufFzq!}}g2Offz!T{C8kidh#ALXpsKQ)UK*Rc#tL_!;G>G4>c1GA!gx~Su8Az-< z^cJ(@Dgni6$j;?E3@aK511qR&78k7Hj0vuUp#tsPxQKpZq0<`y%>IW~5Da9=DK|rQ zfl-Z2bIWXDU=CLw^5JGThD*g*R%%fVpwWjwOB-RC zRM}Z!wt{OwO2Nd9`dCDQ*tn5!TG}pCM3Bf8abT5bR17&IXS-dtMH69}kFP6>$@c>h zx80^fPY%}C^5W4#_kWf)H(glueV?ez8yJA(Wh)e#pew8$imQ|2Hvp7-Lu~xyGz4fD zliyI}?e2j%eMx>ltP9xrjl>oZ5O@nF%*|`7llEj+ZA5Ub5*R;>SNhWzjfd8)r(0J& zLD^aj=8w@lo0nG~K}gB~qp6l=5&wJg)0fW#E&tI>S!|1X-~4KznChv^t7tonazoW1 z>?dX&C#@=ExON8qnQw18jDEuCI~gIXR4A%%9hl@fpqTC;>nb(8uVmKMX(4(qas9+N z0t|k+QlyWxD=pTNpWf7R+-%0@qF=ro8qCdr76*+kWCosMuzQe}D1x^t&7RI5hQ}9~ z<8;_AxF;W=^;D~(dq7V&4iK`wIXsM&cR}KyM>mBT3NQBsf5WC6Bqr!~`e9lJH97Ku z5ye&AkP%V0Kvut3K-tA$w}>cxY2gQ-HqSZ16XhgXzyJGjt_ZobXyo1FW#B1o@Zio+ zlEZEA3qMv1(zMj_Y00@7NP*_H-zOlJLvk!F&(>;Z8=y~xS}sN13%(bW_`0r6FjHuJ zp*D~sR9^!A_TFWgw=N(MdGiG0Wig~Uq`_+=r2E>zLx<}eLr!(cU)Hs%)AkC4BFTXD zuv|;SRcrcQ^!3vly*M$&*>}n3(_r|$I%GGkn}~$`j(5qHYAujkp;Ewv<29_UWDM4) z1~x(R*5h5kM4A9fydi-~=ygO{_RB=EK+}jJgZ~W6nLh|DuaFuzA_7`fy+l=?J35=W zPZ}u(Z%$w3qi!e<&nHF0>D2_@eTVvjng8tAK9>u)B0by?@h6zHr$-1LFObjYbLEng z5WHvMH0s3z;NV(&CfqOBG@;$>@0UUS5tjxJg^RnM*%0F1UIP;K{Fe#(i&1@D?J4)# z+Q@!by$j}s<~qcIphJ%P0wYNhc0`1@x{_cqDSVt8s`!?TYWSU}Ln+*?b$g90iG~fS z5VOjRYRVK0l`MMLmP*UP0skHb|J$5Sy0kb9l&>|0Ruv^0&-;z{U+fT)h-kzsPiBL( zAvX86j`9)Wx|yRvbq98|KI=Rx0>*5sZcBfsjyt@{t#y9bSPeN1-<$iq3PR+{btO*S zT+cgvD7*UWaPSOPq{&ImogqplUzvLE{Y1rwq?tz!zM~dE%=i(p6Iyp2l_)qxDZwqM zGiHhtwpuk>@4$&P;w7fstp=Xr>=N7RGrDsN&m_%l{y=d+n9(7NdwyUxM)a%8cLrlb z2aMA(6ldzA)lz0}P$)>xeNSkrdt9)i{BrNBjt+Ktn5E*}^H&2ci+Vi*$O=X-9RyXF z&83W}y6ouaJk=T7-r#)JT=6nGORGpC5;U?Dn^(!`Awz8JhHztGJFk;Da92U`M&rVk zE0C2q86=}2$@(b|?p=%2tXWj04B6lLl7_*b@meV@$dUS+mH+HBHso)UqLgh~xz(k- z*+@Z4Vyfa^vq{%=T7LB!l)bA&=RoL)DCP8+P5N>xuL(D0GAr2?{8$P@A?~wLg^>3sx!%OSCd4tl;Xua#{#f+&Y|&z5jAA;s`)JEhMXL^T)pg z@+l%g_fyD9m-F92Y9OB?fgtLid0!z@4HWk%f;6E&mP3#$8w3tg)6%2=cWxUfDCO10 zQFs0(VX#nwgYE~t?){ex52FOd{r~d|E3#8k>4*LKNf9!sn9L1IQJX*gT)_9@fP+#q z-wOTNSIFS>DgZ-kY8m%mVkJU`6Vpw`QA}k0Z?Is-3n%!My&>wU{|*wuqY+Sm=l+(g$p%SFS~8X#^+y zb-2Zlb#p6bAFL1+=l=XsBtBu=*B$>;ar&=^=owJDzYOwZmTlbTuYr8vt6AJHO{>|p z54c{w)l5B3A3j#8Wd6z);$Qz+)UmS2cZZhqR~GHc#OE*3P9upA$3>ZTK#aW2R|?*gNB$<+ZMUm+$4wLswQmOaV*>HanGM$y>=0v#UBP8OLy;DT3j{0 z-#h>-BQ_nYXna3beqEH?k#r6DW)|z@Te#wAnfa@=(c&1U3R9-pR~~L#xNjV%x4$zM zn%){Hkthx6*kn}xoJkn5mr|uubd}-wc5=shUD-Cb1$Lj2+&5 z-PDM)w^p6<89H}JH~0v)7i6nBum zr~Ge5Qpdm{1*SSN$MjR$jPJa8&Gx-ih`oh)m@P)VANFdA}4qJDcAw??*5jCf!FtDx-1arO4X0ukBsNzQcIN1z$PHh8;j}! zY=iWL1-V<_`c=ns9uMsI4mKu>RsiD2TM@7GwQn-=*1`8<#OiG)hp&kTedS<0x+kR| zOS6d?D?Up&nSFHa2qmCljQs1T;Rr0!Q!qLb^3a=~1i7b)ZF474Y34H5L_X~VKW6-j zpLbtSzkJ+SCS@CDR3MFnyJi_Gz(`jI{f!^fql2N_Lm^nwS}s$f%oZPy-*KmSP@u>L z9h_TJwheV%w31C73C|Dh;p8v%<`3HnsguBU;z{0TWO7j1&M%;sm7 zfrhtJa_P^9?pa^6{trfJD0)xKu%y@-mkWxa?tq{O42klb;)B$QG>G+@Q`IJs8FBm2s1}02|QZs|oxu-h2qAuOr*%T&{9<(iI&} z-}*EUA%x_knbk==yhe5@L2|3d$W6J@!#Q5Izy8Pq_OeenT8YKV1-=7o4h+&EvW>C2 zH(%8kyXh3P$>Wa6&I(j8PY%}%k?^7kS;JhOn$72OB7Orbt}UGyfThj7`LT)$8KbWD zy>l;J8eTDeJwZUR=v|e2xpdv&+K-Z-RCM>d-zxey1Nz8!qcU`~#8dtK-f0-3!t&mQcS)_YVUvc)bDS4 zK7V~aKP#8oZI%}&xlzQ`hlYmCHAGPi*|uQG2Z|rf*%TqM{vkp9zr<^&Og(f^~23m&6;hUll%nl_uLt8|>cZL7>vbqyEsyCC^A|?}61_HSRt)6?KPN z9j?1(c0`5lunUh`XqZb@!_gP4l}wW%-Wyd6vvdfg*G~H*KdI-_dNguPYZ4>-B<~p? z|I~XsUMBGGzChy=Y2v8^TlLi0#QG{`-l>k|@b^8FYoVBqZ8o>7oElRuh35oLFXgIY zXd2D(;+=B3?@40`C2JBQYu$}MjuUTUr{4>9thaCSd++hC1CRa8>cFa<2DLBbP*yrx$9=mutH#`kCIV+>i!c3BR?8LJ$a?bk(cEX+hlNoJYD~(9bMy!b|jqnOFg;ENvSw6&j@RtgD`|!U& zrs;^@0!VWtfpZV9t_W}ah66iMhGvG4Uu3n%$Ghz)RrhN#kN~Gwe#d=K-}9Ic=O2rn zPiOWYNGt@E;tvTL@ouNT3m*xizF}2>quO0(LDay(ZggGl+{2Akz2G`Y0lcLD@v-_x zk-Ly7vD*uBzMD$*$Gf;Q^`gvqet!z9w}gPrfmT32|ELSBpB`MU$=}W*yXkB+T#>+Y zSJH89Bs~=xI_%zQX-^O&!Ukgvv5IdIidPxz%u#`~rT7yRy2#O)>h+aQq55t)OAtcn zntY*uZy<}NtO+H8)C&QycGECDOnGEQts&`%pa++ zmk^d5`=TS!--Gbuu{tCEdly+ZK7RbO%Ila9lX)t`%A!C>#rEGv%doJqC4=Dv2gdMY49U-tJ>4-6|*I z_fTkQCfb$G-Mw)x?d0g literal 0 HcmV?d00001 diff --git a/docs/static/img/next-tutorial/new-project.png b/docs/static/img/next-tutorial/new-project.png new file mode 100644 index 0000000000000000000000000000000000000000..58462d1f1cb71eb94a1e6d80f48cafb78dd32528 GIT binary patch literal 67489 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 NRMS;0y>UO}{{Tx#opS&H literal 0 HcmV?d00001 diff --git a/docs/static/img/next-tutorial/next-config.png b/docs/static/img/next-tutorial/next-config.png new file mode 100644 index 0000000000000000000000000000000000000000..686eff3bf839ffa42387ec5aeb0e03d387a735ea GIT binary patch literal 130664 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 E0HQ1d761SM literal 0 HcmV?d00001 From 570319f10852299302c107507408809215e1d095 Mon Sep 17 00:00:00 2001 From: ryu <114303361+ryuapp@users.noreply.github.com> Date: Mon, 9 Oct 2023 18:24:13 +0900 Subject: [PATCH 24/34] chore(examples-fresh): bump up fresh to v1.4.3 --- frontend/examples/fresh/.gitignore | 3 ++ .../examples/fresh/.vscode/extensions.json | 6 +++ frontend/examples/fresh/.vscode/settings.json | 17 ++++++ frontend/examples/fresh/README.md | 2 +- .../examples/fresh/components/TodoItem.tsx | 14 +++-- frontend/examples/fresh/deno.json | 35 +++++++++++- frontend/examples/fresh/dev.ts | 5 +- frontend/examples/fresh/fresh.config.ts | 7 +++ frontend/examples/fresh/fresh.gen.ts | 4 +- frontend/examples/fresh/import_map.json | 13 ----- .../examples/fresh/islands/LogoutButton.tsx | 1 - frontend/examples/fresh/islands/TodoList.tsx | 53 ++++++++++++------- frontend/examples/fresh/main.ts | 6 +-- frontend/examples/fresh/routes/_app.tsx | 25 +++++---- .../examples/fresh/routes/api/_middleware.ts | 21 +++++--- .../examples/fresh/routes/api/todo/index.ts | 9 ++-- frontend/examples/fresh/routes/index.tsx | 2 +- frontend/examples/fresh/routes/profile.tsx | 4 +- frontend/examples/fresh/routes/todo.tsx | 4 +- frontend/examples/fresh/types.d.ts | 7 ++- 20 files changed, 159 insertions(+), 79 deletions(-) create mode 100644 frontend/examples/fresh/.vscode/extensions.json create mode 100644 frontend/examples/fresh/.vscode/settings.json create mode 100644 frontend/examples/fresh/fresh.config.ts delete mode 100644 frontend/examples/fresh/import_map.json diff --git a/frontend/examples/fresh/.gitignore b/frontend/examples/fresh/.gitignore index 4e06ffcae..00e2e86d0 100644 --- a/frontend/examples/fresh/.gitignore +++ b/frontend/examples/fresh/.gitignore @@ -4,3 +4,6 @@ .env.test.local .env.production.local .env.local + +# Fresh build directory +_fresh/ diff --git a/frontend/examples/fresh/.vscode/extensions.json b/frontend/examples/fresh/.vscode/extensions.json new file mode 100644 index 000000000..971c0ed56 --- /dev/null +++ b/frontend/examples/fresh/.vscode/extensions.json @@ -0,0 +1,6 @@ +{ + "recommendations": [ + "denoland.vscode-deno", + "sastan.twind-intellisense" + ] +} diff --git a/frontend/examples/fresh/.vscode/settings.json b/frontend/examples/fresh/.vscode/settings.json new file mode 100644 index 000000000..a5f0701f2 --- /dev/null +++ b/frontend/examples/fresh/.vscode/settings.json @@ -0,0 +1,17 @@ +{ + "deno.enable": true, + "deno.lint": true, + "editor.defaultFormatter": "denoland.vscode-deno", + "[typescriptreact]": { + "editor.defaultFormatter": "denoland.vscode-deno" + }, + "[typescript]": { + "editor.defaultFormatter": "denoland.vscode-deno" + }, + "[javascriptreact]": { + "editor.defaultFormatter": "denoland.vscode-deno" + }, + "[javascript]": { + "editor.defaultFormatter": "denoland.vscode-deno" + } +} diff --git a/frontend/examples/fresh/README.md b/frontend/examples/fresh/README.md index 7fc9e3097..7a4b49f3a 100644 --- a/frontend/examples/fresh/README.md +++ b/frontend/examples/fresh/README.md @@ -17,4 +17,4 @@ In the `config.ts` file set up the correct variables: ### Run development server -Run `deno task start` for a development server. Navigate to `http://localhost:8888/`. This will watch the project directory and restart as necessary. +Run `deno task start` for a development server. Navigate to `http://localhost:8888/`. This will watch the project directory and restart as necessary. diff --git a/frontend/examples/fresh/components/TodoItem.tsx b/frontend/examples/fresh/components/TodoItem.tsx index 6c803ad5f..154e1ca3b 100644 --- a/frontend/examples/fresh/components/TodoItem.tsx +++ b/frontend/examples/fresh/components/TodoItem.tsx @@ -21,8 +21,7 @@ export function TodoItem(props: TodoItemProps) { if (response.ok) { setChecked(target.checked); props.onUpdate(props.todoID, target.checked); - } - else { + } else { props.onError(response.statusText); } }; @@ -34,15 +33,20 @@ export function TodoItem(props: TodoItemProps) { if (response.ok) { props.onDelete(props.todoID); - } - else { + } else { props.onError(response.statusText); } }; return (

    diff --git a/frontend/examples/fresh/deno.json b/frontend/examples/fresh/deno.json index 37db4a1d7..1fff6a1f1 100644 --- a/frontend/examples/fresh/deno.json +++ b/frontend/examples/fresh/deno.json @@ -1,9 +1,40 @@ { "lock": false, "tasks": { - "start": "deno run -A --watch=static/,routes/ dev.ts" + "check": "deno fmt --check && deno lint && deno check **/*.ts && deno check **/*.tsx", + "start": "deno run -A --watch=static/,routes/ dev.ts", + "build": "deno run -A dev.ts build", + "preview": "deno run -A main.ts", + "update": "deno run -A -r https://fresh.deno.dev/update ." + }, + "lint": { + "rules": { + "tags": [ + "fresh", + "recommended" + ] + }, + "exclude": [ + "_fresh" + ] + }, + "fmt": { + "exclude": [ + "README.md", + "_fresh" + ] + }, + "imports": { + "$fresh/": "https://deno.land/x/fresh@1.4.3/", + "preact": "https://esm.sh/preact@10.15.1", + "preact/": "https://esm.sh/preact@10.15.1/", + "preact-render-to-string": "https://esm.sh/*preact-render-to-string@6.2.1", + "@preact/signals": "https://esm.sh/*@preact/signals@1.1.3", + "@preact/signals-core": "https://esm.sh/*@preact/signals-core@1.2.3", + "twind": "https://esm.sh/twind@0.16.19", + "twind/": "https://esm.sh/twind@0.16.19/", + "$std/": "https://deno.land/std@0.193.0/" }, - "importMap": "./import_map.json", "compilerOptions": { "jsx": "react-jsx", "jsxImportSource": "preact", diff --git a/frontend/examples/fresh/dev.ts b/frontend/examples/fresh/dev.ts index 2d85d6c18..ae73946d7 100755 --- a/frontend/examples/fresh/dev.ts +++ b/frontend/examples/fresh/dev.ts @@ -1,5 +1,8 @@ #!/usr/bin/env -S deno run -A --watch=static/,routes/ import dev from "$fresh/dev.ts"; +import config from "./fresh.config.ts"; -await dev(import.meta.url, "./main.ts"); +import "$std/dotenv/load.ts"; + +await dev(import.meta.url, "./main.ts", config); diff --git a/frontend/examples/fresh/fresh.config.ts b/frontend/examples/fresh/fresh.config.ts new file mode 100644 index 000000000..3a9509b24 --- /dev/null +++ b/frontend/examples/fresh/fresh.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "$fresh/server.ts"; +import twindPlugin from "$fresh/plugins/twind.ts"; +import twindConfig from "./twind.config.ts"; +export default defineConfig({ + port: 8888, + plugins: [twindPlugin(twindConfig)], +}); diff --git a/frontend/examples/fresh/fresh.gen.ts b/frontend/examples/fresh/fresh.gen.ts index 98c420f76..3efc6bc6b 100644 --- a/frontend/examples/fresh/fresh.gen.ts +++ b/frontend/examples/fresh/fresh.gen.ts @@ -1,8 +1,7 @@ -// DO NOT EDIT. This file is generated by fresh. +// DO NOT EDIT. This file is generated by Fresh. // This file SHOULD be checked into source version control. // This file is automatically updated during development when running `dev.ts`. -import config from "./deno.json" assert { type: "json" }; import * as $0 from "./routes/_app.tsx"; import * as $1 from "./routes/api/_middleware.ts"; import * as $2 from "./routes/api/todo/[id].ts"; @@ -32,7 +31,6 @@ const manifest = { "./islands/TodoList.tsx": $$3, }, baseUrl: import.meta.url, - config, }; export default manifest; diff --git a/frontend/examples/fresh/import_map.json b/frontend/examples/fresh/import_map.json deleted file mode 100644 index c3957061d..000000000 --- a/frontend/examples/fresh/import_map.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "imports": { - "$fresh/": "https://deno.land/x/fresh@1.1.6/", - "preact": "https://esm.sh/preact@10.13.1", - "preact/": "https://esm.sh/preact@10.13.1/", - "preact-render-to-string": "https://esm.sh/*preact-render-to-string@5.2.6", - "@preact/signals": "https://esm.sh/*@preact/signals@1.1.3", - "@preact/signals-core": "https://esm.sh/*@preact/signals-core@1.2.3", - "twind": "https://esm.sh/twind@0.16.19", - "twind/": "https://esm.sh/twind@0.16.19/", - "$std/": "https://deno.land/std@0.187.0/" - } -} diff --git a/frontend/examples/fresh/islands/LogoutButton.tsx b/frontend/examples/fresh/islands/LogoutButton.tsx index 8e54437a9..8af47b784 100644 --- a/frontend/examples/fresh/islands/LogoutButton.tsx +++ b/frontend/examples/fresh/islands/LogoutButton.tsx @@ -16,7 +16,6 @@ const code = ` }); `; - export default function Profile() { const logout = () => { window.dispatchEvent(new Event("logout")); diff --git a/frontend/examples/fresh/islands/TodoList.tsx b/frontend/examples/fresh/islands/TodoList.tsx index 1b8218c22..43a6a5e50 100644 --- a/frontend/examples/fresh/islands/TodoList.tsx +++ b/frontend/examples/fresh/islands/TodoList.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState, useRef } from "preact/hooks"; +import { useEffect, useRef, useState } from "preact/hooks"; import { TodoItem } from "../components/TodoItem.tsx"; export default function TodoList() { @@ -18,8 +18,9 @@ export default function TodoList() { }, []); useEffect(() => { - if (error) - modalRef.current.show() + if (error) { + modalRef.current.show(); + } }, [error]); const handleSubmit = async (event: Event) => { @@ -31,7 +32,7 @@ export default function TodoList() { body: JSON.stringify({ description, checked: false, - }) + }), }); if (response.ok) { @@ -40,7 +41,7 @@ export default function TodoList() { setDescription(""); } } - } + }; const handleDelete = async (todoID: string) => { setTodos(todos.filter((todo) => todo.todoID !== todoID)); @@ -57,25 +58,41 @@ export default function TodoList() { return ( <> - { - error && - -
    {error}
    - Please login again.

    -
    Login - - } + {error && + ( + +
    {error}
    + Please login again.
    +
    + + Login + +
    + )}
    - setDescription(event.target.value)} /> - + setDescription(event.target.value)} + /> +
    - { - todos.map((todo) => setError(error)} />) - } + {todos.map((todo) => ( + setError(error)} + /> + ))}
    diff --git a/frontend/examples/fresh/main.ts b/frontend/examples/fresh/main.ts index 8fbb7ed32..675f529bb 100644 --- a/frontend/examples/fresh/main.ts +++ b/frontend/examples/fresh/main.ts @@ -8,8 +8,6 @@ import "$std/dotenv/load.ts"; import { start } from "$fresh/server.ts"; import manifest from "./fresh.gen.ts"; +import config from "./fresh.config.ts"; -import twindPlugin from "$fresh/plugins/twind.ts"; -import twindConfig from "./twind.config.ts"; - -await start(manifest, { port: 8888, plugins: [twindPlugin(twindConfig)] }); +await start(manifest, config); diff --git a/frontend/examples/fresh/routes/_app.tsx b/frontend/examples/fresh/routes/_app.tsx index cd972311f..dca16b0de 100644 --- a/frontend/examples/fresh/routes/_app.tsx +++ b/frontend/examples/fresh/routes/_app.tsx @@ -1,16 +1,19 @@ -import {AppProps} from "$fresh/server.ts"; -import {Head} from "$fresh/runtime.ts"; +import { AppProps } from "$fresh/server.ts"; -export default function App({Component}: AppProps) { +export default function App({ Component }: AppProps) { return ( - <> - + + + + Hanko App - - -
    - -
    - + + + +
    + +
    + + ); } diff --git a/frontend/examples/fresh/routes/api/_middleware.ts b/frontend/examples/fresh/routes/api/_middleware.ts index 4197fe496..bef981a41 100644 --- a/frontend/examples/fresh/routes/api/_middleware.ts +++ b/frontend/examples/fresh/routes/api/_middleware.ts @@ -1,30 +1,35 @@ import { HANKO_API_URL } from "../../config.ts"; import { MiddlewareHandlerContext } from "$fresh/server.ts"; import { getCookies } from "$std/http/cookie.ts"; -import * as jose from 'https://deno.land/x/jose@v4.14.4/index.ts'; +import * as jose from "https://deno.land/x/jose@v4.14.4/index.ts"; const JWKS_ENDPOINT = `${HANKO_API_URL}/.well-known/jwks.json`; const store: Store = new Map(); function getToken(req: Request): string | undefined { const cookies = getCookies(req.headers); - const authorization = req.headers.get("authorization") + const authorization = req.headers.get("authorization"); - if (authorization && authorization.split(" ")[0] === "Bearer") - return authorization.split(" ")[1] - else if (cookies.hanko) - return cookies.hanko + if (authorization && authorization.split(" ")[0] === "Bearer") { + return authorization.split(" ")[1]; + } else if (cookies.hanko) { + return cookies.hanko; + } } -export async function handler(req: Request, ctx: MiddlewareHandlerContext) { +export async function handler( + req: Request, + ctx: MiddlewareHandlerContext, +) { const JWKS = jose.createRemoteJWKSet(new URL(JWKS_ENDPOINT), { cooldownDuration: 120000, timeoutDuration: 15000, }); const jwt = getToken(req); - if (!jwt) + if (!jwt) { return new Response(null, { status: 401 }); + } try { const { payload } = await jose.jwtVerify(jwt, JWKS); diff --git a/frontend/examples/fresh/routes/api/todo/index.ts b/frontend/examples/fresh/routes/api/todo/index.ts index 4438af0bb..0d9ea2429 100644 --- a/frontend/examples/fresh/routes/api/todo/index.ts +++ b/frontend/examples/fresh/routes/api/todo/index.ts @@ -1,5 +1,5 @@ import { HandlerContext, Handlers } from "$fresh/server.ts"; -import { cryptoRandomString } from "https://deno.land/x/crypto_random_string@1.0.0/mod.ts" +import { cryptoRandomString } from "https://deno.land/x/crypto_random_string@1.0.0/mod.ts"; export const handler: Handlers = { GET(_req: Request, ctx: HandlerContext) { @@ -7,9 +7,12 @@ export const handler: Handlers = { const todos = ctx.state.store.get(userID) ?? new Map(); return new Response(JSON.stringify(Array.from(todos.values()))); }, - async POST(req: Request, ctx: HandlerContext): Promise { + async POST( + req: Request, + ctx: HandlerContext, + ): Promise { const userID = ctx.state.auth.sub!; - const todoID = cryptoRandomString({ length: 10, type: 'alphanumeric' }); + const todoID = cryptoRandomString({ length: 10, type: "alphanumeric" }); const { description, checked } = await req.json(); const todos = ctx.state.store.get(userID) || new Map(); todos.set(todoID, { todoID, description, checked }); diff --git a/frontend/examples/fresh/routes/index.tsx b/frontend/examples/fresh/routes/index.tsx index adfdb8b2d..29ca5d24b 100644 --- a/frontend/examples/fresh/routes/index.tsx +++ b/frontend/examples/fresh/routes/index.tsx @@ -1,5 +1,5 @@ import Login from "../islands/Login.tsx"; export default function Home() { - return ; + return ; } diff --git a/frontend/examples/fresh/routes/profile.tsx b/frontend/examples/fresh/routes/profile.tsx index 4d95e29dc..6e5c6306e 100644 --- a/frontend/examples/fresh/routes/profile.tsx +++ b/frontend/examples/fresh/routes/profile.tsx @@ -7,9 +7,9 @@ export default function UserProfile() { - + ); } diff --git a/frontend/examples/fresh/routes/todo.tsx b/frontend/examples/fresh/routes/todo.tsx index aeadc20db..d5cbfdfc6 100644 --- a/frontend/examples/fresh/routes/todo.tsx +++ b/frontend/examples/fresh/routes/todo.tsx @@ -7,9 +7,9 @@ export default function Todo() { - + ); } diff --git a/frontend/examples/fresh/types.d.ts b/frontend/examples/fresh/types.d.ts index b8e61d334..8e601431b 100644 --- a/frontend/examples/fresh/types.d.ts +++ b/frontend/examples/fresh/types.d.ts @@ -1,12 +1,11 @@ -import * as jose from 'https://deno.land/x/jose@v4.14.4/index.ts'; - +import * as jose from "https://deno.land/x/jose@v4.14.4/index.ts"; declare global { - type Todo = { todoID: string, description: string, checked: boolean }; + type Todo = { todoID: string; description: string; checked: boolean }; type Store = Map>; interface AppState { - store: Store, + store: Store; auth: jose.JWTPayload; } } From 7069362834b636a649a0c1532dd51fa0697f7217 Mon Sep 17 00:00:00 2001 From: lfleischmann <67686424+lfleischmann@users.noreply.github.com> Date: Mon, 9 Oct 2023 13:11:07 +0200 Subject: [PATCH 25/34] fix: set x-domain cookie lifetime to configured session lifetime Cookie max-age/expiry is calculated based on the X-Session-Lifetime header. May lead to minor differences (in the seconds) between actual JWT expiry and expiry set in the frontend due to, e.g., low latency. This was deemed acceptable for now. --- .../hanko-frontend-sdk/AccountConfig.html | 28 +- .../AuthFlowCompletedDetail.html | 2 +- .../jsdoc/hanko-frontend-sdk/Client.html | 2 +- .../jsdoc/hanko-frontend-sdk/Config.html | 4 +- .../hanko-frontend-sdk/ConfigClient.html | 2 +- .../hanko-frontend-sdk/ConflictError.html | 2 +- .../jsdoc/hanko-frontend-sdk/Cookie.html | 36 +- .../hanko-frontend-sdk/CookieOptions.html | 2 +- .../jsdoc/hanko-frontend-sdk/Credential.html | 4 +- .../jsdoc/hanko-frontend-sdk/Dispatcher.html | 2 +- .../hanko-frontend-sdk/DispatcherOptions.html | 2 +- .../jsdoc/hanko-frontend-sdk/Email.html | 4 +- .../EmailAddressAlreadyExistsError.html | 4 +- .../jsdoc/hanko-frontend-sdk/EmailClient.html | 2 +- .../jsdoc/hanko-frontend-sdk/EmailConfig.html | 2 +- .../jsdoc/hanko-frontend-sdk/Emails.html | 4 +- .../hanko-frontend-sdk/ForbiddenError.html | 428 ++++++++++++++++++ .../jsdoc/hanko-frontend-sdk/Hanko.html | 2 +- .../jsdoc/hanko-frontend-sdk/Hanko.ts.html | 2 +- .../jsdoc/hanko-frontend-sdk/HankoError.html | 2 +- .../hanko-frontend-sdk/HankoOptions.html | 2 +- .../jsdoc/hanko-frontend-sdk/Headers.html | 4 +- .../jsdoc/hanko-frontend-sdk/HttpClient.html | 14 +- .../hanko-frontend-sdk/HttpClientOptions.html | 4 +- .../jsdoc/hanko-frontend-sdk/Identity.html | 4 +- .../InvalidPasscodeError.html | 2 +- .../InvalidPasswordError.html | 2 +- .../InvalidWebauthnCredentialError.html | 2 +- .../jsdoc/hanko-frontend-sdk/Listener.html | 2 +- .../hanko-frontend-sdk/LocalStorage.html | 2 +- .../LocalStoragePasscode.html | 2 +- .../LocalStoragePassword.html | 2 +- .../LocalStorageSession.html | 2 +- .../hanko-frontend-sdk/LocalStorageUser.html | 2 +- .../hanko-frontend-sdk/LocalStorageUsers.html | 2 +- .../LocalStorageWebauthn.html | 2 +- .../MaxNumOfEmailAddressesReachedError.html | 4 +- .../MaxNumOfPasscodeAttemptsReachedError.html | 2 +- .../hanko-frontend-sdk/NotFoundError.html | 2 +- .../jsdoc/hanko-frontend-sdk/Passcode.html | 4 +- .../hanko-frontend-sdk/PasscodeClient.html | 2 +- .../PasscodeExpiredError.html | 2 +- .../hanko-frontend-sdk/PasscodeState.html | 2 +- .../hanko-frontend-sdk/PasswordClient.html | 2 +- .../hanko-frontend-sdk/PasswordConfig.html | 2 +- .../hanko-frontend-sdk/PasswordState.html | 2 +- .../jsdoc/hanko-frontend-sdk/Relay.html | 2 +- .../hanko-frontend-sdk/RelayOptions.html | 2 +- .../RequestTimeoutError.html | 2 +- .../jsdoc/hanko-frontend-sdk/Response.html | 6 +- .../jsdoc/hanko-frontend-sdk/Scheduler.html | 2 +- .../jsdoc/hanko-frontend-sdk/Session.html | 2 +- .../hanko-frontend-sdk/SessionDetail.html | 2 +- .../hanko-frontend-sdk/SessionOptions.html | 2 +- .../hanko-frontend-sdk/SessionState.html | 2 +- .../SessionStateOptions.html | 2 +- .../SetAuthCookieOptions.html | 278 ++++++++++++ .../jsdoc/hanko-frontend-sdk/State.html | 2 +- .../hanko-frontend-sdk/TechnicalError.html | 2 +- .../hanko-frontend-sdk/ThirdPartyClient.html | 2 +- .../hanko-frontend-sdk/ThirdPartyError.html | 4 +- .../jsdoc/hanko-frontend-sdk/Throttle.html | 2 +- .../hanko-frontend-sdk/ThrottleOptions.html | 2 +- .../jsdoc/hanko-frontend-sdk/TokenClient.html | 2 +- .../hanko-frontend-sdk/TokenFinalized.html | 4 +- .../TooManyRequestsError.html | 2 +- .../hanko-frontend-sdk/UnauthorizedError.html | 2 +- .../static/jsdoc/hanko-frontend-sdk/User.html | 4 +- .../jsdoc/hanko-frontend-sdk/UserClient.html | 12 +- .../jsdoc/hanko-frontend-sdk/UserCreated.html | 4 +- .../jsdoc/hanko-frontend-sdk/UserInfo.html | 4 +- .../jsdoc/hanko-frontend-sdk/UserState.html | 2 +- .../UserVerificationError.html | 4 +- .../hanko-frontend-sdk/WebauthnClient.html | 2 +- .../WebauthnCredential.html | 4 +- .../WebauthnCredentials.html | 4 +- .../hanko-frontend-sdk/WebauthnFinalized.html | 4 +- .../WebauthnRequestCancelledError.html | 2 +- .../hanko-frontend-sdk/WebauthnState.html | 2 +- .../hanko-frontend-sdk/WebauthnSupport.html | 2 +- .../WebauthnTransports.html | 4 +- .../jsdoc/hanko-frontend-sdk/index.html | 2 +- .../hanko-frontend-sdk/lib_Cookie.ts.html | 24 +- .../jsdoc/hanko-frontend-sdk/lib_Dto.ts.html | 4 +- .../hanko-frontend-sdk/lib_Errors.ts.html | 18 +- .../hanko-frontend-sdk/lib_Session.ts.html | 2 +- .../hanko-frontend-sdk/lib_Throttle.ts.html | 2 +- .../lib_WebauthnSupport.ts.html | 2 +- .../lib_client_Client.ts.html | 2 +- .../lib_client_ConfigClient.ts.html | 2 +- .../lib_client_EmailClient.ts.html | 2 +- .../lib_client_HttpClient.ts.html | 7 +- .../lib_client_PasscodeClient.ts.html | 2 +- .../lib_client_PasswordClient.ts.html | 2 +- .../lib_client_ThirdPartyClient.ts.html | 2 +- .../lib_client_TokenClient.ts.html | 2 +- .../lib_client_UserClient.ts.html | 5 +- .../lib_client_WebauthnClient.ts.html | 2 +- .../lib_events_CustomEvents.ts.html | 2 +- .../lib_events_Dispatcher.ts.html | 2 +- .../lib_events_Listener.ts.html | 2 +- .../lib_events_Relay.ts.html | 2 +- .../lib_events_Scheduler.ts.html | 2 +- .../lib_state_State.ts.html | 2 +- .../lib_state_session_SessionState.ts.html | 2 +- .../lib_state_users_PasscodeState.ts.html | 2 +- .../lib_state_users_PasswordState.ts.html | 2 +- .../lib_state_users_UserState.ts.html | 2 +- .../lib_state_users_WebauthnState.ts.html | 2 +- frontend/frontend-sdk/src/lib/Cookie.ts | 22 +- .../frontend-sdk/src/lib/client/HttpClient.ts | 5 +- .../frontend-sdk/tests/lib/Cookie.spec.ts | 13 +- .../tests/lib/client/HttpClient.spec.ts | 11 +- frontend/frontend-sdk/tests/setup.ts | 5 +- 114 files changed, 967 insertions(+), 183 deletions(-) create mode 100644 docs/static/jsdoc/hanko-frontend-sdk/ForbiddenError.html create mode 100644 docs/static/jsdoc/hanko-frontend-sdk/SetAuthCookieOptions.html diff --git a/docs/static/jsdoc/hanko-frontend-sdk/AccountConfig.html b/docs/static/jsdoc/hanko-frontend-sdk/AccountConfig.html index 7d7a010c1..bfb5ec3d5 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/AccountConfig.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/AccountConfig.html @@ -66,7 +66,7 @@ @@ -125,7 +125,6 @@
    Properties:
    allow_deletion - allow_signup @@ -145,6 +144,29 @@
    Properties:
    + + + + allow_signup + + + + + +boolean + + + + + + + + + + Indicates the current user is allowed to sign up. + + + @@ -245,4 +267,4 @@
    Properties:
    - + \ No newline at end of file diff --git a/docs/static/jsdoc/hanko-frontend-sdk/AuthFlowCompletedDetail.html b/docs/static/jsdoc/hanko-frontend-sdk/AuthFlowCompletedDetail.html index dd5801eed..e82a87a63 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/AuthFlowCompletedDetail.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/AuthFlowCompletedDetail.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/Client.html b/docs/static/jsdoc/hanko-frontend-sdk/Client.html index 3074891e5..5e8eb24b9 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/Client.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/Client.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/Config.html b/docs/static/jsdoc/hanko-frontend-sdk/Config.html index 85c2bd4ba..0cc887fa7 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/Config.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/Config.html @@ -66,7 +66,7 @@ @@ -254,7 +254,7 @@
    Properties:

    View Source - lib/Dto.ts, line 28 + lib/Dto.ts, line 29

    diff --git a/docs/static/jsdoc/hanko-frontend-sdk/ConfigClient.html b/docs/static/jsdoc/hanko-frontend-sdk/ConfigClient.html index b13e7d6d4..1e87b4c5a 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/ConfigClient.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/ConfigClient.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/ConflictError.html b/docs/static/jsdoc/hanko-frontend-sdk/ConflictError.html index 53f84529c..cdf9c9e81 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/ConflictError.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/ConflictError.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/Cookie.html b/docs/static/jsdoc/hanko-frontend-sdk/Cookie.html index acb019fb2..3ea21b86d 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/Cookie.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/Cookie.html @@ -66,7 +66,7 @@ @@ -347,7 +347,7 @@

    View Source - lib/Cookie.ts, line 57 + lib/Cookie.ts, line 66

    @@ -467,7 +467,7 @@

    View Source - lib/Cookie.ts, line 70 + lib/Cookie.ts, line 79

    @@ -504,7 +504,7 @@

    - setAuthCookie(token, secureopt) + setAuthCookie(token, options)

    @@ -538,8 +538,6 @@
    Parameters:
    Type - Attributes - @@ -566,14 +564,6 @@
    Parameters:
    - - - - - - - - @@ -586,33 +576,23 @@
    Parameters:
    - secure + options -boolean +SetAuthCookieOptions - - - <optional>
    - - - - - - - - Indicates a secure cookie should be set. Default is `true`. + Options for setting the auth cookie. @@ -660,7 +640,7 @@
    Parameters:

    View Source - lib/Cookie.ts, line 65 + lib/Cookie.ts, line 74

    diff --git a/docs/static/jsdoc/hanko-frontend-sdk/CookieOptions.html b/docs/static/jsdoc/hanko-frontend-sdk/CookieOptions.html index 736267920..53e34c9e0 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/CookieOptions.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/CookieOptions.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/Credential.html b/docs/static/jsdoc/hanko-frontend-sdk/Credential.html index c475d3ff3..4359e33d6 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/Credential.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/Credential.html @@ -66,7 +66,7 @@ @@ -185,7 +185,7 @@
    Properties:

    View Source - lib/Dto.ts, line 71 + lib/Dto.ts, line 72

    diff --git a/docs/static/jsdoc/hanko-frontend-sdk/Dispatcher.html b/docs/static/jsdoc/hanko-frontend-sdk/Dispatcher.html index 6f04c34ea..e713dd1ad 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/Dispatcher.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/Dispatcher.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/DispatcherOptions.html b/docs/static/jsdoc/hanko-frontend-sdk/DispatcherOptions.html index d263c3f33..06ae99971 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/DispatcherOptions.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/DispatcherOptions.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/Email.html b/docs/static/jsdoc/hanko-frontend-sdk/Email.html index cb9624500..7d55e58a2 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/Email.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/Email.html @@ -66,7 +66,7 @@ @@ -277,7 +277,7 @@
    Properties:

    View Source - lib/Dto.ts, line 118 + lib/Dto.ts, line 119

    diff --git a/docs/static/jsdoc/hanko-frontend-sdk/EmailAddressAlreadyExistsError.html b/docs/static/jsdoc/hanko-frontend-sdk/EmailAddressAlreadyExistsError.html index 91b15b761..9fb8d5293 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/EmailAddressAlreadyExistsError.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/EmailAddressAlreadyExistsError.html @@ -66,7 +66,7 @@ @@ -167,7 +167,7 @@

    View Source - lib/Errors.ts, line 240 + lib/Errors.ts, line 254

    diff --git a/docs/static/jsdoc/hanko-frontend-sdk/EmailClient.html b/docs/static/jsdoc/hanko-frontend-sdk/EmailClient.html index 9a6aa82a8..fd1b89331 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/EmailClient.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/EmailClient.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/EmailConfig.html b/docs/static/jsdoc/hanko-frontend-sdk/EmailConfig.html index 8fce5e775..3ea361970 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/EmailConfig.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/EmailConfig.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/Emails.html b/docs/static/jsdoc/hanko-frontend-sdk/Emails.html index 6e04eac89..5f4edbe8c 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/Emails.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/Emails.html @@ -66,7 +66,7 @@ @@ -181,7 +181,7 @@

    Properties:

    View Source - lib/Dto.ts, line 129 + lib/Dto.ts, line 130

    diff --git a/docs/static/jsdoc/hanko-frontend-sdk/ForbiddenError.html b/docs/static/jsdoc/hanko-frontend-sdk/ForbiddenError.html new file mode 100644 index 000000000..5c63cddd8 --- /dev/null +++ b/docs/static/jsdoc/hanko-frontend-sdk/ForbiddenError.html @@ -0,0 +1,428 @@ + + + + + + + + ForbiddenError + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    +
    +
    + +
    +
    +
    +

    Class

    +

    ForbiddenError

    +
    + + + + + +
    + +
    + +

    ForbiddenError()

    + +
    A 'ForbiddenError' occurs when the user is not allowed to perform the requested action.
    + + +
    + +
    +
    + + +
    +
    +
    +
    + Constructor +
    + + + + +

    + # + + + + new ForbiddenError() + + +

    + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + View Source + + lib/Errors.ts, line 210 + +

    + +
    + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + +
    + + +

    Extends

    + + + + + + + + + + + + + + + + + + + + +
    +

    Members

    +
    + +
    + + + + +Error + + + + +

    + # + + + cause + + + Optional + +

    + + + + + + + + +
    + + + + + + + + +
    Overrides:
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    + View Source + + lib/Errors.ts, line 27 + +

    + +
    + + + + + +
    + +
    + + + + +string + + + + +

    + # + + + code + + +

    + + + + + + + + +
    + + + + + + + + +
    Overrides:
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    + View Source + + lib/Errors.ts, line 22 + +

    + +
    + + + + + +
    + +
    +
    + + + + + + + +
    + +
    + + + + +
    + + + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/static/jsdoc/hanko-frontend-sdk/Hanko.html b/docs/static/jsdoc/hanko-frontend-sdk/Hanko.html index 22df6bf04..b669a1a15 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/Hanko.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/Hanko.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/Hanko.ts.html b/docs/static/jsdoc/hanko-frontend-sdk/Hanko.ts.html index 76c11669c..eae1dc7e9 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/Hanko.ts.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/Hanko.ts.html @@ -68,7 +68,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/HankoError.html b/docs/static/jsdoc/hanko-frontend-sdk/HankoError.html index 69f818130..b4b5645f4 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/HankoError.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/HankoError.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/HankoOptions.html b/docs/static/jsdoc/hanko-frontend-sdk/HankoOptions.html index cd70067d3..93d9f01e2 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/HankoOptions.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/HankoOptions.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/Headers.html b/docs/static/jsdoc/hanko-frontend-sdk/Headers.html index 1557fb2a8..205fb1d29 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/Headers.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/Headers.html @@ -66,7 +66,7 @@ @@ -398,7 +398,7 @@
    Parameters:

    View Source - lib/client/HttpClient.ts, line 285 + lib/client/HttpClient.ts, line 286

    diff --git a/docs/static/jsdoc/hanko-frontend-sdk/HttpClient.html b/docs/static/jsdoc/hanko-frontend-sdk/HttpClient.html index d96ebec4b..c29160ae4 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/HttpClient.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/HttpClient.html @@ -66,7 +66,7 @@ @@ -422,7 +422,7 @@
    Parameters:

    View Source - lib/client/HttpClient.ts, line 375 + lib/client/HttpClient.ts, line 376

    @@ -630,7 +630,7 @@
    Parameters:

    View Source - lib/client/HttpClient.ts, line 332 + lib/client/HttpClient.ts, line 333

    @@ -883,7 +883,7 @@
    Parameters:

    View Source - lib/client/HttpClient.ts, line 365 + lib/client/HttpClient.ts, line 366

    @@ -1136,7 +1136,7 @@
    Parameters:

    View Source - lib/client/HttpClient.ts, line 343 + lib/client/HttpClient.ts, line 344

    @@ -1370,7 +1370,7 @@
    Parameters:

    View Source - lib/client/HttpClient.ts, line 322 + lib/client/HttpClient.ts, line 323

    @@ -1563,7 +1563,7 @@
    Parameters:

    View Source - lib/client/HttpClient.ts, line 354 + lib/client/HttpClient.ts, line 355

    diff --git a/docs/static/jsdoc/hanko-frontend-sdk/HttpClientOptions.html b/docs/static/jsdoc/hanko-frontend-sdk/HttpClientOptions.html index 52a6d7e2c..b265f5182 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/HttpClientOptions.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/HttpClientOptions.html @@ -66,7 +66,7 @@ @@ -233,7 +233,7 @@
    Properties:

    View Source - lib/client/HttpClient.ts, line 303 + lib/client/HttpClient.ts, line 304

    diff --git a/docs/static/jsdoc/hanko-frontend-sdk/Identity.html b/docs/static/jsdoc/hanko-frontend-sdk/Identity.html index 35d100574..045aa656a 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/Identity.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/Identity.html @@ -66,7 +66,7 @@ @@ -202,7 +202,7 @@
    Properties:

    View Source - lib/Dto.ts, line 157 + lib/Dto.ts, line 158

    diff --git a/docs/static/jsdoc/hanko-frontend-sdk/InvalidPasscodeError.html b/docs/static/jsdoc/hanko-frontend-sdk/InvalidPasscodeError.html index d7f4840f3..f70d88802 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/InvalidPasscodeError.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/InvalidPasscodeError.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/InvalidPasswordError.html b/docs/static/jsdoc/hanko-frontend-sdk/InvalidPasswordError.html index 6824d93c3..ccbff608a 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/InvalidPasswordError.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/InvalidPasswordError.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/InvalidWebauthnCredentialError.html b/docs/static/jsdoc/hanko-frontend-sdk/InvalidWebauthnCredentialError.html index bd0b6f2fa..b672b9a3d 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/InvalidWebauthnCredentialError.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/InvalidWebauthnCredentialError.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/Listener.html b/docs/static/jsdoc/hanko-frontend-sdk/Listener.html index d76845f5c..3c0b09325 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/Listener.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/Listener.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/LocalStorage.html b/docs/static/jsdoc/hanko-frontend-sdk/LocalStorage.html index c91fc005c..0019db7c8 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/LocalStorage.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/LocalStorage.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/LocalStoragePasscode.html b/docs/static/jsdoc/hanko-frontend-sdk/LocalStoragePasscode.html index 6b8e766a4..c1fa7dbc7 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/LocalStoragePasscode.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/LocalStoragePasscode.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/LocalStoragePassword.html b/docs/static/jsdoc/hanko-frontend-sdk/LocalStoragePassword.html index 2f3ca7dc6..42df4e2fd 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/LocalStoragePassword.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/LocalStoragePassword.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/LocalStorageSession.html b/docs/static/jsdoc/hanko-frontend-sdk/LocalStorageSession.html index 17cda0d1f..d0325f6cd 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/LocalStorageSession.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/LocalStorageSession.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/LocalStorageUser.html b/docs/static/jsdoc/hanko-frontend-sdk/LocalStorageUser.html index 579dc5194..0a28d313a 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/LocalStorageUser.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/LocalStorageUser.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/LocalStorageUsers.html b/docs/static/jsdoc/hanko-frontend-sdk/LocalStorageUsers.html index 6c1608652..339abc71e 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/LocalStorageUsers.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/LocalStorageUsers.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/LocalStorageWebauthn.html b/docs/static/jsdoc/hanko-frontend-sdk/LocalStorageWebauthn.html index 5029842dd..9c7356dc9 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/LocalStorageWebauthn.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/LocalStorageWebauthn.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/MaxNumOfEmailAddressesReachedError.html b/docs/static/jsdoc/hanko-frontend-sdk/MaxNumOfEmailAddressesReachedError.html index 006a81e21..4a24073b7 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/MaxNumOfEmailAddressesReachedError.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/MaxNumOfEmailAddressesReachedError.html @@ -66,7 +66,7 @@ @@ -168,7 +168,7 @@

    View Source - lib/Errors.ts, line 226 + lib/Errors.ts, line 240

    diff --git a/docs/static/jsdoc/hanko-frontend-sdk/MaxNumOfPasscodeAttemptsReachedError.html b/docs/static/jsdoc/hanko-frontend-sdk/MaxNumOfPasscodeAttemptsReachedError.html index 266daa0ab..680dff598 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/MaxNumOfPasscodeAttemptsReachedError.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/MaxNumOfPasscodeAttemptsReachedError.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/NotFoundError.html b/docs/static/jsdoc/hanko-frontend-sdk/NotFoundError.html index 01142cbb7..ede4775f1 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/NotFoundError.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/NotFoundError.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/Passcode.html b/docs/static/jsdoc/hanko-frontend-sdk/Passcode.html index dd967664d..90c4238b4 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/Passcode.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/Passcode.html @@ -66,7 +66,7 @@ @@ -208,7 +208,7 @@

    Properties:

    View Source - lib/Dto.ts, line 95 + lib/Dto.ts, line 96

    diff --git a/docs/static/jsdoc/hanko-frontend-sdk/PasscodeClient.html b/docs/static/jsdoc/hanko-frontend-sdk/PasscodeClient.html index 6fa8293d3..1ab7e4da1 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/PasscodeClient.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/PasscodeClient.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/PasscodeExpiredError.html b/docs/static/jsdoc/hanko-frontend-sdk/PasscodeExpiredError.html index 734899ca7..76c22c1c7 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/PasscodeExpiredError.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/PasscodeExpiredError.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/PasscodeState.html b/docs/static/jsdoc/hanko-frontend-sdk/PasscodeState.html index a5f6c80c2..0ac53d7a2 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/PasscodeState.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/PasscodeState.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/PasswordClient.html b/docs/static/jsdoc/hanko-frontend-sdk/PasswordClient.html index b77589d91..046a37a52 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/PasswordClient.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/PasswordClient.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/PasswordConfig.html b/docs/static/jsdoc/hanko-frontend-sdk/PasswordConfig.html index 88cf36f5e..6a95c92d0 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/PasswordConfig.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/PasswordConfig.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/PasswordState.html b/docs/static/jsdoc/hanko-frontend-sdk/PasswordState.html index 0e60b3783..7bc99c6a1 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/PasswordState.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/PasswordState.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/Relay.html b/docs/static/jsdoc/hanko-frontend-sdk/Relay.html index fbec79bb0..77bf0e89b 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/Relay.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/Relay.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/RelayOptions.html b/docs/static/jsdoc/hanko-frontend-sdk/RelayOptions.html index 194edded9..f04d845c7 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/RelayOptions.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/RelayOptions.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/RequestTimeoutError.html b/docs/static/jsdoc/hanko-frontend-sdk/RequestTimeoutError.html index d435986a9..ebaf9d9d9 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/RequestTimeoutError.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/RequestTimeoutError.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/Response.html b/docs/static/jsdoc/hanko-frontend-sdk/Response.html index 9a7b70b9d..4d6167679 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/Response.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/Response.html @@ -66,7 +66,7 @@ @@ -719,7 +719,7 @@

    View Source - lib/client/HttpClient.ts, line 293 + lib/client/HttpClient.ts, line 294

    @@ -891,7 +891,7 @@

    Parameters:

    View Source - lib/client/HttpClient.ts, line 302 + lib/client/HttpClient.ts, line 303

    diff --git a/docs/static/jsdoc/hanko-frontend-sdk/Scheduler.html b/docs/static/jsdoc/hanko-frontend-sdk/Scheduler.html index 458b3daaa..ce0f58532 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/Scheduler.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/Scheduler.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/Session.html b/docs/static/jsdoc/hanko-frontend-sdk/Session.html index 7bb08bad7..a4d944e77 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/Session.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/Session.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/SessionDetail.html b/docs/static/jsdoc/hanko-frontend-sdk/SessionDetail.html index f4da1db3a..b4c5f023e 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/SessionDetail.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/SessionDetail.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/SessionOptions.html b/docs/static/jsdoc/hanko-frontend-sdk/SessionOptions.html index 9dd4d3357..ac13a8840 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/SessionOptions.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/SessionOptions.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/SessionState.html b/docs/static/jsdoc/hanko-frontend-sdk/SessionState.html index 98e80f4af..f49f5de28 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/SessionState.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/SessionState.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/SessionStateOptions.html b/docs/static/jsdoc/hanko-frontend-sdk/SessionStateOptions.html index 787746c79..279476c05 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/SessionStateOptions.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/SessionStateOptions.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/SetAuthCookieOptions.html b/docs/static/jsdoc/hanko-frontend-sdk/SetAuthCookieOptions.html new file mode 100644 index 000000000..d630a9290 --- /dev/null +++ b/docs/static/jsdoc/hanko-frontend-sdk/SetAuthCookieOptions.html @@ -0,0 +1,278 @@ + + + + + + + + SetAuthCookieOptions + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    +
    +
    + +
    +
    +
    +

    Interface

    +

    SetAuthCookieOptions

    +
    + + + + + +
    + +
    + +

    SetAuthCookieOptions

    + + +
    + +
    +
    + + +
    Options for setting the auth cookie.
    + + + + + +
    Properties:
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    secure + + +boolean + + + + Indicates if the Secure attribute of the cookie should be set.
    expires + + +number +| + +Date +| + +undefined + + + + The expiration of the cookie.
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + View Source + + lib/Cookie.ts, line 50 + +

    + +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/static/jsdoc/hanko-frontend-sdk/State.html b/docs/static/jsdoc/hanko-frontend-sdk/State.html index 76906ccf1..c86202a68 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/State.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/State.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/TechnicalError.html b/docs/static/jsdoc/hanko-frontend-sdk/TechnicalError.html index 74733d5c6..813bc5918 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/TechnicalError.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/TechnicalError.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/ThirdPartyClient.html b/docs/static/jsdoc/hanko-frontend-sdk/ThirdPartyClient.html index 04582a36f..3308ccc0f 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/ThirdPartyClient.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/ThirdPartyClient.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/ThirdPartyError.html b/docs/static/jsdoc/hanko-frontend-sdk/ThirdPartyError.html index 731290496..57bdef65c 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/ThirdPartyError.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/ThirdPartyError.html @@ -66,7 +66,7 @@ @@ -168,7 +168,7 @@

    View Source - lib/Errors.ts, line 255 + lib/Errors.ts, line 269

    diff --git a/docs/static/jsdoc/hanko-frontend-sdk/Throttle.html b/docs/static/jsdoc/hanko-frontend-sdk/Throttle.html index 71b11939b..af03896b0 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/Throttle.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/Throttle.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/ThrottleOptions.html b/docs/static/jsdoc/hanko-frontend-sdk/ThrottleOptions.html index 754154bce..21fd1b69c 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/ThrottleOptions.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/ThrottleOptions.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/TokenClient.html b/docs/static/jsdoc/hanko-frontend-sdk/TokenClient.html index c78632960..ce3fcf419 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/TokenClient.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/TokenClient.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/TokenFinalized.html b/docs/static/jsdoc/hanko-frontend-sdk/TokenFinalized.html index 06609aee1..020459bea 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/TokenFinalized.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/TokenFinalized.html @@ -66,7 +66,7 @@ @@ -185,7 +185,7 @@

    Properties:

    View Source - lib/Dto.ts, line 46 + lib/Dto.ts, line 47

    diff --git a/docs/static/jsdoc/hanko-frontend-sdk/TooManyRequestsError.html b/docs/static/jsdoc/hanko-frontend-sdk/TooManyRequestsError.html index 0d5117d39..c9f216586 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/TooManyRequestsError.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/TooManyRequestsError.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/UnauthorizedError.html b/docs/static/jsdoc/hanko-frontend-sdk/UnauthorizedError.html index 3957807fe..79ddc2b58 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/UnauthorizedError.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/UnauthorizedError.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/User.html b/docs/static/jsdoc/hanko-frontend-sdk/User.html index bc3d4c3ee..db83f2faa 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/User.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/User.html @@ -66,7 +66,7 @@ @@ -231,7 +231,7 @@
    Properties:

    View Source - lib/Dto.ts, line 78 + lib/Dto.ts, line 79

    diff --git a/docs/static/jsdoc/hanko-frontend-sdk/UserClient.html b/docs/static/jsdoc/hanko-frontend-sdk/UserClient.html index 92862a14f..13d1ef6ae 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/UserClient.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/UserClient.html @@ -66,7 +66,7 @@ @@ -448,7 +448,7 @@
    Parameters:

    View Source - lib/client/UserClient.ts, line 169 + lib/client/UserClient.ts, line 172

    @@ -624,7 +624,7 @@

    View Source - lib/client/UserClient.ts, line 193 + lib/client/UserClient.ts, line 196

    @@ -809,7 +809,7 @@

    View Source - lib/client/UserClient.ts, line 182 + lib/client/UserClient.ts, line 185

    @@ -1045,7 +1045,7 @@

    Parameters:

    View Source - lib/client/UserClient.ts, line 155 + lib/client/UserClient.ts, line 158

    @@ -1221,7 +1221,7 @@

    View Source - lib/client/UserClient.ts, line 203 + lib/client/UserClient.ts, line 206

    diff --git a/docs/static/jsdoc/hanko-frontend-sdk/UserCreated.html b/docs/static/jsdoc/hanko-frontend-sdk/UserCreated.html index 906539d56..d19eeff20 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/UserCreated.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/UserCreated.html @@ -66,7 +66,7 @@ @@ -208,7 +208,7 @@

    Properties:

    View Source - lib/Dto.ts, line 87 + lib/Dto.ts, line 88

    diff --git a/docs/static/jsdoc/hanko-frontend-sdk/UserInfo.html b/docs/static/jsdoc/hanko-frontend-sdk/UserInfo.html index eab792e0f..ef52347e0 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/UserInfo.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/UserInfo.html @@ -66,7 +66,7 @@ @@ -254,7 +254,7 @@
    Properties:

    View Source - lib/Dto.ts, line 53 + lib/Dto.ts, line 54

    diff --git a/docs/static/jsdoc/hanko-frontend-sdk/UserState.html b/docs/static/jsdoc/hanko-frontend-sdk/UserState.html index a61e63a89..2ab73f997 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/UserState.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/UserState.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/UserVerificationError.html b/docs/static/jsdoc/hanko-frontend-sdk/UserVerificationError.html index 262ddb13b..2772febb4 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/UserVerificationError.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/UserVerificationError.html @@ -66,7 +66,7 @@ @@ -168,7 +168,7 @@

    View Source - lib/Errors.ts, line 211 + lib/Errors.ts, line 225

    diff --git a/docs/static/jsdoc/hanko-frontend-sdk/WebauthnClient.html b/docs/static/jsdoc/hanko-frontend-sdk/WebauthnClient.html index 6b117b469..88aead4d6 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/WebauthnClient.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/WebauthnClient.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/WebauthnCredential.html b/docs/static/jsdoc/hanko-frontend-sdk/WebauthnCredential.html index f27b93b3a..885f1cbf8 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/WebauthnCredential.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/WebauthnCredential.html @@ -66,7 +66,7 @@ @@ -398,7 +398,7 @@

    Properties:

    View Source - lib/Dto.ts, line 136 + lib/Dto.ts, line 137

    diff --git a/docs/static/jsdoc/hanko-frontend-sdk/WebauthnCredentials.html b/docs/static/jsdoc/hanko-frontend-sdk/WebauthnCredentials.html index 3315199e8..27fb7ad26 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/WebauthnCredentials.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/WebauthnCredentials.html @@ -66,7 +66,7 @@ @@ -181,7 +181,7 @@
    Properties:

    View Source - lib/Dto.ts, line 150 + lib/Dto.ts, line 151

    diff --git a/docs/static/jsdoc/hanko-frontend-sdk/WebauthnFinalized.html b/docs/static/jsdoc/hanko-frontend-sdk/WebauthnFinalized.html index 2973ae9f7..5e901c8f7 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/WebauthnFinalized.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/WebauthnFinalized.html @@ -66,7 +66,7 @@ @@ -208,7 +208,7 @@
    Properties:

    View Source - lib/Dto.ts, line 38 + lib/Dto.ts, line 39

    diff --git a/docs/static/jsdoc/hanko-frontend-sdk/WebauthnRequestCancelledError.html b/docs/static/jsdoc/hanko-frontend-sdk/WebauthnRequestCancelledError.html index 3a1179476..46ebe1186 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/WebauthnRequestCancelledError.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/WebauthnRequestCancelledError.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/WebauthnState.html b/docs/static/jsdoc/hanko-frontend-sdk/WebauthnState.html index b3486d7a6..7420da49f 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/WebauthnState.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/WebauthnState.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/WebauthnSupport.html b/docs/static/jsdoc/hanko-frontend-sdk/WebauthnSupport.html index 999f7ceec..2aee27015 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/WebauthnSupport.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/WebauthnSupport.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/WebauthnTransports.html b/docs/static/jsdoc/hanko-frontend-sdk/WebauthnTransports.html index 7f1d6cd85..0e6218b85 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/WebauthnTransports.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/WebauthnTransports.html @@ -66,7 +66,7 @@ @@ -181,7 +181,7 @@
    Properties:

    View Source - lib/Dto.ts, line 103 + lib/Dto.ts, line 104

    diff --git a/docs/static/jsdoc/hanko-frontend-sdk/index.html b/docs/static/jsdoc/hanko-frontend-sdk/index.html index a1428ce4b..da06863a1 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/index.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/index.html @@ -66,7 +66,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/lib_Cookie.ts.html b/docs/static/jsdoc/hanko-frontend-sdk/lib_Cookie.ts.html index fea8df89e..920fb89d3 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/lib_Cookie.ts.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/lib_Cookie.ts.html @@ -68,7 +68,7 @@ @@ -98,6 +98,19 @@

    lib/Cookie.ts

    cookieName: string; } +/** + * Options for setting the auth cookie. + * + * @category SDK + * @subcategory Internal + * @property {boolean} secure - Indicates if the Secure attribute of the cookie should be set. + * @property {number | Date | undefined} expires - The expiration of the cookie. + */ +interface SetAuthCookieOptions { + secure?: boolean; + expires?: number | Date | undefined; +} + /** * A class to manage cookies. * @@ -126,10 +139,13 @@

    lib/Cookie.ts

    * Stores the authentication token to the cookie. * * @param {string} token - The authentication token to be stored. - * @param {boolean=} secure - Indicates a secure cookie should be set. Default is `true`. + * @param {SetAuthCookieOptions} options - Options for setting the auth cookie. */ - setAuthCookie(token: string, secure = true) { - JSCookie.set(this.authCookieName, token, { secure }); + setAuthCookie( + token: string, + options: SetAuthCookieOptions = { secure: true }, + ) { + JSCookie.set(this.authCookieName, token, options); } /** diff --git a/docs/static/jsdoc/hanko-frontend-sdk/lib_Dto.ts.html b/docs/static/jsdoc/hanko-frontend-sdk/lib_Dto.ts.html index 3207d00d7..105e7841f 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/lib_Dto.ts.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/lib_Dto.ts.html @@ -68,7 +68,7 @@ @@ -116,9 +116,11 @@

    lib/Dto.ts

    * @category SDK * @subcategory DTO * @property {boolean} allow_deletion - Indicates the current user is allowed to delete the account. + * @property {boolean} allow_signup - Indicates the current user is allowed to sign up. */ export interface AccountConfig { allow_deletion: boolean; + allow_signup: boolean; } /** diff --git a/docs/static/jsdoc/hanko-frontend-sdk/lib_Errors.ts.html b/docs/static/jsdoc/hanko-frontend-sdk/lib_Errors.ts.html index 315605a40..6fe41d9d7 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/lib_Errors.ts.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/lib_Errors.ts.html @@ -68,7 +68,7 @@ @@ -308,6 +308,21 @@

    lib/Errors.ts

    } } +/** + * A 'ForbiddenError' occurs when the user is not allowed to perform the requested action. + * + * @category SDK + * @subcategory Errors + * @extends {HankoError} + */ +class ForbiddenError extends HankoError { + // eslint-disable-next-line require-jsdoc + constructor(cause?: Error) { + super("Forbidden error", "forbidden", cause); + Object.setPrototypeOf(this, ForbiddenError.prototype); + } +} + /** * A 'UserVerificationError' occurs when the user verification requirements * for a WebAuthn ceremony are not met. @@ -393,6 +408,7 @@

    lib/Errors.ts

    NotFoundError, TooManyRequestsError, UnauthorizedError, + ForbiddenError, UserVerificationError, MaxNumOfEmailAddressesReachedError, EmailAddressAlreadyExistsError, diff --git a/docs/static/jsdoc/hanko-frontend-sdk/lib_Session.ts.html b/docs/static/jsdoc/hanko-frontend-sdk/lib_Session.ts.html index d452e39f9..514d0ea0b 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/lib_Session.ts.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/lib_Session.ts.html @@ -68,7 +68,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/lib_Throttle.ts.html b/docs/static/jsdoc/hanko-frontend-sdk/lib_Throttle.ts.html index 8632af8a4..57451acca 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/lib_Throttle.ts.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/lib_Throttle.ts.html @@ -68,7 +68,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/lib_WebauthnSupport.ts.html b/docs/static/jsdoc/hanko-frontend-sdk/lib_WebauthnSupport.ts.html index ea258b305..0930429b4 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/lib_WebauthnSupport.ts.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/lib_WebauthnSupport.ts.html @@ -68,7 +68,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/lib_client_Client.ts.html b/docs/static/jsdoc/hanko-frontend-sdk/lib_client_Client.ts.html index 4fa87f89a..81ad37dd6 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/lib_client_Client.ts.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/lib_client_Client.ts.html @@ -68,7 +68,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/lib_client_ConfigClient.ts.html b/docs/static/jsdoc/hanko-frontend-sdk/lib_client_ConfigClient.ts.html index 7767f4209..fae4c3fba 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/lib_client_ConfigClient.ts.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/lib_client_ConfigClient.ts.html @@ -68,7 +68,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/lib_client_EmailClient.ts.html b/docs/static/jsdoc/hanko-frontend-sdk/lib_client_EmailClient.ts.html index 86270781c..9ae7910b3 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/lib_client_EmailClient.ts.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/lib_client_EmailClient.ts.html @@ -68,7 +68,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/lib_client_HttpClient.ts.html b/docs/static/jsdoc/hanko-frontend-sdk/lib_client_HttpClient.ts.html index 23dfa255b..da0d676ef 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/lib_client_HttpClient.ts.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/lib_client_HttpClient.ts.html @@ -68,7 +68,7 @@ @@ -296,14 +296,15 @@

    lib/client/HttpClient.ts

    } else if (header.startsWith("x-session-lifetime")) { expirationSeconds = parseInt( response.headers.getResponseHeader("X-Session-Lifetime"), - 10 + 10, ); } }); if (jwt) { const secure = !!this.api.match("^https://"); - this.cookie.setAuthCookie(jwt, secure); + const expires = new Date(new Date().getTime() + expirationSeconds * 1000); + this.cookie.setAuthCookie(jwt, { secure, expires }); } this.passcodeState.read().reset(userID).write(); diff --git a/docs/static/jsdoc/hanko-frontend-sdk/lib_client_PasscodeClient.ts.html b/docs/static/jsdoc/hanko-frontend-sdk/lib_client_PasscodeClient.ts.html index c08f27113..44b76811d 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/lib_client_PasscodeClient.ts.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/lib_client_PasscodeClient.ts.html @@ -68,7 +68,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/lib_client_PasswordClient.ts.html b/docs/static/jsdoc/hanko-frontend-sdk/lib_client_PasswordClient.ts.html index 0ede203e5..8bbedf225 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/lib_client_PasswordClient.ts.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/lib_client_PasswordClient.ts.html @@ -68,7 +68,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/lib_client_ThirdPartyClient.ts.html b/docs/static/jsdoc/hanko-frontend-sdk/lib_client_ThirdPartyClient.ts.html index 4c3b9d2f8..606b791a5 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/lib_client_ThirdPartyClient.ts.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/lib_client_ThirdPartyClient.ts.html @@ -68,7 +68,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/lib_client_TokenClient.ts.html b/docs/static/jsdoc/hanko-frontend-sdk/lib_client_TokenClient.ts.html index ca9fbd591..9841992f9 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/lib_client_TokenClient.ts.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/lib_client_TokenClient.ts.html @@ -68,7 +68,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/lib_client_UserClient.ts.html b/docs/static/jsdoc/hanko-frontend-sdk/lib_client_UserClient.ts.html index 6953c798b..0b8b83d06 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/lib_client_UserClient.ts.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/lib_client_UserClient.ts.html @@ -68,7 +68,7 @@ @@ -91,6 +91,7 @@

    lib/client/UserClient.ts

    NotFoundError, TechnicalError, UnauthorizedError, + ForbiddenError, } from "../Errors"; import { Client } from "./Client"; @@ -142,6 +143,8 @@

    lib/client/UserClient.ts

    if (response.status === 409) { throw new ConflictError(); + } if (response.status === 403) { + throw new ForbiddenError(); } else if (!response.ok) { throw new TechnicalError(); } diff --git a/docs/static/jsdoc/hanko-frontend-sdk/lib_client_WebauthnClient.ts.html b/docs/static/jsdoc/hanko-frontend-sdk/lib_client_WebauthnClient.ts.html index 06551168b..f8c4cc74d 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/lib_client_WebauthnClient.ts.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/lib_client_WebauthnClient.ts.html @@ -68,7 +68,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/lib_events_CustomEvents.ts.html b/docs/static/jsdoc/hanko-frontend-sdk/lib_events_CustomEvents.ts.html index 085178d22..9a79d1b18 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/lib_events_CustomEvents.ts.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/lib_events_CustomEvents.ts.html @@ -68,7 +68,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/lib_events_Dispatcher.ts.html b/docs/static/jsdoc/hanko-frontend-sdk/lib_events_Dispatcher.ts.html index cb6ee03bb..3f01503cf 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/lib_events_Dispatcher.ts.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/lib_events_Dispatcher.ts.html @@ -68,7 +68,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/lib_events_Listener.ts.html b/docs/static/jsdoc/hanko-frontend-sdk/lib_events_Listener.ts.html index 640d4493f..2ea7cf815 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/lib_events_Listener.ts.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/lib_events_Listener.ts.html @@ -68,7 +68,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/lib_events_Relay.ts.html b/docs/static/jsdoc/hanko-frontend-sdk/lib_events_Relay.ts.html index a4e9197de..353393cc6 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/lib_events_Relay.ts.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/lib_events_Relay.ts.html @@ -68,7 +68,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/lib_events_Scheduler.ts.html b/docs/static/jsdoc/hanko-frontend-sdk/lib_events_Scheduler.ts.html index 4776a2087..29ca36d24 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/lib_events_Scheduler.ts.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/lib_events_Scheduler.ts.html @@ -68,7 +68,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/lib_state_State.ts.html b/docs/static/jsdoc/hanko-frontend-sdk/lib_state_State.ts.html index 3532dc316..b48a86140 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/lib_state_State.ts.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/lib_state_State.ts.html @@ -68,7 +68,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/lib_state_session_SessionState.ts.html b/docs/static/jsdoc/hanko-frontend-sdk/lib_state_session_SessionState.ts.html index ac2516183..87f0507ea 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/lib_state_session_SessionState.ts.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/lib_state_session_SessionState.ts.html @@ -68,7 +68,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/lib_state_users_PasscodeState.ts.html b/docs/static/jsdoc/hanko-frontend-sdk/lib_state_users_PasscodeState.ts.html index 4caa14ee6..34676fdc1 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/lib_state_users_PasscodeState.ts.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/lib_state_users_PasscodeState.ts.html @@ -68,7 +68,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/lib_state_users_PasswordState.ts.html b/docs/static/jsdoc/hanko-frontend-sdk/lib_state_users_PasswordState.ts.html index 3048e2b20..99d5258bf 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/lib_state_users_PasswordState.ts.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/lib_state_users_PasswordState.ts.html @@ -68,7 +68,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/lib_state_users_UserState.ts.html b/docs/static/jsdoc/hanko-frontend-sdk/lib_state_users_UserState.ts.html index be1050b96..b6c987fb6 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/lib_state_users_UserState.ts.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/lib_state_users_UserState.ts.html @@ -68,7 +68,7 @@ diff --git a/docs/static/jsdoc/hanko-frontend-sdk/lib_state_users_WebauthnState.ts.html b/docs/static/jsdoc/hanko-frontend-sdk/lib_state_users_WebauthnState.ts.html index 39c4f11c3..6c85102d5 100644 --- a/docs/static/jsdoc/hanko-frontend-sdk/lib_state_users_WebauthnState.ts.html +++ b/docs/static/jsdoc/hanko-frontend-sdk/lib_state_users_WebauthnState.ts.html @@ -68,7 +68,7 @@ diff --git a/frontend/frontend-sdk/src/lib/Cookie.ts b/frontend/frontend-sdk/src/lib/Cookie.ts index 518d541e7..383d7673c 100644 --- a/frontend/frontend-sdk/src/lib/Cookie.ts +++ b/frontend/frontend-sdk/src/lib/Cookie.ts @@ -11,6 +11,19 @@ interface CookieOptions { cookieName: string; } +/** + * Options for setting the auth cookie. + * + * @category SDK + * @subcategory Internal + * @property {boolean} secure - Indicates if the Secure attribute of the cookie should be set. + * @property {number | Date | undefined} expires - The expiration of the cookie. + */ +interface SetAuthCookieOptions { + secure?: boolean; + expires?: number | Date | undefined; +} + /** * A class to manage cookies. * @@ -39,10 +52,13 @@ export class Cookie { * Stores the authentication token to the cookie. * * @param {string} token - The authentication token to be stored. - * @param {boolean=} secure - Indicates a secure cookie should be set. Default is `true`. + * @param {SetAuthCookieOptions} options - Options for setting the auth cookie. */ - setAuthCookie(token: string, secure = true) { - JSCookie.set(this.authCookieName, token, { secure }); + setAuthCookie( + token: string, + options: SetAuthCookieOptions = { secure: true }, + ) { + JSCookie.set(this.authCookieName, token, options); } /** diff --git a/frontend/frontend-sdk/src/lib/client/HttpClient.ts b/frontend/frontend-sdk/src/lib/client/HttpClient.ts index b6aa3f425..dadf448bc 100644 --- a/frontend/frontend-sdk/src/lib/client/HttpClient.ts +++ b/frontend/frontend-sdk/src/lib/client/HttpClient.ts @@ -209,14 +209,15 @@ class HttpClient { } else if (header.startsWith("x-session-lifetime")) { expirationSeconds = parseInt( response.headers.getResponseHeader("X-Session-Lifetime"), - 10 + 10, ); } }); if (jwt) { const secure = !!this.api.match("^https://"); - this.cookie.setAuthCookie(jwt, secure); + const expires = new Date(new Date().getTime() + expirationSeconds * 1000); + this.cookie.setAuthCookie(jwt, { secure, expires }); } this.passcodeState.read().reset(userID).write(); diff --git a/frontend/frontend-sdk/tests/lib/Cookie.spec.ts b/frontend/frontend-sdk/tests/lib/Cookie.spec.ts index 4c48da760..78a645389 100644 --- a/frontend/frontend-sdk/tests/lib/Cookie.spec.ts +++ b/frontend/frontend-sdk/tests/lib/Cookie.spec.ts @@ -1,5 +1,6 @@ import JSCookie from "js-cookie"; import { Cookie } from "../../src/lib/Cookie"; +import { fakeTimerNow } from "../setup"; describe("Cookie()", () => { let cookie: Cookie; @@ -11,7 +12,7 @@ describe("Cookie()", () => { describe("cookie.setAuthCookie()", () => { it("should set a new cookie", async () => { jest.spyOn(JSCookie, "set"); - cookie.setAuthCookie("test-token", false); + cookie.setAuthCookie("test-token", { secure: false }); expect(JSCookie.set).toHaveBeenCalledWith("hanko", "test-token", { secure: false, }); @@ -25,6 +26,16 @@ describe("Cookie()", () => { secure: true, }); }); + + it("should set a new cookie with expiration", async () => { + jest.spyOn(JSCookie, "set"); + const expires = new Date(fakeTimerNow + 60); + cookie.setAuthCookie("test-token", { secure: true, expires }); + expect(JSCookie.set).toHaveBeenCalledWith("hanko", "test-token", { + secure: true, + expires, + }); + }); }); describe("cookie.getAuthCookie()", () => { diff --git a/frontend/frontend-sdk/tests/lib/client/HttpClient.spec.ts b/frontend/frontend-sdk/tests/lib/client/HttpClient.spec.ts index 734c038a3..4f73ae472 100644 --- a/frontend/frontend-sdk/tests/lib/client/HttpClient.spec.ts +++ b/frontend/frontend-sdk/tests/lib/client/HttpClient.spec.ts @@ -4,6 +4,7 @@ import { HttpClient, } from "../../../src/lib/client/HttpClient"; import { RequestTimeoutError, TechnicalError } from "../../../src"; +import { fakeTimerNow } from "../../setup"; const jwt = "test-token"; let httpClient: HttpClient; @@ -224,7 +225,10 @@ describe("httpClient.processResponseHeadersOnLogin()", () => { ); expect(client.sessionState.setUserID).toHaveBeenCalledWith(userID); - expect(client.cookie.setAuthCookie).toHaveBeenCalledWith(jwt, false); + expect(client.cookie.setAuthCookie).toHaveBeenCalledWith(jwt, { + secure: false, + expires: new Date(fakeTimerNow + expirationSeconds * 1000), + }); expect(client.cookie.setAuthCookie).toBeCalledTimes(1); }); @@ -240,7 +244,10 @@ describe("httpClient.processResponseHeadersOnLogin()", () => { jest.spyOn(client.cookie, "setAuthCookie"); client.processResponseHeadersOnLogin(userID, response); - expect(client.cookie.setAuthCookie).toHaveBeenCalledWith(jwt, true); + expect(client.cookie.setAuthCookie).toHaveBeenCalledWith(jwt, { + secure: true, + expires: new Date(fakeTimerNow + expirationSeconds * 1000), + }); expect(client.cookie.setAuthCookie).toBeCalledTimes(1); }); }); diff --git a/frontend/frontend-sdk/tests/setup.ts b/frontend/frontend-sdk/tests/setup.ts index 3fdc190ea..5cea5c7f3 100644 --- a/frontend/frontend-sdk/tests/setup.ts +++ b/frontend/frontend-sdk/tests/setup.ts @@ -82,12 +82,15 @@ export const fakeXMLHttpRequest = (function () { })); })(); + Object.defineProperty(global, "XMLHttpRequest", { value: fakeXMLHttpRequest, configurable: true, writable: true, }); +export const fakeTimerNow = 1664379699000; + jest.useFakeTimers({ - now: 1664379699000, + now: fakeTimerNow, }); From 6c730c8ceef8b1a0e4ece119c788d2c9e09aaf36 Mon Sep 17 00:00:00 2001 From: Amju <86785660+amjed-ali-k@users.noreply.github.com> Date: Wed, 11 Oct 2023 18:13:46 +0530 Subject: [PATCH 26/34] fix(frontend-sdk): fix export types --- frontend/frontend-sdk/package.json | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/frontend/frontend-sdk/package.json b/frontend/frontend-sdk/package.json index 4a58b3946..b69c6d892 100644 --- a/frontend/frontend-sdk/package.json +++ b/frontend/frontend-sdk/package.json @@ -8,12 +8,15 @@ "files": [ "dist" ], - "types": "dist/index.d.ts", "type": "module", "source": "src/index.ts", + "types": "dist/index.d.ts", "exports": { - "require": "./dist/sdk.cjs", - "default": "./dist/sdk.modern.js" + ".": { + "require": "./dist/sdk.cjs", + "types": "./dist/index.d.ts", + "default": "./dist/sdk.modern.js" + } }, "main": "./dist/sdk.cjs", "module": "./dist/sdk.module.js", From aa927eabde700d797dc033d2ea76870e3753daa5 Mon Sep 17 00:00:00 2001 From: lfleischmann <67686424+lfleischmann@users.noreply.github.com> Date: Wed, 11 Oct 2023 14:44:40 +0200 Subject: [PATCH 27/34] chore: update versions to 0.8.4 --- docs/static/spec/admin.yaml | 2 +- docs/static/spec/public.yaml | 2 +- frontend/elements/package.json | 4 ++-- frontend/examples/angular/package.json | 2 +- frontend/examples/fresh/islands/Login.tsx | 2 +- frontend/examples/fresh/islands/LogoutButton.tsx | 2 +- frontend/examples/fresh/islands/Profile.tsx | 2 +- frontend/examples/nextjs/package.json | 2 +- frontend/examples/react/package.json | 2 +- frontend/examples/svelte/package.json | 2 +- frontend/examples/vue/package.json | 2 +- frontend/frontend-sdk/package.json | 2 +- frontend/package-lock.json | 16 ++++++++-------- 13 files changed, 21 insertions(+), 21 deletions(-) diff --git a/docs/static/spec/admin.yaml b/docs/static/spec/admin.yaml index 27ffbdefa..34577b8e6 100644 --- a/docs/static/spec/admin.yaml +++ b/docs/static/spec/admin.yaml @@ -1,6 +1,6 @@ openapi: 3.0.0 info: - version: '0.8.0' + version: '0.8.4' title: 'Hanko Admin API' description: | ## Introduction diff --git a/docs/static/spec/public.yaml b/docs/static/spec/public.yaml index acf985ca4..04789bf70 100644 --- a/docs/static/spec/public.yaml +++ b/docs/static/spec/public.yaml @@ -1,7 +1,7 @@ openapi: 3.0.0 info: - version: '0.8.0' + version: '0.8.4' title: 'Hanko Public API' description: | ## Introduction diff --git a/frontend/elements/package.json b/frontend/elements/package.json index eedd2d2e2..1ad260daf 100644 --- a/frontend/elements/package.json +++ b/frontend/elements/package.json @@ -1,6 +1,6 @@ { "name": "@teamhanko/hanko-elements", - "version": "0.8.3", + "version": "0.8.4", "private": false, "publishConfig": { "access": "public" @@ -107,7 +107,7 @@ }, "dependencies": { "@denysvuika/preact-translate": "^0.5.0", - "@teamhanko/hanko-frontend-sdk": "^0.8.3", + "@teamhanko/hanko-frontend-sdk": "^0.8.4", "@teamhanko/preact-custom-element": "^4.2.2", "classnames": "^2.3.2", "preact": "^10.13.1" diff --git a/frontend/examples/angular/package.json b/frontend/examples/angular/package.json index 994618a86..e58428fdc 100644 --- a/frontend/examples/angular/package.json +++ b/frontend/examples/angular/package.json @@ -19,7 +19,7 @@ "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.13.0", - "@teamhanko/hanko-elements": "^0.8.3" + "@teamhanko/hanko-elements": "^0.8.4" }, "devDependencies": { "@angular-devkit/build-angular": "^15.2.4", diff --git a/frontend/examples/fresh/islands/Login.tsx b/frontend/examples/fresh/islands/Login.tsx index 6f67e5f3c..5a3baee2c 100644 --- a/frontend/examples/fresh/islands/Login.tsx +++ b/frontend/examples/fresh/islands/Login.tsx @@ -1,7 +1,7 @@ import { HANKO_API_URL } from "../config.ts"; const code = ` - import { register } from 'https://esm.sh/@teamhanko/hanko-elements@0.5.5-beta'; + import { register } from 'https://esm.sh/@teamhanko/hanko-elements@0.8.4'; register('${HANKO_API_URL}', { shadow: true }); document.addEventListener('hankoAuthSuccess', (event) => { diff --git a/frontend/examples/fresh/islands/LogoutButton.tsx b/frontend/examples/fresh/islands/LogoutButton.tsx index 8af47b784..2bc663240 100644 --- a/frontend/examples/fresh/islands/LogoutButton.tsx +++ b/frontend/examples/fresh/islands/LogoutButton.tsx @@ -1,7 +1,7 @@ import { HANKO_API_URL } from "../config.ts"; const code = ` - import { register, Hanko } from 'https://esm.sh/@teamhanko/hanko-elements@0.5.5-beta'; + import { register, Hanko } from 'https://esm.sh/@teamhanko/hanko-elements@0.8.4'; register('${HANKO_API_URL}', { shadow: true }); window.addEventListener('logout', () => { diff --git a/frontend/examples/fresh/islands/Profile.tsx b/frontend/examples/fresh/islands/Profile.tsx index 6026dd03a..cb8210681 100644 --- a/frontend/examples/fresh/islands/Profile.tsx +++ b/frontend/examples/fresh/islands/Profile.tsx @@ -1,7 +1,7 @@ import { HANKO_API_URL } from "../config.ts"; const code = ` - import { register } from 'https://esm.sh/@teamhanko/hanko-elements@0.5.5-beta'; + import { register } from 'https://esm.sh/@teamhanko/hanko-elements@0.8.4'; register('${HANKO_API_URL}', { shadow: true }); `; diff --git a/frontend/examples/nextjs/package.json b/frontend/examples/nextjs/package.json index 3d39d6e94..b16e81a3d 100644 --- a/frontend/examples/nextjs/package.json +++ b/frontend/examples/nextjs/package.json @@ -6,7 +6,7 @@ "build": "next build" }, "dependencies": { - "@teamhanko/hanko-elements": "^0.8.3", + "@teamhanko/hanko-elements": "^0.8.4", "next": "^13.2.1", "react": "^18.2.0", "react-dom": "^18.2.0" diff --git a/frontend/examples/react/package.json b/frontend/examples/react/package.json index 0ad314ea9..38e24023d 100644 --- a/frontend/examples/react/package.json +++ b/frontend/examples/react/package.json @@ -2,7 +2,7 @@ "name": "example-react", "private": true, "dependencies": { - "@teamhanko/hanko-elements": "^0.8.3", + "@teamhanko/hanko-elements": "^0.8.4", "@types/react": "^18.2.0", "@types/react-dom": "^18.2.7", "react": "^18.2.0", diff --git a/frontend/examples/svelte/package.json b/frontend/examples/svelte/package.json index a97e1a9bd..c84f71c56 100644 --- a/frontend/examples/svelte/package.json +++ b/frontend/examples/svelte/package.json @@ -17,7 +17,7 @@ "vite": "^4.4.9" }, "dependencies": { - "@teamhanko/hanko-elements": "^0.8.3", + "@teamhanko/hanko-elements": "^0.8.4", "svelte-navigator": "^3.2.2" } } diff --git a/frontend/examples/vue/package.json b/frontend/examples/vue/package.json index 30fbd4006..6529c4506 100644 --- a/frontend/examples/vue/package.json +++ b/frontend/examples/vue/package.json @@ -5,7 +5,7 @@ "build": "vite build" }, "dependencies": { - "@teamhanko/hanko-elements": "^0.8.3", + "@teamhanko/hanko-elements": "^0.8.4", "vue": "^3.2.47", "vue-router": "^4.1.6" }, diff --git a/frontend/frontend-sdk/package.json b/frontend/frontend-sdk/package.json index b69c6d892..8286eb6c1 100644 --- a/frontend/frontend-sdk/package.json +++ b/frontend/frontend-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@teamhanko/hanko-frontend-sdk", - "version": "0.8.3", + "version": "0.8.4", "private": false, "publishConfig": { "access": "public" diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 87a8932dd..af5ef0908 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -16,11 +16,11 @@ }, "elements": { "name": "@teamhanko/hanko-elements", - "version": "0.8.3", + "version": "0.8.4", "license": "MIT", "dependencies": { "@denysvuika/preact-translate": "^0.5.0", - "@teamhanko/hanko-frontend-sdk": "^0.8.2", + "@teamhanko/hanko-frontend-sdk": "^0.8.4", "@teamhanko/preact-custom-element": "^4.2.2", "classnames": "^2.3.2", "preact": "^10.13.1" @@ -56,7 +56,7 @@ "@angular/platform-browser": "^15.2.8", "@angular/platform-browser-dynamic": "^15.2.8", "@angular/router": "^15.2.8", - "@teamhanko/hanko-elements": "^0.8.3", + "@teamhanko/hanko-elements": "^0.8.4", "angular-in-memory-web-api": "~0.15.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", @@ -513,7 +513,7 @@ "examples/nextjs": { "name": "example-nextjs", "dependencies": { - "@teamhanko/hanko-elements": "^0.8.3", + "@teamhanko/hanko-elements": "^0.8.4", "next": "^13.2.1", "react": "^18.2.0", "react-dom": "^18.2.0" @@ -530,7 +530,7 @@ "examples/react": { "name": "example-react", "dependencies": { - "@teamhanko/hanko-elements": "^0.8.3", + "@teamhanko/hanko-elements": "^0.8.4", "@types/react": "^18.2.0", "@types/react-dom": "^18.2.7", "react": "^18.2.0", @@ -543,7 +543,7 @@ "examples/svelte": { "name": "example-svelte", "dependencies": { - "@teamhanko/hanko-elements": "^0.8.3", + "@teamhanko/hanko-elements": "^0.8.4", "svelte-navigator": "^3.2.2" }, "devDependencies": { @@ -560,7 +560,7 @@ "examples/vue": { "name": "example-vue", "dependencies": { - "@teamhanko/hanko-elements": "^0.8.3", + "@teamhanko/hanko-elements": "^0.8.4", "vue": "^3.2.47", "vue-router": "^4.1.6" }, @@ -616,7 +616,7 @@ }, "frontend-sdk": { "name": "@teamhanko/hanko-frontend-sdk", - "version": "0.8.3", + "version": "0.8.4", "license": "MIT", "dependencies": { "@types/js-cookie": "^3.0.3" From e3607cd2e3ba6770a8a68f3178b2ddd9ddaf129c Mon Sep 17 00:00:00 2001 From: lfleischmann <67686424+lfleischmann@users.noreply.github.com> Date: Wed, 11 Oct 2023 17:07:29 +0200 Subject: [PATCH 28/34] chore: remove sonatype lift config Sonatype Lift has reached EOL in August 2023 and is no longer available for use. --- .lift/ignoreFiles | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 .lift/ignoreFiles diff --git a/.lift/ignoreFiles b/.lift/ignoreFiles deleted file mode 100644 index 1069ffa8e..000000000 --- a/.lift/ignoreFiles +++ /dev/null @@ -1,3 +0,0 @@ -**/test/** -**/*.min.js -examples/** From 0aa9aecdbe9ebe467889dd44b391b0a4bfad7b4d Mon Sep 17 00:00:00 2001 From: Esther Lizardo <100808713+Esther-Lita@users.noreply.github.com> Date: Wed, 11 Oct 2023 17:49:29 +0100 Subject: [PATCH 29/34] docs: add tutorial on how to get user data --- docs/docs/guides/tutorials/userData.mdx | 131 ++++++++++++++++++++++++ docs/sidebars.js | 2 +- 2 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 docs/docs/guides/tutorials/userData.mdx diff --git a/docs/docs/guides/tutorials/userData.mdx b/docs/docs/guides/tutorials/userData.mdx new file mode 100644 index 000000000..e8ba7407d --- /dev/null +++ b/docs/docs/guides/tutorials/userData.mdx @@ -0,0 +1,131 @@ +--- +title: Getting user data +sidebar_label: User data +keywords: [user, user ID, userID, email] +--- + +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +Every project has different needs when handling user onboarding. The following sections show how to get the user data from Hanko. + +:::info +**It's good to remember that the user ID is the immmutable identifier** + +The primary email address can be changed, therefore when handling user registration, the user `id` should be used to +dermine if it's a known user. +::: + +## Get user data on the Frontend + +If you only need the user data for a frontend usage, you can use `Hanko.user.getCurrent()` function from the +[hanko-frontend-sdk](https://www.npmjs.com/package/@teamhanko/hanko-frontend-sdk) (it is also re-exported from +[hanko-elements](https://www.npmjs.com/package/@teamhanko/hanko-elements)): + +```mdx-code-block + + +``` + +```js +"use client"; + +import { Hanko } from "@teamhanko/hanko-elements"; + +const hankoApi = ; +const hanko = new Hanko(hankoApi); + +const {id, email} = await hanko.user.getCurrent(); + +console.log(`user-id: ${id}, email: ${email}`); +``` + +```mdx-code-block + + + +``` + +:::info +Please keep in mind that if you create a function to get the +user data, you will be fetching data from the API again every +time you call the function. We advise you to make sure the function +is only called once for every user authentication. +::: + +## Get user data on the Backend + +### Get user ID from the JWT + +The Hanko API sends back a cookie upon successful authentication, which is then sent to the RP backend for each subsequent +request. The cookie contains a JWT, one of the things we can get from this JWT is the user ID, we can use [jose library](https://www.npmjs.com/package/jose) +to decode the value of such JWT: + +```mdx-code-block + + +``` + +```js +import { cookies } from "next/headers"; +import * as jose from "jose"; + +export async function userId() { + const token = cookies().get("hanko")?.value; + const payload = jose.decodeJwt(token ?? ""); + + const userID = payload.sub; + return userID; +} +``` + +```mdx-code-block + + + +``` + +### Get user data using the Hanko Admin API + +The [Hanko Admin API](https://docs.hanko.io/api/admin) provides detailed information about the status, user management, metrics and more. In this example we will focus on +getting the data from a specific user. + +To get a specific user data, call the `/users/{id}` endpoint of the Hanko Admin API, where `id` is the user id previously obtained from the JWT. + +:::info +On Hanko Cloud the Hanko Admin API is a paid feature and must be enabled separately. + +You also need an API key `secret` to access the Hanko Admin API. You can generate one under the `Settings/API Keys` section of your project. +Keep in mind, that the API key `secret` is only showed once, so make sure to store it in a safe place, like an enviromental variable as shown in the following example. +::: + +```mdx-code-block + + +``` + +```js +const getUserData = async () => { + const adminAPI = process.env.ADMIN_API; + const adminSecret = process.env.ADMIN_SECRET; + const options = { + method: "GET", + headers: { + Authorization: `Bearer ${adminSecret}`, + }, + }; + + const response = await fetch(`${adminAPI}/users/${userID}`, options); + + return response.json(); +}; + +const userData = await getUserData(); +console.log("user data:", userData); +``` + +```mdx-code-block + + + +``` diff --git a/docs/sidebars.js b/docs/sidebars.js index 1abaabf3f..957dc1bcf 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -69,7 +69,7 @@ const sidebars = { { type: "category", label: "Tutorials", - items: ["guides/tutorials/php", "guides/tutorials/nextjs"], + items: ["guides/tutorials/php", "guides/tutorials/nextjs", "guides/tutorials/userData"], }, ], }; From 016ca6631148b968f089a3243bdfc819d5aa465a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 Oct 2023 12:05:35 +0200 Subject: [PATCH 30/34] chore(deps): bump github.com/labstack/echo/v4 in /backend Bumps [github.com/labstack/echo/v4](https://github.com/labstack/echo) from 4.11.1 to 4.11.2. - [Release notes](https://github.com/labstack/echo/releases) - [Changelog](https://github.com/labstack/echo/blob/master/CHANGELOG.md) - [Commits](https://github.com/labstack/echo/compare/v4.11.1...v4.11.2) --- updated-dependencies: - dependency-name: github.com/labstack/echo/v4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- backend/go.mod | 4 ++-- backend/go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/go.mod b/backend/go.mod index 1adf87ffc..690e9884f 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -22,7 +22,7 @@ require ( github.com/knadh/koanf v1.5.0 github.com/labstack/echo-contrib v0.15.0 github.com/labstack/echo-jwt/v4 v4.2.0 - github.com/labstack/echo/v4 v4.11.1 + github.com/labstack/echo/v4 v4.11.2 github.com/lestrrat-go/jwx/v2 v2.0.13 github.com/lib/pq v1.10.9 github.com/mocktools/go-smtp-mock/v2 v2.1.0 @@ -153,7 +153,7 @@ require ( go.opentelemetry.io/otel v1.15.0 // indirect go.opentelemetry.io/otel/trace v1.15.0 // indirect golang.org/x/mod v0.11.0 // indirect - golang.org/x/net v0.16.0 // indirect + golang.org/x/net v0.17.0 // indirect golang.org/x/sync v0.1.0 // indirect golang.org/x/sys v0.13.0 // indirect golang.org/x/time v0.3.0 // indirect diff --git a/backend/go.sum b/backend/go.sum index 42891144a..279ce61cd 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -383,8 +383,8 @@ github.com/labstack/echo-contrib v0.15.0 h1:9K+oRU265y4Mu9zpRDv3X+DGTqUALY6oRHCS github.com/labstack/echo-contrib v0.15.0/go.mod h1:lei+qt5CLB4oa7VHTE0yEfQSEB9XTJI1LUqko9UWvo4= github.com/labstack/echo-jwt/v4 v4.2.0 h1:odSISV9JgcSCuhgQSV/6Io3i7nUmfM/QkBeR5GVJj5c= github.com/labstack/echo-jwt/v4 v4.2.0/go.mod h1:MA2RqdXdEn4/uEglx0HcUOgQSyBaTh5JcaHIan3biwU= -github.com/labstack/echo/v4 v4.11.1 h1:dEpLU2FLg4UVmvCGPuk/APjlH6GDpbEPti61srUUUs4= -github.com/labstack/echo/v4 v4.11.1/go.mod h1:YuYRTSM3CHs2ybfrL8Px48bO6BAnYIN4l8wSTMP6BDQ= +github.com/labstack/echo/v4 v4.11.2 h1:T+cTLQxWCDfqDEoydYm5kCobjmHwOwcv4OJAPHilmdE= +github.com/labstack/echo/v4 v4.11.2/go.mod h1:UcGuQ8V6ZNRmSweBIJkPvGfwCMIlFmiqrPqiEBfPYws= github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8= github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= @@ -716,8 +716,8 @@ golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfS golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.16.0 h1:7eBu7KsSvFDtSXUIDbh3aqlK4DPsZ1rByC8PFfBThos= -golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= From a38284710168faa16e93c044eaf4f1d3dc9d6914 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 Oct 2023 12:17:12 +0200 Subject: [PATCH 31/34] chore(deps): bump golang.org/x/net from 0.10.0 to 0.17.0 in /quickstart Bumps [golang.org/x/net](https://github.com/golang/net) from 0.10.0 to 0.17.0. - [Commits](https://github.com/golang/net/compare/v0.10.0...v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: lfleischmann <67686424+lfleischmann@users.noreply.github.com> --- quickstart/go.mod | 8 ++++---- quickstart/go.sum | 13 +++++++++---- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/quickstart/go.mod b/quickstart/go.mod index f59f41ead..33f762b99 100644 --- a/quickstart/go.mod +++ b/quickstart/go.mod @@ -22,9 +22,9 @@ require ( github.com/segmentio/asm v1.2.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.2.1 // indirect - golang.org/x/crypto v0.9.0 // indirect - golang.org/x/net v0.10.0 // indirect - golang.org/x/sys v0.8.0 // indirect - golang.org/x/text v0.9.0 // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/net v0.17.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/text v0.13.0 // indirect golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 // indirect ) diff --git a/quickstart/go.sum b/quickstart/go.sum index 3cfa387a4..89f6f6fb7 100644 --- a/quickstart/go.sum +++ b/quickstart/go.sum @@ -50,8 +50,9 @@ github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5t golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -59,8 +60,9 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -75,19 +77,22 @@ golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From e7fdbecde3a141c8a5d7f17a842ef85aa738e598 Mon Sep 17 00:00:00 2001 From: lfleischmann <67686424+lfleischmann@users.noreply.github.com> Date: Thu, 12 Oct 2023 17:42:41 +0200 Subject: [PATCH 32/34] chore: remove frontend-sdk dockerfile --- frontend/frontend-sdk/Dockerfile | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 frontend/frontend-sdk/Dockerfile diff --git a/frontend/frontend-sdk/Dockerfile b/frontend/frontend-sdk/Dockerfile deleted file mode 100644 index 39fc63ac9..000000000 --- a/frontend/frontend-sdk/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -FROM --platform=$BUILDPLATFORM node:16.16-alpine as build - -WORKDIR /app -ENV PATH /app/node_modules/.bin:$PATH - -COPY package.json ./ -COPY package-lock.json ./ - -RUN npm ci --silent -COPY . ./ -RUN npm run build - -FROM nginx:stable-alpine -COPY --from=build /app/dist/sdk.* /usr/share/nginx/html - -COPY nginx/default.conf /etc/nginx/conf.d/default.conf -EXPOSE 80 -CMD ["nginx", "-g", "daemon off;"] From fe18d5c5845b3b16e56434fada7a5810c64a10ab Mon Sep 17 00:00:00 2001 From: lfleischmann <67686424+lfleischmann@users.noreply.github.com> Date: Thu, 12 Oct 2023 18:04:13 +0200 Subject: [PATCH 33/34] ci: remove docs auto deploy on backend tag The gh-pages action as it is configured seems to reset the custom domain value to docs.hanko.io in the repo's pages settings. This somehow leads to conflicts with the new docs because the static JS docs must be reachable at a teamhanko.github.io URL and not docs.hanko.io. --- .github/workflows/docs-deploy.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/docs-deploy.yml b/.github/workflows/docs-deploy.yml index 4d1238b0a..dcf658ffc 100644 --- a/.github/workflows/docs-deploy.yml +++ b/.github/workflows/docs-deploy.yml @@ -1,8 +1,6 @@ name: Deploy to GitHub Pages on: - push: - tags: [ 'backend/v*.*.*' ] workflow_dispatch: jobs: From 45c2442913b1c87de23553016452fadc0f275ae8 Mon Sep 17 00:00:00 2001 From: KRISH SONI <67964054+krishvsoni@users.noreply.github.com> Date: Mon, 16 Oct 2023 13:47:42 +0530 Subject: [PATCH 34/34] added API link (#1082) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8284dac7f..e5956685c 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ The remainder of the repository consists of: 2. Head over to the [backend](/backend/README.md) to learn how to get it up and running for your own project. Use [Hanko Cloud](https://cloud.hanko.io) for a hosted backend. 3. Then, integrate [hanko-elements](/frontend/elements/README.md) – we provide [example applications](frontend/examples/README.md) and [guides](https://docs.hanko.io/guides/frontend) for your favourite frontend framework in the official documentation -If you want to use the Hanko backend API but prefer to build your own UI, you can still make use of the [hanko-frontend-sdk](/frontend/frontend-sdk/README.md). It forms the basis of our web components and the client it provides handles communication with the Hanko backend API and saves you the time of rolling your own. +If you want to use the Hanko backend API but prefer to build your own UI, you can still make use of the [hanko-frontend-sdk](/frontend/frontend-sdk/README.md). It forms the basis of our web components and the client it provides handles communication with the [Hanko backend API](https://docs.hanko.io/api-reference/introduction) and saves you the time of rolling your own. # Contact us Schedule a Hanko demo. Learn how Hanko will speed up your registration and login flows with passkeys.