From f57f78ae1a752c802b3e98f016a224a155cc4d4c Mon Sep 17 00:00:00 2001 From: David Boyne Date: Tue, 27 Aug 2024 14:15:00 +0100 Subject: [PATCH 01/58] feat(docs): adding learn by for Wing --- docusaurus.config.js | 14 ++++ .../version-latest/01-introduction.md | 13 ++++ .../version-latest/02-hello-world.md | 26 ++++++++ .../version-latest/03-values.md | 42 ++++++++++++ .../version-latest/04-variables.md | 51 +++++++++++++++ .../version-latest/05-for.md | 65 +++++++++++++++++++ .../version-latest/06-ifelse.md | 52 +++++++++++++++ .../version-latest/07-while.md | 32 +++++++++ .../version-latest/08-optionality.md | 36 ++++++++++ .../version-latest/09-arrays.md | 49 ++++++++++++++ .../version-latest-sidebars.json | 8 +++ example_versions.json | 3 + 12 files changed, 391 insertions(+) create mode 100644 example_versioned_docs/version-latest/01-introduction.md create mode 100644 example_versioned_docs/version-latest/02-hello-world.md create mode 100644 example_versioned_docs/version-latest/03-values.md create mode 100644 example_versioned_docs/version-latest/04-variables.md create mode 100644 example_versioned_docs/version-latest/05-for.md create mode 100644 example_versioned_docs/version-latest/06-ifelse.md create mode 100644 example_versioned_docs/version-latest/07-while.md create mode 100644 example_versioned_docs/version-latest/08-optionality.md create mode 100644 example_versioned_docs/version-latest/09-arrays.md create mode 100644 example_versioned_sidebars/version-latest-sidebars.json create mode 100644 example_versions.json diff --git a/docusaurus.config.js b/docusaurus.config.js index 97a9a879d..a357d02c1 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -136,6 +136,20 @@ const config = { // ... other options } ], + [ + "@docusaurus/plugin-content-docs", + { + id: "example", + path: "example", + routeBasePath: "docs/learn", + editUrl: (params) => + `${winglangOrgUrl}/wing/tree/main/docs/api/${params.docPath}`, + breadcrumbs: true, + includeCurrentVersion: false, + // sidebarPath: require.resolve('./sidebarsCommunity.js'), + // ... other options + } + ], ], presets: [ [ diff --git a/example_versioned_docs/version-latest/01-introduction.md b/example_versioned_docs/version-latest/01-introduction.md new file mode 100644 index 000000000..34abe9ee9 --- /dev/null +++ b/example_versioned_docs/version-latest/01-introduction.md @@ -0,0 +1,13 @@ +--- +title: Wing by example +id: wing-by-example +slug: / +sidebar_label: Introduction +description: Hands-on introduction to Wing using annotated code +keywords: [Wing language, api] +--- + + +Wing is an open-source programming language. + +Wing by Example is a hands-on introduction to Dart using annotated example programs, inspired by Go By Example, Dark by Example and Haskell By Example \ No newline at end of file diff --git a/example_versioned_docs/version-latest/02-hello-world.md b/example_versioned_docs/version-latest/02-hello-world.md new file mode 100644 index 000000000..97c81a9b9 --- /dev/null +++ b/example_versioned_docs/version-latest/02-hello-world.md @@ -0,0 +1,26 @@ +--- +title: Wing by example +id: hello-world +slug: /hello-world +sidebar_label: 1. Hello world +description: Hello world wing example +keywords: [Wing language, example] +--- + +# Hello world + + +```js playground title="main.w" +let main = () => { + log("Hello world!"); +}; + +main(); +``` + +```bash title="Wing console output" +# Run locally with wing console +wing it + +Hello world! +``` diff --git a/example_versioned_docs/version-latest/03-values.md b/example_versioned_docs/version-latest/03-values.md new file mode 100644 index 000000000..ba1ee698a --- /dev/null +++ b/example_versioned_docs/version-latest/03-values.md @@ -0,0 +1,42 @@ +--- +title: Values +id: values +slug: /values +sidebar_label: 2. Values +description: Hello world wing example +keywords: [Wing language, example] +--- + + +Wing has various value types including strings, integers, floats, booleans, etc. Here are a few basic examples. + +- Strings, which can be added together with + +- Integers and floats +- Booleans, with boolean operators as you'd expect + +```js playground title="main.w" +let main = () => { + log("Hello " + "Wing"); + + log("1+1 = {1+1}"); + log("7.0/3.0 = {7.0/3.0}"); + + log(true && true); + log(true || false); + log(!true); +}; + +main(); +``` + +```bash title="Wing console output" +# Run locally with wing console +wing it + +Hello Wing +1+1 = 2 +7.0/3.0 = 2.3333333333333335 +true +true +false +``` \ No newline at end of file diff --git a/example_versioned_docs/version-latest/04-variables.md b/example_versioned_docs/version-latest/04-variables.md new file mode 100644 index 000000000..a4e986500 --- /dev/null +++ b/example_versioned_docs/version-latest/04-variables.md @@ -0,0 +1,51 @@ +--- +title: Variables +id: Variables +slug: /Variables +sidebar_label: 4. Variables +description: Using variables with Wing +keywords: [Wing language, example] +--- + +Wing has various value types including strings, integers, floats, booleans, etc. Here are a few basic examples. + +- Strings, which can be added together with + +- Integers and floats +- Booleans, with boolean operators as you'd expect + +```js title="main.w" +let main = () => { + + // var delcares a varaible. Wing infers the type + let a = "initial"; + log(a); + + + // type can also be declared + let b: num = 1; + let c: num = 2; + log("{b}, {c}"); + + // variables cannot be changed using let without var + let d: str = "Hello"; + // d = "Test"; // error: Variable is not reassignable + + // makes variable mutable + let var s = "hello"; + s = "hello world"; // compiles + log(s); + +}; + +main(); + +``` + +```bash title="Wing console output" +# Run locally with wing console +wing it + +initial +1, 2 +hello world +``` \ No newline at end of file diff --git a/example_versioned_docs/version-latest/05-for.md b/example_versioned_docs/version-latest/05-for.md new file mode 100644 index 000000000..aeaccf7a1 --- /dev/null +++ b/example_versioned_docs/version-latest/05-for.md @@ -0,0 +1,65 @@ +--- +title: For +id: for +slug: /for +sidebar_label: 5. For +description: Using for loops with Wing +keywords: [Wing language, example] +--- + +Wing supports for..in statements. + +[for..in](/docs/api/language-reference#26-for) is used to iterate over an array, a set or a range. The loop invariant in for loops is implicitly re-assignable (var). + +```js playground title="main.w" +let main = () => { + + // a standard for loop + for item in 1..3 { + log(item); + } + + // for-in with arrays + let arr = [1, 2, 3]; + for item in arr { + log("{item}"); + } + + // break a loop + let items = Set[1, 2, 3]; + for item in items { + if(item == 1){ + break; + } + log(item); + } + + // continue the next iteration of the loop + for item in 1..10 { + if(item%2 == 0){ + continue; + } + log(item); + } + +}; + +main(); + +``` + +```bash title="Wing console output" +# Run locally with wing console +wing it + +1 +2 +1 +2 +3 +1 +3 +5 +7 +9 +``` \ No newline at end of file diff --git a/example_versioned_docs/version-latest/06-ifelse.md b/example_versioned_docs/version-latest/06-ifelse.md new file mode 100644 index 000000000..325a3d8b5 --- /dev/null +++ b/example_versioned_docs/version-latest/06-ifelse.md @@ -0,0 +1,52 @@ +--- +title: If/Else +id: if-else +slug: /if-else +sidebar_label: 6. If/Else +description: Using if else with Wing +keywords: [Wing language, example] +--- + +Flow control can be done with if/else statements. The if statement is optionally followed by else if and else. + +```js playground title="main.w" +let main = () => { + + if (7 % 2 == 0) { + log("7 is even"); + } else { + log("7 is odd"); + } + + if (8 % 4 == 0) { + log("8 is divisble by 4"); + } + + if(8 % 2 == 0 || 7 % 2 == 0){ + log("either 8 or 7 are even"); + } + + let value:num = 9; + if(value < 0){ + log("${value} is negative"); + } else if value < 10 { + log("${value} has 1 digit"); + } else { + log("{value} has multiple digits"); + } + +}; + +main(); + +``` + +```bash title="Wing console output" +# Run locally with wing console +wing it + +7 is odd +8 is divisble by 4 +either 8 or 7 are even +9 has 1 digit +``` \ No newline at end of file diff --git a/example_versioned_docs/version-latest/07-while.md b/example_versioned_docs/version-latest/07-while.md new file mode 100644 index 000000000..224933c7a --- /dev/null +++ b/example_versioned_docs/version-latest/07-while.md @@ -0,0 +1,32 @@ +--- +title: While +id: while +slug: /while +sidebar_label: 7. While +description: Using while statements with Wing +keywords: [Wing language, example] +--- + +```js playground title="main.w" +let main = () => { + + let var i = 0; + + while(i < 2){ + log("while {i}"); + i = i + 1; + } + +}; + +main(); + +``` + +```bash title="Wing console output" +# Run locally with wing console +wing it + +while 0 +while 1 +``` \ No newline at end of file diff --git a/example_versioned_docs/version-latest/08-optionality.md b/example_versioned_docs/version-latest/08-optionality.md new file mode 100644 index 000000000..34a076876 --- /dev/null +++ b/example_versioned_docs/version-latest/08-optionality.md @@ -0,0 +1,36 @@ +--- +title: Optionality +id: optionality +slug: /optionality +sidebar_label: 8. Optionality +description: Using while statements with Wing +keywords: [Wing language, example] +--- + +Nullity is a primary source of bugs in software. Being able to guarantee that a value will never be null makes it easier to write safe code without constantly having to take nullity into account. + +Optionality requires developers to be more intentional about working with the concept of "lack of value". + +```js playground title="main.w" +let main = () => { + + let monday:str = "doctor"; + let tuesday: str? = nil; + + // Set next to tuesday if there is a value otherwise use monday value + let var next = tuesday ?? monday; + + log("{next}"); + +}; + +main(); + +``` + +```bash title="Wing console output" +# Run locally with wing console +wing it + +doctor +``` \ No newline at end of file diff --git a/example_versioned_docs/version-latest/09-arrays.md b/example_versioned_docs/version-latest/09-arrays.md new file mode 100644 index 000000000..f8ae28cbb --- /dev/null +++ b/example_versioned_docs/version-latest/09-arrays.md @@ -0,0 +1,49 @@ +--- +title: Arrays +id: arrays +slug: /arrays +sidebar_label: 9. Arrays +description: Using arrays with Wing +keywords: [Wing language, example] +--- + +Arrays are dynamically sized in Wing and are defined with the [] syntax. +Individual array items are accessed using the .at(index: num) method. +Arrays are similar to dynamically sized arrays or vectors in other languages. + +```js playground example title="main.w" +let main = () => { + + let a = MutArray[1, 2, 3]; + + log("{a[0]}, {a[1]}, {a[2]}"); + + a[2] = 4; + + log("mutated value: {a[2]}"); + log("len: {a.length}"); + + let data = MutArray[1, 2, 3]; + let twoD = MutArray>[data]; + + for array in twoD { + for item in array { + log(item * 10); + } + } + +} + +``` + +```bash title="Wing console output" +# Run locally with wing console +wing it + +1, 2, 3 +mutated value: 4 +len: 3 +10 +20 +30 +``` \ No newline at end of file diff --git a/example_versioned_sidebars/version-latest-sidebars.json b/example_versioned_sidebars/version-latest-sidebars.json new file mode 100644 index 000000000..cff0c94e1 --- /dev/null +++ b/example_versioned_sidebars/version-latest-sidebars.json @@ -0,0 +1,8 @@ +{ + "defaultSidebar": [ + { + "type": "autogenerated", + "dirName": "." + } + ] +} diff --git a/example_versions.json b/example_versions.json new file mode 100644 index 000000000..c24f3d37c --- /dev/null +++ b/example_versions.json @@ -0,0 +1,3 @@ +[ + "latest" +] From d41202d921f42d7967632944c0274213f016c7d5 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Tue, 27 Aug 2024 16:47:29 +0100 Subject: [PATCH 02/58] feat(docs): adding learn by for Wing --- .../version-latest/10-structs.md | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 example_versioned_docs/version-latest/10-structs.md diff --git a/example_versioned_docs/version-latest/10-structs.md b/example_versioned_docs/version-latest/10-structs.md new file mode 100644 index 000000000..cca74be82 --- /dev/null +++ b/example_versioned_docs/version-latest/10-structs.md @@ -0,0 +1,47 @@ +--- +title: Structs +id: structs +slug: /structs +sidebar_label: 10. Structs +description: Using arrays with Wing +keywords: [Wing language, example] +--- + +Structs are loosely modeled after typed JSON literals in JavaScript. + +```js playground example title="main.w" +let main = () => { + + let a = MutArray[1, 2, 3]; + + log("{a[0]}, {a[1]}, {a[2]}"); + + a[2] = 4; + + log("mutated value: {a[2]}"); + log("len: {a.length}"); + + let data = MutArray[1, 2, 3]; + let twoD = MutArray>[data]; + + for array in twoD { + for item in array { + log(item * 10); + } + } + +} + +``` + +```bash title="Wing console output" +# Run locally with wing console +wing it + +1, 2, 3 +mutated value: 4 +len: 3 +10 +20 +30 +``` \ No newline at end of file From 10a8a8baf123660fbf18fdc027b5e0da19650f0a Mon Sep 17 00:00:00 2001 From: David Boyne Date: Mon, 2 Sep 2024 11:37:01 +0100 Subject: [PATCH 03/58] adding more examples to learn by --- docusaurus.config.js | 2 +- .../version-latest/01-introduction.md | 6 ++- .../version-latest/10-maps.md | 42 ++++++++++++++++ .../version-latest/10-structs.md | 47 ------------------ .../version-latest/11-sets.md | 37 ++++++++++++++ .../version-latest/12-structs.md | 48 +++++++++++++++++++ 6 files changed, 132 insertions(+), 50 deletions(-) create mode 100644 example_versioned_docs/version-latest/10-maps.md delete mode 100644 example_versioned_docs/version-latest/10-structs.md create mode 100644 example_versioned_docs/version-latest/11-sets.md create mode 100644 example_versioned_docs/version-latest/12-structs.md diff --git a/docusaurus.config.js b/docusaurus.config.js index a357d02c1..8b3b8c07e 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -268,7 +268,7 @@ const config = { }, { - to: "docs/why-wing", + to: "docs/learn", position: "left", label: "Learn", className: "header-text-link", diff --git a/example_versioned_docs/version-latest/01-introduction.md b/example_versioned_docs/version-latest/01-introduction.md index 34abe9ee9..a1c5adcb6 100644 --- a/example_versioned_docs/version-latest/01-introduction.md +++ b/example_versioned_docs/version-latest/01-introduction.md @@ -8,6 +8,8 @@ keywords: [Wing language, api] --- -Wing is an open-source programming language. +Wing is an open source programming language for the cloud. Wing combines infrastructure and runtime code in one language, enabling developers to stay in their creative flow, and to deliver better software, faster and more securely. -Wing by Example is a hands-on introduction to Dart using annotated example programs, inspired by Go By Example, Dark by Example and Haskell By Example \ No newline at end of file +Wing by Example is a hands-on introduction to Wing using annotated example programs. Check out the first example or browse the list using the navigation. + +Unless stated otherwise, examples here assume the latest major release Wing and may use new language features. Try to upgrade to the latest version if something isn't working. \ No newline at end of file diff --git a/example_versioned_docs/version-latest/10-maps.md b/example_versioned_docs/version-latest/10-maps.md new file mode 100644 index 000000000..9fbcb4a7e --- /dev/null +++ b/example_versioned_docs/version-latest/10-maps.md @@ -0,0 +1,42 @@ +--- +title: Maps +id: maps +slug: /maps +sidebar_label: 10. Maps +description: Using maps with Wing +keywords: [Wing language, example] +--- + + +```js playground example title="main.w" +// immutable map +let configration = Map{ + "URL" => "https://winglang.io" +}; + +// mutable map +let listOfPrices = MutMap{ + "PRODUCT_1" => 100.00, + "PRODUCT_2" => 200.00, + "PRODUCT_3" => 300.00 +}; + +// Map is inferred +let values = {"a" => 1, "b" => 2}; // immutable map, Map is inferred + +// Change the values of the mutable map +listOfPrices.set("PRODUCT_1", 500); + +log(configration.get("URL")); +log(Json.stringify(values.keys())); +log(Json.stringify(listOfPrices.get("PRODUCT_1"))); +``` + +```bash title="Wing console output" +# Run locally with wing console +wing it + +https://winglang.io +["a","b"] +500 +``` \ No newline at end of file diff --git a/example_versioned_docs/version-latest/10-structs.md b/example_versioned_docs/version-latest/10-structs.md deleted file mode 100644 index cca74be82..000000000 --- a/example_versioned_docs/version-latest/10-structs.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Structs -id: structs -slug: /structs -sidebar_label: 10. Structs -description: Using arrays with Wing -keywords: [Wing language, example] ---- - -Structs are loosely modeled after typed JSON literals in JavaScript. - -```js playground example title="main.w" -let main = () => { - - let a = MutArray[1, 2, 3]; - - log("{a[0]}, {a[1]}, {a[2]}"); - - a[2] = 4; - - log("mutated value: {a[2]}"); - log("len: {a.length}"); - - let data = MutArray[1, 2, 3]; - let twoD = MutArray>[data]; - - for array in twoD { - for item in array { - log(item * 10); - } - } - -} - -``` - -```bash title="Wing console output" -# Run locally with wing console -wing it - -1, 2, 3 -mutated value: 4 -len: 3 -10 -20 -30 -``` \ No newline at end of file diff --git a/example_versioned_docs/version-latest/11-sets.md b/example_versioned_docs/version-latest/11-sets.md new file mode 100644 index 000000000..ab903a3ad --- /dev/null +++ b/example_versioned_docs/version-latest/11-sets.md @@ -0,0 +1,37 @@ +--- +title: Sets +id: sets +slug: /sets +sidebar_label: 11. Sets +description: Using sets with Wing +keywords: [Wing language, example] +--- + +Sets are immutable by default `Set`, you can make them immutable using `>`. + +Sets will store and return unique values. + +```js playground example title="main.w" +//// mutable set +let unqiueNumbers = MutSet[1, 2, 3, 3, 3]; +unqiueNumbers.add(4); +unqiueNumbers.delete(1); + +// immutable set, will make values unique +let uniqueStrings = Set["unique", "values", "values"]; + + +log(Json.stringify(unqiueNumbers.toArray())); +log(Json.stringify(unqiueNumbers.size)); + +log(Json.stringify(uniqueStrings.toArray())); +``` + +```bash title="Wing console output" +# Run locally with wing console +wing it + +[2,3,4] +3 +["unique", "values"] +``` \ No newline at end of file diff --git a/example_versioned_docs/version-latest/12-structs.md b/example_versioned_docs/version-latest/12-structs.md new file mode 100644 index 000000000..bf0980f72 --- /dev/null +++ b/example_versioned_docs/version-latest/12-structs.md @@ -0,0 +1,48 @@ +--- +title: Structs +id: structs +slug: /structs +sidebar_label: 12. Structs +description: Using arrays with Wing +keywords: [Wing language, example] +--- + +Structs are loosely modeled after typed JSON literals in JavaScript. + +```js playground example title="main.w" +// Define a simple structure called `Example` +struct Example { + a: str; + b: num; + c: bool?; +} + +// Define another structure called `MyData` that includes composition +struct MyData { + a: str; + b: num?; + c: Example; +} + +// Creating an instance of `MyData` with some fields initialized +let data = MyData { + a: "hello", + c: Example { + a: "world", + b: 42, + } +}; + +log(data.a); +log(data.c.a); +log(data.c.b); +``` + +```bash title="Wing console output" +# Run locally with wing console +wing it + +hello +world +42 +``` \ No newline at end of file From fad5a72653519b2789d1f3e20b007dacd4f1abf3 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Mon, 2 Sep 2024 13:37:02 +0100 Subject: [PATCH 04/58] adding more examples to learn by --- .../version-latest/02-hello-world.md | 6 +-- .../version-latest/03-values.md | 16 +++--- .../version-latest/04-variables.md | 33 +++++------- .../version-latest/05-for.md | 54 +++++++++---------- .../version-latest/06-ifelse.md | 50 ++++++++--------- .../version-latest/07-while.md | 17 ++---- .../version-latest/08-optionality.md | 16 ++---- .../version-latest/09-arrays.md | 29 +++++----- .../version-latest/11-sets.md | 2 +- .../version-latest/13-functions.md | 42 +++++++++++++++ 10 files changed, 132 insertions(+), 133 deletions(-) create mode 100644 example_versioned_docs/version-latest/13-functions.md diff --git a/example_versioned_docs/version-latest/02-hello-world.md b/example_versioned_docs/version-latest/02-hello-world.md index 97c81a9b9..1b785b0f8 100644 --- a/example_versioned_docs/version-latest/02-hello-world.md +++ b/example_versioned_docs/version-latest/02-hello-world.md @@ -11,11 +11,7 @@ keywords: [Wing language, example] ```js playground title="main.w" -let main = () => { - log("Hello world!"); -}; - -main(); +log("Hello world!"); ``` ```bash title="Wing console output" diff --git a/example_versioned_docs/version-latest/03-values.md b/example_versioned_docs/version-latest/03-values.md index ba1ee698a..8d1e211d7 100644 --- a/example_versioned_docs/version-latest/03-values.md +++ b/example_versioned_docs/version-latest/03-values.md @@ -15,18 +15,14 @@ Wing has various value types including strings, integers, floats, booleans, etc. - Booleans, with boolean operators as you'd expect ```js playground title="main.w" -let main = () => { - log("Hello " + "Wing"); +log("Hello " + "Wing"); - log("1+1 = {1+1}"); - log("7.0/3.0 = {7.0/3.0}"); +log("1+1 = {1+1}"); +log("7.0/3.0 = {7.0/3.0}"); - log(true && true); - log(true || false); - log(!true); -}; - -main(); +log(true && true); +log(true || false); +log(!true); ``` ```bash title="Wing console output" diff --git a/example_versioned_docs/version-latest/04-variables.md b/example_versioned_docs/version-latest/04-variables.md index a4e986500..c735aebfd 100644 --- a/example_versioned_docs/version-latest/04-variables.md +++ b/example_versioned_docs/version-latest/04-variables.md @@ -14,30 +14,25 @@ Wing has various value types including strings, integers, floats, booleans, etc. - Booleans, with boolean operators as you'd expect ```js title="main.w" -let main = () => { - // var delcares a varaible. Wing infers the type - let a = "initial"; - log(a); +// var delcares a varaible. Wing infers the type +let a = "initial"; +log(a); - // type can also be declared - let b: num = 1; - let c: num = 2; - log("{b}, {c}"); +// type can also be declared +let b: num = 1; +let c: num = 2; +log("{b}, {c}"); - // variables cannot be changed using let without var - let d: str = "Hello"; - // d = "Test"; // error: Variable is not reassignable +// variables cannot be changed using let without var +let d: str = "Hello"; +// d = "Test"; // error: Variable is not reassignable - // makes variable mutable - let var s = "hello"; - s = "hello world"; // compiles - log(s); - -}; - -main(); +// makes variable mutable +let var s = "hello"; +s = "hello world"; // compiles +log(s); ``` diff --git a/example_versioned_docs/version-latest/05-for.md b/example_versioned_docs/version-latest/05-for.md index aeaccf7a1..ac04a4eec 100644 --- a/example_versioned_docs/version-latest/05-for.md +++ b/example_versioned_docs/version-latest/05-for.md @@ -12,39 +12,33 @@ Wing supports for..in statements. [for..in](/docs/api/language-reference#26-for) is used to iterate over an array, a set or a range. The loop invariant in for loops is implicitly re-assignable (var). ```js playground title="main.w" -let main = () => { - - // a standard for loop - for item in 1..3 { - log(item); - } - - // for-in with arrays - let arr = [1, 2, 3]; - for item in arr { - log("{item}"); +// a standard for loop +for item in 1..3 { + log(item); +} + +// for-in with arrays +let arr = [1, 2, 3]; +for item in arr { + log("{item}"); +} + +// break a loop +let items = Set[1, 2, 3]; +for item in items { + if(item == 1){ + break; } + log(item); +} - // break a loop - let items = Set[1, 2, 3]; - for item in items { - if(item == 1){ - break; - } - log(item); +// continue the next iteration of the loop +for item in 1..10 { + if(item%2 == 0){ + continue; } - - // continue the next iteration of the loop - for item in 1..10 { - if(item%2 == 0){ - continue; - } - log(item); - } - -}; - -main(); + log(item); +} ``` diff --git a/example_versioned_docs/version-latest/06-ifelse.md b/example_versioned_docs/version-latest/06-ifelse.md index 325a3d8b5..0dc7bdcb1 100644 --- a/example_versioned_docs/version-latest/06-ifelse.md +++ b/example_versioned_docs/version-latest/06-ifelse.md @@ -10,34 +10,28 @@ keywords: [Wing language, example] Flow control can be done with if/else statements. The if statement is optionally followed by else if and else. ```js playground title="main.w" -let main = () => { - - if (7 % 2 == 0) { - log("7 is even"); - } else { - log("7 is odd"); - } - - if (8 % 4 == 0) { - log("8 is divisble by 4"); - } - - if(8 % 2 == 0 || 7 % 2 == 0){ - log("either 8 or 7 are even"); - } - - let value:num = 9; - if(value < 0){ - log("${value} is negative"); - } else if value < 10 { - log("${value} has 1 digit"); - } else { - log("{value} has multiple digits"); - } - -}; - -main(); +if (7 % 2 == 0) { + log("7 is even"); +} else { + log("7 is odd"); +} + +if (8 % 4 == 0) { + log("8 is divisble by 4"); +} + +if(8 % 2 == 0 || 7 % 2 == 0){ + log("either 8 or 7 are even"); +} + +let value:num = 9; +if(value < 0){ + log("${value} is negative"); +} else if value < 10 { + log("${value} has 1 digit"); +} else { + log("{value} has multiple digits"); +} ``` diff --git a/example_versioned_docs/version-latest/07-while.md b/example_versioned_docs/version-latest/07-while.md index 224933c7a..9e1b83a1e 100644 --- a/example_versioned_docs/version-latest/07-while.md +++ b/example_versioned_docs/version-latest/07-while.md @@ -8,19 +8,12 @@ keywords: [Wing language, example] --- ```js playground title="main.w" -let main = () => { - - let var i = 0; - - while(i < 2){ - log("while {i}"); - i = i + 1; - } - -}; - -main(); +let var i = 0; +while(i < 2){ + log("while {i}"); + i = i + 1; +} ``` ```bash title="Wing console output" diff --git a/example_versioned_docs/version-latest/08-optionality.md b/example_versioned_docs/version-latest/08-optionality.md index 34a076876..cb69e23ea 100644 --- a/example_versioned_docs/version-latest/08-optionality.md +++ b/example_versioned_docs/version-latest/08-optionality.md @@ -12,19 +12,13 @@ Nullity is a primary source of bugs in software. Being able to guarantee that a Optionality requires developers to be more intentional about working with the concept of "lack of value". ```js playground title="main.w" -let main = () => { +let monday:str = "doctor"; +let tuesday: str? = nil; - let monday:str = "doctor"; - let tuesday: str? = nil; +// Set next to tuesday if there is a value otherwise use monday value +let var next = tuesday ?? monday; - // Set next to tuesday if there is a value otherwise use monday value - let var next = tuesday ?? monday; - - log("{next}"); - -}; - -main(); +log("{next}"); ``` diff --git a/example_versioned_docs/version-latest/09-arrays.md b/example_versioned_docs/version-latest/09-arrays.md index f8ae28cbb..2357dc30d 100644 --- a/example_versioned_docs/version-latest/09-arrays.md +++ b/example_versioned_docs/version-latest/09-arrays.md @@ -12,28 +12,23 @@ Individual array items are accessed using the .at(index: num) method. Arrays are similar to dynamically sized arrays or vectors in other languages. ```js playground example title="main.w" -let main = () => { +let a = MutArray[1, 2, 3]; - let a = MutArray[1, 2, 3]; +log("{a[0]}, {a[1]}, {a[2]}"); - log("{a[0]}, {a[1]}, {a[2]}"); +a[2] = 4; - a[2] = 4; +log("mutated value: {a[2]}"); +log("len: {a.length}"); - log("mutated value: {a[2]}"); - log("len: {a.length}"); - - let data = MutArray[1, 2, 3]; - let twoD = MutArray>[data]; - - for array in twoD { - for item in array { - log(item * 10); - } - } - -} +let data = MutArray[1, 2, 3]; +let twoD = MutArray>[data]; +for array in twoD { + for item in array { + log(item * 10); + } +} ``` ```bash title="Wing console output" diff --git a/example_versioned_docs/version-latest/11-sets.md b/example_versioned_docs/version-latest/11-sets.md index ab903a3ad..029e11be8 100644 --- a/example_versioned_docs/version-latest/11-sets.md +++ b/example_versioned_docs/version-latest/11-sets.md @@ -12,7 +12,7 @@ Sets are immutable by default `Set`, you can make them immutable using `[1, 2, 3, 3, 3]; unqiueNumbers.add(4); unqiueNumbers.delete(1); diff --git a/example_versioned_docs/version-latest/13-functions.md b/example_versioned_docs/version-latest/13-functions.md new file mode 100644 index 000000000..25ba87530 --- /dev/null +++ b/example_versioned_docs/version-latest/13-functions.md @@ -0,0 +1,42 @@ +--- +title: Functions +id: functions +slug: /functions +sidebar_label: 13. Functions +description: Using functions with Wing +keywords: [Wing language, example] +--- + +Wing supports two function types [preflight and inflight](/docs/concepts/inflights). + +- Preflight: Code that runs once, at compile time, and generates the infrastructure configuration of your cloud application. For example, setting up databases, queues, storage buckets, API endpoints, etc. + +- Inflight: Code that runs at runtime and implements your application's behavior. For example, handling API requests, processing queue messages, etc. Inflight code can be executed on various compute platforms in the cloud, such as function services (such as AWS Lambda or Azure Functions), containers (such as ECS or Kubernetes), VMs or even physical servers. + +By default functions are preflight functions. + +```js playground example title="main.w" +bring cloud; + +// preflight function - can be called at compile time +let plus = (num1: num, num2: num) => { + return num1 + num2; +}; + +// Inflight code here is run at runtime +let func = new cloud.Function(inflight (payload:Json?) => { + // When when the function it excuted on the cloud + log(Json.stringify(payload)); +}); + +let value = plus(1, 2); + +log(value); +``` + +```bash title="Wing console output" +# Run locally with wing console +wing it + +3 +``` \ No newline at end of file From e1c3537a89ca2b15ed60657912d3faacc07bbb72 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Mon, 2 Sep 2024 16:56:14 +0100 Subject: [PATCH 05/58] adding more examples --- .../version-latest/14-variadic-functions.md | 38 ++++++++++ .../version-latest/15-closures.md | 37 ++++++++++ .../version-latest/16-recursion.md | 27 +++++++ .../version-latest/17-methods.md | 70 +++++++++++++++++++ 4 files changed, 172 insertions(+) create mode 100644 example_versioned_docs/version-latest/14-variadic-functions.md create mode 100644 example_versioned_docs/version-latest/15-closures.md create mode 100644 example_versioned_docs/version-latest/16-recursion.md create mode 100644 example_versioned_docs/version-latest/17-methods.md diff --git a/example_versioned_docs/version-latest/14-variadic-functions.md b/example_versioned_docs/version-latest/14-variadic-functions.md new file mode 100644 index 000000000..67a5aade8 --- /dev/null +++ b/example_versioned_docs/version-latest/14-variadic-functions.md @@ -0,0 +1,38 @@ +--- +title: Variadic Functions +id: variadic-functions +slug: /variadic-functions +sidebar_label: 14. Variadic Functions +description: Using variadic functions with Wing +keywords: [Wing language, variadic] +--- + + +Variadic functions can be called with any number of trailing arguments. + +```js playground example title="main.w" +// Function that will take an arbitrary number of ints as arguments. +let plus = (...numbers: Array) => { + let var value = 0; + + for number in numbers{ + value = value + number; + } + + return value; +}; + +// in this example you can pass any many numbers as you want +log(plus(1, 2)); +log(plus(1, 2, 3)); +log(plus(1, 2, 3, 4)); +``` + +```bash title="Wing console output" +# Run locally with wing console +wing it + +3 +6 +10 +``` \ No newline at end of file diff --git a/example_versioned_docs/version-latest/15-closures.md b/example_versioned_docs/version-latest/15-closures.md new file mode 100644 index 000000000..7f588b5da --- /dev/null +++ b/example_versioned_docs/version-latest/15-closures.md @@ -0,0 +1,37 @@ +--- +title: Closures +id: closures +slug: /closures +sidebar_label: 15. Closures +description: Closures with Wing +keywords: [Wing language, variadic] +--- + +Closures are functions that captures variables from its surrounding lexical scope, allowing those variables to persist even after the function is executed outside its original context + + +```js playground example title="main.w" +let createCounter = (): (): num => { + let var count = 0; // This variable is part of the closure + + return () => { + count = count + 1; + return count; + }; +}; + +let counter = createCounter(); + +log(counter()); +log(counter()); +log(counter()); +``` + +```bash title="Wing console output" +# Run locally with wing console +wing it + +1 +2 +3 +``` \ No newline at end of file diff --git a/example_versioned_docs/version-latest/16-recursion.md b/example_versioned_docs/version-latest/16-recursion.md new file mode 100644 index 000000000..93355799e --- /dev/null +++ b/example_versioned_docs/version-latest/16-recursion.md @@ -0,0 +1,27 @@ +--- +title: Recursion +id: recursion +slug: /recursion +sidebar_label: 16. Recursion +description: Recursion with Wing +keywords: [Wing language, variadic] +--- + +```js playground example title="main.w" +let fact = (n: num):num => { + if(n == 0){ + return 1; + } + return n * fact(n - 1); +}; + + +log(fact(7)); +``` + +```bash title="Wing console output" +# Run locally with wing console +wing it + +5040 +``` \ No newline at end of file diff --git a/example_versioned_docs/version-latest/17-methods.md b/example_versioned_docs/version-latest/17-methods.md new file mode 100644 index 000000000..08e9a6ee8 --- /dev/null +++ b/example_versioned_docs/version-latest/17-methods.md @@ -0,0 +1,70 @@ +--- +title: Methods +id: methods +slug: /methods +sidebar_label: 17. Methods +description: Methods with Wing +keywords: [Wing language, variadic] +--- + +```js playground example title="main.w" +// Rect type +struct Rect { + width:num; + height: num; +} + +// methods accepting Rect type +let area = (r: Rect): num => { + return r.height * r.width; +}; + +// methods accepting Rect type +let perim = (r: Rect): num => { + return 2 * r.height + 2 * r.width; +}; + +let r = Rect { + height: 5, + width: 10 +}; + +log("area: {area(r)}"); +log("perim: {perim(r)}"); + +// Or Rectangle class with public methods +class Rectangle { + + height:num; + width:num; + + new (height: num, width: num){ + this.height = height; + this.width = width; + } + + pub area(): num { + return this.height * this.width; + } + + pub perim(): num { + return 2 * this.height + 2 * this.width; + } + +} + +let x = new Rectangle(5, 10); +log(x.area()); +log(x.perim()); + +``` + +```bash title="Wing console output" +# Run locally with wing console +wing it + +area: 50 +perim: 30 +50 +30 +``` \ No newline at end of file From ebfdde2d69e9289983150853c1032f8ef4c5b484 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Tue, 3 Sep 2024 15:39:52 +0100 Subject: [PATCH 06/58] adding more examples --- .../version-latest/14-async-functions.md | 52 ++++++++++++++ .../version-latest/18-interfaces.md | 70 +++++++++++++++++++ .../version-latest/19-sleep.md | 49 +++++++++++++ 3 files changed, 171 insertions(+) create mode 100644 example_versioned_docs/version-latest/14-async-functions.md create mode 100644 example_versioned_docs/version-latest/18-interfaces.md create mode 100644 example_versioned_docs/version-latest/19-sleep.md diff --git a/example_versioned_docs/version-latest/14-async-functions.md b/example_versioned_docs/version-latest/14-async-functions.md new file mode 100644 index 000000000..8f7d742bb --- /dev/null +++ b/example_versioned_docs/version-latest/14-async-functions.md @@ -0,0 +1,52 @@ +--- +title: Async inflight functions +id: async-inflight-functions +slug: /async-inflight-functions +sidebar_label: 14. Async inflight functions +description: Using functions with Wing +keywords: [Wing language, example] +--- + +Wing supports two function types [preflight and inflight](/docs/concepts/inflights). + +- Preflight: Code that runs once, at compile time, and generates the infrastructure configuration of your cloud application. For example, setting up databases, queues, storage buckets, API endpoints, etc. + +- Inflight: Code that runs at runtime and implements your application's behavior. For example, handling API requests, processing queue messages, etc. Inflight code can be executed on various compute platforms in the cloud, such as function services (such as AWS Lambda or Azure Functions), containers (such as ECS or Kubernetes), VMs or even physical servers. + +By default functions are preflight functions. + +```js playground example title="main.w" +bring cloud; +bring util; + +// defining a cloud.Function resource +let countWords = new cloud.Function(inflight (payload: Json?): Json => { + return "{payload?.tryAsStr()?.split(" ")?.length ?? 0}"; +}) as "countWords"; + +// simulate a long running task, to run async +let longTask = new cloud.Function(inflight () => { + util.sleep(30s); + log("done!"); +}); + +new cloud.Function(inflight () => { + let sentence = "I am a sentence with 7 words"; + // invoking cloud.Function from inflight context + let wordsCount = countWords.invoke(sentence); + log("'{sentence}' has {wordsCount ?? "0"} words"); + + // invokes async + longTask.invokeAsync(""); + + // continue to execute + log("task started"); +}) as "Invoke Me"; +``` + +```bash title="Wing console output" +# Run locally with wing console +wing it + +3 +``` \ No newline at end of file diff --git a/example_versioned_docs/version-latest/18-interfaces.md b/example_versioned_docs/version-latest/18-interfaces.md new file mode 100644 index 000000000..0cb545877 --- /dev/null +++ b/example_versioned_docs/version-latest/18-interfaces.md @@ -0,0 +1,70 @@ +--- +title: Interfaces +id: interfaces +slug: /interfaces +sidebar_label: 18. Interfaces +description: Interfaces with Wing +keywords: [Wing language, interfaces] +--- + +```js playground example title="main.w" +bring math; + +interface Geometry { + area(): num; + perim(): num; +} + +class Rect impl Geometry { + width:num; + height:num; + new(width:num, height: num) { + this.width = width; + this.height = height; + } + + pub area(): num { + return this.height * this.width; + } + + pub perim(): num { + return 2 * this.height + 2 * this.width; + } +} + +class Circle impl Geometry { + radius:num; + new(radius:num) { + this.radius = radius; + } + + pub area(): num { + return math.PI * this.radius * this.radius; + } + + pub perim(): num { + return 2 * math.PI * this.radius; + } +} + + + +let r = new Rect(3, 4); +let c = new Circle(5); + +log(r.area()); +log(r.perim()); + +log(c.area()); +log(c.perim()); +``` + +```bash title="Wing console output" +# Run locally with wing console +wing it + +12 +14 +78.53981633974483 +31.41592653589793 +``` \ No newline at end of file diff --git a/example_versioned_docs/version-latest/19-sleep.md b/example_versioned_docs/version-latest/19-sleep.md new file mode 100644 index 000000000..8569f1594 --- /dev/null +++ b/example_versioned_docs/version-latest/19-sleep.md @@ -0,0 +1,49 @@ +--- +title: Sleep +id: sleep +slug: /sleep +sidebar_label: 19. Sleep +description: Suspends execution for a given duration. +keywords: [Wing language, sleep] +--- + +`util.sleep` is an [inflight](/docs/concepts/inflights) api. + +You cannot sleep in preflight code. + +```js playground example title="main.w" +bring util; +bring cloud; + +// util.sleep has inflight api for sleep +inflight () => { + util.sleep(40s); +}; + +// example showing cloud function that sleeps +let longTask = new cloud.Function(inflight () => { + + let timer1 = () => { + log("Time 1 fired"); + util.sleep(5s); + }; + + let timer2 = () => { + log("Time 2 fired"); + util.sleep(2s); + }; + + timer1(); + timer2(); +}); + +``` + +```bash title="Wing console output" +# Run locally with wing console +wing it + +# Run the cloud function using the console (to trigger the inflight function) +Time 1 fired +Time 2 fired +``` \ No newline at end of file From 4f2b115e768c63d2dea6f29c640dc44074f47a1f Mon Sep 17 00:00:00 2001 From: David Boyne Date: Mon, 9 Sep 2024 09:40:26 +0100 Subject: [PATCH 07/58] Update example_versioned_docs/version-latest/01-introduction.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/01-introduction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/01-introduction.md b/example_versioned_docs/version-latest/01-introduction.md index a1c5adcb6..e55738c99 100644 --- a/example_versioned_docs/version-latest/01-introduction.md +++ b/example_versioned_docs/version-latest/01-introduction.md @@ -10,6 +10,6 @@ keywords: [Wing language, api] Wing is an open source programming language for the cloud. Wing combines infrastructure and runtime code in one language, enabling developers to stay in their creative flow, and to deliver better software, faster and more securely. -Wing by Example is a hands-on introduction to Wing using annotated example programs. Check out the first example or browse the list using the navigation. +**Wing by Example** is a hands-on introduction to Wing using annotated example programs. Check out the first example or browse the list using the navigation. Unless stated otherwise, examples here assume the latest major release Wing and may use new language features. Try to upgrade to the latest version if something isn't working. \ No newline at end of file From 3618a074e69fec854e2100020080548ed9f5df77 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Mon, 9 Sep 2024 09:40:41 +0100 Subject: [PATCH 08/58] Update example_versioned_docs/version-latest/01-introduction.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/01-introduction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/01-introduction.md b/example_versioned_docs/version-latest/01-introduction.md index e55738c99..8b17e8012 100644 --- a/example_versioned_docs/version-latest/01-introduction.md +++ b/example_versioned_docs/version-latest/01-introduction.md @@ -12,4 +12,4 @@ Wing is an open source programming language for the cloud. Wing combines infrast **Wing by Example** is a hands-on introduction to Wing using annotated example programs. Check out the first example or browse the list using the navigation. -Unless stated otherwise, examples here assume the latest major release Wing and may use new language features. Try to upgrade to the latest version if something isn't working. \ No newline at end of file +Unless stated otherwise, examples here assume the latest major release of Wing and may use new language features. If something isn't working and upgrading to the latest version doesn't fix it, please [open an issue on our GitHub](https://github.com/winglang/wing/issues/new/choose) or [send us a message on Discord](https://t.winglang.io/discord)! \ No newline at end of file From a4d47270628f5078a76b16dc206cdcbd36b3a4df Mon Sep 17 00:00:00 2001 From: David Boyne Date: Mon, 9 Sep 2024 09:40:55 +0100 Subject: [PATCH 09/58] Update example_versioned_docs/version-latest/02-hello-world.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/02-hello-world.md | 1 + 1 file changed, 1 insertion(+) diff --git a/example_versioned_docs/version-latest/02-hello-world.md b/example_versioned_docs/version-latest/02-hello-world.md index 1b785b0f8..d2402a8de 100644 --- a/example_versioned_docs/version-latest/02-hello-world.md +++ b/example_versioned_docs/version-latest/02-hello-world.md @@ -9,6 +9,7 @@ keywords: [Wing language, example] # Hello world +By default, Wing code is executed when it's compiled. ```js playground title="main.w" log("Hello world!"); From 5e1e08b9fdaa8d2d4d569c87791899cfc6f2b112 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Mon, 9 Sep 2024 09:43:24 +0100 Subject: [PATCH 10/58] Update example_versioned_docs/version-latest/03-values.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/03-values.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/example_versioned_docs/version-latest/03-values.md b/example_versioned_docs/version-latest/03-values.md index 8d1e211d7..4e9d10d3e 100644 --- a/example_versioned_docs/version-latest/03-values.md +++ b/example_versioned_docs/version-latest/03-values.md @@ -1,14 +1,13 @@ --- -title: Values -id: values -slug: /values -sidebar_label: 2. Values +title: Primitive values +id: primitives +slug: /primitive-values +sidebar_label: 2. Primitive values description: Hello world wing example -keywords: [Wing language, example] +keywords: [Wing language, example, primitives, values] --- - -Wing has various value types including strings, integers, floats, booleans, etc. Here are a few basic examples. +Wing has primitive types including strings, integers, floats, booleans, etc. Here are a few basic examples. - Strings, which can be added together with + - Integers and floats From 125a2e9c238ee51b4817ecea8cdd63e71cf6bd9d Mon Sep 17 00:00:00 2001 From: David Boyne Date: Mon, 9 Sep 2024 09:43:54 +0100 Subject: [PATCH 11/58] Update example_versioned_docs/version-latest/11-sets.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/11-sets.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/example_versioned_docs/version-latest/11-sets.md b/example_versioned_docs/version-latest/11-sets.md index 029e11be8..8ce3d7f51 100644 --- a/example_versioned_docs/version-latest/11-sets.md +++ b/example_versioned_docs/version-latest/11-sets.md @@ -7,9 +7,9 @@ description: Using sets with Wing keywords: [Wing language, example] --- -Sets are immutable by default `Set`, you can make them immutable using `>`. -Sets will store and return unique values. +A set keeps track of collection of unique values - a specific value can only be added to a set once. Sets are immutable by default `Set`, and you can make them immutable using `MutSet`. + ```js playground example title="main.w" // mutable set From da218801dc8967c162e3e21ebb3cba7b37d851f2 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Mon, 9 Sep 2024 09:44:05 +0100 Subject: [PATCH 12/58] Update example_versioned_docs/version-latest/10-maps.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/10-maps.md | 1 + 1 file changed, 1 insertion(+) diff --git a/example_versioned_docs/version-latest/10-maps.md b/example_versioned_docs/version-latest/10-maps.md index 9fbcb4a7e..707c5bf77 100644 --- a/example_versioned_docs/version-latest/10-maps.md +++ b/example_versioned_docs/version-latest/10-maps.md @@ -7,6 +7,7 @@ description: Using maps with Wing keywords: [Wing language, example] --- +Maps are key-value data structures that let you associate strings with any kinds of other values. ```js playground example title="main.w" // immutable map From 6fdc7dbf7a59c01865b089e5e95e321202a3360a Mon Sep 17 00:00:00 2001 From: David Boyne Date: Mon, 9 Sep 2024 09:44:38 +0100 Subject: [PATCH 13/58] Update example_versioned_docs/version-latest/12-structs.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/12-structs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/12-structs.md b/example_versioned_docs/version-latest/12-structs.md index bf0980f72..924371d96 100644 --- a/example_versioned_docs/version-latest/12-structs.md +++ b/example_versioned_docs/version-latest/12-structs.md @@ -7,7 +7,7 @@ description: Using arrays with Wing keywords: [Wing language, example] --- -Structs are loosely modeled after typed JSON literals in JavaScript. +Structs are custom data types you can define to store structured information. They're loosely modeled after typed JSON literals in JavaScript. ```js playground example title="main.w" // Define a simple structure called `Example` From 631ace6a3c5b4e5093bc8ee3130dae0acb408018 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Mon, 9 Sep 2024 13:14:25 +0100 Subject: [PATCH 14/58] updates docs --- .../13-trailing-struct-parameters.md | 44 ++++++++++ .../{13-functions.md => 14-functions.md} | 2 +- ...-functions.md => 15-variadic-functions.md} | 2 +- .../{15-closures.md => 16-closures.md} | 2 +- .../{16-recursion.md => 17-recursion.md} | 2 +- .../{17-methods.md => 18-methods.md} | 2 +- .../{18-interfaces.md => 19-interfaces.md} | 2 +- .../{19-sleep.md => 20-sleep.md} | 2 +- .../version-latest/21-string-functions.md | 44 ++++++++++ .../version-latest/22-regex.md | 56 ++++++++++++ .../version-latest/23-Json.md | 85 +++++++++++++++++++ 11 files changed, 236 insertions(+), 7 deletions(-) create mode 100644 example_versioned_docs/version-latest/13-trailing-struct-parameters.md rename example_versioned_docs/version-latest/{13-functions.md => 14-functions.md} (97%) rename example_versioned_docs/version-latest/{14-variadic-functions.md => 15-variadic-functions.md} (94%) rename example_versioned_docs/version-latest/{15-closures.md => 16-closures.md} (96%) rename example_versioned_docs/version-latest/{16-recursion.md => 17-recursion.md} (92%) rename example_versioned_docs/version-latest/{17-methods.md => 18-methods.md} (97%) rename example_versioned_docs/version-latest/{18-interfaces.md => 19-interfaces.md} (97%) rename example_versioned_docs/version-latest/{19-sleep.md => 20-sleep.md} (97%) create mode 100644 example_versioned_docs/version-latest/21-string-functions.md create mode 100644 example_versioned_docs/version-latest/22-regex.md create mode 100644 example_versioned_docs/version-latest/23-Json.md diff --git a/example_versioned_docs/version-latest/13-trailing-struct-parameters.md b/example_versioned_docs/version-latest/13-trailing-struct-parameters.md new file mode 100644 index 000000000..41591845c --- /dev/null +++ b/example_versioned_docs/version-latest/13-trailing-struct-parameters.md @@ -0,0 +1,44 @@ +--- +title: Trailing struct parameters +id: trailing-structs-parameters +slug: /trailing-structs-parameters +sidebar_label: 13. Trailing struct parameters +description: Passing fields directly to a function +keywords: [Wing language, example] +--- + +If the last parameter of a function is a struct, then you can pass its fields directly. + +```js playground example title="main.w" +// struct for the function params +struct NameOptions { + formal: bool; + caps: bool; +} + +let greet = (name: str, options: NameOptions) => { + let var prefix = "Hi, "; + if options.formal { + prefix = "Greetings, "; + } + let var message = "{prefix}{name}"; + if options.caps { + message = message.uppercase(); + } + log(message); +}; + +greet("kermit", NameOptions { formal: true, caps: false }); + +// Pass fields directly as the last param is a Struct +greet("kermit", formal: true, caps: false); + +``` + +```bash title="Wing console output" +# Run locally with wing console +wing it + +Greetings, kermit +Greetings, kermit +``` \ No newline at end of file diff --git a/example_versioned_docs/version-latest/13-functions.md b/example_versioned_docs/version-latest/14-functions.md similarity index 97% rename from example_versioned_docs/version-latest/13-functions.md rename to example_versioned_docs/version-latest/14-functions.md index 25ba87530..e979177d8 100644 --- a/example_versioned_docs/version-latest/13-functions.md +++ b/example_versioned_docs/version-latest/14-functions.md @@ -2,7 +2,7 @@ title: Functions id: functions slug: /functions -sidebar_label: 13. Functions +sidebar_label: 14. Functions description: Using functions with Wing keywords: [Wing language, example] --- diff --git a/example_versioned_docs/version-latest/14-variadic-functions.md b/example_versioned_docs/version-latest/15-variadic-functions.md similarity index 94% rename from example_versioned_docs/version-latest/14-variadic-functions.md rename to example_versioned_docs/version-latest/15-variadic-functions.md index 67a5aade8..b5b09709b 100644 --- a/example_versioned_docs/version-latest/14-variadic-functions.md +++ b/example_versioned_docs/version-latest/15-variadic-functions.md @@ -2,7 +2,7 @@ title: Variadic Functions id: variadic-functions slug: /variadic-functions -sidebar_label: 14. Variadic Functions +sidebar_label: 15. Variadic Functions description: Using variadic functions with Wing keywords: [Wing language, variadic] --- diff --git a/example_versioned_docs/version-latest/15-closures.md b/example_versioned_docs/version-latest/16-closures.md similarity index 96% rename from example_versioned_docs/version-latest/15-closures.md rename to example_versioned_docs/version-latest/16-closures.md index 7f588b5da..ba63c9337 100644 --- a/example_versioned_docs/version-latest/15-closures.md +++ b/example_versioned_docs/version-latest/16-closures.md @@ -2,7 +2,7 @@ title: Closures id: closures slug: /closures -sidebar_label: 15. Closures +sidebar_label: 16. Closures description: Closures with Wing keywords: [Wing language, variadic] --- diff --git a/example_versioned_docs/version-latest/16-recursion.md b/example_versioned_docs/version-latest/17-recursion.md similarity index 92% rename from example_versioned_docs/version-latest/16-recursion.md rename to example_versioned_docs/version-latest/17-recursion.md index 93355799e..79cb6d69d 100644 --- a/example_versioned_docs/version-latest/16-recursion.md +++ b/example_versioned_docs/version-latest/17-recursion.md @@ -2,7 +2,7 @@ title: Recursion id: recursion slug: /recursion -sidebar_label: 16. Recursion +sidebar_label: 17. Recursion description: Recursion with Wing keywords: [Wing language, variadic] --- diff --git a/example_versioned_docs/version-latest/17-methods.md b/example_versioned_docs/version-latest/18-methods.md similarity index 97% rename from example_versioned_docs/version-latest/17-methods.md rename to example_versioned_docs/version-latest/18-methods.md index 08e9a6ee8..7eb81f9cb 100644 --- a/example_versioned_docs/version-latest/17-methods.md +++ b/example_versioned_docs/version-latest/18-methods.md @@ -2,7 +2,7 @@ title: Methods id: methods slug: /methods -sidebar_label: 17. Methods +sidebar_label: 18. Methods description: Methods with Wing keywords: [Wing language, variadic] --- diff --git a/example_versioned_docs/version-latest/18-interfaces.md b/example_versioned_docs/version-latest/19-interfaces.md similarity index 97% rename from example_versioned_docs/version-latest/18-interfaces.md rename to example_versioned_docs/version-latest/19-interfaces.md index 0cb545877..c79918348 100644 --- a/example_versioned_docs/version-latest/18-interfaces.md +++ b/example_versioned_docs/version-latest/19-interfaces.md @@ -2,7 +2,7 @@ title: Interfaces id: interfaces slug: /interfaces -sidebar_label: 18. Interfaces +sidebar_label: 19. Interfaces description: Interfaces with Wing keywords: [Wing language, interfaces] --- diff --git a/example_versioned_docs/version-latest/19-sleep.md b/example_versioned_docs/version-latest/20-sleep.md similarity index 97% rename from example_versioned_docs/version-latest/19-sleep.md rename to example_versioned_docs/version-latest/20-sleep.md index 8569f1594..e655d7cda 100644 --- a/example_versioned_docs/version-latest/19-sleep.md +++ b/example_versioned_docs/version-latest/20-sleep.md @@ -2,7 +2,7 @@ title: Sleep id: sleep slug: /sleep -sidebar_label: 19. Sleep +sidebar_label: 20. Sleep description: Suspends execution for a given duration. keywords: [Wing language, sleep] --- diff --git a/example_versioned_docs/version-latest/21-string-functions.md b/example_versioned_docs/version-latest/21-string-functions.md new file mode 100644 index 000000000..226681fa7 --- /dev/null +++ b/example_versioned_docs/version-latest/21-string-functions.md @@ -0,0 +1,44 @@ +--- +title: String functions +id: string-functions +slug: /string-functions +sidebar_label: 21. String functions +description: Functions for string values in Wing +keywords: [Wing language, string, functions] +--- + +Wing provides many useful string-related functions. Here are some examples to give you a sense of the usage. + +```js playground example title="main.w" +log("test".contains("es")); +log("test".length); +log("test".startsWith("te")); +log("test".endsWith("st")); +log("test".indexOf("e")); + +let x = ["a", "b"]; +log(x.join("-")); + +log("foo".replace("o", "0")); +log("foo".replaceAll("o", "0")); +log(Json.stringify(("a-b-c-d-e".split("-")))); +log("TEST".lowercase()); +log("test".uppercase()); +``` + +```bash title="Wing console output" +# Run locally with wing console +wing it + +true +4 +true +true +1 +a-b +f0o +f00 +["a","b","c","d","e"] +test +TEST +``` \ No newline at end of file diff --git a/example_versioned_docs/version-latest/22-regex.md b/example_versioned_docs/version-latest/22-regex.md new file mode 100644 index 000000000..68b873081 --- /dev/null +++ b/example_versioned_docs/version-latest/22-regex.md @@ -0,0 +1,56 @@ +--- +title: Regular expressions +id: regex +slug: /regex +sidebar_label: 22. Regular expressions +description: Functions for string values in Wing +keywords: [Wing language, string, functions] +--- + +Wing offers built-in support for regular expressions. Here are some examples of common regexp-related tasks in Wing. + + +```js playground example title="main.w" + +let r = regex.compile("p([a-z]+)ch"); + +// Checks if the regular expression matches the provided text. +log(r.test("peach")); + +// Finds the first occurrence of the pattern within the text. +log(r.find("peach peach") ?? ""); + +// Finds all non-overlapping occurrences of the pattern within the text. +log(Json.stringify(r.findAll("peach punch pinch"))); + +// Finds the start and end index of all matches within the text. +log(Json.stringify(r.findAllIndex("peach punch pinch"))); + +// Finds the start and end index of the first match within the text. +log(Json.stringify(r.findIndex("peach"))); + +// Finds the first match and its submatches. +log(Json.stringify(r.findSubmatch("peach punch"))); + +// Finds the start and end index of the match and all submatches. +log(Json.stringify(r.findSubmatchIndex("peach punch"))); + +// Replaces all occurrences of the match with a replacement string. +log(r.replaceAll("a peach", "")); +``` + +```bash title="Wing console output" +# Run locally with wing console +wing it + +true +peach +["peach","punch","pinch"] +[[0,5],[6,11],[12,17]] +[0,5] +["peach","ea"] +[[0,5],[1,3]] +a +``` + + diff --git a/example_versioned_docs/version-latest/23-Json.md b/example_versioned_docs/version-latest/23-Json.md new file mode 100644 index 000000000..897f9f218 --- /dev/null +++ b/example_versioned_docs/version-latest/23-Json.md @@ -0,0 +1,85 @@ +--- +title: Json +id: json +slug: /json +sidebar_label: 23. Json +description: Create Json values in Wing +keywords: [Wing language, string, functions] +--- + +```js playground example title="main.w" +let person = Json { + firstName: "John", + lastName: "Smith" +}; + +// stringify +log(Json.stringify(person)); + +// parse +log(Json.parse("\{\"firstName\":\"John\",\"lastName\":\"Smith\"}")); + +// Try and parse +if let jsonFromTryParse = Json.tryParse("\{\"firstName\":\"John\",\"lastName\":\"Smith\"}") { + log("{jsonFromTryParse}"); +} else { + log("failed to parse string to JSON"); +} + +// Deep copy of Json +let newPerson = Json.deepCopy(person); +log(Json.stringify(person)); + +// iterate over keys +for k in Json.keys(person) { + let value = person.get(k); + log("found key {k} with value {value}"); +} + +// iterate over values +for value in Json.values(person) { + log("found value {value}"); +} + +// iterate over array +let arrayValue = Json ["a", "b", "c"]; +for v in Json.values(arrayValue) { + log(str.fromJson(v)); +} + +// Convert to structs +struct Foo { + val1: str; + val2: num; +} + +let jFoo = { + val1: "cool", + val2: 21 +}; + +let foo = Foo.fromJson(jFoo); +log(Json.stringify(foo)); +``` + +```bash title="Wing console output" +# Run locally with wing console +wing it + +{"firstName":"John","lastName":"Smith"} +{ firstName: 'John', lastName: 'Smith' } +{"firstName":"John","lastName":"Smith"} +{"firstName":"John","lastName":"Smith"} +found key firstName with value "John" +found key lastName with value "Smith" +found value "John" +found value "Smith" +a +b +c +{"val1":"cool","val2":21} +``` + + + + From 12d20a722dfe464147d904d3efd9031a34caee43 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Mon, 9 Sep 2024 17:22:03 +0100 Subject: [PATCH 15/58] update to examples --- .../version-latest/23-Json.md | 2 +- .../version-latest/24-time.md | 51 ++++++++++++ .../version-latest/25-random.md | 30 +++++++ .../version-latest/26-number-parsing.md | 28 +++++++ .../version-latest/27-url-parsing.md | 49 ++++++++++++ .../version-latest/28-sha256.md | 25 ++++++ .../version-latest/29-base64-encoding.md | 31 ++++++++ .../30-reading-writing-files.md | 44 +++++++++++ .../version-latest/31-directories.md | 42 ++++++++++ .../version-latest/32-testing.md | 44 +++++++++++ .../version-latest/33-http-client.md | 45 +++++++++++ .../version-latest/34-http-server.md | 79 +++++++++++++++++++ .../version-latest/35-exec-processes.md | 38 +++++++++ .../08-guides/04-private-api-gateway-aws.md | 6 +- 14 files changed, 510 insertions(+), 4 deletions(-) create mode 100644 example_versioned_docs/version-latest/24-time.md create mode 100644 example_versioned_docs/version-latest/25-random.md create mode 100644 example_versioned_docs/version-latest/26-number-parsing.md create mode 100644 example_versioned_docs/version-latest/27-url-parsing.md create mode 100644 example_versioned_docs/version-latest/28-sha256.md create mode 100644 example_versioned_docs/version-latest/29-base64-encoding.md create mode 100644 example_versioned_docs/version-latest/30-reading-writing-files.md create mode 100644 example_versioned_docs/version-latest/31-directories.md create mode 100644 example_versioned_docs/version-latest/32-testing.md create mode 100644 example_versioned_docs/version-latest/33-http-client.md create mode 100644 example_versioned_docs/version-latest/34-http-server.md create mode 100644 example_versioned_docs/version-latest/35-exec-processes.md diff --git a/example_versioned_docs/version-latest/23-Json.md b/example_versioned_docs/version-latest/23-Json.md index 897f9f218..4594de823 100644 --- a/example_versioned_docs/version-latest/23-Json.md +++ b/example_versioned_docs/version-latest/23-Json.md @@ -4,7 +4,7 @@ id: json slug: /json sidebar_label: 23. Json description: Create Json values in Wing -keywords: [Wing language, string, functions] +keywords: [Wing language, json] --- ```js playground example title="main.w" diff --git a/example_versioned_docs/version-latest/24-time.md b/example_versioned_docs/version-latest/24-time.md new file mode 100644 index 000000000..af1a8c2dc --- /dev/null +++ b/example_versioned_docs/version-latest/24-time.md @@ -0,0 +1,51 @@ +--- +title: Time +id: time +slug: /time +sidebar_label: 24. Time +description: Create time/date values in Wing +keywords: [Wing language, time, date] +--- + +```js playground example title="main.w" +let now = datetime.utcNow(); + +log(now.toIso()); + +let then = datetime.fromIso("2020-09-09"); +log(then.toIso()); + +log(then.year); +log(then.month); +log(then.dayOfWeek); +log(then.dayOfMonth); +log(then.hours); +log(then.min); +log(then.sec); +log(then.ms); + +log(then.timestamp); +log(then.timestampMs); +log(then.timezone); +``` + +```bash title="Wing console output" +# Run locally with wing console +2024-09-09T12:25:01.080Z +2020-09-09T00:00:00.000Z +2020 +8 +3 +9 +0 +0 +0 +0 +1599609600 +1599609600000 +0 +``` + + + + diff --git a/example_versioned_docs/version-latest/25-random.md b/example_versioned_docs/version-latest/25-random.md new file mode 100644 index 000000000..7879335c9 --- /dev/null +++ b/example_versioned_docs/version-latest/25-random.md @@ -0,0 +1,30 @@ +--- +title: Random +id: random +slug: /random +sidebar_label: 25. Random +description: Create random values in Wing +keywords: [Wing language, random] +--- + +```js playground example title="main.w" +bring math; + +log(math.random(100)); + +log(math.ceil(math.random(100))); + +log((math.random()*5)+5); + +``` + +```bash title="Wing console output" +# Run locally with wing console, output will vary +46.58171364582826 +4 +5.721934646951212 +``` + + + + diff --git a/example_versioned_docs/version-latest/26-number-parsing.md b/example_versioned_docs/version-latest/26-number-parsing.md new file mode 100644 index 000000000..1fc55a936 --- /dev/null +++ b/example_versioned_docs/version-latest/26-number-parsing.md @@ -0,0 +1,28 @@ +--- +title: Number parsing +id: number-parsing +slug: /number-parsing +sidebar_label: 26. Number Parsing +description: Parse values into numbers +keywords: [Wing language, random] +--- + +```js playground example title="main.w" +let j = Json { a: 100 }; + +let x:num = num.fromStr("1"); +let y:num = num.fromJson(j.get("a")); + +log(x); +log(y); +``` + +```bash title="Wing console output" +# Run locally with wing console +1 +100 +``` + + + + diff --git a/example_versioned_docs/version-latest/27-url-parsing.md b/example_versioned_docs/version-latest/27-url-parsing.md new file mode 100644 index 000000000..c9c118ad4 --- /dev/null +++ b/example_versioned_docs/version-latest/27-url-parsing.md @@ -0,0 +1,49 @@ +--- +title: URL parsing +id: url-parsing +slug: /url-parsing +sidebar_label: 27. URL parsing +description: Parse urls in Wing +keywords: [Wing language, URL] +--- + +Parse urls using the http module, works with inflight closures. + +```js playground example title="main.w" +bring http; +bring cloud; + +new cloud.Function(inflight () => { + let parts = http.parseUrl("postgres://user:pass@host.com:5432/path?k=v#f"); + + log(parts.hostname); + log(parts.host); + log(parts.hash); + log(parts.origin); + log(parts.username); + log(parts.password); + log(parts.pathname); + log(parts.port); + log(parts.protocol); + log(parts.search); + +}); +``` + +```bash title="Wing console output" +# Run locally with wing console and invoke the cloud function +host.com +host.com:5432 +#f +null +user +pass +/path +5432 +postgres: +?k=v +``` + + + + diff --git a/example_versioned_docs/version-latest/28-sha256.md b/example_versioned_docs/version-latest/28-sha256.md new file mode 100644 index 000000000..1dd9194eb --- /dev/null +++ b/example_versioned_docs/version-latest/28-sha256.md @@ -0,0 +1,25 @@ +--- +title: SHA256 Hashes +id: sha256 +slug: /sha256 +sidebar_label: 28. SHA256 Hashes +description: Hash values in Wing with SHA256 +keywords: [Wing language, Hash, SHA256] +--- + +```js playground example title="main.w" +bring util; + +let value = util.sha256("sha256 this string"); + +log(value); +``` + +```bash title="Wing console output" +# Run locally with wing console +1af1dfa857bf1d8814fe1af8983c18080019922e557f15a8a0d3db739d77aacb +``` + + + + diff --git a/example_versioned_docs/version-latest/29-base64-encoding.md b/example_versioned_docs/version-latest/29-base64-encoding.md new file mode 100644 index 000000000..4eaaa9597 --- /dev/null +++ b/example_versioned_docs/version-latest/29-base64-encoding.md @@ -0,0 +1,31 @@ +--- +title: Base64 Encoding +id: base64-encoding +slug: /base64-encoding +sidebar_label: 29. Base64 Encoding +description: Encode and decode Base64 values +keywords: [Wing language, Base64] +--- + +```js playground example title="main.w" +bring util; + +let data = "abc123!?$*&()'-=@~"; + +let encoded = util.base64Encode(data); +log(encoded); + + +let decoded = util.base64Decode(encoded); +log(decoded); +``` + +```bash title="Wing console output" +# Run locally with wing console +YWJjMTIzIT8kKiYoKSctPUB+ +abc123!?$*&()'-=@~ +``` + + + + diff --git a/example_versioned_docs/version-latest/30-reading-writing-files.md b/example_versioned_docs/version-latest/30-reading-writing-files.md new file mode 100644 index 000000000..701795c54 --- /dev/null +++ b/example_versioned_docs/version-latest/30-reading-writing-files.md @@ -0,0 +1,44 @@ +--- +title: Reading and writing files +id: reading-and-writing-files +slug: /reading-and-writing-files +sidebar_label: 30. Reading and writing files +description: Reading and writing files with Wing +keywords: [Wing language, Reading files, Writing files] +--- + +```js playground example title="main.w" +bring fs; + +let filename:str = "/tmp/test.txt"; + +log(fs.exists(filename)); + +fs.writeFile(filename, "hello world!"); +fs.exists(filename); + +let file = fs.readFile(filename); + +log(file); +log(fs.extension(filename) ?? ""); +log(fs.isDir(filename)); + +fs.appendFile(filename, "testing"); + +let extendedValue = fs.readFile(filename); + +log(extendedValue); +``` + +```bash title="Wing console output" +# Run locally with wing console +true +hello world! +txt +false +hello world!testing +``` + + + + diff --git a/example_versioned_docs/version-latest/31-directories.md b/example_versioned_docs/version-latest/31-directories.md new file mode 100644 index 000000000..76073124e --- /dev/null +++ b/example_versioned_docs/version-latest/31-directories.md @@ -0,0 +1,42 @@ +--- +title: Directories +id: directories +slug: /directories +sidebar_label: 31. Directories +description: Directories +keywords: [Wing language, Directories] +--- + +Use the fs module to make, read, check, remove directories with Wing. + +```js playground example title="main.w" +bring fs; + +// Make directory +fs.mkdir("subdir"); + +// Check if path is directory +fs.isDir("subdir"); + +// Set permissions on directory +fs.setPermissions("subdir", "0755"); + +// Try and parse +if let dirTryFrom = fs.tryReaddir("random-folder") { + log("Directory is there"); +} else { + log("No directory found"); +} + +// Remove a directory +fs.remove("subdir"); +``` + +```bash title="Wing console output" +# Run locally with wing console +No directory found +``` + + + + diff --git a/example_versioned_docs/version-latest/32-testing.md b/example_versioned_docs/version-latest/32-testing.md new file mode 100644 index 000000000..e1be89b08 --- /dev/null +++ b/example_versioned_docs/version-latest/32-testing.md @@ -0,0 +1,44 @@ +--- +title: Testing +id: testing +slug: /testing +sidebar_label: 32. Testing +description: Directories +keywords: [Wing language, Directories] +--- + +Wing incorporates a [lightweight testing framework](/docs/concepts/tests), which is built around the wing test command and the test keyword. + +```js playground example title="main.w" +bring math; +bring cloud; +let b = new cloud.Bucket(); + +test "abs" { + assert(1 == math.abs(-1)); +} + +test "bucket list should include created file" { + b.put("file", "lorem ipsum"); + let listOfFile = b.list(); + assert(listOfFile.length == 1); +} + +test "bucket starts empty" { + let listOfFile = b.list(); + assert(listOfFile.length == 0); +} + +test "this test fails" { + throw("test throws an exception fails"); +} +``` + +```bash title="Wing console output" +# Run locally with wing console +No directory found +``` + + + + diff --git a/example_versioned_docs/version-latest/33-http-client.md b/example_versioned_docs/version-latest/33-http-client.md new file mode 100644 index 000000000..5d94c89d0 --- /dev/null +++ b/example_versioned_docs/version-latest/33-http-client.md @@ -0,0 +1,45 @@ +--- +title: HTTP Client +id: http-client +slug: /http-client +sidebar_label: 33. HTTP Client +description: Directories +keywords: [Wing language, HTTP] +--- + +The Wing standard library comes with [HTTP support](/docs/api/standard-library/http/api-reference). + +In this example we’ll use it to issue simple HTTP request. + +```js playground example title="main.w" +bring http; +bring cloud; + +struct Pokemon { + id: str; + name: str; + order: num; + weight: num; +} + +new cloud.Function(inflight () => { + let x = http.get("https://pokeapi.co/api/v2/pokemon/ditto"); + + // response status + log(x.status); + + // Cast response back into struct + let ditto = Pokemon.fromJson(x.body); + log(ditto.name); + +}); +``` + +```bash title="Wing console output" +# Run locally with wing console +No directory found +``` + + + + diff --git a/example_versioned_docs/version-latest/34-http-server.md b/example_versioned_docs/version-latest/34-http-server.md new file mode 100644 index 000000000..45683dcb6 --- /dev/null +++ b/example_versioned_docs/version-latest/34-http-server.md @@ -0,0 +1,79 @@ +--- +title: HTTP Server +id: http-server +slug: /http-server +sidebar_label: 33. HTTP Server +description: Directories +keywords: [Wing language, HTTP] +--- + +You can create HTTP servers using the [cloud.Api](/docs/api/standard-library/cloud/api) standard library. + +This example shows an example of using an API with a GET and PUT endpoint that interacts with a bucket. + + +```js playground example title="main.w" +bring cloud; +bring http; + +let noteBucket = new cloud.Bucket(); + +let api = new cloud.Api(); + +api.get("/note", inflight (request) => { + let noteName = request.query.get("name"); + let note = noteBucket.get(noteName); + + return { + status: 200, + body: note + }; +}); + +api.put("/note/:name", inflight (request) => { + let note = request.body; + let noteName = request.vars.get("name"); + + if (note == "") { + return { + status: 400, + body: "note is required" + }; + } + + noteBucket.put(noteName, note ?? ""); + + return { + status: 200, + body: "note: {noteName} saved!" + }; +}); + +// Consumer functions (not required for the app to work, but useful for testing) +new cloud.Function(inflight (event: Json?) => { + if let event = event { + let parts = event.asStr().split(":"); + let name = parts.at(0); + let note = parts.at(1); + + let response = http.put("{api.url}/note/{name}", { + body: "{note}" + }); + return response.body; + } + + return "event is required `NAME:NOTE`"; +}) as "Consumer-PUT"; + +new cloud.Function(inflight (event: Json?) => { + if let event = event { + return http.get("{api.url}/note?name={event}").body; + } + + return "event is required `NAME`"; +}) as "Consumer-GET"; +``` + + + + diff --git a/example_versioned_docs/version-latest/35-exec-processes.md b/example_versioned_docs/version-latest/35-exec-processes.md new file mode 100644 index 000000000..ea6d9bedb --- /dev/null +++ b/example_versioned_docs/version-latest/35-exec-processes.md @@ -0,0 +1,38 @@ +--- +title: Exec processes +id: exec-processed +slug: /exec-processed +sidebar_label: 35. Exec processes +description: Exec'ing Processes +keywords: [Wing language, HTTP] +--- + +```js playground example title="main.w" +bring util; + +let output = util.exec("echo", ["-n", "Hello, Wing!"]); + +// exec with custom environment variables +let output2 = util.exec("bash", ["--norc", "--noprofile", "-c", "echo $WING_TARGET $ENV_VAR"], { env: { ENV_VAR: "Wing" } }); + +// exec with inherited environment variables +let output3 = util.exec("bash", ["--norc", "--noprofile", "-c", "echo $WING_TARGET $ENV_VAR"], { inheritEnv: true }); + +// exec with current working directory +let output4 = util.exec("bash", ["--norc", "--noprofile", "-c", "echo Hello"], { cwd: "/tmp" }); + +log(output); +log(output2); +log(output3); +log(output4); +``` + +```bash title="Wing console output" +# Run locally with wing console +Hello, Wing! +Wing +sim +Hello +``` + + diff --git a/versioned_docs/version-latest/08-guides/04-private-api-gateway-aws.md b/versioned_docs/version-latest/08-guides/04-private-api-gateway-aws.md index 7dca7c44f..8eeec6cb4 100644 --- a/versioned_docs/version-latest/08-guides/04-private-api-gateway-aws.md +++ b/versioned_docs/version-latest/08-guides/04-private-api-gateway-aws.md @@ -117,9 +117,9 @@ api.put("/note/:name", inflight (request) => { }); // Consumer functions (not required for the app to work, but useful for testing) -new cloud.Function(inflight (event: str?) => { +new cloud.Function(inflight (event: Json?) => { if let event = event { - let parts = event.split(":"); + let parts = event.asStr().split(":"); let name = parts.at(0); let note = parts.at(1); @@ -132,7 +132,7 @@ new cloud.Function(inflight (event: str?) => { return "event is required `NAME:NOTE`"; }) as "Consumer-PUT"; -new cloud.Function(inflight (event: str?) => { +new cloud.Function(inflight (event: Json?) => { if let event = event { return http.get("{api.url}/note?name={event}").body; } From c9991756a39b4a3f44f428f9ea3b600927805cbd Mon Sep 17 00:00:00 2001 From: David Boyne Date: Mon, 9 Sep 2024 17:22:42 +0100 Subject: [PATCH 16/58] Update example_versioned_docs/version-latest/11-sets.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/11-sets.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/11-sets.md b/example_versioned_docs/version-latest/11-sets.md index 8ce3d7f51..3d11eb0e7 100644 --- a/example_versioned_docs/version-latest/11-sets.md +++ b/example_versioned_docs/version-latest/11-sets.md @@ -17,7 +17,7 @@ let unqiueNumbers = MutSet[1, 2, 3, 3, 3]; unqiueNumbers.add(4); unqiueNumbers.delete(1); -// immutable set, will make values unique +// immutable set, values cannot be added or removed let uniqueStrings = Set["unique", "values", "values"]; From 8508a7d7e0145f6e7161a2c8a3409954b6fb55c8 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Mon, 9 Sep 2024 17:22:50 +0100 Subject: [PATCH 17/58] Update example_versioned_docs/version-latest/12-structs.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/12-structs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/12-structs.md b/example_versioned_docs/version-latest/12-structs.md index 924371d96..70d98a8f7 100644 --- a/example_versioned_docs/version-latest/12-structs.md +++ b/example_versioned_docs/version-latest/12-structs.md @@ -27,7 +27,7 @@ struct MyData { // Creating an instance of `MyData` with some fields initialized let data = MyData { a: "hello", - c: Example { + c: { a: "world", b: 42, } From 93e57a3f4a8b57ca1e780c7ad78d50cc2e794fbc Mon Sep 17 00:00:00 2001 From: David Boyne Date: Mon, 9 Sep 2024 17:22:56 +0100 Subject: [PATCH 18/58] Update example_versioned_docs/version-latest/14-async-functions.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/14-async-functions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/14-async-functions.md b/example_versioned_docs/version-latest/14-async-functions.md index 8f7d742bb..7b342c058 100644 --- a/example_versioned_docs/version-latest/14-async-functions.md +++ b/example_versioned_docs/version-latest/14-async-functions.md @@ -7,7 +7,7 @@ description: Using functions with Wing keywords: [Wing language, example] --- -Wing supports two function types [preflight and inflight](/docs/concepts/inflights). +Wing supports two function types, [preflight and inflight](/docs/concepts/inflights). - Preflight: Code that runs once, at compile time, and generates the infrastructure configuration of your cloud application. For example, setting up databases, queues, storage buckets, API endpoints, etc. From 91c1e35f02d77c77c8278cae734be8b017b0dc2e Mon Sep 17 00:00:00 2001 From: David Boyne Date: Mon, 9 Sep 2024 17:23:11 +0100 Subject: [PATCH 19/58] Update example_versioned_docs/version-latest/14-async-functions.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/14-async-functions.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/example_versioned_docs/version-latest/14-async-functions.md b/example_versioned_docs/version-latest/14-async-functions.md index 7b342c058..02eee4bd8 100644 --- a/example_versioned_docs/version-latest/14-async-functions.md +++ b/example_versioned_docs/version-latest/14-async-functions.md @@ -1,7 +1,7 @@ --- -title: Async inflight functions -id: async-inflight-functions -slug: /async-inflight-functions +title: Inflight functions +id: inflight-functions +slug: /inflight-functions sidebar_label: 14. Async inflight functions description: Using functions with Wing keywords: [Wing language, example] From ce79fe67ffaf98b584121474a08673770891598f Mon Sep 17 00:00:00 2001 From: David Boyne Date: Mon, 9 Sep 2024 17:23:20 +0100 Subject: [PATCH 20/58] Update example_versioned_docs/version-latest/14-async-functions.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/14-async-functions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/14-async-functions.md b/example_versioned_docs/version-latest/14-async-functions.md index 02eee4bd8..99d750bc5 100644 --- a/example_versioned_docs/version-latest/14-async-functions.md +++ b/example_versioned_docs/version-latest/14-async-functions.md @@ -13,7 +13,7 @@ Wing supports two function types, [preflight and inflight](/docs/concepts/inflig - Inflight: Code that runs at runtime and implements your application's behavior. For example, handling API requests, processing queue messages, etc. Inflight code can be executed on various compute platforms in the cloud, such as function services (such as AWS Lambda or Azure Functions), containers (such as ECS or Kubernetes), VMs or even physical servers. -By default functions are preflight functions. +By default, most functions are preflight. A function is inflight if it has the `inflight` keyword or if the function is defined inside of another inflight function. ```js playground example title="main.w" bring cloud; From 22b0fbca31757e803c0e75e1aaef5daaec95bd15 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Mon, 9 Sep 2024 17:23:29 +0100 Subject: [PATCH 21/58] Update example_versioned_docs/version-latest/17-recursion.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/17-recursion.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/example_versioned_docs/version-latest/17-recursion.md b/example_versioned_docs/version-latest/17-recursion.md index 79cb6d69d..fee43024e 100644 --- a/example_versioned_docs/version-latest/17-recursion.md +++ b/example_versioned_docs/version-latest/17-recursion.md @@ -8,8 +8,8 @@ keywords: [Wing language, variadic] --- ```js playground example title="main.w" -let fact = (n: num):num => { - if(n == 0){ +let fact = (n: num): num => { + if n == 0 { return 1; } return n * fact(n - 1); From be174e6acb787183d1f3385e8f9d107d9cf3b951 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Mon, 9 Sep 2024 17:23:37 +0100 Subject: [PATCH 22/58] Update example_versioned_docs/version-latest/18-methods.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/18-methods.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/example_versioned_docs/version-latest/18-methods.md b/example_versioned_docs/version-latest/18-methods.md index 7eb81f9cb..92cabc88a 100644 --- a/example_versioned_docs/version-latest/18-methods.md +++ b/example_versioned_docs/version-latest/18-methods.md @@ -34,11 +34,10 @@ log("perim: {perim(r)}"); // Or Rectangle class with public methods class Rectangle { + height: num; + width: num; - height:num; - width:num; - - new (height: num, width: num){ + new(height: num, width: num) { this.height = height; this.width = width; } From 7788d15b80ecc866d65bc6aab245e93bbdc1452f Mon Sep 17 00:00:00 2001 From: David Boyne Date: Mon, 9 Sep 2024 17:23:43 +0100 Subject: [PATCH 23/58] Update example_versioned_docs/version-latest/19-interfaces.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/19-interfaces.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/example_versioned_docs/version-latest/19-interfaces.md b/example_versioned_docs/version-latest/19-interfaces.md index c79918348..7a0e1857c 100644 --- a/example_versioned_docs/version-latest/19-interfaces.md +++ b/example_versioned_docs/version-latest/19-interfaces.md @@ -16,9 +16,9 @@ interface Geometry { } class Rect impl Geometry { - width:num; - height:num; - new(width:num, height: num) { + width: num; + height: num; + new(width: num, height: num) { this.width = width; this.height = height; } From 5810ace1350ae81a13aca02b4fc13edcefb81de8 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Mon, 9 Sep 2024 17:23:49 +0100 Subject: [PATCH 24/58] Update example_versioned_docs/version-latest/19-interfaces.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/19-interfaces.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/example_versioned_docs/version-latest/19-interfaces.md b/example_versioned_docs/version-latest/19-interfaces.md index 7a0e1857c..5787432be 100644 --- a/example_versioned_docs/version-latest/19-interfaces.md +++ b/example_versioned_docs/version-latest/19-interfaces.md @@ -33,8 +33,8 @@ class Rect impl Geometry { } class Circle impl Geometry { - radius:num; - new(radius:num) { + radius: num; + new(radius: num) { this.radius = radius; } From ba4ba10ff510b8b267602b58a27b3fcd36cfe8c1 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Tue, 10 Sep 2024 10:10:06 +0100 Subject: [PATCH 25/58] Update example_versioned_docs/version-latest/18-methods.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/18-methods.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/18-methods.md b/example_versioned_docs/version-latest/18-methods.md index 92cabc88a..ccf4aec75 100644 --- a/example_versioned_docs/version-latest/18-methods.md +++ b/example_versioned_docs/version-latest/18-methods.md @@ -10,7 +10,7 @@ keywords: [Wing language, variadic] ```js playground example title="main.w" // Rect type struct Rect { - width:num; + width: num; height: num; } From ecf53d7da9e96c7347f7e5ce44beae4ed0063702 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Tue, 10 Sep 2024 10:10:31 +0100 Subject: [PATCH 26/58] Update example_versioned_docs/version-latest/23-Json.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/23-Json.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/example_versioned_docs/version-latest/23-Json.md b/example_versioned_docs/version-latest/23-Json.md index 4594de823..936d8207e 100644 --- a/example_versioned_docs/version-latest/23-Json.md +++ b/example_versioned_docs/version-latest/23-Json.md @@ -7,6 +7,8 @@ description: Create Json values in Wing keywords: [Wing language, json] --- +Wing has a dedicated type named `Json` for representing [JSON](https://www.json.org/json-en.html). A `Json` value can be an object, but it can also be an array, string, boolean, number, or null. + ```js playground example title="main.w" let person = Json { firstName: "John", From be28f1e0d62925998c99f6bb349f492167f3976a Mon Sep 17 00:00:00 2001 From: David Boyne Date: Tue, 10 Sep 2024 10:11:53 +0100 Subject: [PATCH 27/58] Update example_versioned_docs/version-latest/26-number-parsing.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/26-number-parsing.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/example_versioned_docs/version-latest/26-number-parsing.md b/example_versioned_docs/version-latest/26-number-parsing.md index 1fc55a936..2b0501d36 100644 --- a/example_versioned_docs/version-latest/26-number-parsing.md +++ b/example_versioned_docs/version-latest/26-number-parsing.md @@ -10,8 +10,8 @@ keywords: [Wing language, random] ```js playground example title="main.w" let j = Json { a: 100 }; -let x:num = num.fromStr("1"); -let y:num = num.fromJson(j.get("a")); +let x: num = num.fromStr("1"); +let y: num = num.fromJson(j.get("a")); log(x); log(y); From f4d0101a2dfee06354dbbed3439ab175b8b3c618 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Tue, 10 Sep 2024 10:19:40 +0100 Subject: [PATCH 28/58] Update example_versioned_docs/version-latest/30-reading-writing-files.md Co-authored-by: Chris Rybicki --- .../version-latest/30-reading-writing-files.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/example_versioned_docs/version-latest/30-reading-writing-files.md b/example_versioned_docs/version-latest/30-reading-writing-files.md index 701795c54..b8da32cbc 100644 --- a/example_versioned_docs/version-latest/30-reading-writing-files.md +++ b/example_versioned_docs/version-latest/30-reading-writing-files.md @@ -10,14 +10,14 @@ keywords: [Wing language, Reading files, Writing files] ```js playground example title="main.w" bring fs; -let filename:str = "/tmp/test.txt"; +let filename: str = "/tmp/test.txt"; log(fs.exists(filename)); fs.writeFile(filename, "hello world!"); fs.exists(filename); -let file = fs.readFile(filename); +let file: str = fs.readFile(filename); log(file); log(fs.extension(filename) ?? ""); From 87916f598ec2d19840810162b4085baa3ceda630 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Tue, 10 Sep 2024 10:19:51 +0100 Subject: [PATCH 29/58] Update example_versioned_docs/version-latest/32-testing.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/32-testing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/32-testing.md b/example_versioned_docs/version-latest/32-testing.md index e1be89b08..d53369d97 100644 --- a/example_versioned_docs/version-latest/32-testing.md +++ b/example_versioned_docs/version-latest/32-testing.md @@ -7,7 +7,7 @@ description: Directories keywords: [Wing language, Directories] --- -Wing incorporates a [lightweight testing framework](/docs/concepts/tests), which is built around the wing test command and the test keyword. +Wing incorporates a [lightweight testing framework](/docs/concepts/tests), which is built around the `wing test` command and the `test` keyword. ```js playground example title="main.w" bring math; From 6cfc403d0cd92541ec9a7723f4d0114e7aa0c57d Mon Sep 17 00:00:00 2001 From: David Boyne Date: Tue, 10 Sep 2024 10:19:58 +0100 Subject: [PATCH 30/58] Update example_versioned_docs/version-latest/33-http-client.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/33-http-client.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/33-http-client.md b/example_versioned_docs/version-latest/33-http-client.md index 5d94c89d0..aaa700139 100644 --- a/example_versioned_docs/version-latest/33-http-client.md +++ b/example_versioned_docs/version-latest/33-http-client.md @@ -9,7 +9,7 @@ keywords: [Wing language, HTTP] The Wing standard library comes with [HTTP support](/docs/api/standard-library/http/api-reference). -In this example we’ll use it to issue simple HTTP request. +In this example we’ll use it to issue a simple HTTP request. ```js playground example title="main.w" bring http; From 61b6a6afd5a428409626aea3353703be9a6c7467 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Tue, 10 Sep 2024 10:20:11 +0100 Subject: [PATCH 31/58] Update example_versioned_docs/version-latest/34-http-server.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/34-http-server.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/example_versioned_docs/version-latest/34-http-server.md b/example_versioned_docs/version-latest/34-http-server.md index 45683dcb6..25557d53a 100644 --- a/example_versioned_docs/version-latest/34-http-server.md +++ b/example_versioned_docs/version-latest/34-http-server.md @@ -42,11 +42,7 @@ api.put("/note/:name", inflight (request) => { } noteBucket.put(noteName, note ?? ""); - - return { - status: 200, - body: "note: {noteName} saved!" - }; + // handler implicitly returns `status: 200` by default }); // Consumer functions (not required for the app to work, but useful for testing) From d687ef3929b4936d3875237c2a949e24cec288f7 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Tue, 10 Sep 2024 10:20:22 +0100 Subject: [PATCH 32/58] Update example_versioned_docs/version-latest/31-directories.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/31-directories.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/31-directories.md b/example_versioned_docs/version-latest/31-directories.md index 76073124e..f6a795a10 100644 --- a/example_versioned_docs/version-latest/31-directories.md +++ b/example_versioned_docs/version-latest/31-directories.md @@ -7,7 +7,7 @@ description: Directories keywords: [Wing language, Directories] --- -Use the fs module to make, read, check, remove directories with Wing. +Use the `fs` ("filesystem") module to make, read, check, remove directories. ```js playground example title="main.w" bring fs; From e062ca379fc86d2b2edef92ebd82f2cbb0b1423e Mon Sep 17 00:00:00 2001 From: David Boyne Date: Tue, 10 Sep 2024 10:27:09 +0100 Subject: [PATCH 33/58] added some more docs --- example_versioned_docs/version-latest/21-string-functions.md | 2 +- example_versioned_docs/version-latest/25-random.md | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/21-string-functions.md b/example_versioned_docs/version-latest/21-string-functions.md index 226681fa7..0b836bd3d 100644 --- a/example_versioned_docs/version-latest/21-string-functions.md +++ b/example_versioned_docs/version-latest/21-string-functions.md @@ -7,7 +7,7 @@ description: Functions for string values in Wing keywords: [Wing language, string, functions] --- -Wing provides many useful string-related functions. Here are some examples to give you a sense of the usage. +Wing provides many useful [string-related functions](/docs/api/standard-library/std/string#string-). Here are some examples to give you a sense of the usage. ```js playground example title="main.w" log("test".contains("es")); diff --git a/example_versioned_docs/version-latest/25-random.md b/example_versioned_docs/version-latest/25-random.md index 7879335c9..87e997b59 100644 --- a/example_versioned_docs/version-latest/25-random.md +++ b/example_versioned_docs/version-latest/25-random.md @@ -7,6 +7,11 @@ description: Create random values in Wing keywords: [Wing language, random] --- +Using the [math standard library](/docs/api/standard-library/math/api-reference) you can generate random numbers. + +_Note: The random numbers that are generated are not random enough for sensitive security tasks, such as generating encryption keys, tokens for authentication, or anything requiring unpredictable randomness for security purposes._ + + ```js playground example title="main.w" bring math; From 3fdb1f87a1685d0f119784ca8d82403defb308a3 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Wed, 11 Sep 2024 10:11:40 +0100 Subject: [PATCH 34/58] Update example_versioned_docs/version-latest/04-variables.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/04-variables.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/example_versioned_docs/version-latest/04-variables.md b/example_versioned_docs/version-latest/04-variables.md index c735aebfd..72929da5f 100644 --- a/example_versioned_docs/version-latest/04-variables.md +++ b/example_versioned_docs/version-latest/04-variables.md @@ -7,11 +7,9 @@ description: Using variables with Wing keywords: [Wing language, example] --- -Wing has various value types including strings, integers, floats, booleans, etc. Here are a few basic examples. +Variables are declared with the `let` keyword. The type of most variables can be inferred automatically, but you can also add an explicit type annotation if needed. -- Strings, which can be added together with + -- Integers and floats -- Booleans, with boolean operators as you'd expect +By default, Wing doesn't let you reassign to variables, unless you add the `var` modifier. See [this blog post](https://www.winglang.io/blog/2023/02/02/good-cognitive-friction) for more details. ```js title="main.w" From 337897e3c500878262b5993dbcf457d6deb10492 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Wed, 11 Sep 2024 10:12:12 +0100 Subject: [PATCH 35/58] Update example_versioned_docs/version-latest/04-variables.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/04-variables.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/04-variables.md b/example_versioned_docs/version-latest/04-variables.md index 72929da5f..79fd6d8b9 100644 --- a/example_versioned_docs/version-latest/04-variables.md +++ b/example_versioned_docs/version-latest/04-variables.md @@ -27,7 +27,7 @@ log("{b}, {c}"); let d: str = "Hello"; // d = "Test"; // error: Variable is not reassignable -// makes variable mutable +// makes variable reassignable let var s = "hello"; s = "hello world"; // compiles log(s); From f8cf6b13c010d23f953b0f9778636b26f5f835e9 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Wed, 11 Sep 2024 10:12:22 +0100 Subject: [PATCH 36/58] Update example_versioned_docs/version-latest/05-for.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/05-for.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/05-for.md b/example_versioned_docs/version-latest/05-for.md index ac04a4eec..db2e03929 100644 --- a/example_versioned_docs/version-latest/05-for.md +++ b/example_versioned_docs/version-latest/05-for.md @@ -7,7 +7,7 @@ description: Using for loops with Wing keywords: [Wing language, example] --- -Wing supports for..in statements. +Wing supports looping over collections with `for..in` statements. [for..in](/docs/api/language-reference#26-for) is used to iterate over an array, a set or a range. The loop invariant in for loops is implicitly re-assignable (var). From b0147ed84bd664e33d9fbf225f806eedb77f073b Mon Sep 17 00:00:00 2001 From: David Boyne Date: Wed, 11 Sep 2024 10:12:33 +0100 Subject: [PATCH 37/58] Update example_versioned_docs/version-latest/05-for.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/05-for.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/05-for.md b/example_versioned_docs/version-latest/05-for.md index db2e03929..3bd549bae 100644 --- a/example_versioned_docs/version-latest/05-for.md +++ b/example_versioned_docs/version-latest/05-for.md @@ -9,7 +9,7 @@ keywords: [Wing language, example] Wing supports looping over collections with `for..in` statements. -[for..in](/docs/api/language-reference#26-for) is used to iterate over an array, a set or a range. The loop invariant in for loops is implicitly re-assignable (var). +[for..in](/docs/api/language-reference#26-for) is used to iterate over an array, a set or a range. ```js playground title="main.w" // a standard for loop From a54d86fba00172bb55022b1690259d7e66d53a9f Mon Sep 17 00:00:00 2001 From: David Boyne Date: Wed, 11 Sep 2024 10:12:41 +0100 Subject: [PATCH 38/58] Update example_versioned_docs/version-latest/05-for.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/05-for.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/05-for.md b/example_versioned_docs/version-latest/05-for.md index 3bd549bae..f28cffd94 100644 --- a/example_versioned_docs/version-latest/05-for.md +++ b/example_versioned_docs/version-latest/05-for.md @@ -20,7 +20,7 @@ for item in 1..3 { // for-in with arrays let arr = [1, 2, 3]; for item in arr { - log("{item}"); + log(item); } // break a loop From 407ff9e8c688a9302ee6a6ba368e63a3875cc042 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Wed, 11 Sep 2024 10:12:50 +0100 Subject: [PATCH 39/58] Update example_versioned_docs/version-latest/05-for.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/05-for.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/05-for.md b/example_versioned_docs/version-latest/05-for.md index f28cffd94..7ef82714a 100644 --- a/example_versioned_docs/version-latest/05-for.md +++ b/example_versioned_docs/version-latest/05-for.md @@ -26,7 +26,7 @@ for item in arr { // break a loop let items = Set[1, 2, 3]; for item in items { - if(item == 1){ + if item == 1 { break; } log(item); From b19ca0fb0dac0b43171c2e813b62c352aa8d15a5 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Wed, 11 Sep 2024 10:12:58 +0100 Subject: [PATCH 40/58] Update example_versioned_docs/version-latest/05-for.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/05-for.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/05-for.md b/example_versioned_docs/version-latest/05-for.md index 7ef82714a..041f8d85d 100644 --- a/example_versioned_docs/version-latest/05-for.md +++ b/example_versioned_docs/version-latest/05-for.md @@ -34,7 +34,7 @@ for item in items { // continue the next iteration of the loop for item in 1..10 { - if(item%2 == 0){ + if item % 2 == 0 { continue; } log(item); From 93a62226bb3dd6a9abefce2eddc3aeecc497592b Mon Sep 17 00:00:00 2001 From: David Boyne Date: Wed, 11 Sep 2024 10:13:07 +0100 Subject: [PATCH 41/58] Update example_versioned_docs/version-latest/06-ifelse.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/06-ifelse.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/06-ifelse.md b/example_versioned_docs/version-latest/06-ifelse.md index 0dc7bdcb1..308ddea28 100644 --- a/example_versioned_docs/version-latest/06-ifelse.md +++ b/example_versioned_docs/version-latest/06-ifelse.md @@ -7,7 +7,7 @@ description: Using if else with Wing keywords: [Wing language, example] --- -Flow control can be done with if/else statements. The if statement is optionally followed by else if and else. +Flow control can be done with if/else statements. The `if` statement is optionally followed by any number of `else if` clauses and a final `else` clause. ```js playground title="main.w" if (7 % 2 == 0) { From e6b762dc5030fad52acc56488376bee7defb9e26 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Wed, 11 Sep 2024 10:13:15 +0100 Subject: [PATCH 42/58] Update example_versioned_docs/version-latest/06-ifelse.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/06-ifelse.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/06-ifelse.md b/example_versioned_docs/version-latest/06-ifelse.md index 308ddea28..714680538 100644 --- a/example_versioned_docs/version-latest/06-ifelse.md +++ b/example_versioned_docs/version-latest/06-ifelse.md @@ -10,7 +10,7 @@ keywords: [Wing language, example] Flow control can be done with if/else statements. The `if` statement is optionally followed by any number of `else if` clauses and a final `else` clause. ```js playground title="main.w" -if (7 % 2 == 0) { +if 7 % 2 == 0 { log("7 is even"); } else { log("7 is odd"); From 15033be2ff3de0fc2a2bf546d54f365240ac23c7 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Wed, 11 Sep 2024 10:13:59 +0100 Subject: [PATCH 43/58] Update example_versioned_docs/version-latest/06-ifelse.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/06-ifelse.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/06-ifelse.md b/example_versioned_docs/version-latest/06-ifelse.md index 714680538..5452a7f53 100644 --- a/example_versioned_docs/version-latest/06-ifelse.md +++ b/example_versioned_docs/version-latest/06-ifelse.md @@ -16,7 +16,7 @@ if 7 % 2 == 0 { log("7 is odd"); } -if (8 % 4 == 0) { +if 8 % 4 == 0 { log("8 is divisble by 4"); } From 5df2505a0a0d7f0d1e0cc2bf299b83a93125e4a0 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Wed, 11 Sep 2024 10:15:03 +0100 Subject: [PATCH 44/58] Update example_versioned_docs/version-latest/06-ifelse.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/06-ifelse.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/06-ifelse.md b/example_versioned_docs/version-latest/06-ifelse.md index 5452a7f53..5f441f7bf 100644 --- a/example_versioned_docs/version-latest/06-ifelse.md +++ b/example_versioned_docs/version-latest/06-ifelse.md @@ -20,7 +20,7 @@ if 8 % 4 == 0 { log("8 is divisble by 4"); } -if(8 % 2 == 0 || 7 % 2 == 0){ +if 8 % 2 == 0 || 7 % 2 == 0 { log("either 8 or 7 are even"); } From cd3c94c4ed912f31695458d5fccc649c3ec58223 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Wed, 11 Sep 2024 10:15:15 +0100 Subject: [PATCH 45/58] Update example_versioned_docs/version-latest/06-ifelse.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/06-ifelse.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/example_versioned_docs/version-latest/06-ifelse.md b/example_versioned_docs/version-latest/06-ifelse.md index 5f441f7bf..6f1d99218 100644 --- a/example_versioned_docs/version-latest/06-ifelse.md +++ b/example_versioned_docs/version-latest/06-ifelse.md @@ -24,8 +24,8 @@ if 8 % 2 == 0 || 7 % 2 == 0 { log("either 8 or 7 are even"); } -let value:num = 9; -if(value < 0){ +let value = 9; +if value < 0 { log("${value} is negative"); } else if value < 10 { log("${value} has 1 digit"); From 3253bbf1eea410ef63f3f73d088135e15d7e12a6 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Wed, 11 Sep 2024 10:15:24 +0100 Subject: [PATCH 46/58] Update example_versioned_docs/version-latest/07-while.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/07-while.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/example_versioned_docs/version-latest/07-while.md b/example_versioned_docs/version-latest/07-while.md index 9e1b83a1e..c1232cfac 100644 --- a/example_versioned_docs/version-latest/07-while.md +++ b/example_versioned_docs/version-latest/07-while.md @@ -7,6 +7,8 @@ description: Using while statements with Wing keywords: [Wing language, example] --- +While loops repeatedly check a condition and run a block of code until the condition is `false`. + ```js playground title="main.w" let var i = 0; From 376e1489a5998c00b7e996e531aee0e50dbbbd22 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Wed, 11 Sep 2024 10:15:50 +0100 Subject: [PATCH 47/58] Update example_versioned_docs/version-latest/07-while.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/07-while.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/07-while.md b/example_versioned_docs/version-latest/07-while.md index c1232cfac..576a36e63 100644 --- a/example_versioned_docs/version-latest/07-while.md +++ b/example_versioned_docs/version-latest/07-while.md @@ -12,7 +12,7 @@ While loops repeatedly check a condition and run a block of code until the condi ```js playground title="main.w" let var i = 0; -while(i < 2){ +whilei < 2 { log("while {i}"); i = i + 1; } From bd517f6b6908d054dc78e0aabf6b1e5f2d913d81 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Wed, 11 Sep 2024 10:15:58 +0100 Subject: [PATCH 48/58] Update example_versioned_docs/version-latest/08-optionality.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/08-optionality.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/08-optionality.md b/example_versioned_docs/version-latest/08-optionality.md index cb69e23ea..a1c76ebdd 100644 --- a/example_versioned_docs/version-latest/08-optionality.md +++ b/example_versioned_docs/version-latest/08-optionality.md @@ -9,7 +9,7 @@ keywords: [Wing language, example] Nullity is a primary source of bugs in software. Being able to guarantee that a value will never be null makes it easier to write safe code without constantly having to take nullity into account. -Optionality requires developers to be more intentional about working with the concept of "lack of value". +An optional value can be either "nil" or a non-nil value. The type of an optional variable is represented by adding a question mark (`?`) to its end. ```js playground title="main.w" let monday:str = "doctor"; From ee8dc48edc0ed254cd3ace0461def805798c6ebf Mon Sep 17 00:00:00 2001 From: David Boyne Date: Wed, 11 Sep 2024 10:16:06 +0100 Subject: [PATCH 49/58] Update example_versioned_docs/version-latest/08-optionality.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/08-optionality.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/08-optionality.md b/example_versioned_docs/version-latest/08-optionality.md index a1c76ebdd..a871ef5b7 100644 --- a/example_versioned_docs/version-latest/08-optionality.md +++ b/example_versioned_docs/version-latest/08-optionality.md @@ -12,7 +12,7 @@ Nullity is a primary source of bugs in software. Being able to guarantee that a An optional value can be either "nil" or a non-nil value. The type of an optional variable is represented by adding a question mark (`?`) to its end. ```js playground title="main.w" -let monday:str = "doctor"; +let monday: str = "doctor"; let tuesday: str? = nil; // Set next to tuesday if there is a value otherwise use monday value From 87f364714530d2de59df3efdc2ea1ebf914b719d Mon Sep 17 00:00:00 2001 From: David Boyne Date: Wed, 11 Sep 2024 10:16:14 +0100 Subject: [PATCH 50/58] Update example_versioned_docs/version-latest/08-optionality.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/08-optionality.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/08-optionality.md b/example_versioned_docs/version-latest/08-optionality.md index a871ef5b7..81fb05672 100644 --- a/example_versioned_docs/version-latest/08-optionality.md +++ b/example_versioned_docs/version-latest/08-optionality.md @@ -16,7 +16,7 @@ let monday: str = "doctor"; let tuesday: str? = nil; // Set next to tuesday if there is a value otherwise use monday value -let var next = tuesday ?? monday; +let next = tuesday ?? monday; log("{next}"); From cbde0c12b8aafcf0e658092a5e290bf30798c0bb Mon Sep 17 00:00:00 2001 From: David Boyne Date: Wed, 11 Sep 2024 10:16:22 +0100 Subject: [PATCH 51/58] Update example_versioned_docs/version-latest/09-arrays.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/09-arrays.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/09-arrays.md b/example_versioned_docs/version-latest/09-arrays.md index 2357dc30d..9ff6ae78a 100644 --- a/example_versioned_docs/version-latest/09-arrays.md +++ b/example_versioned_docs/version-latest/09-arrays.md @@ -7,7 +7,7 @@ description: Using arrays with Wing keywords: [Wing language, example] --- -Arrays are dynamically sized in Wing and are defined with the [] syntax. +Arrays are dynamically sized in Wing and are created with the [] syntax. Individual array items are accessed using the .at(index: num) method. Arrays are similar to dynamically sized arrays or vectors in other languages. From 6421690e2a178a16663aa40f4f2b1d2e24475306 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Wed, 11 Sep 2024 10:16:30 +0100 Subject: [PATCH 52/58] Update example_versioned_docs/version-latest/09-arrays.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/09-arrays.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/09-arrays.md b/example_versioned_docs/version-latest/09-arrays.md index 9ff6ae78a..24161109b 100644 --- a/example_versioned_docs/version-latest/09-arrays.md +++ b/example_versioned_docs/version-latest/09-arrays.md @@ -8,7 +8,7 @@ keywords: [Wing language, example] --- Arrays are dynamically sized in Wing and are created with the [] syntax. -Individual array items are accessed using the .at(index: num) method. +Individual array items can be accessed using index operation, `array[index]`, or with the `.at(index: num)` method. Arrays are similar to dynamically sized arrays or vectors in other languages. ```js playground example title="main.w" From 0196b65aa21e8b47a729520f34c1e12e608e5b8e Mon Sep 17 00:00:00 2001 From: David Boyne Date: Wed, 11 Sep 2024 10:16:46 +0100 Subject: [PATCH 53/58] Update example_versioned_docs/version-latest/08-optionality.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/08-optionality.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/08-optionality.md b/example_versioned_docs/version-latest/08-optionality.md index 81fb05672..10ecbeddf 100644 --- a/example_versioned_docs/version-latest/08-optionality.md +++ b/example_versioned_docs/version-latest/08-optionality.md @@ -18,7 +18,7 @@ let tuesday: str? = nil; // Set next to tuesday if there is a value otherwise use monday value let next = tuesday ?? monday; -log("{next}"); +log(next); ``` From e0eef5647e0915466253295fb5ac0c8ef1cf795c Mon Sep 17 00:00:00 2001 From: David Boyne Date: Wed, 11 Sep 2024 10:17:02 +0100 Subject: [PATCH 54/58] Update example_versioned_docs/version-latest/15-variadic-functions.md Co-authored-by: Chris Rybicki --- .../version-latest/15-variadic-functions.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/example_versioned_docs/version-latest/15-variadic-functions.md b/example_versioned_docs/version-latest/15-variadic-functions.md index b5b09709b..b5ad5955f 100644 --- a/example_versioned_docs/version-latest/15-variadic-functions.md +++ b/example_versioned_docs/version-latest/15-variadic-functions.md @@ -11,11 +11,11 @@ keywords: [Wing language, variadic] Variadic functions can be called with any number of trailing arguments. ```js playground example title="main.w" -// Function that will take an arbitrary number of ints as arguments. +// Function that will take an arbitrary number of numbers as arguments. let plus = (...numbers: Array) => { let var value = 0; - for number in numbers{ + for number in numbers { value = value + number; } From 51c3f10b9fb8cb748a77582f73af3efe8cf5b7e7 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Wed, 11 Sep 2024 10:17:17 +0100 Subject: [PATCH 55/58] Update example_versioned_docs/version-latest/16-closures.md Co-authored-by: Chris Rybicki --- example_versioned_docs/version-latest/16-closures.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/16-closures.md b/example_versioned_docs/version-latest/16-closures.md index ba63c9337..655bde4f4 100644 --- a/example_versioned_docs/version-latest/16-closures.md +++ b/example_versioned_docs/version-latest/16-closures.md @@ -7,7 +7,7 @@ description: Closures with Wing keywords: [Wing language, variadic] --- -Closures are functions that captures variables from its surrounding lexical scope, allowing those variables to persist even after the function is executed outside its original context +[Closures](https://en.wikipedia.org/wiki/Closure_(computer_programming)) are functions that captures variables from its surrounding lexical scope, allowing those variables to persist even after the function is executed outside its original context. ```js playground example title="main.w" From 7c553569c75ac6edd731997650684f4e4360272e Mon Sep 17 00:00:00 2001 From: David Boyne Date: Wed, 11 Sep 2024 10:19:31 +0100 Subject: [PATCH 56/58] fixing example --- example_versioned_docs/version-latest/07-while.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/07-while.md b/example_versioned_docs/version-latest/07-while.md index 576a36e63..e0c09c0ef 100644 --- a/example_versioned_docs/version-latest/07-while.md +++ b/example_versioned_docs/version-latest/07-while.md @@ -12,7 +12,7 @@ While loops repeatedly check a condition and run a block of code until the condi ```js playground title="main.w" let var i = 0; -whilei < 2 { +while i < 2 { log("while {i}"); i = i + 1; } From 8557b11fba53c8798f6d865160c70b8cacd4535f Mon Sep 17 00:00:00 2001 From: David Boyne Date: Wed, 11 Sep 2024 10:25:16 +0100 Subject: [PATCH 57/58] added images --- example_versioned_docs/version-latest/01-introduction.md | 1 + example_versioned_docs/version-latest/02-hello-world.md | 1 + example_versioned_docs/version-latest/03-values.md | 1 + example_versioned_docs/version-latest/04-variables.md | 3 ++- example_versioned_docs/version-latest/05-for.md | 1 + example_versioned_docs/version-latest/06-ifelse.md | 1 + example_versioned_docs/version-latest/07-while.md | 1 + example_versioned_docs/version-latest/08-optionality.md | 1 + example_versioned_docs/version-latest/09-arrays.md | 1 + example_versioned_docs/version-latest/10-maps.md | 1 + example_versioned_docs/version-latest/11-sets.md | 1 + example_versioned_docs/version-latest/12-structs.md | 1 + .../version-latest/13-trailing-struct-parameters.md | 1 + example_versioned_docs/version-latest/14-async-functions.md | 1 + example_versioned_docs/version-latest/14-functions.md | 1 + example_versioned_docs/version-latest/15-variadic-functions.md | 1 + example_versioned_docs/version-latest/16-closures.md | 1 + example_versioned_docs/version-latest/17-recursion.md | 1 + example_versioned_docs/version-latest/18-methods.md | 1 + example_versioned_docs/version-latest/19-interfaces.md | 1 + example_versioned_docs/version-latest/20-sleep.md | 1 + example_versioned_docs/version-latest/21-string-functions.md | 1 + example_versioned_docs/version-latest/22-regex.md | 1 + example_versioned_docs/version-latest/23-Json.md | 1 + example_versioned_docs/version-latest/24-time.md | 1 + example_versioned_docs/version-latest/25-random.md | 1 + example_versioned_docs/version-latest/26-number-parsing.md | 1 + example_versioned_docs/version-latest/27-url-parsing.md | 1 + example_versioned_docs/version-latest/28-sha256.md | 1 + example_versioned_docs/version-latest/29-base64-encoding.md | 1 + .../version-latest/30-reading-writing-files.md | 1 + example_versioned_docs/version-latest/31-directories.md | 1 + example_versioned_docs/version-latest/32-testing.md | 1 + example_versioned_docs/version-latest/33-http-client.md | 1 + example_versioned_docs/version-latest/34-http-server.md | 1 + example_versioned_docs/version-latest/35-exec-processes.md | 1 + 36 files changed, 37 insertions(+), 1 deletion(-) diff --git a/example_versioned_docs/version-latest/01-introduction.md b/example_versioned_docs/version-latest/01-introduction.md index 8b17e8012..9016898f1 100644 --- a/example_versioned_docs/version-latest/01-introduction.md +++ b/example_versioned_docs/version-latest/01-introduction.md @@ -5,6 +5,7 @@ slug: / sidebar_label: Introduction description: Hands-on introduction to Wing using annotated code keywords: [Wing language, api] +image: /img/wing-by-example.png --- diff --git a/example_versioned_docs/version-latest/02-hello-world.md b/example_versioned_docs/version-latest/02-hello-world.md index d2402a8de..d55b358bd 100644 --- a/example_versioned_docs/version-latest/02-hello-world.md +++ b/example_versioned_docs/version-latest/02-hello-world.md @@ -5,6 +5,7 @@ slug: /hello-world sidebar_label: 1. Hello world description: Hello world wing example keywords: [Wing language, example] +image: /img/wing-by-example.png --- # Hello world diff --git a/example_versioned_docs/version-latest/03-values.md b/example_versioned_docs/version-latest/03-values.md index 4e9d10d3e..71006c632 100644 --- a/example_versioned_docs/version-latest/03-values.md +++ b/example_versioned_docs/version-latest/03-values.md @@ -5,6 +5,7 @@ slug: /primitive-values sidebar_label: 2. Primitive values description: Hello world wing example keywords: [Wing language, example, primitives, values] +image: /img/wing-by-example.png --- Wing has primitive types including strings, integers, floats, booleans, etc. Here are a few basic examples. diff --git a/example_versioned_docs/version-latest/04-variables.md b/example_versioned_docs/version-latest/04-variables.md index 79fd6d8b9..71060ef2b 100644 --- a/example_versioned_docs/version-latest/04-variables.md +++ b/example_versioned_docs/version-latest/04-variables.md @@ -5,13 +5,14 @@ slug: /Variables sidebar_label: 4. Variables description: Using variables with Wing keywords: [Wing language, example] +image: /img/wing-by-example.png --- Variables are declared with the `let` keyword. The type of most variables can be inferred automatically, but you can also add an explicit type annotation if needed. By default, Wing doesn't let you reassign to variables, unless you add the `var` modifier. See [this blog post](https://www.winglang.io/blog/2023/02/02/good-cognitive-friction) for more details. -```js title="main.w" +```js title="main.w"p // var delcares a varaible. Wing infers the type let a = "initial"; diff --git a/example_versioned_docs/version-latest/05-for.md b/example_versioned_docs/version-latest/05-for.md index 041f8d85d..20bd993d3 100644 --- a/example_versioned_docs/version-latest/05-for.md +++ b/example_versioned_docs/version-latest/05-for.md @@ -5,6 +5,7 @@ slug: /for sidebar_label: 5. For description: Using for loops with Wing keywords: [Wing language, example] +image: /img/wing-by-example.png --- Wing supports looping over collections with `for..in` statements. diff --git a/example_versioned_docs/version-latest/06-ifelse.md b/example_versioned_docs/version-latest/06-ifelse.md index 6f1d99218..7c3dbe87f 100644 --- a/example_versioned_docs/version-latest/06-ifelse.md +++ b/example_versioned_docs/version-latest/06-ifelse.md @@ -5,6 +5,7 @@ slug: /if-else sidebar_label: 6. If/Else description: Using if else with Wing keywords: [Wing language, example] +image: /img/wing-by-example.png --- Flow control can be done with if/else statements. The `if` statement is optionally followed by any number of `else if` clauses and a final `else` clause. diff --git a/example_versioned_docs/version-latest/07-while.md b/example_versioned_docs/version-latest/07-while.md index e0c09c0ef..dd733e5a4 100644 --- a/example_versioned_docs/version-latest/07-while.md +++ b/example_versioned_docs/version-latest/07-while.md @@ -5,6 +5,7 @@ slug: /while sidebar_label: 7. While description: Using while statements with Wing keywords: [Wing language, example] +image: /img/wing-by-example.png --- While loops repeatedly check a condition and run a block of code until the condition is `false`. diff --git a/example_versioned_docs/version-latest/08-optionality.md b/example_versioned_docs/version-latest/08-optionality.md index 10ecbeddf..a7dcc8fb9 100644 --- a/example_versioned_docs/version-latest/08-optionality.md +++ b/example_versioned_docs/version-latest/08-optionality.md @@ -5,6 +5,7 @@ slug: /optionality sidebar_label: 8. Optionality description: Using while statements with Wing keywords: [Wing language, example] +image: /img/wing-by-example.png --- Nullity is a primary source of bugs in software. Being able to guarantee that a value will never be null makes it easier to write safe code without constantly having to take nullity into account. diff --git a/example_versioned_docs/version-latest/09-arrays.md b/example_versioned_docs/version-latest/09-arrays.md index 24161109b..740768dd5 100644 --- a/example_versioned_docs/version-latest/09-arrays.md +++ b/example_versioned_docs/version-latest/09-arrays.md @@ -5,6 +5,7 @@ slug: /arrays sidebar_label: 9. Arrays description: Using arrays with Wing keywords: [Wing language, example] +image: /img/wing-by-example.png --- Arrays are dynamically sized in Wing and are created with the [] syntax. diff --git a/example_versioned_docs/version-latest/10-maps.md b/example_versioned_docs/version-latest/10-maps.md index 707c5bf77..d5e6332c4 100644 --- a/example_versioned_docs/version-latest/10-maps.md +++ b/example_versioned_docs/version-latest/10-maps.md @@ -5,6 +5,7 @@ slug: /maps sidebar_label: 10. Maps description: Using maps with Wing keywords: [Wing language, example] +image: /img/wing-by-example.png --- Maps are key-value data structures that let you associate strings with any kinds of other values. diff --git a/example_versioned_docs/version-latest/11-sets.md b/example_versioned_docs/version-latest/11-sets.md index 3d11eb0e7..5caad2217 100644 --- a/example_versioned_docs/version-latest/11-sets.md +++ b/example_versioned_docs/version-latest/11-sets.md @@ -5,6 +5,7 @@ slug: /sets sidebar_label: 11. Sets description: Using sets with Wing keywords: [Wing language, example] +image: /img/wing-by-example.png --- diff --git a/example_versioned_docs/version-latest/12-structs.md b/example_versioned_docs/version-latest/12-structs.md index 70d98a8f7..e5fc30074 100644 --- a/example_versioned_docs/version-latest/12-structs.md +++ b/example_versioned_docs/version-latest/12-structs.md @@ -5,6 +5,7 @@ slug: /structs sidebar_label: 12. Structs description: Using arrays with Wing keywords: [Wing language, example] +image: /img/wing-by-example.png --- Structs are custom data types you can define to store structured information. They're loosely modeled after typed JSON literals in JavaScript. diff --git a/example_versioned_docs/version-latest/13-trailing-struct-parameters.md b/example_versioned_docs/version-latest/13-trailing-struct-parameters.md index 41591845c..6c3db6f5c 100644 --- a/example_versioned_docs/version-latest/13-trailing-struct-parameters.md +++ b/example_versioned_docs/version-latest/13-trailing-struct-parameters.md @@ -5,6 +5,7 @@ slug: /trailing-structs-parameters sidebar_label: 13. Trailing struct parameters description: Passing fields directly to a function keywords: [Wing language, example] +image: /img/wing-by-example.png --- If the last parameter of a function is a struct, then you can pass its fields directly. diff --git a/example_versioned_docs/version-latest/14-async-functions.md b/example_versioned_docs/version-latest/14-async-functions.md index 99d750bc5..0a89b7bc5 100644 --- a/example_versioned_docs/version-latest/14-async-functions.md +++ b/example_versioned_docs/version-latest/14-async-functions.md @@ -5,6 +5,7 @@ slug: /inflight-functions sidebar_label: 14. Async inflight functions description: Using functions with Wing keywords: [Wing language, example] +image: /img/wing-by-example.png --- Wing supports two function types, [preflight and inflight](/docs/concepts/inflights). diff --git a/example_versioned_docs/version-latest/14-functions.md b/example_versioned_docs/version-latest/14-functions.md index e979177d8..efc636901 100644 --- a/example_versioned_docs/version-latest/14-functions.md +++ b/example_versioned_docs/version-latest/14-functions.md @@ -5,6 +5,7 @@ slug: /functions sidebar_label: 14. Functions description: Using functions with Wing keywords: [Wing language, example] +image: /img/wing-by-example.png --- Wing supports two function types [preflight and inflight](/docs/concepts/inflights). diff --git a/example_versioned_docs/version-latest/15-variadic-functions.md b/example_versioned_docs/version-latest/15-variadic-functions.md index b5ad5955f..f4e6a51f5 100644 --- a/example_versioned_docs/version-latest/15-variadic-functions.md +++ b/example_versioned_docs/version-latest/15-variadic-functions.md @@ -5,6 +5,7 @@ slug: /variadic-functions sidebar_label: 15. Variadic Functions description: Using variadic functions with Wing keywords: [Wing language, variadic] +image: /img/wing-by-example.png --- diff --git a/example_versioned_docs/version-latest/16-closures.md b/example_versioned_docs/version-latest/16-closures.md index 655bde4f4..962add019 100644 --- a/example_versioned_docs/version-latest/16-closures.md +++ b/example_versioned_docs/version-latest/16-closures.md @@ -5,6 +5,7 @@ slug: /closures sidebar_label: 16. Closures description: Closures with Wing keywords: [Wing language, variadic] +image: /img/wing-by-example.png --- [Closures](https://en.wikipedia.org/wiki/Closure_(computer_programming)) are functions that captures variables from its surrounding lexical scope, allowing those variables to persist even after the function is executed outside its original context. diff --git a/example_versioned_docs/version-latest/17-recursion.md b/example_versioned_docs/version-latest/17-recursion.md index fee43024e..9e9733009 100644 --- a/example_versioned_docs/version-latest/17-recursion.md +++ b/example_versioned_docs/version-latest/17-recursion.md @@ -5,6 +5,7 @@ slug: /recursion sidebar_label: 17. Recursion description: Recursion with Wing keywords: [Wing language, variadic] +image: /img/wing-by-example.png --- ```js playground example title="main.w" diff --git a/example_versioned_docs/version-latest/18-methods.md b/example_versioned_docs/version-latest/18-methods.md index ccf4aec75..134ad2aff 100644 --- a/example_versioned_docs/version-latest/18-methods.md +++ b/example_versioned_docs/version-latest/18-methods.md @@ -5,6 +5,7 @@ slug: /methods sidebar_label: 18. Methods description: Methods with Wing keywords: [Wing language, variadic] +image: /img/wing-by-example.png --- ```js playground example title="main.w" diff --git a/example_versioned_docs/version-latest/19-interfaces.md b/example_versioned_docs/version-latest/19-interfaces.md index 5787432be..aa160e8f3 100644 --- a/example_versioned_docs/version-latest/19-interfaces.md +++ b/example_versioned_docs/version-latest/19-interfaces.md @@ -5,6 +5,7 @@ slug: /interfaces sidebar_label: 19. Interfaces description: Interfaces with Wing keywords: [Wing language, interfaces] +image: /img/wing-by-example.png --- ```js playground example title="main.w" diff --git a/example_versioned_docs/version-latest/20-sleep.md b/example_versioned_docs/version-latest/20-sleep.md index e655d7cda..a2e67d745 100644 --- a/example_versioned_docs/version-latest/20-sleep.md +++ b/example_versioned_docs/version-latest/20-sleep.md @@ -5,6 +5,7 @@ slug: /sleep sidebar_label: 20. Sleep description: Suspends execution for a given duration. keywords: [Wing language, sleep] +image: /img/wing-by-example.png --- `util.sleep` is an [inflight](/docs/concepts/inflights) api. diff --git a/example_versioned_docs/version-latest/21-string-functions.md b/example_versioned_docs/version-latest/21-string-functions.md index 0b836bd3d..d10262d4f 100644 --- a/example_versioned_docs/version-latest/21-string-functions.md +++ b/example_versioned_docs/version-latest/21-string-functions.md @@ -5,6 +5,7 @@ slug: /string-functions sidebar_label: 21. String functions description: Functions for string values in Wing keywords: [Wing language, string, functions] +image: /img/wing-by-example.png --- Wing provides many useful [string-related functions](/docs/api/standard-library/std/string#string-). Here are some examples to give you a sense of the usage. diff --git a/example_versioned_docs/version-latest/22-regex.md b/example_versioned_docs/version-latest/22-regex.md index 68b873081..e13722c96 100644 --- a/example_versioned_docs/version-latest/22-regex.md +++ b/example_versioned_docs/version-latest/22-regex.md @@ -5,6 +5,7 @@ slug: /regex sidebar_label: 22. Regular expressions description: Functions for string values in Wing keywords: [Wing language, string, functions] +image: /img/wing-by-example.png --- Wing offers built-in support for regular expressions. Here are some examples of common regexp-related tasks in Wing. diff --git a/example_versioned_docs/version-latest/23-Json.md b/example_versioned_docs/version-latest/23-Json.md index 936d8207e..af0fa482e 100644 --- a/example_versioned_docs/version-latest/23-Json.md +++ b/example_versioned_docs/version-latest/23-Json.md @@ -5,6 +5,7 @@ slug: /json sidebar_label: 23. Json description: Create Json values in Wing keywords: [Wing language, json] +image: /img/wing-by-example.png --- Wing has a dedicated type named `Json` for representing [JSON](https://www.json.org/json-en.html). A `Json` value can be an object, but it can also be an array, string, boolean, number, or null. diff --git a/example_versioned_docs/version-latest/24-time.md b/example_versioned_docs/version-latest/24-time.md index af1a8c2dc..4c269196f 100644 --- a/example_versioned_docs/version-latest/24-time.md +++ b/example_versioned_docs/version-latest/24-time.md @@ -5,6 +5,7 @@ slug: /time sidebar_label: 24. Time description: Create time/date values in Wing keywords: [Wing language, time, date] +image: /img/wing-by-example.png --- ```js playground example title="main.w" diff --git a/example_versioned_docs/version-latest/25-random.md b/example_versioned_docs/version-latest/25-random.md index 87e997b59..46de2a7cd 100644 --- a/example_versioned_docs/version-latest/25-random.md +++ b/example_versioned_docs/version-latest/25-random.md @@ -5,6 +5,7 @@ slug: /random sidebar_label: 25. Random description: Create random values in Wing keywords: [Wing language, random] +image: /img/wing-by-example.png --- Using the [math standard library](/docs/api/standard-library/math/api-reference) you can generate random numbers. diff --git a/example_versioned_docs/version-latest/26-number-parsing.md b/example_versioned_docs/version-latest/26-number-parsing.md index 2b0501d36..0b2389a67 100644 --- a/example_versioned_docs/version-latest/26-number-parsing.md +++ b/example_versioned_docs/version-latest/26-number-parsing.md @@ -5,6 +5,7 @@ slug: /number-parsing sidebar_label: 26. Number Parsing description: Parse values into numbers keywords: [Wing language, random] +image: /img/wing-by-example.png --- ```js playground example title="main.w" diff --git a/example_versioned_docs/version-latest/27-url-parsing.md b/example_versioned_docs/version-latest/27-url-parsing.md index c9c118ad4..07ac0fb11 100644 --- a/example_versioned_docs/version-latest/27-url-parsing.md +++ b/example_versioned_docs/version-latest/27-url-parsing.md @@ -5,6 +5,7 @@ slug: /url-parsing sidebar_label: 27. URL parsing description: Parse urls in Wing keywords: [Wing language, URL] +image: /img/wing-by-example.png --- Parse urls using the http module, works with inflight closures. diff --git a/example_versioned_docs/version-latest/28-sha256.md b/example_versioned_docs/version-latest/28-sha256.md index 1dd9194eb..a9f0a25dd 100644 --- a/example_versioned_docs/version-latest/28-sha256.md +++ b/example_versioned_docs/version-latest/28-sha256.md @@ -5,6 +5,7 @@ slug: /sha256 sidebar_label: 28. SHA256 Hashes description: Hash values in Wing with SHA256 keywords: [Wing language, Hash, SHA256] +image: /img/wing-by-example.png --- ```js playground example title="main.w" diff --git a/example_versioned_docs/version-latest/29-base64-encoding.md b/example_versioned_docs/version-latest/29-base64-encoding.md index 4eaaa9597..43ee33032 100644 --- a/example_versioned_docs/version-latest/29-base64-encoding.md +++ b/example_versioned_docs/version-latest/29-base64-encoding.md @@ -5,6 +5,7 @@ slug: /base64-encoding sidebar_label: 29. Base64 Encoding description: Encode and decode Base64 values keywords: [Wing language, Base64] +image: /img/wing-by-example.png --- ```js playground example title="main.w" diff --git a/example_versioned_docs/version-latest/30-reading-writing-files.md b/example_versioned_docs/version-latest/30-reading-writing-files.md index b8da32cbc..6687a7b0e 100644 --- a/example_versioned_docs/version-latest/30-reading-writing-files.md +++ b/example_versioned_docs/version-latest/30-reading-writing-files.md @@ -5,6 +5,7 @@ slug: /reading-and-writing-files sidebar_label: 30. Reading and writing files description: Reading and writing files with Wing keywords: [Wing language, Reading files, Writing files] +image: /img/wing-by-example.png --- ```js playground example title="main.w" diff --git a/example_versioned_docs/version-latest/31-directories.md b/example_versioned_docs/version-latest/31-directories.md index f6a795a10..cae044639 100644 --- a/example_versioned_docs/version-latest/31-directories.md +++ b/example_versioned_docs/version-latest/31-directories.md @@ -5,6 +5,7 @@ slug: /directories sidebar_label: 31. Directories description: Directories keywords: [Wing language, Directories] +image: /img/wing-by-example.png --- Use the `fs` ("filesystem") module to make, read, check, remove directories. diff --git a/example_versioned_docs/version-latest/32-testing.md b/example_versioned_docs/version-latest/32-testing.md index d53369d97..1403cb05a 100644 --- a/example_versioned_docs/version-latest/32-testing.md +++ b/example_versioned_docs/version-latest/32-testing.md @@ -5,6 +5,7 @@ slug: /testing sidebar_label: 32. Testing description: Directories keywords: [Wing language, Directories] +image: /img/wing-by-example.png --- Wing incorporates a [lightweight testing framework](/docs/concepts/tests), which is built around the `wing test` command and the `test` keyword. diff --git a/example_versioned_docs/version-latest/33-http-client.md b/example_versioned_docs/version-latest/33-http-client.md index aaa700139..c14ef7589 100644 --- a/example_versioned_docs/version-latest/33-http-client.md +++ b/example_versioned_docs/version-latest/33-http-client.md @@ -5,6 +5,7 @@ slug: /http-client sidebar_label: 33. HTTP Client description: Directories keywords: [Wing language, HTTP] +image: /img/wing-by-example.png --- The Wing standard library comes with [HTTP support](/docs/api/standard-library/http/api-reference). diff --git a/example_versioned_docs/version-latest/34-http-server.md b/example_versioned_docs/version-latest/34-http-server.md index 25557d53a..fda1415f6 100644 --- a/example_versioned_docs/version-latest/34-http-server.md +++ b/example_versioned_docs/version-latest/34-http-server.md @@ -5,6 +5,7 @@ slug: /http-server sidebar_label: 33. HTTP Server description: Directories keywords: [Wing language, HTTP] +image: /img/wing-by-example.png --- You can create HTTP servers using the [cloud.Api](/docs/api/standard-library/cloud/api) standard library. diff --git a/example_versioned_docs/version-latest/35-exec-processes.md b/example_versioned_docs/version-latest/35-exec-processes.md index ea6d9bedb..39fd3ab43 100644 --- a/example_versioned_docs/version-latest/35-exec-processes.md +++ b/example_versioned_docs/version-latest/35-exec-processes.md @@ -5,6 +5,7 @@ slug: /exec-processed sidebar_label: 35. Exec processes description: Exec'ing Processes keywords: [Wing language, HTTP] +image: /img/wing-by-example.png --- ```js playground example title="main.w" From b9927f2e0a1bd64acfb2d5dd1761af0d98c91cbe Mon Sep 17 00:00:00 2001 From: David Boyne Date: Wed, 11 Sep 2024 10:26:20 +0100 Subject: [PATCH 58/58] fix(docs): fixed bug with example and added images to all examples --- static/img/wing-by-example.png | Bin 0 -> 147219 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 static/img/wing-by-example.png diff --git a/static/img/wing-by-example.png b/static/img/wing-by-example.png new file mode 100644 index 0000000000000000000000000000000000000000..476219bc147a553447e8f774a8f89f970c2c1921 GIT binary patch literal 147219 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
  • D8iSsT>(YM3JUTP z$uMr&h+4c^S9w4PK`{jWomgguG&YOtw?_!PeUd!*;vfG}A!w#9!qhm-!VRIkl{DIl zpr5AXJ*Azq%vZe=!8WsX!9=R))Fjc6Yr2wxEF&@SBBCtKb4ue5Bk88OtHsRbF&(H~E0|dh#xw`$@_`S}{ zdwAafu<*b;f2|OGzt&pso2=!8T9RE)!*|2G$buq1!}mAbYSgDk(@`(}sS?Q%>5o~Y zb0y0lF>WM?j-frIFbP*s@S`s0-(62_j;N3`ZLcmT;(8EYt3Lczl4m9dEY&VMJ9WH8 z)DjC39|za%QEE`!bQlPwhTDh5Rh8Ts-S>mWi!XQpMMcIDM`4OOY{`$*H+6zTZpABE z{LOwL!5q20D1S53TT?8jdcRe+_66t7`)@B}g=?sCceE)_r!4#H*X%SGJQ%2jXd=oV z{qkTiTWXo}G4b`!x_xWq>aP^~*Y#7eeJdAWHQ6c`VoThXp85vN?A=w?!6p>Nna9`8 zVOj(3!<3SoZ>*mlj31(CU0y-!jAa;8sycv*ruQyUdtVXP8E&VoAZF7$zAGVWM4c z2XeDONL2?2z7lO3Qk|g%EztO^p?CpxYs1ZqqKgMOk~dF)_iq;9rtx%f((LJf}AB`7&r`G{i}hteFm`{HB@T z{kDcED67d6Ynx6>jeJXLXl@PM$*s@to*N0j{Z$4KIn;hRw(4gK&#f}}$`W>J{>lGj za&o0f9NY%Tl%GrhXtj?(n}BlX+5g9Aba45rf_F)lMYk30iHJh^7@%f?$P@VVr@R0Q zsIvMLSGhA^duK}$ZOEK(+(dQJ8gNWU!l@tGSIm~d@`T6*OMr?x)kCoH4tYZI^~Blu zSt}ZMOg8c7yhi5bPUBi(N~3k|9W$Gn0R%Nr`W2ZGd=!%f z)-ZGwX#RGxKAe@7yv#vt?qY}<4vAJBug&}&I)R+E?sV}uUIC~n?cuy}1Xc2_+yT~G^7$6@^ zfcuO8wMCrI9Fj11qm&_50HumSi`7(&t5PXZ`#AsKuK5AU1vJlolRDRg5A42TWk5*v zDO$O`()xjh^}f>}wI_%c###Kmfo!jwwbqMH0gBL~)*gHW)j1M_C>DE->&D_ne^}oN zql|->(Y;=TRiapvqL$EUn{|uYc`z2$*lqXbgGfuZhW^wq18R$^7mrh%ndS)hid2`& z;+Xc?E4TV3C%D_of!F$Ga2O1IA18(qUxbVYC}jtdD!oO8Uw%#Y<;F>cG`t9D?!wDY zAb3D$U7%N(oa1wBO*-N9rFpvGW~1Ho?02K3R<<#!2e0tq)$%`0RPV`hp_;x`oPPSo z@Iv>>Xq;d>WDHPw*Tu2fKDp2v0UFrPJ&*JB3GqzyE2At0Pty1SE*p`dZgxC5S@IM@ z7>J*NNLN3cq7-*@wIu0iCyv-3t#bDbHQ?CaX<;}Uj7%mqEKk^HBXsjqy6Zrb!hmC# zoEQ)2zr4&2*?VJg#z_g{3oqEl2o^x=HNSF#6Pn>-AXlSPgEfbj&dE8PfY*nvGC%eAV-y!lodHe!HbBj_PgIFu$+2$I?jKs)Sl%CJ8zBC{W`Er3<5mlUV)1!1N^1 zng4%++qatvIr)IdCr@3SU;F&?VP_U6$~Y~-&t}ts>KsUWY0bWmP$-|aWZFa>`Z#`Sz`I4d`nrcll#Llr%8`iUgF^}4Sb0(q%m((@&wKD{#1 zdz{V<%>KhFnkK!HF+n!aw0U2GZjjcUoHL&+eM>nQ>3YFkFd2D;hd&`pn~z_;QKDMh7Ur?dRvmB;A2Icn2k00Hks4ryEH9~W;<3PFE?ve|{Ng`50h zmYILAB1d|Vy*SwE{RVUiz(jck8b7j%dotGBqc&@D!AY}z;!Ananw|46X(!u<17Rmz zUY0YYIq_fcIW-~Jj+=cBVyQ3<0d!LJRQ*edUfJ?)sV=4P;Zl{pcQMD--Xn@;P)5iH7w@bufs%bvHnx2I_S%_3_MCT~%1DP98~^rg zw3Fl!U(n9v&L5mvmA@b5Dc!hzJ6>(TTQ7?7uaB`A` zljpl*!Sz#ZI@Du@_2V_9vHjM-{hVp4cx^*2O9F5o8~b} zo|J*iT2FhMt=O$?ngchc+k$bjR~2~x=e$cw_Dm+!0^8F3KVNrpH=PeZNDn6c4SM(?$g^_ouWr|u(Ms`}8DJ;qm$JXA)S zGv3flYjiLF2l5Husg8{lH_ZO{1$Ld_}7k!K63n*jk-s;{r)& z16q|b5&rUuEPV9{hcGgFlc568ek*N(HQ6qs*BooM$d)y-&uV~>ZrzV#1#q6Rw*Bph zd8`e!3)|i)AT>@1{FXzOKd_%_KtoZ0NszqgR_?^h0s{i4|4y328Bg`z7Uwe@t#x%Z z!@+97Du7WUwmYP>5uJ8%2Nu@`2_#vdi-FvwJdmi1PN&toeK56ys-i?Pqj&Z;c2?}y zx|{EuzTqWhJ6YvZ1f=rBc8S6aY_fv>tQFZlU{}beoGgMOu~}1mx8Iqt3KudLsVdEV z+wNyrlJP}Sm|~|%tlqy)nwHquDG!U3SBZn~jxnDW?%-!(;RCb+QCLok9O~C-rwnm& zhD^XUogDSbMD%wh)t(;OCpBklcOOqp{zGI0n8R82kU4_*>v}ka!ln9|SH20zWM2NG z79?qoRoKH)KG+NOcoaj_+n>!Yj*8F%Wm_X}uqN>N!-0HsXjHqL`4(cB9Z2EG9ZB$C zx1ue8q5xkA=oO@$c6=F#JM>6@A*h32DdcdVv<>5N>YCAJX!)25S=|0Q?f;^dp<`+F zWD63UrA>mJRn=#G#p2I>=Aw`9(<*N5eKMe zGh}iil-HZpXd3Vw0X|MaB6Ohz7Xt)G98?D!l)>dDKsKXetSaL-kC_GKLB>e(Psw^9 z4UBXo=5#Tb)g=9t1Wlq3t{o=`7oAO-eSid^=-d**kKl$Qq#}MPhh=j{#b&*Hebez( z8O1HUhBv9k_TQfm(VT@2Z5W|4%XjpRGCRK38_(Y}dyVZax%qT&?4Mx#aIQVm@RDDP zJ6yEOMdIWkT#d9gsuv*?@*D(CMy~gzq9Kk?zjMGc)lC=FZ#UmO(XzHV>>W?&uIE1iIEub8``<_MR&62nLm0}xRpX` zC>17Q58bfzMc~Gd4xfYo=UJykzd_2-UgMDTuP`n4+q;EtQja+mUPoBAg=1#X4lVZQ z08S9Vy6fOllbK{`iJ_We-m9nP%Xi`cA@ly(5hvB@O{JirvHf{>CY2FW_V00H21xr3 zTv$l4T3gr|TdyZL85lm^m`KH)t1HkVD6A|Li&BL+IsVw0ElCl-0z}S@Qz&+FK;ECYwxpBlL5j>&ukO9UIB~l>RgU-YE29yqM#IY~&UG4$_{PqY8Bd?O`8{&7HN#C^ zN+&=JfpVBFJMx`F{t$U`_$nrh)iny0nO`cIM!2JH0(Ovb5d+}x-IveYvc1*apU}Jn)mffEW)n9(zN;% zIir63ySJT2&=;7?#s|l`j=MrdaC2Z0WCA}{#Q^;jtV+ ztwE~)+F`g?&QMlHC@;(Yeu;+f4&xD~u4GK;|C9mhYt+cyz2RvWgH$XTVFMj~GlnHE zzUAt~s~kKWB}zLy&=&ZyDIE~A9UUj@e>;%!eSS{tmO>>z<+0_5nd7l6tkglI^rsnyO(K1G-Ue~S!gINcZ&aK#HaswgB?mUg_B ziRpdSl#HK%N*rm4l`B|no`kOdo;w?A;Y%33nS7(KK$2fdM@K6V zog>V9*I1vsv$V9;)Nac zV83R+!&ldnAKs6DNqO3OVaWP5-4XhWo!LPqlN0#>L<9{?h;a1d&^RD_IWz|4bo^ zN%q+42vTiM5m3o~t_4kMl`k}i>3MutrV>m09nuSg+{&wN=IaUjO23G8K%4)j2Td*j zq0pv^o+GBpnCKF37q=lCqNL}Vri(HPGrAYnw~U*$R?6>Q1hcTRx@#BTlPp)w8UB$ICw>F7F#>UNQXU&u7ALKwk!FPBs$rU^001P=|Dojr zuA8=ffcNM|R|3_!XPm%5V>f7E1$8wsc@xmV4-sVSTJ=ba_DRZeI^vs$I*+Dg_?mfT1qVI4R zJK&^KV_V-mWQ2_YrcYf>IrL>&~Je=|d~kNzbl!5=2h;ca?u>ncrcRH^R3-?P{(G zf?>M*T*g>z#TawN?5Lu^TvqN!v_ZrcV0$}B$VuRCj3)sJPZMt=fgeeosdjf_S<7ql z&ZyniA+G|!T*y8v+}`rmrB|mUA`=gLTm8U=45rf ztIe+oE~vl{MdbwWXDUEtRQ=SZOptY;;N}N5rw8o#4jMH9XC5F$g8ZKDP-r^u5D6f z__Ou-(zaewJOho}B0pe40tScc)$d>K3RCcjq-HvC?`nS9;$JL>+!pa^MCTV!2oC#E zqf~WXK;05xi7jz1m{U}?HJ}qF{JAC;uY%02LUf_|KTyO-U$X0L)(>3RnUH%YM1tCQ zSO9rf9aWTCJvswK(8G=6jWBkE3pVFe0BCIhi~ZSl?R3hQZ0LQ8YuI)wXia@;O?hhV zm#+9|sU9|2!ctW*k+T+CuoTF~>rfL`VB-EIF$pk$I>fUEQtDS;k!&;x@&N+1iA6V( z8MJLDXIAm0**aAmlhj~Ff{{C72V*222pav|+~uFm0s{f@{Ipsqir_f-oUxg)XSbA& z+IR#b##%Aerl)k|gD`Nu(-mwxv~1Y}rQ#75?#4qlnhZ6gab`}D+1%p~4$TN^89$=_ z)M7qso!z}o7dMbd#g~$tB~5nz{mDmG>HhJ4CYWL&*j#*%IXMEf%kpN~bc?bj4=BaE zecygN!v!P&t4SDV*Z~rmKYJ>7L{IX5C%cdgPibZG4JAn__~#KFNhf|5JX%Zn#ZDgi zCY#0SNtvO(I0sLaGD+dF>Vi=lM^2UdHZtm(6<@z*XYM9;Ri65Z_~~mT>S>5#-OoAl zMqC))<5H07OjcV-eT)1a((9kF>6@drHtS2-ZYt1xz!$YdY2Rl$s}GfQYHkFv%f?Xz zC=IaWT%3_RWW4%@KK-dWDHI-#Xvk3FPrhi;*3RZY{WQa!AVLHf*u&Qr>9jAKEKK)y79bp*A{aa&-|9 z#;(NE}>n$%*|z|-{LvIbJ+8)61b$-A*RPfG+V8&o>t|;49#EH* zrI53=6eMP6g&-&04g_DS15^Re$`KtcM)&wgujs4C^v&~DjcRX?(BaJ;W^YJ%x}9y0 z9tVPJ_j|!7kF?OF|C_M@VrVqM+zIz7=SkiaGy%v|Yv0wwzmHT6I`S%8&r=_~B8|Vo zglgj11Jmr|)HT6qwid=Y_w=#jn*_B9vXsvVjU^O4De4B4iw%Ply7e*0zk5{iuSb0N zFcG$+WgR^inEfy6?yvSa{CC}(|FRX~{C{yruimac)VD$Tjn+1JMq}+HWfix**THIV zpgfrJU}1}sUBmq9(L*94J0u8BwOq-Lye#FLk-2eJfM)_xbkhI=u%_lHHB1QBpW=#W z0elX?;dv!_x~~5_10AsAihpN7oPkVS1(Kc)z6*U@^{&PTfT=qa%6@18ke*#A0X8%M zV+K(bpaazO+rhHno%`FIvDS7#l_lir&@cw!tB&g~?pr40TX6UDVT=@^No)tSpt>8g zUBCwq%S=byS(-foFLFL{=!Q_Z>9dDxC&wR$-Bx_(rsCzV(hAnkMeyWoz_^RnU$CV- z){AEd!JxyzklWxerkIqlMw}J8RnUV0!9 zT<30uyy}({)%J-yyQxIpf9Q$+JyF4YC_b`RFleq*D))+NX`aJJGk=qU>(EJ=k=jvU z&#{5KQFnHNC7{^|;UUdfY}sgi6Hf4qk}Y4wUKpSChAq^I)R$$FBPbywitxX9 z-Cmr5vcTk4RIP1i;;|j);LAr6SXkC^0|hz%wB)#dDk~Ac`7u*rN+OE0J*kB-B4ySFqT6XqA-Wu8)B{{V4 z;pBL{ceM_e{bFWN0#!}P*zlvvHmhAbm6B@m^!J{XVLrC&8k=?ls<&`V+k+f|hPv>0 zamAL}SQcDM6m=cG%c*jeR?$WScimI5$Xw`tdme-B$6GQ3L(TX@a*GHyH`UpbUj^5$ zEB^ZSB_ZU;R^Djirdv1ple#qs_U@E`Upn&)V8(j@_Y5gX#0B_28vc1f<`s>LzA!G;=xEP0Wp2q=4goaw(J&)G(xI%OO1 z2<{o+OcYzV)!Fn3*vilddqxX$0i0Ng<>COCDtz8`z2s&n5dNX%ITKLC{+xbPZzF&- zTtV7<^8UR*FX}94E!ZDsOw5r$1*R!13=Yw^iGDXUy=&ky9=mgm~S7SrtPtqt4mQo=l9?Q5FU%rOj9);=>eAH zt6wuI^9(C+9W9QTb@=P^C60}iWIO0mlYdvU8~>99be zj-q~8x;&|T7j6!>HJo29;@@ALNa&hl56t^DP5koD>Ymbd(yV;LT;Sz?pu|F-v@Op| zZj9zqA*L3I@0L?y%+0`_tm{SaLcBQ{Y|@))MN2-AXmy?tWSAN8Pihq|YH{A;1rp<* zm*jY|68!_6!#&!uU+QdP-geCiBUdhDx03{{C{J_UY2;d07jcyZw zlWy5EGCp5{pZ!38*qG#*e-+(Tr(j(eTp*rJ-bl zZGfm+Twx(o`fg(ezI=b9jlXquJR$IluK#3T7J5t<;DjGTa-fSJ;pSvq-bT?1xN==_ z-E};aweSGgCx*IL(Yh*(3bRNpGf9GEuEfMxZB(ZL*%D5GzL0FM}qDKLx)rE|T^VdZt!t#~PLPjfF+1~|brfD)yAy&Z|~bKimNE^mdGVt2p( zlS}`q%H(eB)1hiM(?}bw=boRGJa-6)pyET{rX4(_kTd$tNG~ZVhU?w^Lz#F<5wjg( zQVF*2P+n*IB$I+OmE! zY61JcolB3ktGWB_0cXPBG(fRCq(s{}$2-MHFHf(*mBG4a+O^T$vC+B4>^2h+D!2aB zX4YsP&nb+xNN6)W@*@YI9cAOPYi!dFxL#K7h)2N-(Ej{go2t zac-+rAeR4&vA2$jy6f72hfXOe=@O({IwXfyFz9ZO4(SGw8bDe?QY0nBp+h=`lAZzS z?jGX%aX;_7s!l? zF*dofX;_^WQQIp=`Q*kH&+dDcR4&CFw;WrIr*<+dvvta@0ZV{`bP+Q_F zgB1eQogt1!Ulm}gU9pnR=aIG>)vGk`)wI;LCIjYZ98gq*iSetzAeFm*`y&{5V|Cre zDtmTR&i6I!g@v`#FVP)6ANs&b`p9L`-~&-g?;(&&`Y*mG%RFCR9q%+)F=t{!3h%ml zNrR6%2Laa;u+fs(eWJ(OR>S(uZ0R2x zlz=zsj0MrCbS+oB;ru$Pud(WlIX)t*8dLu)l@#|&io*Jr&&W}8H=7cdEDM#dGg-gQ zzQzf%!+^kCYGO{|x?1>*;C*sS+PHe4jq>(c*Fnq-yk25qjEkLAzgE31BS7u^F7^G>jG$;5e=s0qrC~Y+!mcU|tZF0ati~sq($5UX0AJPW; z09n0UcI5Iu!TE)2;pTv%A}|?Bq(rHKh#W*9`rrqapvQ3TH4_<1Gg*4pH&}L8IKb3Z zmuG7Usa=`_y!+v)k&5a4*)rVT`*jOYMZ2b|n?VW2k(T8Po`+&Zw-;k6X+_bI4;r77 z|JR#|tZoZ+tq6G0bY&m6$7jGBw_O$05K8kPc%Vsr+n$Ott;L)5E=qX^7hS7YY{1E_ zUF>HIawF1(%m*Yh%lmiM?;-8C-4fT^W9nWmVb>%pd|G~i^us}DzHoEUVa4(`L(1a9=K~6^Uj*}SgG@rE4)6yyYN1zYSB@UN zCZO{>Q}s=ojGB97L5+7+l#yMFxuP8~pzp2>K2^4INd$QXxdQ>bJ@G%`@&n4%UHr{l z{P2NdPmFfcr;%Ku?s|M^9%ta^h_JSGr;>AiO(r(XTCu$BCk z+rGZ04d?C=F#FQFcx{Adz|;DIyf7)8>9Rj!>}l%n8tBjEHe}+>;Kl__kFygya>)Yd zU*$CF;PD!26Ar(7`P+Y2gu8O5R!(I*JQ(D7{g?G)7|Vy~NjrnL^LzVJ6^ zwA*Bn^R&3QI9izIJYAfnUX)@sX*UuSUBIz;2gzgc9^B(1AyL^xMnkN+h7?dkA#bjZ zTP#5j3mreSo=>F5khf^oK6FVZhSz+U)|HP+--Pg?FH;svQj#Tcs= zX{E1uI_gS@{k{GK-PChfHe!5MBeKZ5q8ztp_!ansk|i+vH*w+XaP=vKG&%ZyONL#x zqhwK%H#HMe{;OntjP(JgLMe<>WKJBqc7-e}2M^vQmm;xc{->oLvUJWg%_-%jf#w|1 z;G1a$1~ZVlCd1`1X5GAm>$^tiqo!kgQ&9S*`qmV%DGeJw=<$CRPagY_==-Q+F4Rgq(17Dm9n2|7?ap-Iivd(hqor{#YP$1LJb$OvTv77Znh zseDfA4|xnvLp}?!SkI8E#;0Q7z3NDbZ7VW+;)h89DGE zQRIuGaybz%)Q`N~#%q&ChrE4k?L?)`gUZAgQ;U5+NY98@i&#lh#VLLjCB()ErBMe? zdXSn;hIc^Uwv900jA|>aSJL~_=3}-iO4~`sHIhjY3$GbXa}k@5{IV^W>|}WpX!p{~ zeP_f_fn@Cppfab9e``_Mbb(S;v7Hi3gEp*^E=PB0boji-ih%;pnO>*|Bcdd8v?l2J zLDP!ZaOa_}AWA6pJBC*TjZFu)&}3Ddjz3SmD;P10r6QKH4EXl!Hd{B=BTl|ghr!`t zm93EhP_L;1#(e%fEZWVf`1yrDgAf$SSFY5xtQ-YW5+a-^445Q}PPMakrKqJ5`}-Zz zCTCS7Ov~Rx)kVzabe!*~Uj$ElNh-hU!+B1rU>pWk!d2#vXLyaMls{?D(Ofg6 zUD1JZB9C9`oUXg59c*LwRv-i1t7Klu3oM>r8TuEk$&V?~+mJLbA{~z|61&C11-bJ? zK;tn|XffpQX5+>To zlkdOLcWe4GHM$6?7_P^F8h_rgBA-8I=G$XWKPN4edUR^|2Bqnm$}3>7iMsTSX{KlT znqnR#YJay=Ism8XSQ42&QeX*!!@a9|jdww7J}hP+@UFll&xfD&1emfk&|wb+1!kZ( zfm4S_`=Xvn**wRGM^^W+K(60mK#5+5yjXs|Ao&3w4nJ|ASX&q)NTZP6z5KYT&JQf_ zFJzBvnQ|$ z6=aOEQuMSToZAA0k&fcqh^4AI3-q5J_N4^wpWRXj{FeRXlc(#lA#sK!yFoN3hTbUE zCJhpaG)K|qMq?T^rWf7(bAEXeaoFL3<{>pKcv0>OIVV<&)2=9fITA`fbym_Fmu;SO2R;2rgK$~(RXOS^G)JHmP zg;ku1D%**$u^!K8KG^82oC|_ywm!cv;kvudjX{FvL0~pL_0>SaxPm1!5j+%j=uZn>}J6kFG`o*B|$zKoLT z92%D8uqyNpl=DT>dDy^^yBrzc7%s0_fdK@WwVPpsCEoRFjixz_!UNhUh?KD_xx4U# zwssyBdebwsxYJ+n7Maj9@u}hQiSRJrth|%u2@kj$81}oMyE;RWrAp>=7sS3hB`Y)z zt8`{+2_W2RgP-rCbz!U@=HA6F^;q3|DF_8lHn!_k5zfxbj42TbV+u@!ZqYQh&ohMV zdz(%-KsJ4|5FrpwwzB`;v~EzmPW8XBb`qIRg)g1$9obrf*Gn}WbTaM%G@dQjKuEImq7s;Ji#b5jZpOR=(^txh{Jgz>_IrP! z_bnP&XY&pZ(@&AL}20^PPsDC_>gNJ&QDJga#lx_M@_ z^p32$Ydp3k@Tc^q+$dm3*VnHD(lf}1)-X25zGN+45ahv37z651;ip5Z9At)=N3SPt zr9`(oE1el`uS$cqj`&>O=wv?f-alm!o4rBo$>IJOG$n{Z>^7rEf& zD@$#@=uMG6xAR(3<)Y8kiDB`K>B%OjTcIF=`0ow~(c93nmEs9_5Zn&3vf;#e#%3iTtz!ihgQ_2BD!iz==GzZwdAjOq8#0a-${bQKV@zy|WUJ%SBy zZx&+T09&@M1scps$5Yd#O5*XAomj^c34$hB8P_cOhf~`e;`?V;5rxkYjX~eG*~7kx zmmeHV_s(xjc+<%jOS>%ef~PGPeQ5O%2^Vq9gAP6uy}XN$0RRxgyW$zyx{+!Ap(W{x zs^j9wWN#yTwhWIIs9K6>t%rw3A~CB+JS7XBZJnb=kDfKx=~+p{m)(a&k0h*_DQrU zO_rd(#3-kI6_s24>gEa^#WZ$jqd`Fy(Cw>$4=7Lsvg*QPwYsIKU>Gv_zsA8g8)WP|6MMaD8PF^Pw06AK7NEY+4ltZz?m z&yb_pQZvW|Gm{E5u-4*6NjW4+FEa{or1p>527FVVVF^k+Dt!yGV5sL9T2lmDkobOB zosQ<``8I7Y>sEjRQX@r47Eb3>lZCD>^3cl<6pg_Jn{hxQME(I2aFI)Fe3rDZC$1pf zP>{77YUba@E$44?7ZRgR2L+30Dm>vC8E(1r8SD%qN`Gs+m}lPYR41U%%urdQPyDKZ z88h9U`~B}Vc5sa_U9L}Uitleojd|25g1KG&DpS%In`^AD(ISO(J3ZXGtvJwl+NEYD5#(b^41XLu|VSQ|TsD zcPktcW%>iC3?Ez~Skf>AK#fH!Csb!T?Z9Xl6Jt%OX@U%GC{LACI?I_j|B89G7-Plc z+h(|_8n5x%2#4)S?y)RbCl5fV3n8rt(PYN-*$kbuLV-a%S;m7Ad8!CQ>{`hLQ@&uR z5FtKEo9j>=!|?SXrZ&UL`|!3l45Ke$UbkL$YW4W;b|ZU%6ac7ay1d~i)DE46U+gds zbQl_istX6ZC^VqD;@kZp_78m2S6yJt%E33m{ceOCU<|mSWon~AH(GZA3S#fBt7b*} z`;;~HHNqGDw{A~9HKZIOZZAacgWAxLH)Pd6_sOAvd%gZv2#LyYdZDJ6ewDF!b0rd# zaKitR>(^DuN=CMV5Q~OLiE0r(T;k9nIRTNeh~`ZX1TPo9;P+ZcsUQ4&)2W6({YasC za%BYWC*qy>D5!!GdzJ506}^r4UWMoxE4UN~QB1!1GXswb_MlDxWDqy|8!*C_zU>6kH=M}8EZkIzm~2UjtI9gFtvGJ z6oGK$ZIgZtEgCN(jqy=Mcr8BAxl|EKN&3zwQ~^ZH91Pu6RZ&hHM2`%@Jml5I!zbAU zqPa6nhE7D%PnVT#!CLT5o{WpT(so9D;6l{LCS#Of08zP1%=@7NBRVaF7d6@X(!^ys594TFqYNRu=~bp2wUEgS&Q`R?kO$=LT- z^k(`61~Zxf7%#lP;BCJ{5gPV-rL54#;u>!1O1Iu)mA;b(A6`u#b)sm5hMgiMz#|-> zo9;KOcU!QMZTVuVO8gBKudKGJHc_R+VQz}uUF&CqS$Ob#d1=hp2NoO3nPy1eDzfzg zM0(OCjlViB*;&dux_8AJnEv-sAfrqTe5m({oAvkTLs(GX=*xvrgNp6Yz6ow{=|{k` zJh`Sk7ZgkMS)dP{WHYUay%*U$=dpC_3JmPe62Pa|iMbUS_#%;Q{BJP1zEi1)%^q%M;Ic*V}42 zJ!9QnvDyEa+`7R!BkHxNxW~?r=Ki!Xw>8+w37PBdfUoXHW$lG)tJNgCF(|yb?JzUU zeQ-qo?vhXKWWVXWP8)BJrb9X?`t%NlxJV_5lqF^SlUJVD0;4{rG8koQg<-f>>Hy(5JXE-^qxpbH5ow>@_K(vC>!= z$5Y}l$|Qe$0J~)%_hQiwq=S4p)ZF->>|RSy%O{bU)$T4Qp+*{Q{&BVQ%TPE3Lh?_1-U!9PHPe?X~* zZ#bG-qk+MJNMR<5a5|AMLdO@W2CnCPB;Z}hGd$v@3lr2{jIkkh&VnPlkG7T%C{Y~d zCI)W7d}0l<;n70-#r30;PuC2;@bx7K?di2bG@idoJ?cbxlj2X;SDUiFQfWADN`N*EJn%otujMG^LjTIt&dM&@2#pF=XRH)k}vEz-9dmIqi)?Tv%%N$#Xp2 z%njUVHAyC&LD0Sxn>pHHj$e3%cJP{ayo+Z%H@8#Tu>VwiNDk@05JWt-_#m)sqN)V_ z!t*ROV4NoMLjy+>}JOgPb>_q!Jo(%IOv z6)~ND^9w}0%h!tjE|FC&BHIWR%#=;6cM2Q$NFHN{zvm6PaiLhh;uxO`AM_pIh&N58 zFiWK%;^J+@hi;Tr!``-pq41#!%HY+GMh-O?je0szpLgKyPNX5^6R*)N8zYwHYB)6- zn-Wg{;_hla*|$(r1Xp}oTK7yZEtY8VUdzDSzOwGa=&?cu+&&H68N7pO02o$?^}$*j zWp|S)z;|az_4n#!D7Ace?}Zr_5|tHlYn-N2!u<|sQr6CHH1XpbfdFfS5h3J>2U)z0 zl2DWChrDs8E8>v=*IJ%$R!izOU^OEoXXVbKgeWh034*{X0z>Nqsb?jANS=x9P-h;7 z#_DUd970w4lykrK7~#Sy5x6TZ8$%JQ>7Vy+4bt6vi6ny}PDixvQl5o^UNm5>GNbEg zyvy{kpx(O8O+>VANRb0~V1l}Rs6GTBSy`2mFb{gpWMOa8@f-Zn^l&;lKv`2fzQ2RZ z$n&J3;r^h;dSJ5(r#R;S^!OM6Vkw@$mS0-+pa5D7Ez4+}#%9c$O$5rM2-*jy_4m~? z9H-xQLfiakZBuJLZ6t0V)>|zwd@kItzd*M8aHd|Y3j;L72=vxy?Gp=1V|(=a8wtsE za|q}qAWQ-#--*DzYJWeROv{(%10d%anz3eSf zB}G;?(^T?cIXY3%V~5u~a#WsRX+laARYkBLZt-;3XSKk9a1=nH0K_sg5TNE8hv}sc zpV~N*Z!lDd6DcF!-_hX=9iB`nxNvuEaF4ve#mLh}Q3y5!O@7Db;gzHIY?F3l1SD{E z&1PCHMx|;|tVBn#FabC!i%v2jbG+%cFhg!sIEtpgv(nEDaVi%+gO}1o*`JN(Wsha< zMOJwm7>ky{*Xj=r&iP;ZDCE|q2rhjqAe?NDf*orxL>%(_hu@GsgVelYpL+)fMBg^) z@D|`=`3-K2mihR#q8pVI{$wW*`&o>~Xe*(8wG-G*0hop7U2)T4PJ0Yun;;7k(DOL) z(>Z}cJ*;?16CLTuA$61@5(Z3d?k>a3uvKPTzqzV}_I9p1#xp9SNQfMr^>>`pYl!Ns z-;KbZU^^}O;~(BxZ8DWhmbndlp!_d>QcSWuSQF{tS2yA=n@@BJV|NN>Kb$~F@c>uA zm|U;U+cnexQ>=b{%sUl4$4SDttQVbZf8Id z>hk8k<$%w~)%-Ynaea3WYpK)S>9vCu;1ZnY201laVML(6a`|MK1CPrc-I+?YxEWVdcvh5FeOZ z#(%ULrc8czvZdQqtVYJ95NM6K3aX#1soC?XrMTYemJScXtu&1)LO+k#(^-Pu{X0dI zM}Q#@}`<`Hd347|nee|KSaLCAY9XRVM* z@i!%=-F7u+R|r#k2rU_DVK=#?NW5F`sUa&CU}oFvD2){@*M4F8e2O8NrMmW6_-|;2 z=Vo?AgToF)De{aJm2zy~h#0(trpA4Fe`~Xkk%W5dX!7iBiYg8QhCqufP}lipg8`D}No!ms1FyBpM1|9h!vhKvexCYetW!M( z++P)O?Jv;5Fm;A8^Drhr;4bexL}V1w-cZ^Wc{5fKhD|&pV^HI+pvnou%E>sEtcW#s zw7!G7_vp_EVZ>`eoDPgXV6=pz3?1jQLK*`$?BCQjqDQ-5gEkxcWj`nUg}34~wI*#@ zX|rcLyF|A;mZJjO(^^LegJy2!3$=1O2qM*iwAL*x$p*u4Bdcg=`<`OXm|u?llfwXp zdWbfPwI>cjrT5Aq>x`^#8I?%U<|27~#7l<#&#@0ys!bhQ^=z>BPUD@l2XO?%oKAaq zs$Z#!LPFEjFJLB2erDW~rrJgb*gfQ=j`OtpAcet&o)=%8#0~SKd*(+?oteMjCjMGh zJ!3H6++P>#mB@|IgRPCnnEMy?KsveoLO5~f$;`9x53KVx)REWTT&R><_q3x9{VunM zXf4G;7(F<dUzP0()R5tL9o~7vD8q>uu1Vy3P>}a?p?u)dn`aWL7`cB3z znr>YIB$)A=fVl}RgiU8OsW?l}UUY!tJN))L;0D(o!S1^#z|xU=CYZ|~aZK|m0APAB zyu(NBz*janfq{dT?yFJO#jEG}4PE+WS-aoG^TJnIJbjic%(uHd1T(?r{7Tef(R;WEsQ|eFw>>7Sqm)nl4h+6tt)M zM7zqKLTD&Q7- z)1xGYcq3Sw*!l+!`|s*(y4`)c-HG=XNZz2Nmxg+w3XHoCw+I_)E9fV(wmrTpuD%fq zpPz<#ihA%85TJsaa3;S4=5hWj?DUGjW!zOOJQ|RA;$Bs?6DU{vMO7n_?MKl_YEdaf z5j-3nWmiQRW{W_0CJ=Ab1>ba^{j9}8a&`G;eWjSr+B<`_rrjZG2OD~H9px&W4F{xp z+Zqsee>YAlcJ^c+mn>fS#?&(u!ylA0`zOYwpr+?*2R$7`TT|{cccA{LT-5l-y<5wC zDC!Dnk-x?EJdBLP^&E#;ilw&N_h}gde&J-TrJZszRbZsYz6n{@;=md1&h336q{V`J z=C?h-F?1HUWlo8V@|N&49b>H?d>nYK20w-wNL(aS;@|xE_@CSL`io_e<@* zosZ+sP|3IXTt|EqzEc()Fw3kJ())7HtUNAE$OVO=B(dk}6>3kJhvnLrWbb(-B7$O9 zVL^Y~d5p}%Q6LF_@5``+cIKX5I8v|3+;q2KTXf!cCjkDt*oV^{=JcNVYR9G;OL^oX zG%4Y4iy!rRRG9EQG0>BKYh7n!M`VwD z=o+_KoA|k=S;Gay-;1K(#zedq^1V`o7ypcArS|MRQ4@9@f7N!=KkHko%m$XeMBl32 zQ|E8KK!ien5-c6VbLU&o3QZQ|8&h0c;4`Db?}oZ^JOGLi3ecWHErH4gPR_#t#hGUj zaD?LVRvK8kZHKO4Hn^OtV^Axp|8DhSr!E=8-=rxj4CFp`rg2XScxw-zRg3g`tIM`a zoaWqCiDW?G)&VkdW*#2?zyhTXo(r3W=C7B(IIU~0)NOlw*_0QQh~7lVA#C zS zc|K0HYxmW{Fb{V;;HqZeXbqJ4Mwiy57|AgU#_|fM0iTQY{Y9v@Ua`IUW&tUQ7FO}i zj<5Q{p_IAo@w!V*s#i16+0M;(U=gh=@h+LgpP&8$i`ayP;kfw2@%mUVUobA~q0N;&;}yC`3hot}4Zpuj-6`3s(&zpjx+lUh(X{tH;0yB5ON*-*yB z88mLw1eR_IJ955XrRg#>iV~shoY(aXd}PD}1lX}6#va=gSLrEN4&Gt80mVEb6Wz3E z_-xl^&^@_!#SoYE_0h(hk2{J;szO>e9PvkCaLQeyPLybIq8~$zJKal-Gq@qA!%0fH z(R=eeLa_-`qxNe`Lk^ao%eVf_-hHxSfM(m1eGsXV<9JHzeR{~B#Cy=xd-#Y5UB9Sh z+$#|7-2oVXpfAPNIf0||QXuA`HXg!2q(mYuy7k>I;zjYNU1zclAZo+GPvZW8P$n`_ zdmcb$W$5~oSIuW!S!qI~2X#N2NvG4nFK>fMj>CeNFjbRpUHi05Eq?UCz&i3 zimh*Th6LkITh{aIIxM*hFRuGs3*Mq5{s=SF^KsIws3@Gi-?a@t9V71njhD<{8>(-N zlWv~X>(ouRZI&?twBuUyAJ-hkFTO8|8)En^TcD-&Etz=yUI$AwS41;wkb7eM6CsL; zYb(Nd$jw!i@BV7J`9AHh1S6Jw_1(WeSRH_p1d&A=FlmS1Mr!=5!M85D+;+g?E|Vp| z^iGWdX2j`dWJ~LBDwZAv%w$W^5}y7o8JTvb67HK57+OYs`B50<<_}uz{Q>g-BZdy`OT&37Z!WKEu?+L+T0 z3vP~n7a5BLiRuD=bn^2jLM2nYCi2gIMzi*;UMP4{S>YqH-I(m%GKl4k(EEhNauxmUsS%_g`r7LpCG?1A-e0 z#)iy^$3$j3UM9E005R%UTtN*K+ZtM=k|Bf<$z0gWRz1JZ4{9ert{!|p!x9n;@|z3+ zcF7}Ure))cklZ!JR^jHO+P+fPs|2`}YB!Wi=*LPT>qL&^pGCZQ+IBB!_WRGz0jNIa z-LF66WODE~K7M0mGtS4HyS!c>-0dg+(91cds6d4PTUL(ecNXvc4)OR`Ddu$Rg=l*A z!@Xltj|gba-?kZ<_JvF_B)5p8N;q5-{40{^2P(VYJJ+yO;E+OBh=)9 z;hI0311Fy8XHW|OI^OllHi30!#&JeBptAoGV&M7o+U((T{ADSlCHI!T!<;RA4`2SD zmjBM&D@qlp9{H~}7V+@Q|J^o|9Zh1^RI_basq(wL(ZKaPbiR`>>%n>bm9lR z&FgT5v8zQb{>VuVqUkpJ#i-Y+zT7>aR;>PB03s#*txfSI)8;^JC8TU2XD1Wr<~yS* z)JN@XzY<;~!|}g06s#0sCqv0ti@=7!05_A)7p_6lkoM<0#BkrSW%&2%MhF1!eyn(+ zOBYJ&)hdA&bIThXb1No|b)C&wcPi3dTi!6PT^Tx`!vDPqw#HA;jwAuvMJw|5_k~C8 z3szn})FVkt?ovraXD_-agN*)Tx)kiG`` z;arm;wn{r1toJtB;3I9A#T07ka5Lf=HS7N*=ht5m0W=P!E72(l>J-SuEk`8`CbeJw z2@kzE=kC+Sqs0GW4lcs49gqBs8%zm=O8{U2r8@EP@Jbo{zea8OS#qsd?5k#P=c?g! zg|9qg7*T6$3a8z!1F3}5v!<6|H4_YFED=CH>*737+Gm6XNbiqXEg=C*S>H3jCb!>@ z#(_;Be|qUW4g(4o=cqzOQ3Y81L9%ldCovJGkMJqvwnrsNbt#H^?X+l^k# z=UBlOZnUjc{qw3%4)KSy@ks8lf6k*t$~RClK~%5G@n(GKnnfz*=QKWKS0a(@q$3hZ zQXzTN9drRi3;<;eDqr8E5!_j~ z42SCJhliW>oLPHRWP4@%VIs1o8PzmQ=KwNa+ltCgR$I~FkIzotrl)%>V0nD<-iH{G zfI#upxpAxk#+ezgtQ5VII7Qf~2jEqi@&~&q;SBMewQucZ$Y;2;xH z&F|h)eV+-bYFc#8UWm~|dmjNWJL$lj(TgZ_>7gDfmfY!m^l4!O_6{NY#=i`x6HYI-0tWv~5IML4S5ReruGNBM_M+}O;A^o_e>Wa9vBi8Pc3<@Ow3=h;mL z8@ywzuQ7;yXC@R1mjSANq{nR}9^?VymdbLBBy=yn@NCinl?s73oeG_@xlcMl+EtyO zap(S~KJCGS$B=9+85w!+2TS^8Z)7L1V+J4T#!Q#{HDrIVCb1BRu#&{=Q7NY6!(2w% z^uH*5vy>83t=D*`zzX}Nl&rOuzmEZ|9=O4T%CGeJ3}H#7LDXLM&NP{Q|F0viM5Hvb zN33rgCp zeYP`n#QRv~FVu3|+&6`{B_)uDN8YG7b5lazU{p{)fcR3E7mrBwaHzz@{g-iyB={`jvs#dDrv2m4|m_NX)HKu__{Lh|6_ zkD~a3%YPCBYt7jNiUKM_#vL-q_kDz9v$t~>7f<^+<_KX3pxJ1DWRuY<{?N{t`F06F zqiApEW}ln;nyI<^++FO*}iH*5OhhsJrUbGLvF)0aslhDlj!Yo(P z52}kN41SZ_<`@JlBb&9Cg9Wlr=?5DDET4+mf*2|#wfGz#guOe)?^sd-?~88;eO?kV zK%(eN+JA%t#9zF5qXV`s(6>}ZR|0I*8BL1wOLR)>U%5h<&wl%|Ix=En0+{FBVuHIe zYp}mD%x$~ssg>d9ViX*K7B6uExzF}(`6?-v=B51%vcGS$&ve)0n>B{L zu{CXAEMbGk&qvwm^guZq|~0 zbg$DMWI7MACu8n%fPnxs_PnnmMspc^{F}T!UezV)R?1NTkm&~;VY7&{I^72z<3?}L zLJ+>+2YkSEjz3}0(*JSld|m%(eEDWFgW~?CVdO5T#0HDZ+U2qT_d@u4ZFaE)y$F8U zAK#3;TCqsYH83eoWM$-^TJn?-*1am^cOavLqSn6jPWX$=JY*-UTNaKNzIqa|&(Hd2 zQoG7_nf>rAw!qujrivx!2xcD5q*2*G9{ehjV@I2~ua_bS@hpHBxRqNg+_cFwP1%BH z6|TnTa{h$ocs3gnvtzo+*ZjX23x z7VNlZUw)du5J^$8fcJScE2HP-st|!vlAQccuk|B%JLB*GDSY~m>Bonv=HA?{{asCp zu9M*QsEY#cr8fhR=>1Wfn$p-Kp*6S%QO;;N zSQ2#1SIcy}D;4U>pTJE;{QmSzp#WO|xaujQ-?hB{^`QPQxYLUP>G6sU@Bt!9O596J zK#927VTZ3wO_oQlv4PO&lE`*2TXjoFAg|TJMN*OChl7@)o%c#OOSNZS zA9iz^ht~i%H&IWb489;>-Pway&QEK61?g0^14AD#T-jnKIX;lJl2vB0P+L6rH-%q& z9qjwmw!6^}J{b*(G|K-NQ^ATCqB+F0RCspNd&#F!OxIg7Eq*=W041d+hvKs5%rUy` z-PSAtpDHBqY$?BLReO{lpn+u$d=>1l5#o$k_Ds00Nq?^_jl6ywKA}r~8XuId{|N)d z)~^XJ!jO^!D}i;jn^43Tn)4bvo4d9$Krvbn60tYHoid$J52ZR^MlY!q42POf^^ zw8W!YDFa@Gs#Gaah2wsT>s!ANMfD_Dmt*;6q>*kITtfDGGuo?Hl-0PKkYSKpN`iB| zGU2peu+RWzdO=9bYw5OrVD3JC#91wY1u!foxZ9#`l0I3n-gG}9z!y{~w!$=6yxY7I zhD9Zb)MO*$4 zm|u^UZcmLsvW-C>kM6IelB)J?KK;FK$n9wIG)jPNo+sXH$+HCAm65lJu?F9IFNQY! zDDJLi0`D)#1Ji{82(#{QU7}~81Yp-szNvQCXUwtpC--)-$?-b)rJsXM?l}P|i+j?n zA;;n-iV)&|L^fUmgPUJU0}>AwugYH$hw7-_>p;XkcK?QVws|v239QIYoT4|n5QzmS zFc;u`tN8|8Kr2|fA4~wj+PxaVffqKhGMAz{`1dUoQ}eNf7j&9G5Ca=K6=HDTEVkm= zU}(*!yjf7@qX0U;x`@>gsdjN-(OoxR_1TKD>sZw)G63vtx{-vex(7SgC36pclY>b} zSi~D^F(tbzOA(&`LTmEQyZ_~d>ywjHqF>cM=`d&K@d3Z71CedZoy@z0MaCYzy{2)h)>E)U9|w0g7ow! z`KPjZcF%dnEAR=$bFeNEEMhWSOJpd`X$HviB_g1jV}G&tv31cSAOX{}=>g*mF8Q<9 zAq^kv%=h^=UaZ!;PtSODiC5t-Lh+86yB?S2&=d~?+#)V^aE>w_m0)&38$_`#_n{>V z!WaHt*i=g#2((PMyK03Aw8;%hr})*b`4;<%rU3d3^damoF%fU0ubsoJG#TqheT6;0 z#Sm~v*-tOy5zqLiCda1rS03{{P_?>wW>dkstlira;=JP1ZhJbsYM*2uWiurxU?M5; zM_-EmxkIdL=t=0iGMkHdC11MIm5c^2|LbPK=#yonYfH|U<>~&GyH4h|E0dmdT4K(M zZ)$nXbzsf!>Zu%h3v*YmefQ#>OKEV4kuz`LfjUK3e6n+8gPy2?v)@I{*u#ry zFaK#)S=qr!ZoEu8>fNbd2=h)1JW7c-mU5+@c)G^a+^`tTukUE?eNiuPdi1u~Jj91F zj$>$?sTr7B6EM?dQD}kysurj*^%?d1cD}7W`GHghBksYl#{=#6vwk)>rXG!8=^Om5 z0=5a0KHJ#St>=&1PX_>HSgLG0G~+GW*0q48r=AEs;5(h17+X$+$KN*`ef%d&4y2-- zsLrpe=bOO$QUHoDm9!X6V?{VWEls7%T#|-z)VUOgR zG`kL%Np66*@%+Q3$1rN`a8Hro-1iQQ@0Y#G6DG^}0L%1iFad^WSv!!0F{1i8Jv~Mf zbb~jpY)~8R;}+^+LwJ68rnU;Hf#-Pf1>O>st~_BOQI!2MvHg=Jgf`xkP^(UL#8VOi zqD&CR@pA7QS)2}*5*>Gs+YgMJ{2@OH93w`<6zZA7-~;F|fK(ihfpzk`jtWQuxg#+P z-=Zin7fLi`^q8xZufTT42(5kJ|D2b1J9zQa$r7|aFyIq=_fq0+ePS zoag_vVaA7XJzgEgINlNfu1YvPawKV|j5EdR8e&$qi;wN8&d!Nn_tfZHW7=!oCKR4c zW@$J5W|1eza<(fc-*zrK_9{nck=5vaYaeAdWPbKDJ7|7qOP3aJ<}Z<`_*mjfl^N>H zHJxL{_ky_c2n`ZiwCuH(RSVjF;V(znyMLd}UmX1w8M#*Jsg6>vT3dWbr~cCtIro(w zkFD|30SdXPgjD;`xB2n8{#gbZl!r2uf7?j{jww^4WH~U|W3Qk2U-<)gzP{t92tfJw zWB+*;qW*_C{Cfo8*@)!-&nrNd7xaH$8Y?13hp6I!CmgF{+--tLVPT(RAo@>ru-VCi z+p%I%euJ)P3Jp;uVOPF|uhBbANzefOgPkJ83FAM?2SAMRK_7woxbWA0!3WUpZ=Zwx z>9FNw6-+2LguL1gNYO$F*&nKoDP8@BFCdo_6(Xd^8$r)8wYk)PSexiN*Sh^ga0DNu zVkWEVEoxD2`ZD_t|3e1;y;>pWq!`mV?iv3td!8xdS8d@a>a{5Nk+bGP_OhfXIe;q9 zo@T0#2Xwh9?c?@gaR|(=^9{N-hivAf+uD^gAg5YLB#)}`0w{=>aAY70@$hrv2kO8p zaHHKbn;*%8i?Hpu+tK4oA1y{rIsmMIvf=m1g*N53FLk^?i~9GqTFcT)Y0Iw!wc{h? z1$xuVSiK4rIzw`F#d@%x2-Qqbn&{LrPX08_L#p|qof4{)f@at`@ zzhxyr0XW-HUL|WN@;bI1(9wZRl3Cug_K-XPdEw3L{An6Fy&+53$%a_~`?K}5$XnR}5re8F}NfF7{q1B}@vwu8=QSK3X&1t2?D`p#_o z4VWipR_ANK@;EPjdxFrr+e;!ofaPIA!gkTl~d^s4=fQyUZl84RT9JB ziur}c#Zq*z<)@u$my4$bU4-$JGBXxYQc`=yg>TjDRY<$D8E{A>aG&M9^c1{x!Nq&p z@R{NnwpvgdwkIcPGnQU=d1s5y@fXVnm2iZ>!sFG{9P^^BN+~vJQkYTLlw1-eU^E;d zBAj-(TiitQ3cX~?5V?3tqP+BNbI+>1Bn9$kg<|IZF<47qc*vs=&8S%K9g@&Va(}=p zN4gHYPEiC7U!49{NR><$eiK>l*401-WT zf0lA`!fZFb=t^{(krYBTRAdKcj97GxF#4>(Cz#wAgV4VO<{&)BZ<-IGFUPtw9otU) zLCl~6`p_p!c0L}<1CERjDnt?F|GxNY3N?jf=oEbyZqUL1a&jt4o7(}e8^|S_RKS3$5$2~e?l-pg3`D&TT&sdyiAa<;=87gT<(B1np-D^Q}EmRng`E01B)P? zt=@t`L>A{8pGfhly`5~JSZ zLBvo96Dg6SPjrlWUKwT7qPoD&Bu{f243KEfDXK?CM7m=!ex>pWXE4 zh_3AydfV9lL)BYAMHy}H!!UGrcL<`AN=TQ45{d#!H`3C=P$R80A|TSBAl)SljYvsJ zGn5QS3{peSckp-bf8Fn0vw*djnfJV>_I{qd_jAHVUStMxi8m~n-C?~Q_H1C*$7F3~ zsNr3=QD9Jd#^l?x$Iu>WoVsKdmdrE~iFcro(Bw9~#b^kDX!7zi(FriXr946*4(n+qwaAA6j2$ps*I6uS^CJwhLY4u#_W{SE@;G_9uQ!ue%OT#Fb9UyllAjJkk zi@QI+Lw-{a77D07i6gdm^6u*RNyHn1Xd!Y&tu+gwW>i!Q0@g!*NnD)aUyOYX;%B_C z(HTKGDn#Tyzje!Ec^sD;QgFZRAfGUbXW=CeM3d$Zb`Vb9I^*M5S zCszCG?>*c-Gy6merqAm)BGFtl`TndRXBxg3mJy7Hwj*k5VxnI)zSw8JxPTB5bvti75Eqtf0K*uW0UmUS(YE8ZpwShCCNSBr&*GYm?Ir#>9%7>1< zR~k-Bo!0bXIvXBbn;obOp2^01k-$u7V|VST$)!YB=-!c0#pL4?w7jSY(!@3eR*kYeqNPvzK5jQ0qi&jfA!%qNmGvX{YEgIcb`!LzB)|73p*O_9 zskFSSq7>WsKK=YH+XZ)d`8<0=m-;2dolaroN#OHaj=qV1sWg(>-RhPYQkM~T!uxL0 z*WT@%CM?j4K+OJ%)v93VLQ#}XIYnX!*%M9j{apsHpAGv2sa_?F_aWu=mj=ZUQaQs_x z<7$_}-|K;e-keq}&s9S(iRS^cO#tq0M&HKOeghbjJ!4D2wv@fus0bqe7R*ww7XdwD zo^g{`Iv%oaoO-7u+Qu^wqQfBXwTi}D-&J@6z1n{+dI7&cR-zE2;)(0@(wNoM@AB}} z+Yy0iwoEq~>%Ct&=YQ?L2VFulYhVkJgA-CK!DwF*l!@FuL{O?{n?BX$yX>8j29g^C zho`m<53H#2?Z#BhuC4^j5k2h#`I zBmDt5h+%YsP^^FXk3jA}4h_p$@HYtO4!LxNF+K)O>NKZR%W|_f#UGY4GG6H-m)T{B z%qwYNz*aQL;uu$SylaP>sUG(P+EB0)#P`I+whwA`8vNM9F)*LXx8Dfb@7tTY`#3y? zR4Itr3EBhvo5$*)(So(##epmsu{~QX#qQ$v3sxa-k#Rn*vhS9+vy3IzV^6dHS>#2RAHY zn}w9oU;L1s@3nh%R4&Z0>`QL+`8>1rw4NA2Iv+5*^T)n&yrxJJ9wEHZPIdFxivqz?X40-={Z-@_UKJ)Jk z_ncrZ$=oGnMPGWozZe6H;*K|y|7DM4Sw_qD+6N&v*WlEo4p@lZXKx#aL2JUclZE%Q z(+@h>rserU&hs)lhJ@SYf{Q50wR zN_BE9ba9Z{E_w?BbV_!7yzfpHZeHTPLMJP9%Dtwh?`E9Nn8LEQC^wCWYHu}DKJJ5V zTuFR0&206-`z|JT@YUoE!jTJlLc4%D$N*zMACjIK)+9@o&KQom5z>M=eDdl>4DHzB zU)tnKUpE4b^FL^om%pzQf6|{dn13D*Cv*F~Sk$Ez+XcKP)L`b`&0@sA*w)b8!_=YKHI9~izGF$?RtSzy#EBU84MB*Ru_%BcxqVv9g|1>IygUH$vBUU*Bpk^f*XMW_Lzr2rP!c5^rczR>n+0k*^%&_dQwo8-2b`ZfXfbyyHp7k=jd zlx7Qt+}-wbYOC`B{SEADig0fWYVGXc|BxE^i8Q?m{q#Ti0N~FJEi1hL$0tx_`soQM zJ-pG*tT?Qd4GK_0+!|n+^;f~`I?(Gc@f!YLtZJVHLX*j>3HPu|<#v`2d6`DzmQQYl}ia{qM;|?+_pDvG0qPaP>{gJH%zeIXPIU}!1>lBl)G$EQYma7^` zp{Kn>>I_)_1;*F?rFsbxZXXhDczK#08>|c(X*3lGjvU;iugv~Njs37El<|cHr13e{ zU@l`1tzOy7PdD!ra{lICd%Ukh%-r?t_8zQXy!bs#nOIdcEkWkIn^B`G4LTfT-$qAF zAPP}X(YvKQ*syL~28zqtA1wux><%?VjmHY%{x`CJruY^VHpuT-eqz$w7Mw2-uu#3N z4!}kS_DN!HC8ru^C{Dt|2PH3LYu^?cz`}a5IAfdRZp7WQV^#Y4+eB0=pPZ>kDG7L! z9O}(CW#+MFTP#;M1XVSQX)ipZhe6;w#DfEl_=HpMyW}gQ_yKznEi6Gb>OhU7Nds1y zDrUU`w&PPiFjVG5ko!kmHTaTY&v&t3GAx}a$LJTYK~>1c<=m_MF2xqI#!8ei6U(pj zFH-oWuvUM~+aXgK%bGhtZD~J-ZxSnQMnHAZDW)CDPfHyudasBs)2kjtd*LUP>tkN! z12)c#Vy|DeEi~mGd~Rj==AeX}JM0K(xfe_L{XRl3ZQ!m5gL_-_wwsnH5827jAx@Bu zVm5#n3K{;_Q$-*$jloi1~O8OohkrDFXYN@>~G zT{2$IO59|=g_bI9yXxu^xsOQhnmWo5C9qCx?}0a51yy3QqU!cw6`JHDG)q4b?kDHm z^@!j;`**Cii*t+6Mhuf`@cP`7b@{zxU*b{C5`7ChK3yoSeMAA#;42(Gp-p>H?Rzk3 zd19K6+f=Z0#!yo7m&Ofu#);oA;|~@V?^S8VDMjGdmCY?aXFduL#s8X+7-2BUII8-p z760yCA_S51?WvN0M5Ez{?0HZ5CcpC0o)wOVn?HyAl3X(VoFM~XmJCIpt3ZK>XAO9% z$K;#89V>F8K4s*Mvk3NK=+m}MXYmw~T#sW|{XsgIlD@Cf$g>$W__-QQ>`}q+=2}h$jaBU1=N*}JSkiuicipiT(5-*22eV!#!P^; zWrZ=Zy&?Tox9}Fk`Tr>UuP*ywAa5m0eLD$I6RK_dT%gdh##^n}L<%4}^kA04ypmrVRFoAM?POwTRG336r;tkx zz8dxSX$oAx;S1BHQK)jlH{B%r)LzCez zf5@FsH`nmk;2dHmM@8arl2qIeHz7Z6q(xWp3^rJ~wK0`VIFWWPrj5f_S;azD31G3ml@mA6h z+FrZB%cH`a!?%oO;Z@PQmeU7r^>s@MrA-g7=nwN8?detKSwBlNe2ei?> z``BLoUdROU9BF(X6Y$Rez~z-iaM$&`YK6))D!azV#Is&N>mbl`>43ZDM~Ufn;(V8{ zZM<-gzxe7x8TolULk7H_8f?7Di1K;3;r%NCM4%s#O?Fu;a(PYxY3C*wc@h$Yu+_=#@sRHVQf3UVvOd{f z)80?a0eJRA;tviMWTm*%CgKs}Y2>xw51mBudB|k$E%>z7$7#^CGt1dmKKuD+!Il2R z%0?lgo66!*`!iCRdxRNCE}m%b#OCLO@bz<5dOe{|la@~vR+_5Dn+8A5k?dBEtfPwJ zCl}d)f%0>D4{uDjNFD_a-TlD(s|Hl+Q{s5~F*9=D?aznw`m-nTR@F1IvA`w>YTrmT zCJk(S(oRlxh!6ZYJROkSiKQR(EZ&?7QV-EeKzP1KP;nFjSjLUmQK{hQ1W*UPjM@C_*8 zyo0=Pn6b%d4X@{3VV-OIBO$YJN~%l0apLcSC+2}M+Xof8P$>puCzc>j68XMX-po7b zB_bcpcyLo1OS8~ezyW#NINryMJtvmssTU;Ks{ZeFn+l>4WgmLK8#BpC<@5*~=3i%O zMxF7*fyE)W3w|e^jGGE`XL;t;6y7>Zigp}c6S6N$< zJ}e(H*^@esyHxssJ?vO|XS`;(-ZwdY6`8n!BMEg7#t$T8_PnqoC>&8Bdlf8Df$OM zt_D~E@nlLnyFjKR_OJ=}?tOf7j*#xe`WJpR1@;?Z1}r^QSuE1Bgqrx`>2=@m;ol(e zN#b{wWHv>)?kmz4IxImB`qpcW#VL+2j7fE4l(|b<@EI1{TZzo?BztI%Fn(eUr6u0W z5Im851Qs{5ohH7H;n%}PDLzn(C{q(jvGV}&hz~241hrQ|+V@zdN z8#m13Zw$mqARP76Zr|Pe42i}IdXbzZ)q5&*)$?X}>cFUfauM&BgqN#H``wg_6^}Si z_2>-|NeuB!MR5G~qDo_7CBj`x|+j`X`f^BYICMs%SHyG*4@qUe|KLy{zsW8pXKaU#p6kwla#upwXzt}j-V5v z!B4Pf1A7&z34wkbu2*!FMlL{-v(1yPccg=yyuHGO6MBNXd&L8~*itkJcfFVOl{L9t z4g_9BgkHN38o6ZtjrbilEau)dM{6*k*aS2Ym3>gTS-$klg-;^2;Ms7NA)0YIb?V=U%ECRrLfFQ%mardmhtW{9&$4t|(k)Z>Z1JZ&&|zReO3Y zH2>q)UZn7{a`Ihd6k_rIf=`7iGJPxaU}E!S$pz&Tub*|D)^Hwx0lTajalBfZ6|1H) zbA5-+UXdz}r2EboXNuGw;Iu#}f3LR&eclfWYKCTaBs0-p4?-XXYPm*BCLfP4B=8H) zrVso;D{_H#B%J%)^n9bQ=U-Qwf9PoS58W;ycqL5##`sNIx@KCHrG*#aUWoaNPyqI4 zS_wMJY>rH-aK*-c_WW7@Y#?~~*QwE7xYLSOkF(nUgZr23t+~|%jF#l9`?uHt#grehdk7#oDA5d_x(!_TVr){)n_RIxJ>6S%q!0~ zA`x9CsQ+JF>h-o;EkT+1sZbYNoyr5raqYoO@^}VNTHVaK4VAP+z{!}Hao;ZEiT_Xh zc(k7i26RaLzX>Vo2|0L|h8e;?k#Hw;d}MD}l^djzp+2qq>@#NcI=N-;TC_D&TTB{+ z@1;Q>73h(-#a*)l|GA{^bAwrwFuJ@N&cueF^n4@=u2BjD3`j;A&Gacf2&v9;Y7PEFD^Da`J?2DL^K2w#+zI;D7d zb>9uUj%sNgJi7gzT^43;N)VJ|P53{+)5{|!yh${2!!2kOp0%ar)J6JahT zg$2ChJi@j)n7IkI(cE695br%dVXZuWbi;el85 z{wTl(^iH1q{}wR}(_JrGjA&&&IeeVFZFtc1jUesPzzvHpWaw?Yi>(_cWgiUwMszc> zL^Sy`F}f;_;qD#*av$&HxBf}HP3^=jk*72X#qR(5t_bzNw1H<&MLE~`##8NYSM5x% zBWKF!2RA5rtM|&-8r|4=TF{hNM^>*PC%vqB_re7VLPYltDy~;G*hFDI&&7;-)d1N< zW_$;WCck5qA2gh}<9eLH^@LVwWmS%y4SjZZh*5(UJ6v_nG~#AK0zj>kJmfta=bzT2 zxFEbxQCty-D*bmF9IP=F(T$KgX*c1O^A*;B^;$Zo3bw5#tC*nOQor-kv8UXlzfac|Pz z8#Xhs-j`#z!blMyHnT>cmmK|gX1QQ_Tt6v~14Mu!o}nP&&|buT)NHKI1TqUFnFMls z8c>Qe$a5S`YK>yt;tyR`jH3@=Qe$fso3Z)NNaL|z#_-D1MAz1+u4o|oNYdUPWC|55 zzz_>^+3%Ep{XyP{Jv#86B@c$bz!5;6lR|!?aIf!oHX2PBK#k7Izoqyg+|*FWfqHtw z&M4YC=XuDpA04K56F!49AC2))4E;?0f-d_9TSZTjAT;aZ7DnTW<3DNwo8Wk;biO_0 zP-zK@hAgB}bB~@PI``p}UjC!Jd|2{8`+9;EVcx%4^Gxu^yA_vd zfA3K~KJ7anyR>%ly${5XW2LodpxTJak1Am}3?$?+Fpp zi+u6I`(nsSVakaPB#qpxayjjHdfZ1L(_juTMV*bp)46X7Zpl?tCvGNK`!6y$6%+?| z&ZFRsFq>Vj!Lj`yNq%uq5z|T>c+5L7k$dS%J~6m9j40HLKp$jxnrQi&P3}=X7Mg8a zf6Z}Sj+ZCDCkucucsFl$sA$~nkWj4es>goMZs(*$%8QZ^;mC}R-H7<5NU5kDJBNu^ zE{ay!yZXzP=8Yz1N7#HY_<6d+Vd;uM-S1WUw|yRE>q(r-h?76PBbAB^bhN*kVT(yT z5eR3sDZst~sagJzknD^vCTl~J!Y$EZSfQ+|%h}&@L#79vtH$Ev^KsV@@_ep7Mj|J! zkg-yT!6i?EM(I5ykMipiT?T8YomrIyMo9pqG0Mr1)%>nknA9mXvPGk22p#<)pA*1a zYDWc;;M6I9mlpW%OoHRd?+LBFut3%%4!aM2jksNaz9)IW zCPRwhK+K@*NbiWxP9I!_>FsZKm(K{ayH_{LQ6ArIZF#7lN6A>Of@bWJHPdom>i8TH znS*F16n}=}!PKHBG31B0-4y7rXDBRMzv^smZ`~}aH4=E^YKbOo(mO3>l0ghR=4QyV zM|(n_U~R9y1hzz472=-A7wA=&eCbu6w|?nje>Qnb;>E`y#UY)p ziua#Jwj}f`c6!;qc3|c>WJXTr?w6Zve~91Ig**@7I9q#C^jBr`%$QdBmaQ@UGhBZk z=C4l(j9k)q7yM>E1nlFjJW8c-22)X8S~#OdCw8S$S#c}|6wb32LMIqyIzBI8 zOAA=NUSK5f%U*ANNNwRcV3vPRmLe(etK$!Yaf5CR6&v&!5Pa!t3GAs0@RU?jI6h#P ziiU00?woE|;~(=QHP6UGJ>P#aJhX#rnh#rsql|2frOwGg;&3;%yCk|Hn~^E(NHGcAn5!x zFC%x-nkq|7R%}l7F45AL^g34uIz(s;X<>`}#)qJpD<~sY*AXqUZUFk{FOQ~kr+C~r znW`fhQ9uhpw4M(p2^>o$_~XOxMYHHT3t}^JXvvXKziQkjADR_Es1dD-DuLpsX-9|y z4evsrLhk!amj%Z;;XlQ@ZVS)?0|}jyg-lNCrEfMU7IZ_9h|`t^yI|)XS$u3M^^bAKex?AQ6erlESzO(7Bu<6I+MG6n@UKb(=51Uc9y<@Mb0ODliHAm|m$b zeu340p~CA)(r)nfDmywyEh5ASPfwsj_J!L19@XGV^?BGWL}U#4j3E1u8x7WGw3?)) zZnK^qzQg5N-nn#3evc#hb9>cY_R*s>-BYfgvx+`{?(@C%Gwn#5H`_Gyg_-85vQPRE z8Lz-O^R?YSx~a2$uojA!CgZs~VxCT@_gyJAcKU&IMurH9Zo+)JXZZ=?WFTKAbLhwW zjdOft-2ZHbuvQJ;fen!+tx&ZqQ?QbG|E)jV~3BrFKHoZq!YTu{p#x8A$CjeXPT}%Wt>+h#M1Dq%mZR4 zA{-5Q0!(%gwzz~<#oxM&mzb@J>kR^vs-RMti52uM>KJoEwzAcr2mipP32|1y6lQ8^ zTyJ>AX*vX8SN^M>J&V-rvkw$V%~6Y7x?K6P2jU~Y^}AEyisw`C&==lwa6<@3(n!a7 zOSTyH#ixHbBhZpQb+pL~&ttWo?bR;84L|$HRkT?l`!CYY4>Vlo)jTjTK^i1APX-KZ zgdf=>wbV7}QxoUEy<1ynOXGj!O7>T-Xp?AT(>*6uPO#p^xpO{S9l1c^GIoHqXBN!V zyr_+(@Io0$fpIlN7Ubx#!hHYA=7*h>62uzSjl z>-3Mr;MiMF0TzdeoRQ4xbEC7Y9k(erp7ckfi2WBu){(h(DawJM8PkJ?cDKRWs>TDSK^Q% zO=qo1cJ<<*ZqJOnbT%<^H*YPW)oR7Bsluk|qok6-cCZznB(``eguTVG`9lr!lQ-J5 z@Y06J&UV4?sNB!7g&YQ(nXgW6VHe(grs!u!TDEOdsnh3rKIhm`S_)RM2Yh(wLu;=K zx}RE@)O!19db&2+xX(qKGWPH4HLM~FvR@jJ zQ`WyEo&8!`JmvZr@9C8&n#)qOn;i_pFNyjy&x@^2$|PPL(^BG#II(P8oM%&EPVc5o z*17tP*^eW2l+;*$&fL*5NHA%I4YzP`H%X#oZ+^A=lKV$L4T${T;cN=z$V7vX!Z!0@ zl67#2;qq-f0s4?ct}oV68kt2h0N-c=X5?KEsY zHaW^vqsFW}GnAxgd zuPksWSa2&YsnqVusWB>klVioWynlm>%}eun_L0$>_P83t?OPw)3G#lr+O8QX%M)WG zw&JD;mmFC5X_UI%=fZA=oyg~$y*A6E)Du(!KH#KMs~G-hvrX z4a)7!6Sw$Hm9IB6TF9Km7vf7ka9T?K{o??tD<+G0sN8jUOVrr(?sz5lL;7t1uQl-! zr`P+@#~sFzn~1as#|h4G)`>&`q)$MJl$yuyN8PCv+-)9ob~EnT>Yzi7p_Rhy~QA$5T&m#b|22{)N>|?gvbXoON;LQ z&c-&DHWDyqH^x2Nu(a@*?R`bYW3{TmQGa3@ed#MaZbLy)KmJu$)ox{Lbk5YB|B|M(AYpqdyFo`=5B(s zO>)1xGy02*FGvMor(JR2By}NriBR!C$|uQqg32rc35f+D8}%$7UtFAATxMb6U&b5x zEt)Ld3bWBIt66@yt)S9RLB@Xqiv{*r2U!>))UpqFZ3^6v`8fB1Y0|1%zUlK$qT;PJu zL(WstmtUxjaC$30{1Sgsaxj=?tC zdDiC_d`|z(2yZViExd2z;+O*XLnEwMY^q|<$a1B>AQ%XT2`ZRz?a zSwxJ7o<(kY^24O?V_+{3z>Eqd8KbvvEiuFxvB4%v9zV4{U!VmeBOUUbA?&{m`1gAw zWQiCMSj<`w&ONSh)&e7J*@pN#0_!`XN*2~9^1P|x;3uY$^o~x+o!&HRelj?1ij;@ecy?r5JGw46MUX+qD8c0JHL14wjV>^@Rrb0S#B59c`gn(>rbtXQn>PsF-g?hE5|k+GqR_ z!#XN|CIPZM?4P;9Ka>R;3QS)MrL{oDIVn~d_9V<^$1h1F#C@LsiT*=HTE*IWOhWXw zT*VB;M1jOfUxN$L3fKHPwP!e|UxxK1PKnr$7pdD)rvfC+l-QWBi{h{x_bIsj=1r?0jYB5qki8X#|Kt`6=WLOBpH7)YpBS-D>%#GZUsc zFP}X5n9k9IG-&|);kAtf1-!rY)9P34J>&@haMZ7WJk04;TW-A)OX^A%*`fnyKf z(XV%|eQVW#g86QTMJ2PLFVq<$fu-BhLl{uxPnR?Rd5Du0VI!8H*U`KCpasXdKBR1D z!gd%xMU`t}qtdh5E90wSOFx+{0bhx2kxG}ykOWp=$NI7~FU^e8SK7z76k{bU-n9Ew zzKFfIExxNGl%R#LcUwg~LxiqDuDjq_Ee);M!qxh@q7bNg`IJ0^c(-#^-$XPn%Xk?} z&MvT)^O=7M)0eH1Enklq+Jv`9f)vI&qhj)8H8Se(1tOtYzJB#cm;p(zchcZX^wqi( z)a}-Ku3Cge0OB-@^EY*Y9=;gWHfd@r_(1cM(6(20Ztlc>MLbWTXJWUGov|38q00HZI_3;KHqbN?@@`8friP>jaI5fz``kc21 zauNI*sw+C!%QuVJuMp9t-|?0HM{j0PfL#r!K1fKwbozEUM`|>i^g4#MN(^%YIKsqbt@Y3EkLeai5D-1S+CsB% z=L#&LH83NI2RBz2BJcFAsc}&_OmNK*K4u0WI)l?eVu9mVHB*rqTha)G8}vnj-j6GK z+~XtKgAhHim+VzDEp?u?@tILr1@rii0)_;|uK@Wq9_R{I=UVmg-8;m&=J%})Q9Zk8 z4V#+BUE&$I^e|~@Ykm=N<9e}>cNGhWv*iEgdgUQQuPJn9*4__g;zJ*_J8i+9&$rOb zLuI_LcRSwos1NYNtLBC>J-U^rdh^oXztEhI_fH0|S^?eKM*NHS9J8`WN zSUKVogEqRBSwiD?A|sww2-1}K8e-lml1;(h+Zu3LoohDK7Ej#rsmsv(xNx;~8JG=XE8bLc4ir0P0nskbXCHyLwXI8j(TGe4T{9Etp^BvUSy7|4Ee-R08| z-{2qSgwJ6vjJxlJLy?>^SxtaOsGujL0ruJp&8ED-quVSzsdb`8f)+00AEbSD-5_f< z2`0TdIZ-reM`SErRRPjiP#v(4KGO|?qu0FIo|}5c|9uvmtc6=U3$Qq_&ATH6U(aPt z1XUh_5}utc;6VqOwG{dSp5?n**UxIO%R?mQzn<)Tx7+qzYuELiCjknU*Q4t0`}oganl$J5^DmBgHZ?wb z!l_lF#xBOxQ{I!wQG!maC-ntxpQd3eJ~9jJ!EF?{S+VYlX_NYC=M={+Od{zoeK{-& z0h-)a^kiduSt~8{h0{5o}>biGi)sUC*RG2F{BqQK_BO;et zFa1Yoa`3f1Rwaxur|?Ekc)O4-u*fq!m- zy8vM^Xk)F%W4vF(^&_FjJT@k4zh!YEt@ezm^#23}&)>b!X+QF*Nw z@SmIBpXxXu2>Ilzp)If(@(tS2^dA`?r+Wo)>EFEU#lyv1aA1{z+4}R!4a3sUF!i+O zF@Ib;=C_PQVnDllSVB}3e#FeQ>i(ol&UwgK^369N8N-AG%Z3x-NSUeP zVLu!cQ7GV^Jv7bx>s2c>c<%hIVNIQ_g09xsGl<`(n*cz)ET7(u&*>tare&vnBhy5WyH~<4)AS z0~JB9`<6t=hBB9{uw~WKG?QBV`js#r90i6OD0P_uM)^AH+O3nf*KAc?*EzT)X#8)_ zbPAE3b9bBJM{U3^0B=}#3K3Iv+ciUwlN2`T&Fe`qe$>D2p=;AQ9}S~2^+gCR+HF5Ae(+TCuz6N#bQ{ZcaIW%0~|$N~41 z6rEtw5Qg3@t=Uzv;ZLc66f@;KzaY{>p65fWk$Jlp#eA zrf$FsAVDkuTHvJYT7-|nK4uD5M|ZG0W)0GGezzj}jEYv@Q1t-c$k(`ROWr#e&9 z3jM^nF4ORlVt4sjR137jXU=w(4b9l@IG$COXh_VH!t1S0DAk<~WzmhFtqf!EA& z_cT<0cKGgX<`R`D@2{f4qebd!Sw2Bj9hC zVdaTGzNJhyx!qP2cRs3F=ltl-MrhSOSj_(}ax5yv+e;O3hKvDQ_=kbhNfw;Zik&|V z_KFNGO>S$@?E_Jc@2V%i4kn?Y+pqOzj}H??D_6}kj6v$fdoZycYm|`&{{58cym+-M zm<6DWKQ?e5FsLBngR=oe{s?!IaISFKi9Jf*44C@@D)v9O-8f%^CIpc0T|SG{OxQ)5 zGd@%r(o+0-VYaG6J*XhCAeyRpG->j@*NDbQT5$ zkS??8!x<#k2y|Up>H1M|pAdT6IJ$}cKR}g-4eEan!)uEBZrKFT5<(Q&DpT5lpcs*! zz>e>uQl*!=fU0edSR1~)bix6_dn}Q7cAh4G96%-}MSqI_|A9M}KpSGm*DrnH{)Xv< z)DJ@b*f&{&X_41KXWkUCwkylaGLr(21Gi>={C5ZX67xq=kyiPl6|S#c5_|GPKdq21 zO=mum{=ZUyM~YA%yhlGSgduQvVH`T~g|YhnZ^I2|@kA4N-IwRU5UH^|<{{G%jkj^d z2K;zhQ)GM14@oDoHP6TSWJO@&((V=u0+c;rZs)=_J^SYGJ?7_DSycJ#ewC5df8{);D1K`BwbW-*o zWo&%Ih=Oy(J4)RG&>b)eaR~@&#jmJ}D&*P&$m^i)6LBZKH_rACU;O75a+1K7yu<*P zbjJ&d1qJ#cfy;MzyLfMa|Bw3qOT7Ef&}Xq6>`|>K1Yy;rxC*>uW{C*eY!t-%rzH?P z*)e@D^gr+W&#%U7giS70$eBd|7-EnR$wvw}l9w*%4|>FVPkXVpOTEg-yRV+%Xk+0X z&uZ{hPYwL8Y{#6{jV^4l;)Sewf4GS&J93;NPgNLF8%SSyIW)fQc4z|Dy#PZlvo{hw zVBUR`E+-hXN){aG)02Gj`!xqYbI}A6DmB{(r%XwPbI+aTNxMqAW=)&mjF_LqV z_*v6hz#v83&Fd(rnIDmz2kGY-51Gg7)m! zLHj@D@?YXN?~7pBy&{8QD``LqIg3r7-WI5>N|O9lb+zbL|WdY(aNrarwDTh~SG zqVe8xZLP1&TF@eJYaDa~TCz<(V?rP3|(d9nY`aCz|$$%7#rX=T7H z)vDL}MAw1{{jC$Wtql8aLpx!)DIPPYkpe>AT-6%&@o@%Ph`BskOm?8q`j6g&wP zqBr3#RoIgy6k=+<-{1GVs44$(@@jiV>P4{Md+a>R7|swa2~M|ls!uY>E4a9iAwUJ} zsP;|UEBdoT)}K2#nk&90ISZ|Z@4YoKL+Hl20|du20ZxS&D%^Z@gUQ;N@q2Icid`uV z^C$FC)#dPLtiI1wF;kQ#{zD4A>%83$nZAc5sIfICgvyJPFpfmCie2ayuAR9Gy^)tA z0L(=d5?WInfW^Ocy)%q1b3;^L6wTy+zZlZJK#fb%9qhKzhrEAB7<_@;P3MX=!7Yw! zvQO~gU#N;Cz0OGTvH;qVf&SzkHq>K9@$@_y;UBX?z)^CFD%vqBZQkr+cZuelPkVkc zk1Lzw<3fVLZ6OYh-^yN3|!y83qhhjAMz%{d?;pB~ zKW`#b1mO|&w1EyYlaL)~`SZ8jMd=P2`SteEL11~A2jYp{CvR!ng-(oLx`bZF9;b%o zW;}l?0O+Jq9D(}@(39d~{Lbu4!ukar-}!lL6Rt0~j#s>$9#lU0cr52~7LSAo#P9wt zFRNCc0!gy_D}4H=!?pB{w@8edwo0EH26B;xD8Ef#G-@IU5dTzJbKjlM1&;tbfygp2 zIZ2qS-)^3_IbbEb=vfz$Z`YsO)%RgSKR!S5acpI?);*i6%(hX^NwD&6Pd%G6=t&3| zR_L{ZN>n61oG+;P2$3~U63h_oHuWr&UdJ@MN*B?QU+-@luV%jSv)zUYw@*{=76p8% zWx;uLU_#h`!YXH2S@!2I=5<5qj3A-)^IlC z{Rmq~+OcsCOsn_CU19+m=E#tV62hws=w|YrcAvcdw9z=kZ9aDwQTjjAR7=x|hoTYD zdQn)dZMTsueODBl85GCqF^?3BE%jU^?_=1E?`|70#;`{cEeT4*SxSDa9B`^!j&dtE zP?R8{!h4D3E^8G0uA1@&7Oh3hqX}>lbzFsIFkK;*wdE?~270^|sU$Kl&%2d0*V|5x zA7ZcRjMWwPdg+IhF-doHM$WIDCRCtvkXfyVdki){PzTHisw7LClmBNZZpIFYezPMu z?%x-(wp}>5f%SYfiwR%AkSekZdTD{G_mugUOU!-7mw^)%It_onoH}hVM|M^y*r0AM z7zY@o>6abrYFhFxyF0A-t~no~UOr7~uUFShaIPsE{vLeSM=)*ykr~Ukt@cCgSB7eR zMWSWY+Aq_zk%|s^lf&{Nm=>Y;%E{hVnlYZHFl$R=%t_PPBLU!UW zQ&BNK2)2S_D9O)nJ^)?u6Nxkp&Twp(eG$>*POyIFGTn1yB!Y0Fe@FhE4#j$}3j^{> z1#^&Iq%x$XBs_=%gwnbm@EVqPfrIW9)SA|Q$eWwILe|tmJdf~`2C`2Ox^~JMLIjr! z@4z?1bQt<$Wxzq+mlMf7hlM1BSCcHoasS-dYIn#zV<6>3>EmZ>San!pPj#_z9->#d zrQHpGO|X94`b-qG7T3+}&BU!1#{tXsQ60cBS8gZMO{eHfM(xOC+$LNg{!sa>UT{co^RT8B@=CEm93F%fXodJ~VdysN6u$ z5ibz_)TAPph%L zthYqTtL_7&nc;h3^^%O2sNgY{-DeBn+Y`hm2Ats~jZ~awk3?ICh(7l0yFSFUn%HxP zZ^ak0#F76bQrZXCarfr7D%(q6i(Pre{YCXFWBoPm1`K+ev{HmZCdxAV4$o;9|6;|K zL22}8z5TzutJF`Tm4P^(Nck94_h1EA&zrd)s@U~YD*LD2yc~faZ$<2S0WgO1qp<8U z%={Vf3aLh6Dd3<_aLfcK4#8_#Z(?w4!VPrC?f^cYa8_s&nzH}5ZlcK*?l0fpY7!*i zKY%sam;&Z(X`g?0>uhIK$F640?BiJQVclT6*9*jL>1HtWD{? zZ8we%lUAaZ-PDa#BfJi@d1TPhowbS5EjNxJv2C~b3ubDv^Es#Tk(s_n#+O6B?abVd zzpT$Uee>=|G3McPANyCv(^J6@*jF$IP8b|dssa<$bvF$0+1P_=0|L;(QOtSpq3)tx z4e*MVb%Udpgcsj{vnNbi!aEQcp1~ENA5UG%I|Io5QqFB`gWQRTJdAWeDsq)~0r~oAD!TGIEOt-Yu-wnrcyrp-?VQEhQbqtZjxA}h zm*hPDF9(iIi(avTprv`&;7Qp@*{2jUj^}eBJ4YrlS6KBkZ%mC~euv${YVW;?kUAq| zj=iGJEjTsJZRf4GUb>N5O)GgCayiQ*UC$)Yc-zj$4YtomQf8AFC8ZWPoY4)j?=J-z zI?7!e>AHG5$?;vqC-=Yll13?hrJI^c?k=<7mewluzCA8sbal!8>bwR`&=sk;RX(#r zzP);5+NTfP7O(k%;Xc!={*PuOJNEw1D^A_3wO-t_J*K^>MW10{k|LVN5*G z%idJ@w32tSg0W-WIWkPv3kt{q@&a8?I_n%3*F=@T}JCQlRb~W0uAKBRJgo^)-)WO?{3{1)CE+r&w;4o~o z47(#77WVE_srch-k%64^-D8z$(_QKVQZ1LjY6x8cq2pn2&=T!_xCxRcB&_i~b^PFZ z0);|I{W)dLur>96Gkmxxn_IP)eFe!p{Wez(b}dwSLB&d1mV2`Pr59{S+TCv{f^4Qe z8+?Y(mSpD9O)K;!z|Csr0x{tP(VySqAyPuh8mg8Qu2~x&R8##akX_emG1UL9^nQLn zSyQiIC2QuxL}=_Nk`3|`YFgwMj}NtZcD3OlR403z^)~5kHkwVh$sgZHzdiVUuS##2 zrZFaub{=sI`Fm7(e;2fNa8R@n6FfHM+w5IepLDKIkh<7&7q7?+1%J{%inz$1Sj|tM z#A?7Jc2Soq82_Dr-22#bg-DG{<|Gaf;6P5dp!MnftJIh-d_+(#{XIyJl=${t29%e- zFsPg0+LTJ39%pdIqLBXLmB$5gF=l=@3Avr=C>l279{}jXs!(5{t37!PTZ2)YhX%+A`IeJ)d88JI-MoYF$dg`9-~sR?hVEahB3Q-e~AhsQoi)?M`&amO;k0qy1c}zfv&e%0Ss4W?kxHW ziYB6P7j0s(gA6&t;V#~mrp)IHCxBo4X92zw53G!SKR;H?mE}nfznV6o13@>$v>~wE zW3EC*sjUWRZgnj;x>t{>|?gvKf(Fvyiui zczN&F+>Wo>_))ioSIzLBa?#v+MrGJcO3Y>jDKg5r{1xTbQfj&)F8?n_jXF%U5&On% zAKV$RN3oTo%R&T(x#w7EH&|2rrv<+`eQ?CvvU9*}}Jm`k0{@*FaIcxRo$vJ@S0w&Z3tdg%$Q z4rB{fB?>tc1;-U%m@U36i-l^`B$hupNgq+Fzvy--j1>R#O&>qdaU@ydK!)*YV9kBx zqKA?s-oYP!*WKH)swBe!U$rYi+dPd6MhXTm8*m}t(NW^ZN6W;M01DExR;J9F?c31w zM=JA`LHwQRKo$?GpR3X~FS>rxT*@`q{ud8m)%#TO6>(ztZUNlW!FeI+4rwI8I^KvY z-b#Pzs9u%YyUWYL&Z&-`9a*&>0LPbKAxtIEs}dtF4hNqPp}TDQ^nZ@1KwzijBz5FH zCtwJs5j1RG<|MwjG8swoCI`Hc{pz3Va9HlTTe#f*s&wI?_(^unoI8dr?<{ZC7l1RE&|nl1MfOp&6VRer^N~ zz0vNj9)9@Q;RXLBaJTJR;%gaY!Oe&K^SG8bnjnZ`dxS_F*lzep%at8Dpw%|C9h!xD_uD3(HJ8lKc_JgxMk`;%;P5#t&}MZ^<3^OZC_Wv z2wA{%N^f&!=`c5#zv5j6fTr*fJJ&;4n+~QXDlFFj$ef(7u0)xPAeG^4)1loS-1B{( zU&bltU)gLxP=czTJIu--Ud|3`e)!U>27;7#Lqo5;PRY!1yyQ-E)aId3XEz9mIKDf{ z4fKyWSjv%6-+{c-w3D-QLs$`Uj*V=zb4kqW<+BM!YkSil#Z$?HHz&GC@uW!JiO*{s zb)sCs96_sS^!N92-qeKg8jPa)-UvJzu>iMXMAoytGpg!?=HGLjP;^V>I9erQ2NLWh zGQ3}#8R+tfc^BTRtPp`ZkV0jKQs0%-N;#)qtrHt zSJJ}Yk|M7ThOr>l1o)O)a!78bb8%8*Ha*1Zw=reGBh}Muq35_(D(?p2GpN9SjQexT z>W6m)5wJaXsy~<%HPbdGLcK5cH6O2z*^ynCLZVkz#v`YXiE}<$m-e+qFCdM}`JIGo zH`}KIe^1jECFT5)C`|mq77km#L$*Bfh|9$7r*`fy+pn~_W#Z`T2m7cW`3TK$SPN zv~(McAQY?}az5~?y7kL=9XLsIk3dP_DVDZPfm*}8QbcUP;vp0qG5M(P5qP+Xmn!6n z>JCbLrNYk!2WnC&GXt;TQK~EjC1U%vsjmV@V%A-`d^B|KX+oF( zbAWc=TTqEF{g9 zZLOT>#t!z+v_BJm9m3=IR?X-9iQHqQWzB8W)wc^WTf-qO0ZcIaL+}hy0YP*-jVaC6 zcRk^bjxbSkJV&}QJ0?&T-nn%;<8KrU_E2T3D52-$kqzlHFh~sDvQ?VMS*bq1S@Ksh zve<#Hov-$c-4Bq-1=&CuiIwhGxACwx1U2K&lVh8{l#96va7s-zEF7Kv(fIjS!1dn^LNM->%^aLB>C+qVv7N3`yb}_HVQ~I=b zs;D@WF0%QM8cZ1Y&Qf|!$FlJe+so;d5=D2Cldfyv_T)l|o!Pf$61jpI$Qr*t>s3XA zX;zYCT9Rg~Ue;4#@zn>0B47pzA(T7pjF;YZX=`3|;7koSde(-Tc5*3ocJZ{loMOqM zaA^L-F~;||oyVuvaU4qfdcbKXHn2tmXluQa!*YDTb>o@*4L5yyuV+)4x*3qc8m9YK zDq0^{PdR;VnKL&T@^?xftm_rYWd2mR(0MJ<+ar!iXZu3dIsD$NZ{q@_3>zEeS$?vz z;SL&IVNQ)zXL7sbHhvc?dn;S!(vzRwzp~E$o+_8`xOWIHc%)2cJMB2F z47Z`K{V_Kp52B>tEVNS5pXXM(%tQ@pQ#DW5v_T<>Rq1rdfdCzEvZ!GRssCvd)2WlU zWtKq4R1=v8HVa+(ro5>$k!pQ1TLc6&)DQ7a`;A z*C>6KIa-^K!M_Z~WckYzV_#iFxuUySQ5`qZw=yOV(po&~ZF zzB*Y;^?zmY65RUE$HVGG?SvBia*1wjx#l1;yXK`VM)|@ZRxcOk8pW}$hl^)Ye((Ni z3io&YF5YDHK+?^jH7+?vsF_e&A<+?iD{%8O|7h~u7m)J(=am&~hX3RzRlt_1ULtv` zwaQe`f?5GvxLgh$a3~|OAF&B$_>5)sXG55H8OgY9A;fHR<=Uq)P)YeoYRZ^4E1BW& zh2a-a^#|PbT*H9;R{z#4Bl+`&!{NJAA??Z)H^K`zcgTgA&$#amQ`1xt(+FuL|;RUTM2k)CasfH35Qg`hXg)&J$K8JD^E zL8VMt^0c(w^Jyz$6{=hr$%hNA;8b1oY^0mZ*6~e1U$3wKAa$wRA;?yVP8yqbIC^t=kamwL?bl>|+Td=5XRX*BJSgv$FvJ>_jZDNC|th zveo-CEuS!tew;MOW_>gd)so0D;QC2{XAQUUrK>cF(E+)B zva(_oEDHDpW~~H^9>Zm3>z}g+#+u>76GK7kvrJjM+)VdYv6<#b;IBe8`BB}3 z=6%YfPQk9Mc25YF|7hnJ`nYO?9Ih5&YGEU0f?+IKB9*&;6~;>-F^-H)p27hC>+)8< zOFgk3ZmAe!m=pQw6Pb`1i9_!STUsnXlMXl-`2xi7ftIdQZEVNYjUrkVqrIaQ8uhG1$dFW=pD*(TvX|oYa1?`^iPsZ9Hy#*$KYhs@V zi?X+8H<8O9_Tj{VF#V>yAU3QQa?xhFHQzzfbn?UO~)aGlf-(L23Jx^5=+$sgW`=(a)pRV$R@>s)?f!>jfHpo*{jt?( zR5zq481m=&bjv_DtQopKPd$*lwmNT9RqhsGkC*`GuAbk$KyVb!RRojH@>_Q6WF8Bb z=Ft`r%}<%UTsqbmc1#O7`zBcG49XWBow%A&+miuhua8X3cBmfk3 zp}3)Q=^=5E~9wvzgaJ(WAfujuiPuuXS&PZb$xg#E3vcL?$OZDO1_U8wY2(_&E8-_ zTb6U#)(rP0y$g;+_P77$gzsEBpD$Ml`J?_t)32U-xw|`)$kQ)Lc)qjS9s&4rU)f#yYZI3eYk^Ru!vi z2=7Li*yP*Wyg|%u@R42`Y}A#a#;_lwwL9 zq*>|MXkf~aswQO4Xr$>|ME%cEi{L*--`b1ueMoZB)JeV?YRu+a=p~U#r!w{DsFSeq zEp!PCb_jgU1_OgA#HOkwwwG&c*gM@Um%DwH2$M*xmYIly4)%W9;tkGEMHfX^MnU^y zik!#p!Kjuh%eQ7AOV4I?zBKX&H+zyB3P6IJWYX9Ai63*PUEh3W`%;g#?~3#zMTIP} z#9m~+V|lHcMos#b8D9d4M&5fl)BbB?O#QRy(;w(Nv>~L@-)sVt()blcl7?Vn_sWw+ z>sIPnD1$2*dlTYr)vrW6$nqG*Wy^nl-QR;%Rv;1^g(Pd@h%9gLz-{Fji14WnL0%7Z zs%;ui8ZWk)vEz`=FS_E)F0^5hVek7(I9}_Q^PSS;Fq?oq%h?-V?GN>e*cd0ek)+Zn ztu|u~p_JG&r;J^xuwa`=onKa(s@oxmH}je}!YH3~aOvF5E?2RpMUeY=;E7)uPN@Hr zUhPnFbYJ9L9^r3t;&_WX)S~MX&h^ON^?+dBZS&DXC_@^2pj}|#;F_KbOgv&8d(;>? z+d)4cdL2TCq*K+WRn-^7v$-+wOBKX2`NIcj2Wg|kxVH~{(NZ4dW4a2+deQ8Ue7$vZ zXL#Eu^hf0+uHJ?aV_H>pGFy(+-Ye~B9HFG@byWCrop?sl23gRa=ImufO%rNW`N z^=>CqhafOgC?WsVk=lSuhBvr_pU2FmWJ6eIS~6_$$gers7@ST!zWggnTwBCEbjmHV!pOvRISv$zmKJFMO2*6sveVoshYZq5zT>Q5Ns<4kz{meKcVs7jCSg$nAOK)Wx+>{ zL=2~Utg|fgM$r5Ew6-=Wu)(lCJnVn2O+N5k=$3K>R}+CilgCJUA_M)_mzZN zL8W?!URe8Q#@e}}(ML{drf8VIfj)|Xq-CZ1C*FQRM0|0TwHarL^n*RJ6|ps~^Y?`Z6X9*|NpxC-%{GTFkejE__1PgGL%n>d4AUXCFHw_??m{DHqjc6t zRJ&PPingl~hj`XT(4rmLCT`(pp8bFQh9Ik7q z+@ICDb&SFPsXrTf-N#-R=Ty_AnBqv2GZD7W#sb%IK6>+-P-*G?eo0noXb2?0ow&9d zZ)R$z_H{ojTy9`pywH#qF{yDn=zaUw6GVFEo1h|DESPGLzuD+WZ)a8d=yg3~XoXAI zO^T?+V{5o2`P2mAQCGLR#eLRxh@GRsX`TVC>B;o%ze~3COc|eVc^F~BtOmzQC?!+# zq{x;Y<-^L~^YrmhsxKQVkO^x-mUvWIZzLe`mOQ9=Jak}})He1RZI3g?pt(t=dpv=M z@B5L($&r`E>J;Ne!=6+gwCg!jcHXJw9&Z&4hn!xSJ-eMV{XO>UQ>q9hcJG-g2H8c1 zq_{-_^-yp7&l5INXny&tWV5Hq>QzMHwu&Z1JAm}@aN2T$l#4G4ce9H*3F zfHVg+9NZx0N@XQPiWpEArYBwAo#C=ZI^PkUXovhhOtAEPvA|Ac#{1%BYheasgxnXu zKvZq95Zj6v@#2-nPPc|f<09#AK1d2jwGDEv%K9-@RiRY~MW!aM*ZJaOen0VhdLE)o zW7}&eM4wx{ZAG^E{az>Hw5s@qLKu`M@pbW!cM!QtZ`Gn&j|g2oZ~PL*Zjz^Vb6MV~ z8;xwl5^v6MJ}{LVr4vKnG)H$EJ+QpGJ;x5(tWBMLad%1&3XKh}ui#qx9pmfXh=sZ=bSm!>YLs_ zvRR+BZOJC$yi6;?!hdVc{obPc2l=n%(#_s{-3yIvsdxE4Uc15gx?f{mQvI>sg>Wtj zbc!4m;$aTF8BRAn&Y$Yz_pMkW&OAW3cGQOCRPz_`>sLj1=)=)$j-y{gP>8DwP3ZZ7 zZbJR*?(Rk@@Ta^yDFn5XK;T#0b+hnX5Xuu~X`yH9)~gFl_)+H@pSWn2w#_sxw!dcC zn5{EsOkSm3atZMdoXv@DJI7tF!@e4_;Xj%jvOHg=fgt@W*w-dEgZP*Z6DcT9&&q6F zv5^-SMlxS3i(8wl<_8a8n`O00eDHCr>v@e^a zTsS8moz+b1wWT-q`IKeF?SU9bQ_X7jG<}5dXer9y^?yOV+i zuY|MQ?HeFF{umkOYFN@e-Lr%5o9!;HoI$6wn>!yzDK+@6Y};r{f&_h~WJxhc3-;T2 zRik``N1%EqZkcK-#?Vjbix6EPIH8-Y31I-$S(;yn-e>Fdf-R630mT6)wveYgdcdyvR5 zWX2h2`i>PP9~gWziJd(lKkw5~hG20wQr9$dx_?^W4({9K^Ss!tnNOHS?|H(5&bha& zl7@o&R8!MUf|=BX?X1amRxFN*c4!8Yj~B9!%cGAzZOs~6f2;bZqGf_V}k^Pyj& zT3g7jieH;u43>B7FtZ?}BeUeFvv-PW#a(Ku*kGm&ya9jQ8_SZr&h(L|&!JP~=F2&j z(p-y}mdFR@ox&FJ6mO%>1Bf<{{rH#+WqBWb%@hP87}Z)&boHdnP5El5qMxp4z|{_U z|6uU-C??YxWgq`Q5?5a;ulF$8Js_*#0{A5-n1z_^DhUlWawhPF9}#VBcF5mXr|T)m zFf7e6pt_%dCmfN`G|l4UPqDel3CA7fVT6ZM38h}C81m4eN;vD1?TfMs%5u@V7R#o- z@^FHJ&&`cOd}+i}uAvKUPpk1hPtI;UI)BzM9@~`i{B+abjSz1er~IdnEa02gM~-rv z-P(t<)AHNO{r;h3qt}sML{}*U4fQQIDUcr|eMZll%BzJVBcI7<;>|mO3F zKc(!i-#EBu((R6)`q;dZ3X-PVcw?=3tMQ|)`;Ps*j2)^*%Npc{%)G>vbNw}i>E)f;+CC!-v*tNnKNGm|Oz zCqlotGfkRX^Uws7`hK$^7k_|_X*Kz4)UR?WGrL7FRuqUP)hR-xOjp+-LNT8@c2js= znvy)P%96Zc7H^Bx-fAJ3l1ZrV+)+o>PA6NA`jVnLcA2lF>L+E>Zaxp*9Iq5Uel9)N zW|?~s*H|!G%MkD!U%^=eIqLCf_K=sUaJq28D4L1?H78zX!Xw0jz>3WwN> zRhm;seeSG?Dl4fu_hsz-!kA`ldfA#g@5M`l0X)d%x6dvS?Nm5)KFKa96EAjZ`Fqp< z+`1yH$}mcEUS<73S3>%YXfpEdIuc2*RcnA2sTWpTMK8VoYa1D6t>~kK1Qn<>bYpvN zW!JPWVJ>@1g~V+|H_2tFt)FVXB|qQzMk@x!p1*m|<97KaG-GE*v00K_EXAPA4Q<*H z;gk^5ELC@^T86e7nxtK0qHwud_8L;9>8Taa^mR8nj>~BX+tj(^^n38@m+{b|(xGkX zy~{(l0`2};qoxA}P$F;F5PK80$2XgUFXz*`kYAsK#qKH5hQP23c;>+m%#$kj zj@MJ|y>WU9L~ql=ngeN)hT?2OX`o?J-YEaohlISBQ+e=>`h=6I9p>lv8TAqVphTOp z=<(RsIK>*#sevpzmI}Nh|DF7Mg^*$%4VhSIF+n)==B~3N3n3d5q}%Lp#OfA$#=UXYB5gQ8Lm3>2%<49oVMQGUb%GYa!f{sj>tP1(=HFj{%ipJIB@=gl6 zkPSnq3<8HK_tZm#1ZJ;*ZAN)>Vp-hDX~o!QK|qsyo5J zDX$mMD%)zU`gKK5fr9oKQvX5{|3*&Wea249`pW*6W)Xo&-wN=Sf=ZLD6dN+l-EYt< zB_~A1jI_^~5ekVT%@s2<@m-nOan@0F!vro{!A1}k)(EaOp_1*}VPyA01kmF~%G;5$5EF;&7E)e$wHk zt~-+ad!!*^$+eQ>aI>qS&psr_8w>J`+>PG$qqB1*{7s>A>Sc)V5UCp_s+N79eWXOG z7{{TfkbaczL-@5aIhv48+=lmDkYJ1A;)D@fwaW!jl>JVn#n=d1{#7K{VD%8)kr zg|D6F%yz8A_{6D#5glgIs3-F6UNv6Wx33hlSkmbM(k=$cIrdt>OVR} zNF}Tv@kFa_s>$!oZM~%It8_>qST|%GK48dvI8wbsj9N2|dc7WNm?VbEWSQFYWJ@Qg zecAnZSl*8meDmi<>xzQ^+4Th7U0{^Wg*V3IdHWj#-qIH&0Ro_OG^=Os+R{RHD4>c&g@AbvdA?&9v~M$w z;S66Ln#k)A6?p^ovIybUO0n_|ChxU~-=yCWf7v`l{-whsVM-A$t;_3d z>0s^S8mUOJGH=WI=2$keV!Eeq63QKv*p1Hc_m#KIILgK}v?F8g)iUXU12Lqi%apD) zv&LEP&K1vvrb532g^Dt!9y8*%;%Jvgsz+rMmu^^7#vFb6&kj|>$EWYHLmKFZL9(sJ zi4FOXqSmF}4kbyPH&P79KLi+`JfY^2bIf?YyIgzm+9-p~; zEm1}_%}>h#re2~;0b{VO^-wAACcIO*M?`*sbohU_Uw!$7>HM!2;>|(9Xl%!TOWb;1 zjUc?w0I3&nu<~l!^C?d^?3LDf5Q32P!6n0UoKfnk`WVKwSDK{T@R1`v z5ZJU#Lfgd3c(N*D+%nDfCd;=&L+&cZG1E~?$6q@}eg8^WlE`1j$nCN|Pa1i3^mp%y zl`7#xiJbd4XX12$HEonSb+Jiw4%1K%5$Q%=?-Q0PgQ;y84!`T2=p8z~3fLaWVqS%a z6rK$S>WUsi`@kTiBf17PfBUgbKq!RN zH)o6cNbvpw7Hx-E6uA!gsa4I zZYdC_k7Kvz6+gz+6|gt^x0q?FmV5@>q;9`&>d4D@9e9M(2mHDy3)83$)KbEn1d z=7<~#81a|0w(z4Fzkavip@|;49@3Ns2$Iri=U)9wHe``W@H2JMFaPk=r2a^eoFW;3 zT)*jmX(Xi{)Cs-bH31w@gle4uK`` zCj<*qBZ1L4TVME&=cdkhb2#p-IB@h(^nd!&)h_ zkopQZUkcYz%C5py?#*MFsSdh2EdOkEoJaZ>)zJJu#6ei5UJcDQO-9o$*m?nL+thuX z+7|6!s+7^UzOexgNn__{F!FGSO)i-<=lB5?zJm&)-wtqH6(!+2S+^CrQ@u-%iFQlE zi*%8WzpO=0iuDxuZ#_R!|7gsWGzjV9D8xm$3h2)`!=uYhvXLc8sDYqx>u8-mwO3Sq zc1oILtD3JL@_VRjjJ-|cwXBR-z#$bFIK2kCsM~l_k}-!Tofa9FyD4Z-u0@SG#^UQa zL$nBU9FLP%4v9A4nu@0WO;(Z57}*A~vlV6d1*avXro5U$zgSP!O(x2})BvBtl;<=D zbsp*!S{3=K@P2&p-b16lSN;K|qfh;|6Ef$jMV3|eg=o$HP#t~9mKErC84TYG{KxI< zq9BE(V%&hgRMeuW&rb2s0g~6g<6Tts*zS6;?o4F8=dadBF%p%%2+{F)(@*UI&zY7d z=-dlFUAWC|jDY>7SiV`dq93-s3x8+BEl;;wsmTLJ_FmC?0l!{JSPm_Wmz{}wQ)Gb=|==wZ@)TC>S zLVN{h8*v=HeeayBOKOeXpdC;~ENTKc>JePd- zfcJwsR|rV-^DWy7wlF@kVr!J9zGVgK6Ce+7cQt^H~v97qR{K%jc@On(L)Cr<#^?>}l zW$ZVRhgKPRSVj0(Kxf7^N14P(RcVW90Y>uKf;2T!xYiiBxW79A>hX;u6+$(2kNmrP zBl(PC(#o^p^C<&%?&f!EM)B3NcA78kz0s4PaT8B=qW0bJs{p9YOzNHv?#W-MVQ1kS~P(%HvS@)C4i^ z&0r7V*n1m}Jut&zxn^v8Bk)XqzL8?Crl#62<{xxp+s=@h#_L|6*hgXTEDaJGnPjbj3#)X^K`k9m>XLkK%){Vn`5@ z9nvTd;BTaVd4fjM1$61(%~GKUY`=ZFKKm;gWG96XgaTiK-&0rQ`F`^Voqj<(|78a`7HCbk{6?eltpezk+DPjnRh(CGtL$D+8TopTu|UORJW zKP;jAOmrdcV$&=~8uiWE`5``_AXdcKxklmsm=6QEvdZuxZ*0N!@0CQw`AK+MJXk7V#~mv8 zoo}>e_jdQ=M#8bn3R89(AlVTSxRrlI0^ONba~~Q-F28PV{lzCNMT6j9q*C<3$1K(# z6}z#{1<(T@{%2}P+Q*I(mk<++yWhse#NyhODzoegY_0nkPJX$YR{oe;Fsh?XTQls@ zRO~S|3D%d==k1gJi)?4cRZpk!&b8rb#7RS;ZdgqJ;alAT{`R%dyttwG~U~g(h3dnwp6) zi;QM3yoH8WL*5eycqX24}H)mCh5xd8*drdbZ0 zFGC2c_?)o?QmW>j{dd-(Ps0Q+CuWA8|6?GQ0%ix9_s>@?@|fqNTyzQz67Fx7>f!Z{=1z2r ze^lGn`QYEbCad~E^gjM*GBnu`cSoPA{rdo|unrWc+a1={Fw;pbsq#HBs`nibhYO4k z@!n!T%2|Ch-#OE8y=~r^K7#-xTILneP`7oTlmv+w4`Tjn<4Xmw?eNZ$;{30ACu9u; zryGT#M*!#hzd}Xwo^FJCTb2&QL}d){rjPlYU;2OaEbLc_HS#)7#o}jVPKj`pND3+T%Aau0bRi` zot0c%T#$t*WFj-=bg+4B`>TQcVeN++o`R?FtITaBZW_F+w7JvUm=B#gm2XF-uA!EW zGlQ=?Db=PM#zX5o@oSq?zM^BL52auzH5aOrQK>J8jDKR4zVHxlOx}ycYR*Zp+&Ryv zYT}7r5Y(-#af`4Fc^iN<3Knn7nZD4dP1Ya$3caPIPmEnvGZ1ljACPe-tMYeam_H`k zJU})2ul6k+5Y6UVuuF48YeDm$YnT~_)I5sqr;H8+f;+X%XU|(i8IXI@J5pZMKeblf zG6q31*!_#H&2G))2Dpv9!@wEEo5%Iw>A7%UV@aREwO5n$?nYTl*Am^>?v|X|Bi|Ab z_-ey7D-|_Vy;!x|vEB9#zh&sL^|^}Dvhuv!(7lsMvjr}(Ug`1T@`@Y50lLuCD#lfG z>JgI^O?F_#oP}WJB+d6iMF=Y4$>(~`GYSyMtytOFqtr4hY9R#5cv4YT zFQnaT%P=|r1CGm>0kp0jOxzv(Fjh|Qkl9IF@5!~3c9{veWrx;aa;V9@Dk1jGwZD6~ zT6?>}qLSR6BQ>;xh6#Q9?_+v=lWOT?M%Dv@lzBvzI)C3QQm?#ci+hx-+T zllQfLPO9PYr;Z5Da+~g;dQF(Anh5tpgBJy7gK^7lzYlay!xDWx8xrc*Hr$$1&Ri&CC~9PJ7(Mpvrl0-I z1EKfVYtFWAKYk-{tQ=c$;INX5@t0aU8CiuqI&XRP@6Ip{V`n2)swM%7rYORI7MizX z?EBt~-ma8=Y2}`?fyA(Sb-I|%+vYHdoM>tXSHk?sy)vW(8Uo@)mZZBA>Ds?QLIL&b zMGE;_9?kmU0Krv>G^i2Z56+n@icD$5;<7h9M66}FgOk_9#L^~AUOt7_F*G4~=r#m- zLFC@2`ecJDcJ(xi2G|hoUpjtO%T+mk$3FB`v;HiMKCITTArvlSs!tv%&3*d~M@78q(*Y4KKvJekXDnq`Px;IH--v($0 z*a&}JPl(G@y!4ANr<;~1n+P8KkuG&9e8E`Se9=Rgj2yU{NTqN&2d^stH(4#)pE-vG zNBPC6e@n&JAibSq7*<~qYuOo;bv0&tepCKdKpMfUAKhWMs2(4(GKga}JTE>mj*P~3 z{Ii~5o4{ajaq!OiE5CI&vFO&NDliFec2X*@B#a_LDUSo--yRzk=X*(-A*87Pa)`el znyCBiEL{a+#-4vo%_AsswK=UMN5J`(trP<;8)ibbHvCP9MEA(Q{ZiGd7k}f+Q-)&D zqYa_A%Ts(jQIYtoLMO6Mb!<{9p-%xv=Uiw2OD0WtE&b9r460>K3RbFYz}H0Lz4M)A zgZTAFAB`o5wveb33wkxu<~cVde9?|$2Z~!ksochGI?lK4I(&Go={M)p_RLl(@j$K zS$j1jsWtZ&i(yZJq-xsl#gsOsu*uJo?Rug%(RZ@GXx@C1+5W_oijnhis>rTKJu&TW z&dorQdoP*Yf6~h)Q|s}@J$GZl21?@f>Eu;e-ROBJ&9Z_VYc|vPMZ{4-MX1Dfo@P}v ztN$CYJ?%PKj9TqeXpRP>oi7wf+o(4!qUx{{4XH=W-+W{$V$HSS<&%jmaPj$S>l0T( zMN^=kmM$q0t`rP4av+5@VN68@;$y>k$wrX19qfS8|vuk18r#*U7nQ0#iH=>M3#y^ zO;AT+9{73&4G0OD$CvSW*Fc)4W-5zD`6ttS$S3o^o8}gkF_`7}QNk z=I1h?JYX(MA#ze%|5<<){RkjpA<-z1m}XUgDq0X>&ahM#_~2i7h?S3~pc0L803CPc z!~qYxNZNRWw_EDyK z0Ur-0;9oxOxEGsmKn3Pu##iUOB}Q%bigi+C-R%uxWzv7%hjs*GuV=F04rl@xxW(l_;_$!Xv=kTNjiEYUyFA;Bhq{*pfp~Z@0%ZrZ zUY%#yQB2ufmRyQ+skp6b=xE8gO}U$$HMmSZ=eASMnjwZFco z%AOuB?;K1@09a4xq|3G)N6&QNtbGT=_BuS3aXHkx+rS*B9VW}%3F53k4~osMhVv6} z4Bl0cJMb-IQw@pt3j4f24%giuljBEc_(|i{!JtbW2)H*D@TE*aPQyIe8TXJ5l1+@V z2*NYROtB^Ox3iez(e2Ha!>NGI?DmP9t-WPsWlG%=? zU84Q~+g8mPC34$jb7g6p4!o(*__Epi=l}3V`5F%IdFk#tSobOtq9IK&yX2H%xXNK|FwW+reCKP-Y48yf z0sU2MR^qJCSsXPJZ(#U9(Vj*UE&~ECNIdx}1&r*l*%@8MjidQdr|K~bkWHTw#p6|?`g%^rw3L$UkN+SQiX5OPL$HCf<D@rB{0~<7x?A^S2p7o;^ri?cLGg$qo(Nx?X6Y1$aXpX`lTtnXe)~ zRiOwucIJkjbzkGp>md8SSEW?JcFVmQ<`GEJV`q8k(wTy6N;qH&d?_k&EJT1WuZz25 z2@6v(EO!7Q=CAsZC=A+%1OKa^*dS>&*MLOa2+yeRncQszcAxW{y6OwgI7ROk1M>Q( za@N)rgn8uNgAB#vJP=^1@FtUcSTiQ|zko1>3!7XHZd0lZlT(!f>B}V2=vl-BI{)mf z#5_DL3*T0Z4+hGqFP6$p0Bl??LJ=RzY>dEPOL=kQNv#p=Y&5|iX`-W+j^zc3f&S(z zpm9XN`&4p{3AOrI!t+H4ROZy*tfq0_5~i`Wd6iIUX{Ao4Gs((r}7g=pQ(V$lQb5K}epg;s3ipq7) zFD9Sb&6;7IPfl-8%c_qECchBY+?#!~;;Suu@TYf5l=0gwyzBMmGm<*kbaJJ8o~h=F zM&oAxZ?k4jnKa=Tlf