diff --git a/01-hello-world/index.html b/01-hello-world/index.html index 32b0d66..88f6fc3 100644 --- a/01-hello-world/index.html +++ b/01-hello-world/index.html @@ -9,15 +9,15 @@ -Hello World | Deno By Example - +Hello World | Deno By Example +
-
Skip to main content

Hello World


Introduction

Deno is design to keeping web in mind. As Deno team mentioned. Deno is to

  • Provide Secure Defaults
  • Browser compatible
  • Be able to serve HTTP efficiently

hello

Deno provide standard package std/http for working with http/https server. This includes an HTTP client and an HTTP server. In this example i will show how simple it is, to create a webserver.

Import serve from http module

import { serve } from "https://deno.land/std/http/server.ts";

Create a server instance to listen on port 8080

import { serve } from "https://deno.land/std/http/server.ts";

const server = serve({ port: 8080 });

Create request handler

examples/01_hello_world.ts
import { serve } from "https://deno.land/std/http/server.ts";

const PORT = 8080;
const server = serve({ port: PORT });
console.log(`Your server is running on http://localhost:${PORT}/`);

for await (const req of server) {
req.respond({ body: "Hello World\n" });
}

Run App:

denorun examples/01_hello_world.ts

#OR

deno run --allow-net --allow-read examples/01_hello_world.ts
note

In my first command i am using denorun. It is alias, created for dev environment. If you have't read my get started tutorial, I will recommend you to read it getting-started

Open browser at http://localhost:8080/. You will see hello world.

Breakdown:

When you create an instance of serve. It return an async generator server. We can wait forever client to connect using for-await loop. And respond to client using req.respond method. respond expects Response object.

for await (const req of server)

You can read more about async generator here.

allow-net

As mentioned earlier, Deno is build for security. By default network access is not allowed. You need to pass --allow-net as argument.

Respond a JSON

When you respond a request, by default no header is assign to response. You need to set header to response a JSON object. Let's see in example.

examples/01_hello_world.ts
import { serve, Response } from "https://deno.land/std/http/server.ts";

const PORT = 8080;
const server = serve({ port: PORT });
for await (const req of server) {
const response: Response = {}; // Create a Response instance, init with {}

response.headers = new Headers(); // Create Headers object and assign to response
response.headers.set("content-type", "application/json"); // set header as json

const body = { message: "hello world" }; // Create response body

response.body = JSON.stringify(body); // Serialize to string bytes.

req.respond(response); // respond response
}

Run App:

denorun examples/01_hello_world.ts

#OR

deno run --allow-net --allow-read examples/01_hello_world.ts

Open browser at http://localhost:8080/. You will see {"message":"hello world"}.

Breakdown: -The Response interface look like as below.

export interface Response {
status?: number;
headers?: Headers;
body?: Uint8Array | Reader | string;
trailers?: () => Promise<Headers> | Headers;
}

body can only accept Uint8Array | Reader | string. So we need to serialize the object to jSON string.

Read More:

You can go to https://deno.land/std/http to read more about http module

- +
Skip to main content

Hello World

Introduction

Deno is design to keeping web in mind. As Deno team mentioned. Deno is to

  • Provide Secure Defaults
  • Browser compatible
  • Be able to serve HTTP efficiently

hello

Deno provide standard package std/http for working with http/https server. This includes an HTTP client and an HTTP server. In this example i will show how simple it is, to create a webserver.

Import serve from http module

import { serve } from "https://deno.land/std/http/server.ts";

Create a server instance to listen on port 8080

import { serve } from "https://deno.land/std/http/server.ts";

const server = serve({ port: 8080 });

Create request handler

examples/01_hello_world.ts
import { serve } from "https://deno.land/std/http/server.ts";

const PORT = 8080;
const server = serve({ port: PORT });
console.log(`Your server is running on http://localhost:${PORT}/`);

for await (const req of server) {
req.respond({ body: "Hello World\n" });
}

Run App:

denorun examples/01_hello_world.ts

#OR

deno run --allow-net --allow-read examples/01_hello_world.ts
note

In my first command i am using denorun. It is alias, created for dev environment. If you have't read my get started tutorial, I will recommend you to read it getting-started

Open browser at http://localhost:8080/. You will see hello world.

Breakdown:

When you create an instance of serve. It return an async generator server. We can wait forever client to connect using for-await loop. And respond to client using req.respond method. respond expects Response object.

for await (const req of server)

You can read more about async generator here.

allow-net

As mentioned earlier, Deno is build for security. By default network access is not allowed. You need to pass --allow-net as argument.

Respond a JSON

When you respond a request, by default no header is assign to response. You need to set header to response a JSON object. Let's see in example.

examples/01_hello_world.ts
import { serve, Response } from "https://deno.land/std/http/server.ts";

const PORT = 8080;
const server = serve({ port: PORT });
for await (const req of server) {
const response: Response = {}; // Create a Response instance, init with {}

response.headers = new Headers(); // Create Headers object and assign to response
response.headers.set("content-type", "application/json"); // set header as json

const body = { message: "hello world" }; // Create response body

response.body = JSON.stringify(body); // Serialize to string bytes.

req.respond(response); // respond response
}

Run App:

denorun examples/01_hello_world.ts

#OR

deno run --allow-net --allow-read examples/01_hello_world.ts

Open browser at http://localhost:8080/. You will see {"message":"hello world"}.

Breakdown: +The Response interface look like as below.

export interface Response {
status?: number;
headers?: Headers;
body?: Uint8Array | Reader | string;
trailers?: () => Promise<Headers> | Headers;
}

body can only accept Uint8Array | Reader | string. So we need to serialize the object to jSON string.

Read More:

You can go to https://deno.land/std/http to read more about http module

+ \ No newline at end of file diff --git a/02-greet-from-cli/index.html b/02-greet-from-cli/index.html index fcde014..a0ea569 100644 --- a/02-greet-from-cli/index.html +++ b/02-greet-from-cli/index.html @@ -9,14 +9,14 @@ -Greet From CLI | Deno By Example - +Greet From CLI | Deno By Example +
-
Skip to main content

Greet From CLI


Taking user input can be difficult task. You can take user input as command line argument or you can read input stream(STDIN)

command line arguments

Take user input as command line arguments

Create file examples/02_greet_from_cli.ts

const { args } = Deno;

interface UserInput {
name?: string;
}

function main({ name }: UserInput) {
console.log(`Hello ${name ? name : "world"}`);
}
main({ name: args[0] });

Run Using deno run by passing name

$ deno run examples/02_greet_from_cli.ts Deepak
#[Output] Hello Deepak

$ deno run examples/02_greet_from_cli.ts
#[Output] Hello World
- +
Skip to main content

Greet From CLI

Taking user input can be difficult task. You can take user input as command line argument or you can read input stream(STDIN)

command line arguments

Take user input as command line arguments

Create file examples/02_greet_from_cli.ts

const { args } = Deno;

interface UserInput {
name?: string;
}

function main({ name }: UserInput) {
console.log(`Hello ${name ? name : "world"}`);
}
main({ name: args[0] });

Run Using deno run by passing name

$ deno run examples/02_greet_from_cli.ts Deepak
#[Output] Hello Deepak

$ deno run examples/02_greet_from_cli.ts
#[Output] Hello World
+ \ No newline at end of file diff --git a/03-numbers/index.html b/03-numbers/index.html index 5bc1be2..fe32518 100644 --- a/03-numbers/index.html +++ b/03-numbers/index.html @@ -9,14 +9,14 @@ -Numbers | Deno By Example - +Numbers | Deno By Example +
-
Skip to main content

Numbers


Since deno is supporting Typescript which is super-set of the JavaScript. It support all the syntax from the JavaScript. However, Deno is a more then that. It also support APIs for file reading and network and etc.

Here below are some examples, that explains how numbers behave in Deno[Javascript].

Gotcha

There are some Gotcha in Number as it is in JavaScript.

Sample:

function main() {
const num = 10;
const num2: number = 20; // same as above but declarative

let num3: number;
num3 = num + num2;
console.log(num3);

// num3 = num + "20" // Error, Type 'string' is not assignable to type 'number'
num3 = num + Number("20"); // No error, cast string to number
console.log(num3);

num3 = num + parseInt("20", 10); // same as above

console.log(num3);

let flt = 10.0;

console.log(flt === 10); // true

console.log(flt === 10.1); // false

console.log(typeof flt, typeof 10); //number number

console.log(typeof NaN, typeof Infinity, typeof -Infinity); // number number number

console.log(NaN === NaN); // false

console.log(1.2 + 1.8); // 3 NOT 3.0

console.log(1.2 + 1.8 === 3); // true
}
main();

Things to be noted as in JS, deno also has same number for int and float number. NaN, Infinity are some special NaN.

More:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number

How to run example:

deno run examples/03_numbers.ts
- +
Skip to main content

Numbers

Since deno is supporting Typescript which is super-set of the JavaScript. It support all the syntax from the JavaScript. However, Deno is a more then that. It also support APIs for file reading and network and etc.

Here below are some examples, that explains how numbers behave in Deno[Javascript].

Gotcha

There are some Gotcha in Number as it is in JavaScript.

Sample:

function main() {
const num = 10;
const num2: number = 20; // same as above but declarative

let num3: number;
num3 = num + num2;
console.log(num3);

// num3 = num + "20" // Error, Type 'string' is not assignable to type 'number'
num3 = num + Number("20"); // No error, cast string to number
console.log(num3);

num3 = num + parseInt("20", 10); // same as above

console.log(num3);

let flt = 10.0;

console.log(flt === 10); // true

console.log(flt === 10.1); // false

console.log(typeof flt, typeof 10); //number number

console.log(typeof NaN, typeof Infinity, typeof -Infinity); // number number number

console.log(NaN === NaN); // false

console.log(1.2 + 1.8); // 3 NOT 3.0

console.log(1.2 + 1.8 === 3); // true
}
main();

Things to be noted as in JS, deno also has same number for int and float number. NaN, Infinity are some special NaN.

More:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number

How to run example:

deno run examples/03_numbers.ts
+ \ No newline at end of file diff --git a/05-variables-constants/index.html b/05-variables-constants/index.html index e953980..84c9db5 100644 --- a/05-variables-constants/index.html +++ b/05-variables-constants/index.html @@ -9,14 +9,14 @@ -Variables and Constants | Deno By Example - +Variables and Constants | Deno By Example +
-
Skip to main content

Variables and Constants


variables

Constant can be created using const and variable can be created using let.

Sample:

function main() {
const constant = 10;
// constant = 12 // Error, Cannot assign to 'constant' because it is a constant.
console.log(constant);
const object = {
name: "deepak",
};
object.name = "updated"; // No Error in updating property

// object = {} // Error, Cannot assign to 'object' because it is a constant.
// Cant change reference

// Same for Array

const array = [10, 12];
array[0] = 12;

// array = [] // Error
// Cant change reference

let variable = 10;
variable = 12; // No issue

let arrVar = [12];
arrVar = [];
}
main();

More:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const

How to run example:

deno run examples/05_variables_constants.ts
- +
Skip to main content

Variables and Constants

variables

Constant can be created using const and variable can be created using let.

Sample:

function main() {
const constant = 10;
// constant = 12 // Error, Cannot assign to 'constant' because it is a constant.
console.log(constant);
const object = {
name: "deepak",
};
object.name = "updated"; // No Error in updating property

// object = {} // Error, Cannot assign to 'object' because it is a constant.
// Cant change reference

// Same for Array

const array = [10, 12];
array[0] = 12;

// array = [] // Error
// Cant change reference

let variable = 10;
variable = 12; // No issue

let arrVar = [12];
arrVar = [];
}
main();

More:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const

How to run example:

deno run examples/05_variables_constants.ts
+ \ No newline at end of file diff --git a/404.html b/404.html index 348d2a3..3dadbb6 100644 --- a/404.html +++ b/404.html @@ -9,14 +9,14 @@ -Page Not Found | Deno By Example - +Page Not Found | Deno By Example +
Skip to main content

Page Not Found

We could not find what you were looking for.

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

- + \ No newline at end of file diff --git a/advanced-cli-minifind/index.html b/advanced-cli-minifind/index.html index 205b5bd..19d5554 100644 --- a/advanced-cli-minifind/index.html +++ b/advanced-cli-minifind/index.html @@ -9,14 +9,14 @@ -Build a CLI tool | Deno CLI minifind | Deno By Example - +Build a CLI tool | Deno CLI minifind | Deno By Example +
-
Skip to main content

Build a CLI tool | Deno CLI minifind


find

We have seen how to create a Greeting CLI in another tutorial. Now we will extend our knowledge and create a full-fledged CLI which will be partially clone of Mac/Unix find.

Creating CLI required below mentioned features:

  1. Input command arguments parser
  2. Traverse files and directory trees
  3. Filter files/directory based on the arguments
  4. Logger, better logging information

1. Input command arguments parser

Taking arguments in Deno is very easy. Every process has Deno.args, which returns arguments passed to the program.

examples/minifind.ts
async function main(args: string[]) {
console.log(args);
}
main(Deno.args);

Run:

deno run examples/minifind.ts param1 param2

Output:

[ "param1", "param2" ]

Deno.args returns array of the string passed to the program(examples/minifind.ts).

Our CLI expects params like type, name, and help. To get the value of these parameters. We need to parse arguments. Deno has flags module which help to parse and collect parameters. Let's add parser.

examples/minifind.ts
import { parse } from "https://deno.land/std/flags/mod.ts";

async function main(args: string[]) {
const {
type,
name,
not,
help,
_: [dir = "."],
} = parse(args);

console.log({
type,
name,
not,
help,
dir,
});
}
main(Deno.args);

Run:

deno run examples/minifind.ts --help --type=f --type=d --name=".*\.ts" examples

Output:

{ type: [ "f", "d" ], name: ".*\.ts", not: undefined, help: true, dir: "examples" }

When you run the program with a given example, You will see the output as above. Deno parse helps you to collect all the arguments.

I have used the ES6 de-structuring feature to assign default values.

info

Deno parse automatically tries to collect and combine params based on patterns. Any argument pass as prefixing --, considered as arguments with value. If you don't pass value next to it. It will become boolean.

example1:

console.log(parse(["--test", "t"])); // { _: [], test: "t" }
console.log(parse(["--test"])); // { _: [], test: true }
note

Things to be noted: If you pass an argument with the same param more then once. parse combine them in array. In the above example type is passed twice. That is why, type has value [ "f", "d" ].

example2:

console.log(parse(["--test", "t", "--test", "t2"])); // { _: [], test: [ "t", "t2" ] }
note

underscore(_) here is like a collection of rest params. If arguments do not follow the standard -- or - prefix. All arguments collected in _ as an array of data. We are extracting dir as the directory name from rest _.

example3:

const { _ } = parse(["--test", "t", "examples"]);
console.log(_); // _ == [ "examples" ]
const [dir = "."] = _;
console.log(dir); // examples

For more info read: https://deno.land/std/flags

2. Traverse files and directory trees

Since now we have arguments parsed, let's add some logic to read the directory.

The first thing we can do, We can resolve the path or directory where files need to be searched. We can use the resolve method from path module.

examples/minifind.ts
import { parse } from "https://deno.land/std/flags/mod.ts";
import { resolve } from "https://deno.land/std/path/mod.ts";

async function main(args: string[]) {
const {
type,
name,
not,
help,
_: [dir = "."],
} = parse(args);
const dirFullPath = resolve(Deno.cwd(), String(dir));
console.log(dirFullPath);
}
main(Deno.args);

Run:

deno run -A examples/minifind.ts examples

Output:

/Users/xdeepakv/github/deno-by-example/examples

note

resolve require --allow-read permission. For the time being, I have given all permission passing flag -A. you can read more about permissions

Deno.cwd() is used to get current running path. We had to convert dir as a string. Since parse can convert it to string | number based on the input type.

Reading a directory can be done using Deno.readDir. But we are traversing the entire tree of directories and files. Writing the traverse method can be tricky. You can try by yourself.

Here, I will take the help of walk function from https://deno.land/std/fs/mod.ts.

examples/minifind.ts
import { parse } from "https://deno.land/std/flags/mod.ts";
import { resolve } from "https://deno.land/std/path/mod.ts";
import { walk } from "https://deno.land/std/fs/mod.ts";

async function main(args: string[]) {
const {
type,
name,
not,
help,
_: [dir = "."],
} = parse(args);
const dirFullPath = resolve(Deno.cwd(), String(dir));
for await (let entry of walk(dirFullPath)) {
console.log(entry);
}
}
main(Deno.args);

Run:

deno run -A --unstable examples/minifind.ts examples

Output:

{
path: "/Users/xdeepakv/github/deno-by-example/examples/sample_employee.csv",
name: "sample_employee.csv",
isFile: true,
isDirectory: false,
isSymlink: false
}
{
path: "/Users/xdeepakv/github/deno-by-example/examples/06_readfile_chunk.ts",
name: "06_readfile_chunk.ts",
isFile: true,
isDirectory: false,
isSymlink: false
}
note

Since walk function is not a stable function. We have to use --unstable flag while running the example.

Walk function returns an async generator of entries. Each entries have name and path along with other flags like isDirectory and isFile.

Nice: The toughest part has been done. Now we can read entire directories along with files in it.

3. Filter files/directory based on the arguments

Walk function accepts WalkOptions as the second argument. We can use this option to add our logic.

Interface:

WalkOptions
export interface WalkOptions {
maxDepth?: number;
includeFiles?: boolean;
includeDirs?: boolean;
followSymlinks?: boolean;
exts?: string[];
match?: RegExp[];
skip?: RegExp[];
}
examples/minifind.ts
// rest of the code
async function main(args: string[]) {
// rest of the code
const dirFullPath = resolve(Deno.cwd(), String(dir));
let includeFiles = true;
let includeDirs = true;
let types = type ? (Array.isArray(type) ? type : [type]) : ["f", "d"];
if (!types.includes("f")) {
includeFiles = false;
}
if (!types.includes("d")) {
includeDirs = false;
}
const options = {
maxDepth: 2,
includeFiles,
includeDirs,
followSymlinks: false,
skip: [/node_modules/g],
};
for await (const entry of walk(dirFullPath, options)) {
console.log(entry.path);
}
}
main(Deno.args);

Run:

deno run -A --unstable examples/minifind.ts examples

Output:

/Users/xdeepakv/github/deno-by-example/examples
/Users/xdeepakv/github/deno-by-example/examples/subfolder
/Users/xdeepakv/github/deno-by-example/examples/subfolder/dummy.ts

The default type would include both file and dir ["f","d"] . Users can pass flag --type=f and --type=d to override behavior.

Run- Dirs only:

deno run -A --unstable examples/minifind.ts --type=d examples

Run- Files only:

deno run -A --unstable examples/minifind.ts --type=f examples

WalkOptions supports regexp to include and exclude patterns. We can use this to filter entries by name.

examples/minifind.ts
/// rest of the code

async function main(args: string[]) {
/// rest of the code

let matchRegexps: RegExp[] | undefined = name
? (Array.isArray(name) ? name : [name]).map(
(reg: string) => new RegExp(reg)
)
: undefined;
const options = {
maxDepth: 2,
includeFiles,
includeDirs,
followSymlinks: false,
match: matchRegexps,
skip: [/node_modules/g],
};
for await (const entry of walk(dirFullPath, options)) {
console.log(entry.path);
}
}
main(Deno.args);

Run- Get all file name has logger in it:

deno run -A --unstable examples/minifind.ts --type=f --name=".*logger.*" examples

Now we have working minifind. Noice!

4. Logger, better logging information

The last missing piece is to tell your user about your CLI. For that, we have add helping messages for users. I am using logger-util created by me. You can read more herehttps://deno.land/x/deno_util.

examples/minifind.ts
/// rest of the code
import { Logger } from "https://deno.land/x/deno_util/logger.ts";

const usesFormat = `Uses:\n\n minifind %s`;
const logger = new Logger();

function printHelp(command: string) {
logger.info(`Welcome to minifind [v%s]`, "1.0.0");
logger.warn(usesFormat, command);
}
async function main(args: string[]) {
/// rest of the code

if (help) {
printHelp(`--type=f --name=".*logger.*" --help examples`);
Deno.exit(0);
}

/// rest of the code

for await (const entry of walk(dirFullPath, options)) {
logger.inverse(entry.path);
}
}
main(Deno.args);

Run with help:

deno run -A --unstable examples/minifind.ts --help

Output:

minifind 1

Run with other options:

deno run -A --unstable examples/minifind.ts --help

Output:

minifind 1

TaDa! 👏👏 Now you know how to create a CLI.

Bonus

Now we have working minifind CLI. However, we had to use deno run and filename to run the command, which is not intended/feasible. Deno provides install command. We can convert any program to an executable tool.

Let's convert our minifind to executable. It is very simple.

deno install -f --allow-read --unstable examples/minifind.ts

Once you run above command you will see output like:

Add /Users/xdeepakv/.deno/bin to PATH
export PATH="/Users/xdeepakv/.deno/bin:$PATH"

If you see that, Just add export PATH="/Users/xdeepakv/.deno/bin:$PATH" this line to you .bashrc or .bash_profile(Depending upon your OS type). Once you add .deno/bin in PATH. Open a new terminal and try below mention command.

minifind --type=f --name=".*logger.*" examples

Now your minifind is ready to use product. :-)

I hope you like this tutorial. let me know your feedback in the comment. Please support(🙏🙏) by subscribing and clapping on https://deepak-v.medium.com/.

All working examples can be found in my Github: https://github.com/deepakshrma/deno-by-example/tree/master/examples

- +
Skip to main content

Build a CLI tool | Deno CLI minifind

find

We have seen how to create a Greeting CLI in another tutorial. Now we will extend our knowledge and create a full-fledged CLI which will be partially clone of Mac/Unix find.

Creating CLI required below mentioned features:

  1. Input command arguments parser
  2. Traverse files and directory trees
  3. Filter files/directory based on the arguments
  4. Logger, better logging information

1. Input command arguments parser

Taking arguments in Deno is very easy. Every process has Deno.args, which returns arguments passed to the program.

examples/minifind.ts
async function main(args: string[]) {
console.log(args);
}
main(Deno.args);

Run:

deno run examples/minifind.ts param1 param2

Output:

[ "param1", "param2" ]

Deno.args returns array of the string passed to the program(examples/minifind.ts).

Our CLI expects params like type, name, and help. To get the value of these parameters. We need to parse arguments. Deno has flags module which help to parse and collect parameters. Let's add parser.

examples/minifind.ts
import { parse } from "https://deno.land/std/flags/mod.ts";

async function main(args: string[]) {
const {
type,
name,
not,
help,
_: [dir = "."],
} = parse(args);

console.log({
type,
name,
not,
help,
dir,
});
}
main(Deno.args);

Run:

deno run examples/minifind.ts --help --type=f --type=d --name=".*\.ts" examples

Output:

{ type: [ "f", "d" ], name: ".*\.ts", not: undefined, help: true, dir: "examples" }

When you run the program with a given example, You will see the output as above. Deno parse helps you to collect all the arguments.

I have used the ES6 de-structuring feature to assign default values.

info

Deno parse automatically tries to collect and combine params based on patterns. Any argument pass as prefixing --, considered as arguments with value. If you don't pass value next to it. It will become boolean.

example1:

console.log(parse(["--test", "t"])); // { _: [], test: "t" }
console.log(parse(["--test"])); // { _: [], test: true }
note

Things to be noted: If you pass an argument with the same param more then once. parse combine them in array. In the above example type is passed twice. That is why, type has value [ "f", "d" ].

example2:

console.log(parse(["--test", "t", "--test", "t2"])); // { _: [], test: [ "t", "t2" ] }
note

underscore(_) here is like a collection of rest params. If arguments do not follow the standard -- or - prefix. All arguments collected in _ as an array of data. We are extracting dir as the directory name from rest _.

example3:

const { _ } = parse(["--test", "t", "examples"]);
console.log(_); // _ == [ "examples" ]
const [dir = "."] = _;
console.log(dir); // examples

For more info read: https://deno.land/std/flags

2. Traverse files and directory trees

Since now we have arguments parsed, let's add some logic to read the directory.

The first thing we can do, We can resolve the path or directory where files need to be searched. We can use the resolve method from path module.

examples/minifind.ts
import { parse } from "https://deno.land/std/flags/mod.ts";
import { resolve } from "https://deno.land/std/path/mod.ts";

async function main(args: string[]) {
const {
type,
name,
not,
help,
_: [dir = "."],
} = parse(args);
const dirFullPath = resolve(Deno.cwd(), String(dir));
console.log(dirFullPath);
}
main(Deno.args);

Run:

deno run -A examples/minifind.ts examples

Output:

/Users/xdeepakv/github/deno-by-example/examples

note

resolve require --allow-read permission. For the time being, I have given all permission passing flag -A. you can read more about permissions

Deno.cwd() is used to get current running path. We had to convert dir as a string. Since parse can convert it to string | number based on the input type.

Reading a directory can be done using Deno.readDir. But we are traversing the entire tree of directories and files. Writing the traverse method can be tricky. You can try by yourself.

Here, I will take the help of walk function from https://deno.land/std/fs/mod.ts.

examples/minifind.ts
import { parse } from "https://deno.land/std/flags/mod.ts";
import { resolve } from "https://deno.land/std/path/mod.ts";
import { walk } from "https://deno.land/std/fs/mod.ts";

async function main(args: string[]) {
const {
type,
name,
not,
help,
_: [dir = "."],
} = parse(args);
const dirFullPath = resolve(Deno.cwd(), String(dir));
for await (let entry of walk(dirFullPath)) {
console.log(entry);
}
}
main(Deno.args);

Run:

deno run -A --unstable examples/minifind.ts examples

Output:

{
path: "/Users/xdeepakv/github/deno-by-example/examples/sample_employee.csv",
name: "sample_employee.csv",
isFile: true,
isDirectory: false,
isSymlink: false
}
{
path: "/Users/xdeepakv/github/deno-by-example/examples/06_readfile_chunk.ts",
name: "06_readfile_chunk.ts",
isFile: true,
isDirectory: false,
isSymlink: false
}
note

Since walk function is not a stable function. We have to use --unstable flag while running the example.

Walk function returns an async generator of entries. Each entries have name and path along with other flags like isDirectory and isFile.

Nice: The toughest part has been done. Now we can read entire directories along with files in it.

3. Filter files/directory based on the arguments

Walk function accepts WalkOptions as the second argument. We can use this option to add our logic.

Interface:

WalkOptions
export interface WalkOptions {
maxDepth?: number;
includeFiles?: boolean;
includeDirs?: boolean;
followSymlinks?: boolean;
exts?: string[];
match?: RegExp[];
skip?: RegExp[];
}
examples/minifind.ts
// rest of the code
async function main(args: string[]) {
// rest of the code
const dirFullPath = resolve(Deno.cwd(), String(dir));
let includeFiles = true;
let includeDirs = true;
let types = type ? (Array.isArray(type) ? type : [type]) : ["f", "d"];
if (!types.includes("f")) {
includeFiles = false;
}
if (!types.includes("d")) {
includeDirs = false;
}
const options = {
maxDepth: 2,
includeFiles,
includeDirs,
followSymlinks: false,
skip: [/node_modules/g],
};
for await (const entry of walk(dirFullPath, options)) {
console.log(entry.path);
}
}
main(Deno.args);

Run:

deno run -A --unstable examples/minifind.ts examples

Output:

/Users/xdeepakv/github/deno-by-example/examples
/Users/xdeepakv/github/deno-by-example/examples/subfolder
/Users/xdeepakv/github/deno-by-example/examples/subfolder/dummy.ts

The default type would include both file and dir ["f","d"] . Users can pass flag --type=f and --type=d to override behavior.

Run- Dirs only:

deno run -A --unstable examples/minifind.ts --type=d examples

Run- Files only:

deno run -A --unstable examples/minifind.ts --type=f examples

WalkOptions supports regexp to include and exclude patterns. We can use this to filter entries by name.

examples/minifind.ts
/// rest of the code

async function main(args: string[]) {
/// rest of the code

let matchRegexps: RegExp[] | undefined = name
? (Array.isArray(name) ? name : [name]).map(
(reg: string) => new RegExp(reg)
)
: undefined;
const options = {
maxDepth: 2,
includeFiles,
includeDirs,
followSymlinks: false,
match: matchRegexps,
skip: [/node_modules/g],
};
for await (const entry of walk(dirFullPath, options)) {
console.log(entry.path);
}
}
main(Deno.args);

Run- Get all file name has logger in it:

deno run -A --unstable examples/minifind.ts --type=f --name=".*logger.*" examples

Now we have working minifind. Noice!

4. Logger, better logging information

The last missing piece is to tell your user about your CLI. For that, we have add helping messages for users. I am using logger-util created by me. You can read more herehttps://deno.land/x/deno_util.

examples/minifind.ts
/// rest of the code
import { Logger } from "https://deno.land/x/deno_util/logger.ts";

const usesFormat = `Uses:\n\n minifind %s`;
const logger = new Logger();

function printHelp(command: string) {
logger.info(`Welcome to minifind [v%s]`, "1.0.0");
logger.warn(usesFormat, command);
}
async function main(args: string[]) {
/// rest of the code

if (help) {
printHelp(`--type=f --name=".*logger.*" --help examples`);
Deno.exit(0);
}

/// rest of the code

for await (const entry of walk(dirFullPath, options)) {
logger.inverse(entry.path);
}
}
main(Deno.args);

Run with help:

deno run -A --unstable examples/minifind.ts --help

Output:

minifind 1

Run with other options:

deno run -A --unstable examples/minifind.ts --help

Output:

minifind 1

TaDa! 👏👏 Now you know how to create a CLI.

Bonus

Now we have working minifind CLI. However, we had to use deno run and filename to run the command, which is not intended/feasible. Deno provides install command. We can convert any program to an executable tool.

Let's convert our minifind to executable. It is very simple.

deno install -f --allow-read --unstable examples/minifind.ts

Once you run above command you will see output like:

Add /Users/xdeepakv/.deno/bin to PATH
export PATH="/Users/xdeepakv/.deno/bin:$PATH"

If you see that, Just add export PATH="/Users/xdeepakv/.deno/bin:$PATH" this line to you .bashrc or .bash_profile(Depending upon your OS type). Once you add .deno/bin in PATH. Open a new terminal and try below mention command.

minifind --type=f --name=".*logger.*" examples

Now your minifind is ready to use product. :-)

I hope you like this tutorial. let me know your feedback in the comment. Please support(🙏🙏) by subscribing and clapping on https://deepak-v.medium.com/.

All working examples can be found in my Github: https://github.com/deepakshrma/deno-by-example/tree/master/examples

+ \ No newline at end of file diff --git a/advanced-graphql/index.html b/advanced-graphql/index.html index 8f08cf2..e8a20b9 100644 --- a/advanced-graphql/index.html +++ b/advanced-graphql/index.html @@ -9,15 +9,15 @@ -Build a GraphQL Server (From Scratch) | Deno Advanced | Deno By Example - +Build a GraphQL Server (From Scratch) | Deno Advanced | Deno By Example +
-
Skip to main content

Build a GraphQL Server (From Scratch) | Deno Advanced


Introduction

GraphQL is already known for its good things. GraphQL helps to build super scalable APIs. It reduces coupling between code and data provider. Deno is one of the fastest-growing frameworks/languages to build APIs. However, Deno community still new. So there is a very little framework in the Deno community. Some of them are in a very early stage of development.

In this article, I will explain how you can easily integrate the GraphQL nodejs module with Deno lang. This is a very basic implementation. However, Still, there is a lot of scope for improvements. This is not the end. This is just beginning.

Prerequisite

Steps

1. Basic project directory setup

First, create folders and file as described below.

sample 1

mkdir  src
mkdir src/model src/resolvers src/routes src/schema
touch README.md scripts.yaml src/server.ts

## Optional
mkdir .vscode
touch .vscode/settings.json

Here, src will be the directory containing all code. model is to hold all the database/models. We will create all resolvers in resolvers directory. Similarly, routes and schema to keep routes and schemas respectively. src/server.ts will be an entry for the server to start with.

2. Velociraptor as script runner

Deno does not have a task runner like npm. However, in Deno community, There are lots of modules we can use. I like Velociraptor. It is easy to start with an easy to integrate.

## You can check the current version.
deno install -qA -n vr https://deno.land/x/velociraptor@1.0.0-beta.16/cli.tscl

Once you install velociraptor using deno, It will be available as executable as vr. You can try to validate using vr --version. It will print the current version of the velociraptor.

Let's add basic scripts in src/server.ts

allow:
- net
- read
- env

scripts:
start:
cmd: deno run src/server.ts
test: "echo 'No Test Found'"
build: deno compile --unstable --allow-read --allow-net src/server.ts
Tips

velociraptor supports JSON, yaml and many more formats. I like yaml version cool so I am using it.

Explained:

  • allow to allow net, read, and env permission to Deno executable
  • scripts to add command.

Let's add basic hello world sever in server.ts

3. Basic server using Oak

We are going to use Oak to build our backend server. It is the most stable and community supported module out there.

src/server.ts
import { Application } from "https://deno.land/x/oak/mod.ts";
import { config } from "https://deno.land/x/dotenv/mod.ts";
import { Logger, LoggerOptions } from "https://deno.land/x/deno_util/logger.ts";

const initialOptions = { level: 0, format: "%s", newLine: true };
const logger = new Logger(initialOptions as LoggerOptions);
const { PORT = 4000 } = config({ safe: true });

const app = new Application();
app.use((cxt) => {
cxt.response.body = "Hello GraphQL";
});

logger.line(`🚀 Server is running on http://localhost:${PORT}/graphql`);
await app.listen({ port: Number(PORT) });

Run:

vr start

Output:

==========================================================
|| 🚀 Server is running on http://localhost:4000/graphql
==========================================================
info

You may get a pop-up to allow network access to Deno when you try to run the server.

Explained:

  • Import oak module to create an Application.
  • dotevn to allow create environmental variable.
  • deno_util to create a basic logger.
  • app.use to create basic route. Currently, It will respond Hello GraphQL to every request.

4. Basic mock database

Since the purpose of this tutorial is not to teach you how to bind database and all. So we will mock the database as close as a real app.

Create a database.ts file touch src/model/database.ts

src/model/database.ts
const users = [
{
_id: "6027d46771b8a91a27bc9e13",
index: 0,
guid: "b0b80419-58a5-42ac-b488-b7c87a66f9f7",
isActive: true,
balance: "$3,095.41",
picture: "http://placehold.it/32x32",
age: 26,
name: "Hickman Beach",
gender: "male",
email: "hickmanbeach@vidto.com",
phone: "+1 (980) 401-2407",
address: "489 Canda Avenue, Buxton, Tennessee, 252",
about: "lorem..",
registered: "2020-11-16T10:40:17 -08:00",
friends: [
{
id: 0,
name: "Franklin Gentry",
},
],
},
];

export interface Friend {
id: number;
name: string;
}

export interface User {
_id: string;
index: number;
guid: string;
isActive: boolean;
balance: string;
picture: string;
age: number;
name: string;
gender: string;
email: string;
phone: string;
address: string;
about: string;
registered: string;
friends: Friend[];
}

export const getUsers = async (predicate?: (user: User) => boolean) => {
if (typeof predicate === "function") return users.filter(predicate);
return users;
};
note

You can get the whole file in github repo.

Explained:

A very basic mock database with getUsers method, which returns users based on a predicate. If there is no predicate, It will return all users else apply a filter using a predicate.

5. Create a /graphql endpoint to handle graphql POST request

GraphQL specs support POST to query server. We will use the same. To create a scalable routing. We will create our route in the routes folder and append it in Oak Application using the callback function.

Create files touch src/routes/index.ts src/routes/graphql.ts

Let's create gqlrouter

src/routes/graphql.ts
import { Router } from "https://deno.land/x/oak/mod.ts";

const gqlrouter = new Router();
gqlrouter
.get("/graphql", (context) => {
context.response.body = "Please use Post to Query";
})
.post("/graphql", async (context) => {
const result = context.request.body();
if (result.type === "json") {
const { query, variables = {} } = await result.value;
if (query) {
context.response.body = { query, variables };
} else {
context.response.body = { message: "Invalid Query" };
context.response.status = 400;
}
}
});

export default gqlrouter;

Let's update index.ts to append routes to Server.

src/routes/index.ts
import {
Application,
Middleware,
Router,
} from "https://deno.land/x/oak/mod.ts";
import { requestTraceMiddleware } from "https://deno.land/x/oak_middlewares/mod.ts";
import gqlrouter from "./graphql.ts";
const baseRoute = new Router();

baseRoute.get("/", (context) => {
context.response.body = `<b>Please use <a href="/graphql">/graphql</a> to query</b>`;
context.response.headers.append("Content-Type", "text/html; charset=UTF-8");
});

export default function init(app: Application) {
app.use(
requestTraceMiddleware<Middleware>({ type: "combined" })
);
app.use(baseRoute.routes());
app.use(gqlrouter.routes());
app.use(gqlrouter.allowedMethods());
}

Explained:

  • graphql.ts, We have just created an instance of Oak route. It can accept a get request and a post request at endpoint "/graphql".
  • All the GraphQL request contains query and variables as data payload.
  • Currently, return query and variables in return response.
  • index.ts to combine routes and apply some other middleware to Oak Application.

Let's update our server.ts

src/server.ts
/// Rest of the code...
import init from "./routes/index.ts";

const app = new Application();
init(app);

/// Rest of the code...

Run: -vr run start

Query using Postman:

sample 2

Query using CURL:

curl --location --request POST 'http://localhost:4000/graphql' \
--header 'Content-Type: application/json' \
--data-raw '{"query":"query HelloWorld {\n hello {\n name\n }\n}","variables":{"name":"Hickman"}}'

Output:

{
"query": "query HelloWorld {\n hello {\n name\n }\n}",
"variables": {
"name": "Hickman"
}
}

6. Create GraphQL schema and resolver

GraphQL Executor requires schema and resolver to execute the query. For that, we need to create schema and resolver. Schema can be written in String and compile to code using buildSchema helper method. Resolvers are basic functions, will be called by graphql executor, and act on the query.

To use GraphQL Executor we have to install/use graphql module from cdn.skypack.dev

src/schema/user.ts
const UserSchema = `
type Friends {
id: Int
name: String
}

type User {
_id: String
index: Int
guid: String
isActive: Boolean
balance: String
picture: String
age: Int
name: String
gender: String
email: String
phone: String
address: String
about: String
registered: String
friends: [Friends]
}
`;
export default UserSchema;
src/schema/index.ts
import { buildSchema } from "https://cdn.skypack.dev/graphql";
import UserSchema from "./user.ts";
const base = `
type Query {
hello: String
users(name: String): [User]
}
`;
export default buildSchema([base, UserSchema].join("\n"), {});

Explained:

note

Currently, graphql does not support multi-file schema(Query). So we have to write all queries in index.ts. Hopefully, In future, we can use graphql tools.

Let's create resolvers for users and hello query

src/resolvers/hello_world.ts
const HelloResolver = {
Query: {
hello: async (_: any, { name }: any = {}, context: any, z: any) => {
return "Hello world!";
},
},
};
export default HelloResolver;
src/resolvers/user.ts
import { getUsers } from "../model/database.ts";

const UserResolver = {
Query: {
users: async (d: any = {}, context: any) => {
return getUsers(d.name ? (u: any) => u.name.includes(d.name) : undefined);
},
},
};
export default UserResolver;
src/resolvers/index.ts
import HelloResolver from "./hello_world.ts";
import UserResolver from "./user.ts";

const resolvers = Object.assign(
{},
...[HelloResolver, UserResolver].map((x) => x.Query)
);
export default resolvers;

Explained:

  • user.ts and hello.ts contains an object with Query in it. The query has the function same name as it is defined in GraphQL Schema.
  • index.ts accumulate all the resolvers.

7. Route to handle Query and execute

Now we have created schema and resolver function. We can handle GraphQL requests and responses to the query. For that, we need to update our src/routes/graphql.ts.

src/routes/graphql.ts
import { Router } from "https://deno.land/x/oak/mod.ts";
import { graphql } from "https://cdn.skypack.dev/graphql";
import schema from "../schema/index.ts";
import resolvers from "../resolvers/index.ts";

const gqlrouter = new Router();
gqlrouter
.get("/graphql", (context) => {
context.response.body = "Please use Post to Query";
})
.post("/graphql", async (context) => {
const result = context.request.body();
if (result.type === "json") {
const { query, variables = {} } = await result.value;
if (query) {
const data = await (graphql as any)(
schema,
query,
resolvers,
{
request: context.request,
response: context.response,
},
variables || {}
);
if (data.errors) {
context.response.body = data;
context.response.status = 400;
} else {
context.response.body = data;
}
} else {
context.response.body = { message: "Invalid Query" };
context.response.status = 400;
}
}
});

export default gqlrouter;

Query using Postman:

sample 2

Query using CURL:

curl --location --request POST 'http://localhost:4000/graphql' \
--header 'Content-Type: application/json' \
--data-raw '{"query":"query User($name: String){\n users(name: $name) {\n name\n age\n }\n}","variables":{"name":"Hickman"}}'

Output:

{
"data": {
"users": [
{
"name": "Hickman Beach",
"age": 26
}
]
}
}

Congrats, Your GraphQL Server is ready to serve(🚀) the request.

Limitations

As I mentioned earlier, Deno is still very new and the community is also very new. The above app has a lot of limitations. However, We shouldn't stop exploring it. Some of the limitations are highlighted below.

  • Support for multiple Query/Aliases
  • Merge Schema from multiple files
  • Conflict in resolvers
  • Validations and Proper Error Handling

Source Code

deno-graphql-starter

I hope you like this tutorial. let me know your feedback in the comment. Please support(🙏🙏) by subscribing and clapping on https://deepak-v.medium.com/.

- +
Skip to main content

Build a GraphQL Server (From Scratch) | Deno Advanced

Introduction

GraphQL is already known for its good things. GraphQL helps to build super scalable APIs. It reduces coupling between code and data provider. Deno is one of the fastest-growing frameworks/languages to build APIs. However, Deno community still new. So there is a very little framework in the Deno community. Some of them are in a very early stage of development.

In this article, I will explain how you can easily integrate the GraphQL nodejs module with Deno lang. This is a very basic implementation. However, Still, there is a lot of scope for improvements. This is not the end. This is just beginning.

Prerequisite

Steps

1. Basic project directory setup

First, create folders and file as described below.

sample 1

mkdir  src
mkdir src/model src/resolvers src/routes src/schema
touch README.md scripts.yaml src/server.ts

## Optional
mkdir .vscode
touch .vscode/settings.json

Here, src will be the directory containing all code. model is to hold all the database/models. We will create all resolvers in resolvers directory. Similarly, routes and schema to keep routes and schemas respectively. src/server.ts will be an entry for the server to start with.

2. Velociraptor as script runner

Deno does not have a task runner like npm. However, in Deno community, There are lots of modules we can use. I like Velociraptor. It is easy to start with an easy to integrate.

## You can check the current version.
deno install -qA -n vr https://deno.land/x/velociraptor@1.0.0-beta.16/cli.tscl

Once you install velociraptor using deno, It will be available as executable as vr. You can try to validate using vr --version. It will print the current version of the velociraptor.

Let's add basic scripts in src/server.ts

allow:
- net
- read
- env

scripts:
start:
cmd: deno run src/server.ts
test: "echo 'No Test Found'"
build: deno compile --unstable --allow-read --allow-net src/server.ts
Tips

velociraptor supports JSON, yaml and many more formats. I like yaml version cool so I am using it.

Explained:

  • allow to allow net, read, and env permission to Deno executable
  • scripts to add command.

Let's add basic hello world sever in server.ts

3. Basic server using Oak

We are going to use Oak to build our backend server. It is the most stable and community supported module out there.

src/server.ts
import { Application } from "https://deno.land/x/oak/mod.ts";
import { config } from "https://deno.land/x/dotenv/mod.ts";
import { Logger, LoggerOptions } from "https://deno.land/x/deno_util/logger.ts";

const initialOptions = { level: 0, format: "%s", newLine: true };
const logger = new Logger(initialOptions as LoggerOptions);
const { PORT = 4000 } = config({ safe: true });

const app = new Application();
app.use((cxt) => {
cxt.response.body = "Hello GraphQL";
});

logger.line(`🚀 Server is running on http://localhost:${PORT}/graphql`);
await app.listen({ port: Number(PORT) });

Run:

vr start

Output:

==========================================================
|| 🚀 Server is running on http://localhost:4000/graphql
==========================================================
info

You may get a pop-up to allow network access to Deno when you try to run the server.

Explained:

  • Import oak module to create an Application.
  • dotevn to allow create environmental variable.
  • deno_util to create a basic logger.
  • app.use to create basic route. Currently, It will respond Hello GraphQL to every request.

4. Basic mock database

Since the purpose of this tutorial is not to teach you how to bind database and all. So we will mock the database as close as a real app.

Create a database.ts file touch src/model/database.ts

src/model/database.ts
const users = [
{
_id: "6027d46771b8a91a27bc9e13",
index: 0,
guid: "b0b80419-58a5-42ac-b488-b7c87a66f9f7",
isActive: true,
balance: "$3,095.41",
picture: "http://placehold.it/32x32",
age: 26,
name: "Hickman Beach",
gender: "male",
email: "hickmanbeach@vidto.com",
phone: "+1 (980) 401-2407",
address: "489 Canda Avenue, Buxton, Tennessee, 252",
about: "lorem..",
registered: "2020-11-16T10:40:17 -08:00",
friends: [
{
id: 0,
name: "Franklin Gentry",
},
],
},
];

export interface Friend {
id: number;
name: string;
}

export interface User {
_id: string;
index: number;
guid: string;
isActive: boolean;
balance: string;
picture: string;
age: number;
name: string;
gender: string;
email: string;
phone: string;
address: string;
about: string;
registered: string;
friends: Friend[];
}

export const getUsers = async (predicate?: (user: User) => boolean) => {
if (typeof predicate === "function") return users.filter(predicate);
return users;
};
note

You can get the whole file in github repo.

Explained:

A very basic mock database with getUsers method, which returns users based on a predicate. If there is no predicate, It will return all users else apply a filter using a predicate.

5. Create a /graphql endpoint to handle graphql POST request

GraphQL specs support POST to query server. We will use the same. To create a scalable routing. We will create our route in the routes folder and append it in Oak Application using the callback function.

Create files touch src/routes/index.ts src/routes/graphql.ts

Let's create gqlrouter

src/routes/graphql.ts
import { Router } from "https://deno.land/x/oak/mod.ts";

const gqlrouter = new Router();
gqlrouter
.get("/graphql", (context) => {
context.response.body = "Please use Post to Query";
})
.post("/graphql", async (context) => {
const result = context.request.body();
if (result.type === "json") {
const { query, variables = {} } = await result.value;
if (query) {
context.response.body = { query, variables };
} else {
context.response.body = { message: "Invalid Query" };
context.response.status = 400;
}
}
});

export default gqlrouter;

Let's update index.ts to append routes to Server.

src/routes/index.ts
import {
Application,
Middleware,
Router,
} from "https://deno.land/x/oak/mod.ts";
import { requestTraceMiddleware } from "https://deno.land/x/oak_middlewares/mod.ts";
import gqlrouter from "./graphql.ts";
const baseRoute = new Router();

baseRoute.get("/", (context) => {
context.response.body = `<b>Please use <a href="/graphql">/graphql</a> to query</b>`;
context.response.headers.append("Content-Type", "text/html; charset=UTF-8");
});

export default function init(app: Application) {
app.use(
requestTraceMiddleware<Middleware>({ type: "combined" })
);
app.use(baseRoute.routes());
app.use(gqlrouter.routes());
app.use(gqlrouter.allowedMethods());
}

Explained:

  • graphql.ts, We have just created an instance of Oak route. It can accept a get request and a post request at endpoint "/graphql".
  • All the GraphQL request contains query and variables as data payload.
  • Currently, return query and variables in return response.
  • index.ts to combine routes and apply some other middleware to Oak Application.

Let's update our server.ts

src/server.ts
/// Rest of the code...
import init from "./routes/index.ts";

const app = new Application();
init(app);

/// Rest of the code...

Run: +vr run start

Query using Postman:

sample 2

Query using CURL:

curl --location --request POST 'http://localhost:4000/graphql' \
--header 'Content-Type: application/json' \
--data-raw '{"query":"query HelloWorld {\n hello {\n name\n }\n}","variables":{"name":"Hickman"}}'

Output:

{
"query": "query HelloWorld {\n hello {\n name\n }\n}",
"variables": {
"name": "Hickman"
}
}

6. Create GraphQL schema and resolver

GraphQL Executor requires schema and resolver to execute the query. For that, we need to create schema and resolver. Schema can be written in String and compile to code using buildSchema helper method. Resolvers are basic functions, will be called by graphql executor, and act on the query.

To use GraphQL Executor we have to install/use graphql module from cdn.skypack.dev

src/schema/user.ts
const UserSchema = `
type Friends {
id: Int
name: String
}

type User {
_id: String
index: Int
guid: String
isActive: Boolean
balance: String
picture: String
age: Int
name: String
gender: String
email: String
phone: String
address: String
about: String
registered: String
friends: [Friends]
}
`;
export default UserSchema;
src/schema/index.ts
import { buildSchema } from "https://cdn.skypack.dev/graphql";
import UserSchema from "./user.ts";
const base = `
type Query {
hello: String
users(name: String): [User]
}
`;
export default buildSchema([base, UserSchema].join("\n"), {});

Explained:

note

Currently, graphql does not support multi-file schema(Query). So we have to write all queries in index.ts. Hopefully, In future, we can use graphql tools.

Let's create resolvers for users and hello query

src/resolvers/hello_world.ts
const HelloResolver = {
Query: {
hello: async (_: any, { name }: any = {}, context: any, z: any) => {
return "Hello world!";
},
},
};
export default HelloResolver;
src/resolvers/user.ts
import { getUsers } from "../model/database.ts";

const UserResolver = {
Query: {
users: async (d: any = {}, context: any) => {
return getUsers(d.name ? (u: any) => u.name.includes(d.name) : undefined);
},
},
};
export default UserResolver;
src/resolvers/index.ts
import HelloResolver from "./hello_world.ts";
import UserResolver from "./user.ts";

const resolvers = Object.assign(
{},
...[HelloResolver, UserResolver].map((x) => x.Query)
);
export default resolvers;

Explained:

  • user.ts and hello.ts contains an object with Query in it. The query has the function same name as it is defined in GraphQL Schema.
  • index.ts accumulate all the resolvers.

7. Route to handle Query and execute

Now we have created schema and resolver function. We can handle GraphQL requests and responses to the query. For that, we need to update our src/routes/graphql.ts.

src/routes/graphql.ts
import { Router } from "https://deno.land/x/oak/mod.ts";
import { graphql } from "https://cdn.skypack.dev/graphql";
import schema from "../schema/index.ts";
import resolvers from "../resolvers/index.ts";

const gqlrouter = new Router();
gqlrouter
.get("/graphql", (context) => {
context.response.body = "Please use Post to Query";
})
.post("/graphql", async (context) => {
const result = context.request.body();
if (result.type === "json") {
const { query, variables = {} } = await result.value;
if (query) {
const data = await (graphql as any)(
schema,
query,
resolvers,
{
request: context.request,
response: context.response,
},
variables || {}
);
if (data.errors) {
context.response.body = data;
context.response.status = 400;
} else {
context.response.body = data;
}
} else {
context.response.body = { message: "Invalid Query" };
context.response.status = 400;
}
}
});

export default gqlrouter;

Query using Postman:

sample 2

Query using CURL:

curl --location --request POST 'http://localhost:4000/graphql' \
--header 'Content-Type: application/json' \
--data-raw '{"query":"query User($name: String){\n users(name: $name) {\n name\n age\n }\n}","variables":{"name":"Hickman"}}'

Output:

{
"data": {
"users": [
{
"name": "Hickman Beach",
"age": 26
}
]
}
}

Congrats, Your GraphQL Server is ready to serve(🚀) the request.

Limitations

As I mentioned earlier, Deno is still very new and the community is also very new. The above app has a lot of limitations. However, We shouldn't stop exploring it. Some of the limitations are highlighted below.

  • Support for multiple Query/Aliases
  • Merge Schema from multiple files
  • Conflict in resolvers
  • Validations and Proper Error Handling

Source Code

deno-graphql-starter

I hope you like this tutorial. let me know your feedback in the comment. Please support(🙏🙏) by subscribing and clapping on https://deepak-v.medium.com/.

+ \ No newline at end of file diff --git a/advanced-jq/index.html b/advanced-jq/index.html index f50ecb8..d88e194 100644 --- a/advanced-jq/index.html +++ b/advanced-jq/index.html @@ -9,15 +9,15 @@ -Implementing JQ equivalent in Deno | Deno By Example - +Implementing JQ equivalent in Deno | Deno By Example +
-
Skip to main content

Implementing JQ equivalent in Deno


jq is like sed for JSON data, you can use it to slice and filter and map and transform structured data

-- https://stedolan.github.io/jq/

I am not going to create the entire library here. Instead, I will just give a small demo how you can read STDIN data using Deno and parse it.

parser

STDIN Standard input Stream, Standard input is a stream from which a program reads its input data.

How to create a stdin

Passing data as stdin is very easy. You can use < to pipe data to any program.

Example:

deno run program.ts < file_name.txt
deno run programe.ts < echo "data here"

You can also pass the output of any program to the other program using pipe(|). -Example:

cat file_name.txt | deno run program.ts
echo "data here" | deno run programe.ts

How to read stdin in Deno.

Reading stdin is very similar to reding and stream in Deno. Deno provides core API like Deno.read and Deno.readAll

// examples/advance_jq.ts

const stdinContent = await Deno.readAll(Deno.stdin);
console.log(stdinContent);

Run:

deno run examples/advance_jq.ts < examples/advance_jq.ts

When you run this program, This will print some numbers (Uint8Array). Like other languages, stream data is buffer data encoded in buffer. To convert we need TextDecoder.

// examples/advance_jq.ts

const stdinContent = await Deno.readAll(Deno.stdin);
const response = new TextDecoder().decode(stdinContent);
console.log(response);

Run:

deno run examples/advance_jq.ts < examples/advance_jq.ts

You can see you file data as output

Parsing JSON

Parsing JSON and extracting value is a very tedious task. I have written a basic Extract value from an object based on key provided. Code look as below:

const evalReg = /(\.)|(\[(\d)\])/;
const safeEval = (key: string, obj: any) => {
let lastKey;
let match;
do {
if (lastKey) {
if (match && match[2]) {
obj = obj[lastKey][match[3]];
} else {
obj = obj[lastKey];
}
}
match = evalReg.exec(key);
if (!match) {
lastKey = key;
break;
} else {
lastKey = key.substr(0, match.index);
key = key.slice(!match[3] ? match.index + 1 : match.index + 3);
}
} while (match);
if (lastKey) {
obj = obj[lastKey];
}
return obj;
};

Here i am using RegExp.execmore method to parse the key and extract tokens. This is a very rough sample of what JQ can do. So safeEvel code is also small 😁.

How this method works:

const obj = {
id: 1,
version: "1.0.1",
contributors: ["deepak", "gary"],
actor: {
name: "Tom Cruise",
age: 56,
"Born At": "Syracuse, NY",
Birthdate: "July 3 1962",
movies: ["Top Gun", "Mission: Impossible", "Oblivion"],
photo: "https://jsonformatter.org/img/tom-cruise.jpg",
},
};
console.log(JSON.stringify(obj, null, 2));
console.log(safeEval("id", obj));
console.log(safeEval("contributors", obj));
console.log(safeEval("contributors[1]", obj));
console.log(safeEval("actor.movies[2]", obj));

OUTPUT:

1
[ "deepak", "gary" ]
gary
Oblivion

As you can see, this is very much what we need. Let's complete the actual demo.

[Note:] Thanks to Deno import, now i can use this file from github directly. I don't need to create another file to import. You can do that. However, I will use network to import.

import safeEval from "https://raw.githubusercontent.com/deepakshrma/deno-by-example/master/examples/safe_eval.ts";
const stdinContent = await Deno.readAll(Deno.stdin);
const response = new TextDecoder().decode(stdinContent);

try {
console.log(safeEval(key, JSON.parse(response)));
} catch (err) {
console.log(response);
}

But wait, from where we will get missing key ??

alt text

(c) Photo by Paolo Nicolello on Unsplash

Deno provides direct access to arguments passed to programs using CLI. We can use Deno.args to get all the arguments passed to programs as an Array. Let's use it.

import safeEval from "https://raw.githubusercontent.com/deepakshrma/deno-by-example/master/examples/safe_eval.ts";
const stdinContent = await Deno.readAll(Deno.stdin);
const response = new TextDecoder().decode(stdinContent);

const [key = ""] = Deno.args;
try {
console.log(safeEval(key, JSON.parse(response)));
} catch (err) {
console.log(response);
}

You can create a json(tom.json) and tryout.

/* tom.json */
{
"id": 1,
"version": "1.0.1",
"contributors": ["deepak", "gary"],
"actor": {
"name": "Tom Cruise",
"age": 56,
"Born At": "Syracuse, NY",
"Birthdate": "July 3 1962",
"movies": ["Top Gun", "Mission: Impossible", "Oblivion"],
"photo": "https://jsonformatter.org/img/tom-cruise.jpg"
}
}

Run:

$ deno run examples/advance_jq.ts "id" < examples/tom.json
## 1

$ deno run examples/advance_jq.ts "actor.name" < examples/tom.json
## Tom Cruise

Perfect: Let's try with curl

curl -s -k https://raw.githubusercontent.com/deepakshrma/deno-by-example/master/examples/tom.json | deno run  examples/advance_jq.ts "actor.movies[1]"

Output: Mission: Impossible

Nice! Mission: I am possible

I hope you like this tutorial. let me know your feedback in the comment. Please support(🙏🙏) by subscribing and clapping on https://deepak-v.medium.com/.

Read More: Deno.readAll

- +
Skip to main content

Implementing JQ equivalent in Deno

jq is like sed for JSON data, you can use it to slice and filter and map and transform structured data

-- https://stedolan.github.io/jq/

I am not going to create the entire library here. Instead, I will just give a small demo how you can read STDIN data using Deno and parse it.

parser

STDIN Standard input Stream, Standard input is a stream from which a program reads its input data.

How to create a stdin

Passing data as stdin is very easy. You can use < to pipe data to any program.

Example:

deno run program.ts < file_name.txt
deno run programe.ts < echo "data here"

You can also pass the output of any program to the other program using pipe(|). +Example:

cat file_name.txt | deno run program.ts
echo "data here" | deno run programe.ts

How to read stdin in Deno.

Reading stdin is very similar to reding and stream in Deno. Deno provides core API like Deno.read and Deno.readAll

// examples/advance_jq.ts

const stdinContent = await Deno.readAll(Deno.stdin);
console.log(stdinContent);

Run:

deno run examples/advance_jq.ts < examples/advance_jq.ts

When you run this program, This will print some numbers (Uint8Array). Like other languages, stream data is buffer data encoded in buffer. To convert we need TextDecoder.

// examples/advance_jq.ts

const stdinContent = await Deno.readAll(Deno.stdin);
const response = new TextDecoder().decode(stdinContent);
console.log(response);

Run:

deno run examples/advance_jq.ts < examples/advance_jq.ts

You can see you file data as output

Parsing JSON

Parsing JSON and extracting value is a very tedious task. I have written a basic Extract value from an object based on key provided. Code look as below:

const evalReg = /(\.)|(\[(\d)\])/;
const safeEval = (key: string, obj: any) => {
let lastKey;
let match;
do {
if (lastKey) {
if (match && match[2]) {
obj = obj[lastKey][match[3]];
} else {
obj = obj[lastKey];
}
}
match = evalReg.exec(key);
if (!match) {
lastKey = key;
break;
} else {
lastKey = key.substr(0, match.index);
key = key.slice(!match[3] ? match.index + 1 : match.index + 3);
}
} while (match);
if (lastKey) {
obj = obj[lastKey];
}
return obj;
};

Here i am using RegExp.execmore method to parse the key and extract tokens. This is a very rough sample of what JQ can do. So safeEvel code is also small 😁.

How this method works:

const obj = {
id: 1,
version: "1.0.1",
contributors: ["deepak", "gary"],
actor: {
name: "Tom Cruise",
age: 56,
"Born At": "Syracuse, NY",
Birthdate: "July 3 1962",
movies: ["Top Gun", "Mission: Impossible", "Oblivion"],
photo: "https://jsonformatter.org/img/tom-cruise.jpg",
},
};
console.log(JSON.stringify(obj, null, 2));
console.log(safeEval("id", obj));
console.log(safeEval("contributors", obj));
console.log(safeEval("contributors[1]", obj));
console.log(safeEval("actor.movies[2]", obj));

OUTPUT:

1
[ "deepak", "gary" ]
gary
Oblivion

As you can see, this is very much what we need. Let's complete the actual demo.

[Note:] Thanks to Deno import, now i can use this file from github directly. I don't need to create another file to import. You can do that. However, I will use network to import.

import safeEval from "https://raw.githubusercontent.com/deepakshrma/deno-by-example/master/examples/safe_eval.ts";
const stdinContent = await Deno.readAll(Deno.stdin);
const response = new TextDecoder().decode(stdinContent);

try {
console.log(safeEval(key, JSON.parse(response)));
} catch (err) {
console.log(response);
}

But wait, from where we will get missing key ??

alt text

(c) Photo by Paolo Nicolello on Unsplash

Deno provides direct access to arguments passed to programs using CLI. We can use Deno.args to get all the arguments passed to programs as an Array. Let's use it.

import safeEval from "https://raw.githubusercontent.com/deepakshrma/deno-by-example/master/examples/safe_eval.ts";
const stdinContent = await Deno.readAll(Deno.stdin);
const response = new TextDecoder().decode(stdinContent);

const [key = ""] = Deno.args;
try {
console.log(safeEval(key, JSON.parse(response)));
} catch (err) {
console.log(response);
}

You can create a json(tom.json) and tryout.

/* tom.json */
{
"id": 1,
"version": "1.0.1",
"contributors": ["deepak", "gary"],
"actor": {
"name": "Tom Cruise",
"age": 56,
"Born At": "Syracuse, NY",
"Birthdate": "July 3 1962",
"movies": ["Top Gun", "Mission: Impossible", "Oblivion"],
"photo": "https://jsonformatter.org/img/tom-cruise.jpg"
}
}

Run:

$ deno run examples/advance_jq.ts "id" < examples/tom.json
## 1

$ deno run examples/advance_jq.ts "actor.name" < examples/tom.json
## Tom Cruise

Perfect: Let's try with curl

curl -s -k https://raw.githubusercontent.com/deepakshrma/deno-by-example/master/examples/tom.json | deno run  examples/advance_jq.ts "actor.movies[1]"

Output: Mission: Impossible

Nice! Mission: I am possible

I hope you like this tutorial. let me know your feedback in the comment. Please support(🙏🙏) by subscribing and clapping on https://deepak-v.medium.com/.

Read More: Deno.readAll

+ \ No newline at end of file diff --git a/advanced-logger/index.html b/advanced-logger/index.html index 9563d18..ce57430 100644 --- a/advanced-logger/index.html +++ b/advanced-logger/index.html @@ -9,15 +9,15 @@ -Building A Super Cool Colorful Logger with Deno fmt module | Deno By Example - +Building A Super Cool Colorful Logger with Deno fmt module | Deno By Example +
-
Skip to main content

Building A Super Cool Colorful Logger with Deno fmt module


Logging trace is one of the basic needs of any programming language. It does not matter how good your code is unless it is not traceable and debugable. For debugging, Logging is one of the best tools. It is fast and easy to follow. If you are working on local system This could be your best mate while debugging.

NICE QUOTE:

LOG WELL, LIVE WELL

image

Here in this tutorial, I will explain. How you can build a super cool logger with just minimal code (a few lines of the code). That is also without using any third-party tool.

Prerequisites

  1. Deno: Install Deno if you don't have it installed
  2. Basic-Typescript: basic-types

Just like Nodejs/JavaScript. Logging can be done using console.log

console.log("Hello World");

Nice! However formatting log message is big pain is javascript. console.log partially implements functions like printf from c++ or java. But it doesn't support all the features.

So how we should log formatted messages?

Formatted Log in JS

Using String template.

const name = "Deepak";
const salary = 2000;
console.log(`My name is ${name} and my salary is ${salary}$`);

// My name is Deepak and my salary is 2000$

Cool! But we can see for each parameter in the template, we have to give you a constant/variable. It will be hard to create variables just to log something.

Using Vargs in console.log.

const name = "Deepak";
const salary = 2000;
console.log(`My name and salary are `, name, salary);

// My name and salary are Deepak 2000

const person = { name: "deepak", salary: 2000 };
console.log(`Info: `, person);
// Info: { name: 'deepak', salary: 2000 }

The above statement is valid in javascript. We can pass any number of vargs to console.log However, we can't arrange the message with variables. This is very useful to print anything just by separating value from comma. But this can not be used for logging something useful.

Issues with vargs

  1. Unpredicted implementation
  2. Error-prone

Let's see by an example:

const person = { name: "deepak", salary: 2000 };
const address = { street: "221B baker street london", zip: 20000 };
console.log("Person info: " + person + " Address: " + address);
// Person info: [object Object] Address: [object Object]

If you try to append the object with string it converts to the string which is [object Object] for object and appended.

Solution:

const person = { name: "deepak", salary: 2000 };
const address = { street: "221B baker street london", zip: 20000 };
console.log(
"Person info: " +
JSON.stringify(person) +
" Address: " +
JSON.stringify(address)
);
// Person info: {"name":"deepak","salary":2000} Address: {"street":"221B baker street london","zip":20000}

// Or

console.log("Person info: ", person, " Address: ", address);
// Person info: { name: 'deepak', salary: 2000 } Address: { street: '221B baker street london', zip: 20000 }

Use Partial printf like feature in console.log.

const person = { name: "deepak", salary: 2000 };
const address = { street: "221B baker street london", zip: 20000 };
console.log(
"Person info: name: %s salary: %d and Address: street: %s ",
person.name,
person.salary,
address.street
);
// Person info: name: deepak salary: 2000 and Address: street: 221B baker street london

Here you can see, console.log does support printf like functions. However, this is limited until %s [string], %d [number]. Mozilla does support Precision formatting something like %.2f.

Introduction to PrintF

Deno is highly inspired by Go. Just like Go, Deno also has fmt module in the standard library. This module/package is a combination of multiple sub-modules like printf.

Note:

fmt module is still in work-in-progress status according to developers.

Importing printf:

import { printf } from "https://deno.land/std/fmt/printf.ts";

Definition of printf:

export function printf(format: string, ...args: unknown[]): void {
const s = sprintf(format, ...args);
Deno.stdout.writeSync(new TextEncoder().encode(s));
}

printf takes string and vars of unknown. The format is to define what the format of the string will look like. args could be anything according to the format you wanted.

Sample of printf:

const person = { name: "deepak", salary: 2000 };
printf(`Person Name: "%s" and Salary: %d\n`, person.name, person.salary);

// Person Name: "deepak" and Salary: 2000

According to Deno documents

The following verbs are supported:

VerbMeaning
%print a literal percent
tevaluate arg as boolean, print true or false
beval as number, print binary
ceval as number, print character corr. to the codePoint
oeval as number, print octal
x Xprint as hex (ff FF), treat string as list of bytes
e Eprint number in scientific/exponent format 1.123123e+01
f Fprint number as float with decimal point and no exponent
g Guse %e %E or %f %F depending on size of argument
sinterpolate string
Ttype of arg, as returned by typeof
vvalue of argument in 'default' format (see below)
jargument as formatted by JSON.stringify

Verbs with Width and Precision

%9f    width 9, default precision
%.9f default width, precision 9
%8.9f width 8, precision 9
%8.f width 9, precision 0

Sample of Width and Precision:

const person = { name: "deepak", salary: 2000.2 };
printf(`Person Name: "%s" and Salary: %9.2f\n`, person.name, person.salary);

// Person Name: "deepak" and Salary: 2000.20

You can write more complex examples like padding and get the value of the vargs passed to printf function.

Sample of Padding:

const person = { name: "deepak", salary: 2000.2 };

// Padding Zero

printf(`Salary: %09.2f\n`, person.salary);

// Salary: 002000.20

The conversion of rgb to hex color is so simple.

const r = 5,
g = 255,
b = 100;
printf("RGB TO HEX: #%02x%02x%02x\n", r, g, b);

// RGB TO HEX: #05ff64

More Complex use index of vargs values:

const person = { name: "deepak", salary: 2000.2 };

printf(
"Person has salary %d, which(%[1]d) is less than average salary %d\n",
person.salary,
4000
);

// Person has salary 2000.2, which(2000.2) is less than average salary 4000

Colors in Log

THE DOOR IS RED HERE THE WRITER USES THE COLOR TO EXPRESS HIS ANGER

colors

Another issue with console.log, It does not support colors out of the box. We end-up adding libraries like colors in NodeJs. The browser has some additional support for css console.log. But that will not work in NodeJs

Thanks to Deno's Colors module. Now we can easily color our life.

Importing colors:

import { red, yellow, gray, cyan } from "https://deno.land/std/fmt/colors.ts";
Note:

colors module also supports rgb colors

import { rgb8, bgRgb8, rgb24 } from "https://deno.land/std/fmt/colors.ts";

From Deno source:

/** Set background color using paletted 8bit colors.
* https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit */
export function bgRgb8(str: string, color: number): string {
return run(str, code([48, 5, clampAndTruncate(color)], 49));
}

Now, We have all the basic tools. Let's finish the Logger implementation

Finish IT

Create a Basic Logger Class

Define interfaces:

import { sprintf, printf } from "https://deno.land/std/fmt/printf.ts";
import { red, yellow, gray, cyan } from "https://deno.land/std/fmt/colors.ts";

type LogLevel = 0 | 1 | 2 | 3;

interface LoggerOptions {
level: LogLevel;
format?: string;
}

Create a constructor and define default values for log level and format:

import { sprintf, printf } from "https://deno.land/std/fmt/printf.ts";
import { red, yellow, gray, cyan } from "https://deno.land/std/fmt/colors.ts";

type LogLevel = 0 | 1 | 2 | 3;

interface LoggerOptions {
level: LogLevel;
format?: string;
}

const initialOptions = { level: 0, format: "%s\n" };

class Logger {
private _level: LogLevel;
private _format: string;

constructor(options: LoggerOptions = initialOptions as LoggerOptions) {
const { level, format } = { ...initialOptions, ...options };
this._level = level;
this._format = format;
}
}

Define getter setter for level and format:

const initialOptions = { level: 0, format: "%s\n" };
class Logger {
private _level: LogLevel;
private _format: string;
/// rest of the code
get level(): LogLevel {
return this._level;
}
set level(_l: LogLevel) {
this._level = _l;
}
get format(): string {
return this._format;
}
set format(_f: string) {
this._format = _f;
}
}
Note:

This is to hide the definition. You can remove setters if you don't want user to modify the values.

Add basic methods:

const initialOptions = { level: 0, format: "%s\n" };
class Logger {
private _level: LogLevel;
private _format: string;
/// rest of the code
log(...messages: unknown[]) {
printf(gray(sprintf(this.format, ...messages)));
}
info(...messages: unknown[]) {
printf(cyan(sprintf(this.format, ...messages)));
}
warn(...messages: unknown[]) {
printf(yellow(sprintf(this.format, ...messages)));
}
error(...messages: unknown[]) {
printf(red(sprintf(this.format, ...messages)));
}
}

Sample Run:

import { Logger } from "./logger.ts";

const logger = new Logger({ level: 0, format: "Logger: %s" });
logger.log("This is log message");
logger.info("This is info");
logger.warn("This is warn");
logger.error("This is error");

Output:

sample 1

If you notice, I am using sprintf before using printf. Since I want the full control on the printing message like adding colors and using the dynamic format. I have to use sprintf instead of printf.

Let's allow the user to modify format at runtime:

const initialOptions = { level: 0, format: "%s\n" };
class Logger {
private _level: LogLevel;
private _format: string;
/// rest of the code
log(format: string, ...messages: unknown[]) {
if (messages.length === 0) {
messages = [format];
format = this.format;
}
printf(gray(sprintf(format, ...messages)));
}
info(format: string, ...messages: unknown[]) {
if (messages.length === 0) {
messages = [format];
format = this.format;
}
printf(cyan(sprintf(format, ...messages)));
}
warn(format: string, ...messages: unknown[]) {
if (messages.length === 0) {
messages = [format];
format = this.format;
}
printf(yellow(sprintf(format, ...messages)));
}
error(format: string, ...messages: unknown[]) {
if (messages.length === 0) {
messages = [format];
format = this.format;
}
printf(red(sprintf(format, ...messages)));
}
}

Sample Run2:

import { Logger } from "./logger.ts";

const logger = new Logger({ level: 0, format: "Logger: %s" });
logger.log("This is log message");
logger.warn("This is warn");

logger.log(
"Overridden Info- Method: //%s %s [response time]: %05f ms",
"POST",
"https://www.google.com",
100
);
logger.error(
"Overridden Error- Error: //%s",
new Error("This is error").message
);

Output:

sample 2

Final Touch: Use of log levels

const initialOptions = { level: 0, format: "%s\n" };
class Logger {
private _level: LogLevel;
private _format: string;
/// rest of the code
log(format: string, ...messages: unknown[]) {
if (this.level > 0) return;

if (messages.length === 0) {
messages = [format];
format = this.format;
}
printf(gray(sprintf(format, ...messages)));
}
/// rest of the code
}

Final Run:

import { Logger } from "./logger.ts";

const logger = new Logger({ level: 0, format: "Logger: %s" });
logger.log("This is log message");
logger.warn("This is warn");

logger.log(
"Overridden Info- Method: //%s %s [response time]: %05f ms",
"POST",
"https://www.google.com",
100
);
logger.error(
"Overridden Error- Error: //%s",
new Error("This is error").message
);

// Change level

logger.level = 2;

// This will not print
logger.log(
"Overridden Info- Method: //%s %s [response time]: %05f ms",
"POST",
"https://www.google.com",
100
);

// This will print
logger.error(
"Overridden Error- Error: //%s",
new Error("This is error").message
);

// Change default format
logger.level = 1;

logger.format = "This is something new version: v%s";

logger.info("1.0.1");
logger.info("1.0.2");

Output:

sample 3

Good Job

Nice! Well done! We have done it!!

good job

The entire implementation of Logger class can be found in
How to use sample can be found in

For more examples like this, visit: -https://decipher.dev/deno-by-example/

I hope you like this tutorial. let me know your feedback in the comment. Please support(🙏🙏) by subscribing and clapping on https://deepak-v.medium.com/.

- +
Skip to main content

Building A Super Cool Colorful Logger with Deno fmt module

Logging trace is one of the basic needs of any programming language. It does not matter how good your code is unless it is not traceable and debugable. For debugging, Logging is one of the best tools. It is fast and easy to follow. If you are working on local system This could be your best mate while debugging.

NICE QUOTE:

LOG WELL, LIVE WELL

image

Here in this tutorial, I will explain. How you can build a super cool logger with just minimal code (a few lines of the code). That is also without using any third-party tool.

Prerequisites

  1. Deno: Install Deno if you don't have it installed
  2. Basic-Typescript: basic-types

Just like Nodejs/JavaScript. Logging can be done using console.log

console.log("Hello World");

Nice! However formatting log message is big pain is javascript. console.log partially implements functions like printf from c++ or java. But it doesn't support all the features.

So how we should log formatted messages?

Formatted Log in JS

Using String template.

const name = "Deepak";
const salary = 2000;
console.log(`My name is ${name} and my salary is ${salary}$`);

// My name is Deepak and my salary is 2000$

Cool! But we can see for each parameter in the template, we have to give you a constant/variable. It will be hard to create variables just to log something.

Using Vargs in console.log.

const name = "Deepak";
const salary = 2000;
console.log(`My name and salary are `, name, salary);

// My name and salary are Deepak 2000

const person = { name: "deepak", salary: 2000 };
console.log(`Info: `, person);
// Info: { name: 'deepak', salary: 2000 }

The above statement is valid in javascript. We can pass any number of vargs to console.log However, we can't arrange the message with variables. This is very useful to print anything just by separating value from comma. But this can not be used for logging something useful.

Issues with vargs

  1. Unpredicted implementation
  2. Error-prone

Let's see by an example:

const person = { name: "deepak", salary: 2000 };
const address = { street: "221B baker street london", zip: 20000 };
console.log("Person info: " + person + " Address: " + address);
// Person info: [object Object] Address: [object Object]

If you try to append the object with string it converts to the string which is [object Object] for object and appended.

Solution:

const person = { name: "deepak", salary: 2000 };
const address = { street: "221B baker street london", zip: 20000 };
console.log(
"Person info: " +
JSON.stringify(person) +
" Address: " +
JSON.stringify(address)
);
// Person info: {"name":"deepak","salary":2000} Address: {"street":"221B baker street london","zip":20000}

// Or

console.log("Person info: ", person, " Address: ", address);
// Person info: { name: 'deepak', salary: 2000 } Address: { street: '221B baker street london', zip: 20000 }

Use Partial printf like feature in console.log.

const person = { name: "deepak", salary: 2000 };
const address = { street: "221B baker street london", zip: 20000 };
console.log(
"Person info: name: %s salary: %d and Address: street: %s ",
person.name,
person.salary,
address.street
);
// Person info: name: deepak salary: 2000 and Address: street: 221B baker street london

Here you can see, console.log does support printf like functions. However, this is limited until %s [string], %d [number]. Mozilla does support Precision formatting something like %.2f.

Introduction to PrintF

Deno is highly inspired by Go. Just like Go, Deno also has fmt module in the standard library. This module/package is a combination of multiple sub-modules like printf.

Note:

fmt module is still in work-in-progress status according to developers.

Importing printf:

import { printf } from "https://deno.land/std/fmt/printf.ts";

Definition of printf:

export function printf(format: string, ...args: unknown[]): void {
const s = sprintf(format, ...args);
Deno.stdout.writeSync(new TextEncoder().encode(s));
}

printf takes string and vars of unknown. The format is to define what the format of the string will look like. args could be anything according to the format you wanted.

Sample of printf:

const person = { name: "deepak", salary: 2000 };
printf(`Person Name: "%s" and Salary: %d\n`, person.name, person.salary);

// Person Name: "deepak" and Salary: 2000

According to Deno documents

The following verbs are supported:

VerbMeaning
%print a literal percent
tevaluate arg as boolean, print true or false
beval as number, print binary
ceval as number, print character corr. to the codePoint
oeval as number, print octal
x Xprint as hex (ff FF), treat string as list of bytes
e Eprint number in scientific/exponent format 1.123123e+01
f Fprint number as float with decimal point and no exponent
g Guse %e %E or %f %F depending on size of argument
sinterpolate string
Ttype of arg, as returned by typeof
vvalue of argument in 'default' format (see below)
jargument as formatted by JSON.stringify

Verbs with Width and Precision

%9f    width 9, default precision
%.9f default width, precision 9
%8.9f width 8, precision 9
%8.f width 9, precision 0

Sample of Width and Precision:

const person = { name: "deepak", salary: 2000.2 };
printf(`Person Name: "%s" and Salary: %9.2f\n`, person.name, person.salary);

// Person Name: "deepak" and Salary: 2000.20

You can write more complex examples like padding and get the value of the vargs passed to printf function.

Sample of Padding:

const person = { name: "deepak", salary: 2000.2 };

// Padding Zero

printf(`Salary: %09.2f\n`, person.salary);

// Salary: 002000.20

The conversion of rgb to hex color is so simple.

const r = 5,
g = 255,
b = 100;
printf("RGB TO HEX: #%02x%02x%02x\n", r, g, b);

// RGB TO HEX: #05ff64

More Complex use index of vargs values:

const person = { name: "deepak", salary: 2000.2 };

printf(
"Person has salary %d, which(%[1]d) is less than average salary %d\n",
person.salary,
4000
);

// Person has salary 2000.2, which(2000.2) is less than average salary 4000

Colors in Log

THE DOOR IS RED HERE THE WRITER USES THE COLOR TO EXPRESS HIS ANGER

colors

Another issue with console.log, It does not support colors out of the box. We end-up adding libraries like colors in NodeJs. The browser has some additional support for css console.log. But that will not work in NodeJs

Thanks to Deno's Colors module. Now we can easily color our life.

Importing colors:

import { red, yellow, gray, cyan } from "https://deno.land/std/fmt/colors.ts";
Note:

colors module also supports rgb colors

import { rgb8, bgRgb8, rgb24 } from "https://deno.land/std/fmt/colors.ts";

From Deno source:

/** Set background color using paletted 8bit colors.
* https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit */
export function bgRgb8(str: string, color: number): string {
return run(str, code([48, 5, clampAndTruncate(color)], 49));
}

Now, We have all the basic tools. Let's finish the Logger implementation

Finish IT

Create a Basic Logger Class

Define interfaces:

import { sprintf, printf } from "https://deno.land/std/fmt/printf.ts";
import { red, yellow, gray, cyan } from "https://deno.land/std/fmt/colors.ts";

type LogLevel = 0 | 1 | 2 | 3;

interface LoggerOptions {
level: LogLevel;
format?: string;
}

Create a constructor and define default values for log level and format:

import { sprintf, printf } from "https://deno.land/std/fmt/printf.ts";
import { red, yellow, gray, cyan } from "https://deno.land/std/fmt/colors.ts";

type LogLevel = 0 | 1 | 2 | 3;

interface LoggerOptions {
level: LogLevel;
format?: string;
}

const initialOptions = { level: 0, format: "%s\n" };

class Logger {
private _level: LogLevel;
private _format: string;

constructor(options: LoggerOptions = initialOptions as LoggerOptions) {
const { level, format } = { ...initialOptions, ...options };
this._level = level;
this._format = format;
}
}

Define getter setter for level and format:

const initialOptions = { level: 0, format: "%s\n" };
class Logger {
private _level: LogLevel;
private _format: string;
/// rest of the code
get level(): LogLevel {
return this._level;
}
set level(_l: LogLevel) {
this._level = _l;
}
get format(): string {
return this._format;
}
set format(_f: string) {
this._format = _f;
}
}
Note:

This is to hide the definition. You can remove setters if you don't want user to modify the values.

Add basic methods:

const initialOptions = { level: 0, format: "%s\n" };
class Logger {
private _level: LogLevel;
private _format: string;
/// rest of the code
log(...messages: unknown[]) {
printf(gray(sprintf(this.format, ...messages)));
}
info(...messages: unknown[]) {
printf(cyan(sprintf(this.format, ...messages)));
}
warn(...messages: unknown[]) {
printf(yellow(sprintf(this.format, ...messages)));
}
error(...messages: unknown[]) {
printf(red(sprintf(this.format, ...messages)));
}
}

Sample Run:

import { Logger } from "./logger.ts";

const logger = new Logger({ level: 0, format: "Logger: %s" });
logger.log("This is log message");
logger.info("This is info");
logger.warn("This is warn");
logger.error("This is error");

Output:

sample 1

If you notice, I am using sprintf before using printf. Since I want the full control on the printing message like adding colors and using the dynamic format. I have to use sprintf instead of printf.

Let's allow the user to modify format at runtime:

const initialOptions = { level: 0, format: "%s\n" };
class Logger {
private _level: LogLevel;
private _format: string;
/// rest of the code
log(format: string, ...messages: unknown[]) {
if (messages.length === 0) {
messages = [format];
format = this.format;
}
printf(gray(sprintf(format, ...messages)));
}
info(format: string, ...messages: unknown[]) {
if (messages.length === 0) {
messages = [format];
format = this.format;
}
printf(cyan(sprintf(format, ...messages)));
}
warn(format: string, ...messages: unknown[]) {
if (messages.length === 0) {
messages = [format];
format = this.format;
}
printf(yellow(sprintf(format, ...messages)));
}
error(format: string, ...messages: unknown[]) {
if (messages.length === 0) {
messages = [format];
format = this.format;
}
printf(red(sprintf(format, ...messages)));
}
}

Sample Run2:

import { Logger } from "./logger.ts";

const logger = new Logger({ level: 0, format: "Logger: %s" });
logger.log("This is log message");
logger.warn("This is warn");

logger.log(
"Overridden Info- Method: //%s %s [response time]: %05f ms",
"POST",
"https://www.google.com",
100
);
logger.error(
"Overridden Error- Error: //%s",
new Error("This is error").message
);

Output:

sample 2

Final Touch: Use of log levels

const initialOptions = { level: 0, format: "%s\n" };
class Logger {
private _level: LogLevel;
private _format: string;
/// rest of the code
log(format: string, ...messages: unknown[]) {
if (this.level > 0) return;

if (messages.length === 0) {
messages = [format];
format = this.format;
}
printf(gray(sprintf(format, ...messages)));
}
/// rest of the code
}

Final Run:

import { Logger } from "./logger.ts";

const logger = new Logger({ level: 0, format: "Logger: %s" });
logger.log("This is log message");
logger.warn("This is warn");

logger.log(
"Overridden Info- Method: //%s %s [response time]: %05f ms",
"POST",
"https://www.google.com",
100
);
logger.error(
"Overridden Error- Error: //%s",
new Error("This is error").message
);

// Change level

logger.level = 2;

// This will not print
logger.log(
"Overridden Info- Method: //%s %s [response time]: %05f ms",
"POST",
"https://www.google.com",
100
);

// This will print
logger.error(
"Overridden Error- Error: //%s",
new Error("This is error").message
);

// Change default format
logger.level = 1;

logger.format = "This is something new version: v%s";

logger.info("1.0.1");
logger.info("1.0.2");

Output:

sample 3

Good Job

Nice! Well done! We have done it!!

good job

The entire implementation of Logger class can be found in
How to use sample can be found in

For more examples like this, visit: +https://decipher.dev/deno-by-example/

I hope you like this tutorial. let me know your feedback in the comment. Please support(🙏🙏) by subscribing and clapping on https://deepak-v.medium.com/.

+ \ No newline at end of file diff --git a/advanced-react-ssr/index.html b/advanced-react-ssr/index.html index 44b4741..4323eba 100644 --- a/advanced-react-ssr/index.html +++ b/advanced-react-ssr/index.html @@ -9,16 +9,16 @@ -Build an Isomorphic Application using Deno and React without WebPack | Deno By Example - +Build an Isomorphic Application using Deno and React without WebPack | Deno By Example +
-
Skip to main content

Build an Isomorphic Application using Deno and React without WebPack


Currently setting up a Server Side Render (SSR) application is a pain in nodejs. There are many scaffolds available for nodejs. But it comes with its own tech-depth and learning curves. This also includes hidden configurations of Webpack.

All in all, when you give Webpack a chance, your encounter will rarely be a pleasant one.

webpack

Read More: https://www.north-47.com/knowledge-base/webpack-the-good-the-bad-and-the-ugly/

Overview

According to the wiki, An isomorphic JavaScript(also known as Universal JavaScript) is described as JavaScript applications that run both on the client and the server.

tenet

If I say, you can build an entire SSR without setting up installing any external nodejs dependency. Would you believe it? I guess NO.

However, In this tutorial, I will explain how to set up a simple SSR app without installing a single nodejs library or bundler. That also including a hydrate react app(isomorphic app).

Set-up

Start with npm init

Don’t be afraid, To do things differently, we will not install any nodejs libraries. However, I still like npm as a task runner. So let’s use it. Create a folder SSR and init npm package.json

md -p examples/ssr

cd examples/ssr

## init npm package

npm init --y

Backend

Add Basic deno server: Create server.tsx a file and add below code

server.tsx
import { Application, Router } from "https://deno.land/x/oak@v6.0.1/mod.ts";

const app = new Application();

const router = new Router();
router.get("/", handlePage);

app.use(router.routes());
app.use(router.allowedMethods());

console.log("server is running on http://localhost:8000/");
await app.listen({ port: 8000 });

function handlePage(ctx: any) {
try {
ctx.response.body = `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body >
<div id="root"><h1>Hello SSR</h1></div>
</body>
</html>`;
} catch (error) {
console.error(error);
}
}
note

We will use oak module here to create Deno server. You can create your own server. For that read my article Creating Routing/Controller in Deno Server(From Scratch)

Add below command in package.json.

"scripts": {
"start": "deno run --allow-net server.ts",
"test": "echo \"Error: no test specified\" && exit 1"
},

Run: +

Build an Isomorphic Application using Deno and React without WebPack

Currently setting up a Server Side Render (SSR) application is a pain in nodejs. There are many scaffolds available for nodejs. But it comes with its own tech-depth and learning curves. This also includes hidden configurations of Webpack.

All in all, when you give Webpack a chance, your encounter will rarely be a pleasant one.

webpack

Read More: https://www.north-47.com/knowledge-base/webpack-the-good-the-bad-and-the-ugly/

Overview

According to the wiki, An isomorphic JavaScript(also known as Universal JavaScript) is described as JavaScript applications that run both on the client and the server.

tenet

If I say, you can build an entire SSR without setting up installing any external nodejs dependency. Would you believe it? I guess NO.

However, In this tutorial, I will explain how to set up a simple SSR app without installing a single nodejs library or bundler. That also including a hydrate react app(isomorphic app).

Set-up

Start with npm init

Don’t be afraid, To do things differently, we will not install any nodejs libraries. However, I still like npm as a task runner. So let’s use it. Create a folder SSR and init npm package.json

md -p examples/ssr

cd examples/ssr

## init npm package

npm init --y

Backend

Add Basic deno server: Create server.tsx a file and add below code

server.tsx
import { Application, Router } from "https://deno.land/x/oak@v6.0.1/mod.ts";

const app = new Application();

const router = new Router();
router.get("/", handlePage);

app.use(router.routes());
app.use(router.allowedMethods());

console.log("server is running on http://localhost:8000/");
await app.listen({ port: 8000 });

function handlePage(ctx: any) {
try {
ctx.response.body = `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body >
<div id="root"><h1>Hello SSR</h1></div>
</body>
</html>`;
} catch (error) {
console.error(error);
}
}
note

We will use oak module here to create Deno server. You can create your own server. For that read my article Creating Routing/Controller in Deno Server(From Scratch)

Add below command in package.json.

"scripts": {
"start": "deno run --allow-net server.ts",
"test": "echo \"Error: no test specified\" && exit 1"
},

Run: Now we can run the application and verify on http://localhost:8000/.

npm run start

Add React Server Render

Now we can run the application. Let us add our first rendering code. For that, we need to ReactJS. Since Deno uses ES Module import, We will use the CDN hosted version of react and react-dom. For that, there is a good CDN provider https://jspm.dev/.

jspm

jspm provides a module CDN allowing any package from npm to be directly loaded in the the browser and other JS environments as a fully optimized native JavaScript module.

Now since we are going to write some TSX syntax(typescript JSX). We have to change the file extension of server.ts to server.tsx. Let’s do that and update package.json.

mv server.ts server.tsx
package.json
"scripts": {
"start": "deno run --allow-net server.tsx",
"test": "echo \"Error: no test specified\" && exit 1"
},

Create a common dependency deps.ts file

deps.ts
// @deno-types="https://denopkg.com/soremwar/deno_types/react/v16.13.1/react.d.ts"
import React from "https://jspm.dev/react@17.0.2";
// @deno-types="https://denopkg.com/soremwar/deno_types/react-dom/v16.13.1/server.d.ts"
import ReactDOMServer from "https://jspm.dev/react-dom@17.0.2/server";
// @deno-types="https://denopkg.com/soremwar/deno_types/react-dom/v16.13.1/react-dom.d.ts"
import ReactDOM from "https://jspm.dev/react-dom@17.0.2";

export { React, ReactDOM, ReactDOMServer };

Add below lines in server.tsx

server.tsx
import { Application, Router } from "https://deno.land/x/oak@v6.0.1/mod.ts";

import { React, ReactDOMServer, ReactDOM } from "./dep.ts";

const app = new Application();

const router = new Router();
router.get("/", handlePage);

app.use(router.routes());
app.use(router.allowedMethods());

console.log("server is running on http://localhost:8000/");
await app.listen({ port: 8000 });

function App() {
return <h1>Hello SSR</h1>;
}
function handlePage(ctx: any) {
try {
const body = ReactDOMServer.renderToString(<App />);
ctx.response.body = `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body >
<div id="root">${body}</div>
</body>
</html>`;
} catch (error) {
console.error(error);
}
}

Run the app again. You will see errors on the console.

TS7026 [ERROR]

TS7026 [ERROR]: JSX element implicitly has type 'any' because no interface 'JSX.IntrinsicElements' exists.
-return

Hello SSR

This error is due to missing typings to react. Since we do not include types to react. We have to let know the typescript compiler. How it should treat JSX(TSX) syntax.

To suppress these errors, Add below lines.

server.tsx
function App() {
return <h1>Hello SSR</h1>;
}

Now run the server again. You can see your first React SSR running on the browser. Nice!

Adding Server Controller- Create Backend APIs

Let’s move further and start adding a few core features for Server. Let’s add some server-side data for our app. For that, we will include a few routes on Oak Server. Oak

server.tsx
const router = new Router();
router.get("/", handlePage);

let todos: Map<number, any> = new Map();

function init() {
todos.set(todos.size + 1, { id: Date.now(), task: "build an ssr deno app" });
todos.set(todos.size + 1, {
id: Date.now(),
task: "write blogs on deno ssr",
});
}
init();
router
.get("/todos", (context) => {
context.response.body = Array.from(todos.values());
})
.get("/todos/:id", (context) => {
if (
context.params &&
context.params.id &&
todos.has(Number(context.params.id))
) {
context.response.body = todos.get(Number(context.params.id));
} else {
context.response.status = 404;
}
})
.post("/todos", async (context) => {
const body = context.request.body();
if (body.type === "json") {
const todo = await body.value;
todos.set(Date.now(), todo);
}
context.response.body = { status: "OK" };
});

app.use(router.routes());
app.use(router.allowedMethods());

Here in the above code, We have created three routes.

  1. GET /todos/ to get a list of the todos
  2. GET /todos/:id to todo by id
  3. POST /todos/ create a new todo

function init() to create some initial dummy todos. You can use postman to try-out get and post data.

Client Side App

Add List Todos to React App

Since now we have API to create todos and consume todos. Let’s list down all this on our react app. For that add the below-mentioned code.

server.tsx
function App() {
return (
<div>
<div className="jumbotron jumbotron-fluid">
<div className="container">
<h1 className="display-4">ToDo's App</h1>
<p className="lead">This is our simple todo app.</p>
<ListTodos items={Array.from(todos.values())} />
</div>
</div>
</div>
);
}
interface Todo {
task: string;
}
interface ListTodos{
items: Todo[]
}
function ListTodos({ items = [] }: ListTodos) {
return (
<div>
<ul className="list-group">
{items.map((todo: any, index: number) => {
return (
<li key={index} className="list-group-item">
{todo.task}
<button
type="button"
className="ml-2 mb-1 close"
aria-label="Close"
>
<span aria-hidden="true">&times;</span>
</button>
</li>
);
})}
</ul>
</div>
);
}
function handlePage(ctx: any) {
try {
const body = ReactDOMServer.renderToString(<App />);
ctx.response.body = `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<title>Document</title>
</head>
<body >
<div id="root">${body}</div>
</body>
</html>`;

Update all the changes and run the app. You will see a list of Todos containing two rows of initial data. You can use curl post data to route POST/todos/ to create new records. Once you add a post, refresh the page, You will see added new post data.

post data using curl
curl --header "Content-Type: application/json" \
--request POST \
--data '{"task":"Create postman script"}' \
http://localhost:8000/todos/
bootstrap

If you noticed, I have added basic bootstrap to make UI nicer. You can use some other CSS library.

todo png

Tada! Now you have running the SSR app. You can replace the in-memory todos store to any persistent database. The result will be the same.

Now time to add some interactive behavior in Our react app(client-side). But before doing that, let’s move our react code to some separate file app.tsx.

Create a file app.tsx:

app.tsx
import { React } from "./dep.ts";
/*
// enable in case of old react module
declare global {
namespace JSX {
interface IntrinsicElements {
[key: string]: any;
}
}
}
*/

interface AppProps {
todos?: Todo[];
}
interface Todo {
task: string;
}

function App({ todos = [] }: AppProps) {
return (
<div>
<div className="jumbotron jumbotron-fluid">
<div className="container">
<h1 className="display-4">ToDo's App</h1>
<p className="lead">This is our simple todo app.</p>
<ListTodos items={todos} />
</div>
</div>
</div>
);
}
interface ListTodos {
items: Todo[];
}
function ListTodos({ items = [] }: ListTodos) {
return (
<div>
<ul className="list-group">
{items.map((todo: any, index: number) => {
return (
<li key={index} className="list-group-item">
{todo.task}
<button
type="button"
className="ml-2 mb-1 close"
aria-label="Close"
>
<span aria-hidden="true">&times;</span>
</button>
</li>
);
})}
</ul>
</div>
);
}
export default App;
note

Notice the change in the App component. Since we do not have direct access to todos now, We need to pass data as props while rendering it. Corresponding changes have been done for ListTodos.

server.tsx
import { React, ReactDOMServer, ReactDOM } from "./dep.ts";

import App from "./app.tsx";

/// rest of the code

function handlePage(ctx: any) {
try {
const body = ReactDOMServer.renderToString(
<App todos={Array.from(todos.values())} /> // change here to pass todos as props
);

// rest of the code
}

Run the app and see changes on the browser, If all good there will be no change in the final output.

Adding delete functionality on client-side

app.tsx
function ListTodos({ items = [] }: ListTodos) {
const [deletedIdxs, setDeletedIdxs] = (React as any).useState([]);
return (
<>
<ul className="list-group">
{items.map((todo: any, index: number) => {
const deleted = deletedIdxs.indexOf(index) !== -1;
return (
<li
key={index}
className="list-group-item"
style={{ color: deleted && "red" }}
>
{todo.task}
<button
type="button"
className="ml-2 mb-1 close"
aria-label="Close"
onClick={() => setDeletedIdxs([...deletedIdxs, index])}
>
<span aria-hidden="true">&times;</span>
</button>
</li>
);
})}
</ul>
</>
);
}

Once you do the above changes and try to delete by clicking on cross-button. You will see no change in UI. By code, it should turn the element color to red. So what could be the reason for that?

Answer: Hydrate

Since we are using ReactDOMServer.renderToString the library which converts React app to string. So we lose all JS capabilities. To re-enable react js on the client-side. For that React provides you Hydrate module(API). This hydrate API re-enable the react feature on the client-side again. This makes our app Isomorphic app. More: Hydrate

Adding hydrate is a tough task to do. But Awesome Deno shines well here too. Deno provides Bundle API to convert a script to js. We will use Deno.emit to create hydrate js for the client-side.

Create a new file client.tsx and add below codes:

client.tsx
import { React, ReactDOM } from "./dep.ts";

import App from "./app.tsx";

(ReactDOM as any).hydrate(<App todos={[]} />, document.getElementById("root"));

Add below codes to compile and convert client.tsx to serve as a route in our server.

server.tsx

// initial code
const { files } = await Deno.emit("./client.tsx", { bundle: "module" });
const clientJS = files["deno:///bundle.js"] || "";

const serverrouter = new Router();
serverrouter.get("/static/client.js", (context) => {
context.response.headers.set("Content-Type", "text/html");
context.response.body = clientJS;
});
app.use(router.routes());
app.use(serverrouter.routes());
// rest of the code
function handlePage(ctx: any) {
try {
const body = ReactDOMServer.renderToString(
<App todos={Array.from(todos.values())} /> // change here to pass todos as props
);
ctx.response.body = `<!DOCTYPE html>
<html lang="en">
<!--Rest of the code -->
<div id="root">${body}</div>
<script src="http://localhost:8000/static/client.js" defer></script>
</body>
</html>`;
} catch (error) {
console.error(error);
}

Since we are using unstable API deno.emit, You have to update package.json and add more flags. Same time, We are using DOM with typescript. So we have to add custom tsconfig.json.

package.json
{
"scripts": {
"start": "deno run --allow-net --allow-read --unstable server.tsx -c tsconfig.json",
"test": "echo \"Error: no test specified\" && exit 1"
}
}
tsconfig.json
{
"compilerOptions": {
"target": "es6" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */,
"module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */,
"lib": [
"DOM",
"ES2017",
"deno.ns"
] /* Specify library files to be included in the compilation. */,
"strict": true /* Enable all strict type-checking options. */,
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */,
"skipLibCheck": true /* Skip type checking of declaration files. */,
"forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
}
}
note

You can use runtime compile as CLI to convert client.tsx before even starting the server. However, I just wanna show a cool way of doing it. So I use Deno.emit on runtime.

Final Touch

Initialize initial state

Once you do all the above-mentioned changes, Re-Run app. You will notice the list is the visible and hidden same time. This is because we react hydrate start working and it is trying to re-initialize the app. So all the data we render from the server is gone to persist data we need to pass data as application initial data. There are a lot of patterns to pass initial data. We will use the simple window global data.

Let’s start data on the window after making below changes on the given files.

server.tsx
function handlePage(ctx: any) {
try {
const body = ReactDOMServer.renderToString(
<App todos={[]} />
);
ctx.response.body = `<!DOCTYPE html>
<title>Document</title>
<script>
window.__INITIAL_STATE__ = {"todos": ${JSON.stringify(
Array.from(todos.values())
)}};
</script>
</head>

client.tsx
// initial codes
declare global {
var __INITIAL_STATE__: any;
}
import App from "./app.tsx";
const { todos } = window.__INITIAL_STATE__ || { todos: [] };
(ReactDOM as any).hydrate(
<App todos={todos} />,
document.getElementById("root")
);

After the changes, all the files will look as below.

app.tsx
import { React } from "./dep.ts";
interface AppProps {
todos?: Todo[];
}
interface Todo {
task: string;
}

function App({ todos = [] }: AppProps) {
return (
<div>
<div className="jumbotron jumbotron-fluid">
<div className="container">
<h1 className="display-4">ToDo's App</h1>
<p className="lead">This is our simple todo app.</p>
<ListTodos items={todos} />
</div>
</div>
</div>
);
}
interface ListTodos {
items: Todo[];
}
function ListTodos({ items = [] }: ListTodos) {
const [deletedIdxs, setDeletedIdxs] = (React as any).useState([]);
return (
<div>
<ul className="list-group">
{items.map((todo: any, index: number) => {
const deleted = deletedIdxs.indexOf(index) !== -1;
return (
<li
key={index}
className="list-group-item"
style={{ color: deleted ? "red" : "green" }}
>
{todo.task}
<button
type="button"
className="ml-2 mb-1 close"
aria-label="Close"
onClick={() => setDeletedIdxs([...deletedIdxs, index])}
>
<span aria-hidden="true">&times;</span>
</button>
</li>
);
})}
</ul>
</div>
);
}

export default App;
client.tsx
import { React, ReactDOM } from "./dep.ts";

declare global {
var __INITIAL_STATE__: any;
}
import App from "./app.tsx";
const { todos } = window.__INITIAL_STATE__ || { todos: [] };
(ReactDOM as any).hydrate(
<App todos={todos} />,
document.getElementById("root")
);
server.tsx
import { Application, Router } from "https://deno.land/x/oak@v6.0.1/mod.ts";

import { React, ReactDOMServer } from "./dep.ts";

import App from "./app.tsx";

const app = new Application();

const router = new Router();
router.get("/", handlePage);

let todos: Map<number, any> = new Map();

function init() {
todos.set(todos.size + 1, { id: Date.now(), task: "build an ssr deno app" });
todos.set(todos.size + 1, {
id: Date.now(),
task: "write blogs on deno ssr",
});
}
init();
router
.get("/todos", (context: any) => {
context.response.body = Array.from(todos.values());
})
.get("/todos/:id", (context: any) => {
if (
context.params &&
context.params.id &&
todos.has(Number(context.params.id))
) {
context.response.body = todos.get(Number(context.params.id));
} else {
context.response.status = 404;
}
})
.post("/todos", async (context: any) => {
const body = context.request.body();
if (body.type === "json") {
const todo = await body.value;
todos.set(Date.now(), todo);
}
context.response.body = { status: "OK" };
});

const { files } = await Deno.emit("./client.tsx", { bundle: "module" });
const clientJS = files["deno:///bundle.js"] || "";

const serverrouter = new Router();
serverrouter.get("/static/client.js", (context: any) => {
context.response.headers.set("Content-Type", "text/html");
context.response.body = clientJS;
});
app.use(router.routes());
app.use(serverrouter.routes());

app.use(router.allowedMethods());

console.log("server is running on http://localhost:8000/");
await app.listen({ port: 8000 });

function handlePage(ctx: any) {
try {
const body = ReactDOMServer.renderToString(
<App todos={[]} /> // change here to pass todos as props
);
ctx.response.body = `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<title>Document</title>
<script>
window.__INITIAL_STATE__ = {"todos": ${JSON.stringify(
Array.from(todos.values())
)}};
</script>
</head>
<body >
<div id="root">${body}</div>
<script src="http://localhost:8000/static/client.js" defer></script>
</body>
</html>`;
} catch (error) {
console.error(error);
}
}
package.json
{
"name": "deno-react-ssr",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "deno run --allow-net --allow-read --unstable server.tsx -c tsconfig.json",
"start:clean": "deno run --allow-net --allow-read --unstable --reload server.tsx -c tsconfig.json",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}

Now you have a running, working SSR/Isomorphic App that is fully written in Deno. We didn’t use any nodejs/npm modules or WebPack.

Thanks for reading this tutorial. Please follow me to support me. For more of my work, check-out my website https://decipher.dev/.

You can find all the code in examples/ssr folder on my Github repo.

Final Domo

todo gif

Hope you like this tutorial, Please follow me and clap for me on medium: isomorphic-application

- +return

Hello SSR

This error is due to missing typings to react. Since we do not include types to react. We have to let know the typescript compiler. How it should treat JSX(TSX) syntax.

To suppress these errors, Add below lines.

server.tsx
function App() {
return <h1>Hello SSR</h1>;
}

Now run the server again. You can see your first React SSR running on the browser. Nice!

Adding Server Controller- Create Backend APIs

Let’s move further and start adding a few core features for Server. Let’s add some server-side data for our app. For that, we will include a few routes on Oak Server. Oak

server.tsx
const router = new Router();
router.get("/", handlePage);

let todos: Map<number, any> = new Map();

function init() {
todos.set(todos.size + 1, { id: Date.now(), task: "build an ssr deno app" });
todos.set(todos.size + 1, {
id: Date.now(),
task: "write blogs on deno ssr",
});
}
init();
router
.get("/todos", (context) => {
context.response.body = Array.from(todos.values());
})
.get("/todos/:id", (context) => {
if (
context.params &&
context.params.id &&
todos.has(Number(context.params.id))
) {
context.response.body = todos.get(Number(context.params.id));
} else {
context.response.status = 404;
}
})
.post("/todos", async (context) => {
const body = context.request.body();
if (body.type === "json") {
const todo = await body.value;
todos.set(Date.now(), todo);
}
context.response.body = { status: "OK" };
});

app.use(router.routes());
app.use(router.allowedMethods());

Here in the above code, We have created three routes.

  1. GET /todos/ to get a list of the todos
  2. GET /todos/:id to todo by id
  3. POST /todos/ create a new todo

function init() to create some initial dummy todos. You can use postman to try-out get and post data.

Client Side App

Add List Todos to React App

Since now we have API to create todos and consume todos. Let’s list down all this on our react app. For that add the below-mentioned code.

server.tsx
function App() {
return (
<div>
<div className="jumbotron jumbotron-fluid">
<div className="container">
<h1 className="display-4">ToDo's App</h1>
<p className="lead">This is our simple todo app.</p>
<ListTodos items={Array.from(todos.values())} />
</div>
</div>
</div>
);
}
interface Todo {
task: string;
}
interface ListTodos{
items: Todo[]
}
function ListTodos({ items = [] }: ListTodos) {
return (
<div>
<ul className="list-group">
{items.map((todo: any, index: number) => {
return (
<li key={index} className="list-group-item">
{todo.task}
<button
type="button"
className="ml-2 mb-1 close"
aria-label="Close"
>
<span aria-hidden="true">&times;</span>
</button>
</li>
);
})}
</ul>
</div>
);
}
function handlePage(ctx: any) {
try {
const body = ReactDOMServer.renderToString(<App />);
ctx.response.body = `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<title>Document</title>
</head>
<body >
<div id="root">${body}</div>
</body>
</html>`;

Update all the changes and run the app. You will see a list of Todos containing two rows of initial data. You can use curl post data to route POST/todos/ to create new records. Once you add a post, refresh the page, You will see added new post data.

post data using curl
curl --header "Content-Type: application/json" \
--request POST \
--data '{"task":"Create postman script"}' \
http://localhost:8000/todos/
bootstrap

If you noticed, I have added basic bootstrap to make UI nicer. You can use some other CSS library.

todo png

Tada! Now you have running the SSR app. You can replace the in-memory todos store to any persistent database. The result will be the same.

Now time to add some interactive behavior in Our react app(client-side). But before doing that, let’s move our react code to some separate file app.tsx.

Create a file app.tsx:

app.tsx
import { React } from "./dep.ts";
/*
// enable in case of old react module
declare global {
namespace JSX {
interface IntrinsicElements {
[key: string]: any;
}
}
}
*/

interface AppProps {
todos?: Todo[];
}
interface Todo {
task: string;
}

function App({ todos = [] }: AppProps) {
return (
<div>
<div className="jumbotron jumbotron-fluid">
<div className="container">
<h1 className="display-4">ToDo's App</h1>
<p className="lead">This is our simple todo app.</p>
<ListTodos items={todos} />
</div>
</div>
</div>
);
}
interface ListTodos {
items: Todo[];
}
function ListTodos({ items = [] }: ListTodos) {
return (
<div>
<ul className="list-group">
{items.map((todo: any, index: number) => {
return (
<li key={index} className="list-group-item">
{todo.task}
<button
type="button"
className="ml-2 mb-1 close"
aria-label="Close"
>
<span aria-hidden="true">&times;</span>
</button>
</li>
);
})}
</ul>
</div>
);
}
export default App;
note

Notice the change in the App component. Since we do not have direct access to todos now, We need to pass data as props while rendering it. Corresponding changes have been done for ListTodos.

server.tsx
import { React, ReactDOMServer, ReactDOM } from "./dep.ts";

import App from "./app.tsx";

/// rest of the code

function handlePage(ctx: any) {
try {
const body = ReactDOMServer.renderToString(
<App todos={Array.from(todos.values())} /> // change here to pass todos as props
);

// rest of the code
}

Run the app and see changes on the browser, If all good there will be no change in the final output.

Adding delete functionality on client-side

app.tsx
function ListTodos({ items = [] }: ListTodos) {
const [deletedIdxs, setDeletedIdxs] = (React as any).useState([]);
return (
<>
<ul className="list-group">
{items.map((todo: any, index: number) => {
const deleted = deletedIdxs.indexOf(index) !== -1;
return (
<li
key={index}
className="list-group-item"
style={{ color: deleted && "red" }}
>
{todo.task}
<button
type="button"
className="ml-2 mb-1 close"
aria-label="Close"
onClick={() => setDeletedIdxs([...deletedIdxs, index])}
>
<span aria-hidden="true">&times;</span>
</button>
</li>
);
})}
</ul>
</>
);
}

Once you do the above changes and try to delete by clicking on cross-button. You will see no change in UI. By code, it should turn the element color to red. So what could be the reason for that?

Answer: Hydrate

Since we are using ReactDOMServer.renderToString the library which converts React app to string. So we lose all JS capabilities. To re-enable react js on the client-side. For that React provides you Hydrate module(API). This hydrate API re-enable the react feature on the client-side again. This makes our app Isomorphic app. More: Hydrate

Adding hydrate is a tough task to do. But Awesome Deno shines well here too. Deno provides Bundle API to convert a script to js. We will use Deno.emit to create hydrate js for the client-side.

Create a new file client.tsx and add below codes:

client.tsx
import { React, ReactDOM } from "./dep.ts";

import App from "./app.tsx";

(ReactDOM as any).hydrate(<App todos={[]} />, document.getElementById("root"));

Add below codes to compile and convert client.tsx to serve as a route in our server.

server.tsx

// initial code
const { files } = await Deno.emit("./client.tsx", { bundle: "module" });
const clientJS = files["deno:///bundle.js"] || "";

const serverrouter = new Router();
serverrouter.get("/static/client.js", (context) => {
context.response.headers.set("Content-Type", "text/html");
context.response.body = clientJS;
});
app.use(router.routes());
app.use(serverrouter.routes());
// rest of the code
function handlePage(ctx: any) {
try {
const body = ReactDOMServer.renderToString(
<App todos={Array.from(todos.values())} /> // change here to pass todos as props
);
ctx.response.body = `<!DOCTYPE html>
<html lang="en">
<!--Rest of the code -->
<div id="root">${body}</div>
<script src="http://localhost:8000/static/client.js" defer></script>
</body>
</html>`;
} catch (error) {
console.error(error);
}

Since we are using unstable API deno.emit, You have to update package.json and add more flags. Same time, We are using DOM with typescript. So we have to add custom tsconfig.json.

package.json
{
"scripts": {
"start": "deno run --allow-net --allow-read --unstable server.tsx -c tsconfig.json",
"test": "echo \"Error: no test specified\" && exit 1"
}
}
tsconfig.json
{
"compilerOptions": {
"target": "es6" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */,
"module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */,
"lib": [
"DOM",
"ES2017",
"deno.ns"
] /* Specify library files to be included in the compilation. */,
"strict": true /* Enable all strict type-checking options. */,
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */,
"skipLibCheck": true /* Skip type checking of declaration files. */,
"forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
}
}
note

You can use runtime compile as CLI to convert client.tsx before even starting the server. However, I just wanna show a cool way of doing it. So I use Deno.emit on runtime.

Final Touch

Initialize initial state

Once you do all the above-mentioned changes, Re-Run app. You will notice the list is the visible and hidden same time. This is because we react hydrate start working and it is trying to re-initialize the app. So all the data we render from the server is gone to persist data we need to pass data as application initial data. There are a lot of patterns to pass initial data. We will use the simple window global data.

Let’s start data on the window after making below changes on the given files.

server.tsx
function handlePage(ctx: any) {
try {
const body = ReactDOMServer.renderToString(
<App todos={[]} />
);
ctx.response.body = `<!DOCTYPE html>
<title>Document</title>
<script>
window.__INITIAL_STATE__ = {"todos": ${JSON.stringify(
Array.from(todos.values())
)}};
</script>
</head>

client.tsx
// initial codes
declare global {
var __INITIAL_STATE__: any;
}
import App from "./app.tsx";
const { todos } = window.__INITIAL_STATE__ || { todos: [] };
(ReactDOM as any).hydrate(
<App todos={todos} />,
document.getElementById("root")
);

After the changes, all the files will look as below.

app.tsx
import { React } from "./dep.ts";
interface AppProps {
todos?: Todo[];
}
interface Todo {
task: string;
}

function App({ todos = [] }: AppProps) {
return (
<div>
<div className="jumbotron jumbotron-fluid">
<div className="container">
<h1 className="display-4">ToDo's App</h1>
<p className="lead">This is our simple todo app.</p>
<ListTodos items={todos} />
</div>
</div>
</div>
);
}
interface ListTodos {
items: Todo[];
}
function ListTodos({ items = [] }: ListTodos) {
const [deletedIdxs, setDeletedIdxs] = (React as any).useState([]);
return (
<div>
<ul className="list-group">
{items.map((todo: any, index: number) => {
const deleted = deletedIdxs.indexOf(index) !== -1;
return (
<li
key={index}
className="list-group-item"
style={{ color: deleted ? "red" : "green" }}
>
{todo.task}
<button
type="button"
className="ml-2 mb-1 close"
aria-label="Close"
onClick={() => setDeletedIdxs([...deletedIdxs, index])}
>
<span aria-hidden="true">&times;</span>
</button>
</li>
);
})}
</ul>
</div>
);
}

export default App;
client.tsx
import { React, ReactDOM } from "./dep.ts";

declare global {
var __INITIAL_STATE__: any;
}
import App from "./app.tsx";
const { todos } = window.__INITIAL_STATE__ || { todos: [] };
(ReactDOM as any).hydrate(
<App todos={todos} />,
document.getElementById("root")
);
server.tsx
import { Application, Router } from "https://deno.land/x/oak@v6.0.1/mod.ts";

import { React, ReactDOMServer } from "./dep.ts";

import App from "./app.tsx";

const app = new Application();

const router = new Router();
router.get("/", handlePage);

let todos: Map<number, any> = new Map();

function init() {
todos.set(todos.size + 1, { id: Date.now(), task: "build an ssr deno app" });
todos.set(todos.size + 1, {
id: Date.now(),
task: "write blogs on deno ssr",
});
}
init();
router
.get("/todos", (context: any) => {
context.response.body = Array.from(todos.values());
})
.get("/todos/:id", (context: any) => {
if (
context.params &&
context.params.id &&
todos.has(Number(context.params.id))
) {
context.response.body = todos.get(Number(context.params.id));
} else {
context.response.status = 404;
}
})
.post("/todos", async (context: any) => {
const body = context.request.body();
if (body.type === "json") {
const todo = await body.value;
todos.set(Date.now(), todo);
}
context.response.body = { status: "OK" };
});

const { files } = await Deno.emit("./client.tsx", { bundle: "module" });
const clientJS = files["deno:///bundle.js"] || "";

const serverrouter = new Router();
serverrouter.get("/static/client.js", (context: any) => {
context.response.headers.set("Content-Type", "text/html");
context.response.body = clientJS;
});
app.use(router.routes());
app.use(serverrouter.routes());

app.use(router.allowedMethods());

console.log("server is running on http://localhost:8000/");
await app.listen({ port: 8000 });

function handlePage(ctx: any) {
try {
const body = ReactDOMServer.renderToString(
<App todos={[]} /> // change here to pass todos as props
);
ctx.response.body = `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<title>Document</title>
<script>
window.__INITIAL_STATE__ = {"todos": ${JSON.stringify(
Array.from(todos.values())
)}};
</script>
</head>
<body >
<div id="root">${body}</div>
<script src="http://localhost:8000/static/client.js" defer></script>
</body>
</html>`;
} catch (error) {
console.error(error);
}
}
package.json
{
"name": "deno-react-ssr",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "deno run --allow-net --allow-read --unstable server.tsx -c tsconfig.json",
"start:clean": "deno run --allow-net --allow-read --unstable --reload server.tsx -c tsconfig.json",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}

Now you have a running, working SSR/Isomorphic App that is fully written in Deno. We didn’t use any nodejs/npm modules or WebPack.

Thanks for reading this tutorial. Please follow me to support me. For more of my work, check-out my website https://decipher.dev/.

You can find all the code in examples/ssr folder on my Github repo.

Final Domo

todo gif

Hope you like this tutorial, Please follow me and clap for me on medium: isomorphic-application

+ \ No newline at end of file diff --git a/advanced-readline/index.html b/advanced-readline/index.html index a119e57..6204f5a 100644 --- a/advanced-readline/index.html +++ b/advanced-readline/index.html @@ -9,15 +9,15 @@ -Read Line by Line as Data Stream | Deno By Example - +Read Line by Line as Data Stream | Deno By Example +
-
Skip to main content

Read Line by Line as Data Stream


Deno provides multiple APIs to read files. You can read the entire file using Deno.readAll and Deno.readTextFile. However, reading line by line is still not available in std library. Here in this tutorial, I will explain, How you can read the entire file line by line(Stream).

Before going to actual code, Let's understand the standard library first with examples.

Read Id[rid]

Deno provides Deno.open API to open a file. This is the async API. Meaning, you need to await. In return you will get File which contains rid.

Sample: open file

// examples/06_readfile_chunk.ts
async function main(name?: string) {
if (name) {
const file = await Deno.open(name);
console.log(file);
}
}
const [fileName] = Deno.args;
main(fileName);

[Run]

$ deno  run --allow-read  examples/06_readfile_chunk.ts examples/tom.json

## Output:
# File { rid: 3 }

You can see rid in return. Let's use this rid to get the chunk of data. Reading chunk requires API Deno.read

Example: 1

// examples/06_readfile_chunk.ts
async function main(name?: string) {
if (name) {
const file = await Deno.open(name);
const decoder = new TextDecoder();
let buf = new Uint8Array(100);
const numOfByteRead = await Deno.read(file?.rid, buf);
console.log(numOfByteRead);
console.log(decoder.decode(buf));
}
}
const [fileName] = Deno.args;
main(fileName);

[Run]

$ deno  run --allow-read  examples/06_readfile_chunk.ts examples/tom.json

# Output
# 100
# {
# "id": 1,
# "version": "1.0.1",
# "contributors": [
# "deepak",
# "gary"
# ],
# "actor": {

Here, as you can see, Every time you call Deno.read it returns the number of bytes that have been read. If numOfByteRead is null meaning it is end of file[EOF].

new Uint8Array(100); is Uint8Array to be filled while calling read. The buffer size could be anything. The reader will read bytes until buffer size.

If you notice, the read file is not a complete file. You need to increase the buff size to read all files.

Example: 2

// examples/06_readfile_chunk.ts
async function main(name?: string) {
if (name) {
const file = await Deno.open(name);
const decoder = new TextDecoder();
let buf = new Uint8Array(1000); // 353
const numOfByteRead = await Deno.read(file?.rid, buf);
console.log(numOfByteRead);
console.log(decoder.decode(buf));
}
}
const [fileName] = Deno.args;
main(fileName);

[Run]

$ deno  run --allow-read  examples/06_readfile_chunk.ts examples/tom.json

# Output
# 353
## JSON here..

Here in this example, I have increased buffer size to 1000, which is more than 353. So I can read the entire JSON file.

[NOTE]: You should avoid large buffer sizes. Reading a big file can create memory issues. and at the same time it will be hard to predict actual size.

To read the entire file chunk by chunk, we can use recursion on thenable API.

Example: 3

// examples/06_readfile_chunk.ts
async function main(name?: string) {
if (name) {
const file = await Deno.open(name);
const decoder = new TextDecoder();
let buf = new Uint8Array(100);
let chunk = new Uint8Array(0);
Deno.read(file?.rid, buf).then(function readByte(numOfByteRead) {
if (numOfByteRead) {
chunk = _append(chunk, buf, numOfByteRead);
Deno.read(file?.rid, buf).then(readByte);
} else {
console.log(decoder.decode(chunk));
}
});
}
}
const [fileName] = Deno.args;
main(fileName);

[Run]

$ deno  run --allow-read  examples/06_readfile_chunk.ts examples/tom.json

# Output
{
"id": 1,
"version": "1.0.1",
"contributors": [
"deepak",
"gary"
],
"actor": {
"name": "Tom Cruise",
"age": 56,
"Born At": "Syracuse, NY",
"Birthdate": "July 3 1962",
"movies": [
"Top Gun",
"Mission: Impossible",
"Oblivion"
],
"photo": "https://jsonformatter.org/img/tom-cruise.jpg"
}
}

[Breakdown]

Here in this code, when I call Deno.read(file?.rid, buf).then. It will trigger a named function function readByte(numOfByteRead). This will internally check for numOfByteRead each time. You can either append text return after decode by decoder.decode. I am appending as Uint8Array. To appened Uint8Array arrays, I found a good sample on StackOverflow.

[_append]

function _append(a: Uint8Array, b: Uint8Array, numOfByteRead: number) {
var c = new Uint8Array(a.length + numOfByteRead);
c.set(a, 0);
c.set(b.slice(0, numOfByteRead), a.length);
return c;
}

[NOTE]: If you don't pass numOfByteRead, you may garbage value read for last time.

Nice 🙂, all looks fine. However, still we are away from reading line by line. For that we will use an async iterator.

Basic sample for Async Iterator

let range = {
from: 1,
to: 5,
[Symbol.asyncIterator]() {
return {
current: this.from,
last: this.to,
async next() {
const value = await new Promise<number>((resolve) =>
setTimeout(() => {
resolve(this.current++);
}, 1000)
);
if (value <= this.last) {
return { done: false, value };
} else {
return { done: true };
}
},
};
},
};
(async () => {
for await (let value of range) {
console.log(value); // 1,2,3,4,5
}
})();

Just like Symbol.iterator, we can use Symbol.asyncIterator to create an async Iterator. Since typescript supports async iterator out of the box. We can use this API. To understand more, you can read async-iterators-generators.

To read line by line, I have created two utility methods _readTillDone and readLine.

const _readTillDone = async (
rid: number,
text: string = ""
): Promise<[string, string, boolean]> => {
let buf = new Uint8Array(100);
let indexOfLine = text.indexOf("\n");
if (indexOfLine === -1) {
const num = await Deno.read(rid, buf);
if (num) {
text = text + decoder.decode(buf.slice(0, num));
return _readTillDone(rid, text);
} else {
return [text, "", true];
}
} else {
return [text.slice(0, indexOfLine), text.slice(indexOfLine + 1), false];
}
};

const readLine = async (fileName: string) => {
const file = await Deno.open(fileName);
let text = "";
let done = false;
return {
[Symbol.asyncIterator]() {
return {
async next() {
const [t, rest, d] = await _readTillDone(file?.rid, text);
if (done) {
return { done: true, value: t };
} else {
text = rest;
done = d;
return { done: false, value: t };
}
},
};
},
};
};

[Breakdown]

readLine is very simple. On each async iterator call it will call _readTillDone and return the line. However, _readTillDone is a little complex. I am using file.rid to keep track of the file read.

Whenever i call _readTillDone with file?.rid, text. It tries to split text with newLine. I could not be able to find newLine. It tries to read more lines till the end. _readTillDone returns three parameters [t, rest, d]. Here t, text read by line,rest is as buffer text and d return as done.

Let's complete the tutorial. -Once we have these utils, the implementation is very simple.

Example: Final code

// examples/06_readfile_chunk.ts
import { readLine } from "https://raw.githubusercontent.com/deepakshrma/deno-by-example/master/examples/file_reader.ts";

async function main(name?: string) {
if (name) {
// Example 6
const reader = await readLine(name);
for await (let value of reader) {
console.log(value);
}
}
}
const [fileName] = Deno.args;
main(fileName);

[Run]

$ deno  run --allow-read  examples/06_readfile_chunk.ts examples/tom.json

# Output
{
"id": 1,
"version": "1.0.1",
"contributors": [
"deepak",
"gary"
],
"actor": {
"name": "Tom Cruise",
"age": 56,
"Born At": "Syracuse, NY",
"Birthdate": "July 3 1962",
"movies": [
"Top Gun",
"Mission: Impossible",
"Oblivion"
],
"photo": "https://jsonformatter.org/img/tom-cruise.jpg"
}
}

TaDa! 👏👏 Now you can read the entire file line by line.

I hope you like this tutorial. let me know your feedback in the comment. Please support(🙏🙏) by subscribing and clapping on https://deepak-v.medium.com/.

All working examples can be found in my Github: https://github.com/deepakshrma/deno-by-example/tree/master/examples

Update:

Recently, i got to know. That Deno does has readlines method to read reader line by line. It just documentation was missing. So i added document in Deno project. You can read it now here. https://deno.land/std/io

Sample:

import { readLines } from "https://deno.land/std/io/mod.ts";
import * as path from "https://deno.land/std/path/mod.ts";

const filename = path.join(Deno.cwd(), "std/io/README.md");
let fileReader = await Deno.open(filename);

for await (let line of readLines(fileReader)) {
console.log(line);
}```
- +
Skip to main content

Read Line by Line as Data Stream

Deno provides multiple APIs to read files. You can read the entire file using Deno.readAll and Deno.readTextFile. However, reading line by line is still not available in std library. Here in this tutorial, I will explain, How you can read the entire file line by line(Stream).

Before going to actual code, Let's understand the standard library first with examples.

Read Id[rid]

Deno provides Deno.open API to open a file. This is the async API. Meaning, you need to await. In return you will get File which contains rid.

Sample: open file

// examples/06_readfile_chunk.ts
async function main(name?: string) {
if (name) {
const file = await Deno.open(name);
console.log(file);
}
}
const [fileName] = Deno.args;
main(fileName);

[Run]

$ deno  run --allow-read  examples/06_readfile_chunk.ts examples/tom.json

## Output:
# File { rid: 3 }

You can see rid in return. Let's use this rid to get the chunk of data. Reading chunk requires API Deno.read

Example: 1

// examples/06_readfile_chunk.ts
async function main(name?: string) {
if (name) {
const file = await Deno.open(name);
const decoder = new TextDecoder();
let buf = new Uint8Array(100);
const numOfByteRead = await Deno.read(file?.rid, buf);
console.log(numOfByteRead);
console.log(decoder.decode(buf));
}
}
const [fileName] = Deno.args;
main(fileName);

[Run]

$ deno  run --allow-read  examples/06_readfile_chunk.ts examples/tom.json

# Output
# 100
# {
# "id": 1,
# "version": "1.0.1",
# "contributors": [
# "deepak",
# "gary"
# ],
# "actor": {

Here, as you can see, Every time you call Deno.read it returns the number of bytes that have been read. If numOfByteRead is null meaning it is end of file[EOF].

new Uint8Array(100); is Uint8Array to be filled while calling read. The buffer size could be anything. The reader will read bytes until buffer size.

If you notice, the read file is not a complete file. You need to increase the buff size to read all files.

Example: 2

// examples/06_readfile_chunk.ts
async function main(name?: string) {
if (name) {
const file = await Deno.open(name);
const decoder = new TextDecoder();
let buf = new Uint8Array(1000); // 353
const numOfByteRead = await Deno.read(file?.rid, buf);
console.log(numOfByteRead);
console.log(decoder.decode(buf));
}
}
const [fileName] = Deno.args;
main(fileName);

[Run]

$ deno  run --allow-read  examples/06_readfile_chunk.ts examples/tom.json

# Output
# 353
## JSON here..

Here in this example, I have increased buffer size to 1000, which is more than 353. So I can read the entire JSON file.

[NOTE]: You should avoid large buffer sizes. Reading a big file can create memory issues. and at the same time it will be hard to predict actual size.

To read the entire file chunk by chunk, we can use recursion on thenable API.

Example: 3

// examples/06_readfile_chunk.ts
async function main(name?: string) {
if (name) {
const file = await Deno.open(name);
const decoder = new TextDecoder();
let buf = new Uint8Array(100);
let chunk = new Uint8Array(0);
Deno.read(file?.rid, buf).then(function readByte(numOfByteRead) {
if (numOfByteRead) {
chunk = _append(chunk, buf, numOfByteRead);
Deno.read(file?.rid, buf).then(readByte);
} else {
console.log(decoder.decode(chunk));
}
});
}
}
const [fileName] = Deno.args;
main(fileName);

[Run]

$ deno  run --allow-read  examples/06_readfile_chunk.ts examples/tom.json

# Output
{
"id": 1,
"version": "1.0.1",
"contributors": [
"deepak",
"gary"
],
"actor": {
"name": "Tom Cruise",
"age": 56,
"Born At": "Syracuse, NY",
"Birthdate": "July 3 1962",
"movies": [
"Top Gun",
"Mission: Impossible",
"Oblivion"
],
"photo": "https://jsonformatter.org/img/tom-cruise.jpg"
}
}

[Breakdown]

Here in this code, when I call Deno.read(file?.rid, buf).then. It will trigger a named function function readByte(numOfByteRead). This will internally check for numOfByteRead each time. You can either append text return after decode by decoder.decode. I am appending as Uint8Array. To appened Uint8Array arrays, I found a good sample on StackOverflow.

[_append]

function _append(a: Uint8Array, b: Uint8Array, numOfByteRead: number) {
var c = new Uint8Array(a.length + numOfByteRead);
c.set(a, 0);
c.set(b.slice(0, numOfByteRead), a.length);
return c;
}

[NOTE]: If you don't pass numOfByteRead, you may garbage value read for last time.

Nice 🙂, all looks fine. However, still we are away from reading line by line. For that we will use an async iterator.

Basic sample for Async Iterator

let range = {
from: 1,
to: 5,
[Symbol.asyncIterator]() {
return {
current: this.from,
last: this.to,
async next() {
const value = await new Promise<number>((resolve) =>
setTimeout(() => {
resolve(this.current++);
}, 1000)
);
if (value <= this.last) {
return { done: false, value };
} else {
return { done: true };
}
},
};
},
};
(async () => {
for await (let value of range) {
console.log(value); // 1,2,3,4,5
}
})();

Just like Symbol.iterator, we can use Symbol.asyncIterator to create an async Iterator. Since typescript supports async iterator out of the box. We can use this API. To understand more, you can read async-iterators-generators.

To read line by line, I have created two utility methods _readTillDone and readLine.

const _readTillDone = async (
rid: number,
text: string = ""
): Promise<[string, string, boolean]> => {
let buf = new Uint8Array(100);
let indexOfLine = text.indexOf("\n");
if (indexOfLine === -1) {
const num = await Deno.read(rid, buf);
if (num) {
text = text + decoder.decode(buf.slice(0, num));
return _readTillDone(rid, text);
} else {
return [text, "", true];
}
} else {
return [text.slice(0, indexOfLine), text.slice(indexOfLine + 1), false];
}
};

const readLine = async (fileName: string) => {
const file = await Deno.open(fileName);
let text = "";
let done = false;
return {
[Symbol.asyncIterator]() {
return {
async next() {
const [t, rest, d] = await _readTillDone(file?.rid, text);
if (done) {
return { done: true, value: t };
} else {
text = rest;
done = d;
return { done: false, value: t };
}
},
};
},
};
};

[Breakdown]

readLine is very simple. On each async iterator call it will call _readTillDone and return the line. However, _readTillDone is a little complex. I am using file.rid to keep track of the file read.

Whenever i call _readTillDone with file?.rid, text. It tries to split text with newLine. I could not be able to find newLine. It tries to read more lines till the end. _readTillDone returns three parameters [t, rest, d]. Here t, text read by line,rest is as buffer text and d return as done.

Let's complete the tutorial. +Once we have these utils, the implementation is very simple.

Example: Final code

// examples/06_readfile_chunk.ts
import { readLine } from "https://raw.githubusercontent.com/deepakshrma/deno-by-example/master/examples/file_reader.ts";

async function main(name?: string) {
if (name) {
// Example 6
const reader = await readLine(name);
for await (let value of reader) {
console.log(value);
}
}
}
const [fileName] = Deno.args;
main(fileName);

[Run]

$ deno  run --allow-read  examples/06_readfile_chunk.ts examples/tom.json

# Output
{
"id": 1,
"version": "1.0.1",
"contributors": [
"deepak",
"gary"
],
"actor": {
"name": "Tom Cruise",
"age": 56,
"Born At": "Syracuse, NY",
"Birthdate": "July 3 1962",
"movies": [
"Top Gun",
"Mission: Impossible",
"Oblivion"
],
"photo": "https://jsonformatter.org/img/tom-cruise.jpg"
}
}

TaDa! 👏👏 Now you can read the entire file line by line.

I hope you like this tutorial. let me know your feedback in the comment. Please support(🙏🙏) by subscribing and clapping on https://deepak-v.medium.com/.

All working examples can be found in my Github: https://github.com/deepakshrma/deno-by-example/tree/master/examples

Update:

Recently, i got to know. That Deno does has readlines method to read reader line by line. It just documentation was missing. So i added document in Deno project. You can read it now here. https://deno.land/std/io

Sample:

import { readLines } from "https://deno.land/std/io/mod.ts";
import * as path from "https://deno.land/std/path/mod.ts";

const filename = path.join(Deno.cwd(), "std/io/README.md");
let fileReader = await Deno.open(filename);

for await (let line of readLines(fileReader)) {
console.log(line);
}```
+ \ No newline at end of file diff --git a/advanced-routing/index.html b/advanced-routing/index.html index fcd8070..c88dc50 100644 --- a/advanced-routing/index.html +++ b/advanced-routing/index.html @@ -9,16 +9,16 @@ -Creating Routing/Controller in Deno Server(From Scratch) | Deno By Example - +Creating Routing/Controller in Deno Server(From Scratch) | Deno By Example +
-
Skip to main content

Creating Routing/Controller in Deno Server(From Scratch)


Introduction

Deno provides a standard package std/http for working with http/https server. However, the routing request to different Control is not supported out-of-box. Demo model is same as NodeJs. Saying that, Deno insist you to use module like oak. I will also recommend you to use this module. +

Creating Routing/Controller in Deno Server(From Scratch)

Introduction

Deno provides a standard package std/http for working with http/https server. However, the routing request to different Control is not supported out-of-box. Demo model is same as NodeJs. Saying that, Deno insist you to use module like oak. I will also recommend you to use this module. Here in this tutorial, I will explain how you can build Super cool Router from scratch.

routing

Before creating a routing, lets create a basic server.

examples/basic_server.ts
import { serve, Response } from "https://deno.land/std/http/server.ts";

const PORT = 8080;
const server = serve({ port: PORT });
for await (const req of server) {
req.respond({ body: "hello world" }); // respond response
}

Run this deno run examples/basic_server.ts

Open browser at http://localhost:8080/. You will see hello world.

🔥Fact:

If you have not read my hello-world Article. I will recommend you to please read it.

Breakdown:

Here, whenever you request anything to server. It will return you hello world in response. Adding route will be done inside for-each loop. Let's add first route.

examples/basic_server.ts
import { serve, Response } from "https://deno.land/std/http/server.ts";

const PORT = 8080;
const server = serve({ port: PORT });
console.log(`🚀 Server is running on http://localhost:${PORT}`);

for await (const req of server) {
switch (req.url) {
case "/users":
req.respond({ body: "Hello Mr. Unknown" });
break;
default:
req.respond({ body: "404! Page Not Found!" }); // respond response
}
}

Run this deno run examples/basic_server.ts

Open browser at http://localhost:8080/. You will see Hello Mr. Unknown. If you try some other URL, you will see 404! Page Not Found!.

Breakdown:

  1. Get the current request URL using req.url
  2. Switch between url /users and respond accordingly.

We can do something like this. The only issue with this approach. We can't have dynamic route like /users/1234 where is 1234 is the id of user.

As solution, Instead of directly matching one to one. We can use regex to match URL and get the id of user.

examples/basic_server.ts
import { serve, Response } from "https://deno.land/std/http/server.ts";

const PORT = 8080;
const server = serve({ port: PORT });

const users = [{ name: "deepak" }, { name: "Sam" }, { name: "Britney" }];

console.log(`🚀 Server is running on http://localhost:${PORT}`);
for await (const req of server) {
const userRegex = /^\/users\/(\d+)/;
const match = userRegex.exec(req.url);

if (match) {
const userId = Number(match[1]);

if (users[userId]) {
req.respond({ body: JSON.stringify(users[userId]) });
} else {
req.respond({ body: "USER NOT FOUND" });
}
} else {
req.respond({ body: "404! Page Not Found!" }); // respond response
}
}

Run this deno run examples/basic_server.ts

Open browser at http://localhost:8080/. You will see {"name":"Sam"}. If you try URL with id 5, you will see USER NOT FOUND.

Breakdown: -Using regex match we achieve what we had needed. However, writing regex of complex pattern could be an issue. Let's use our first library as file. We will use path-to-regexp from pillarjs. This is the same library used by express server in nodejs.

examples/basic_server.ts
import { serve, Response } from "https://deno.land/std/http/server.ts";
import { pathToRegexp } from "https://raw.githubusercontent.com/pillarjs/path-to-regexp/master/src/index.ts";

const PORT = 8080;
const server = serve({ port: PORT });

const users = [{ name: "deepak" }, { name: "Sam" }, { name: "Britney" }];

console.log(`🚀 Server is running on http://localhost:${PORT}`);
for await (const req of server) {
const userRegex = pathToRegexp("/users/:id");
const match = userRegex.exec(req.url);

/// rest of the code
}

Re-run app again. You will see no difference. Nice!

Here adding too much business logic in same for-each loop can leads to many issue. The major concern is maintenance. So let's move to controller/handler.

examples/basic_server.ts
import { serve, ServerRequest } from "https://deno.land/std/http/server.ts";

// Rest of the code

for await (const req of server) {
const userRegex = pathToRegexp("/users/:id");
const match = userRegex.exec(req.url);
if (match) {
handleUsers(req, match);
} else {
req.respond({ body: "404! Page Not Found!" }); // respond response
}
}

function handleUsers(req: ServerRequest, match: RegExpExecArray) {
const userId = Number(match[1]);
if (users[userId]) {
req.respond({ body: JSON.stringify(users[userId]) });
} else {
req.respond({ body: "USER NOT FOUND" });
}
}

If you run app and request app with same input as previous. You will see same output. We just move the User logic to separate handleUsers function.

Nice! All good. However, managing these many route path and regex is tough task and hard to maintain as well.

As solution we can create a list/array of routes. The interface for Route could be

interface Route
interface Route {
name: string; // name of the route, just for tracking
path: string; // path pattern for handler
handler: (req: ServerRequest, match: RegExpExecArray) => void; // handler to handle request
}

Let's create two handler. One for users, another one for posts.

Note:

For time being, I am using static data from users.ts and posts.ts

handleUsers
function handleUsers(req: ServerRequest, match: RegExpExecArray) {
const userId = Number(match[1]);
if (users[userId]) {
req.respond({ body: JSON.stringify(users[userId]) });
} else {
req.respond({ body: "USER NOT FOUND" });
}
}
handlePosts
function handlePosts(req: ServerRequest, match: RegExpExecArray) {
const postId = Number(match[1]);
if (posts[postId]) {
req.respond({ body: JSON.stringify(posts[postId]) });
} else {
req.respond({ body: "POST NOT FOUND" });
}
}
Routes
const routes: Route[] = [
{ name: "posts", path: "/posts/:id", handler: handlePosts },
{ name: "users", path: "/users/:id", handler: handleUsers },
];

Create a handler for Page Not Found.

Page Not Handler
function routeNotFound(req: ServerRequest) {
req.respond({ body: "404! Page Not Found!" });
}

To match URL pattern, We can loop over all the routes and call the respective handler.

router
function router(req: ServerRequest) {
for (let route of routes) {
const reg = pathToRegexp(route.path);
const match = reg.exec(req.url);
if (match) return route.handler(req, match);
}
return routeNotFound(req);
}

The complete code will be like

examples/basic_server.ts
import { serve, ServerRequest } from "https://deno.land/std/http/server.ts";
import { pathToRegexp } from "https://raw.githubusercontent.com/pillarjs/path-to-regexp/master/src/index.ts";
import users from "./users.ts";
import posts from "./posts.ts";

const PORT = 8080;
const server = serve({ port: PORT });

console.log(`🚀 Server is running on http://localhost:${PORT}`);

interface Route {
name: string; // name of the route, just for tracking
path: string; // path pattern for handler
handler: (req: ServerRequest, match: RegExpExecArray) => void; // handler to handle request
}

const routes: Route[] = [
{ name: "posts", path: "/posts/:id", handler: handlePosts },
{ name: "users", path: "/users/:id", handler: handleUsers },
];

for await (const req of server) {
router(req);
}

function handleUsers(req: ServerRequest, match: RegExpExecArray) {
const userId = Number(match[1]);
if (users[userId]) {
req.respond({ body: JSON.stringify(users[userId]) });
} else {
req.respond({ body: "USER NOT FOUND" });
}
}
function handlePosts(req: ServerRequest, match: RegExpExecArray) {
const postId = Number(match[1]);
if (posts[postId]) {
req.respond({ body: JSON.stringify(posts[postId]) });
} else {
req.respond({ body: "POST NOT FOUND" });
}
}

function router(req: ServerRequest) {
for (let route of routes) {
const reg = pathToRegexp(route.path);
const match = reg.exec(req.url);
if (match) return route.handler(req, match);
}
return routeNotFound(req);
}

function routeNotFound(req: ServerRequest) {
req.respond({ body: "404! Page Not Found!" });
}

Don't worry, We will further break down the entire code and do required clean up.

Breakdown:

  1. In above sample, The router function will be called on each request.
  2. This router function will loop on each Route from routes and try to match.
  3. Once match found, it will call respective handler.
Code:

Code can be found at examples/basic_server.ts

Let's give final touch and break into files.

Create a controllers.ts file

examples/controllers.ts
import { ServerRequest } from "https://deno.land/std/http/server.ts";
import { getUserById } from "./users.ts";
import { getPostById } from "./posts.ts";
const fromRoot = (str: string) => Deno.cwd() + "/static/" + str;

export const findUserById = (req: ServerRequest, match: RegExpExecArray) => {
const id = Number(match[1]);
const user = getUserById(id);
if (user) {
req.respond({ body: JSON.stringify(user) });
} else {
req.respond({ body: "POST NOT FOUND" });
}
};

export const findPostById = (req: ServerRequest, match: RegExpExecArray) => {
const id = Number(match[1]);
const post = getPostById(id);
if (post) {
req.respond({ body: JSON.stringify(post) });
} else {
req.respond({ body: "POST NOT FOUND" });
}
};

export async function staticFile(req: ServerRequest, match: RegExpExecArray) {
// handle files
if (match) {
const filename = match[1];
const strPath = fromRoot(filename);
try {
req.respond({ body: await Deno.open(strPath) });
} catch (err) {
routeNotFound(req);
}
} else {
return routeNotFound(req);
}
}
export function routeNotFound(req: ServerRequest) {
req.respond({ body: "404! Page Not Found!" });
}
Bonus:

I have added static page handler[staticFile] for static assets.

Move all router logic in router.ts file

examples/router.ts
import { ServerRequest } from "https://deno.land/std/http/server.ts";
import { pathToRegexp } from "https://raw.githubusercontent.com/pillarjs/path-to-regexp/master/src/index.ts";
import { findUserById, findPostById, routeNotFound } from "./controllers.ts";

interface Route {
name: string; // name of the route, just for tracking
path: string; // path pattern for handler
handler: (req: ServerRequest, match: RegExpExecArray) => void; // handler to handle request
}

const routes: Route[] = [
{ name: "static", path: "/static/:page*", handler: staticFile },
{ name: "posts", path: "/posts/:id", handler: findUserById },
{ name: "users", path: "/users/:id", handler: findPostById },
];

function router(req: ServerRequest) {
for (let route of routes) {
const reg = pathToRegexp(route.path);
const match = reg.exec(req.url);
if (match) return route.handler(req, match);
}
return routeNotFound(req);
}

export default router;

Finally the main server with request logger: final_server.ts

examples/final_server.ts
import { serve } from "https://deno.land/std/http/server.ts";
import router from "./router.ts";
import { Logger } from "https://raw.githubusercontent.com/deepakshrma/deno_util/master/logger.ts";

const logger = new Logger();

const PORT = 8080;
const server = serve({ port: PORT });

console.log(`🚀 Server is running on http://localhost:${PORT}`);

for await (const req of server) {
logger.info("/%s:\t%s \t\t%s", req.method, req.url, new Date().toISOString());
router(req);
}

Run this deno run examples/final_server.ts

Open browser at http://localhost:8080/static/home.html. You will see Magic.

magic_server

Good Job! Thanks for support in advance. Please do follow me, subscribing and clapping on https://deepak-v.medium.com/

All working examples can be found in my Github

https://github.com/deepakshrma/deno-by-example/tree/master/examples

- +Using regex match we achieve what we had needed. However, writing regex of complex pattern could be an issue. Let's use our first library as file. We will use path-to-regexp from pillarjs. This is the same library used by express server in nodejs.

examples/basic_server.ts
import { serve, Response } from "https://deno.land/std/http/server.ts";
import { pathToRegexp } from "https://raw.githubusercontent.com/pillarjs/path-to-regexp/master/src/index.ts";

const PORT = 8080;
const server = serve({ port: PORT });

const users = [{ name: "deepak" }, { name: "Sam" }, { name: "Britney" }];

console.log(`🚀 Server is running on http://localhost:${PORT}`);
for await (const req of server) {
const userRegex = pathToRegexp("/users/:id");
const match = userRegex.exec(req.url);

/// rest of the code
}

Re-run app again. You will see no difference. Nice!

Here adding too much business logic in same for-each loop can leads to many issue. The major concern is maintenance. So let's move to controller/handler.

examples/basic_server.ts
import { serve, ServerRequest } from "https://deno.land/std/http/server.ts";

// Rest of the code

for await (const req of server) {
const userRegex = pathToRegexp("/users/:id");
const match = userRegex.exec(req.url);
if (match) {
handleUsers(req, match);
} else {
req.respond({ body: "404! Page Not Found!" }); // respond response
}
}

function handleUsers(req: ServerRequest, match: RegExpExecArray) {
const userId = Number(match[1]);
if (users[userId]) {
req.respond({ body: JSON.stringify(users[userId]) });
} else {
req.respond({ body: "USER NOT FOUND" });
}
}

If you run app and request app with same input as previous. You will see same output. We just move the User logic to separate handleUsers function.

Nice! All good. However, managing these many route path and regex is tough task and hard to maintain as well.

As solution we can create a list/array of routes. The interface for Route could be

interface Route
interface Route {
name: string; // name of the route, just for tracking
path: string; // path pattern for handler
handler: (req: ServerRequest, match: RegExpExecArray) => void; // handler to handle request
}

Let's create two handler. One for users, another one for posts.

Note:

For time being, I am using static data from users.ts and posts.ts

handleUsers
function handleUsers(req: ServerRequest, match: RegExpExecArray) {
const userId = Number(match[1]);
if (users[userId]) {
req.respond({ body: JSON.stringify(users[userId]) });
} else {
req.respond({ body: "USER NOT FOUND" });
}
}
handlePosts
function handlePosts(req: ServerRequest, match: RegExpExecArray) {
const postId = Number(match[1]);
if (posts[postId]) {
req.respond({ body: JSON.stringify(posts[postId]) });
} else {
req.respond({ body: "POST NOT FOUND" });
}
}
Routes
const routes: Route[] = [
{ name: "posts", path: "/posts/:id", handler: handlePosts },
{ name: "users", path: "/users/:id", handler: handleUsers },
];

Create a handler for Page Not Found.

Page Not Handler
function routeNotFound(req: ServerRequest) {
req.respond({ body: "404! Page Not Found!" });
}

To match URL pattern, We can loop over all the routes and call the respective handler.

router
function router(req: ServerRequest) {
for (let route of routes) {
const reg = pathToRegexp(route.path);
const match = reg.exec(req.url);
if (match) return route.handler(req, match);
}
return routeNotFound(req);
}

The complete code will be like

examples/basic_server.ts
import { serve, ServerRequest } from "https://deno.land/std/http/server.ts";
import { pathToRegexp } from "https://raw.githubusercontent.com/pillarjs/path-to-regexp/master/src/index.ts";
import users from "./users.ts";
import posts from "./posts.ts";

const PORT = 8080;
const server = serve({ port: PORT });

console.log(`🚀 Server is running on http://localhost:${PORT}`);

interface Route {
name: string; // name of the route, just for tracking
path: string; // path pattern for handler
handler: (req: ServerRequest, match: RegExpExecArray) => void; // handler to handle request
}

const routes: Route[] = [
{ name: "posts", path: "/posts/:id", handler: handlePosts },
{ name: "users", path: "/users/:id", handler: handleUsers },
];

for await (const req of server) {
router(req);
}

function handleUsers(req: ServerRequest, match: RegExpExecArray) {
const userId = Number(match[1]);
if (users[userId]) {
req.respond({ body: JSON.stringify(users[userId]) });
} else {
req.respond({ body: "USER NOT FOUND" });
}
}
function handlePosts(req: ServerRequest, match: RegExpExecArray) {
const postId = Number(match[1]);
if (posts[postId]) {
req.respond({ body: JSON.stringify(posts[postId]) });
} else {
req.respond({ body: "POST NOT FOUND" });
}
}

function router(req: ServerRequest) {
for (let route of routes) {
const reg = pathToRegexp(route.path);
const match = reg.exec(req.url);
if (match) return route.handler(req, match);
}
return routeNotFound(req);
}

function routeNotFound(req: ServerRequest) {
req.respond({ body: "404! Page Not Found!" });
}

Don't worry, We will further break down the entire code and do required clean up.

Breakdown:

  1. In above sample, The router function will be called on each request.
  2. This router function will loop on each Route from routes and try to match.
  3. Once match found, it will call respective handler.
Code:

Code can be found at examples/basic_server.ts

Let's give final touch and break into files.

Create a controllers.ts file

examples/controllers.ts
import { ServerRequest } from "https://deno.land/std/http/server.ts";
import { getUserById } from "./users.ts";
import { getPostById } from "./posts.ts";
const fromRoot = (str: string) => Deno.cwd() + "/static/" + str;

export const findUserById = (req: ServerRequest, match: RegExpExecArray) => {
const id = Number(match[1]);
const user = getUserById(id);
if (user) {
req.respond({ body: JSON.stringify(user) });
} else {
req.respond({ body: "POST NOT FOUND" });
}
};

export const findPostById = (req: ServerRequest, match: RegExpExecArray) => {
const id = Number(match[1]);
const post = getPostById(id);
if (post) {
req.respond({ body: JSON.stringify(post) });
} else {
req.respond({ body: "POST NOT FOUND" });
}
};

export async function staticFile(req: ServerRequest, match: RegExpExecArray) {
// handle files
if (match) {
const filename = match[1];
const strPath = fromRoot(filename);
try {
req.respond({ body: await Deno.open(strPath) });
} catch (err) {
routeNotFound(req);
}
} else {
return routeNotFound(req);
}
}
export function routeNotFound(req: ServerRequest) {
req.respond({ body: "404! Page Not Found!" });
}
Bonus:

I have added static page handler[staticFile] for static assets.

Move all router logic in router.ts file

examples/router.ts
import { ServerRequest } from "https://deno.land/std/http/server.ts";
import { pathToRegexp } from "https://raw.githubusercontent.com/pillarjs/path-to-regexp/master/src/index.ts";
import { findUserById, findPostById, routeNotFound } from "./controllers.ts";

interface Route {
name: string; // name of the route, just for tracking
path: string; // path pattern for handler
handler: (req: ServerRequest, match: RegExpExecArray) => void; // handler to handle request
}

const routes: Route[] = [
{ name: "static", path: "/static/:page*", handler: staticFile },
{ name: "posts", path: "/posts/:id", handler: findUserById },
{ name: "users", path: "/users/:id", handler: findPostById },
];

function router(req: ServerRequest) {
for (let route of routes) {
const reg = pathToRegexp(route.path);
const match = reg.exec(req.url);
if (match) return route.handler(req, match);
}
return routeNotFound(req);
}

export default router;

Finally the main server with request logger: final_server.ts

examples/final_server.ts
import { serve } from "https://deno.land/std/http/server.ts";
import router from "./router.ts";
import { Logger } from "https://raw.githubusercontent.com/deepakshrma/deno_util/master/logger.ts";

const logger = new Logger();

const PORT = 8080;
const server = serve({ port: PORT });

console.log(`🚀 Server is running on http://localhost:${PORT}`);

for await (const req of server) {
logger.info("/%s:\t%s \t\t%s", req.method, req.url, new Date().toISOString());
router(req);
}

Run this deno run examples/final_server.ts

Open browser at http://localhost:8080/static/home.html. You will see Magic.

magic_server

Good Job! Thanks for support in advance. Please do follow me, subscribing and clapping on https://deepak-v.medium.com/

All working examples can be found in my Github

https://github.com/deepakshrma/deno-by-example/tree/master/examples

+ \ No newline at end of file diff --git a/advanced-run-on-docker/index.html b/advanced-run-on-docker/index.html index 292f63f..6baac67 100644 --- a/advanced-run-on-docker/index.html +++ b/advanced-run-on-docker/index.html @@ -9,17 +9,17 @@ -Run Deno Application on docker | Continuous Integration and Deployment | Deno By Example - +Run Deno Application on docker | Continuous Integration and Deployment | Deno By Example +
-
Skip to main content

Run Deno Application on docker | Continuous Integration and Deployment


Overview

Before starting code, Lets understand the concept of CICD in brief. This will give us motive to read this blog further.

By- ThoughtWorks’ definition for CI

Continuous Integration (CI) is a development practice that requires developers to integrate code
into a shared repository several times a day. Each check-in is then
verified by an automated build, allowing teams to detect problems early.

Read more: https://www.thoughtworks.com/es/continuous-integration

By- Jez Humble’s site

Continuous Delivery is the ability to get changes of all types—including new features,
configuration changes, bug fixes and experiments—into production, or into
the hands of users, safely and quickly in a sustainable way.

Read more: https://continuousdelivery.com/

As we can see, There are many reason why we should follow the CICD in our project development cycle. The one of reason why i follow CICD in daily work. Its ease my work and I get a consistant environment for my development work. So that i can focus on more good things rather than debuging Binary breaking issue.

If you want to read more on CICD, You can read this article.

p

In this tutorial, I will mainly focus on how you can setup Simple Deno Web Application just using some docker commands. In next tuitor, I will explain how to setup a FullStack Deno Application.

1. Create a simple Deno WebApp

To show working example, We need to create a sample Application. Since the focus of this tutorial is not to create WebApp. I will recoomend you to checkout my tutorial here or medium.

The given app is a SSR app, has only some basic functionality. You can checkout source in /examples/ssr folder. Once you run app, Open http://localhost:8000/ on browser. You will see Web as given below.

todo gif

cd examples/ssr

deno run --allow-net --allow-read --unstable server.tsx -c tsconfig.json

2. Create a Dockerfile

App looks good! Let's now create a Dockerfile to startwith.

md docker-app && touch Dockerfile

To test our docker is working fine, Let's add some Hello World program.

Dockerfile
FROM alpine

RUN echo "Hello Stanger!"

Build and Run:

docker build -t chucknorris .
docker run -it chucknorris

Explaination: Here in above Dockerfile, First We are pulling the lightest linux base OS. Once pull done, We are trying to Run echo command. If all good, you will see below output.

 ---> Running in 5215187d3d6a
Hello Stanger!
Removing intermediate container 5215187d3d6a

The above output tell us, things are OK.

3. Install Deno Using docker

By default, Alpine image does not have any external software. This is the one of the thinest Linux client. To install Deno, We need to curl Deno binary. You can read all the details on Deno WebSite.

Let's add curl using Dockerfile.

Dockerfile
FROM alpine

RUN apk update && apk add curl
ENTRYPOINT ["curl"]
CMD [ "curl", "https://api.chucknorris.io/jokes/random" ]

Build and Run:

docker build -t chucknorris .
docker run -it chucknorris

Once you run you will see output along with chucknorris joke. I got mine joke as "Chuck Norris once threw a 'block party'. The city of Detroit filed for bankruptcy the next day". If your are lucky, You may get more funnier joke.

Download Deno Binary: +

Run Deno Application on docker | Continuous Integration and Deployment

Overview

Before starting code, Lets understand the concept of CICD in brief. This will give us motive to read this blog further.

By- ThoughtWorks’ definition for CI

Continuous Integration (CI) is a development practice that requires developers to integrate code
into a shared repository several times a day. Each check-in is then
verified by an automated build, allowing teams to detect problems early.

Read more: https://www.thoughtworks.com/es/continuous-integration

By- Jez Humble’s site

Continuous Delivery is the ability to get changes of all types—including new features,
configuration changes, bug fixes and experiments—into production, or into
the hands of users, safely and quickly in a sustainable way.

Read more: https://continuousdelivery.com/

As we can see, There are many reason why we should follow the CICD in our project development cycle. The one of reason why i follow CICD in daily work. Its ease my work and I get a consistant environment for my development work. So that i can focus on more good things rather than debuging Binary breaking issue.

If you want to read more on CICD, You can read this article.

p

In this tutorial, I will mainly focus on how you can setup Simple Deno Web Application just using some docker commands. In next tuitor, I will explain how to setup a FullStack Deno Application.

1. Create a simple Deno WebApp

To show working example, We need to create a sample Application. Since the focus of this tutorial is not to create WebApp. I will recoomend you to checkout my tutorial here or medium.

The given app is a SSR app, has only some basic functionality. You can checkout source in /examples/ssr folder. Once you run app, Open http://localhost:8000/ on browser. You will see Web as given below.

todo gif

cd examples/ssr

deno run --allow-net --allow-read --unstable server.tsx -c tsconfig.json

2. Create a Dockerfile

App looks good! Let's now create a Dockerfile to startwith.

md docker-app && touch Dockerfile

To test our docker is working fine, Let's add some Hello World program.

Dockerfile
FROM alpine

RUN echo "Hello Stanger!"

Build and Run:

docker build -t chucknorris .
docker run -it chucknorris

Explaination: Here in above Dockerfile, First We are pulling the lightest linux base OS. Once pull done, We are trying to Run echo command. If all good, you will see below output.

 ---> Running in 5215187d3d6a
Hello Stanger!
Removing intermediate container 5215187d3d6a

The above output tell us, things are OK.

3. Install Deno Using docker

By default, Alpine image does not have any external software. This is the one of the thinest Linux client. To install Deno, We need to curl Deno binary. You can read all the details on Deno WebSite.

Let's add curl using Dockerfile.

Dockerfile
FROM alpine

RUN apk update && apk add curl
ENTRYPOINT ["curl"]
CMD [ "curl", "https://api.chucknorris.io/jokes/random" ]

Build and Run:

docker build -t chucknorris .
docker run -it chucknorris

Once you run you will see output along with chucknorris joke. I got mine joke as "Chuck Norris once threw a 'block party'. The city of Detroit filed for bankruptcy the next day". If your are lucky, You may get more funnier joke.

Download Deno Binary: Now time to install/download pre-compile version of Deno binary

Dockerfile
FROM alpine

RUN apk update && apk add curl

RUN curl -fsSL https://deno.land/x/install/install.sh | sh && mv /root/.deno/bin/deno /bin/deno

ENTRYPOINT ["dono"]

CMD ["run", "--allow-net", "https://deno.land/std/examples/welcome.ts"]

Build and Run:

docker build -t deno-app .
docker run -it deno-app
Issue

There are some compiled libraries missing on Alpine image. So when you try to run Deno you may can see error like standard_init_linux.go:211: exec user process caused. To fix above error, We will you modified version of Alpine Image.

Let's update our docker file.

Dockerfile
FROM frolvlad/alpine-glibc:alpine-3.11_glibc-2.31

RUN apk update && apk add curl

RUN curl -fsSL https://deno.land/x/install/install.sh | sh && mv /root/.deno/bin/deno /bin/deno

ENTRYPOINT ["deno"]

CMD ["run", "--allow-net", "https://deno.land/std/examples/welcome.ts"]

Explaination: Once we pulled the image, We used curl to get the installation script from Deno website and download Deno binary. Since default path of deno binary is not bin. So we need to copy binary to bin. You can find better way to setup path. ENTRYPOINT is to tell docker what command to use when we run docker run command. CMD is the command to run.

If all OK, you will see bellow output.

❯ docker run -it deno-app
Download https://deno.land/std/examples/welcome.ts
Warning Implicitly using latest version (0.64.0) for https://deno.land/std/examples/welcome.ts
Download https://deno.land/std@0.64.0/examples/welcome.ts
Check https://deno.land/std@0.64.0/examples/welcome.ts

Welcome to Deno 🦕

4. Running Todo App

We have completed our 90% job. Let's run our todo-app. For that, we need to copy all the required files to the docker image. We can do either using COPY command or mount volume. I will show both way of doing it. However, recoomended is to use COPY. This is to decouple your sytem from Docker.

Using COPY:

Forbidden path outside the build context

Since docker does not allow file to be coppied from out of the foder. We have to copy files from /examples/ssr folder to examples/docker-app.

pwd
#something/examples/docker-app
cp -r ../ssr ./ssr

Update Dockerfile to copy files.

Dockerfile
FROM frolvlad/alpine-glibc:alpine-3.11_glibc-2.31
RUN apk update && apk add curl
RUN curl -fsSL https://deno.land/x/install/install.sh | sh && mv /root/.deno/bin/deno /bin/deno
WORKDIR /app
COPY ssr/ /app/
ENTRYPOINT ["deno"]
CMD ["run", "--allow-net", "--allow-read", "--unstable", "server.tsx", "-c", "tsconfig.json"]

Build and Run:

docker build -t deno-app .
docker run -d deno-app

## output
# f75f6e55675b1f8558fcfe2c34cd25f366aacc4b0f6b5df7d7982bf3cea3c46d

## Note down the output of last command

docker logs f75f6e55675b

note

If you notice, for first time we have run docker in detteched mode ie. docker run -d. Since we are running a long running server, We should dettached the Docket image from our sytem.

Explaination: Since we are running docker container in detteched mode. We have to grab container-id to see logs of the last docker run.

docker ps | grep todo-app

docker logs f75f6e55675b

You can see output like server is running on http://localhost:8000/. However, when you try to access http://localhost:8000/ on browser. You cant access it. This is becuase docker runs container in isolation. It does not implecite expose ports out of the container. To do so, We have to expose port in docker file and same time need bind to external port while running command.

Dockerfile
## rest of the command

WORKDIR /app
EXPOSE 8080
COPY ssr/ /app/

## rest of the command

Build and run with port binding:

docker build -t deno-app .
docker run -d -p8000:8000 deno-app

Open http://localhost:8000/ in browser, You can see running todo app.

Bonus

I told you, That you can run file without COPY command using valume mount. For that lets remove COPY commad from Dockerfile.

Dockerfile
FROM frolvlad/alpine-glibc:alpine-3.11_glibc-2.31
RUN apk update && apk add curl
RUN curl -fsSL https://deno.land/x/install/install.sh | sh && mv /root/.deno/bin/deno /bin/deno
WORKDIR /app
EXPOSE 8080
ENTRYPOINT ["deno"]
CMD ["run", "--allow-net", "--allow-read", "--unstable", "server.tsx", "-c", "tsconfig.json"]
docker build -t deno-app .
docker run -d -p8000:8000 -v ${PWD}/ssr:/app deno-app

Hope you like this tutorial. Please follow me and clap for me on medium: https://deepak-v.medium.com/

Some Usefull Docker Commands

Docker

Docker Images: docker images ls

Running Process: docker ps

Stop container: docker stop container-id

Stop all container time before: docker ps | grep " minutes ago" | awk '{print $1}' | xargs docker stop

Remove images: docker rmi -f id1 id2 id3

Logs: docker logs f75f6e55675b

Source:

You can get all source code on GitHub. -examples/docker-app

- +examples/docker-app

+ \ No newline at end of file diff --git a/assets/css/styles.7b608847.css b/assets/css/styles.fb34a451.css similarity index 89% rename from assets/css/styles.7b608847.css rename to assets/css/styles.fb34a451.css index fac44fc..73a609a 100644 --- a/assets/css/styles.7b608847.css +++ b/assets/css/styles.fb34a451.css @@ -1 +1 @@ -.container,.row .col{padding:0 var(--ifm-spacing-horizontal);width:100%}.row .col,img{max-width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.admonition-icon svg,.alert__icon svg{fill:var(--ifm-alert-foreground-color)}.markdown li,body{word-wrap:break-word}.toggleButton_rCf9,html{-webkit-tap-highlight-color:transparent}:root,body.dark,body[data-theme=dark]{--aa-icon-color-rgb:119,119,163;--aa-scrollbar-thumb-background-color-rgb:var(--aa-background-color-rgb)}.button,.dropdown__link,.navbar__title,.text--truncate{white-space:nowrap}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:transparent;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:rgba(0,0,0,.05);--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 rgba(0,0,0,.1);--ifm-global-shadow-md:0 5px 40px rgba(0,0,0,.2);--ifm-global-shadow-tl:0 12px 28px 0 rgba(0,0,0,.2),0 2px 4px 0 rgba(0,0,0,.1);--ifm-z-index-dropdown:2;--ifm-z-index-fixed:3;--ifm-z-index-overlay:4;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-color-emphasis-100);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:transparent;--ifm-table-stripe-background:rgba(0,0,0,.03);--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-border-color:var(--ifm-color-emphasis-500);--ifm-hr-border-width:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size-sm:2rem;--ifm-avatar-photo-size-md:3rem;--ifm-avatar-photo-size-lg:4rem;--ifm-avatar-photo-size-xl:6rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.0625rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:1rem;--ifm-breadcrumb-padding-vertical:0.5rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-margin:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:1rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:calc(var(--ifm-global-radius)*var(--ifm-pagination-size-multiplier));--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.0625rem;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-size-multiplier:1;--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.0625rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--ifm-tabs-spacing:0.0625rem;--ifm-color-primary:#009688;--ifm-color-primary-dark:#00877a;--ifm-color-primary-darker:#008074;--ifm-color-primary-darkest:#00695f;--ifm-color-primary-light:#00a596;--ifm-color-primary-lighter:#00ad9c;--ifm-color-primary-lightest:#00c3b1;--ifm-color-info:#3f51b5;--docusaurus-announcement-bar-height:auto;--aa-search-input-height:44px;--aa-input-icon-size:20px;--aa-base-unit:16;--aa-spacing-factor:1;--aa-spacing:calc(var(--aa-base-unit)*var(--aa-spacing-factor)*1px);--aa-spacing-half:calc(var(--aa-spacing)/2);--aa-panel-max-height:650px;--aa-base-z-index:7;--aa-font-size:calc(var(--aa-base-unit)*1px);--aa-font-family:inherit;--aa-font-weight-medium:500;--aa-font-weight-semibold:600;--aa-font-weight-bold:700;--aa-icon-size:20px;--aa-icon-stroke-width:1.6;--aa-icon-color-alpha:1;--aa-action-icon-size:20px;--aa-text-color-rgb:38,38,39;--aa-text-color-alpha:1;--aa-primary-color-rgb:62,52,211;--aa-primary-color-alpha:0.2;--aa-muted-color-rgb:128,126,163;--aa-muted-color-alpha:0.6;--aa-panel-border-color-rgb:128,126,163;--aa-panel-border-color-alpha:0.3;--aa-input-border-color-rgb:128,126,163;--aa-input-border-color-alpha:0.8;--aa-background-color-rgb:255,255,255;--aa-background-color-alpha:1;--aa-input-background-color-rgb:255,255,255;--aa-input-background-color-alpha:1;--aa-selected-color-rgb:179,173,214;--aa-selected-color-alpha:0.205;--aa-description-highlight-background-color-rgb:245,223,77;--aa-description-highlight-background-color-alpha:0.5;--aa-detached-media-query:(max-width:680px);--aa-detached-modal-media-query:(min-width:680px);--aa-detached-modal-max-width:680px;--aa-detached-modal-max-height:500px;--aa-overlay-color-rgb:115,114,129;--aa-overlay-color-alpha:0.4;--aa-panel-shadow:0 0 0 1px rgba(35,38,59,.1),0 6px 16px -4px rgba(35,38,59,.15);--aa-scrollbar-width:13px;--aa-scrollbar-track-background-color-rgb:234,234,234;--aa-scrollbar-track-background-color-alpha:1;--aa-scrollbar-thumb-background-color-alpha:1;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300);--collapse-button-bg-color-dark:#2e333a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:transparent}*,.aa-Autocomplete *,.aa-DetachedFormContainer *,.aa-Panel *{box-sizing:border-box}html{-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%;background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base)}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.container--fluid{max-width:inherit}.row{display:flex;flex-direction:row;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none{margin-top:0!important}.row .col{--ifm-col-width:100%;flex:1 0;margin-left:0}.row .col[class*=col--]{flex:0 0 var(--ifm-col-width);max-width:var(--ifm-col-width)}.row .col.col--1{--ifm-col-width:8.33333%}.row .col.col--offset-1{margin-left:8.33333%}.row .col.col--2{--ifm-col-width:16.66667%}.row .col.col--offset-2{margin-left:16.66667%}.row .col.col--3{--ifm-col-width:25%}.row .col.col--offset-3{margin-left:25%}.row .col.col--4{--ifm-col-width:33.33333%}.row .col.col--offset-4{margin-left:33.33333%}.row .col.col--5{--ifm-col-width:41.66667%}.row .col.col--offset-5{margin-left:41.66667%}.row .col.col--6{--ifm-col-width:50%}.row .col.col--offset-6{margin-left:50%}.row .col.col--7{--ifm-col-width:58.33333%}.row .col.col--offset-7{margin-left:58.33333%}.row .col.col--8{--ifm-col-width:66.66667%}.row .col.col--offset-8{margin-left:66.66667%}.row .col.col--9{--ifm-col-width:75%}.row .col.col--offset-9{margin-left:75%}.row .col.col--10{--ifm-col-width:83.33333%}.row .col.col--offset-10{margin-left:83.33333%}.row .col.col--11{--ifm-col-width:91.66667%}.row .col.col--offset-11{margin-left:91.66667%}.row .col.col--12{--ifm-col-width:100%}.row .col.col--offset-12{margin-left:100%}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_tcZa,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid rgba(0,0,0,.1);border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:transparent;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol,ol ul,ul ol,ul ul{margin:0}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}blockquote,hr{border-style:solid}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.breadcrumbs__link:hover,.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-color:var(--ifm-blockquote-border-color);border-width:0;border-left-width:var(--ifm-blockquote-border-left-width);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{border-color:var(--ifm-hr-border-color);border-width:var(--ifm-hr-border-width);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonition h5,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:rgba(53,120,229,.15);--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:rgba(235,237,240,.15);--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:rgba(0,164,0,.15);--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:rgba(84,199,236,.15);--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:rgba(255,186,0,.15);--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:rgba(250,56,62,.15);--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border-color:var(--ifm-alert-border-color);border-style:solid;border-width:var(--ifm-alert-border-width);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{-webkit-text-decoration-color:var(--ifm-alert-border-color);text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar,.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.avatar__photo-link{display:block}.avatar__photo{border-radius:50%;height:var(--ifm-avatar-photo-size-md);overflow:hidden;width:var(--ifm-avatar-photo-size-md)}.avatar__photo--sm{height:var(--ifm-avatar-photo-size-sm);width:var(--ifm-avatar-photo-size-sm)}.avatar__photo--lg{height:var(--ifm-avatar-photo-size-lg);width:var(--ifm-avatar-photo-size-lg)}.avatar__photo--xl{height:var(--ifm-avatar-photo-size-xl);width:var(--ifm-avatar-photo-size-xl)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo+.avatar__intro{margin-left:var(--ifm-avatar-intro-margin)}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.avatar--vertical .avatar__intro{margin-left:0}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:first-child){margin-left:var(--ifm-breadcrumb-spacing)}.breadcrumbs__item:not(:last-child){margin-right:var(--ifm-breadcrumb-spacing)}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;-webkit-filter:var(--ifm-breadcrumb-separator-filter);filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 .5rem;opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__item--active .breadcrumbs__link,.breadcrumbs__item:not(.breadcrumbs__item--active):hover .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border-color:var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);border-style:solid;border-width:var(--ifm-button-border-width);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;-ms-user-select:none;user-select:none}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:transparent;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}.button--primary{--ifm-button-border-color:var(--ifm-color-primary)}.button--primary:not(.button--outline){--ifm-button-background-color:var(--ifm-color-primary)}.button--primary:not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-border-color:var(--ifm-color-primary-darker);--ifm-button-background-color:var(--ifm-color-primary-darker);background-color:var(--ifm-color-primary-darker);border-color:var(--ifm-color-primary-darker)}.button--secondary{--ifm-button-border-color:var(--ifm-color-secondary)}.button--secondary:not(.button--outline){--ifm-button-background-color:var(--ifm-color-secondary)}.button--secondary:not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-border-color:var(--ifm-color-secondary-darker);--ifm-button-background-color:var(--ifm-color-secondary-darker);background-color:var(--ifm-color-secondary-darker);border-color:var(--ifm-color-secondary-darker)}.button--success{--ifm-button-border-color:var(--ifm-color-success)}.button--success:not(.button--outline){--ifm-button-background-color:var(--ifm-color-success)}.button--success:not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-border-color:var(--ifm-color-success-darker);--ifm-button-background-color:var(--ifm-color-success-darker);background-color:var(--ifm-color-success-darker);border-color:var(--ifm-color-success-darker)}.button--info{--ifm-button-border-color:var(--ifm-color-info)}.button--info:not(.button--outline){--ifm-button-background-color:var(--ifm-color-info)}.button--info:not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-border-color:var(--ifm-color-info-darker);--ifm-button-background-color:var(--ifm-color-info-darker);background-color:var(--ifm-color-info-darker);border-color:var(--ifm-color-info-darker)}.button--warning{--ifm-button-border-color:var(--ifm-color-warning)}.button--warning:not(.button--outline){--ifm-button-background-color:var(--ifm-color-warning)}.button--warning:not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-border-color:var(--ifm-color-warning-darker);--ifm-button-background-color:var(--ifm-color-warning-darker);background-color:var(--ifm-color-warning-darker);border-color:var(--ifm-color-warning-darker)}.button--danger{--ifm-button-border-color:var(--ifm-color-danger)}.button--danger:not(.button--outline){--ifm-button-background-color:var(--ifm-color-danger)}.button--danger:not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-border-color:var(--ifm-color-danger-darker);--ifm-button-background-color:var(--ifm-color-danger-darker);background-color:var(--ifm-color-danger-darker);border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:var(--ifm-button-group-margin)}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group>.button--active{z-index:1}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.admonition-content>:last-child,.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;-webkit-transform:translateY(0);transform:translateY(0);visibility:visible}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;list-style:none;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);-webkit-transform:translateY(-.625rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility,-webkit-transform;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor transparent;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:10rem}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.footer__item{margin-top:0}.footer__items{list-style:none;margin-bottom:0;padding-left:0}.codeBlockStandalone_csWH,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{list-style:none;margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.navbar__items--center .navbar__brand,body{margin:0}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{display:flex}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__link--sublist-caret{justify-content:space-between}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;content:"";-webkit-filter:var(--ifm-menu-link-sublist-icon-filter);filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;min-width:1.25rem;-webkit-transform:rotate(180deg);transform:rotate(180deg);transition:-webkit-transform var(--ifm-transition-fast) linear;transition:transform var(--ifm-transition-fast) linear;transition:transform var(--ifm-transition-fast) linear,-webkit-transform var(--ifm-transition-fast) linear;width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret{margin-left:.1rem}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;content:"";-webkit-filter:var(--ifm-menu-link-sublist-icon-filter);filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;-webkit-transform:rotate(180deg);transform:rotate(180deg);transition:-webkit-transform var(--ifm-transition-fast) linear;transition:transform var(--ifm-transition-fast) linear;transition:transform var(--ifm-transition-fast) linear,-webkit-transform var(--ifm-transition-fast) linear;width:1.25rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar--fixed-top{position:-webkit-sticky;position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;position:fixed;transition-timing-function:ease-in-out;top:0;left:0;visibility:hidden}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar__title{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}#nprogress,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:hsla(0,0%,100%,.1);--ifm-navbar-search-input-placeholder-color:hsla(0,0%,100%,.5);color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:hsla(0,0%,100%,.05);--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{-webkit-appearance:none;appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:.9rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input:-ms-input-placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar__search-input::-webkit-input-placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);transition-duration:.25s;transition-property:opacity,visibility,transform,-webkit-transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar--show .navbar-sidebar{-webkit-transform:translateZ(0);transform:translateZ(0)}.navbar-sidebar__backdrop{background-color:rgba(0,0,0,.6);right:0;transition-duration:.1s;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));-webkit-transform:translateZ(0);transform:translateZ(0);transition:-webkit-transform var(--ifm-transition-fast) ease-in-out;transition:transform var(--ifm-transition-fast) ease-in-out;transition:transform var(--ifm-transition-fast) ease-in-out,-webkit-transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{-webkit-transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0);transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination__item,.pagination__link{display:inline-block}.pagination{font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item:not(:first-child){margin-left:var(--ifm-pagination-page-spacing)}.pagination__item:not(:last-child){margin-right:var(--ifm-pagination-page-spacing)}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover{text-decoration:none}.pagination-nav{display:flex}.pagination-nav__item{display:flex;flex:1 50%;max-width:50%}.pagination-nav__item--next{text-align:right}.pagination-nav__item+.pagination-nav__item{margin-left:var(--ifm-spacing-horizontal)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);flex-grow:1;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__item:first-child .pagination-nav__label:before{content:"« "}.pagination-nav__item--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pills__item--active{background:var(--ifm-pills-color-background-active);color:var(--ifm-pills-color-active)}.pills__item:not(.pills__item--active):hover{background-color:var(--ifm-pills-color-background-active)}.pills__item:not(:first-child){margin-left:var(--ifm-pills-spacing)}.pills__item:not(:last-child){margin-right:var(--ifm-pills-spacing)}.docItemContainer_p3Qu article>:first-child,.docItemContainer_p3Qu header+*,.pills__item+.pills__item{margin-top:0}.pills--block{display:flex;justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto;padding-left:0}.tabs__item{border-bottom:3px solid transparent;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#18191a;--ifm-background-surface-color:#242526;--ifm-hover-overlay:hsla(0,0%,100%,.05);--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#333437;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:hsla(0,0%,100%,.07);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec}.admonition h5{margin-bottom:8px;margin-top:0}.admonition-icon{display:inline-block;margin-right:.4em;vertical-align:middle}.admonition-icon svg{stroke-width:0;stroke:var(--ifm-alert-foreground-color);display:inline-block;height:22px;width:22px}.admonition{margin-bottom:1em}.docusaurus-highlight-code-line{background-color:#484d5b;display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}body{font-family:Open Sans,sans-serif!important}.prism-code{font-family:Fira Code,monospace!important}#nprogress .bar{background:#29d;height:2px;left:0;position:fixed;top:0;width:100%;z-index:5}#nprogress .peg{box-shadow:0 0 10px #29d,0 0 5px #29d;height:100%;opacity:1;position:absolute;right:0;-webkit-transform:rotate(3deg) translateY(-4px);transform:rotate(3deg) translateY(-4px);width:100px}#docusaurus-base-url-issue-banner-container{display:none}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;list-style:none;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:transparent transparent transparent var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;-webkit-transform:rotate(0);transform:rotate(0);-webkit-transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}.skipToContent_ZgBM{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_ZgBM:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.announcementBar_IbjG{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}.aa-ClearButton[hidden],.aa-ItemContent:empty,.aa-LoadingIndicator[hidden],.aa-Source:empty,.aa-SourceHeader:empty,.themedImage_W2Cr,[data-theme=dark] .lightToggleIcon_v35p,[data-theme=light] .darkToggleIcon_nQuB,html[data-announcement-bar-initially-dismissed=true] .announcementBar_IbjG{display:none}.announcementBarPlaceholder_NC_W{flex:0 0 10px}.announcementBarClose_FG1z{align-self:stretch;flex:0 0 30px;line-height:0;padding:0}.announcementBarContent_KsVm{flex:1 1 auto;font-size:85%;padding:5px 0;text-align:center}.announcementBarContent_KsVm a{color:inherit;text-decoration:underline}.toggle_S7eR{height:2rem;width:2rem}.aa-Form,.toggleButton_rCf9{align-items:center;width:100%;display:flex}.toggleButton_rCf9{border-radius:50%;height:100%;justify-content:center;transition:background var(--ifm-transition-fast)}.toggleButton_rCf9:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_Pu9x{cursor:not-allowed}[data-theme=dark] .themedImage--dark_oUvU,[data-theme=light] .themedImage--light_TfLj{display:initial}.iconExternalLink_I5OW{margin-left:.3rem}.iconLanguage_dNtB{margin-right:5px;vertical-align:text-bottom}body.dark,body[data-theme=dark]{--aa-text-color-rgb:183,192,199;--aa-primary-color-rgb:146,138,255;--aa-muted-color-rgb:146,138,255;--aa-input-background-color-rgb:0,3,9;--aa-background-color-rgb:21,24,42;--aa-selected-color-rgb:146,138,255;--aa-selected-color-alpha:0.25;--aa-description-highlight-background-color-rgb:0 255 255;--aa-description-highlight-background-color-alpha:0.25;--aa-panel-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--aa-scrollbar-track-background-color-rgb:44,46,64;--aa-muted-color-alpha:1}.aa-Autocomplete,.aa-DetachedFormContainer,.aa-Panel{color:#262627;color:rgba(var(--aa-text-color-rgb),var(--aa-text-color-alpha));font-family:inherit;font-family:var(--aa-font-family);font-size:16px;font-size:var(--aa-font-size);font-weight:400;line-height:1em;margin:0;padding:0;text-align:left}.aa-Form{background-color:#fff;background-color:rgba(var(--aa-input-background-color-rgb),var(--aa-input-background-color-alpha));border:1px solid rgba(128,126,163,.8);border:1px solid rgba(var(--aa-input-border-color-rgb),var(--aa-input-border-color-alpha));border-radius:3px;line-height:1em;margin:0;position:relative}.aa-ClearButton,.aa-Input,.aa-SubmitButton{border:0;background:none}.aa-Form[focus-within]{border-color:#3e34d3;border-color:rgba(var(--aa-primary-color-rgb),1);box-shadow:0 0 0 2px rgba(62,52,211,.2),inset 0 0 0 2px rgba(62,52,211,.2);box-shadow:rgba(var(--aa-primary-color-rgb),var(--aa-primary-color-alpha)) 0 0 0 2px,inset rgba(var(--aa-primary-color-rgb),var(--aa-primary-color-alpha)) 0 0 0 2px;outline:currentColor}.aa-Form:focus-within{border-color:#3e34d3;border-color:rgba(var(--aa-primary-color-rgb),1);box-shadow:0 0 0 2px rgba(62,52,211,.2),inset 0 0 0 2px rgba(62,52,211,.2);box-shadow:rgba(var(--aa-primary-color-rgb),var(--aa-primary-color-alpha)) 0 0 0 2px,inset rgba(var(--aa-primary-color-rgb),var(--aa-primary-color-alpha)) 0 0 0 2px;outline:currentColor}.aa-InputWrapperPrefix{align-items:center;display:flex;flex-shrink:0;height:44px;height:var(--aa-search-input-height);order:1}.aa-Label,.aa-LoadingIndicator{cursor:auto;flex-shrink:0;height:100%;padding:0;text-align:left}.aa-Label svg,.aa-LoadingIndicator svg{stroke-width:1.6;stroke-width:var(--aa-icon-stroke-width);color:#3e34d3;color:rgba(var(--aa-primary-color-rgb),1);height:auto;max-height:20px;max-height:var(--aa-input-icon-size);width:20px;width:var(--aa-input-icon-size)}.aa-LoadingIndicator,.aa-SubmitButton{height:100%;padding-left:11px;padding-left:calc(var(--aa-spacing)*.75 - 1px);padding-right:8px;padding-right:var(--aa-spacing-half);width:47px;width:calc(var(--aa-spacing)*1.75 + var(--aa-icon-size) - 1px)}.aa-SubmitButton{-webkit-appearance:none;appearance:none;margin:0}.aa-LoadingIndicator{align-items:center;display:flex;justify-content:center}.aa-InputWrapper{order:3;position:relative;width:100%}.aa-Input{-webkit-appearance:none;appearance:none;color:#262627;color:rgba(var(--aa-text-color-rgb),var(--aa-text-color-alpha));font:inherit;height:44px;height:var(--aa-search-input-height);padding:0;width:100%}.aa-Input:-ms-input-placeholder{color:rgba(128,126,163,.6);color:rgba(var(--aa-muted-color-rgb),var(--aa-muted-color-alpha));opacity:1}.aa-Input::-webkit-input-placeholder{color:rgba(128,126,163,.6);color:rgba(var(--aa-muted-color-rgb),var(--aa-muted-color-alpha));opacity:1}.aa-Input::placeholder{color:rgba(128,126,163,.6);color:rgba(var(--aa-muted-color-rgb),var(--aa-muted-color-alpha));opacity:1}.aa-Input:focus{border-color:none;box-shadow:none;outline:0}.aa-Input::-webkit-search-cancel-button,.aa-Input::-webkit-search-decoration,.aa-Input::-webkit-search-results-button,.aa-Input::-webkit-search-results-decoration{-webkit-appearance:none;appearance:none}.aa-InputWrapperSuffix{align-items:center;display:flex;height:44px;height:var(--aa-search-input-height);order:4}.aa-ClearButton{align-items:center;color:rgba(128,126,163,.6);color:rgba(var(--aa-muted-color-rgb),var(--aa-muted-color-alpha));cursor:pointer;display:flex;height:100%;margin:0;padding:0 12.8333333333px;padding:0 calc(var(--aa-spacing)*.83333 - .5px)}.aa-Item,.aa-ItemIcon{align-items:center;border-radius:3px}.aa-ClearButton:focus,.aa-ClearButton:hover,.aa-ItemActionButton:focus svg,.aa-ItemActionButton:hover svg{color:#262627;color:rgba(var(--aa-text-color-rgb),var(--aa-text-color-alpha))}.aa-ClearButton svg{stroke-width:1.6;stroke-width:var(--aa-icon-stroke-width);width:20px;width:var(--aa-icon-size)}.aa-Panel{background-color:#fff;background-color:rgba(var(--aa-background-color-rgb),var(--aa-background-color-alpha));border-radius:4px;border-radius:calc(var(--aa-spacing)/4);box-shadow:0 0 0 1px rgba(35,38,59,.1),0 6px 16px -4px rgba(35,38,59,.15);box-shadow:var(--aa-panel-shadow);margin:8px 0 0;overflow:hidden;position:absolute;transition:opacity .2s ease-in,filter .2s ease-in,-webkit-filter .2s ease-in}.aa-Panel button{-webkit-appearance:none;appearance:none;background:none;border:0;margin:0;padding:0}.aa-PanelLayout{height:100%;margin:0;max-height:650px;max-height:var(--aa-panel-max-height);overflow-y:auto;padding:0;position:relative;text-align:left}.aa-PanelLayoutColumns--twoGolden{display:grid;grid-template-columns:39.2% auto;overflow:hidden;padding:0}.aa-PanelLayoutColumns--two{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));overflow:hidden;padding:0}.aa-PanelLayoutColumns--three{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));overflow:hidden;padding:0}.aa-Panel--stalled .aa-Source{-webkit-filter:grayscale(1);filter:grayscale(1);opacity:.8}.aa-Panel--scrollable{margin:0;max-height:650px;max-height:var(--aa-panel-max-height);overflow-x:hidden;overflow-y:auto;padding:8px;padding:var(--aa-spacing-half);scrollbar-color:#fff #eaeaea;scrollbar-color:rgba(var(--aa-scrollbar-thumb-background-color-rgb),var(--aa-scrollbar-thumb-background-color-alpha)) rgba(var(--aa-scrollbar-track-background-color-rgb),var(--aa-scrollbar-track-background-color-alpha));scrollbar-width:thin}.aa-Panel--scrollable::-webkit-scrollbar{width:13px;width:var(--aa-scrollbar-width)}.aa-Panel--scrollable::-webkit-scrollbar-track{background-color:#eaeaea;background-color:rgba(var(--aa-scrollbar-track-background-color-rgb),var(--aa-scrollbar-track-background-color-alpha))}.aa-Panel--scrollable::-webkit-scrollbar-thumb{background-color:#fff;background-color:rgba(var(--aa-scrollbar-thumb-background-color-rgb),var(--aa-scrollbar-thumb-background-color-alpha));border:3px solid #eaeaea;border-color:rgba(var(--aa-scrollbar-track-background-color-rgb),var(--aa-scrollbar-track-background-color-alpha));border-radius:9999px;border-right:2px solid rgba(var(--aa-scrollbar-track-background-color-rgb),var(--aa-scrollbar-track-background-color-alpha))}.aa-Source{margin:0;padding:0;position:relative;width:100%}.aa-SourceNoResults{font-size:1em;margin:0;padding:16px;padding:var(--aa-spacing)}.aa-List{list-style:none;margin:0}.aa-List,.aa-SourceHeader{padding:0;position:relative}.aa-SourceHeader{margin:8px .5em 8px 0;margin:var(--aa-spacing-half) .5em var(--aa-spacing-half) 0}.aa-SourceHeaderTitle{background:#fff;background:rgba(var(--aa-background-color-rgb),var(--aa-background-color-alpha));color:#3e34d3;color:rgba(var(--aa-primary-color-rgb),1);display:inline-block;font-size:.8em;font-weight:600;font-weight:var(--aa-font-weight-semibold);margin:0;padding:0 8px 0 0;padding:0 var(--aa-spacing-half) 0 0;position:relative;z-index:7;z-index:var(--aa-base-z-index)}.aa-SourceHeaderLine{border-bottom:1px solid #3e34d3;border-bottom:1px solid rgba(var(--aa-primary-color-rgb),1);display:block;height:2px;left:0;margin:0;opacity:.3;padding:0;position:absolute;right:0;top:8px;top:var(--aa-spacing-half);z-index:6;z-index:calc(var(--aa-base-z-index) - 1)}.aa-SourceFooterSeeAll{background:linear-gradient(180deg,#fff,rgba(128,126,163,.14));background:linear-gradient(180deg,rgba(var(--aa-background-color-rgb),var(--aa-background-color-alpha)),rgba(128,126,163,.14));border:1px solid rgba(128,126,163,.6);border:1px solid rgba(var(--aa-muted-color-rgb),var(--aa-muted-color-alpha));border-radius:5px;box-shadow:inset 0 0 2px #fff,0 2px 2px -1px rgba(76,69,88,.15);color:inherit;font-size:.95em;font-weight:500;font-weight:var(--aa-font-weight-medium);padding:.475em 1em .6em;text-decoration:none}.aa-SourceFooterSeeAll:focus,.aa-SourceFooterSeeAll:hover{border:1px solid #3e34d3;border:1px solid rgba(var(--aa-primary-color-rgb),1);color:#3e34d3;color:rgba(var(--aa-primary-color-rgb),1)}.aa-Item{cursor:pointer;display:grid;min-height:40px;min-height:calc(var(--aa-spacing)*2.5);padding:4px;padding:calc(var(--aa-spacing-half)/2)}.aa-Item[aria-selected=true]{background-color:rgba(179,173,214,.205);background-color:rgba(var(--aa-selected-color-rgb),var(--aa-selected-color-alpha))}.aa-Item[aria-selected=true] .aa-ActiveOnly,.aa-Item[aria-selected=true] .aa-ItemActionButton{visibility:visible}.aa-ItemIcon{stroke-width:1.6;stroke-width:var(--aa-icon-stroke-width);background:#fff;background:rgba(var(--aa-background-color-rgb),var(--aa-background-color-alpha));box-shadow:inset 0 0 0 1px rgba(128,126,163,.3);box-shadow:inset 0 0 0 1px rgba(var(--aa-panel-border-color-rgb),var(--aa-panel-border-color-alpha));color:#7777a3;color:rgba(var(--aa-icon-color-rgb),var(--aa-icon-color-alpha));display:flex;flex-shrink:0;font-size:.7em;height:28px;height:calc(var(--aa-icon-size) + var(--aa-spacing-half));justify-content:center;overflow:hidden;text-align:center;width:28px;width:calc(var(--aa-icon-size) + var(--aa-spacing-half))}.aa-ItemIcon img{height:auto;max-height:20px;max-height:calc(var(--aa-icon-size) + var(--aa-spacing-half) - 8px);max-width:20px;max-width:calc(var(--aa-icon-size) + var(--aa-spacing-half) - 8px);width:auto}.aa-ItemIcon svg{height:20px;height:var(--aa-icon-size);width:20px;width:var(--aa-icon-size)}.aa-ItemIcon--alignTop{align-self:flex-start}.aa-ItemIcon--noBorder{background:none;box-shadow:none}.aa-ItemIcon--picture{height:96px;width:96px}.aa-ItemIcon--picture img{max-height:100%;max-width:100%;padding:8px;padding:var(--aa-spacing-half)}.aa-ItemContent{grid-gap:8px;grid-gap:var(--aa-spacing-half);align-items:center;cursor:pointer;display:grid;gap:8px;gap:var(--aa-spacing-half);grid-auto-flow:column;line-height:1.25em;overflow:hidden}.aa-ItemContent mark{background:none;color:#262627;color:rgba(var(--aa-text-color-rgb),var(--aa-text-color-alpha));font-style:normal;font-weight:700;font-weight:var(--aa-font-weight-bold)}.aa-ItemContent--dual{display:flex;flex-direction:column;justify-content:space-between;text-align:left}.aa-ItemContent--dual .aa-ItemContentSubtitle,.aa-ItemContent--dual .aa-ItemContentTitle,.tocCollapsibleContent_MpvI a{display:block}.aa-ItemContent--indented{padding-left:36px;padding-left:calc(var(--aa-icon-size) + var(--aa-spacing))}.aa-ItemContentBody{grid-gap:4px;grid-gap:calc(var(--aa-spacing-half)/2);display:grid;gap:4px;gap:calc(var(--aa-spacing-half)/2)}.aa-ItemContentTitle{display:inline-block;margin:0 .5em 0 0;max-width:100%;overflow:hidden;padding:0;text-overflow:ellipsis;white-space:nowrap}.aa-ItemContentSubtitle{font-size:.92em}.aa-ItemContentSubtitleIcon:before{border-color:rgba(128,126,163,.64);border-color:rgba(var(--aa-muted-color-rgb),.64);border-style:solid;content:"";display:inline-block;left:1px;position:relative;top:-3px}.aa-PanelFooter:after,.aa-PanelHeader:after{position:absolute;pointer-events:none;right:0;content:"";left:0}.aa-ItemContentSubtitle--inline .aa-ItemContentSubtitleIcon:before{border-width:0 0 1.5px;margin-left:8px;margin-left:var(--aa-spacing-half);margin-right:4px;margin-right:calc(var(--aa-spacing-half)/2);width:10px;width:calc(var(--aa-spacing-half) + 2px)}.aa-ItemContentSubtitle--standalone{grid-gap:8px;grid-gap:var(--aa-spacing-half);align-items:center;color:#262627;color:rgba(var(--aa-text-color-rgb),var(--aa-text-color-alpha));display:grid;gap:8px;gap:var(--aa-spacing-half);grid-auto-flow:column;justify-content:start}.aa-ItemContentSubtitle--standalone .aa-ItemContentSubtitleIcon:before{border-radius:0 0 0 3px;border-width:0 0 1.5px 1.5px;height:8px;height:var(--aa-spacing-half);width:8px;width:var(--aa-spacing-half)}.aa-ItemContentSubtitleCategory{color:#807ea3;color:rgba(var(--aa-muted-color-rgb),1);font-weight:500}.aa-ItemContentDescription{color:#262627;color:rgba(var(--aa-text-color-rgb),var(--aa-text-color-alpha));font-size:.85em;max-width:100%;overflow-x:hidden;text-overflow:ellipsis}.aa-ItemContentDescription:empty,.collapseSidebarButton_FykI,.docSidebarContainer_rKC_,.sidebarLogo_YUvz{display:none}.aa-ItemContentDescription mark{background:rgba(245,223,77,.5);background:rgba(var(--aa-description-highlight-background-color-rgb),var(--aa-description-highlight-background-color-alpha));color:#262627;color:rgba(var(--aa-text-color-rgb),var(--aa-text-color-alpha));font-style:normal;font-weight:500;font-weight:var(--aa-font-weight-medium)}.aa-ItemContentDash{color:rgba(128,126,163,.6);color:rgba(var(--aa-muted-color-rgb),var(--aa-muted-color-alpha));display:none;opacity:.4}.aa-ItemContentTag{background-color:rgba(62,52,211,.2);background-color:rgba(var(--aa-primary-color-rgb),var(--aa-primary-color-alpha));border-radius:3px;margin:0 .4em 0 0;padding:.08em .3em}.aa-ItemLink,.aa-ItemWrapper{grid-gap:4px;grid-gap:calc(var(--aa-spacing-half)/2);align-items:center;color:inherit;display:grid;gap:4px;gap:calc(var(--aa-spacing-half)/2);grid-auto-flow:column;justify-content:space-between;width:100%}.aa-ItemLink{color:inherit;text-decoration:none}.aa-ItemActions{display:grid;grid-auto-flow:column;height:100%;justify-self:end;margin:0 -5.3333333333px;margin:0 calc(var(--aa-spacing)/-3);padding:0 2px 0 0}.aa-ItemActionButton{align-items:center;background:none;border:0;color:rgba(128,126,163,.6);color:rgba(var(--aa-muted-color-rgb),var(--aa-muted-color-alpha));cursor:pointer;display:flex;flex-shrink:0;padding:0}.aa-ItemActionButton svg{stroke-width:1.6;stroke-width:var(--aa-icon-stroke-width);color:rgba(128,126,163,.6);color:rgba(var(--aa-muted-color-rgb),var(--aa-muted-color-alpha));margin:5.3333333333px;margin:calc(var(--aa-spacing)/3);width:20px;width:var(--aa-action-icon-size)}.aa-ActiveOnly{visibility:hidden}.aa-PanelHeader{align-items:center;background:#3e34d3;background:rgba(var(--aa-primary-color-rgb),1);color:#fff;display:grid;height:var(--aa-modal-header-height);margin:0;padding:8px 16px;padding:var(--aa-spacing-half) var(--aa-spacing);position:relative}.aa-PanelHeader:after{background-image:linear-gradient(#fff,hsla(0,0%,100%,0));background-image:linear-gradient(rgba(var(--aa-background-color-rgb),1),rgba(var(--aa-background-color-rgb),0));bottom:-8px;bottom:calc(var(--aa-spacing-half)*-1);height:8px;height:var(--aa-spacing-half)}.aa-PanelFooter,.aa-PanelHeader:after{z-index:7;z-index:var(--aa-base-z-index)}.aa-PanelFooter{background-color:#fff;background-color:rgba(var(--aa-background-color-rgb),var(--aa-background-color-alpha));box-shadow:inset 0 1px 0 rgba(128,126,163,.3);box-shadow:inset 0 1px 0 rgba(var(--aa-panel-border-color-rgb),var(--aa-panel-border-color-alpha));display:flex;justify-content:space-between;margin:0;padding:16px;padding:var(--aa-spacing);position:relative}.aa-PanelFooter:after{background-image:linear-gradient(hsla(0,0%,100%,0),rgba(128,126,163,.6));background-image:linear-gradient(rgba(var(--aa-background-color-rgb),0),rgba(var(--aa-muted-color-rgb),var(--aa-muted-color-alpha)));height:16px;height:var(--aa-spacing);opacity:.12;top:-16px;top:calc(var(--aa-spacing)*-1);z-index:6;z-index:calc(var(--aa-base-z-index) - 1)}.aa-DetachedContainer{background:#fff;background:rgba(var(--aa-background-color-rgb),var(--aa-background-color-alpha));bottom:0;box-shadow:0 0 0 1px rgba(35,38,59,.1),0 6px 16px -4px rgba(35,38,59,.15);box-shadow:var(--aa-panel-shadow);display:flex;flex-direction:column;left:0;margin:0;overflow:hidden;padding:0;position:fixed;right:0;top:0;z-index:7;z-index:var(--aa-base-z-index)}.aa-DetachedContainer:after{height:32px}.aa-DetachedContainer .aa-SourceHeader{margin:8px 0 8px 2px;margin:var(--aa-spacing-half) 0 var(--aa-spacing-half) 2px}.aa-DetachedContainer .aa-Panel{background-color:#fff;background-color:rgba(var(--aa-background-color-rgb),var(--aa-background-color-alpha));border-radius:0;box-shadow:none;flex-grow:1;margin:0;padding:0;position:relative}.aa-DetachedContainer .aa-PanelLayout{bottom:0;box-shadow:none;left:0;margin:0;max-height:none;overflow-y:auto;position:absolute;right:0;top:0;width:100%}.aa-DetachedFormContainer{border-bottom:1px solid rgba(128,126,163,.3);border-bottom:1px solid rgba(var(--aa-panel-border-color-rgb),var(--aa-panel-border-color-alpha));display:flex;flex-direction:row;justify-content:space-between;margin:0;padding:8px;padding:var(--aa-spacing-half)}.aa-DetachedCancelButton{background:none;border:0;border-radius:3px;color:#262627;color:rgba(var(--aa-text-color-rgb),var(--aa-text-color-alpha));cursor:pointer;font:inherit;margin:0 0 0 8px;margin:0 0 0 var(--aa-spacing-half);padding:0 8px;padding:0 var(--aa-spacing-half)}.aa-DetachedCancelButton:focus,.aa-DetachedCancelButton:hover{box-shadow:inset 0 0 0 1px rgba(128,126,163,.3);box-shadow:inset 0 0 0 1px rgba(var(--aa-panel-border-color-rgb),var(--aa-panel-border-color-alpha))}.aa-DetachedContainer--modal{border-radius:6px;bottom:inherit;height:auto;margin:0 auto;max-width:680px;max-width:var(--aa-detached-modal-max-width);position:absolute;top:3%}.aa-DetachedContainer--modal .aa-PanelLayout{max-height:500px;max-height:var(--aa-detached-modal-max-height);padding-bottom:8px;padding-bottom:var(--aa-spacing-half);position:static}.aa-DetachedSearchButton{align-items:center;background-color:#fff;background-color:rgba(var(--aa-input-background-color-rgb),var(--aa-input-background-color-alpha));border:1px solid rgba(128,126,163,.8);border:1px solid rgba(var(--aa-input-border-color-rgb),var(--aa-input-border-color-alpha));border-radius:3px;color:rgba(128,126,163,.6);color:rgba(var(--aa-muted-color-rgb),var(--aa-muted-color-alpha));cursor:pointer;display:flex;font:inherit;font-family:inherit;font-family:var(--aa-font-family);font-size:16px;font-size:var(--aa-font-size);height:44px;height:var(--aa-search-input-height);margin:0;padding:0 5.5px;padding:0 calc(var(--aa-search-input-height)/8);position:relative;text-align:left;width:100%}.aa-DetachedSearchButton:focus{border-color:#3e34d3;border-color:rgba(var(--aa-primary-color-rgb),1);box-shadow:0 0 0 3px rgba(62,52,211,.2),inset 0 0 0 2px rgba(62,52,211,.2);box-shadow:rgba(var(--aa-primary-color-rgb),var(--aa-primary-color-alpha)) 0 0 0 3px,inset rgba(var(--aa-primary-color-rgb),var(--aa-primary-color-alpha)) 0 0 0 2px;outline:currentColor}.aa-DetachedSearchButtonIcon{align-items:center;color:#3e34d3;color:rgba(var(--aa-primary-color-rgb),1);cursor:auto;display:flex;height:100%;justify-content:center;width:36px;width:calc(var(--aa-icon-size) + var(--aa-spacing))}.aa-Detached{height:100vh;overflow:hidden}.aa-DetachedOverlay{background-color:hsla(244,6%,48%,.4);background-color:rgba(var(--aa-overlay-color-rgb),var(--aa-overlay-color-alpha));height:100vh;left:0;margin:0;padding:0;position:fixed;right:0;top:0;z-index:6;z-index:calc(var(--aa-base-z-index) - 1)}.aa-GradientBottom,.aa-GradientTop{height:8px;height:var(--aa-spacing-half);left:0;pointer-events:none;position:absolute;right:0;z-index:7;z-index:var(--aa-base-z-index)}.aa-GradientTop{background-image:linear-gradient(#fff,hsla(0,0%,100%,0));background-image:linear-gradient(rgba(var(--aa-background-color-rgb),1),rgba(var(--aa-background-color-rgb),0));top:0}.aa-GradientBottom{background-image:linear-gradient(hsla(0,0%,100%,0),#fff);background-image:linear-gradient(rgba(var(--aa-background-color-rgb),0),rgba(var(--aa-background-color-rgb),1));border-bottom-left-radius:4px;border-bottom-left-radius:calc(var(--aa-spacing)/4);border-bottom-right-radius:4px;border-bottom-right-radius:calc(var(--aa-spacing)/4);bottom:0}.dsla-search-wrapper{margin-left:var(--aa-spacing)}.navbarHideable_ObN2{transition:-webkit-transform var(--ifm-transition-fast) ease;transition:transform var(--ifm-transition-fast) ease;transition:transform var(--ifm-transition-fast) ease,-webkit-transform var(--ifm-transition-fast) ease}.navbarHidden_FtgE{-webkit-transform:translate3d(0,calc(-100% - 2px),0);transform:translate3d(0,calc(-100% - 2px),0)}.footerLogoLink_gHmE{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_gHmE:hover,.hash-link:focus,:hover>.hash-link{opacity:1}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.main-wrapper{flex:1 0 auto}.docusaurus-mt-lg{margin-top:3rem}.iconEdit_dcUD{margin-right:.3em;vertical-align:sub}.tag_hD8n{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_hD8n:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_D6E_{border-radius:.5rem;font-size:90%;padding:.3rem .5rem}.tagWithCount_i0QQ{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_i0QQ:after,.tagWithCount_i0QQ:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_i0QQ:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;-webkit-transform:translate(50%,-50%) rotate(-45deg);transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_i0QQ:after{border-radius:50%;height:.5rem;left:0;-webkit-transform:translateY(-50%);transform:translateY(-50%);width:.5rem}.tagWithCount_i0QQ span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tags_XVD_{display:inline}.tag_JSN8{display:inline-block;margin:0 .4rem .5rem 0}.lastUpdated_foO9{font-size:smaller;font-style:italic;margin-top:.2rem}.tableOfContents_cNA8{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:-webkit-sticky;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.tocCollapsible_jdIR{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleButton_Fzxq{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_Fzxq:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";-webkit-filter:var(--ifm-menu-link-sublist-icon-filter);filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;-webkit-transform:rotate(180deg);transform:rotate(180deg);transition:-webkit-transform var(--ifm-transition-fast);transition:transform var(--ifm-transition-fast);transition:transform var(--ifm-transition-fast),-webkit-transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleContent_MpvI>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_MpvI ul li{margin:.4rem .8rem}.tocCollapsibleExpanded_laf4 .tocCollapsibleButton_Fzxq:after{-webkit-transform:none;transform:none}.anchorWithStickyNavbar_mojV{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_R0VQ{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;-ms-user-select:none;user-select:none}.hash-link:before{content:"#"}.breadcrumbsContainer_Xlws{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.copyButton_eDfN{background:inherit;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;opacity:0;padding:.4rem;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2);transition:opacity .2s ease-in-out}.copyButton_eDfN:focus-visible,.copyButton_eDfN:hover,.theme-code-block:hover .copyButtonCopied_ljy5{opacity:1!important}.theme-code-block:hover .copyButton_eDfN:not(.copyButtonCopied_ljy5){opacity:.4}.copyButtonIcons_W9eQ{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_XEyF,.copyButtonSuccessIcon_i9w9{fill:currentColor;height:inherit;left:0;opacity:inherit;position:absolute;top:0;transition:.15s;width:inherit}.copyButtonSuccessIcon_i9w9{color:#00d600;left:50%;opacity:0;top:50%;-webkit-transform:translate(-50%,-50%) scale(.33);transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_ljy5 .copyButtonIcon_XEyF{opacity:0;-webkit-transform:scale(.33);transform:scale(.33)}.copyButtonCopied_ljy5 .copyButtonSuccessIcon_i9w9{opacity:1;-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.codeBlockContainer_I0IT{box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_wNvx{border-radius:var(--ifm-global-radius);direction:ltr;position:relative}.codeBlockTitle_BvAR{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:var(--ifm-global-radius);border-top-right-radius:var(--ifm-global-radius);font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_jd64{background-color:inherit;margin:0;padding:0}.codeBlockTitle_BvAR+.codeBlockContent_wNvx .codeBlock_jd64{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_mRuA{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.details_BAp3{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.contains-task-list_tsSF{list-style:none;padding-left:0}.img_E7b_{height:auto}.backToTopButton_RiI4{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;-webkit-transform:scale(0);transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_RiI4:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_ssHd{opacity:1;-webkit-transform:scale(1);transform:scale(1);visibility:visible}.docMainContainer_TCnq,.docPage_P2Lg{display:flex;width:100%}.heroBanner_UJJx{overflow:hidden;padding:4rem 0;position:relative;text-align:center}.buttons_pzbO{justify-content:center}.buttons_pzbO,.features_keug{align-items:center;display:flex}.features_keug{padding:2rem 0;width:100%}.featureImage_yA8i{height:200px;width:200px}.container_czXe{display:flex;flex-direction:column;margin:0;padding:10px 20px;width:100%}.header_A16n{font-weight:600}.h1_Sl_Q{align-self:center;padding:10px}@media screen and (min-width:966px){.h1_Sl_Q{background:var(--ifm-color-primary);border-radius:8px;box-shadow:-1px 1px var(--ifm-color-primary-dark),-1px 1px var(--ifm-color-primary-dark),-1px 1px var(--ifm-color-primary-dark),-2px 2px var(--ifm-color-primary-dark),-2px 2px var(--ifm-color-primary-dark);margin-right:30px}.container_czXe{flex-direction:row}.container_czXe img{height:300px}}@media (min-width:997px){:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_FG1z,.announcementBarPlaceholder_NC_W{flex-basis:50px}.lastUpdated_foO9{text-align:right}.docItemCol_nDMA{max-width:75%!important}.tocMobile_diN6{display:none}.collapseSidebarButton_FykI{background-color:var(--ifm-button-background-color);border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:-webkit-sticky;position:sticky}.collapseSidebarButtonIcon_DTRl{margin-top:4px;-webkit-transform:rotate(180deg);transform:rotate(180deg)}.expandSidebarButtonIcon_AV8S,[dir=rtl] .collapseSidebarButtonIcon_DTRl{-webkit-transform:rotate(0);transform:rotate(0)}[data-theme=dark] .collapseSidebarButton_FykI,[data-theme=dark] .collapsedDocSidebar_Xgr6:focus,[data-theme=dark] .collapsedDocSidebar_Xgr6:hover{background-color:var(--collapse-button-bg-color-dark)}.collapsedDocSidebar_Xgr6:focus,.collapsedDocSidebar_Xgr6:hover,[data-theme=dark] .collapseSidebarButton_FykI:focus,[data-theme=dark] .collapseSidebarButton_FykI:hover{background-color:var(--ifm-color-emphasis-200)}.menuHtmlItem_fVIQ{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_izAj{flex-grow:1;padding:.5rem}.menuWithAnnouncementBar_l2a_{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_RiAD{display:flex;flex-direction:column;height:100%;max-height:100vh;padding-top:var(--ifm-navbar-height);position:-webkit-sticky;position:sticky;top:0;transition:opacity 50ms;width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_d0QC{padding-top:0}.sidebarHidden_Lg_2{height:0;opacity:0;overflow:hidden;visibility:hidden}.sidebarLogo_YUvz{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_YUvz img{height:2rem;margin-right:.5rem}.docMainContainer_TCnq{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_WDCb{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docSidebarContainer_rKC_{border-right:1px solid var(--ifm-toc-border-color);-webkit-clip-path:inset(0);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_nvlY{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.collapsedDocSidebar_Xgr6{align-items:center;display:flex;height:100%;justify-content:center;max-height:100vh;position:-webkit-sticky;position:sticky;top:0;transition:background-color var(--ifm-transition-fast) ease}[dir=rtl] .expandSidebarButtonIcon_AV8S{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.docItemWrapperEnhanced_r_WG{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.row .col.col.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_vKtC,.footer__link-separator,.navbar__item,.tableOfContents_cNA8{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.pills--block .pills__item:not(:first-child){margin-top:var(--ifm-pills-spacing)}.pills--block .pills__item:not(:last-child){margin-bottom:var(--ifm-pills-spacing)}.tabs--block .tabs__item:not(:first-child){margin-top:var(--ifm-tabs-spacing)}.tabs--block .tabs__item:not(:last-child){margin-bottom:var(--ifm-tabs-spacing)}.docItemContainer_WX_Y{padding:0 .3rem}}@media screen and (max-width:966px){.heroBanner_UJJx{padding:2rem}}@media (hover:hover){.backToTopButton_RiI4:hover{background-color:var(--ifm-color-emphasis-300)}.aa-TouchOnly{display:none}}@media (hover:none) and (pointer:coarse){:root{--aa-spacing-factor:1.2;--aa-action-icon-size:22px}.aa-LoadingIndicator,.aa-SubmitButton{padding-left:3px;padding-left:calc(var(--aa-spacing-half)/ 2 - 1px);width:39px;width:calc(var(--aa-icon-size) + var(--aa-spacing)*1.25 - 1px)}.aa-ClearButton{padding:0 10.1666666667px;padding:0 calc(var(--aa-spacing)*.66667 - .5px)}.aa-ItemActionButton:focus svg,.aa-ItemActionButton:hover svg{color:inherit}.aa-DesktopOnly{display:none}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media screen and (prefers-reduced-motion){.aa-Panel{transition:none}}@media print{.announcementBar_IbjG,.footer,.menu,.navbar,.pagination-nav,.table-of-contents{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_mRuA{white-space:pre-wrap}} \ No newline at end of file +.container,.row .col{padding:0 var(--ifm-spacing-horizontal);width:100%}.row .col,img{max-width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.admonition-icon svg,.alert__icon svg{fill:var(--ifm-alert-foreground-color)}.markdown li,body{word-wrap:break-word}.toggleButton_rCf9,html{-webkit-tap-highlight-color:transparent}:root,body.dark,body[data-theme=dark]{--aa-icon-color-rgb:119,119,163;--aa-scrollbar-thumb-background-color-rgb:var(--aa-background-color-rgb)}.button,.dropdown__link,.navbar__title,.text--truncate{white-space:nowrap}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:transparent;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:rgba(0,0,0,.05);--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 rgba(0,0,0,.1);--ifm-global-shadow-md:0 5px 40px rgba(0,0,0,.2);--ifm-global-shadow-tl:0 12px 28px 0 rgba(0,0,0,.2),0 2px 4px 0 rgba(0,0,0,.1);--ifm-z-index-dropdown:2;--ifm-z-index-fixed:3;--ifm-z-index-overlay:4;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-color-emphasis-100);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:transparent;--ifm-table-stripe-background:rgba(0,0,0,.03);--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-border-color:var(--ifm-color-emphasis-500);--ifm-hr-border-width:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size-sm:2rem;--ifm-avatar-photo-size-md:3rem;--ifm-avatar-photo-size-lg:4rem;--ifm-avatar-photo-size-xl:6rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.0625rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:1rem;--ifm-breadcrumb-padding-vertical:0.5rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-margin:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:1rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:calc(var(--ifm-global-radius)*var(--ifm-pagination-size-multiplier));--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.0625rem;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-size-multiplier:1;--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.0625rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--ifm-tabs-spacing:0.0625rem;--ifm-color-primary:#009688;--ifm-color-primary-dark:#00877a;--ifm-color-primary-darker:#008074;--ifm-color-primary-darkest:#00695f;--ifm-color-primary-light:#00a596;--ifm-color-primary-lighter:#00ad9c;--ifm-color-primary-lightest:#00c3b1;--ifm-color-info:#3f51b5;--docusaurus-announcement-bar-height:auto;--aa-search-input-height:44px;--aa-input-icon-size:20px;--aa-base-unit:16;--aa-spacing-factor:1;--aa-spacing:calc(var(--aa-base-unit)*var(--aa-spacing-factor)*1px);--aa-spacing-half:calc(var(--aa-spacing)/2);--aa-panel-max-height:650px;--aa-base-z-index:7;--aa-font-size:calc(var(--aa-base-unit)*1px);--aa-font-family:inherit;--aa-font-weight-medium:500;--aa-font-weight-semibold:600;--aa-font-weight-bold:700;--aa-icon-size:20px;--aa-icon-stroke-width:1.6;--aa-icon-color-alpha:1;--aa-action-icon-size:20px;--aa-text-color-rgb:38,38,39;--aa-text-color-alpha:1;--aa-primary-color-rgb:62,52,211;--aa-primary-color-alpha:0.2;--aa-muted-color-rgb:128,126,163;--aa-muted-color-alpha:0.6;--aa-panel-border-color-rgb:128,126,163;--aa-panel-border-color-alpha:0.3;--aa-input-border-color-rgb:128,126,163;--aa-input-border-color-alpha:0.8;--aa-background-color-rgb:255,255,255;--aa-background-color-alpha:1;--aa-input-background-color-rgb:255,255,255;--aa-input-background-color-alpha:1;--aa-selected-color-rgb:179,173,214;--aa-selected-color-alpha:0.205;--aa-description-highlight-background-color-rgb:245,223,77;--aa-description-highlight-background-color-alpha:0.5;--aa-detached-media-query:(max-width:680px);--aa-detached-modal-media-query:(min-width:680px);--aa-detached-modal-max-width:680px;--aa-detached-modal-max-height:500px;--aa-overlay-color-rgb:115,114,129;--aa-overlay-color-alpha:0.4;--aa-panel-shadow:0 0 0 1px rgba(35,38,59,.1),0 6px 16px -4px rgba(35,38,59,.15);--aa-scrollbar-width:13px;--aa-scrollbar-track-background-color-rgb:234,234,234;--aa-scrollbar-track-background-color-alpha:1;--aa-scrollbar-thumb-background-color-alpha:1;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300);--collapse-button-bg-color-dark:#2e333a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:transparent}*,.aa-Autocomplete *,.aa-DetachedFormContainer *,.aa-Panel *{box-sizing:border-box}html{-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%;background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base)}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.container--fluid{max-width:inherit}.row{display:flex;flex-direction:row;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none{margin-top:0!important}.row .col{--ifm-col-width:100%;flex:1 0;margin-left:0}.row .col[class*=col--]{flex:0 0 var(--ifm-col-width);max-width:var(--ifm-col-width)}.row .col.col--1{--ifm-col-width:8.33333%}.row .col.col--offset-1{margin-left:8.33333%}.row .col.col--2{--ifm-col-width:16.66667%}.row .col.col--offset-2{margin-left:16.66667%}.row .col.col--3{--ifm-col-width:25%}.row .col.col--offset-3{margin-left:25%}.row .col.col--4{--ifm-col-width:33.33333%}.row .col.col--offset-4{margin-left:33.33333%}.row .col.col--5{--ifm-col-width:41.66667%}.row .col.col--offset-5{margin-left:41.66667%}.row .col.col--6{--ifm-col-width:50%}.row .col.col--offset-6{margin-left:50%}.row .col.col--7{--ifm-col-width:58.33333%}.row .col.col--offset-7{margin-left:58.33333%}.row .col.col--8{--ifm-col-width:66.66667%}.row .col.col--offset-8{margin-left:66.66667%}.row .col.col--9{--ifm-col-width:75%}.row .col.col--offset-9{margin-left:75%}.row .col.col--10{--ifm-col-width:83.33333%}.row .col.col--offset-10{margin-left:83.33333%}.row .col.col--11{--ifm-col-width:91.66667%}.row .col.col--offset-11{margin-left:91.66667%}.row .col.col--12{--ifm-col-width:100%}.row .col.col--offset-12{margin-left:100%}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_tcZa,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid rgba(0,0,0,.1);border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:transparent;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol,ol ul,ul ol,ul ul{margin:0}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}blockquote,hr{border-style:solid}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.breadcrumbs__link:hover,.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-color:var(--ifm-blockquote-border-color);border-width:0;border-left-width:var(--ifm-blockquote-border-left-width);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{border-color:var(--ifm-hr-border-color);border-width:var(--ifm-hr-border-width);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonition h5,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:rgba(53,120,229,.15);--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:rgba(235,237,240,.15);--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:rgba(0,164,0,.15);--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:rgba(84,199,236,.15);--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:rgba(255,186,0,.15);--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:rgba(250,56,62,.15);--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border-color:var(--ifm-alert-border-color);border-style:solid;border-width:var(--ifm-alert-border-width);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{-webkit-text-decoration-color:var(--ifm-alert-border-color);text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar,.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.avatar__photo-link{display:block}.avatar__photo{border-radius:50%;height:var(--ifm-avatar-photo-size-md);overflow:hidden;width:var(--ifm-avatar-photo-size-md)}.avatar__photo--sm{height:var(--ifm-avatar-photo-size-sm);width:var(--ifm-avatar-photo-size-sm)}.avatar__photo--lg{height:var(--ifm-avatar-photo-size-lg);width:var(--ifm-avatar-photo-size-lg)}.avatar__photo--xl{height:var(--ifm-avatar-photo-size-xl);width:var(--ifm-avatar-photo-size-xl)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo+.avatar__intro{margin-left:var(--ifm-avatar-intro-margin)}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.avatar--vertical .avatar__intro{margin-left:0}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:first-child){margin-left:var(--ifm-breadcrumb-spacing)}.breadcrumbs__item:not(:last-child){margin-right:var(--ifm-breadcrumb-spacing)}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;-webkit-filter:var(--ifm-breadcrumb-separator-filter);filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 .5rem;opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__item--active .breadcrumbs__link,.breadcrumbs__item:not(.breadcrumbs__item--active):hover .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border-color:var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);border-style:solid;border-width:var(--ifm-button-border-width);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;-ms-user-select:none;user-select:none}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:transparent;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}.button--primary{--ifm-button-border-color:var(--ifm-color-primary)}.button--primary:not(.button--outline){--ifm-button-background-color:var(--ifm-color-primary)}.button--primary:not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-border-color:var(--ifm-color-primary-darker);--ifm-button-background-color:var(--ifm-color-primary-darker);background-color:var(--ifm-color-primary-darker);border-color:var(--ifm-color-primary-darker)}.button--secondary{--ifm-button-border-color:var(--ifm-color-secondary)}.button--secondary:not(.button--outline){--ifm-button-background-color:var(--ifm-color-secondary)}.button--secondary:not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-border-color:var(--ifm-color-secondary-darker);--ifm-button-background-color:var(--ifm-color-secondary-darker);background-color:var(--ifm-color-secondary-darker);border-color:var(--ifm-color-secondary-darker)}.button--success{--ifm-button-border-color:var(--ifm-color-success)}.button--success:not(.button--outline){--ifm-button-background-color:var(--ifm-color-success)}.button--success:not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-border-color:var(--ifm-color-success-darker);--ifm-button-background-color:var(--ifm-color-success-darker);background-color:var(--ifm-color-success-darker);border-color:var(--ifm-color-success-darker)}.button--info{--ifm-button-border-color:var(--ifm-color-info)}.button--info:not(.button--outline){--ifm-button-background-color:var(--ifm-color-info)}.button--info:not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-border-color:var(--ifm-color-info-darker);--ifm-button-background-color:var(--ifm-color-info-darker);background-color:var(--ifm-color-info-darker);border-color:var(--ifm-color-info-darker)}.button--warning{--ifm-button-border-color:var(--ifm-color-warning)}.button--warning:not(.button--outline){--ifm-button-background-color:var(--ifm-color-warning)}.button--warning:not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-border-color:var(--ifm-color-warning-darker);--ifm-button-background-color:var(--ifm-color-warning-darker);background-color:var(--ifm-color-warning-darker);border-color:var(--ifm-color-warning-darker)}.button--danger{--ifm-button-border-color:var(--ifm-color-danger)}.button--danger:not(.button--outline){--ifm-button-background-color:var(--ifm-color-danger)}.button--danger:not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-border-color:var(--ifm-color-danger-darker);--ifm-button-background-color:var(--ifm-color-danger-darker);background-color:var(--ifm-color-danger-darker);border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:var(--ifm-button-group-margin)}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group>.button--active{z-index:1}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.admonition-content>:last-child,.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;-webkit-transform:translateY(0);transform:translateY(0);visibility:visible}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;list-style:none;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);-webkit-transform:translateY(-.625rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility,-webkit-transform;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor transparent;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:10rem}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.footer__item{margin-top:0}.footer__items{list-style:none;margin-bottom:0;padding-left:0}.codeBlockStandalone_csWH,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{list-style:none;margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.navbar__items--center .navbar__brand,body{margin:0}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{display:flex}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__link--sublist-caret{justify-content:space-between}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;content:"";-webkit-filter:var(--ifm-menu-link-sublist-icon-filter);filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;min-width:1.25rem;-webkit-transform:rotate(180deg);transform:rotate(180deg);transition:-webkit-transform var(--ifm-transition-fast) linear;transition:transform var(--ifm-transition-fast) linear;transition:transform var(--ifm-transition-fast) linear,-webkit-transform var(--ifm-transition-fast) linear;width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret{margin-left:.1rem}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;content:"";-webkit-filter:var(--ifm-menu-link-sublist-icon-filter);filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;-webkit-transform:rotate(180deg);transform:rotate(180deg);transition:-webkit-transform var(--ifm-transition-fast) linear;transition:transform var(--ifm-transition-fast) linear;transition:transform var(--ifm-transition-fast) linear,-webkit-transform var(--ifm-transition-fast) linear;width:1.25rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar--fixed-top{position:-webkit-sticky;position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;position:fixed;transition-timing-function:ease-in-out;top:0;left:0;visibility:hidden}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar__title{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}#nprogress,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:hsla(0,0%,100%,.1);--ifm-navbar-search-input-placeholder-color:hsla(0,0%,100%,.5);color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:hsla(0,0%,100%,.05);--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{-webkit-appearance:none;appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:.9rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input:-ms-input-placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar__search-input::-webkit-input-placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);transition-duration:.25s;transition-property:opacity,visibility,transform,-webkit-transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar--show .navbar-sidebar{-webkit-transform:translateZ(0);transform:translateZ(0)}.navbar-sidebar__backdrop{background-color:rgba(0,0,0,.6);right:0;transition-duration:.1s;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));-webkit-transform:translateZ(0);transform:translateZ(0);transition:-webkit-transform var(--ifm-transition-fast) ease-in-out;transition:transform var(--ifm-transition-fast) ease-in-out;transition:transform var(--ifm-transition-fast) ease-in-out,-webkit-transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{-webkit-transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0);transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination__item,.pagination__link{display:inline-block}.pagination{font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item:not(:first-child){margin-left:var(--ifm-pagination-page-spacing)}.pagination__item:not(:last-child){margin-right:var(--ifm-pagination-page-spacing)}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover{text-decoration:none}.pagination-nav{display:flex}.pagination-nav__item{display:flex;flex:1 50%;max-width:50%}.pagination-nav__item--next{text-align:right}.pagination-nav__item+.pagination-nav__item{margin-left:var(--ifm-spacing-horizontal)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);flex-grow:1;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__item:first-child .pagination-nav__label:before{content:"« "}.pagination-nav__item--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pills__item--active{background:var(--ifm-pills-color-background-active);color:var(--ifm-pills-color-active)}.pills__item:not(.pills__item--active):hover{background-color:var(--ifm-pills-color-background-active)}.pills__item:not(:first-child){margin-left:var(--ifm-pills-spacing)}.pills__item:not(:last-child){margin-right:var(--ifm-pills-spacing)}.docItemContainer_p3Qu article>:first-child,.docItemContainer_p3Qu header+*,.pills__item+.pills__item{margin-top:0}.pills--block{display:flex;justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto;padding-left:0}.tabs__item{border-bottom:3px solid transparent;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#18191a;--ifm-background-surface-color:#242526;--ifm-hover-overlay:hsla(0,0%,100%,.05);--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#333437;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:hsla(0,0%,100%,.07);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec}.admonition h5{margin-bottom:8px;margin-top:0}.admonition-icon{display:inline-block;margin-right:.4em;vertical-align:middle}.admonition-icon svg{stroke-width:0;stroke:var(--ifm-alert-foreground-color);display:inline-block;height:22px;width:22px}.admonition{margin-bottom:1em}.docusaurus-highlight-code-line{background-color:#484d5b;display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}body{font-family:Open Sans,sans-serif!important}.prism-code{font-family:Fira Code,monospace!important}#nprogress .bar{background:#29d;height:2px;left:0;position:fixed;top:0;width:100%;z-index:5}#nprogress .peg{box-shadow:0 0 10px #29d,0 0 5px #29d;height:100%;opacity:1;position:absolute;right:0;-webkit-transform:rotate(3deg) translateY(-4px);transform:rotate(3deg) translateY(-4px);width:100px}#docusaurus-base-url-issue-banner-container{display:none}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;list-style:none;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:transparent transparent transparent var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;-webkit-transform:rotate(0);transform:rotate(0);-webkit-transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}.skipToContent_ZgBM{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_ZgBM:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.announcementBar_IbjG{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}.aa-ClearButton[hidden],.aa-ItemContent:empty,.aa-LoadingIndicator[hidden],.aa-Source:empty,.aa-SourceHeader:empty,.themedImage_W2Cr,[data-theme=dark] .lightToggleIcon_v35p,[data-theme=light] .darkToggleIcon_nQuB,html[data-announcement-bar-initially-dismissed=true] .announcementBar_IbjG{display:none}.announcementBarPlaceholder_NC_W{flex:0 0 10px}.announcementBarClose_FG1z{align-self:stretch;flex:0 0 30px;line-height:0;padding:0}.announcementBarContent_KsVm{flex:1 1 auto;font-size:85%;padding:5px 0;text-align:center}.announcementBarContent_KsVm a{color:inherit;text-decoration:underline}.toggle_S7eR{height:2rem;width:2rem}.aa-Form,.toggleButton_rCf9{align-items:center;width:100%;display:flex}.toggleButton_rCf9{border-radius:50%;height:100%;justify-content:center;transition:background var(--ifm-transition-fast)}.toggleButton_rCf9:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_Pu9x{cursor:not-allowed}[data-theme=dark] .themedImage--dark_oUvU,[data-theme=light] .themedImage--light_TfLj{display:initial}.iconExternalLink_I5OW{margin-left:.3rem}.iconLanguage_dNtB{margin-right:5px;vertical-align:text-bottom}body.dark,body[data-theme=dark]{--aa-text-color-rgb:183,192,199;--aa-primary-color-rgb:146,138,255;--aa-muted-color-rgb:146,138,255;--aa-input-background-color-rgb:0,3,9;--aa-background-color-rgb:21,24,42;--aa-selected-color-rgb:146,138,255;--aa-selected-color-alpha:0.25;--aa-description-highlight-background-color-rgb:0 255 255;--aa-description-highlight-background-color-alpha:0.25;--aa-panel-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--aa-scrollbar-track-background-color-rgb:44,46,64;--aa-muted-color-alpha:1}.aa-Autocomplete,.aa-DetachedFormContainer,.aa-Panel{color:#262627;color:rgba(var(--aa-text-color-rgb),var(--aa-text-color-alpha));font-family:inherit;font-family:var(--aa-font-family);font-size:16px;font-size:var(--aa-font-size);font-weight:400;line-height:1em;margin:0;padding:0;text-align:left}.aa-Form{background-color:#fff;background-color:rgba(var(--aa-input-background-color-rgb),var(--aa-input-background-color-alpha));border:1px solid rgba(128,126,163,.8);border:1px solid rgba(var(--aa-input-border-color-rgb),var(--aa-input-border-color-alpha));border-radius:3px;line-height:1em;margin:0;position:relative}.aa-ClearButton,.aa-Input,.aa-SubmitButton{border:0;background:none}.aa-Form[focus-within]{border-color:#3e34d3;border-color:rgba(var(--aa-primary-color-rgb),1);box-shadow:0 0 0 2px rgba(62,52,211,.2),inset 0 0 0 2px rgba(62,52,211,.2);box-shadow:rgba(var(--aa-primary-color-rgb),var(--aa-primary-color-alpha)) 0 0 0 2px,inset rgba(var(--aa-primary-color-rgb),var(--aa-primary-color-alpha)) 0 0 0 2px;outline:currentColor}.aa-Form:focus-within{border-color:#3e34d3;border-color:rgba(var(--aa-primary-color-rgb),1);box-shadow:0 0 0 2px rgba(62,52,211,.2),inset 0 0 0 2px rgba(62,52,211,.2);box-shadow:rgba(var(--aa-primary-color-rgb),var(--aa-primary-color-alpha)) 0 0 0 2px,inset rgba(var(--aa-primary-color-rgb),var(--aa-primary-color-alpha)) 0 0 0 2px;outline:currentColor}.aa-InputWrapperPrefix{align-items:center;display:flex;flex-shrink:0;height:44px;height:var(--aa-search-input-height);order:1}.aa-Label,.aa-LoadingIndicator{cursor:auto;flex-shrink:0;height:100%;padding:0;text-align:left}.aa-Label svg,.aa-LoadingIndicator svg{stroke-width:1.6;stroke-width:var(--aa-icon-stroke-width);color:#3e34d3;color:rgba(var(--aa-primary-color-rgb),1);height:auto;max-height:20px;max-height:var(--aa-input-icon-size);width:20px;width:var(--aa-input-icon-size)}.aa-LoadingIndicator,.aa-SubmitButton{height:100%;padding-left:11px;padding-left:calc(var(--aa-spacing)*.75 - 1px);padding-right:8px;padding-right:var(--aa-spacing-half);width:47px;width:calc(var(--aa-spacing)*1.75 + var(--aa-icon-size) - 1px)}.aa-SubmitButton{-webkit-appearance:none;appearance:none;margin:0}.aa-LoadingIndicator{align-items:center;display:flex;justify-content:center}.aa-InputWrapper{order:3;position:relative;width:100%}.aa-Input{-webkit-appearance:none;appearance:none;color:#262627;color:rgba(var(--aa-text-color-rgb),var(--aa-text-color-alpha));font:inherit;height:44px;height:var(--aa-search-input-height);padding:0;width:100%}.aa-Input:-ms-input-placeholder{color:rgba(128,126,163,.6);color:rgba(var(--aa-muted-color-rgb),var(--aa-muted-color-alpha));opacity:1}.aa-Input::-webkit-input-placeholder{color:rgba(128,126,163,.6);color:rgba(var(--aa-muted-color-rgb),var(--aa-muted-color-alpha));opacity:1}.aa-Input::placeholder{color:rgba(128,126,163,.6);color:rgba(var(--aa-muted-color-rgb),var(--aa-muted-color-alpha));opacity:1}.aa-Input:focus{border-color:none;box-shadow:none;outline:0}.aa-Input::-webkit-search-cancel-button,.aa-Input::-webkit-search-decoration,.aa-Input::-webkit-search-results-button,.aa-Input::-webkit-search-results-decoration{-webkit-appearance:none;appearance:none}.aa-InputWrapperSuffix{align-items:center;display:flex;height:44px;height:var(--aa-search-input-height);order:4}.aa-ClearButton{align-items:center;color:rgba(128,126,163,.6);color:rgba(var(--aa-muted-color-rgb),var(--aa-muted-color-alpha));cursor:pointer;display:flex;height:100%;margin:0;padding:0 12.8333333333px;padding:0 calc(var(--aa-spacing)*.83333 - .5px)}.aa-Item,.aa-ItemIcon{align-items:center;border-radius:3px}.aa-ClearButton:focus,.aa-ClearButton:hover,.aa-ItemActionButton:focus svg,.aa-ItemActionButton:hover svg{color:#262627;color:rgba(var(--aa-text-color-rgb),var(--aa-text-color-alpha))}.aa-ClearButton svg{stroke-width:1.6;stroke-width:var(--aa-icon-stroke-width);width:20px;width:var(--aa-icon-size)}.aa-Panel{background-color:#fff;background-color:rgba(var(--aa-background-color-rgb),var(--aa-background-color-alpha));border-radius:4px;border-radius:calc(var(--aa-spacing)/4);box-shadow:0 0 0 1px rgba(35,38,59,.1),0 6px 16px -4px rgba(35,38,59,.15);box-shadow:var(--aa-panel-shadow);margin:8px 0 0;overflow:hidden;position:absolute;transition:opacity .2s ease-in,filter .2s ease-in,-webkit-filter .2s ease-in}.aa-Panel button{-webkit-appearance:none;appearance:none;background:none;border:0;margin:0;padding:0}.aa-PanelLayout{height:100%;margin:0;max-height:650px;max-height:var(--aa-panel-max-height);overflow-y:auto;padding:0;position:relative;text-align:left}.aa-PanelLayoutColumns--twoGolden{display:grid;grid-template-columns:39.2% auto;overflow:hidden;padding:0}.aa-PanelLayoutColumns--two{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));overflow:hidden;padding:0}.aa-PanelLayoutColumns--three{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));overflow:hidden;padding:0}.aa-Panel--stalled .aa-Source{-webkit-filter:grayscale(1);filter:grayscale(1);opacity:.8}.aa-Panel--scrollable{margin:0;max-height:650px;max-height:var(--aa-panel-max-height);overflow-x:hidden;overflow-y:auto;padding:8px;padding:var(--aa-spacing-half);scrollbar-color:#fff #eaeaea;scrollbar-color:rgba(var(--aa-scrollbar-thumb-background-color-rgb),var(--aa-scrollbar-thumb-background-color-alpha)) rgba(var(--aa-scrollbar-track-background-color-rgb),var(--aa-scrollbar-track-background-color-alpha));scrollbar-width:thin}.aa-Panel--scrollable::-webkit-scrollbar{width:13px;width:var(--aa-scrollbar-width)}.aa-Panel--scrollable::-webkit-scrollbar-track{background-color:#eaeaea;background-color:rgba(var(--aa-scrollbar-track-background-color-rgb),var(--aa-scrollbar-track-background-color-alpha))}.aa-Panel--scrollable::-webkit-scrollbar-thumb{background-color:#fff;background-color:rgba(var(--aa-scrollbar-thumb-background-color-rgb),var(--aa-scrollbar-thumb-background-color-alpha));border:3px solid #eaeaea;border-color:rgba(var(--aa-scrollbar-track-background-color-rgb),var(--aa-scrollbar-track-background-color-alpha));border-radius:9999px;border-right:2px solid rgba(var(--aa-scrollbar-track-background-color-rgb),var(--aa-scrollbar-track-background-color-alpha))}.aa-Source{margin:0;padding:0;position:relative;width:100%}.aa-SourceNoResults{font-size:1em;margin:0;padding:16px;padding:var(--aa-spacing)}.aa-List{list-style:none;margin:0}.aa-List,.aa-SourceHeader{padding:0;position:relative}.aa-SourceHeader{margin:8px .5em 8px 0;margin:var(--aa-spacing-half) .5em var(--aa-spacing-half) 0}.aa-SourceHeaderTitle{background:#fff;background:rgba(var(--aa-background-color-rgb),var(--aa-background-color-alpha));color:#3e34d3;color:rgba(var(--aa-primary-color-rgb),1);display:inline-block;font-size:.8em;font-weight:600;font-weight:var(--aa-font-weight-semibold);margin:0;padding:0 8px 0 0;padding:0 var(--aa-spacing-half) 0 0;position:relative;z-index:7;z-index:var(--aa-base-z-index)}.aa-SourceHeaderLine{border-bottom:1px solid #3e34d3;border-bottom:1px solid rgba(var(--aa-primary-color-rgb),1);display:block;height:2px;left:0;margin:0;opacity:.3;padding:0;position:absolute;right:0;top:8px;top:var(--aa-spacing-half);z-index:6;z-index:calc(var(--aa-base-z-index) - 1)}.aa-SourceFooterSeeAll{background:linear-gradient(180deg,#fff,rgba(128,126,163,.14));background:linear-gradient(180deg,rgba(var(--aa-background-color-rgb),var(--aa-background-color-alpha)),rgba(128,126,163,.14));border:1px solid rgba(128,126,163,.6);border:1px solid rgba(var(--aa-muted-color-rgb),var(--aa-muted-color-alpha));border-radius:5px;box-shadow:inset 0 0 2px #fff,0 2px 2px -1px rgba(76,69,88,.15);color:inherit;font-size:.95em;font-weight:500;font-weight:var(--aa-font-weight-medium);padding:.475em 1em .6em;text-decoration:none}.aa-SourceFooterSeeAll:focus,.aa-SourceFooterSeeAll:hover{border:1px solid #3e34d3;border:1px solid rgba(var(--aa-primary-color-rgb),1);color:#3e34d3;color:rgba(var(--aa-primary-color-rgb),1)}.aa-Item{cursor:pointer;display:grid;min-height:40px;min-height:calc(var(--aa-spacing)*2.5);padding:4px;padding:calc(var(--aa-spacing-half)/2)}.aa-Item[aria-selected=true]{background-color:rgba(179,173,214,.205);background-color:rgba(var(--aa-selected-color-rgb),var(--aa-selected-color-alpha))}.aa-Item[aria-selected=true] .aa-ActiveOnly,.aa-Item[aria-selected=true] .aa-ItemActionButton{visibility:visible}.aa-ItemIcon{stroke-width:1.6;stroke-width:var(--aa-icon-stroke-width);background:#fff;background:rgba(var(--aa-background-color-rgb),var(--aa-background-color-alpha));box-shadow:inset 0 0 0 1px rgba(128,126,163,.3);box-shadow:inset 0 0 0 1px rgba(var(--aa-panel-border-color-rgb),var(--aa-panel-border-color-alpha));color:#7777a3;color:rgba(var(--aa-icon-color-rgb),var(--aa-icon-color-alpha));display:flex;flex-shrink:0;font-size:.7em;height:28px;height:calc(var(--aa-icon-size) + var(--aa-spacing-half));justify-content:center;overflow:hidden;text-align:center;width:28px;width:calc(var(--aa-icon-size) + var(--aa-spacing-half))}.aa-ItemIcon img{height:auto;max-height:20px;max-height:calc(var(--aa-icon-size) + var(--aa-spacing-half) - 8px);max-width:20px;max-width:calc(var(--aa-icon-size) + var(--aa-spacing-half) - 8px);width:auto}.aa-ItemIcon svg{height:20px;height:var(--aa-icon-size);width:20px;width:var(--aa-icon-size)}.aa-ItemIcon--alignTop{align-self:flex-start}.aa-ItemIcon--noBorder{background:none;box-shadow:none}.aa-ItemIcon--picture{height:96px;width:96px}.aa-ItemIcon--picture img{max-height:100%;max-width:100%;padding:8px;padding:var(--aa-spacing-half)}.aa-ItemContent{grid-gap:8px;grid-gap:var(--aa-spacing-half);align-items:center;cursor:pointer;display:grid;gap:8px;gap:var(--aa-spacing-half);grid-auto-flow:column;line-height:1.25em;overflow:hidden}.aa-ItemContent mark{background:none;color:#262627;color:rgba(var(--aa-text-color-rgb),var(--aa-text-color-alpha));font-style:normal;font-weight:700;font-weight:var(--aa-font-weight-bold)}.aa-ItemContent--dual{display:flex;flex-direction:column;justify-content:space-between;text-align:left}.aa-ItemContent--dual .aa-ItemContentSubtitle,.aa-ItemContent--dual .aa-ItemContentTitle,.tocCollapsibleContent_MpvI a{display:block}.aa-ItemContent--indented{padding-left:36px;padding-left:calc(var(--aa-icon-size) + var(--aa-spacing))}.aa-ItemContentBody{grid-gap:4px;grid-gap:calc(var(--aa-spacing-half)/2);display:grid;gap:4px;gap:calc(var(--aa-spacing-half)/2)}.aa-ItemContentTitle{display:inline-block;margin:0 .5em 0 0;max-width:100%;overflow:hidden;padding:0;text-overflow:ellipsis;white-space:nowrap}.aa-ItemContentSubtitle{font-size:.92em}.aa-ItemContentSubtitleIcon:before{border-color:rgba(128,126,163,.64);border-color:rgba(var(--aa-muted-color-rgb),.64);border-style:solid;content:"";display:inline-block;left:1px;position:relative;top:-3px}.aa-PanelFooter:after,.aa-PanelHeader:after{position:absolute;pointer-events:none;right:0;content:"";left:0}.aa-ItemContentSubtitle--inline .aa-ItemContentSubtitleIcon:before{border-width:0 0 1.5px;margin-left:8px;margin-left:var(--aa-spacing-half);margin-right:4px;margin-right:calc(var(--aa-spacing-half)/2);width:10px;width:calc(var(--aa-spacing-half) + 2px)}.aa-ItemContentSubtitle--standalone{grid-gap:8px;grid-gap:var(--aa-spacing-half);align-items:center;color:#262627;color:rgba(var(--aa-text-color-rgb),var(--aa-text-color-alpha));display:grid;gap:8px;gap:var(--aa-spacing-half);grid-auto-flow:column;justify-content:start}.aa-ItemContentSubtitle--standalone .aa-ItemContentSubtitleIcon:before{border-radius:0 0 0 3px;border-width:0 0 1.5px 1.5px;height:8px;height:var(--aa-spacing-half);width:8px;width:var(--aa-spacing-half)}.aa-ItemContentSubtitleCategory{color:#807ea3;color:rgba(var(--aa-muted-color-rgb),1);font-weight:500}.aa-ItemContentDescription{color:#262627;color:rgba(var(--aa-text-color-rgb),var(--aa-text-color-alpha));font-size:.85em;max-width:100%;overflow-x:hidden;text-overflow:ellipsis}.aa-ItemContentDescription:empty,.collapseSidebarButton_FykI,.docSidebarContainer_rKC_,.sidebarLogo_YUvz{display:none}.aa-ItemContentDescription mark{background:rgba(245,223,77,.5);background:rgba(var(--aa-description-highlight-background-color-rgb),var(--aa-description-highlight-background-color-alpha));color:#262627;color:rgba(var(--aa-text-color-rgb),var(--aa-text-color-alpha));font-style:normal;font-weight:500;font-weight:var(--aa-font-weight-medium)}.aa-ItemContentDash{color:rgba(128,126,163,.6);color:rgba(var(--aa-muted-color-rgb),var(--aa-muted-color-alpha));display:none;opacity:.4}.aa-ItemContentTag{background-color:rgba(62,52,211,.2);background-color:rgba(var(--aa-primary-color-rgb),var(--aa-primary-color-alpha));border-radius:3px;margin:0 .4em 0 0;padding:.08em .3em}.aa-ItemLink,.aa-ItemWrapper{grid-gap:4px;grid-gap:calc(var(--aa-spacing-half)/2);align-items:center;color:inherit;display:grid;gap:4px;gap:calc(var(--aa-spacing-half)/2);grid-auto-flow:column;justify-content:space-between;width:100%}.aa-ItemLink{color:inherit;text-decoration:none}.aa-ItemActions{display:grid;grid-auto-flow:column;height:100%;justify-self:end;margin:0 -5.3333333333px;margin:0 calc(var(--aa-spacing)/-3);padding:0 2px 0 0}.aa-ItemActionButton{align-items:center;background:none;border:0;color:rgba(128,126,163,.6);color:rgba(var(--aa-muted-color-rgb),var(--aa-muted-color-alpha));cursor:pointer;display:flex;flex-shrink:0;padding:0}.aa-ItemActionButton svg{stroke-width:1.6;stroke-width:var(--aa-icon-stroke-width);color:rgba(128,126,163,.6);color:rgba(var(--aa-muted-color-rgb),var(--aa-muted-color-alpha));margin:5.3333333333px;margin:calc(var(--aa-spacing)/3);width:20px;width:var(--aa-action-icon-size)}.aa-ActiveOnly{visibility:hidden}.aa-PanelHeader{align-items:center;background:#3e34d3;background:rgba(var(--aa-primary-color-rgb),1);color:#fff;display:grid;height:var(--aa-modal-header-height);margin:0;padding:8px 16px;padding:var(--aa-spacing-half) var(--aa-spacing);position:relative}.aa-PanelHeader:after{background-image:linear-gradient(#fff,hsla(0,0%,100%,0));background-image:linear-gradient(rgba(var(--aa-background-color-rgb),1),rgba(var(--aa-background-color-rgb),0));bottom:-8px;bottom:calc(var(--aa-spacing-half)*-1);height:8px;height:var(--aa-spacing-half)}.aa-PanelFooter,.aa-PanelHeader:after{z-index:7;z-index:var(--aa-base-z-index)}.aa-PanelFooter{background-color:#fff;background-color:rgba(var(--aa-background-color-rgb),var(--aa-background-color-alpha));box-shadow:inset 0 1px 0 rgba(128,126,163,.3);box-shadow:inset 0 1px 0 rgba(var(--aa-panel-border-color-rgb),var(--aa-panel-border-color-alpha));display:flex;justify-content:space-between;margin:0;padding:16px;padding:var(--aa-spacing);position:relative}.aa-PanelFooter:after{background-image:linear-gradient(hsla(0,0%,100%,0),rgba(128,126,163,.6));background-image:linear-gradient(rgba(var(--aa-background-color-rgb),0),rgba(var(--aa-muted-color-rgb),var(--aa-muted-color-alpha)));height:16px;height:var(--aa-spacing);opacity:.12;top:-16px;top:calc(var(--aa-spacing)*-1);z-index:6;z-index:calc(var(--aa-base-z-index) - 1)}.aa-DetachedContainer{background:#fff;background:rgba(var(--aa-background-color-rgb),var(--aa-background-color-alpha));bottom:0;box-shadow:0 0 0 1px rgba(35,38,59,.1),0 6px 16px -4px rgba(35,38,59,.15);box-shadow:var(--aa-panel-shadow);display:flex;flex-direction:column;left:0;margin:0;overflow:hidden;padding:0;position:fixed;right:0;top:0;z-index:7;z-index:var(--aa-base-z-index)}.aa-DetachedContainer:after{height:32px}.aa-DetachedContainer .aa-SourceHeader{margin:8px 0 8px 2px;margin:var(--aa-spacing-half) 0 var(--aa-spacing-half) 2px}.aa-DetachedContainer .aa-Panel{background-color:#fff;background-color:rgba(var(--aa-background-color-rgb),var(--aa-background-color-alpha));border-radius:0;box-shadow:none;flex-grow:1;margin:0;padding:0;position:relative}.aa-DetachedContainer .aa-PanelLayout{bottom:0;box-shadow:none;left:0;margin:0;max-height:none;overflow-y:auto;position:absolute;right:0;top:0;width:100%}.aa-DetachedFormContainer{border-bottom:1px solid rgba(128,126,163,.3);border-bottom:1px solid rgba(var(--aa-panel-border-color-rgb),var(--aa-panel-border-color-alpha));display:flex;flex-direction:row;justify-content:space-between;margin:0;padding:8px;padding:var(--aa-spacing-half)}.aa-DetachedCancelButton{background:none;border:0;border-radius:3px;color:#262627;color:rgba(var(--aa-text-color-rgb),var(--aa-text-color-alpha));cursor:pointer;font:inherit;margin:0 0 0 8px;margin:0 0 0 var(--aa-spacing-half);padding:0 8px;padding:0 var(--aa-spacing-half)}.aa-DetachedCancelButton:focus,.aa-DetachedCancelButton:hover{box-shadow:inset 0 0 0 1px rgba(128,126,163,.3);box-shadow:inset 0 0 0 1px rgba(var(--aa-panel-border-color-rgb),var(--aa-panel-border-color-alpha))}.aa-DetachedContainer--modal{border-radius:6px;bottom:inherit;height:auto;margin:0 auto;max-width:680px;max-width:var(--aa-detached-modal-max-width);position:absolute;top:3%}.aa-DetachedContainer--modal .aa-PanelLayout{max-height:500px;max-height:var(--aa-detached-modal-max-height);padding-bottom:8px;padding-bottom:var(--aa-spacing-half);position:static}.aa-DetachedSearchButton{align-items:center;background-color:#fff;background-color:rgba(var(--aa-input-background-color-rgb),var(--aa-input-background-color-alpha));border:1px solid rgba(128,126,163,.8);border:1px solid rgba(var(--aa-input-border-color-rgb),var(--aa-input-border-color-alpha));border-radius:3px;color:rgba(128,126,163,.6);color:rgba(var(--aa-muted-color-rgb),var(--aa-muted-color-alpha));cursor:pointer;display:flex;font:inherit;font-family:inherit;font-family:var(--aa-font-family);font-size:16px;font-size:var(--aa-font-size);height:44px;height:var(--aa-search-input-height);margin:0;padding:0 5.5px;padding:0 calc(var(--aa-search-input-height)/8);position:relative;text-align:left;width:100%}.aa-DetachedSearchButton:focus{border-color:#3e34d3;border-color:rgba(var(--aa-primary-color-rgb),1);box-shadow:0 0 0 3px rgba(62,52,211,.2),inset 0 0 0 2px rgba(62,52,211,.2);box-shadow:rgba(var(--aa-primary-color-rgb),var(--aa-primary-color-alpha)) 0 0 0 3px,inset rgba(var(--aa-primary-color-rgb),var(--aa-primary-color-alpha)) 0 0 0 2px;outline:currentColor}.aa-DetachedSearchButtonIcon{align-items:center;color:#3e34d3;color:rgba(var(--aa-primary-color-rgb),1);cursor:auto;display:flex;height:100%;justify-content:center;width:36px;width:calc(var(--aa-icon-size) + var(--aa-spacing))}.aa-Detached{height:100vh;overflow:hidden}.aa-DetachedOverlay{background-color:hsla(244,6%,48%,.4);background-color:rgba(var(--aa-overlay-color-rgb),var(--aa-overlay-color-alpha));height:100vh;left:0;margin:0;padding:0;position:fixed;right:0;top:0;z-index:6;z-index:calc(var(--aa-base-z-index) - 1)}.aa-GradientBottom,.aa-GradientTop{height:8px;height:var(--aa-spacing-half);left:0;pointer-events:none;position:absolute;right:0;z-index:7;z-index:var(--aa-base-z-index)}.aa-GradientTop{background-image:linear-gradient(#fff,hsla(0,0%,100%,0));background-image:linear-gradient(rgba(var(--aa-background-color-rgb),1),rgba(var(--aa-background-color-rgb),0));top:0}.aa-GradientBottom{background-image:linear-gradient(hsla(0,0%,100%,0),#fff);background-image:linear-gradient(rgba(var(--aa-background-color-rgb),0),rgba(var(--aa-background-color-rgb),1));border-bottom-left-radius:4px;border-bottom-left-radius:calc(var(--aa-spacing)/4);border-bottom-right-radius:4px;border-bottom-right-radius:calc(var(--aa-spacing)/4);bottom:0}.dsla-search-wrapper{margin-left:var(--aa-spacing)}.navbarHideable_ObN2{transition:-webkit-transform var(--ifm-transition-fast) ease;transition:transform var(--ifm-transition-fast) ease;transition:transform var(--ifm-transition-fast) ease,-webkit-transform var(--ifm-transition-fast) ease}.navbarHidden_FtgE{-webkit-transform:translate3d(0,calc(-100% - 2px),0);transform:translate3d(0,calc(-100% - 2px),0)}.footerLogoLink_gHmE{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_gHmE:hover,.hash-link:focus,:hover>.hash-link{opacity:1}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.main-wrapper{flex:1 0 auto}.docusaurus-mt-lg{margin-top:3rem}.iconEdit_dcUD{margin-right:.3em;vertical-align:sub}.tag_hD8n{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_hD8n:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_D6E_{border-radius:.5rem;font-size:90%;padding:.3rem .5rem}.tagWithCount_i0QQ{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_i0QQ:after,.tagWithCount_i0QQ:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_i0QQ:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;-webkit-transform:translate(50%,-50%) rotate(-45deg);transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_i0QQ:after{border-radius:50%;height:.5rem;left:0;-webkit-transform:translateY(-50%);transform:translateY(-50%);width:.5rem}.tagWithCount_i0QQ span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tags_XVD_{display:inline}.tag_JSN8{display:inline-block;margin:0 .4rem .5rem 0}.lastUpdated_foO9{font-size:smaller;font-style:italic;margin-top:.2rem}.tableOfContents_cNA8{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:-webkit-sticky;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.tocCollapsible_jdIR{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleButton_Fzxq{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_Fzxq:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";-webkit-filter:var(--ifm-menu-link-sublist-icon-filter);filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;-webkit-transform:rotate(180deg);transform:rotate(180deg);transition:-webkit-transform var(--ifm-transition-fast);transition:transform var(--ifm-transition-fast);transition:transform var(--ifm-transition-fast),-webkit-transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleContent_MpvI>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_MpvI ul li{margin:.4rem .8rem}.tocCollapsibleExpanded_laf4 .tocCollapsibleButton_Fzxq:after{-webkit-transform:none;transform:none}.anchorWithStickyNavbar_mojV{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_R0VQ{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;-ms-user-select:none;user-select:none}.hash-link:before{content:"#"}.Ad_Wtwg,.Ad__bzy{border:1px solid #e7e7e7;min-width:300px;padding:20px 10px}.breadcrumbsContainer_Xlws{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.copyButton_eDfN{background:inherit;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;opacity:0;padding:.4rem;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2);transition:opacity .2s ease-in-out}.copyButton_eDfN:focus-visible,.copyButton_eDfN:hover,.theme-code-block:hover .copyButtonCopied_ljy5{opacity:1!important}.theme-code-block:hover .copyButton_eDfN:not(.copyButtonCopied_ljy5){opacity:.4}.copyButtonIcons_W9eQ{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_XEyF,.copyButtonSuccessIcon_i9w9{fill:currentColor;height:inherit;left:0;opacity:inherit;position:absolute;top:0;transition:.15s;width:inherit}.copyButtonSuccessIcon_i9w9{color:#00d600;left:50%;opacity:0;top:50%;-webkit-transform:translate(-50%,-50%) scale(.33);transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_ljy5 .copyButtonIcon_XEyF{opacity:0;-webkit-transform:scale(.33);transform:scale(.33)}.copyButtonCopied_ljy5 .copyButtonSuccessIcon_i9w9{opacity:1;-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.codeBlockContainer_I0IT{box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_wNvx{border-radius:var(--ifm-global-radius);direction:ltr;position:relative}.codeBlockTitle_BvAR{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:var(--ifm-global-radius);border-top-right-radius:var(--ifm-global-radius);font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_jd64{background-color:inherit;margin:0;padding:0}.codeBlockTitle_BvAR+.codeBlockContent_wNvx .codeBlock_jd64{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_mRuA{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.details_BAp3{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.contains-task-list_tsSF{list-style:none;padding-left:0}.img_E7b_{height:auto}.backToTopButton_RiI4{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;-webkit-transform:scale(0);transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_RiI4:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_ssHd{opacity:1;-webkit-transform:scale(1);transform:scale(1);visibility:visible}.docMainContainer_TCnq,.docPage_P2Lg{display:flex;width:100%}.heroBanner_UJJx{overflow:hidden;padding:2rem 0;position:relative;text-align:center}.heroBanner_UJJx a{color:#fff!important}.buttons_pzbO{justify-content:center}.buttons_pzbO,.features_keug{align-items:center;display:flex}.features_keug{padding:2rem 0;width:100%}.featureImage_yA8i{height:200px;width:200px}.container_czXe{display:flex;flex-direction:column;margin:0;padding:10px 20px;width:100%}.header_A16n{font-weight:600}.h1_Sl_Q{align-self:center;padding:10px}.AdSec_K5de{margin-top:20px}@media screen and (min-width:966px){.h1_Sl_Q{background:var(--ifm-color-primary);border-radius:8px;box-shadow:-1px 1px var(--ifm-color-primary-dark),-1px 1px var(--ifm-color-primary-dark),-1px 1px var(--ifm-color-primary-dark),-2px 2px var(--ifm-color-primary-dark),-2px 2px var(--ifm-color-primary-dark);margin-right:30px}.container_czXe{flex-direction:row}.container_czXe img{height:300px}}@media (min-width:997px){:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_FG1z,.announcementBarPlaceholder_NC_W{flex-basis:50px}.lastUpdated_foO9{text-align:right}.docItemCol_nDMA{max-width:75%!important}.tocMobile_diN6{display:none}.collapseSidebarButton_FykI{background-color:var(--ifm-button-background-color);border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:-webkit-sticky;position:sticky}.collapseSidebarButtonIcon_DTRl{margin-top:4px;-webkit-transform:rotate(180deg);transform:rotate(180deg)}.expandSidebarButtonIcon_AV8S,[dir=rtl] .collapseSidebarButtonIcon_DTRl{-webkit-transform:rotate(0);transform:rotate(0)}[data-theme=dark] .collapseSidebarButton_FykI,[data-theme=dark] .collapsedDocSidebar_Xgr6:focus,[data-theme=dark] .collapsedDocSidebar_Xgr6:hover{background-color:var(--collapse-button-bg-color-dark)}.collapsedDocSidebar_Xgr6:focus,.collapsedDocSidebar_Xgr6:hover,[data-theme=dark] .collapseSidebarButton_FykI:focus,[data-theme=dark] .collapseSidebarButton_FykI:hover{background-color:var(--ifm-color-emphasis-200)}.menuHtmlItem_fVIQ{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_izAj{flex-grow:1;padding:.5rem}.menuWithAnnouncementBar_l2a_{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_RiAD{display:flex;flex-direction:column;height:100%;max-height:100vh;padding-top:var(--ifm-navbar-height);position:-webkit-sticky;position:sticky;top:0;transition:opacity 50ms;width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_d0QC{padding-top:0}.sidebarHidden_Lg_2{height:0;opacity:0;overflow:hidden;visibility:hidden}.sidebarLogo_YUvz{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_YUvz img{height:2rem;margin-right:.5rem}.docMainContainer_TCnq{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_WDCb{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docSidebarContainer_rKC_{border-right:1px solid var(--ifm-toc-border-color);-webkit-clip-path:inset(0);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_nvlY{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.collapsedDocSidebar_Xgr6{align-items:center;display:flex;height:100%;justify-content:center;max-height:100vh;position:-webkit-sticky;position:sticky;top:0;transition:background-color var(--ifm-transition-fast) ease}[dir=rtl] .expandSidebarButtonIcon_AV8S{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.docItemWrapperEnhanced_r_WG{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.row .col.col.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_vKtC,.footer__link-separator,.navbar__item,.tableOfContents_cNA8{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.pills--block .pills__item:not(:first-child){margin-top:var(--ifm-pills-spacing)}.pills--block .pills__item:not(:last-child){margin-bottom:var(--ifm-pills-spacing)}.tabs--block .tabs__item:not(:first-child){margin-top:var(--ifm-tabs-spacing)}.tabs--block .tabs__item:not(:last-child){margin-bottom:var(--ifm-tabs-spacing)}.docItemContainer_WX_Y{padding:0 .3rem}}@media screen and (max-width:966px){.Ad_Wtwg,.Ad__bzy{margin-bottom:20px}.heroBanner_UJJx{padding:2rem}.AdSec_K5de{margin-top:0}}@media (hover:hover){.backToTopButton_RiI4:hover{background-color:var(--ifm-color-emphasis-300)}.aa-TouchOnly{display:none}}@media (hover:none) and (pointer:coarse){:root{--aa-spacing-factor:1.2;--aa-action-icon-size:22px}.aa-LoadingIndicator,.aa-SubmitButton{padding-left:3px;padding-left:calc(var(--aa-spacing-half)/ 2 - 1px);width:39px;width:calc(var(--aa-icon-size) + var(--aa-spacing)*1.25 - 1px)}.aa-ClearButton{padding:0 10.1666666667px;padding:0 calc(var(--aa-spacing)*.66667 - .5px)}.aa-ItemActionButton:focus svg,.aa-ItemActionButton:hover svg{color:inherit}.aa-DesktopOnly{display:none}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media screen and (prefers-reduced-motion){.aa-Panel{transition:none}}@media print{.announcementBar_IbjG,.footer,.menu,.navbar,.pagination-nav,.table-of-contents{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_mRuA{white-space:pre-wrap}} \ No newline at end of file diff --git a/assets/js/17896441.cecfcd20.js b/assets/js/17896441.cecfcd20.js deleted file mode 100644 index 8d7fc9c..0000000 --- a/assets/js/17896441.cecfcd20.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdeno_by_example_next=self.webpackChunkdeno_by_example_next||[]).push([[918],{2371:function(e,t,l){l.r(t),l.d(t,{default:function(){return g}});var a=l(7294),n=l(6010),c=l(5214),o=l(4474),r=l(7597),s=l(4970),i=l(1575),m=l(1074),d=l(9649),u="docItemContainer_p3Qu",E="docItemCol_nDMA",p="tocMobile_diN6",v=l(5979),_=l(4067),b=l(7459),k=l(239);function Z(e){var t,l=e.content,n=l.metadata,c=l.frontMatter,o=l.assets,r=c.keywords,s=n.description,i=n.title,m=null!=(t=o.image)?t:c.image;return a.createElement(v.d,{title:i,description:s,keywords:r,image:m})}function f(e){var t=e.content,l=t.metadata,Z=t.frontMatter,f=Z.hide_title,g=Z.hide_table_of_contents,y=Z.toc_min_heading_level,h=Z.toc_max_heading_level,x=l.title,N=!f&&void 0===t.contentTitle,M=(0,v.iP)(),w=!g&&t.toc&&t.toc.length>0,G=w&&("desktop"===M||"ssr"===M);return a.createElement("div",{className:"row"},a.createElement("div",{className:(0,n.Z)("col",!g&&E)},a.createElement(o.Z,null),a.createElement("div",{className:u},a.createElement("article",null,a.createElement(_.Z,null),a.createElement(r.Z,null),w&&a.createElement(m.Z,{toc:t.toc,minHeadingLevel:y,maxHeadingLevel:h,className:(0,n.Z)(v.kM.docs.docTocMobile,p)}),a.createElement("div",{className:(0,n.Z)(v.kM.docs.docMarkdown,"markdown")},N&&a.createElement("header",null,a.createElement(d.Z,{as:"h1"},x)),a.createElement(b.Z,null,a.createElement(k.Z.Google,{client:"ca-pub-7756182462259588",slot:"3255885970",style:{display:"block"},format:"auto",responsive:"true"}),a.createElement("br",null),a.createElement(t,null),a.createElement(k.Z.Google,{client:"ca-pub-7756182462259588",slot:"9213638280",style:{display:"block"},format:"auto",responsive:"true"}))),a.createElement(s.Z,e)),a.createElement(c.Z,{previous:l.previous,next:l.next}))),G?a.createElement("div",{className:"col col--3"},a.createElement("div",{style:{minWidth:"300px"}},a.createElement(k.Z.Google,{client:"ca-pub-7756182462259588",slot:"4169179252",style:{display:"block"},format:"auto",responsive:"true"})),a.createElement("br",null),a.createElement(i.Z,{toc:t.toc,minHeadingLevel:y,maxHeadingLevel:h,className:v.kM.docs.docTocDesktop})):a.createElement("div",{className:"col col--3",style:{minWidth:"300px"}},a.createElement(k.Z.Google,{client:"ca-pub-7756182462259588",slot:"4169179252",style:{display:"block"},format:"auto",responsive:"true"})))}function g(e){var t="docs-doc-id-"+e.content.metadata.unversionedId;return a.createElement(v.FG,{className:t},a.createElement(Z,e),a.createElement(f,e))}}}]); \ No newline at end of file diff --git a/assets/js/17896441.d22dc898.js b/assets/js/17896441.d22dc898.js new file mode 100644 index 0000000..8ba3320 --- /dev/null +++ b/assets/js/17896441.d22dc898.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdeno_by_example_next=self.webpackChunkdeno_by_example_next||[]).push([[918],{2371:function(e,t,l){l.r(t),l.d(t,{default:function(){return g}});var a=l(7294),n=l(6010),c=l(5214),o=l(4474),r=l(7597),s=l(4970),m=l(1575),i=l(1074),d=l(9649),u="docItemContainer_p3Qu",E="docItemCol_nDMA",v="tocMobile_diN6",p="Ad__bzy",_=l(5979),b=l(4067),k=l(7459),Z=l(239);function f(e){var t,l=e.content,n=l.metadata,c=l.frontMatter,o=l.assets,r=c.keywords,s=n.description,m=n.title,i=null!=(t=o.image)?t:c.image;return a.createElement(_.d,{title:m,description:s,keywords:r,image:i})}function y(e){var t=e.content,l=t.metadata,f=t.frontMatter,y=f.hide_title,g=f.hide_table_of_contents,N=f.toc_min_heading_level,h=f.toc_max_heading_level,x=l.title,M=!y&&void 0===t.contentTitle,w=(0,_.iP)(),G=!g&&t.toc&&t.toc.length>0,C=G&&("desktop"===w||"ssr"===w);return a.createElement("div",{className:"row"},a.createElement("div",{className:(0,n.Z)("col",!g&&E)},a.createElement(o.Z,null),a.createElement("div",{className:u},a.createElement("article",null,a.createElement(b.Z,null),a.createElement(r.Z,null),G&&a.createElement(i.Z,{toc:t.toc,minHeadingLevel:N,maxHeadingLevel:h,className:(0,n.Z)(_.kM.docs.docTocMobile,v)}),a.createElement("div",{className:(0,n.Z)(_.kM.docs.docMarkdown,"markdown")},M?a.createElement("header",null,a.createElement("div",{className:p},a.createElement(Z.Z.Google,{client:"ca-pub-7756182462259588",slot:"5627199760",style:{display:"block"},format:"auto",responsive:"true"})),a.createElement(d.Z,{as:"h1"},x)):a.createElement("header",null,a.createElement("div",{className:p},a.createElement(Z.Z.Google,{client:"ca-pub-7756182462259588",slot:"5627199760",style:{display:"block"},format:"auto",responsive:"true"}))),a.createElement(k.Z,null,a.createElement(t,null),a.createElement("div",{className:p},a.createElement(Z.Z.Google,{client:"ca-pub-7756182462259588",slot:"3255885970",style:{display:"block"},format:"auto",responsive:"true"})))),a.createElement(s.Z,e)),a.createElement(c.Z,{previous:l.previous,next:l.next}))),C?a.createElement("div",{className:"col col--3"},a.createElement("div",{className:p},a.createElement(Z.Z.Google,{client:"ca-pub-7756182462259588",slot:"4169179252",style:{display:"block"},format:"auto",responsive:"true"})),a.createElement(m.Z,{toc:t.toc,minHeadingLevel:N,maxHeadingLevel:h,className:_.kM.docs.docTocDesktop})):a.createElement("div",{className:"col col--3",style:{minWidth:"300px"}},a.createElement(Z.Z.Google,{client:"ca-pub-7756182462259588",slot:"4169179252",style:{display:"block"},format:"auto",responsive:"true"})))}function g(e){var t="docs-doc-id-"+e.content.metadata.unversionedId;return a.createElement(_.FG,{className:t},a.createElement(f,e),a.createElement(y,e))}}}]); \ No newline at end of file diff --git a/assets/js/c4f5d8e4.167d20b7.js b/assets/js/c4f5d8e4.167d20b7.js deleted file mode 100644 index cfce25b..0000000 --- a/assets/js/c4f5d8e4.167d20b7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdeno_by_example_next=self.webpackChunkdeno_by_example_next||[]).push([[195],{5239:function(e,t,n){n.r(t),n.d(t,{default:function(){return u}});var a=n(7294),l=n(9960),r=n(2263),i=n(4996),o={heroBanner:"heroBanner_UJJx",buttons:"buttons_pzbO",features:"features_keug",featureImage:"featureImage_yA8i",container:"container_czXe",header:"header_A16n",h1:"h1_Sl_Q"},s=n(6010),c=n(2600);var u=function(){var e=(0,r.Z)().siteConfig,t=void 0===e?{}:e;return a.createElement(c.Z,{title:"Hello from "+t.title,description:t.tagline},a.createElement("main",null,a.createElement("section",{className:o.features},a.createElement("div",{className:o.container},a.createElement("div",null,a.createElement("h1",{className:o.h1},t.tagline),a.createElement("img",{src:"img/home_page_dino.jpg"})),a.createElement("div",null,a.createElement("h2",null,"Deno is a simple, modern and secure runtime for JavaScript and TypeScript that uses V8 and is built in Rust."),a.createElement("br",null),a.createElement("h4",null,"Why to Learn Deno?"),a.createElement("ul",null,a.createElement("li",null,"Secure by default. No file, network, or environment access, unless explicitly enabled."),a.createElement("li",null,"Supports TypeScript out of the box."),a.createElement("li",null,"Ships only a single executable file."),a.createElement("li",null,"Has built-in utilities like a dependency inspector (deno info) and a code formatter (deno fmt)."),a.createElement("li",null,"Has a set of reviewed (audited) standard modules that are guaranteed to work with Deno: deno.land/std")),a.createElement("p",null,a.createElement("span",{className:o.header},"Audience: "),"This Deno tutorial is designed devloper to teach from basic."),a.createElement("p",null,a.createElement("span",{className:o.header},"Prerequisites: ")," You should have a basic understanding of Computer Programming terminologies."))))),a.createElement("header",{className:(0,s.Z)("hero hero--primary",o.heroBanner)},a.createElement("div",{className:"container"},a.createElement("div",{className:o.buttons},a.createElement(l.Z,{className:(0,s.Z)("button button--outline button--secondary button--lg",o.getStarted),to:(0,i.Z)("/getting-started")},"Get Started")))))}}}]); \ No newline at end of file diff --git a/assets/js/c4f5d8e4.b78884a1.js b/assets/js/c4f5d8e4.b78884a1.js new file mode 100644 index 0000000..bc513c8 --- /dev/null +++ b/assets/js/c4f5d8e4.b78884a1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdeno_by_example_next=self.webpackChunkdeno_by_example_next||[]).push([[195],{5239:function(e,t,n){n.r(t),n.d(t,{default:function(){return f}});var a=n(7294),r=n(9960),o=n(2263),l=n(4996),i={heroBanner:"heroBanner_UJJx",buttons:"buttons_pzbO",features:"features_keug",featureImage:"featureImage_yA8i",container:"container_czXe",header:"header_A16n",h1:"h1_Sl_Q",Ad:"Ad_Wtwg",AdSec:"AdSec_K5de"},u=n(6010),s=n(2600),c=n(239),d=n(5979);var f=function(){var e=(0,o.Z)().siteConfig,t=void 0===e?{}:e;return(0,d.iP)(),a.createElement(s.Z,{title:"Hello from "+t.title,description:t.tagline},a.createElement("main",null,a.createElement("section",null,a.createElement("div",{className:i.Ad+" "+i.AdSec},a.createElement(c.Z.Google,{client:"ca-pub-7756182462259588",slot:"3255885970",style:{display:"block"},format:"auto",responsive:"true"}))),a.createElement("section",null,a.createElement("div",{className:(0,u.Z)("hero hero--primary",i.heroBanner)},a.createElement("div",{className:"container"},a.createElement("div",{className:i.buttons},a.createElement(r.Z,{className:(0,u.Z)("button button--outline button--secondary button--lg",i.getStarted),to:(0,l.Z)("/getting-started")},"Get Started"))))),a.createElement("section",{className:i.features},a.createElement("div",{className:i.container},a.createElement("div",null,a.createElement("h1",{className:i.h1},t.tagline),a.createElement("img",{src:"img/home_page_dino.jpg"})),a.createElement("div",null,a.createElement("h2",null,"Deno is a simple, modern and secure runtime for JavaScript and TypeScript that uses V8 and is built in Rust."),a.createElement("br",null),a.createElement("h4",null,"Why to Learn Deno?"),a.createElement("ul",null,a.createElement("li",null,"Secure by default. No file, network, or environment access, unless explicitly enabled."),a.createElement("li",null,"Supports TypeScript out of the box."),a.createElement("li",null,"Ships only a single executable file."),a.createElement("li",null,"Has built-in utilities like a dependency inspector (deno info) and a code formatter (deno fmt)."),a.createElement("li",null,"Has a set of reviewed (audited) standard modules that are guaranteed to work with Deno: deno.land/std")),a.createElement("p",null,a.createElement("span",{className:i.header},"Audience: "),"This Deno tutorial is designed devloper to teach from basic."),a.createElement("p",null,a.createElement("span",{className:i.header},"Prerequisites: ")," You should have a basic understanding of Computer Programming terminologies.")))),a.createElement("section",null,a.createElement("div",{className:i.Ad+" "+i.AdSec},a.createElement(c.Z.Google,{client:"ca-pub-7756182462259588",slot:"3255885970",style:{display:"block"},format:"auto",responsive:"true"})))))}},855:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var a,r=function(){function e(e,t){for(var n=0;n=o)&&Object.keys(u.O).every((function(e){return u.O[e](n[i])}))?n.splice(i--,1):(a=!1,o0&&e[d-1][2]>o;d--)e[d]=e[d-1];e[d]=[n,r,o]},u.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return u.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},u.t=function(e,r){if(1&r&&(e=this(e)),8&r)return e;if("object"==typeof e&&e){if(4&r&&e.__esModule)return e;if(16&r&&"function"==typeof e.then)return e}var o=Object.create(null);u.r(o);var f={};t=t||[null,n({}),n([]),n(n)];for(var a=2&r&&e;"object"==typeof a&&!~t.indexOf(a);a=n(a))Object.getOwnPropertyNames(a).forEach((function(t){f[t]=function(){return e[t]}}));return f.default=function(){return e},u.d(o,f),o},u.d=function(e,t){for(var n in t)u.o(t,n)&&!u.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},u.f={},u.e=function(e){return Promise.all(Object.keys(u.f).reduce((function(t,n){return u.f[n](e,t),t}),[]))},u.u=function(e){return"assets/js/"+({32:"63ed60a3",49:"6a06863f",53:"935f2afb",65:"372a6ebc",128:"a09c2993",175:"efedbd98",189:"73b01d71",195:"c4f5d8e4",306:"1a206995",394:"f30d939c",429:"fb410659",492:"83a0f273",514:"1be78505",594:"1332eaf6",676:"c0280256",757:"9c683654",821:"88b68a7d",888:"5921c6b5",896:"23d91002",907:"34b74a05",918:"17896441"}[e]||e)+"."+{32:"1ccd4ae2",49:"3fa78bad",53:"4b3d87d1",57:"d81470e7",65:"3f945c64",128:"2a22ad32",175:"518a749c",189:"c39a3c4a",195:"167d20b7",306:"bdadc127",394:"cfd2c6b9",429:"fe3739dd",492:"2bf452d5",514:"a14ad891",594:"0a1f0481",608:"f622496f",676:"1db02fa1",757:"6adacf69",821:"05af498b",888:"72fa1a2b",896:"92b34dd3",907:"22cc85b8",918:"cecfcd20"}[e]+".js"},u.miniCssF=function(e){},u.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),u.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},o="deno-by-example-next:",u.l=function(e,t,n,f){if(r[e])r[e].push(t);else{var a,i;if(void 0!==n)for(var c=document.getElementsByTagName("script"),d=0;d=o)&&Object.keys(u.O).every((function(e){return u.O[e](n[i])}))?n.splice(i--,1):(a=!1,o0&&e[d-1][2]>o;d--)e[d]=e[d-1];e[d]=[n,r,o]},u.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return u.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},u.t=function(e,r){if(1&r&&(e=this(e)),8&r)return e;if("object"==typeof e&&e){if(4&r&&e.__esModule)return e;if(16&r&&"function"==typeof e.then)return e}var o=Object.create(null);u.r(o);var f={};t=t||[null,n({}),n([]),n(n)];for(var a=2&r&&e;"object"==typeof a&&!~t.indexOf(a);a=n(a))Object.getOwnPropertyNames(a).forEach((function(t){f[t]=function(){return e[t]}}));return f.default=function(){return e},u.d(o,f),o},u.d=function(e,t){for(var n in t)u.o(t,n)&&!u.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},u.f={},u.e=function(e){return Promise.all(Object.keys(u.f).reduce((function(t,n){return u.f[n](e,t),t}),[]))},u.u=function(e){return"assets/js/"+({32:"63ed60a3",49:"6a06863f",53:"935f2afb",65:"372a6ebc",128:"a09c2993",175:"efedbd98",189:"73b01d71",195:"c4f5d8e4",306:"1a206995",394:"f30d939c",429:"fb410659",492:"83a0f273",514:"1be78505",594:"1332eaf6",676:"c0280256",757:"9c683654",821:"88b68a7d",888:"5921c6b5",896:"23d91002",907:"34b74a05",918:"17896441"}[e]||e)+"."+{32:"1ccd4ae2",49:"3fa78bad",53:"4b3d87d1",57:"d81470e7",65:"3f945c64",128:"2a22ad32",175:"518a749c",189:"c39a3c4a",195:"b78884a1",306:"bdadc127",394:"cfd2c6b9",429:"fe3739dd",492:"2bf452d5",514:"a14ad891",594:"0a1f0481",608:"f622496f",676:"1db02fa1",757:"6adacf69",821:"05af498b",888:"72fa1a2b",896:"92b34dd3",907:"22cc85b8",918:"d22dc898"}[e]+".js"},u.miniCssF=function(e){},u.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),u.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},o="deno-by-example-next:",u.l=function(e,t,n,f){if(r[e])r[e].push(t);else{var a,i;if(void 0!==n)for(var c=document.getElementsByTagName("script"),d=0;d -Getting Started | Deno By Example - +Getting Started | Deno By Example +
-

Getting Started


install

Deno is a simple, modern and secure runtime for JavaScript and TypeScript that uses V8 and is built in Rust.

--Deno Team

Note

This document mainly copied content from official site. However, there is some enhancement to minimize the content of valuable assets.

Download and install

Using Shell (macOS and Linux):

curl -fsSL https://deno.land/x/install/install.sh | sh

Using Homebrew (macOS):

brew install deno

Setup your environment

VS CODE:

The beta version of vscode_deno is published on the Visual Studio Marketplace. Please report any issues.

Using command line interface:

code --install-extension denoland.vscode-deno

Create Alias for deno run

~/.bash_profile
alias denorun="deno run -A"

This will help and ease the running application in local.

AVOID IN PROD

Please don't use in actual enviroment.

Hello World Program

examples/01_hello_world.ts
function main() {
console.log(`Hello "world"`);
}
main();

How to run example:

denorun examples/01_hello_world.ts
## OR
deno run examples/01_hello_world.ts
- +

Getting Started

install

Deno is a simple, modern and secure runtime for JavaScript and TypeScript that uses V8 and is built in Rust.

--Deno Team

Note

This document mainly copied content from official site. However, there is some enhancement to minimize the content of valuable assets.

Download and install

Using Shell (macOS and Linux):

curl -fsSL https://deno.land/x/install/install.sh | sh

Using Homebrew (macOS):

brew install deno

Setup your environment

VS CODE:

The beta version of vscode_deno is published on the Visual Studio Marketplace. Please report any issues.

Using command line interface:

code --install-extension denoland.vscode-deno

Create Alias for deno run

~/.bash_profile
alias denorun="deno run -A"

This will help and ease the running application in local.

AVOID IN PROD

Please don't use in actual enviroment.

Hello World Program

examples/01_hello_world.ts
function main() {
console.log(`Hello "world"`);
}
main();

How to run example:

denorun examples/01_hello_world.ts
## OR
deno run examples/01_hello_world.ts
+ \ No newline at end of file diff --git a/index.html b/index.html index f24f8a9..c51ae10 100644 --- a/index.html +++ b/index.html @@ -9,14 +9,14 @@ -Hello from Deno By Example | Deno By Example - +Hello from Deno By Example | Deno By Example +
-

Tutorial: Learn Web Programming in Deno by Examples

Deno is a simple, modern and secure runtime for JavaScript and TypeScript that uses V8 and is built in Rust.


Why to Learn Deno?

  • Secure by default. No file, network, or environment access, unless explicitly enabled.
  • Supports TypeScript out of the box.
  • Ships only a single executable file.
  • Has built-in utilities like a dependency inspector (deno info) and a code formatter (deno fmt).
  • Has a set of reviewed (audited) standard modules that are guaranteed to work with Deno: deno.land/std

Audience: This Deno tutorial is designed devloper to teach from basic.

Prerequisites: You should have a basic understanding of Computer Programming terminologies.

- +

Tutorial: Learn Web Programming in Deno by Examples

Deno is a simple, modern and secure runtime for JavaScript and TypeScript that uses V8 and is built in Rust.


Why to Learn Deno?

  • Secure by default. No file, network, or environment access, unless explicitly enabled.
  • Supports TypeScript out of the box.
  • Ships only a single executable file.
  • Has built-in utilities like a dependency inspector (deno info) and a code formatter (deno fmt).
  • Has a set of reviewed (audited) standard modules that are guaranteed to work with Deno: deno.land/std

Audience: This Deno tutorial is designed devloper to teach from basic.

Prerequisites: You should have a basic understanding of Computer Programming terminologies.

+ \ No newline at end of file diff --git a/introduction/index.html b/introduction/index.html index 58f8b3c..91c70d6 100644 --- a/introduction/index.html +++ b/introduction/index.html @@ -9,14 +9,14 @@ -Deno By Example | Deno By Example - +Deno By Example | Deno By Example +
-
- +
+ \ No newline at end of file diff --git a/lottery-game/index.html b/lottery-game/index.html index ccfd0a2..03fe15a 100644 --- a/lottery-game/index.html +++ b/lottery-game/index.html @@ -9,15 +9,15 @@ -Take input from user | Lottery Game | Deno By Example - +Take input from user | Lottery Game | Deno By Example +
-

Take input from user | Lottery Game


This tutorial we will build a CLI Lottery game app. For this we will use Deno's readLines and Logger that i have created. If you want to learn more about Logger implementation. Please visit: advanced-logger.

Taking input from user

To take input, We can use stdin stream from Deno as Deno.stdin. However, reading stream is very tough task Read My Blog. We can take help from readLines function. This will read stream of bytes and return whenever it found new line chars \n.

lottery_game.ts
import { readLines } from "https://deno.land/std/io/mod.ts";

function main() {
const data = readLines(Deno.stdin).next();
console.log(data);
}

main();

Run:

deno run examples/lottery_game.ts

Type test and then [ENTER]

Output:

Promise { <pending> }
test

Here if you have noticed, .next() after readLines. readLines is async iterator. So to get the value you have to call next(). This will return promise. To get value form it, we need to await for it.

import { readLines } from "https://deno.land/std/io/mod.ts";

async function main() {
const { value: input } = await readLines(Deno.stdin).next();
console.log("You have entered: " + input);
}

main();

Run again. -Output:

test
You have entered: test

Let's use logger to print in color.

lottery_game.ts
import { readLines } from "https://deno.land/std/io/mod.ts";
import { Logger } from "https://raw.githubusercontent.com/deepakshrma/deno_util/master/logger.ts";

async function main() {
const logger = new Logger();
const { value: input } = await readLines(Deno.stdin).next();
logger.info("You have entered: " + input);
}

main();

You will see same output but in cyan color. Cool!

So in this lottery game, We will ask user to enter a number. If guessed number matches the lottery number then game will end. Else user has to enter another number. This game will run till user enter lottery number.

Note:

To loop, We will use do-while loop.

lottery_game.ts
// rest of the code

async function main() {
const logger = new Logger();
let matched = false;
do {
logger.warn("Guess the number: [1-10]");

const { value } = await readLines(Deno.stdin).next();
logger.info("You have guessed: %d\n", value);

const random = Math.ceil(Math.random() * 10);
logger.info("Lottery number: %d\n", random);

matched = Number(value) === random;
} while (matched !== true);
}

main();

Output:

Guess the number: [1-10]
3
You have guessed: 3
Lottery number: 2
Guess the number: [1-10]
4
You have guessed: 4
Lottery number: 4

Breakdown:

We are taking input from user. Same time we are generating number using Math.random. First time, when user enter number 3. It does not match generated lottery number 2. Game asks user to enter again. Soon user enter 4, it matches the newly generated number 4. Game exit.

Let's make it more interactive. We will add some virtual delay to show we are generating number. And user can exit game anytime while pressing q. We will do some error validation too. So that user should not enter something not expected.

lottery_game.ts
import { readLines } from "https://deno.land/std/io/mod.ts";
import { Logger } from "https://raw.githubusercontent.com/deepakshrma/deno_util/master/logger.ts";

const delay = (ms = 1000) => new Promise((r) => setTimeout(r, ms));

async function main() {
const logger = new Logger();
let matched = false;
let LIMIT = 10;
do {
logger.warn(`Guess the number: [1-${LIMIT}], Press 'q' to exit!`);
let { value: guess } = await readLines(Deno.stdin).next();

guess = guess.trim();
if (guess === "q") {
logger.info("Thanks for playing this game! xiè xie!");
Deno.exit(0);
}

guess = Number(guess);
if (!guess || guess < 0 || guess > LIMIT) {
// check for NaN, repeat
logger.error(`You have wrong number. Please enter number [1-${LIMIT}]\n`);
continue;
}

logger.info("You have guessed: %d\n", guess);

logger.warn("Generating a number...");
await delay();

const random = Math.ceil(Math.random() * LIMIT);
// logger.info("Lottery number: %d\n", random);

// hints
const diff = guess - random;
if (diff > 0) {
logger.info("too high!!");
} else if (diff < 0) {
logger.info("too low!!");
} else {
matched = true;
logger.warn("Bingo!! You have won Zoker Lottery! Enjoy!\n");
}
} while (matched !== true);
}

main();

Run, You will see output like.

lottery_game

Breakdown:

  1. delay is just a helping function to give delay
  2. guess = guess.trim(); to clean up number
  3. guess = Number(guess); to convert in number and validate it
  4. await delay(); virtual delay for 1 second.
  5. too high!! and too low!! to just give hint

I was lucky enough, I will lottery in 5-6 try. Haha! You can make harder, by increasing LIMIT to higher number Or removing hint to the user.

Thanks! If you like this tutorial. Please follow me, subscribe and clap for me on https://deepak-v.medium.com/

All working examples can be found in my Github

https://github.com/deepakshrma/deno-by-example/tree/master/examples

- +

Take input from user | Lottery Game

This tutorial we will build a CLI Lottery game app. For this we will use Deno's readLines and Logger that i have created. If you want to learn more about Logger implementation. Please visit: advanced-logger.

Taking input from user

To take input, We can use stdin stream from Deno as Deno.stdin. However, reading stream is very tough task Read My Blog. We can take help from readLines function. This will read stream of bytes and return whenever it found new line chars \n.

lottery_game.ts
import { readLines } from "https://deno.land/std/io/mod.ts";

function main() {
const data = readLines(Deno.stdin).next();
console.log(data);
}

main();

Run:

deno run examples/lottery_game.ts

Type test and then [ENTER]

Output:

Promise { <pending> }
test

Here if you have noticed, .next() after readLines. readLines is async iterator. So to get the value you have to call next(). This will return promise. To get value form it, we need to await for it.

import { readLines } from "https://deno.land/std/io/mod.ts";

async function main() {
const { value: input } = await readLines(Deno.stdin).next();
console.log("You have entered: " + input);
}

main();

Run again. +Output:

test
You have entered: test

Let's use logger to print in color.

lottery_game.ts
import { readLines } from "https://deno.land/std/io/mod.ts";
import { Logger } from "https://raw.githubusercontent.com/deepakshrma/deno_util/master/logger.ts";

async function main() {
const logger = new Logger();
const { value: input } = await readLines(Deno.stdin).next();
logger.info("You have entered: " + input);
}

main();

You will see same output but in cyan color. Cool!

So in this lottery game, We will ask user to enter a number. If guessed number matches the lottery number then game will end. Else user has to enter another number. This game will run till user enter lottery number.

Note:

To loop, We will use do-while loop.

lottery_game.ts
// rest of the code

async function main() {
const logger = new Logger();
let matched = false;
do {
logger.warn("Guess the number: [1-10]");

const { value } = await readLines(Deno.stdin).next();
logger.info("You have guessed: %d\n", value);

const random = Math.ceil(Math.random() * 10);
logger.info("Lottery number: %d\n", random);

matched = Number(value) === random;
} while (matched !== true);
}

main();

Output:

Guess the number: [1-10]
3
You have guessed: 3
Lottery number: 2
Guess the number: [1-10]
4
You have guessed: 4
Lottery number: 4

Breakdown:

We are taking input from user. Same time we are generating number using Math.random. First time, when user enter number 3. It does not match generated lottery number 2. Game asks user to enter again. Soon user enter 4, it matches the newly generated number 4. Game exit.

Let's make it more interactive. We will add some virtual delay to show we are generating number. And user can exit game anytime while pressing q. We will do some error validation too. So that user should not enter something not expected.

lottery_game.ts
import { readLines } from "https://deno.land/std/io/mod.ts";
import { Logger } from "https://raw.githubusercontent.com/deepakshrma/deno_util/master/logger.ts";

const delay = (ms = 1000) => new Promise((r) => setTimeout(r, ms));

async function main() {
const logger = new Logger();
let matched = false;
let LIMIT = 10;
do {
logger.warn(`Guess the number: [1-${LIMIT}], Press 'q' to exit!`);
let { value: guess } = await readLines(Deno.stdin).next();

guess = guess.trim();
if (guess === "q") {
logger.info("Thanks for playing this game! xiè xie!");
Deno.exit(0);
}

guess = Number(guess);
if (!guess || guess < 0 || guess > LIMIT) {
// check for NaN, repeat
logger.error(`You have wrong number. Please enter number [1-${LIMIT}]\n`);
continue;
}

logger.info("You have guessed: %d\n", guess);

logger.warn("Generating a number...");
await delay();

const random = Math.ceil(Math.random() * LIMIT);
// logger.info("Lottery number: %d\n", random);

// hints
const diff = guess - random;
if (diff > 0) {
logger.info("too high!!");
} else if (diff < 0) {
logger.info("too low!!");
} else {
matched = true;
logger.warn("Bingo!! You have won Zoker Lottery! Enjoy!\n");
}
} while (matched !== true);
}

main();

Run, You will see output like.

lottery_game

Breakdown:

  1. delay is just a helping function to give delay
  2. guess = guess.trim(); to clean up number
  3. guess = Number(guess); to convert in number and validate it
  4. await delay(); virtual delay for 1 second.
  5. too high!! and too low!! to just give hint

I was lucky enough, I will lottery in 5-6 try. Haha! You can make harder, by increasing LIMIT to higher number Or removing hint to the user.

Thanks! If you like this tutorial. Please follow me, subscribe and clap for me on https://deepak-v.medium.com/

All working examples can be found in my Github

https://github.com/deepakshrma/deno-by-example/tree/master/examples

+ \ No newline at end of file diff --git a/search-index-docs-default-current.json b/search-index-docs-default-current.json index c3e171f..e0af0c6 100644 --- a/search-index-docs-default-current.json +++ b/search-index-docs-default-current.json @@ -1 +1 @@ -{"documents":[{"id":1,"pageTitle":"Hello World","sectionTitle":"Hello World","sectionRoute":"/deno-by-example/01-hello-world","type":"docs"},{"id":2,"pageTitle":"Hello World","sectionTitle":"Introduction","sectionRoute":"/deno-by-example/01-hello-world#introduction","type":"docs"},{"id":3,"pageTitle":"Hello World","sectionTitle":"Import serve from http module","sectionRoute":"/deno-by-example/01-hello-world#import-serve-from-http-module","type":"docs"},{"id":4,"pageTitle":"Hello World","sectionTitle":"Create a server instance to listen on port 8080","sectionRoute":"/deno-by-example/01-hello-world#create-a-server-instance-to-listen-on-port-8080","type":"docs"},{"id":5,"pageTitle":"Hello World","sectionTitle":"Create request handler","sectionRoute":"/deno-by-example/01-hello-world#create-request-handler","type":"docs"},{"id":6,"pageTitle":"Hello World","sectionTitle":"Respond a JSON","sectionRoute":"/deno-by-example/01-hello-world#respond-a-json","type":"docs"},{"id":12,"pageTitle":"Greet From CLI","sectionTitle":"Greet From CLI","sectionRoute":"/deno-by-example/02-greet-from-cli","type":"docs"},{"id":13,"pageTitle":"Greet From CLI","sectionTitle":"Take user input as command line arguments","sectionRoute":"/deno-by-example/02-greet-from-cli#take-user-input-as-command-line-arguments","type":"docs"},{"id":14,"pageTitle":"Numbers","sectionTitle":"Numbers","sectionRoute":"/deno-by-example/03-numbers","type":"docs"},{"id":7,"pageTitle":"Variables and Constants","sectionTitle":"Variables and Constants","sectionRoute":"/deno-by-example/05-variables-constants","type":"docs"},{"id":42,"pageTitle":"Build a CLI tool | Deno CLI minifind","sectionTitle":"Build a CLI tool | Deno CLI minifind","sectionRoute":"/deno-by-example/advanced-cli-minifind","type":"docs"},{"id":43,"pageTitle":"Build a CLI tool | Deno CLI minifind","sectionTitle":"1. Input command arguments parser","sectionRoute":"/deno-by-example/advanced-cli-minifind#1-input-command-arguments-parser","type":"docs"},{"id":44,"pageTitle":"Build a CLI tool | Deno CLI minifind","sectionTitle":"2. Traverse files and directory trees","sectionRoute":"/deno-by-example/advanced-cli-minifind#2-traverse-files-and-directory-trees","type":"docs"},{"id":45,"pageTitle":"Build a CLI tool | Deno CLI minifind","sectionTitle":"3. Filter files/directory based on the arguments","sectionRoute":"/deno-by-example/advanced-cli-minifind#3-filter-filesdirectory-based-on-the-arguments","type":"docs"},{"id":46,"pageTitle":"Build a CLI tool | Deno CLI minifind","sectionTitle":"4. Logger, better logging information","sectionRoute":"/deno-by-example/advanced-cli-minifind#4-logger-better-logging-information","type":"docs"},{"id":47,"pageTitle":"Build a CLI tool | Deno CLI minifind","sectionTitle":"Bonus","sectionRoute":"/deno-by-example/advanced-cli-minifind#bonus","type":"docs"},{"id":15,"pageTitle":"Build a GraphQL Server (From Scratch) | Deno Advanced","sectionTitle":"Build a GraphQL Server (From Scratch) | Deno Advanced","sectionRoute":"/deno-by-example/advanced-graphql","type":"docs"},{"id":16,"pageTitle":"Build a GraphQL Server (From Scratch) | Deno Advanced","sectionTitle":"Introduction","sectionRoute":"/deno-by-example/advanced-graphql#introduction","type":"docs"},{"id":17,"pageTitle":"Build a GraphQL Server (From Scratch) | Deno Advanced","sectionTitle":"Prerequisite","sectionRoute":"/deno-by-example/advanced-graphql#prerequisite","type":"docs"},{"id":18,"pageTitle":"Build a GraphQL Server (From Scratch) | Deno Advanced","sectionTitle":"Steps","sectionRoute":"/deno-by-example/advanced-graphql#steps","type":"docs"},{"id":19,"pageTitle":"Build a GraphQL Server (From Scratch) | Deno Advanced","sectionTitle":"1. Basic project directory setup","sectionRoute":"/deno-by-example/advanced-graphql#1-basic-project-directory-setup","type":"docs"},{"id":20,"pageTitle":"Build a GraphQL Server (From Scratch) | Deno Advanced","sectionTitle":"2. Velociraptor as script runner","sectionRoute":"/deno-by-example/advanced-graphql#2-velociraptor-as-script-runner","type":"docs"},{"id":21,"pageTitle":"Build a GraphQL Server (From Scratch) | Deno Advanced","sectionTitle":"3. Basic server using Oak","sectionRoute":"/deno-by-example/advanced-graphql#3-basic-server-using-oak","type":"docs"},{"id":22,"pageTitle":"Build a GraphQL Server (From Scratch) | Deno Advanced","sectionTitle":"4. Basic mock database","sectionRoute":"/deno-by-example/advanced-graphql#4-basic-mock-database","type":"docs"},{"id":23,"pageTitle":"Build a GraphQL Server (From Scratch) | Deno Advanced","sectionTitle":"5. Create a /graphql endpoint to handle graphql POST request","sectionRoute":"/deno-by-example/advanced-graphql#5-create-a-graphql-endpoint-to-handle-graphql-post-request","type":"docs"},{"id":24,"pageTitle":"Build a GraphQL Server (From Scratch) | Deno Advanced","sectionTitle":"6. Create GraphQL schema and resolver","sectionRoute":"/deno-by-example/advanced-graphql#6-create-graphql-schema-and-resolver","type":"docs"},{"id":25,"pageTitle":"Build a GraphQL Server (From Scratch) | Deno Advanced","sectionTitle":"7. Route to handle Query and execute","sectionRoute":"/deno-by-example/advanced-graphql#7-route-to-handle-query-and-execute","type":"docs"},{"id":26,"pageTitle":"Build a GraphQL Server (From Scratch) | Deno Advanced","sectionTitle":"Limitations","sectionRoute":"/deno-by-example/advanced-graphql#limitations","type":"docs"},{"id":27,"pageTitle":"Build a GraphQL Server (From Scratch) | Deno Advanced","sectionTitle":"Source Code","sectionRoute":"/deno-by-example/advanced-graphql#source-code","type":"docs"},{"id":8,"pageTitle":"Implementing JQ equivalent in Deno","sectionTitle":"Implementing JQ equivalent in Deno","sectionRoute":"/deno-by-example/advanced-jq","type":"docs"},{"id":9,"pageTitle":"Implementing JQ equivalent in Deno","sectionTitle":"How to create a stdin","sectionRoute":"/deno-by-example/advanced-jq#how-to-create-a-stdin","type":"docs"},{"id":10,"pageTitle":"Implementing JQ equivalent in Deno","sectionTitle":"How to read stdin in Deno.","sectionRoute":"/deno-by-example/advanced-jq#how-to-read-stdin-in-deno","type":"docs"},{"id":11,"pageTitle":"Implementing JQ equivalent in Deno","sectionTitle":"Parsing JSON","sectionRoute":"/deno-by-example/advanced-jq#parsing-json","type":"docs"},{"id":56,"pageTitle":"Building A Super Cool Colorful Logger with Deno fmt module","sectionTitle":"Building A Super Cool Colorful Logger with Deno fmt module","sectionRoute":"/deno-by-example/advanced-logger","type":"docs"},{"id":57,"pageTitle":"Building A Super Cool Colorful Logger with Deno fmt module","sectionTitle":"Prerequisites","sectionRoute":"/deno-by-example/advanced-logger#prerequisites","type":"docs"},{"id":58,"pageTitle":"Building A Super Cool Colorful Logger with Deno fmt module","sectionTitle":"Formatted Log in JS","sectionRoute":"/deno-by-example/advanced-logger#formatted-log-in-js","type":"docs"},{"id":59,"pageTitle":"Building A Super Cool Colorful Logger with Deno fmt module","sectionTitle":"Issues with vargs","sectionRoute":"/deno-by-example/advanced-logger#issues-with-vargs","type":"docs"},{"id":60,"pageTitle":"Building A Super Cool Colorful Logger with Deno fmt module","sectionTitle":"Introduction to PrintF","sectionRoute":"/deno-by-example/advanced-logger#introduction-to-printf","type":"docs"},{"id":61,"pageTitle":"Building A Super Cool Colorful Logger with Deno fmt module","sectionTitle":"According to Deno documents","sectionRoute":"/deno-by-example/advanced-logger#according-to-deno-documents","type":"docs"},{"id":62,"pageTitle":"Building A Super Cool Colorful Logger with Deno fmt module","sectionTitle":"Colors in Log","sectionRoute":"/deno-by-example/advanced-logger#colors-in-log","type":"docs"},{"id":63,"pageTitle":"Building A Super Cool Colorful Logger with Deno fmt module","sectionTitle":"Now, We have all the basic tools. Let's finish the Logger implementation","sectionRoute":"/deno-by-example/advanced-logger#now-we-have-all-the-basic-tools-lets-finish-the-logger-implementation","type":"docs"},{"id":64,"pageTitle":"Building A Super Cool Colorful Logger with Deno fmt module","sectionTitle":"Create a Basic Logger Class","sectionRoute":"/deno-by-example/advanced-logger#create-a-basic-logger-class","type":"docs"},{"id":28,"pageTitle":"Build an Isomorphic Application using Deno and React without WebPack","sectionTitle":"Build an Isomorphic Application using Deno and React without WebPack","sectionRoute":"/deno-by-example/advanced-react-ssr","type":"docs"},{"id":29,"pageTitle":"Build an Isomorphic Application using Deno and React without WebPack","sectionTitle":"Overview","sectionRoute":"/deno-by-example/advanced-react-ssr#overview","type":"docs"},{"id":30,"pageTitle":"Build an Isomorphic Application using Deno and React without WebPack","sectionTitle":"Set-up","sectionRoute":"/deno-by-example/advanced-react-ssr#set-up","type":"docs"},{"id":31,"pageTitle":"Build an Isomorphic Application using Deno and React without WebPack","sectionTitle":"Start with npm init","sectionRoute":"/deno-by-example/advanced-react-ssr#start-with-npm-init","type":"docs"},{"id":32,"pageTitle":"Build an Isomorphic Application using Deno and React without WebPack","sectionTitle":"Backend","sectionRoute":"/deno-by-example/advanced-react-ssr#backend","type":"docs"},{"id":33,"pageTitle":"Build an Isomorphic Application using Deno and React without WebPack","sectionTitle":"Add React Server Render","sectionRoute":"/deno-by-example/advanced-react-ssr#add-react-server-render","type":"docs"},{"id":34,"pageTitle":"Build an Isomorphic Application using Deno and React without WebPack","sectionTitle":"Hello SSR","sectionRoute":"/deno-by-example/advanced-react-ssr","type":"docs"},{"id":35,"pageTitle":"Build an Isomorphic Application using Deno and React without WebPack","sectionTitle":"Adding Server Controller- Create Backend APIs","sectionRoute":"/deno-by-example/advanced-react-ssr#adding-server-controller--create-backend-apis","type":"docs"},{"id":36,"pageTitle":"Build an Isomorphic Application using Deno and React without WebPack","sectionTitle":"Client Side App","sectionRoute":"/deno-by-example/advanced-react-ssr#client-side-app","type":"docs"},{"id":37,"pageTitle":"Build an Isomorphic Application using Deno and React without WebPack","sectionTitle":"Add List Todos to React App","sectionRoute":"/deno-by-example/advanced-react-ssr#add-list-todos-to-react-app","type":"docs"},{"id":38,"pageTitle":"Build an Isomorphic Application using Deno and React without WebPack","sectionTitle":"Adding delete functionality on client-side","sectionRoute":"/deno-by-example/advanced-react-ssr#adding-delete-functionality-on-client-side","type":"docs"},{"id":39,"pageTitle":"Build an Isomorphic Application using Deno and React without WebPack","sectionTitle":"Final Touch","sectionRoute":"/deno-by-example/advanced-react-ssr#final-touch","type":"docs"},{"id":40,"pageTitle":"Build an Isomorphic Application using Deno and React without WebPack","sectionTitle":"Initialize initial state","sectionRoute":"/deno-by-example/advanced-react-ssr#initialize-initial-state","type":"docs"},{"id":41,"pageTitle":"Build an Isomorphic Application using Deno and React without WebPack","sectionTitle":"Final Domo","sectionRoute":"/deno-by-example/advanced-react-ssr#final-domo","type":"docs"},{"id":78,"pageTitle":"Read Line by Line as Data Stream","sectionTitle":"Read Line by Line as Data Stream","sectionRoute":"/deno-by-example/advanced-readline","type":"docs"},{"id":79,"pageTitle":"Read Line by Line as Data Stream","sectionTitle":"Read Id[rid]","sectionRoute":"/deno-by-example/advanced-readline#read-idrid","type":"docs"},{"id":80,"pageTitle":"Read Line by Line as Data Stream","sectionTitle":"Sample: open file","sectionRoute":"/deno-by-example/advanced-readline#sample-open-file","type":"docs"},{"id":81,"pageTitle":"Read Line by Line as Data Stream","sectionTitle":"Example: 1","sectionRoute":"/deno-by-example/advanced-readline#example-1","type":"docs"},{"id":82,"pageTitle":"Read Line by Line as Data Stream","sectionTitle":"Example: 2","sectionRoute":"/deno-by-example/advanced-readline#example-2","type":"docs"},{"id":83,"pageTitle":"Read Line by Line as Data Stream","sectionTitle":"Example: 3","sectionRoute":"/deno-by-example/advanced-readline#example-3","type":"docs"},{"id":84,"pageTitle":"Read Line by Line as Data Stream","sectionTitle":"Basic sample for Async Iterator","sectionRoute":"/deno-by-example/advanced-readline#basic-sample-for-async-iterator","type":"docs"},{"id":85,"pageTitle":"Read Line by Line as Data Stream","sectionTitle":"Example: Final code","sectionRoute":"/deno-by-example/advanced-readline#example-final-code","type":"docs"},{"id":48,"pageTitle":"Creating Routing/Controller in Deno Server(From Scratch)","sectionTitle":"Creating Routing/Controller in Deno Server(From Scratch)","sectionRoute":"/deno-by-example/advanced-routing","type":"docs"},{"id":49,"pageTitle":"Creating Routing/Controller in Deno Server(From Scratch)","sectionTitle":"Introduction","sectionRoute":"/deno-by-example/advanced-routing#introduction","type":"docs"},{"id":50,"pageTitle":"Creating Routing/Controller in Deno Server(From Scratch)","sectionTitle":"All working examples can be found in my Github","sectionRoute":"/deno-by-example/advanced-routing#all-working-examples-can-be-found-in-my-github","type":"docs"},{"id":67,"pageTitle":"Run Deno Application on docker | Continuous Integration and Deployment","sectionTitle":"Run Deno Application on docker | Continuous Integration and Deployment","sectionRoute":"/deno-by-example/advanced-run-on-docker","type":"docs"},{"id":68,"pageTitle":"Run Deno Application on docker | Continuous Integration and Deployment","sectionTitle":"Overview","sectionRoute":"/deno-by-example/advanced-run-on-docker#overview","type":"docs"},{"id":69,"pageTitle":"Run Deno Application on docker | Continuous Integration and Deployment","sectionTitle":"1. Create a simple Deno WebApp","sectionRoute":"/deno-by-example/advanced-run-on-docker#1-create-a-simple-deno-webapp","type":"docs"},{"id":70,"pageTitle":"Run Deno Application on docker | Continuous Integration and Deployment","sectionTitle":"2. Create a Dockerfile","sectionRoute":"/deno-by-example/advanced-run-on-docker#2-create-a-dockerfile","type":"docs"},{"id":71,"pageTitle":"Run Deno Application on docker | Continuous Integration and Deployment","sectionTitle":"3. Install Deno Using docker","sectionRoute":"/deno-by-example/advanced-run-on-docker#3-install-deno-using-docker","type":"docs"},{"id":72,"pageTitle":"Run Deno Application on docker | Continuous Integration and Deployment","sectionTitle":"4. Running Todo App","sectionRoute":"/deno-by-example/advanced-run-on-docker#4-running-todo-app","type":"docs"},{"id":73,"pageTitle":"Run Deno Application on docker | Continuous Integration and Deployment","sectionTitle":"Bonus","sectionRoute":"/deno-by-example/advanced-run-on-docker#bonus","type":"docs"},{"id":74,"pageTitle":"Run Deno Application on docker | Continuous Integration and Deployment","sectionTitle":"Some Usefull Docker Commands","sectionRoute":"/deno-by-example/advanced-run-on-docker#some-usefull-docker-commands","type":"docs"},{"id":51,"pageTitle":"Getting Started","sectionTitle":"Getting Started","sectionRoute":"/deno-by-example/getting-started","type":"docs"},{"id":52,"pageTitle":"Getting Started","sectionTitle":"Download and install","sectionRoute":"/deno-by-example/getting-started#download-and-install","type":"docs"},{"id":53,"pageTitle":"Getting Started","sectionTitle":"Setup your environment","sectionRoute":"/deno-by-example/getting-started#setup-your-environment","type":"docs"},{"id":54,"pageTitle":"Getting Started","sectionTitle":"Create Alias for deno run","sectionRoute":"/deno-by-example/getting-started#create-alias-for-deno-run","type":"docs"},{"id":55,"pageTitle":"Getting Started","sectionTitle":"Hello World Program","sectionRoute":"/deno-by-example/getting-started#hello-world-program","type":"docs"},{"id":65,"pageTitle":"Deno By Example","sectionTitle":"Deno By Example","sectionRoute":"/deno-by-example/introduction","type":"docs"},{"id":66,"pageTitle":"Deno By Example","sectionTitle":"This website to show examples on the Deno language. Examples are written in md files in docs directories","sectionRoute":"/deno-by-example/introduction#this-website-to-show-examples-on-the-deno-language-examples-are-written-in-md-files-in-docs-directories","type":"docs"},{"id":75,"pageTitle":"Take input from user | Lottery Game","sectionTitle":"Take input from user | Lottery Game","sectionRoute":"/deno-by-example/lottery-game","type":"docs"},{"id":76,"pageTitle":"Take input from user | Lottery Game","sectionTitle":"Taking input from user","sectionRoute":"/deno-by-example/lottery-game#taking-input-from-user","type":"docs"},{"id":77,"pageTitle":"Take input from user | Lottery Game","sectionTitle":"All working examples can be found in my Github","sectionRoute":"/deno-by-example/lottery-game#all-working-examples-can-be-found-in-my-github","type":"docs"}],"index":{"version":"2.3.9","fields":["title","content"],"fieldVectors":[["title/1",[0,2.246,1,2.441]],["content/1",[]],["title/2",[2,4.169]],["content/2",[3,0.648,4,5.728,5,4.174,6,4.53,7,5.728,8,4.53,9,3.451,10,3.622,11,4.53,12,2.424,13,3.117,14,5.728,15,3.117,16,5.944,17,5.728,18,3.654,19,4.174,20,5.006,21,2.424,22,5.006,23,2.309,24,3.451,25,3.451,26,1.613,27,3.654,28,2.975,29,1.031,30,5.728]],["title/3",[15,2.083,16,3.027,31,1.187,32,1.505]],["content/3",[15,3.627,31,2.067,33,0.825,34,4.526]],["title/4",[23,1.039,29,0.564,35,2.285,36,3.136,37,1.629,38,2.13]],["content/4",[15,4.06,23,2.126,31,1.991,33,0.878,34,4.36,37,3.335,38,4.36,39,1.359]],["title/5",[29,0.774,40,2.459,41,3.76]],["content/5",[0,2.602,1,2.078,3,0.471,9,2.519,11,3.306,12,1.769,13,2.275,15,3.52,23,2.406,25,3.429,29,1.024,31,1.297,33,0.83,34,2.839,35,3.046,37,3.36,38,2.839,39,1.47,42,5.116,43,4.181,44,1.164,45,3.653,46,2.006,47,4.5,48,4.973,49,2.275,50,4.181,51,1.297,52,4.5,53,2.487,54,3.215,55,1.47,56,1.532,57,2.275,58,1.769,59,0.851,60,3.306,61,4.181,62,3.046,63,4.181,64,2.602,65,1.481,66,3.653,67,3.653,68,2.39,69,3.306,70,1.431,71,2.667,72,1.431,73,2.015,74,3.63,75,3.653,76,4.181,77,4.181,78,3.306,79,3.865,80,2.39,81,3.306,82,2.39,83,2.519,84,1.216,85,1.216,86,3.653,87,1.532,88,3.046,89,2.839,90,1.532,91,1.912,92,2.078]],["title/6",[79,3.336,93,2.34]],["content/6",[0,1.667,1,2.571,3,0.302,12,1.543,13,1.983,15,2.815,16,2.882,23,1.713,26,1.693,29,1.082,31,1.13,32,1.433,33,0.918,34,2.475,35,2.656,37,3.123,38,2.475,39,1.463,40,2.083,42,4.755,44,0.931,46,1.13,47,2.882,49,3.561,51,1.13,52,2.882,53,1.771,54,1.811,55,1.273,68,2.083,69,2.882,70,1.771,71,2.325,79,3.513,82,4.501,83,3.623,84,1.504,90,1.896,93,2.864,94,5.498,95,3.769,96,3.117,97,1.291,98,2.325,99,3.645,100,1.094,101,3.645,102,1.433,103,2.656,104,2.196,105,3.645,106,3.645,107,5.173,108,1.903,109,2.656,110,3.645,111,3.645,112,2.687,113,2.325,114,1.543,115,1.667,116,2.656,117,1.383,118,3.769,119,4.09,120,3.645,121,3.645,122,2.882,123,2.325,124,3.645,125,2.475,126,2.325,127,3.645]],["title/12",[128,4.292,129,2.673]],["content/12",[55,1.345,58,2.689,92,3.157,130,4.239,131,3.261,132,4.08,133,6.353,134,3.3,135,3.026,136,6.353]],["title/13",[58,1.327,92,1.558,130,1.793,131,1.379,132,1.629,135,1.494]],["content/13",[0,3.033,1,3.296,3,0.63,29,0.951,33,0.915,39,1.118,44,1.368,59,0.695,91,2.416,108,1.536,112,2.744,137,1.27,138,7.249,139,4.177,140,6.632,141,2.737,142,1.27,143,3.996,144,4.616,145,5.283,146,3.296,147,2.057]],["title/14",[117,2.172]],["content/14",[3,0.543,26,1.46,33,0.919,39,1.097,44,0.933,55,0.774,56,1.34,84,1.507,85,1.063,88,2.664,95,2.664,96,2.203,102,2.038,108,1.507,114,1.547,117,3.044,137,0.879,142,0.879,143,3.123,148,2.133,149,2.332,150,2.483,151,3.842,152,3.195,153,1.817,154,3.656,155,1.547,156,3.656,157,3.656,158,3.656,159,1.741,160,6.046,161,5.182,162,5.184,163,5.184,164,2.869,165,2.576,166,2.664,167,6.919,168,6.023,169,2.576,170,3.656,171,3.656,172,3.656,173,5.184,174,3.656,175,5.184,176,2.693,177,3.656,178,3.307,179,5.184,180,4.763,181,5.727,182,6.023,183,3.656,184,5.184,185,5.184,186,2.576,187,3.656,188,2.203,189,2.664,190,3.195,191,3.195,192,3.656,193,2.891,194,3.656,195,3.656]],["title/7",[196,3.133,197,4.292]],["content/7",[3,0.368,26,1.25,29,1.066,33,0.932,39,1.506,44,1.066,59,0.779,83,4.018,84,1.291,95,4.317,141,1.52,142,1.067,143,3.57,146,2.206,159,2.114,161,5.274,164,2.114,169,3.536,193,3.51,196,4.254,197,6.665,198,7.415,199,4.439,200,4.439,201,3.077,202,4.439,203,5.178,204,3.57,205,5.178,206,4.86,207,4.439,208,2.537,209,5.925,210,4.439,211,4.439]],["title/42",[3,0.238,33,0.311,87,1.054,129,2.366,212,1.835,213,2.096]],["content/42",[9,3.388,29,1.342,58,2.38,65,1.991,92,3.426,114,2.38,125,3.819,128,4.914,129,4.057,132,2.921,137,1.351,214,5.623,215,3.819,216,2.293,217,5.623,218,4.914,219,4.914,220,5.623,221,4.446,222,5.623,223,5.623,224,3.388,225,3.388,226,4.446,227,4.446,228,3.388,229,4.446,230,3.819,231,4.914,232,3.214,233,2.472,234,4.446,235,2.921,236,4.914]],["title/43",[58,1.459,92,1.713,132,1.791,226,2.726,237,1.264]],["content/43",[3,0.537,12,1.162,18,1.751,26,1.899,31,0.851,32,1.079,33,0.92,39,1.078,44,1.106,55,0.581,56,1.867,59,0.361,70,0.94,72,1.437,73,1.486,81,2.17,84,1.22,85,0.798,90,1.006,91,2.964,92,3.543,95,2,97,0.972,102,2.549,108,1.481,129,1.493,130,1.569,141,2.105,142,1.009,147,1.58,164,1.307,165,2.085,176,2.18,188,1.654,206,3.712,225,1.654,226,2.17,228,1.654,232,1.569,238,1.364,239,2,240,2.17,241,2.528,242,2.283,243,3.874,244,3.058,245,2.745,246,3.058,247,4.196,248,4.196,249,2.745,250,5.705,251,4.302,252,3.345,253,3.318,254,4.58,255,2,256,6.147,257,0.972,258,2.398,259,5.637,260,4.861,261,2.398,262,1.751,263,2,264,2.398,265,2.745,266,2.85,267,2.283,268,2.745,269,2.17,270,2,271,2.398,272,2.745,273,2.398,274,2.85,275,2.745,276,1.006,277,3.318,278,2,279,4.196,280,2.745,281,1.654,282,1.864,283,2.745,284,1.751,285,2.745,286,5.095,287,3.976,288,3.704,289,1.364,290,2.745,291,2.745,292,4.196,293,2.745,294,2.085,295,1.493,296,1.207,297,2.398,298,2.745,299,2.745,300,2.745,301,2.745]],["title/44",[137,0.829,227,2.726,228,2.077,229,2.726,302,1.713]],["content/44",[3,0.37,26,1.51,31,1.978,32,1.174,33,0.909,39,1.261,44,1.205,46,0.926,53,1.022,55,1.35,56,1.639,57,1.625,59,0.783,72,1.022,73,1.899,74,1.905,80,2.557,84,0.868,85,0.868,90,1.094,91,1.366,92,1.484,97,1.058,102,2.109,108,1.731,117,1.133,130,1.707,132,1.551,137,1.289,141,2.184,142,1.609,147,1.387,176,2.323,178,3.798,188,1.799,216,1.824,224,1.799,227,3.537,228,3.843,229,2.361,232,1.707,243,4.044,244,3.259,246,3.259,251,3.421,254,4.044,255,3.908,257,1.058,258,3.908,259,3.537,260,4.241,261,3.908,270,2.176,276,1.094,303,2.361,304,4.068,305,4.27,306,2.986,307,3.908,308,3.908,309,3.908,310,3.908,311,2.986,312,4.686,313,2.609,314,4.686,315,1.313,316,2.609,317,2.609,318,1.707,319,2.853,320,2.695,321,2.986,322,2.557,323,1.799,324,2.986,325,2.986,326,5.204,327,4.473,328,3.908,329,2.361,330,2.986,331,2.323,332,2.986,333,2.986,334,5.363,335,5.363,336,4.473,337,2.986,338,2.986,339,2.609,340,1.905,341,3.908,342,1.707,343,2.986,344,2.986]],["title/45",[92,1.713,186,1.713,230,2.341,231,3.013,232,1.971]],["content/45",[3,0.496,12,1.276,21,1.276,24,2.715,26,1.685,33,0.922,39,1.356,44,1.288,46,1.397,59,0.592,73,1.596,91,1.379,92,1.499,100,0.905,102,2.519,108,1.74,112,2.34,115,1.379,117,1.144,122,2.385,131,1.326,137,1.296,141,2.049,142,1.296,147,0.935,148,1.068,176,2.34,178,3.817,213,2.197,216,1.23,230,2.048,233,1.326,243,4.563,244,3.283,246,3.283,255,2.197,257,1.068,260,3.563,263,3.931,264,3.937,266,2.048,267,1.641,269,3.563,278,2.197,284,3.441,294,2.974,302,2.239,303,2.385,308,2.635,309,2.635,310,2.635,312,4.714,313,2.635,326,2.635,328,3.931,329,3.563,331,3.108,345,5.984,346,2.635,347,4.349,348,5.394,349,6.405,350,6.405,351,5.394,352,3.016,353,3.283,354,5.229,355,4.714,356,1.797,357,3.016,358,3.016,359,3.016,360,4.506,361,4.506,362,3.016,363,3.016,364,2.385,365,3.016,366,3.016,367,2.635,368,3.016,369,4.506,370,3.016,371,3.016,372,2.635,373,3.016,374,2.385,375,3.016]],["title/46",[233,1.516,234,2.726,235,1.791,236,3.013,376,2.512]],["content/46",[3,0.49,26,1.245,29,1.064,31,1.372,33,0.903,39,1.409,44,1.279,46,1.372,55,0.936,59,0.582,84,1.286,100,1.328,104,2.665,108,1.719,129,3.216,131,2.599,142,1.421,147,1.833,213,4.307,216,1.803,233,3.124,243,4.521,244,3.223,246,3.223,251,4.86,257,1.566,263,3.223,294,3.308,328,3.223,329,3.497,331,3.07,347,4.014,356,1.999,374,3.497,377,3.223,378,3.004,379,4.423,380,3.497,381,3.865,382,4.423,383,3.865,384,4.423,385,4.423,386,2.665,387,4.423,388,4.423,389,3.865,390,3.865,391,4.423,392,4.423,393,4.423,394,3.865,395,4.423,396,3.497,397,2.665]],["title/47",[398,4.525]],["content/47",[3,0.557,9,2.724,10,2.348,21,2.538,26,1.689,28,2.348,33,0.649,44,1.211,53,1.548,55,0.957,58,3.034,59,0.789,65,1.601,68,2.584,70,2.054,97,1.601,100,1.357,102,1.778,114,1.913,115,2.743,126,2.884,129,2.46,135,2.153,147,1.402,148,1.601,165,2.247,212,2.884,213,5.224,216,2.446,238,2.247,242,2.46,243,3.07,257,2.384,263,3.294,266,3.07,276,1.657,289,2.98,305,3.826,319,3.826,331,2.348,374,3.575,397,2.724,399,2.584,400,4.521,401,2.98,402,4.37,403,4.521,404,5.998,405,4.521,406,4.521,407,4.521,408,3.951,409,4.521,410,4.521,411,3.951,412,3.951,413,2.724,414,3.07,415,3.07,416,1.843,417,2.724,418,2.46,419,2.584,420,2.584,421,2.46,422,2.46,423,3.07]],["title/15",[3,0.238,23,0.952,33,0.311,87,1.054,424,1.494,425,2.096,426,2.274]],["content/15",[]],["title/16",[2,4.169]],["content/16",[3,0.628,10,2.72,32,2.06,87,2.418,100,1.573,150,3.557,153,3.278,155,2.217,188,3.156,238,3.588,251,3.341,296,2.303,356,1.573,424,3.751,427,5.238,428,4.577,429,2.72,430,4.577,431,5.238,432,5.238,433,4.141,434,3.341,435,5.238,436,5.238,437,5.238,438,4.807,439,4.207,440,4.577,441,5.238,442,4.577,443,5.238,444,4.141,445,3.816,446,4.577,447,3.816,448,3.341,449,5.238,450,1.793,451,2.85,452,3.816,453,5.238,454,5.238,455,3.557,456,5.238]],["title/17",[457,5]],["content/17",[3,0.607,55,1.649,84,2.264,218,6.403,401,3.093,424,3.233,450,2.667,458,4.922,459,4.535,460,3.387]],["title/18",[461,5.722]],["content/18",[]],["title/19",[228,2.077,237,1.264,450,1.18,462,2.726,463,2.512]],["content/19",[5,3.969,23,1.804,29,1.217,33,0.589,57,2.964,64,2.491,85,1.584,114,2.305,137,1.309,228,4.073,304,4.312,328,3.969,347,3.699,356,1.636,460,3.679,464,3.475,465,4.76,466,7.351,467,6.761,468,5.448,469,5.448,470,5.448,471,5.448,472,4.073,473,5.448,474,5.448,475,4.926,476,5.448,477,5.448,478,3.114,479,4.76,480,5.448,481,5.448,482,5.448,483,4.591,484,4.76]],["title/20",[302,1.902,485,3.345,486,2.188,487,3.027]],["content/20",[0,2.001,1,2.174,3,0.643,32,1.721,33,0.473,44,0.787,53,2.526,54,3.29,55,1.402,58,1.852,59,0.93,64,2.684,84,1.272,87,1.604,93,2.084,97,2.078,134,2.273,148,1.55,155,1.852,239,4.276,257,2.345,276,1.604,287,3.354,289,2.174,314,3.823,318,3.354,331,2.273,401,2.916,402,4.276,421,2.381,438,3.188,447,3.188,450,2.009,452,3.188,475,4.825,485,6.183,486,3.785,487,3.46,488,2.971,489,2.636,490,3.516,491,4.375,492,3.188,493,5.236,494,4.375,495,4.375,496,3.46,497,2.971,498,2.636,499,5.868,500,3.46,501,2.636,502,2.971,503,4.375,504,5.868,505,3.188,506,2.501,507,2.636,508,3.823,509,3.188]],["title/21",[23,1.142,59,0.453,186,1.713,450,1.18,510,2.199]],["content/21",[0,2.549,3,0.336,23,2.271,29,1.234,31,2.127,32,2.192,33,0.92,37,2.895,39,1.451,40,2.318,44,1.234,46,1.258,51,1.258,53,1.908,59,0.533,64,1.855,79,2.754,87,1.487,88,2.955,89,2.754,100,1.674,123,2.587,147,1.258,148,1.436,155,1.717,176,2.895,196,2.587,233,2.8,274,2.754,276,1.487,318,2.318,339,3.544,383,3.544,386,2.444,424,2.895,438,2.955,450,1.908,460,2.207,475,2.955,493,3.207,506,2.318,510,3.555,511,3.207,512,2.444,513,2.912,514,3.207,515,5.574,516,4.056,517,4.871,518,3.544,519,3.544,520,2.587,521,3.544,522,4.056,523,3.544,524,3.544,525,4.056,526,4.056,527,4.056,528,4.056,529,2.955,530,4.056,531,3.207,532,4.056,533,2.444,534,4.056,535,4.056,536,4.056,537,3.544]],["title/22",[376,2.789,450,1.311,538,3.345,539,3.027]],["content/22",[29,0.644,33,0.894,39,1.081,51,1.111,56,1.312,59,0.471,65,1.268,72,2.223,73,1.268,80,2.047,108,2.304,112,2.653,115,2.723,117,2.26,131,3.23,137,1.228,141,2.223,142,0.861,155,1.515,176,1.86,180,2.831,230,2.432,232,2.047,237,1.312,238,1.779,284,3.258,422,1.948,450,1.226,472,2.157,520,3.258,538,4.464,539,4.709,540,3.581,541,3.581,542,3.129,543,2.609,544,3.581,545,3.581,546,5.108,547,4.464,548,3.581,549,3.258,550,4.464,551,3.581,552,3.581,553,3.581,554,3.581,555,3.581,556,4.464,557,4.464,558,3.581,559,4.464,560,3.581,561,3.258,562,3.129,563,2.831,564,3.129,565,4.464,566,3.581,567,4.464,568,3.581,569,4.464,570,3.581,571,3.581,572,3.581,573,4.039,574,3.581,575,3.581,576,3.581,577,3.581,578,3.581,579,3.581,580,3.581,581,4.464,582,3.581,583,3.581,584,3.581,585,3.581,586,5.674,587,2.538,588,3.581,589,3.581,590,4.464,591,6.865,592,3.581,593,3.581,594,3.129,595,3.129]],["title/23",[29,0.478,40,1.518,424,2.125,596,1.694,597,2.321,598,1.804,599,1.6]],["content/23",[0,1.953,12,1.807,23,1.414,29,1.118,31,1.926,33,0.925,35,2.046,39,1.314,40,3.299,44,0.768,46,0.871,51,0.871,59,0.86,64,1.284,72,1.462,73,0.994,82,1.605,93,1.337,94,2.046,97,1.83,98,1.791,100,1.551,102,2.032,103,2.046,104,1.692,115,1.953,122,2.22,137,0.675,141,0.961,142,1.026,147,0.871,148,0.994,155,1.188,164,1.337,196,3.961,201,2.218,277,3.376,294,2.122,296,1.877,318,1.605,356,1.282,416,1.145,424,2.683,430,2.454,460,3.558,464,1.791,472,1.692,475,2.046,478,1.605,492,4.525,493,2.22,509,2.046,510,3.295,513,2.84,514,3.376,531,2.22,537,2.454,563,2.22,595,2.454,597,2.454,599,3.478,600,2.808,601,5.496,602,3.376,603,2.808,604,4.27,605,3.731,606,5.426,607,3.299,608,2.454,609,3.113,610,3.92,611,2.454,612,2.22,613,2.046,614,2.454,615,2.454,616,2.454,617,2.046,618,2.454,619,3.731,620,4.27,621,2.808,622,2.808,623,4.27,624,2.808,625,2.808,626,2.808,627,2.808,628,2.808,629,2.808,630,2.22,631,2.808,632,1.791,633,4.27,634,2.808,635,2.808,636,2.808,637,2.808,638,2.808,639,2.808,640,2.046,641,2.441,642,2.454,643,2.046,644,2.454,645,2.454,646,4.27,647,3.731,648,2.454]],["title/24",[29,0.62,304,2.199,424,1.791,483,2.341,649,2.726]],["content/24",[0,2.675,1,1.431,12,2.658,29,0.783,31,1.948,32,1.133,33,0.922,39,1.329,56,1.056,59,0.769,72,1.491,73,1.542,74,2.777,80,1.646,83,1.736,90,1.056,93,1.372,97,1.02,102,2.064,108,2.273,115,2.872,131,2.571,137,0.692,141,2.002,142,1.046,148,1.02,155,1.842,164,1.372,190,4.586,212,1.837,224,1.736,232,1.646,259,2.278,267,1.567,269,2.278,284,1.837,304,4.374,318,1.646,323,1.736,356,1.307,402,2.099,424,3.754,450,0.986,478,1.646,483,4.485,497,1.956,502,2.956,547,2.517,549,1.837,550,2.517,556,2.517,557,2.517,559,2.517,561,1.837,565,2.517,567,2.517,569,2.517,573,2.278,581,2.517,586,4.586,587,1.431,590,2.517,601,5.266,609,2.623,619,3.804,650,5.248,651,2.099,652,5.248,653,2.881,654,1.837,655,2.881,656,2.881,657,2.881,658,2.881,659,5.248,660,2.881,661,2.517,662,5.248,663,2.517,664,2.881,665,2.881,666,2.099,667,2.881,668,2.881,669,2.881,670,2.881,671,2.881,672,5.848,673,2.881,674,2.881,675,2.881,676,5.248,677,2.881,678,2.881,679,2.881,680,2.881,681,2.881,682,2.881,683,2.881,684,2.881,685,2.881,686,2.278,687,2.881]],["title/25",[402,2.512,460,1.876,598,2.341,601,2.512,688,3.448]],["content/25",[12,1.481,15,1.904,23,1.159,29,0.63,31,1.992,33,0.936,39,1.244,40,3.672,46,1.558,59,0.773,73,1.239,82,2.872,90,1.282,93,1.667,94,2.549,100,1.051,102,1.376,103,2.549,104,2.108,115,1.6,131,1.538,141,1.72,142,0.841,147,1.085,196,3.205,201,1.817,216,1.427,296,2.992,304,3.75,411,3.057,416,1.427,424,3.337,483,3.992,492,2.549,514,2.767,531,2.767,561,2.232,562,3.057,563,2.767,564,3.057,598,2.376,599,3.027,601,5.44,605,4.39,606,5.137,607,2.872,608,3.057,609,3.027,610,4.363,611,3.057,612,2.767,613,2.549,614,3.057,615,3.057,616,3.057,617,3.661,618,4.39,640,2.549,641,2.872,642,3.057,643,2.549,644,3.057,645,3.057,647,3.057,648,3.057,661,3.057,663,3.057,689,3.499,690,3.499,691,3.499,692,3.499,693,3.499,694,3.499,695,3.499,696,3.499,697,3.499]],["title/26",[698,4.169]],["content/26",[3,0.481,9,3.501,51,1.802,86,5.077,100,2.112,114,2.459,137,1.396,148,2.058,165,2.887,169,2.887,238,3.495,304,3.706,438,4.234,439,3.706,452,4.234,483,3.946,497,3.946,598,3.946,698,5.125,699,5.81,700,5.077,701,5.81,702,5.81,703,5.561,704,5.81,705,5.81,706,5.81,707,5.81]],["title/27",[356,1.475,708,3.579]],["content/27",[3,0.526,65,2.25,148,2.25,397,3.828,413,3.828,414,4.315,415,4.315,416,2.591,417,3.828,418,3.457,419,3.632,420,3.632,424,3.3,709,6.353]],["title/8",[3,0.317,451,2.083,710,3.027,711,3.828]],["content/8",[3,0.468,18,4.41,29,1.017,55,1.463,59,0.909,85,1.642,93,2.691,123,3.603,132,3.88,230,3.836,242,3.074,254,3.836,273,4.936,296,3.423,322,3.229,710,4.467,712,5.649,713,5.649,714,4.467,715,5.649,716,5.649,717,2.934,718,4.467,719,3.603,720,4.936,721,4.467,722,4.41,723,5.038]],["title/9",[29,0.884,722,3.133]],["content/9",[3,0.64,26,1.92,33,0.858,44,1.39,59,0.896,85,1.982,91,3.118,147,1.712,238,2.744,239,4.023,242,4.024,296,3.396,501,4.107,722,3.522,724,6.817,725,6.817,726,6.817,727,6.817,728,5.521]],["title/10",[3,0.356,55,0.911,722,2.745]],["content/10",[3,0.618,10,2.609,33,0.868,39,1.499,44,1.388,46,1.992,55,1.063,70,1.72,82,2.871,90,1.841,100,1.508,117,1.906,118,3.66,137,1.207,147,1.558,153,2.496,238,2.496,242,2.733,296,3.114,319,3.203,498,3.026,722,3.203,723,4.68,729,5.022,730,5.022,731,4.389,732,3.971,733,3.971,734,6.895,735,5.613,736,5.613,737,5.022,738,3.971,739,4.68,740,5.022,741,3.66,742,4.389,743,4.389]],["title/11",[93,2.34,254,3.336]],["content/11",[3,0.466,10,1.882,21,0.963,29,0.652,31,1.745,33,0.924,39,1.382,44,0.927,46,1.124,55,0.482,56,0.834,59,0.788,65,0.806,70,0.779,72,0.779,75,1.988,80,2.072,82,2.072,83,1.371,84,0.661,85,0.661,88,1.658,89,1.545,90,1.328,91,1.657,92,1.801,93,1.084,97,1.6,100,1.088,108,0.661,113,1.451,114,0.963,129,1.238,134,1.182,137,0.871,141,1.241,146,2.245,147,1.124,148,0.806,159,1.084,186,2.245,206,1.658,215,1.545,216,0.928,232,1.3,237,2.062,238,2.245,241,2.184,242,1.972,252,1.972,254,2.461,267,1.238,276,1.656,281,1.371,297,3.947,302,1.13,342,1.3,353,4.1,356,1.088,378,1.545,386,1.371,397,1.371,413,1.371,414,1.545,415,1.545,416,0.928,417,1.371,418,1.238,419,1.3,420,1.3,422,1.238,450,0.779,490,1.801,561,2.312,587,2.245,641,2.072,651,1.658,710,1.799,720,1.988,721,1.799,733,1.799,734,3.947,735,3.167,736,3.167,742,3.167,743,3.167,744,2.275,745,5.495,746,2.275,747,4.517,748,6.897,749,5.627,750,2.275,751,2.275,752,3.624,753,2.275,754,1.799,755,2.275,756,4.517,757,2.275,758,2.275,759,2.275,760,2.275,761,2.275,762,2.641,763,2.641,764,3.754,765,2.641,766,3.572,767,3.572,768,2.866,769,2.866,770,2.866,771,2.866,772,2.866,773,2.866,774,2.866,775,2.866,776,2.866,777,2.866,778,4.074,779,3.572,780,3.572,781,3.572,782,2.866,783,2.866,784,2.275,785,1.988,786,2.275,787,2.275,788,2.275,789,2.275,790,1.988,791,1.545,792,1.658,793,1.451,794,1.799,795,3.947,796,3.624,797,3.624,798,3.624,799,2.312,800,3.167,801,1.238,802,2.275,803,2.275,804,2.275,805,1.988,806,2.275,807,2.275,808,2.275,809,2.312,810,2.275,811,2.275,812,2.275,813,2.275,814,2.275,815,2.275]],["title/56",[3,0.22,32,1.044,87,0.973,150,1.804,233,1.168,507,1.6,816,1.518,817,2.321]],["content/56",[21,2.265,59,0.704,65,1.895,85,1.556,87,1.962,90,1.962,135,2.549,150,3.635,155,2.265,212,4.265,233,2.353,235,3.788,239,3.9,242,2.912,295,2.912,342,3.059,356,2.19,429,2.78,434,4.265,450,1.833,458,4.232,507,3.225,738,4.232,818,5.352,819,5.352,820,5.352,821,5.352,822,6.373,823,6.687,824,5.352,825,4.677,826,5.352,827,5.352,828,4.872,829,5.352,830,4.677,831,4.677,832,3.9,833,5.352,834,4.677]],["title/57",[457,5]],["content/57",[1,2.833,3,0.576,59,0.75,102,2.242,104,4.189,142,1.37,148,2.019,149,3.637,151,3.637,221,4.508,225,3.435,235,3.896,262,4.435,281,3.435,320,3.435,342,3.259,401,3.455,450,2.381,451,3.102,506,3.974,801,3.102,835,5.702,836,5.702,837,4.982,838,4.982,839,3.637,840,5.702,841,5.702]],["title/58",[189,3.135,235,2.235,506,2.459]],["content/58",[29,0.799,33,0.894,39,1.569,59,0.975,70,1.52,91,2.03,104,2.674,108,1.291,117,1.685,141,2.771,146,3.79,151,2.831,165,2.206,196,3.779,235,3.077,238,2.206,252,2.415,253,3.51,262,3.779,274,3.014,340,2.831,497,3.014,498,2.674,507,2.674,719,2.831,842,5.925,843,5.897,844,6.031,845,5.925,846,4.439,847,3.51,848,4.024,849,4.685,850,4.317,851,4.439,852,4.439,853,3.879,854,4.439,855,3.234,856,3.51,857,4.439]],["title/59",[208,2.808,849,3.884]],["content/59",[26,0.922,33,0.923,39,1.465,59,0.43,70,1.639,83,4.417,85,0.952,97,1.159,108,1.646,117,1.242,141,2.37,142,0.787,146,3.293,148,1.696,169,1.627,221,2.589,225,1.973,262,3.973,267,2.605,274,4.978,276,1.2,319,2.088,386,3.411,451,1.781,506,1.871,573,6.22,602,3.786,698,2.386,839,3.054,843,5.044,844,5.24,848,2.223,850,5.613,858,3.274,859,3.274,860,7.79,861,6.627,862,6.922,863,6.627,864,6.228,865,6.228,866,4.788,867,2.861,868,3.274,869,3.274,870,3.274,871,3.274,872,3.274,873,2.589,874,2.589,875,3.274,876,2.861,877,3.274,878,2.861,879,3.274]],["title/60",[2,3.579,839,3.133]],["content/60",[3,0.5,18,2.916,21,1.935,31,1.874,32,2.661,33,0.872,39,1.279,56,1.676,108,1.968,113,2.916,115,2.091,116,3.331,123,3.854,130,2.613,139,5.352,141,2.317,142,1.099,146,3.003,159,2.178,277,3.615,386,3.64,439,2.916,444,3.615,506,3.868,686,3.615,703,3.615,717,2.374,817,5.28,839,4.906,843,4.932,844,4.778,850,4.403,855,3.331,873,3.615,874,3.615,880,4.572,881,4.572,882,4.572,883,4.572,884,4.572,885,4.778,886,3.995,887,3.615,888,4.572,889,4.778,890,3.995,891,4.572,892,4.572,893,4.572,894,3.615,895,3.331,896,3.995,897,3.615]],["title/61",[3,0.356,885,3.402,898,3.402]],["content/61",[12,2.28,26,0.847,28,1.562,33,0.869,39,1.265,55,0.637,59,0.591,70,1.03,72,1.03,84,1.566,91,1.376,92,2.677,102,1.183,108,1.308,109,2.192,114,1.273,117,2.428,139,3.556,141,2.191,142,0.723,146,2.97,148,1.065,159,2.142,176,1.562,178,1.919,180,2.379,191,2.629,252,2.931,266,4.059,267,1.637,284,1.919,288,2.71,295,1.637,323,1.812,386,2.71,498,4.31,506,3.079,520,1.919,523,3.93,549,1.919,596,1.919,632,1.919,801,1.637,816,1.719,839,2.869,843,5.426,849,3.556,850,4.892,873,2.379,874,4.259,878,5.866,896,2.629,897,2.379,899,5.386,900,2.379,901,3.008,902,3.008,903,3.008,904,4.707,905,5.386,906,2.379,907,3.008,908,3.008,909,3.008,910,3.008,911,3.008,912,4.497,913,5.977,914,4.497,915,2.629,916,2.043,917,5.977,918,3.008,919,3.008,920,3.008,921,3.008,922,3.008,923,5.977,924,2.379,925,2.379,926,3.008,927,2.629,928,3.008,929,2.629,930,4.559,931,4.497,932,5.977,933,3.008,934,3.008,935,5.977,936,3.008,937,3.008,938,3.556,939,5.386,940,3.008,941,3.008,942,3.008,943,3.008,944,3.008,945,3.93,946,3.93,947,3.008,948,2.379,949,3.008,950,3.008,951,3.008,952,3.008,953,4.497,954,4.497,955,3.008,956,3.008]],["title/62",[235,2.551,816,2.808]],["content/62",[3,0.365,13,2.398,21,1.865,31,2.061,32,2.319,33,0.865,55,0.933,56,1.615,59,0.775,72,1.509,84,1.281,85,1.281,96,2.655,97,1.561,108,1.714,115,2.015,117,1.672,142,1.059,148,2.353,193,3.485,208,2.519,212,2.811,215,2.993,216,2.404,233,1.938,262,3.761,446,3.851,448,3.761,450,1.509,451,2.398,455,2.993,512,2.655,533,2.655,596,2.811,708,3.211,717,2.289,793,2.811,816,4.659,945,3.851,957,4.407,958,4.297,959,4.407,960,3.851,961,4.407,962,3.485,963,2.398,964,4.407,965,3.851,966,4.407,967,3.851,968,4.407,969,3.851,970,3.851,971,3.485,972,5.153,973,4.407,974,4.407,975,4.407,976,4.407,977,4.407,978,4.407,979,4.407,980,4.407,981,4.407,982,4.407,983,4.407,984,4.407,985,4.407,986,3.851]],["title/63",[97,1.019,212,1.835,216,1.173,233,1.265,450,0.985,451,1.565,986,2.513]],["content/63",[]],["title/64",[29,0.689,233,1.683,450,1.311,987,3.345]],["content/64",[12,1.124,26,0.748,29,0.281,31,1.652,33,0.931,39,1.238,44,0.478,53,0.534,56,0.572,59,0.656,65,0.553,72,1.187,80,2.339,82,1.982,84,0.454,96,1.6,97,0.553,100,1.599,102,1.044,104,4.455,108,1.938,112,1.801,131,1.168,147,1.075,148,0.553,159,1.651,169,2.646,186,1.32,204,1.6,219,1.364,233,3.104,235,2.383,237,1.271,252,1.445,257,0.553,274,2.779,281,0.94,294,2.28,302,1.723,315,1.524,320,1.6,322,0.892,342,0.892,347,1.06,356,1.377,386,3.855,389,1.364,397,0.94,413,0.94,414,1.06,415,1.06,416,0.636,417,0.94,418,0.849,419,0.892,420,0.892,421,1.445,429,0.811,450,0.534,451,0.849,472,0.94,490,0.775,498,2.089,506,4.359,517,3.575,518,4.654,519,6.096,520,4.39,599,2.089,666,1.137,686,2.741,718,1.234,816,0.892,828,1.137,839,2.61,848,1.06,886,2.321,887,1.234,889,4.624,895,1.935,948,2.741,958,1.935,963,0.849,969,2.321,970,2.321,971,2.1,972,2.321,987,4.362,988,4.092,989,6.238,990,1.561,991,4.588,992,6.056,993,4.588,994,4.588,995,1.561,996,3.467,997,3.467,998,1.561,999,2.656,1000,1.561,1001,1.561,1002,1.561,1003,1.561,1004,1.561,1005,1.06,1006,2.321,1007,1.561,1008,1.561,1009,1.561,1010,1.561,1011,1.561,1012,1.561,1013,1.561,1014,1.561,1015,3.467,1016,3.467,1017,1.561,1018,3.467,1019,3.03,1020,1.561,1021,0.995,1022,0.94,1023,1.234,1024,1.364,1025,2.656,1026,4.588,1027,4.588,1028,2.656,1029,1.561,1030,1.561,1031,1.561,1032,1.561,1033,1.561,1034,1.561,1035,1.561,1036,3.467,1037,4.991,1038,3.467,1039,3.03,1040,3.467,1041,3.467,1042,3.467,1043,3.467,1044,1.694,1045,1.561,1046,2.656,1047,1.561,1048,1.561,1049,1.561,1050,1.234,1051,1.561,1052,1.561,1053,1.364,1054,1.561]],["title/28",[3,0.22,59,0.349,87,0.973,513,1.215,832,1.935,1055,1.935,1056,1.518,1057,2.1]],["content/28",[23,1.871,24,3.403,55,1.196,84,1.642,96,3.403,318,3.229,429,2.934,434,3.603,448,4.41,496,4.467,505,4.116,513,2.583,533,3.403,719,3.603,838,4.936,1057,5.467,1058,3.603,1059,3.836,1060,2.934,1061,5.649,1062,5.649,1063,5.649,1064,5.649,1065,4.467,1066,5.649,1067,4.936,1068,4.936,1069,5.649,1070,5.649,1071,5.649,1072,5.649,1073,5.649,1074,5.649,1075,5.649,1076,5.649,1077,5.649]],["title/29",[1078,5]],["content/29",[23,1.82,24,3.312,25,3.312,28,2.855,44,0.989,51,2.108,65,1.947,87,2.015,96,4.096,151,4.336,155,2.326,322,3.142,364,4.346,401,3.378,428,4.803,448,4.336,465,4.803,513,2.514,533,4.096,717,2.855,832,4.954,885,4.346,924,4.346,1055,4.005,1056,3.142,1060,3.531,1079,5.497,1080,5.497,1081,5.497,1082,4.346,1083,5.497,1084,4.803,1085,5.497,1086,5.497,1087,4.346,1088,5.497]],["title/30",[96,2.959,533,2.959]],["content/30",[]],["title/31",[64,1.968,98,2.745,488,2.922]],["content/31",[19,4.254,29,1.051,33,0.631,59,0.768,98,4.834,134,3.032,188,3.517,401,2.901,439,3.724,448,3.724,464,3.724,487,4.616,488,5.346,717,3.032,1060,3.032,1089,5.838,1090,5.838,1091,5.101,1092,3.964,1093,3.964,1094,4.616,1095,4.616,1096,5.139,1097,5.101,1098,5.838]],["title/32",[511,4.525]],["content/32",[3,0.568,23,2.109,29,1.234,31,1.258,32,1.595,33,0.897,37,2.107,39,1.18,44,1.294,46,1.258,49,3.033,51,1.258,53,1.389,54,2.016,55,0.859,56,1.487,58,1.717,59,0.533,64,2.549,85,1.179,100,1.674,114,2.359,137,0.975,142,0.975,169,2.77,216,1.654,237,1.487,257,2.255,276,1.487,287,3.186,356,1.218,425,2.955,445,2.955,450,1.389,486,2.318,488,2.754,501,2.444,509,2.955,510,2.587,513,2.912,529,2.955,607,3.64,632,2.587,799,2.587,930,2.754,1093,2.754,1099,3.033,1100,3.207,1101,2.955,1102,2.955,1103,2.754,1104,2.955,1105,3.207,1106,3.785,1107,3.207,1108,2.754,1109,2.754,1110,2.754,1111,4.325,1112,2.754,1113,4.062,1114,4.062,1115,2.955,1116,2.955,1117,2.955,1118,2.444,1119,2.955,1120,2.955,1121,2.754,1122,4.056,1123,4.056,1124,2.955,1125,3.544,1126,3.544,1127,2.955,1128,2.754,1129,3.544]],["title/33",[23,1.268,257,1.356,1056,2.188,1059,2.6]],["content/33",[0,1.293,3,0.516,10,2.229,13,2.335,19,2.06,23,0.936,24,1.703,29,0.509,31,1.932,32,2.04,33,0.892,37,1.468,39,0.909,44,1.18,46,0.877,49,2.823,51,1.797,53,1.47,54,1.405,57,2.335,59,0.564,62,2.06,64,1.293,70,1.47,72,1.776,90,1.036,100,1.289,102,2.04,112,1.468,114,1.816,115,1.293,123,1.803,135,2.045,137,1.032,142,1.032,149,1.803,151,1.803,152,2.471,169,3.386,189,2.06,201,1.468,204,1.703,216,2.116,237,1.036,257,1.837,276,1.036,287,2.453,323,1.703,342,1.616,356,0.849,378,1.92,397,1.703,429,1.468,486,1.616,488,1.92,490,1.405,501,1.703,502,1.92,509,3.128,513,2.373,529,2.06,607,2.966,632,1.803,794,2.236,799,1.803,915,2.471,924,2.236,930,1.92,1056,4.013,1059,1.92,1060,2.229,1092,1.92,1093,2.915,1099,3.568,1100,2.236,1101,2.06,1102,2.06,1103,1.92,1104,2.06,1105,2.236,1106,1.92,1107,2.236,1108,1.92,1109,1.92,1110,1.92,1111,3.523,1112,1.92,1113,3.128,1114,3.128,1115,2.06,1116,2.06,1117,2.06,1118,1.703,1119,2.06,1120,2.06,1121,1.92,1124,2.06,1127,2.06,1128,1.92,1130,2.827,1131,2.471,1132,5.188,1133,2.827,1134,2.471,1135,2.827,1136,4.292,1137,2.827,1138,2.471,1139,2.827,1140,2.827,1141,2.827,1142,2.827,1143,3.751,1144,2.471,1145,2.06,1146,2.827,1147,4.292,1148,2.827,1149,2.827,1150,4.292,1151,2.827,1152,4.103,1153,4.292,1154,2.827,1155,2.827,1156,2.827,1157,3.781,1158,2.827,1159,2.827,1160,4.292,1161,2.827,1162,2.471,1163,2.06,1164,3.128,1165,2.827,1166,4.292,1167,2.471,1168,2.471,1169,2.827,1170,2.827,1171,2.827,1172,2.827,1173,2.827,1174,2.827]],["title/34",[0,2.246,1060,2.551]],["content/34",[]],["title/35",[23,1.039,29,0.564,153,1.558,511,2.48,963,1.706,1023,2.48]],["content/35",[3,0.432,23,2.005,24,2.223,29,1.089,33,0.929,39,1.281,46,1.144,49,2.007,51,1.618,59,0.485,64,1.687,73,1.306,85,1.073,87,1.352,93,1.757,98,3.861,100,1.817,116,2.688,134,2.71,142,1.254,165,1.833,225,2.223,237,1.912,257,1.306,276,1.352,296,2.294,323,2.223,356,1.108,460,2.839,510,3.328,512,2.223,587,3.008,599,3.143,607,3.46,609,3.647,610,4.111,613,2.688,617,2.688,640,2.688,714,2.917,731,3.223,831,4.559,916,2.505,963,2.007,1058,2.353,1060,2.71,1092,3.543,1099,2.007,1101,2.688,1102,2.688,1103,2.505,1104,2.688,1118,2.223,1175,2.917,1176,2.917,1177,4.638,1178,3.223,1179,4.559,1180,4.559,1181,2.688,1182,3.223,1183,3.223,1184,3.223,1185,3.223,1186,3.223,1187,3.223,1188,3.223,1189,2.917,1190,3.223,1191,3.223,1192,3.223,1193,3.223,1194,2.688,1195,3.223,1196,3.689,1197,3.689]],["title/36",[25,2.592,51,1.334,1058,2.745]],["content/36",[]],["title/37",[51,1.069,257,1.221,916,2.341,1056,1.971,1177,2.077]],["content/37",[9,1.205,12,0.846,13,1.088,28,1.696,29,0.745,31,1.284,32,0.786,33,0.923,39,0.691,40,1.143,44,0.745,49,2.601,51,2.053,56,0.733,59,0.544,70,1.417,72,1.935,85,0.581,89,1.358,90,0.733,91,1.494,94,1.457,100,0.981,102,0.786,103,1.457,108,1.204,112,2.936,114,0.846,115,0.914,117,1.239,134,1.696,137,0.785,142,1.359,147,0.62,153,0.994,164,0.952,166,1.457,201,1.039,204,3.406,216,1.949,237,1.197,257,1.466,276,1.197,289,0.994,294,1.623,296,2.485,302,1.623,315,0.879,320,1.205,356,1.435,367,1.747,396,1.581,429,1.039,450,0.685,460,1.088,478,1.143,486,1.143,539,1.581,543,2.38,549,2.083,599,3.174,612,1.581,632,1.275,640,1.457,641,2.366,643,1.457,717,1.039,745,1.747,805,1.747,856,1.581,916,2.218,930,1.358,963,1.777,965,1.747,1021,2.083,1022,1.205,1044,1.275,1056,3.231,1058,1.275,1059,1.358,1060,1.039,1092,2.218,1095,2.583,1099,1.777,1108,2.218,1109,1.358,1110,1.358,1111,2.811,1112,1.358,1113,2.38,1114,2.38,1115,1.457,1116,1.457,1117,1.457,1118,1.968,1119,1.457,1120,1.457,1121,5.027,1143,1.747,1152,1.581,1157,1.457,1162,1.747,1163,1.457,1175,1.581,1177,4.362,1198,2,1199,1.581,1200,2.854,1201,2.854,1202,2.854,1203,2.854,1204,2.854,1205,2.854,1206,2.854,1207,2.854,1208,2.854,1209,2.854,1210,5.09,1211,2,1212,4.47,1213,3.779,1214,3.779,1215,3.779,1216,2.583,1217,3.779,1218,2.583,1219,2.583,1220,3.779,1221,2.583,1222,2.583,1223,2.583,1224,3.779,1225,2.583,1226,2.583,1227,2.583,1228,1.747,1229,1.747,1230,1.747,1231,1.747,1232,1.747,1233,1.747,1234,1.581,1235,2,1236,2,1237,2,1238,2,1239,1.747,1240,2,1241,2,1242,3.266,1243,1.457,1244,1.747,1245,2,1246,2,1247,1.747,1248,2,1249,1.747,1250,1.747,1251,2,1252,1.581,1253,3.779,1254,2.583,1255,1.747,1256,1.581,1257,2,1258,1.747,1259,1.747,1260,2,1261,2.854,1262,1.747,1263,2,1264,2.583,1265,2,1266,1.581,1267,1.747]],["title/38",[25,2.077,142,0.829,963,1.876,1058,2.199,1268,2.726]],["content/38",[3,0.346,10,1.717,12,0.859,15,1.104,23,1.095,24,1.223,25,2.52,27,1.294,29,0.595,31,1.297,32,1.896,33,0.923,39,1.205,44,0.365,46,0.629,49,1.799,51,1.646,53,1.132,54,1.008,55,0.43,56,0.744,59,0.748,64,1.512,70,0.695,72,1.132,74,1.294,83,1.223,84,0.961,85,0.961,91,0.928,100,0.993,102,1.645,108,0.59,114,1.399,117,0.77,129,1.104,134,1.054,137,1.276,142,0.794,149,1.294,153,2.078,164,1.575,165,1.008,166,1.479,169,1.643,176,2.505,189,3.514,201,1.054,204,2.52,205,1.773,225,1.223,237,1.533,255,1.479,257,1.708,271,1.773,276,1.212,287,1.89,289,1.008,294,1.643,302,1.008,315,0.892,319,3.076,331,1.717,347,1.378,355,1.773,356,1.802,433,1.605,458,1.605,460,1.104,486,2.391,489,1.992,490,1.008,501,1.223,502,2.84,507,1.223,543,1.479,549,2.109,607,1.16,609,1.223,610,1.378,630,1.605,666,2.409,717,1.717,799,1.294,801,1.104,816,1.89,828,1.479,958,2.409,963,1.104,1022,1.223,1055,1.479,1056,3.254,1058,2.668,1087,4.501,1093,2.245,1099,1.799,1103,1.378,1108,1.378,1109,1.378,1110,1.378,1111,2.84,1112,1.378,1118,1.223,1121,1.378,1124,1.479,1127,3.514,1128,1.378,1131,1.773,1134,2.889,1157,2.409,1163,1.479,1164,1.479,1167,1.773,1177,1.992,1210,2.614,1212,2.614,1213,2.614,1214,2.614,1215,2.614,1216,1.605,1217,2.614,1218,1.605,1219,1.605,1220,3.307,1221,1.605,1222,1.605,1223,1.605,1224,2.614,1225,1.605,1226,1.605,1227,1.605,1243,1.479,1244,1.773,1252,1.605,1253,2.614,1254,1.605,1255,4.214,1256,1.605,1259,1.773,1264,1.605,1266,2.614,1267,1.773,1268,3.307,1269,1.773,1270,1.773,1271,1.773,1272,1.773,1273,1.773,1274,1.773,1275,1.773,1276,2.029,1277,2.029,1278,2.029,1279,1.773,1280,2.029,1281,2.029,1282,2.029,1283,2.614,1284,2.029,1285,1.605,1286,2.029,1287,2.029,1288,2.889,1289,4.183,1290,4.214,1291,2.029,1292,1.773,1293,1.773,1294,2.889,1295,1.773,1296,1.773,1297,1.773,1298,1.773,1299,1.773,1300,1.773,1301,1.773,1302,2.029,1303,2.84,1304,2.029,1305,3.306,1306,2.029,1307,2.029,1308,2.029,1309,3.306,1310,2.029,1311,3.306,1312,2.029,1313,2.029,1314,3.306,1315,3.306,1316,4.183,1317,2.029,1318,2.029,1319,2.029,1320,2.029,1321,2.029,1322,3.306,1323,2.029,1324,2.029,1325,2.029,1326,2.029,1327,2.029,1328,2.029,1329,2.029,1330,2.029,1331,2.029,1332,2.029,1333,2.029,1334,2.029,1335,2.029,1336,1.479]],["title/39",[472,2.959,1044,3.133]],["content/39",[]],["title/40",[1118,3.496,1337,4.303]],["content/40",[3,0.415,9,0.948,12,0.666,21,1.476,23,0.521,28,1.388,31,1.658,32,1.051,33,0.934,37,0.817,39,1.388,44,0.829,46,1.081,49,2.508,51,2.072,53,1.408,54,1.328,55,0.738,59,0.351,64,1.595,65,0.557,72,1.194,73,0.557,84,0.457,85,0.457,87,0.576,90,0.576,91,1.595,93,0.749,98,1.705,100,1.235,102,0.618,108,0.457,112,1.811,113,1.003,114,1.131,115,0.719,116,1.146,117,0.597,125,1.068,134,1.811,137,0.838,141,0.538,142,1.108,143,0.948,148,0.557,164,0.749,165,0.781,166,1.948,169,1.328,204,2.478,216,0.641,237,1.689,270,1.146,276,1.278,278,1.146,287,1.528,289,0.781,295,0.856,296,2.35,302,0.781,315,0.691,323,0.948,331,1.388,356,0.803,390,1.374,416,0.641,422,0.856,452,1.146,464,1.003,486,2.865,489,0.948,490,0.781,501,0.948,512,0.948,513,1.595,529,1.146,543,1.146,549,1.705,587,1.328,594,1.374,607,2.634,609,2.478,610,2.793,613,1.146,617,1.146,630,1.244,632,1.003,651,1.146,714,1.244,793,1.003,799,1.003,801,1.455,816,0.899,894,2.114,916,1.068,929,2.336,930,1.068,958,1.146,1021,1.003,1056,2.865,1057,1.244,1059,1.068,1060,1.811,1067,1.374,1087,1.244,1092,1.068,1093,1.068,1095,1.244,1096,1.146,1099,2.238,1100,1.244,1101,1.146,1102,1.146,1103,1.068,1104,1.146,1105,1.244,1106,1.068,1107,1.244,1108,1.815,1109,1.815,1110,1.815,1111,2.793,1112,1.068,1113,2.541,1114,1.948,1115,1.146,1116,1.146,1117,1.146,1118,2.777,1119,1.146,1120,1.948,1121,3.984,1124,1.146,1127,1.146,1128,1.068,1138,1.374,1152,1.244,1157,2.541,1163,1.146,1177,4.262,1178,1.374,1179,2.336,1180,2.336,1181,1.146,1182,1.374,1183,3.047,1184,1.374,1185,1.374,1186,1.374,1187,1.374,1188,1.374,1189,1.244,1190,1.374,1191,1.374,1192,1.374,1193,1.374,1194,1.146,1200,1.374,1201,1.374,1202,1.374,1203,1.374,1204,1.374,1205,1.374,1206,1.374,1207,1.374,1208,1.374,1209,1.374,1210,3.252,1212,2.757,1213,2.114,1214,2.114,1215,2.114,1216,1.244,1217,2.114,1218,1.244,1219,1.244,1220,2.114,1221,1.244,1222,1.244,1223,1.244,1224,2.114,1225,1.244,1226,1.244,1227,1.244,1228,1.374,1229,1.374,1230,1.374,1231,1.374,1232,1.374,1233,1.374,1243,1.146,1249,1.374,1253,3.252,1254,2.757,1258,3.047,1261,2.336,1262,1.374,1264,1.244,1266,2.114,1268,2.114,1269,1.374,1270,1.374,1271,1.374,1272,1.374,1273,1.374,1274,1.374,1275,1.374,1283,2.114,1288,1.374,1290,2.336,1292,2.336,1293,1.374,1294,2.336,1295,1.374,1296,1.374,1297,1.374,1298,1.374,1299,1.374,1300,1.374,1301,1.374,1303,1.815,1338,1.573,1339,1.573,1340,2.673,1341,4.112,1342,2.673,1343,2.673,1344,2.673,1345,1.573,1346,1.573,1347,1.573,1348,1.573,1349,1.573,1350,1.573,1351,1.573,1352,1.573,1353,1.573,1354,1.573,1355,1.573,1356,1.573,1357,1.244,1358,1.573]],["title/41",[1044,3.133,1359,4.912]],["content/41",[65,2.323,295,3.568,413,3.951,416,2.674,418,3.568,513,2.999,1055,4.779,1360,5.186]],["title/78",[55,0.73,135,2.368,296,1.516,723,2.512]],["content/78",[3,0.47,10,2.948,18,3.62,26,1.598,55,1.65,57,3.088,59,0.746,65,2.01,85,1.65,97,2.01,123,3.62,135,3.566,137,1.799,153,2.82,155,2.402,322,3.963,356,1.704,439,3.62,459,4.135,496,4.488,703,4.488,717,3.601,733,4.488,792,4.135,1022,3.419,1361,5.675,1362,5.675,1363,5.675]],["title/79",[55,1.04,1364,4.912]],["content/79",[3,0.523,10,3.283,46,1.96,68,3.613,72,2.164,73,2.238,90,2.317,137,1.777,153,3.674,478,3.613,900,4.998,1365,6.321,1366,4.998]],["title/80",[68,2.459,137,1.034,159,2.05]],["content/80",[3,0.441,33,0.912,39,1.412,44,1.2,46,1.653,53,1.825,55,1.412,59,0.701,70,1.825,72,1.825,73,1.887,97,1.887,108,1.549,137,1.603,141,1.825,142,1.281,147,1.653,153,2.648,186,2.648,224,3.211,241,3.211,296,2.343,399,3.046,732,4.214,809,3.399,1366,5.755,1367,4.529,1368,3.619,1369,3.883,1370,5.329,1371,3.619,1372,5.273]],["title/81",[26,1.383,237,1.8]],["content/81",[3,0.351,33,0.923,39,1.478,44,1.034,46,1.781,53,1.451,55,1.593,70,1.451,72,1.451,73,1.501,85,1.232,90,1.554,100,1.956,108,1.232,109,4.186,117,1.609,118,3.089,119,3.352,137,1.679,141,1.451,142,1.019,146,2.106,147,1.315,237,1.554,241,2.554,315,1.864,399,2.423,455,2.879,490,2.106,587,2.106,654,3.664,732,3.352,739,4.186,741,3.089,762,3.089,763,3.089,764,3.089,765,3.089,785,3.704,791,2.879,809,2.704,855,3.089,876,3.704,900,3.352,925,5.152,948,3.352,1021,2.704,1367,3.901,1368,2.879,1369,3.089,1371,2.879,1373,3.352,1374,4.186,1375,4.542,1376,4.542,1377,3.352,1378,3.704,1379,3.704,1380,4.239,1381,4.239,1382,3.352,1383,4.239]],["title/82",[26,1.383,302,2.441]],["content/82",[3,0.373,26,1.268,29,0.811,33,0.905,39,1.515,44,1.077,46,1.856,53,1.542,55,1.515,56,1.651,59,0.592,73,1.595,84,1.31,85,1.74,93,2.85,100,1.796,108,1.31,137,1.72,141,1.542,142,1.083,147,1.397,153,2.238,164,2.146,208,2.575,241,2.714,315,1.98,322,3.42,399,2.575,739,4.36,741,3.282,792,3.282,809,2.873,837,3.936,847,3.562,925,5.312,1247,3.936,1367,4.063,1368,3.059,1369,3.282,1371,3.059,1372,4.731,1373,3.562,1374,4.36,1376,3.562,1377,3.562,1378,3.936,1379,3.936,1382,3.562,1384,4.504,1385,6.718,1386,3.562,1387,3.936,1388,4.504,1389,4.504,1390,4.504,1391,4.504]],["title/83",[26,1.383,186,2.441]],["content/83",[3,0.287,33,0.919,39,1.238,44,0.899,46,1.076,53,1.188,55,1.238,56,1.271,59,0.456,71,2.213,72,1.71,73,1.768,85,1.009,91,1.586,100,1.921,108,1.009,113,2.213,117,1.317,118,4.663,135,2.379,137,0.834,141,2.003,142,1.538,146,1.724,147,1.076,159,1.652,186,1.724,206,2.528,237,1.271,241,2.09,252,1.888,281,2.09,315,2.195,340,2.213,342,1.983,356,1.042,377,2.528,399,1.983,421,1.888,429,1.802,439,2.213,489,2.09,490,1.724,520,2.213,561,2.213,587,1.724,602,3.948,654,2.213,741,2.528,762,2.528,763,2.528,764,2.528,765,2.528,766,2.743,767,2.743,768,2.743,769,2.743,770,2.743,771,2.743,772,2.743,773,2.743,774,2.743,775,2.743,776,2.743,777,2.743,778,2.743,779,2.743,780,2.743,781,2.743,782,2.743,783,2.743,801,2.717,809,2.213,894,2.743,904,3.031,1367,3.391,1368,2.356,1369,2.528,1371,2.356,1372,3.948,1373,3.948,1374,3.639,1375,2.743,1376,5.755,1377,4.626,1392,3.469,1393,3.469,1394,4.993,1395,3.469,1396,3.469,1397,3.469,1398,3.469,1399,3.469,1400,3.469,1401,3.031,1402,3.469,1403,3.469,1404,3.469,1405,3.469,1406,3.469,1407,3.469,1408,3.469,1409,3.469,1410,3.469,1411,3.469,1412,3.031,1413,3.469,1414,2.528]],["title/84",[73,1.356,159,1.823,450,1.311,1414,2.789]],["content/84",[5,1.918,28,2.111,29,0.731,33,0.936,39,1.349,46,1.871,55,1.277,59,0.653,65,0.932,71,1.679,72,2.577,73,2.494,74,1.679,80,1.505,84,1.182,85,0.765,97,0.932,100,1.22,108,1.443,117,0.999,125,1.788,135,2.659,137,0.977,148,0.932,149,1.679,153,1.308,160,4.337,176,2.578,178,3.56,237,1.819,238,2.019,252,3.469,253,2.082,267,3.037,276,1.489,282,2.76,284,1.679,288,3.634,289,1.308,294,2.467,318,1.505,320,4.135,340,1.679,377,1.918,381,3.551,399,1.505,440,2.3,451,1.432,455,1.788,459,1.918,512,1.586,521,3.551,596,1.679,654,3.166,739,1.918,791,1.788,938,2.082,962,2.082,1195,2.3,1234,2.082,1366,2.082,1374,2.961,1375,2.082,1386,2.082,1401,6.494,1414,4.067,1415,4.064,1416,4.964,1417,2.632,1418,2.632,1419,2.632,1420,2.632,1421,2.632,1422,2.632,1423,2.3,1424,2.632,1425,2.632,1426,6.375,1427,3.617,1428,2.632,1429,4.964,1430,2.632,1431,2.632,1432,2.632,1433,2.632,1434,2.632,1435,2.632,1436,2.3,1437,2.632,1438,2.632,1439,2.3,1440,2.082,1441,2.632,1442,2.632,1443,2.3,1444,2.632]],["title/85",[26,1.212,356,1.292,1044,2.745]],["content/85",[3,0.501,21,1.561,26,1.469,31,1.877,33,0.92,39,1.281,44,0.939,46,2.041,53,1.263,55,1.393,65,1.306,73,1.306,80,2.108,85,1.073,108,1.073,119,4.786,126,2.353,135,3.307,137,0.887,141,1.786,142,0.887,146,1.833,147,1.144,148,1.306,159,1.757,186,1.833,201,1.916,216,2.127,237,1.352,241,2.223,252,2.007,305,2.353,307,3.223,322,2.108,378,2.505,396,2.917,397,3.143,399,2.982,413,2.223,414,2.505,415,2.505,416,1.504,417,2.223,418,2.007,419,2.108,420,2.108,421,2.007,422,2.007,423,2.505,462,2.917,490,1.833,561,2.353,587,1.833,649,2.917,762,2.688,763,2.688,764,2.688,765,2.688,766,2.917,767,2.917,768,2.917,769,2.917,770,2.917,771,2.917,772,2.917,773,2.917,774,2.917,775,2.917,776,2.917,777,2.917,778,2.917,779,2.917,780,2.917,781,2.917,782,2.917,783,2.917,795,3.223,809,2.353,898,4.125,963,2.007,1367,3.543,1368,2.505,1371,2.505,1423,3.223,1427,4.411,1436,3.223,1445,3.689,1446,3.689,1447,3.689,1448,3.689,1449,3.223,1450,3.689,1451,3.689,1452,3.689,1453,3.689,1454,3.689]],["title/48",[3,0.286,29,0.62,425,2.512,1125,3.013,1126,3.013]],["content/48",[]],["title/49",[2,4.169]],["content/49",[0,1.588,1,1.322,3,0.288,10,0.445,12,0.662,13,1.448,15,2.814,18,0.547,19,0.625,20,0.749,21,0.363,22,0.749,23,2.094,29,0.625,31,1.849,32,0.615,33,0.931,34,2.96,37,3.04,38,2.358,39,1.597,40,2.491,41,5.378,44,0.986,45,2.704,46,1.271,47,3.951,48,5.658,49,3.523,51,0.669,55,0.331,56,0.314,57,0.851,59,0.573,65,0.304,66,1.366,68,1.521,69,1.705,70,1.403,71,1.697,72,1.403,73,0.304,78,2.104,79,2.101,82,2.491,84,0.249,85,0.627,87,0.314,90,0.314,97,1.096,100,0.47,108,1.106,112,1.607,115,1.415,131,2.621,132,0.445,134,0.445,137,0.744,141,2.041,142,1.316,143,0.516,146,0.777,147,0.266,148,0.554,150,0.582,155,0.363,159,0.408,164,1.474,165,0.426,208,1.233,215,0.582,224,0.516,233,1.17,257,0.304,262,1.974,276,0.975,278,2.255,281,0.516,289,0.426,294,0.777,295,0.466,296,0.377,303,1.705,305,3.494,315,0.377,316,0.749,317,0.749,318,0.49,320,0.516,322,0.49,323,0.516,340,1.697,342,0.894,353,5.053,354,0.749,356,1.043,372,1.884,398,0.678,399,0.49,416,0.638,417,0.516,418,0.466,419,0.49,420,0.49,421,3.243,425,0.625,426,0.678,429,0.812,433,0.678,434,1.697,445,0.625,448,0.997,450,0.293,460,3.72,472,0.516,479,0.749,484,1.366,505,1.139,507,0.516,510,0.547,512,0.516,533,0.516,587,1.538,596,0.547,598,1.807,599,2.895,607,2.174,654,1.375,717,0.812,718,0.678,719,0.547,721,0.678,754,1.705,790,0.749,791,0.582,793,0.547,794,0.678,799,0.547,800,0.749,828,0.625,847,0.678,848,0.582,853,0.749,855,0.625,856,0.678,867,1.366,889,1.237,890,1.884,938,0.678,960,0.749,962,0.678,963,1.173,1022,0.516,1023,0.678,1024,0.749,1044,0.997,1050,0.678,1065,0.678,1091,1.366,1164,0.625,1175,1.705,1176,0.678,1189,3.008,1199,0.678,1234,0.678,1239,4.014,1256,0.678,1283,0.678,1285,0.678,1439,1.884,1440,0.678,1455,0.857,1456,0.857,1457,0.857,1458,0.678,1459,4.593,1460,0.857,1461,0.857,1462,1.564,1463,2.156,1464,1.564,1465,3.472,1466,0.857,1467,0.857,1468,0.857,1469,0.857,1470,2.66,1471,1.564,1472,1.564,1473,2.156,1474,0.857,1475,2.156,1476,2.66,1477,4.097,1478,2.66,1479,2.66,1480,0.857,1481,0.857,1482,0.857,1483,2.156,1484,2.156,1485,2.156,1486,1.564,1487,0.857,1488,0.857,1489,0.857,1490,0.857,1491,0.857,1492,0.857,1493,6.155,1494,2.66,1495,4.805,1496,0.857,1497,2.66,1498,0.857,1499,0.857,1500,0.857,1501,3.094,1502,2.156,1503,2.156,1504,2.156,1505,1.564,1506,1.564,1507,1.564,1508,1.564,1509,2.156,1510,2.156,1511,4.097,1512,0.857,1513,3.094,1514,2.156,1515,2.156,1516,2.156,1517,0.857,1518,0.749,1519,1.564,1520,0.857,1521,0.857,1522,0.857,1523,0.857,1524,1.564,1525,2.156,1526,0.857,1527,0.857,1528,2.156,1529,0.857,1530,0.857,1531,0.857,1532,0.857,1533,0.857,1534,0.857,1535,0.857,1536,0.857,1537,0.749,1538,1.564,1539,0.857,1540,0.857,1541,0.857,1542,0.857,1543,0.857,1544,1.564,1545,0.749,1546,0.857,1547,0.857,1548,0.857,1549,0.857,1550,0.857,1551,0.857]],["title/50",[21,1.62,26,1.078,421,2.083,422,2.083]],["content/50",[126,4.322,423,4.602]],["title/67",[3,0.22,33,0.287,44,0.478,447,1.935,513,1.215,1552,1.445,1553,2.1,1554,2.656]],["content/67",[]],["title/68",[1078,5]],["content/68",[3,0.464,6,3.229,8,3.229,21,2.705,28,2.121,53,1.398,55,1.525,58,1.728,59,0.537,62,2.975,64,1.867,65,1.446,70,1.398,84,1.999,87,1.496,100,1.226,131,1.795,155,1.728,188,2.46,204,3.374,208,2.334,224,2.46,225,2.46,282,2.773,295,3.047,315,1.795,340,2.604,356,1.681,412,3.568,429,2.121,434,2.604,442,3.568,444,5.437,445,2.975,447,4.657,459,2.975,462,3.229,463,4.08,489,2.46,505,2.975,508,3.568,513,2.561,524,3.568,719,2.604,754,3.229,822,3.568,887,3.229,895,2.975,906,3.229,1022,2.46,1068,3.568,1129,3.568,1176,3.229,1181,2.975,1279,4.893,1336,2.975,1458,3.229,1552,2.222,1553,4.428,1555,4.083,1556,6.876,1557,4.083,1558,4.083,1559,4.083,1560,5.599,1561,4.083,1562,4.083,1563,4.083,1564,3.568,1565,4.083,1566,4.083,1567,4.083,1568,4.083,1569,4.083,1570,4.083,1571,3.568,1572,4.083,1573,4.083,1574,4.083,1575,4.083,1576,3.568,1577,4.083,1578,4.083,1579,4.083,1580,4.083,1581,4.083,1582,4.083,1583,4.083,1584,3.568,1585,4.083,1586,4.893,1587,3.568,1588,4.083,1589,4.083]],["title/69",[3,0.286,28,1.791,29,0.62,237,1.264,1590,3.013]],["content/69",[3,0.447,6,4.27,13,2.938,21,2.285,26,1.52,27,3.444,29,1.21,44,1.21,51,2.271,53,2.302,54,2.683,55,1.143,65,2.381,68,3.086,70,1.849,85,1.57,90,1.979,114,2.285,142,1.298,159,2.572,270,4.899,289,2.683,331,2.804,450,1.849,464,3.444,513,2.469,708,3.934,801,2.938,1060,2.804,1096,4.899,1097,4.718,1099,2.938,1106,3.667,1303,3.667,1360,4.27,1586,4.718,1590,4.718,1591,4.718,1592,6.723]],["title/70",[29,0.774,302,2.138,1593,2.922]],["content/70",[0,3.183,1,2.407,21,2.05,29,0.872,33,0.753,44,1.373,51,1.946,57,2.635,58,2.05,70,1.658,85,1.408,87,2.3,97,2.222,113,3.089,114,2.05,147,1.946,155,2.05,165,3.118,188,2.918,216,1.975,232,2.768,242,2.635,257,1.715,276,1.775,287,2.768,288,2.918,289,2.407,320,2.918,380,3.83,408,4.232,429,3.259,472,2.918,478,2.768,501,3.781,1005,3.289,1094,3.83,1194,3.529,1412,4.232,1552,4.006,1593,5,1594,4.843,1595,4.232,1596,6.275,1597,5.483,1598,5.483,1599,4.843,1600,3.83,1601,6.275,1602,4.843]],["title/71",[3,0.286,59,0.453,186,1.713,401,1.713,1552,1.876]],["content/71",[3,0.642,12,1.849,25,1.744,33,0.846,44,1.428,51,1.632,53,1.496,54,2.171,55,0.613,58,2.227,59,0.771,70,1.802,84,0.841,87,2.149,90,1.601,97,1.547,125,1.965,131,1.273,137,1.05,147,1.355,155,1.225,165,1.438,169,2.171,201,3.045,208,1.654,216,1.18,234,2.289,240,2.289,257,2.076,276,1.061,282,1.965,288,2.632,289,2.615,305,2.787,315,1.273,341,2.529,378,1.965,380,2.289,401,2.171,434,1.846,463,2.109,486,1.654,489,1.744,490,2.615,500,4.161,502,2.967,641,4.042,717,1.503,834,2.529,906,5.232,1006,2.529,1019,2.529,1082,2.289,1145,3.183,1168,2.529,1194,2.109,1336,2.109,1357,3.455,1552,3.847,1564,2.529,1576,2.529,1593,3.981,1595,5.499,1597,4.599,1598,2.529,1600,2.289,1603,4.636,1604,2.894,1605,2.894,1606,2.894,1607,5.232,1608,2.894,1609,2.894,1610,2.894,1611,5.263,1612,2.894,1613,2.894,1614,2.894,1615,2.894,1616,2.894,1617,2.894,1618,2.894,1619,2.894,1620,2.529,1621,2.894,1622,5.123,1623,2.894,1624,2.894,1625,3.183,1626,3.183,1627,3.183,1628,3.455,1629,3.818,1630,4.599,1631,2.894,1632,5.862,1633,2.894,1634,2.894,1635,2.894,1636,2.289,1637,2.289,1638,2.289,1639,2.289,1640,4.369,1641,2.109,1642,2.894,1643,2.894,1644,2.894,1645,4.369,1646,2.894]],["title/72",[44,0.689,51,1.187,376,2.789,1177,2.306]],["content/72",[3,0.49,13,2.407,23,1.465,27,1.877,33,0.849,37,3.071,44,1.441,51,2.363,53,1.82,54,1.462,55,0.623,56,1.621,57,1.601,58,2.682,59,0.699,68,1.682,70,1.82,87,2.323,89,3.004,90,1.621,97,1.042,137,1.523,147,1.649,155,1.245,164,1.402,201,2.298,203,2.572,224,1.773,235,2.761,257,1.042,267,2.893,276,1.079,288,2.666,294,2.199,305,1.877,315,1.945,331,1.529,364,2.327,377,3.224,464,1.877,478,3.379,512,2.666,542,3.866,587,1.462,609,1.773,641,2.529,791,1.999,801,1.601,946,2.572,1021,1.877,1050,2.327,1060,3.071,1082,2.327,1096,2.144,1099,1.601,1106,3.61,1145,2.144,1177,3.203,1199,2.327,1252,2.327,1303,1.999,1336,2.144,1552,4.302,1591,2.572,1593,3.61,1603,3.498,1607,3.498,1625,2.144,1626,2.144,1627,2.144,1628,2.327,1629,2.572,1630,2.572,1636,2.327,1637,2.327,1638,2.327,1639,2.327,1641,5.033,1647,2.943,1648,2.572,1649,2.943,1650,2.943,1651,4.424,1652,2.943,1653,2.943,1654,2.943,1655,2.943,1656,2.572,1657,2.943,1658,2.943,1659,2.943,1660,4.424,1661,2.943,1662,2.943,1663,3.866,1664,4.424,1665,4.424,1666,2.943,1667,2.943,1668,2.943,1669,2.943,1670,2.943,1671,2.572,1672,2.572,1673,2.943,1674,2.943,1675,2.943,1676,4.424,1677,2.572,1678,2.943,1679,2.572]],["title/73",[398,4.525]],["content/73",[3,0.575,33,0.871,44,1.371,51,1.941,53,2.143,54,2.397,55,1.021,58,2.042,59,0.634,65,1.709,87,1.768,137,1.159,201,2.506,257,1.709,267,2.625,288,2.907,295,2.625,331,2.506,413,2.907,416,1.967,418,2.625,419,2.757,420,2.757,500,3.815,641,3.577,801,2.625,832,3.515,927,4.216,1005,3.276,1099,2.625,1145,3.515,1303,3.276,1360,3.815,1458,3.815,1552,3.405,1593,4.25,1607,4.949,1625,3.515,1626,3.515,1627,3.515,1628,3.815,1636,3.815,1637,3.815,1638,3.815,1639,3.815,1641,4.561,1648,4.216,1677,4.216,1679,4.216,1680,4.824,1681,4.824,1682,4.824,1683,4.824,1684,4.824,1685,4.824]],["title/74",[58,1.821,1552,2.341,1686,4.303]],["content/74",[33,0.822,44,0.951,51,1.638,235,3.445,237,1.936,240,4.177,266,3.588,315,2.323,356,1.586,422,2.874,478,4.144,498,3.183,587,2.625,700,6.644,708,4.833,1005,3.588,1022,3.183,1552,4.503,1603,5.732,1656,4.616,1663,4.616,1671,5.795,1672,4.616,1687,5.283,1688,5.283,1689,5.283,1690,5.283,1691,5.283,1692,5.283,1693,5.283,1694,5.283,1695,5.283]],["title/51",[64,2.246,67,4.292]],["content/51",[3,0.594,8,4.752,11,4.752,28,3.122,56,2.203,59,0.79,149,3.833,151,3.833,643,5.23,666,4.379,830,5.252,898,4.752,1537,5.252,1571,5.252,1587,5.252,1641,4.379,1696,6.01,1697,6.01,1698,6.01,1699,6.01,1700,6.01,1701,6.01,1702,6.01]],["title/52",[401,2.441,1622,4.292]],["content/52",[3,0.518,33,0.677,59,0.966,84,1.819,401,3.109,641,3.576,1600,4.947,1625,4.558,1626,4.558,1627,4.558,1703,6.256,1704,7.35,1705,6.256,1706,6.256,1707,6.256]],["title/53",[62,3.579,463,3.579]],["content/53",[3,0.503,58,2.569,59,0.798,84,1.765,112,3.153,135,2.891,208,3.469,356,2.168,401,3.016,416,2.475,490,3.016,1144,5.304,1708,6.07,1709,6.07,1710,6.07,1711,6.07,1712,6.07,1713,6.07,1714,6.07,1715,6.07,1716,6.07,1717,6.07]],["title/54",[3,0.317,29,0.689,44,0.689,60,3.027]],["content/54",[44,1.327,59,0.827,60,4.972,251,4.011,281,3.789,416,2.564,513,2.876,792,4.582,825,5.495,1387,5.495,1584,5.495,1718,6.288,1719,6.288,1720,6.288,1721,6.288]],["title/55",[0,1.968,1,2.138,242,2.341]],["content/55",[1,3.141,3,0.523,26,1.78,33,0.8,42,6.198,44,1.331,52,4.998,142,1.519,143,4.455,144,5.523]],["title/65",[3,0.407,26,1.383]],["content/65",[]],["title/66",[3,0.179,26,0.979,27,1.378,137,0.519,228,1.301,651,1.574,738,1.708,1094,1.708,1357,1.708,1722,2.16]],["content/66",[5,4.654,26,1.798,29,1.149,33,0.691,84,1.857,126,4.074,148,2.262,356,1.918,416,2.604,422,3.475,423,4.337,793,4.074,1723,6.387]],["title/75",[33,0.339,130,1.793,131,1.379,132,1.629,1724,2.48,1725,2.48]],["content/75",[29,1.109,51,1.911,59,0.81,65,2.182,84,1.791,87,2.258,129,3.352,233,3.41,416,2.512,426,4.872,451,3.352,895,4.49,967,5.384,1053,5.384,1065,4.872,1427,4.49,1724,4.872,1725,4.872]],["title/76",[130,2.459,131,1.892,132,2.235]],["content/76",[3,0.244,27,1.126,31,1.65,33,0.922,39,1.379,44,0.886,46,1.751,55,0.803,56,0.647,57,0.961,59,0.582,65,0.625,70,1.009,71,1.88,72,1.009,73,1.744,74,2.825,78,2.33,81,1.396,84,0.513,85,0.513,90,0.647,97,1.044,100,1.478,102,0.694,109,1.287,117,2.893,130,2.168,131,2.789,132,2.764,134,0.917,135,0.841,142,1.357,143,3.821,147,1.527,161,3.894,164,1.404,169,0.877,176,1.97,178,1.88,181,1.543,186,1.885,215,1.199,233,2.702,237,1.95,238,0.877,251,1.88,252,3.072,257,0.625,276,0.647,282,2.001,287,2.532,294,0.877,295,0.961,296,0.776,302,1.465,315,1.296,319,1.126,346,1.543,353,4.478,356,0.53,376,3.588,394,1.543,416,1.202,417,1.064,418,0.961,419,1.009,420,1.009,421,0.961,455,1.199,489,1.064,492,1.287,497,2.001,498,1.064,507,1.064,520,2.419,533,1.064,596,1.126,649,1.396,654,1.126,698,3.588,719,1.88,722,1.126,723,2.764,793,1.126,816,1.685,848,1.199,897,3.502,971,1.396,1005,1.199,1021,1.126,1039,2.575,1084,6.356,1128,2.576,1164,2.147,1181,1.287,1243,2.147,1250,1.543,1285,1.396,1382,1.396,1386,1.396,1414,1.287,1427,4.114,1440,1.396,1443,1.543,1449,3.87,1518,1.543,1545,2.575,1553,1.396,1620,1.543,1724,4.678,1725,4.464,1726,1.766,1727,1.766,1728,4.429,1729,4.924,1730,1.766,1731,1.766,1732,6.662,1733,2.947,1734,1.766,1735,1.766,1736,1.766,1737,3.793,1738,2.947,1739,1.766,1740,5.321,1741,2.947,1742,2.947,1743,1.766,1744,1.766,1745,1.766,1746,1.766,1747,2.947,1748,5.645,1749,1.766,1750,2.947,1751,3.793,1752,1.766,1753,1.766,1754,1.766,1755,2.947,1756,1.766,1757,1.766,1758,1.766,1759,1.766,1760,2.947,1761,1.766,1762,1.766,1763,1.766,1764,1.766,1765,1.766,1766,3.793,1767,3.793,1768,2.947,1769,2.947,1770,2.947,1771,1.766,1772,1.766,1773,1.766,1774,1.766,1775,1.766,1776,1.766,1777,1.766,1778,1.766]],["title/77",[21,1.62,26,1.078,421,2.083,422,2.083]],["content/77",[126,4.322,423,4.602]]],"invertedIndex":[["",{"_index":33,"title":{"15":{},"42":{},"67":{},"75":{}},"content":{"3":{},"4":{},"5":{},"6":{},"7":{},"9":{},"10":{},"11":{},"13":{},"14":{},"19":{},"20":{},"21":{},"22":{},"23":{},"24":{},"25":{},"31":{},"32":{},"33":{},"35":{},"37":{},"38":{},"40":{},"43":{},"44":{},"45":{},"46":{},"47":{},"49":{},"52":{},"55":{},"58":{},"59":{},"60":{},"61":{},"62":{},"64":{},"66":{},"70":{},"71":{},"72":{},"73":{},"74":{},"76":{},"80":{},"81":{},"82":{},"83":{},"84":{},"85":{}}}],["0",{"_index":520,"title":{},"content":{"21":{},"22":{},"61":{},"64":{},"76":{},"83":{}}}],["0.64.0",{"_index":1644,"title":{},"content":{"71":{}}}],["002000.20",{"_index":943,"title":{},"content":{"61":{}}}],["02x%02x%02x\\n",{"_index":950,"title":{},"content":{"61":{}}}],["05f",{"_index":1038,"title":{},"content":{"64":{}}}],["05ff64",{"_index":951,"title":{},"content":{"61":{}}}],["06_readfile_chunk.t",{"_index":338,"title":{},"content":{"44":{}}}],["08:00",{"_index":585,"title":{},"content":{"22":{}}}],["09.2f\\n",{"_index":942,"title":{},"content":{"61":{}}}],["1",{"_index":237,"title":{"19":{},"43":{},"69":{},"81":{}},"content":{"11":{},"22":{},"32":{},"33":{},"35":{},"37":{},"38":{},"40":{},"64":{},"74":{},"76":{},"81":{},"83":{},"84":{},"85":{}}}],["1,2,3,4,5",{"_index":1424,"title":{},"content":{"84":{}}}],["1.0.0",{"_index":390,"title":{},"content":{"40":{},"46":{}}}],["1.0.1",{"_index":762,"title":{},"content":{"11":{},"81":{},"83":{},"85":{}}}],["1.123123e+01",{"_index":919,"title":{},"content":{"61":{}}}],["1.8",{"_index":185,"title":{},"content":{"14":{}}}],["10",{"_index":161,"title":{},"content":{"7":{},"14":{},"76":{}}}],["10.0",{"_index":174,"title":{},"content":{"14":{}}}],["10.1",{"_index":177,"title":{},"content":{"14":{}}}],["100",{"_index":948,"title":{},"content":{"61":{},"64":{},"81":{}}}],["1000",{"_index":1386,"title":{},"content":{"76":{},"82":{},"84":{}}}],["11",{"_index":583,"title":{},"content":{"22":{}}}],["12",{"_index":198,"title":{},"content":{"7":{}}}],["1234",{"_index":1469,"title":{},"content":{"49":{}}}],["16t10:40:17",{"_index":584,"title":{},"content":{"22":{}}}],["1962",{"_index":774,"title":{},"content":{"11":{},"83":{},"85":{}}}],["2",{"_index":302,"title":{"20":{},"44":{},"70":{},"82":{}},"content":{"11":{},"37":{},"38":{},"40":{},"45":{},"64":{},"76":{}}}],["2.31",{"_index":1639,"title":{},"content":{"71":{},"72":{},"73":{}}}],["20",{"_index":163,"title":{},"content":{"14":{}}}],["2000",{"_index":844,"title":{},"content":{"58":{},"59":{},"60":{}}}],["2000.2",{"_index":935,"title":{},"content":{"61":{}}}],["2000.20",{"_index":937,"title":{},"content":{"61":{}}}],["20000",{"_index":865,"title":{},"content":{"59":{}}}],["2020",{"_index":582,"title":{},"content":{"22":{}}}],["221b",{"_index":861,"title":{},"content":{"59":{}}}],["2407",{"_index":572,"title":{},"content":{"22":{}}}],["252",{"_index":579,"title":{},"content":{"22":{}}}],["255",{"_index":947,"title":{},"content":{"61":{}}}],["26",{"_index":562,"title":{},"content":{"22":{},"25":{}}}],["2f",{"_index":879,"title":{},"content":{"59":{}}}],["3",{"_index":186,"title":{"21":{},"45":{},"71":{},"83":{}},"content":{"11":{},"14":{},"64":{},"76":{},"80":{},"83":{},"85":{}}}],["3,095.41",{"_index":558,"title":{},"content":{"22":{}}}],["3.0",{"_index":187,"title":{},"content":{"14":{}}}],["3.11_glibc",{"_index":1638,"title":{},"content":{"71":{},"72":{},"73":{}}}],["353",{"_index":1385,"title":{},"content":{"82":{}}}],["4",{"_index":376,"title":{"22":{},"46":{},"72":{}},"content":{"76":{}}}],["4\">todo'",{"_index":1206,"title":{},"content":{"37":{},"40":{}}}],["400",{"_index":618,"title":{},"content":{"23":{},"25":{}}}],["4000",{"_index":523,"title":{},"content":{"21":{},"61":{}}}],["401",{"_index":571,"title":{},"content":{"22":{}}}],["404",{"_index":1189,"title":{},"content":{"35":{},"40":{},"49":{}}}],["42ac",{"_index":553,"title":{},"content":{"22":{}}}],["47.com/knowledg",{"_index":1074,"title":{},"content":{"28":{}}}],["489",{"_index":574,"title":{},"content":{"22":{}}}],["49",{"_index":985,"title":{},"content":{"62":{}}}],["5",{"_index":596,"title":{"23":{}},"content":{"49":{},"61":{},"62":{},"76":{},"84":{}}}],["5215187d3d6a",{"_index":1601,"title":{},"content":{"70":{}}}],["56",{"_index":768,"title":{},"content":{"11":{},"83":{},"85":{}}}],["58a5",{"_index":552,"title":{},"content":{"22":{}}}],["6",{"_index":649,"title":{"24":{}},"content":{"76":{},"85":{}}}],["6027d46771b8a91a27bc9e13",{"_index":548,"title":{},"content":{"22":{}}}],["7",{"_index":688,"title":{"25":{}},"content":{}}],["8",{"_index":632,"title":{},"content":{"23":{},"32":{},"33":{},"37":{},"40":{},"61":{}}}],["8.9f",{"_index":933,"title":{},"content":{"61":{}}}],["8.f",{"_index":934,"title":{},"content":{"61":{}}}],["8000",{"_index":1107,"title":{},"content":{"32":{},"33":{},"40":{}}}],["8080",{"_index":38,"title":{"4":{}},"content":{"4":{},"5":{},"6":{},"49":{}}}],["8080copi",{"_index":1678,"title":{},"content":{"72":{}}}],["8080entrypoint",{"_index":1684,"title":{},"content":{"73":{}}}],["8bit",{"_index":978,"title":{},"content":{"62":{}}}],["9",{"_index":932,"title":{},"content":{"61":{}}}],["9.2f\\n",{"_index":936,"title":{},"content":{"61":{}}}],["90",{"_index":1647,"title":{},"content":{"72":{}}}],["980",{"_index":570,"title":{},"content":{"22":{}}}],["9f",{"_index":931,"title":{},"content":{"61":{}}}],["_",{"_index":259,"title":{},"content":{"24":{},"43":{},"44":{}}}],["__initial_state__",{"_index":1342,"title":{},"content":{"40":{}}}],["_append",{"_index":1405,"title":{},"content":{"83":{}}}],["_append(a",{"_index":1406,"title":{},"content":{"83":{}}}],["_append(chunk",{"_index":1395,"title":{},"content":{"83":{}}}],["_f",{"_index":1003,"title":{},"content":{"64":{}}}],["_format",{"_index":994,"title":{},"content":{"64":{}}}],["_id",{"_index":547,"title":{},"content":{"22":{},"24":{}}}],["_l",{"_index":1001,"title":{},"content":{"64":{}}}],["_level",{"_index":993,"title":{},"content":{"64":{}}}],["_readtilldon",{"_index":1426,"title":{},"content":{"84":{}}}],["_readtilldone(file?.rid",{"_index":1437,"title":{},"content":{"84":{}}}],["_readtilldone(rid",{"_index":1433,"title":{},"content":{"84":{}}}],["a.length",{"_index":1410,"title":{},"content":{"83":{}}}],["abil",{"_index":1573,"title":{},"content":{"68":{}}}],["abov",{"_index":165,"title":{},"content":{"14":{},"26":{},"35":{},"38":{},"40":{},"43":{},"47":{},"49":{},"58":{},"70":{},"71":{}}}],["accept",{"_index":122,"title":{},"content":{"6":{},"23":{},"45":{}}}],["access",{"_index":89,"title":{},"content":{"5":{},"11":{},"21":{},"37":{},"72":{}}}],["accord",{"_index":885,"title":{"61":{}},"content":{"29":{},"60":{}}}],["accordingli",{"_index":1466,"title":{},"content":{"49":{}}}],["accumul",{"_index":687,"title":{},"content":{"24":{}}}],["achiev",{"_index":1481,"title":{},"content":{"49":{}}}],["act",{"_index":655,"title":{},"content":{"24":{}}}],["actor",{"_index":765,"title":{},"content":{"11":{},"81":{},"83":{},"85":{}}}],["actor.movies[1",{"_index":814,"title":{},"content":{"11":{}}}],["actor.nam",{"_index":810,"title":{},"content":{"11":{}}}],["actual",{"_index":792,"title":{},"content":{"11":{},"54":{},"78":{},"82":{}}}],["ad",{"_index":963,"title":{"35":{},"38":{}},"content":{"35":{},"37":{},"38":{},"49":{},"62":{},"64":{},"85":{}}}],["add",{"_index":257,"title":{"33":{},"37":{}},"content":{"20":{},"32":{},"33":{},"35":{},"37":{},"38":{},"43":{},"44":{},"45":{},"46":{},"47":{},"49":{},"64":{},"70":{},"71":{},"72":{},"73":{},"76":{}}}],["addit",{"_index":964,"title":{},"content":{"62":{}}}],["address",{"_index":573,"title":{},"content":{"22":{},"24":{},"59":{}}}],["address.street",{"_index":875,"title":{},"content":{"59":{}}}],["advanc",{"_index":426,"title":{"15":{}},"content":{"49":{},"75":{}}}],["afraid",{"_index":1090,"title":{},"content":{"31":{}}}],["ag",{"_index":561,"title":{},"content":{"11":{},"22":{},"24":{},"25":{},"83":{},"85":{}}}],["again",{"_index":1164,"title":{},"content":{"33":{},"38":{},"49":{},"76":{}}}],["age\\n",{"_index":696,"title":{},"content":{"25":{}}}],["ago",{"_index":1689,"title":{},"content":{"74":{}}}],["alia",{"_index":60,"title":{"54":{}},"content":{"5":{},"54":{}}}],["allow",{"_index":53,"title":{},"content":{"5":{},"6":{},"20":{},"21":{},"32":{},"33":{},"38":{},"40":{},"44":{},"47":{},"64":{},"68":{},"69":{},"71":{},"72":{},"73":{},"80":{},"81":{},"82":{},"83":{},"85":{}}}],["allowsyntheticdefaultimport",{"_index":1329,"title":{},"content":{"38":{}}}],["along",{"_index":341,"title":{},"content":{"44":{},"71":{}}}],["alpin",{"_index":1595,"title":{},"content":{"70":{},"71":{}}}],["alreadi",{"_index":427,"title":{},"content":{"16":{}}}],["amd",{"_index":1318,"title":{},"content":{"38":{}}}],["anger",{"_index":961,"title":{},"content":{"62":{}}}],["anoth",{"_index":215,"title":{},"content":{"11":{},"42":{},"49":{},"62":{},"76":{}}}],["answer",{"_index":1280,"title":{},"content":{"38":{}}}],["any).hydr",{"_index":1343,"title":{},"content":{"40":{}}}],["any).hydrate(pleas",{"_index":626,"title":{},"content":{"23":{}}}],["backend",{"_index":511,"title":{"32":{},"35":{}},"content":{"21":{}}}],["background",{"_index":976,"title":{},"content":{"62":{}}}],["bad",{"_index":1076,"title":{},"content":{"28":{}}}],["baker",{"_index":862,"title":{},"content":{"59":{}}}],["balanc",{"_index":557,"title":{},"content":{"22":{},"24":{}}}],["bankruptci",{"_index":1619,"title":{},"content":{"71":{}}}],["base",{"_index":232,"title":{"45":{}},"content":{"11":{},"22":{},"24":{},"42":{},"43":{},"44":{},"70":{}}}],["base/webpack",{"_index":1075,"title":{},"content":{"28":{}}}],["baserout",{"_index":624,"title":{},"content":{"23":{}}}],["baseroute.get",{"_index":625,"title":{},"content":{"23":{}}}],["bash_profil",{"_index":1718,"title":{},"content":{"54":{}}}],["bash_profile(depend",{"_index":406,"title":{},"content":{"47":{}}}],["bashrc",{"_index":405,"title":{},"content":{"47":{}}}],["basic",{"_index":450,"title":{"19":{},"21":{},"22":{},"63":{},"64":{},"84":{}},"content":{"11":{},"16":{},"17":{},"20":{},"21":{},"22":{},"24":{},"32":{},"37":{},"49":{},"56":{},"57":{},"62":{},"64":{},"69":{}}}],["be",{"_index":316,"title":{},"content":{"44":{},"49":{}}}],["beach",{"_index":564,"title":{},"content":{"22":{},"25":{}}}],["becom",{"_index":283,"title":{},"content":{"43":{}}}],["becuas",{"_index":1673,"title":{},"content":{"72":{}}}],["befor",{"_index":1022,"title":{},"content":{"37":{},"38":{},"49":{},"64":{},"68":{},"74":{},"78":{}}}],["begin",{"_index":456,"title":{},"content":{"16":{}}}],["behav",{"_index":156,"title":{},"content":{"14":{}}}],["behavior",{"_index":367,"title":{},"content":{"37":{},"45":{}}}],["believ",{"_index":1083,"title":{},"content":{"29":{}}}],["bellow",{"_index":1642,"title":{},"content":{"71":{}}}],["below",{"_index":114,"title":{},"content":{"6":{},"11":{},"14":{},"19":{},"26":{},"32":{},"33":{},"37":{},"38":{},"40":{},"42":{},"47":{},"61":{},"69":{},"70":{}}}],["best",{"_index":823,"title":{},"content":{"56":{}}}],["beta",{"_index":1709,"title":{},"content":{"53":{}}}],["beta.16/cli.tscl",{"_index":495,"title":{},"content":{"20":{}}}],["better",{"_index":234,"title":{"46":{}},"content":{"42":{},"71":{}}}],["between",{"_index":433,"title":{},"content":{"16":{},"38":{},"49":{}}}],["bgrgb8",{"_index":974,"title":{},"content":{"62":{}}}],["bgrgb8(str",{"_index":981,"title":{},"content":{"62":{}}}],["big",{"_index":837,"title":{},"content":{"57":{},"82":{}}}],["bin",{"_index":1640,"title":{},"content":{"71":{}}}],["bin/deno",{"_index":1629,"title":{},"content":{"71":{},"72":{}}}],["bin/denoworkdir",{"_index":1683,"title":{},"content":{"73":{}}}],["binari",{"_index":906,"title":{},"content":{"61":{},"68":{},"71":{}}}],["bind",{"_index":542,"title":{},"content":{"22":{},"72":{}}}],["birthdat",{"_index":772,"title":{},"content":{"11":{},"83":{},"85":{}}}],["bit",{"_index":980,"title":{},"content":{"62":{}}}],["block",{"_index":1616,"title":{},"content":{"71":{}}}],["blog",{"_index":1181,"title":{},"content":{"35":{},"40":{},"68":{},"76":{}}}],["bodi",{"_index":49,"title":{},"content":{"5":{},"6":{},"32":{},"33":{},"35":{},"37":{},"38":{},"40":{},"49":{}}}],["body.typ",{"_index":1191,"title":{},"content":{"35":{},"40":{}}}],["body.valu",{"_index":1192,"title":{},"content":{"35":{},"40":{}}}],["bonu",{"_index":398,"title":{"47":{},"73":{}},"content":{"49":{}}}],["boolean",{"_index":284,"title":{},"content":{"22":{},"24":{},"43":{},"45":{},"61":{},"84":{}}}],["bootstrap",{"_index":1242,"title":{},"content":{"37":{}}}],["born",{"_index":769,"title":{},"content":{"11":{},"83":{},"85":{}}}],["both",{"_index":364,"title":{},"content":{"29":{},"45":{},"72":{}}}],["box",{"_index":962,"title":{},"content":{"49":{},"62":{},"84":{}}}],["break",{"_index":754,"title":{},"content":{"11":{},"49":{},"68":{}}}],["breakdown",{"_index":71,"title":{},"content":{"5":{},"6":{},"49":{},"76":{},"83":{},"84":{}}}],["brew",{"_index":1706,"title":{},"content":{"52":{}}}],["brief",{"_index":1557,"title":{},"content":{"68":{}}}],["britney",{"_index":1472,"title":{},"content":{"49":{}}}],["browser",{"_index":13,"title":{},"content":{"2":{},"5":{},"6":{},"33":{},"37":{},"49":{},"62":{},"69":{},"72":{}}}],["buf",{"_index":1374,"title":{},"content":{"81":{},"82":{},"83":{},"84":{}}}],["buf).then",{"_index":1398,"title":{},"content":{"83":{}}}],["buf).then(funct",{"_index":1393,"title":{},"content":{"83":{}}}],["buf).then(readbyt",{"_index":1396,"title":{},"content":{"83":{}}}],["buff",{"_index":1383,"title":{},"content":{"81":{}}}],["buffer",{"_index":739,"title":{},"content":{"10":{},"81":{},"82":{},"84":{}}}],["bug",{"_index":1575,"title":{},"content":{"68":{}}}],["build",{"_index":87,"title":{"15":{},"28":{},"42":{},"56":{}},"content":{"5":{},"16":{},"20":{},"21":{},"29":{},"35":{},"40":{},"49":{},"56":{},"68":{},"70":{},"71":{},"72":{},"73":{},"75":{}}}],["buildschema",{"_index":652,"title":{},"content":{"24":{}}}],["buildschema([bas",{"_index":664,"title":{},"content":{"24":{}}}],["built",{"_index":1698,"title":{},"content":{"51":{}}}],["bundl",{"_index":1288,"title":{},"content":{"38":{},"40":{}}}],["bundler",{"_index":1086,"title":{},"content":{"29":{}}}],["busi",{"_index":1487,"title":{},"content":{"49":{}}}],["button",{"_index":1220,"title":{},"content":{"37":{},"38":{},"40":{}}}],["buxton",{"_index":577,"title":{},"content":{"22":{}}}],["byte",{"_index":109,"title":{},"content":{"6":{},"61":{},"76":{},"81":{}}}],["c",{"_index":801,"title":{},"content":{"11":{},"38":{},"40":{},"57":{},"61":{},"69":{},"72":{},"73":{},"83":{}}}],["c.set(a",{"_index":1408,"title":{},"content":{"83":{}}}],["c.set(b.slice(0",{"_index":1409,"title":{},"content":{"83":{}}}],["call",{"_index":654,"title":{},"content":{"24":{},"49":{},"76":{},"81":{},"83":{},"84":{}}}],["callback",{"_index":603,"title":{},"content":{"23":{}}}],["can't",{"_index":853,"title":{},"content":{"49":{},"58":{}}}],["canda",{"_index":575,"title":{},"content":{"22":{}}}],["cant",{"_index":203,"title":{},"content":{"7":{},"72":{}}}],["capabl",{"_index":1282,"title":{},"content":{"38":{}}}],["case",{"_index":1256,"title":{},"content":{"37":{},"38":{},"49":{}}}],["cast",{"_index":171,"title":{},"content":{"14":{}}}],["cat",{"_index":728,"title":{},"content":{"9":{}}}],["catch",{"_index":799,"title":{},"content":{"11":{},"32":{},"33":{},"38":{},"40":{},"49":{}}}],["caus",{"_index":1635,"title":{},"content":{"71":{}}}],["cd",{"_index":1097,"title":{},"content":{"31":{},"69":{}}}],["cdn",{"_index":1132,"title":{},"content":{"33":{}}}],["cdn.skypack.dev",{"_index":657,"title":{},"content":{"24":{}}}],["chanc",{"_index":1069,"title":{},"content":{"28":{}}}],["chang",{"_index":204,"title":{},"content":{"7":{},"33":{},"37":{},"38":{},"40":{},"64":{},"68":{}}}],["char",{"_index":1727,"title":{},"content":{"76":{}}}],["charact",{"_index":907,"title":{},"content":{"61":{}}}],["charset=\"utf",{"_index":1115,"title":{},"content":{"32":{},"33":{},"37":{},"40":{}}}],["charset=utf",{"_index":631,"title":{},"content":{"23":{}}}],["check",{"_index":489,"title":{},"content":{"20":{},"38":{},"40":{},"68":{},"71":{},"76":{},"83":{}}}],["checkout",{"_index":1592,"title":{},"content":{"69":{}}}],["cheer",{"_index":1723,"title":{},"content":{"66":{}}}],["chuck",{"_index":1613,"title":{},"content":{"71":{}}}],["chucknorri",{"_index":1597,"title":{},"content":{"70":{},"71":{}}}],["chunk",{"_index":1372,"title":{},"content":{"80":{},"82":{},"83":{}}}],["ci",{"_index":1560,"title":{},"content":{"68":{}}}],["cicd",{"_index":1556,"title":{},"content":{"68":{}}}],["citi",{"_index":1617,"title":{},"content":{"71":{}}}],["clampandtruncate(color",{"_index":984,"title":{},"content":{"62":{}}}],["clap",{"_index":418,"title":{},"content":{"11":{},"27":{},"41":{},"47":{},"49":{},"64":{},"73":{},"76":{},"85":{}}}],["class",{"_index":987,"title":{"64":{}},"content":{"64":{}}}],["classname=\"contain",{"_index":1203,"title":{},"content":{"37":{},"40":{}}}],["classname=\"display",{"_index":1205,"title":{},"content":{"37":{},"40":{}}}],["classname=\"jumbotron",{"_index":1200,"title":{},"content":{"37":{},"40":{}}}],["classname=\"lead\">thi",{"_index":1208,"title":{},"content":{"37":{},"40":{}}}],["classname=\"list",{"_index":1214,"title":{},"content":{"37":{},"38":{},"40":{}}}],["classname=\"ml",{"_index":1222,"title":{},"content":{"37":{},"38":{},"40":{}}}],["clean",{"_index":1518,"title":{},"content":{"49":{},"76":{}}}],["cli",{"_index":129,"title":{"12":{},"42":{}},"content":{"11":{},"38":{},"42":{},"43":{},"46":{},"47":{},"75":{}}}],["click",{"_index":1276,"title":{},"content":{"38":{}}}],["client",{"_index":25,"title":{"36":{},"38":{}},"content":{"2":{},"5":{},"29":{},"38":{},"71":{}}}],["client.tsx",{"_index":1290,"title":{},"content":{"38":{},"40":{}}}],["clientj",{"_index":1294,"title":{},"content":{"38":{},"40":{}}}],["clone",{"_index":222,"title":{},"content":{"42":{}}}],["close",{"_index":543,"title":{},"content":{"22":{},"37":{},"38":{},"40":{}}}],["cmd",{"_index":500,"title":{},"content":{"20":{},"71":{},"73":{}}}],["code",{"_index":356,"title":{"27":{},"85":{}},"content":{"11":{},"16":{},"19":{},"23":{},"24":{},"32":{},"33":{},"35":{},"37":{},"38":{},"40":{},"45":{},"46":{},"49":{},"53":{},"56":{},"64":{},"66":{},"68":{},"74":{},"76":{},"78":{},"83":{}}}],["code([48",{"_index":983,"title":{},"content":{"62":{}}}],["codepoint",{"_index":909,"title":{},"content":{"61":{}}}],["collect",{"_index":256,"title":{},"content":{"43":{}}}],["color",{"_index":816,"title":{"56":{},"62":{}},"content":{"38":{},"40":{},"61":{},"62":{},"64":{},"76":{}}}],["combin",{"_index":277,"title":{},"content":{"23":{},"43":{},"60":{}}}],["come",{"_index":1062,"title":{},"content":{"28":{}}}],["comma",{"_index":857,"title":{},"content":{"58":{}}}],["commad",{"_index":1682,"title":{},"content":{"73":{}}}],["command",{"_index":58,"title":{"13":{},"43":{},"74":{}},"content":{"5":{},"12":{},"20":{},"32":{},"42":{},"47":{},"53":{},"68":{},"70":{},"71":{},"72":{},"73":{}}}],["command);}async",{"_index":392,"title":{},"content":{"46":{}}}],["comment",{"_index":415,"title":{},"content":{"11":{},"27":{},"47":{},"64":{},"85":{}}}],["common",{"_index":1146,"title":{},"content":{"33":{}}}],["commonj",{"_index":1316,"title":{},"content":{"38":{}}}],["commun",{"_index":438,"title":{},"content":{"16":{},"20":{},"21":{},"26":{}}}],["compat",{"_index":14,"title":{},"content":{"2":{}}}],["compil",{"_index":502,"title":{},"content":{"20":{},"24":{},"33":{},"38":{},"71":{}}}],["compileropt",{"_index":1304,"title":{},"content":{"38":{}}}],["complet",{"_index":791,"title":{},"content":{"11":{},"49":{},"72":{},"81":{},"84":{}}}],["complex",{"_index":938,"title":{},"content":{"49":{},"61":{},"84":{}}}],["compon",{"_index":1263,"title":{},"content":{"37":{}}}],["concept",{"_index":1555,"title":{},"content":{"68":{}}}],["concern",{"_index":1490,"title":{},"content":{"49":{}}}],["config",{"_index":515,"title":{},"content":{"21":{}}}],["configur",{"_index":1068,"title":{},"content":{"28":{},"68":{}}}],["conflict",{"_index":706,"title":{},"content":{"26":{}}}],["congrat",{"_index":697,"title":{},"content":{"25":{}}}],["connect",{"_index":77,"title":{},"content":{"5":{}}}],["consid",{"_index":280,"title":{},"content":{"43":{}}}],["consist",{"_index":1585,"title":{},"content":{"68":{}}}],["consol",{"_index":1165,"title":{},"content":{"33":{}}}],["console.error(error",{"_index":1124,"title":{},"content":{"32":{},"33":{},"38":{},"40":{}}}],["console.log",{"_index":262,"title":{},"content":{"43":{},"49":{},"57":{},"58":{},"59":{},"62":{}}}],["console.log(\"hello",{"_index":836,"title":{},"content":{"57":{}}}],["console.log(\"person",{"_index":866,"title":{},"content":{"59":{}}}],["console.log(\"serv",{"_index":1105,"title":{},"content":{"32":{},"33":{},"40":{}}}],["console.log(\"y",{"_index":1736,"title":{},"content":{"76":{}}}],["console.log(1.2",{"_index":184,"title":{},"content":{"14":{}}}],["console.log(_",{"_index":299,"title":{},"content":{"43":{}}}],["console.log(`hello",{"_index":144,"title":{},"content":{"13":{},"55":{}}}],["console.log(`info",{"_index":851,"title":{},"content":{"58":{}}}],["console.log(`mi",{"_index":845,"title":{},"content":{"58":{}}}],["console.log(`your",{"_index":43,"title":{},"content":{"5":{}}}],["console.log(arg",{"_index":245,"title":{},"content":{"43":{}}}],["console.log(const",{"_index":199,"title":{},"content":{"7":{}}}],["console.log(data",{"_index":1730,"title":{},"content":{"76":{}}}],["console.log(decoder.decode(buf",{"_index":1379,"title":{},"content":{"81":{},"82":{}}}],["console.log(decoder.decode(chunk",{"_index":1397,"title":{},"content":{"83":{}}}],["console.log(dir",{"_index":300,"title":{},"content":{"43":{}}}],["console.log(dirfullpath",{"_index":311,"title":{},"content":{"44":{}}}],["console.log(entri",{"_index":330,"title":{},"content":{"44":{}}}],["console.log(entry.path",{"_index":361,"title":{},"content":{"45":{}}}],["console.log(fil",{"_index":1370,"title":{},"content":{"80":{}}}],["console.log(flt",{"_index":175,"title":{},"content":{"14":{}}}],["console.log(json.stringify(obj",{"_index":784,"title":{},"content":{"11":{}}}],["console.log(lin",{"_index":1454,"title":{},"content":{"85":{}}}],["console.log(nan",{"_index":183,"title":{},"content":{"14":{}}}],["console.log(num3",{"_index":168,"title":{},"content":{"14":{}}}],["console.log(numofbyteread",{"_index":1378,"title":{},"content":{"81":{},"82":{}}}],["console.log(pars",{"_index":286,"title":{},"content":{"43":{}}}],["console.log(respons",{"_index":743,"title":{},"content":{"10":{},"11":{}}}],["console.log(safeeval(\"actor.movies[2",{"_index":789,"title":{},"content":{"11":{}}}],["console.log(safeeval(\"contributor",{"_index":787,"title":{},"content":{"11":{}}}],["console.log(safeeval(\"contributors[1",{"_index":788,"title":{},"content":{"11":{}}}],["console.log(safeeval(\"id",{"_index":786,"title":{},"content":{"11":{}}}],["console.log(safeeval(key",{"_index":797,"title":{},"content":{"11":{}}}],["console.log(stdincont",{"_index":737,"title":{},"content":{"10":{}}}],["console.log(typeof",{"_index":179,"title":{},"content":{"14":{}}}],["console.log(valu",{"_index":1423,"title":{},"content":{"84":{},"85":{}}}],["const",{"_index":39,"title":{},"content":{"4":{},"5":{},"6":{},"7":{},"10":{},"11":{},"13":{},"14":{},"21":{},"22":{},"23":{},"24":{},"25":{},"32":{},"33":{},"35":{},"37":{},"38":{},"40":{},"43":{},"44":{},"45":{},"46":{},"49":{},"58":{},"59":{},"60":{},"61":{},"64":{},"76":{},"80":{},"81":{},"82":{},"83":{},"84":{},"85":{}}}],["constant",{"_index":197,"title":{"7":{}},"content":{"7":{}}}],["constant/vari",{"_index":846,"title":{},"content":{"58":{}}}],["constructor",{"_index":990,"title":{},"content":{"64":{}}}],["constructor(opt",{"_index":995,"title":{},"content":{"64":{}}}],["consum",{"_index":1198,"title":{},"content":{"37":{}}}],["contain",{"_index":478,"title":{},"content":{"19":{},"23":{},"24":{},"37":{},"70":{},"72":{},"74":{},"79":{}}}],["content",{"_index":643,"title":{},"content":{"23":{},"25":{},"37":{},"51":{}}}],["content=\"width=devic",{"_index":1117,"title":{},"content":{"32":{},"33":{},"37":{},"40":{}}}],["context",{"_index":609,"title":{},"content":{"23":{},"24":{},"25":{},"35":{},"38":{},"40":{},"72":{}}}],["context.param",{"_index":1185,"title":{},"content":{"35":{},"40":{}}}],["context.params.id",{"_index":1186,"title":{},"content":{"35":{},"40":{}}}],["context.request",{"_index":691,"title":{},"content":{"25":{}}}],["context.request.bodi",{"_index":613,"title":{},"content":{"23":{},"25":{},"35":{},"40":{}}}],["context.respons",{"_index":692,"title":{},"content":{"25":{}}}],["context.response.bodi",{"_index":610,"title":{},"content":{"23":{},"25":{},"35":{},"38":{},"40":{}}}],["context.response.headers.append(\"cont",{"_index":629,"title":{},"content":{"23":{}}}],["context.response.headers.set(\"cont",{"_index":1298,"title":{},"content":{"38":{},"40":{}}}],["context.response.statu",{"_index":617,"title":{},"content":{"23":{},"25":{},"35":{},"40":{}}}],["continu",{"_index":1553,"title":{"67":{}},"content":{"68":{},"76":{}}}],["contributor",{"_index":763,"title":{},"content":{"11":{},"81":{},"83":{},"85":{}}}],["control",{"_index":1023,"title":{"35":{}},"content":{"49":{},"64":{}}}],["controller/handl",{"_index":1492,"title":{},"content":{"49":{}}}],["controllers.t",{"_index":1519,"title":{},"content":{"49":{}}}],["convers",{"_index":944,"title":{},"content":{"61":{}}}],["convert",{"_index":319,"title":{},"content":{"10":{},"38":{},"44":{},"47":{},"59":{},"76":{}}}],["cool",{"_index":507,"title":{"56":{}},"content":{"20":{},"38":{},"49":{},"56":{},"58":{},"76":{}}}],["copi",{"_index":1641,"title":{},"content":{"51":{},"71":{},"72":{},"73":{}}}],["coppi",{"_index":1654,"title":{},"content":{"72":{}}}],["core",{"_index":731,"title":{},"content":{"10":{},"35":{}}}],["corr",{"_index":908,"title":{},"content":{"61":{}}}],["correspond",{"_index":1265,"title":{},"content":{"37":{}}}],["coupl",{"_index":432,"title":{},"content":{"16":{}}}],["cp",{"_index":1659,"title":{},"content":{"72":{}}}],["creat",{"_index":29,"title":{"4":{},"5":{},"9":{},"23":{},"24":{},"35":{},"48":{},"54":{},"64":{},"69":{},"70":{}},"content":{"2":{},"5":{},"6":{},"7":{},"8":{},"11":{},"13":{},"19":{},"21":{},"22":{},"23":{},"24":{},"25":{},"31":{},"32":{},"33":{},"35":{},"37":{},"38":{},"42":{},"46":{},"49":{},"58":{},"64":{},"66":{},"69":{},"70":{},"75":{},"82":{},"84":{}}}],["creation",{"_index":1327,"title":{},"content":{"38":{}}}],["cross",{"_index":1277,"title":{},"content":{"38":{}}}],["crossorigin=\"anonym",{"_index":1233,"title":{},"content":{"37":{},"40":{}}}],["cruis",{"_index":767,"title":{},"content":{"11":{},"83":{},"85":{}}}],["cruise.jpg",{"_index":783,"title":{},"content":{"11":{},"83":{},"85":{}}}],["css",{"_index":965,"title":{},"content":{"37":{},"62":{}}}],["ctx.response.bodi",{"_index":1109,"title":{},"content":{"32":{},"33":{},"37":{},"38":{},"40":{}}}],["curl",{"_index":641,"title":{},"content":{"11":{},"23":{},"25":{},"37":{},"52":{},"71":{},"72":{},"73":{}}}],["curl\"]cmd",{"_index":1609,"title":{},"content":{"71":{}}}],["curlentrypoint",{"_index":1608,"title":{},"content":{"71":{}}}],["current",{"_index":318,"title":{},"content":{"20":{},"21":{},"23":{},"24":{},"28":{},"44":{},"49":{},"84":{}}}],["curv",{"_index":1066,"title":{},"content":{"28":{}}}],["custom",{"_index":1302,"title":{},"content":{"38":{}}}],["cxt.response.bodi",{"_index":526,"title":{},"content":{"21":{}}}],["cyan",{"_index":971,"title":{},"content":{"62":{},"64":{},"76":{}}}],["cycl",{"_index":1582,"title":{},"content":{"68":{}}}],["d",{"_index":267,"title":{},"content":{"11":{},"24":{},"43":{},"45":{},"59":{},"61":{},"72":{},"73":{},"84":{}}}],["d\\n",{"_index":897,"title":{},"content":{"60":{},"61":{},"76":{}}}],["daili",{"_index":1583,"title":{},"content":{"68":{}}}],["data",{"_index":296,"title":{"78":{}},"content":{"8":{},"9":{},"10":{},"16":{},"23":{},"25":{},"35":{},"37":{},"40":{},"43":{},"49":{},"76":{},"80":{}}}],["data.error",{"_index":693,"title":{},"content":{"25":{}}}],["databas",{"_index":539,"title":{"22":{}},"content":{"22":{},"37":{}}}],["database.t",{"_index":545,"title":{},"content":{"22":{}}}],["database/model",{"_index":481,"title":{},"content":{"19":{}}}],["date().toisostr",{"_index":1549,"title":{},"content":{"49":{}}}],["date.now",{"_index":1180,"title":{},"content":{"35":{},"40":{}}}],["day",{"_index":1564,"title":{},"content":{"68":{},"71":{}}}],["de",{"_index":272,"title":{},"content":{"43":{}}}],["debug",{"_index":822,"title":{},"content":{"56":{},"68":{}}}],["decim",{"_index":920,"title":{},"content":{"61":{}}}],["declar",{"_index":166,"title":{},"content":{"14":{},"37":{},"38":{},"40":{}}}],["decod",{"_index":1373,"title":{},"content":{"81":{},"82":{},"83":{}}}],["decoder.decod",{"_index":1402,"title":{},"content":{"83":{}}}],["decoder.decode(buf.slice(0",{"_index":1432,"title":{},"content":{"84":{}}}],["decoupl",{"_index":1650,"title":{},"content":{"72":{}}}],["deepak",{"_index":146,"title":{},"content":{"7":{},"11":{},"13":{},"49":{},"58":{},"59":{},"60":{},"61":{},"81":{},"83":{},"85":{}}}],["default",{"_index":12,"title":{},"content":{"2":{},"5":{},"6":{},"23":{},"24":{},"25":{},"37":{},"38":{},"40":{},"43":{},"45":{},"49":{},"61":{},"64":{},"71":{}}}],["defer>hello",{"_index":1160,"title":{},"content":{"33":{}}}],["haha",{"_index":1776,"title":{},"content":{"76":{}}}],["hand",{"_index":1578,"title":{},"content":{"68":{}}}],["handl",{"_index":598,"title":{"23":{},"25":{}},"content":{"25":{},"26":{},"49":{}}}],["handlepag",{"_index":1102,"title":{},"content":{"32":{},"33":{},"35":{},"40":{}}}],["handlepage(ctx",{"_index":1108,"title":{},"content":{"32":{},"33":{},"37":{},"38":{},"40":{}}}],["handlepost",{"_index":1504,"title":{},"content":{"49":{}}}],["handleposts(req",{"_index":1505,"title":{},"content":{"49":{}}}],["handler",{"_index":41,"title":{"5":{}},"content":{"49":{}}}],["handler[staticfil",{"_index":1536,"title":{},"content":{"49":{}}}],["handleus",{"_index":1497,"title":{},"content":{"49":{}}}],["handleusers(req",{"_index":1494,"title":{},"content":{"49":{}}}],["hard",{"_index":847,"title":{},"content":{"49":{},"58":{},"82":{}}}],["harder",{"_index":1777,"title":{},"content":{"76":{}}}],["have't",{"_index":63,"title":{},"content":{"5":{}}}],["head",{"_index":1113,"title":{},"content":{"32":{},"33":{},"37":{},"40":{}}}],["header",{"_index":94,"title":{},"content":{"6":{},"23":{},"25":{},"37":{}}}],["hello",{"_index":0,"title":{"1":{},"34":{},"55":{}},"content":{"5":{},"6":{},"13":{},"20":{},"21":{},"23":{},"24":{},"33":{},"49":{},"70":{}}}],["hello.t",{"_index":685,"title":{},"content":{"24":{}}}],["hello_world.t",{"_index":681,"title":{},"content":{"24":{}}}],["helloresolv",{"_index":672,"title":{},"content":{"24":{}}}],["helloworld",{"_index":646,"title":{},"content":{"23":{}}}],["help",{"_index":251,"title":{},"content":{"16":{},"43":{},"44":{},"46":{},"54":{},"76":{}}}],["helper",{"_index":653,"title":{},"content":{"24":{}}}],["here",{"_index":85,"title":{},"content":{"5":{},"8":{},"9":{},"11":{},"14":{},"19":{},"32":{},"35":{},"37":{},"38":{},"40":{},"43":{},"44":{},"49":{},"56":{},"59":{},"62":{},"69":{},"70":{},"76":{},"78":{},"81":{},"82":{},"83":{},"84":{},"85":{}}}],["herehttps://deno.land/x/deno_util",{"_index":382,"title":{},"content":{"46":{}}}],["hex",{"_index":913,"title":{},"content":{"61":{}}}],["hickman",{"_index":563,"title":{},"content":{"22":{},"23":{},"25":{}}}],["hickmanbeach@vidto.com",{"_index":568,"title":{},"content":{"22":{}}}],["hidden",{"_index":1067,"title":{},"content":{"28":{},"40":{}}}],["hidden=\"true\">×/graphql${body}

hello",{"_index":1122,"title":{},"content":{"32":{}}}],["id[rid",{"_index":1364,"title":{"79":{}},"content":{}}],["ie",{"_index":1666,"title":{},"content":{"72":{}}}],["imag",{"_index":1603,"title":{},"content":{"71":{},"72":{},"74":{}}}],["implecit",{"_index":1675,"title":{},"content":{"72":{}}}],["implement",{"_index":451,"title":{"8":{},"63":{}},"content":{"16":{},"57":{},"59":{},"62":{},"64":{},"75":{},"84":{}}}],["impli",{"_index":1328,"title":{},"content":{"38":{}}}],["implicitli",{"_index":1168,"title":{},"content":{"33":{},"71":{}}}],["import",{"_index":31,"title":{"3":{}},"content":{"3":{},"4":{},"5":{},"6":{},"11":{},"21":{},"23":{},"24":{},"25":{},"32":{},"33":{},"37":{},"38":{},"40":{},"43":{},"44":{},"46":{},"49":{},"60":{},"62":{},"64":{},"76":{},"85":{}}}],["imposs",{"_index":779,"title":{},"content":{"11":{},"83":{},"85":{}}}],["improv",{"_index":454,"title":{},"content":{"16":{}}}],["includ",{"_index":24,"title":{},"content":{"2":{},"28":{},"29":{},"33":{},"35":{},"38":{},"45":{}}}],["includedir",{"_index":350,"title":{},"content":{"45":{}}}],["includefil",{"_index":349,"title":{},"content":{"45":{}}}],["inconsist",{"_index":1333,"title":{},"content":{"38":{}}}],["increas",{"_index":1382,"title":{},"content":{"76":{},"81":{},"82":{}}}],["index",{"_index":549,"title":{},"content":{"22":{},"24":{},"37":{},"38":{},"40":{},"61":{}}}],["index.j",{"_index":1347,"title":{},"content":{"40":{}}}],["index.t",{"_index":619,"title":{},"content":{"23":{},"24":{}}}],["indexoflin",{"_index":1429,"title":{},"content":{"84":{}}}],["infin",{"_index":182,"title":{},"content":{"14":{}}}],["info",{"_index":274,"title":{},"content":{"21":{},"43":{},"58":{},"59":{},"64":{}}}],["info(...messag",{"_index":1009,"title":{},"content":{"64":{}}}],["info(format",{"_index":1029,"title":{},"content":{"64":{}}}],["inform",{"_index":236,"title":{"46":{}},"content":{"42":{}}}],["init",{"_index":98,"title":{"31":{}},"content":{"6":{},"23":{},"31":{},"35":{},"40":{}}}],["init(app",{"_index":633,"title":{},"content":{"23":{}}}],["initi",{"_index":1118,"title":{"40":{}},"content":{"32":{},"33":{},"35":{},"37":{},"38":{},"40":{}}}],["initialopt",{"_index":518,"title":{},"content":{"21":{},"64":{}}}],["input",{"_index":132,"title":{"13":{},"43":{},"75":{},"76":{}},"content":{"8":{},"12":{},"42":{},"44":{},"49":{},"76":{}}}],["insid",{"_index":1461,"title":{},"content":{"49":{}}}],["insist",{"_index":1456,"title":{},"content":{"49":{}}}],["inspir",{"_index":881,"title":{},"content":{"60":{}}}],["instal",{"_index":401,"title":{"52":{},"71":{}},"content":{"17":{},"20":{},"29":{},"31":{},"47":{},"52":{},"53":{},"57":{},"71":{}}}],["install/download",{"_index":1623,"title":{},"content":{"71":{}}}],["install/us",{"_index":656,"title":{},"content":{"24":{}}}],["instanc",{"_index":35,"title":{"4":{}},"content":{"5":{},"6":{},"23":{}}}],["instead",{"_index":718,"title":{},"content":{"8":{},"49":{},"64":{}}}],["int",{"_index":190,"title":{},"content":{"14":{},"24":{}}}],["integr",{"_index":447,"title":{"67":{}},"content":{"16":{},"20":{},"68":{}}}],["integrity=\"sha384",{"_index":1231,"title":{},"content":{"37":{},"40":{}}}],["intended/feas",{"_index":400,"title":{},"content":{"47":{}}}],["interact",{"_index":1250,"title":{},"content":{"37":{},"76":{}}}],["interfac",{"_index":112,"title":{},"content":{"6":{},"13":{},"22":{},"33":{},"37":{},"40":{},"45":{},"49":{},"53":{},"64":{}}}],["intermedi",{"_index":1602,"title":{},"content":{"70":{}}}],["intern",{"_index":1400,"title":{},"content":{"83":{}}}],["interoper",{"_index":1325,"title":{},"content":{"38":{}}}],["interpol",{"_index":926,"title":{},"content":{"61":{}}}],["intrinsicel",{"_index":1260,"title":{},"content":{"37":{}}}],["introduct",{"_index":2,"title":{"2":{},"16":{},"49":{},"60":{}},"content":{}}],["invalid",{"_index":616,"title":{},"content":{"23":{},"25":{}}}],["isact",{"_index":556,"title":{},"content":{"22":{},"24":{}}}],["isc",{"_index":1353,"title":{},"content":{"40":{}}}],["isdirectori",{"_index":335,"title":{},"content":{"44":{}}}],["isfil",{"_index":334,"title":{},"content":{"44":{}}}],["isol",{"_index":1674,"title":{},"content":{"72":{}}}],["isomorph",{"_index":1055,"title":{"28":{}},"content":{"29":{},"38":{},"41":{}}}],["issu",{"_index":208,"title":{"59":{}},"content":{"7":{},"49":{},"53":{},"62":{},"68":{},"71":{},"82":{}}}],["issymlink",{"_index":336,"title":{},"content":{"44":{}}}],["item",{"_index":1212,"title":{},"content":{"37":{},"38":{},"40":{}}}],["items.map((todo",{"_index":1216,"title":{},"content":{"37":{},"38":{},"40":{}}}],["items={array.from(todos.valu",{"_index":1211,"title":{},"content":{"37":{}}}],["items={todo",{"_index":1262,"title":{},"content":{"37":{},"40":{}}}],["iter",{"_index":1414,"title":{"84":{}},"content":{"76":{},"83":{},"84":{}}}],["j",{"_index":928,"title":{},"content":{"61":{}}}],["java",{"_index":840,"title":{},"content":{"57":{}}}],["javascript",{"_index":151,"title":{},"content":{"14":{},"29":{},"33":{},"51":{},"57":{},"58":{}}}],["javascript(also",{"_index":1080,"title":{},"content":{"29":{}}}],["jez",{"_index":1569,"title":{},"content":{"68":{}}}],["job",{"_index":1050,"title":{},"content":{"49":{},"64":{},"72":{}}}],["joke",{"_index":1611,"title":{},"content":{"71":{}}}],["jq",{"_index":710,"title":{"8":{}},"content":{"8":{},"11":{}}}],["js",{"_index":189,"title":{"58":{}},"content":{"14":{},"33":{},"38":{}}}],["json",{"_index":93,"title":{"6":{},"11":{}},"content":{"6":{},"8":{},"11":{},"20":{},"23":{},"24":{},"25":{},"35":{},"40":{},"82":{}}}],["json(tom.json",{"_index":806,"title":{},"content":{"11":{}}}],["json.parse(respons",{"_index":798,"title":{},"content":{"11":{}}}],["json.stringifi",{"_index":929,"title":{},"content":{"40":{},"61":{}}}],["json.stringify(address",{"_index":869,"title":{},"content":{"59":{}}}],["json.stringify(bodi",{"_index":106,"title":{},"content":{"6":{}}}],["json.stringify(person",{"_index":868,"title":{},"content":{"59":{}}}],["json.stringify(post",{"_index":1530,"title":{},"content":{"49":{}}}],["json.stringify(posts[postid",{"_index":1508,"title":{},"content":{"49":{}}}],["json.stringify(us",{"_index":1527,"title":{},"content":{"49":{}}}],["json.stringify(users[userid",{"_index":1479,"title":{},"content":{"49":{}}}],["jspm",{"_index":1136,"title":{},"content":{"33":{}}}],["jsx",{"_index":1143,"title":{},"content":{"33":{},"37":{}}}],["jsx(tsx",{"_index":1172,"title":{},"content":{"33":{}}}],["jsx.intrinsicel",{"_index":1169,"title":{},"content":{"33":{}}}],["juli",{"_index":773,"title":{},"content":{"11":{},"83":{},"85":{}}}],["jumbotron",{"_index":1201,"title":{},"content":{"37":{},"40":{}}}],["k",{"_index":812,"title":{},"content":{"11":{}}}],["keep",{"_index":5,"title":{},"content":{"2":{},"19":{},"66":{},"84":{}}}],["key",{"_index":745,"title":{},"content":{"11":{},"37":{}}}],["key.slice(!match[3",{"_index":757,"title":{},"content":{"11":{}}}],["key.substr(0",{"_index":755,"title":{},"content":{"11":{}}}],["key={index",{"_index":1218,"title":{},"content":{"37":{},"38":{},"40":{}}}],["keyword",{"_index":1350,"title":{},"content":{"40":{}}}],["know",{"_index":397,"title":{},"content":{"11":{},"27":{},"33":{},"46":{},"47":{},"64":{},"85":{}}}],["knowledg",{"_index":218,"title":{},"content":{"17":{},"42":{}}}],["known",{"_index":428,"title":{},"content":{"16":{},"29":{}}}],["label=\"clos",{"_index":1225,"title":{},"content":{"37":{},"38":{},"40":{}}}],["lang",{"_index":449,"title":{},"content":{"16":{}}}],["lang=\"en",{"_index":1112,"title":{},"content":{"32":{},"33":{},"37":{},"38":{},"40":{}}}],["languag",{"_index":738,"title":{"66":{}},"content":{"10":{},"56":{}}}],["larg",{"_index":1388,"title":{},"content":{"82":{}}}],["last",{"_index":377,"title":{},"content":{"46":{},"72":{},"83":{},"84":{}}}],["lastkey",{"_index":749,"title":{},"content":{"11":{}}}],["latest",{"_index":1643,"title":{},"content":{"71":{}}}],["lead",{"_index":1488,"title":{},"content":{"49":{}}}],["learn",{"_index":1065,"title":{},"content":{"28":{},"49":{},"75":{}}}],["less",{"_index":953,"title":{},"content":{"61":{}}}],["let",{"_index":1458,"title":{},"content":{"49":{},"68":{},"73":{}}}],["let'",{"_index":97,"title":{"63":{}},"content":{"6":{},"11":{},"20":{},"23":{},"24":{},"43":{},"44":{},"47":{},"49":{},"59":{},"62":{},"64":{},"70":{},"71":{},"72":{},"76":{},"78":{},"80":{},"84":{}}}],["let’",{"_index":1092,"title":{},"content":{"31":{},"33":{},"35":{},"37":{},"40":{}}}],["level",{"_index":519,"title":{},"content":{"21":{},"64":{}}}],["level(_l",{"_index":1000,"title":{},"content":{"64":{}}}],["li",{"_index":1217,"title":{},"content":{"37":{},"38":{},"40":{}}}],["lib",{"_index":1320,"title":{},"content":{"38":{}}}],["librari",{"_index":717,"title":{},"content":{"8":{},"29":{},"31":{},"37":{},"38":{},"49":{},"60":{},"62":{},"71":{},"78":{}}}],["licens",{"_index":1352,"title":{},"content":{"40":{}}}],["life",{"_index":968,"title":{},"content":{"62":{}}}],["lightest",{"_index":1599,"title":{},"content":{"70":{}}}],["limit",{"_index":698,"title":{"26":{}},"content":{"26":{},"59":{},"76":{}}}],["limit}]\\n",{"_index":1764,"title":{},"content":{"76":{}}}],["line",{"_index":135,"title":{"13":{},"78":{}},"content":{"12":{},"33":{},"47":{},"53":{},"56":{},"76":{},"78":{},"83":{},"84":{},"85":{}}}],["line(stream",{"_index":1363,"title":{},"content":{"78":{}}}],["line,rest",{"_index":1444,"title":{},"content":{"84":{}}}],["link",{"_index":1228,"title":{},"content":{"37":{},"40":{}}}],["linux",{"_index":1600,"title":{},"content":{"52":{},"70":{},"71":{}}}],["list",{"_index":916,"title":{"37":{}},"content":{"35":{},"37":{},"40":{},"61":{}}}],["list/array",{"_index":1500,"title":{},"content":{"49":{}}}],["listen",{"_index":36,"title":{"4":{}},"content":{}}],["listtodo",{"_index":1210,"title":{},"content":{"37":{},"38":{},"40":{}}}],["liter",{"_index":901,"title":{},"content":{"61":{}}}],["littl",{"_index":440,"title":{},"content":{"16":{},"84":{}}}],["live",{"_index":829,"title":{},"content":{"56":{}}}],["load",{"_index":1137,"title":{},"content":{"33":{}}}],["local",{"_index":825,"title":{},"content":{"54":{},"56":{}}}],["locat",{"_index":642,"title":{},"content":{"23":{},"25":{}}}],["log",{"_index":235,"title":{"46":{},"58":{},"62":{}},"content":{"42":{},"56":{},"57":{},"58":{},"64":{},"72":{},"74":{}}}],["log(...messag",{"_index":1007,"title":{},"content":{"64":{}}}],["log(format",{"_index":1025,"title":{},"content":{"64":{}}}],["logger",{"_index":233,"title":{"46":{},"56":{},"63":{},"64":{}},"content":{"21":{},"42":{},"45":{},"46":{},"49":{},"56":{},"62":{},"64":{},"75":{},"76":{}}}],["logger(initialopt",{"_index":522,"title":{},"content":{"21":{}}}],["logger.error",{"_index":1041,"title":{},"content":{"64":{}}}],["logger.error(\"thi",{"_index":1020,"title":{},"content":{"64":{}}}],["logger.error(`y",{"_index":1762,"title":{},"content":{"76":{}}}],["logger.format",{"_index":1047,"title":{},"content":{"64":{}}}],["logger.info(\"/%s:\\t%",{"_index":1546,"title":{},"content":{"49":{}}}],["logger.info(\"1.0.1",{"_index":1048,"title":{},"content":{"64":{}}}],["logger.info(\"1.0.2",{"_index":1049,"title":{},"content":{"64":{}}}],["logger.info(\"lotteri",{"_index":1742,"title":{},"content":{"76":{}}}],["logger.info(\"thank",{"_index":1756,"title":{},"content":{"76":{}}}],["logger.info(\"thi",{"_index":1017,"title":{},"content":{"64":{}}}],["logger.info(\"too",{"_index":1768,"title":{},"content":{"76":{}}}],["logger.info(\"y",{"_index":1737,"title":{},"content":{"76":{}}}],["logger.info(`welcom",{"_index":388,"title":{},"content":{"46":{}}}],["logger.inverse(entry.path",{"_index":395,"title":{},"content":{"46":{}}}],["logger.level",{"_index":1046,"title":{},"content":{"64":{}}}],["logger.lin",{"_index":527,"title":{},"content":{"21":{}}}],["logger.log",{"_index":1036,"title":{},"content":{"64":{}}}],["logger.log(\"thi",{"_index":1016,"title":{},"content":{"64":{}}}],["logger.t",{"_index":1015,"title":{},"content":{"64":{}}}],["logger.warn(\"bingo",{"_index":1771,"title":{},"content":{"76":{}}}],["logger.warn(\"gener",{"_index":1765,"title":{},"content":{"76":{}}}],["logger.warn(\"guess",{"_index":1739,"title":{},"content":{"76":{}}}],["logger.warn(\"thi",{"_index":1018,"title":{},"content":{"64":{}}}],["logger.warn(`guess",{"_index":1754,"title":{},"content":{"76":{}}}],["logger.warn(usesformat",{"_index":391,"title":{},"content":{"46":{}}}],["loggeropt",{"_index":517,"title":{},"content":{"21":{},"64":{}}}],["logic",{"_index":303,"title":{},"content":{"44":{},"45":{},"49":{}}}],["loglevel",{"_index":989,"title":{},"content":{"64":{}}}],["london",{"_index":863,"title":{},"content":{"59":{}}}],["london\",\"zip\":20000",{"_index":872,"title":{},"content":{"59":{}}}],["long",{"_index":1667,"title":{},"content":{"72":{}}}],["look",{"_index":113,"title":{},"content":{"6":{},"11":{},"40":{},"60":{},"70":{},"83":{}}}],["loop",{"_index":78,"title":{},"content":{"5":{},"49":{},"76":{}}}],["lorem",{"_index":580,"title":{},"content":{"22":{}}}],["lose",{"_index":1281,"title":{},"content":{"38":{}}}],["lot",{"_index":452,"title":{},"content":{"16":{},"20":{},"26":{},"40":{}}}],["lotteri",{"_index":1724,"title":{"75":{}},"content":{"75":{},"76":{}}}],["lottery_game.t",{"_index":1728,"title":{},"content":{"76":{}}}],["low",{"_index":1770,"title":{},"content":{"76":{}}}],["ls",{"_index":1687,"title":{},"content":{"74":{}}}],["lucki",{"_index":1620,"title":{},"content":{"71":{},"76":{}}}],["mac/unix",{"_index":223,"title":{},"content":{"42":{}}}],["maco",{"_index":1704,"title":{},"content":{"52":{}}}],["magic",{"_index":1551,"title":{},"content":{"49":{}}}],["main",{"_index":143,"title":{},"content":{"7":{},"13":{},"14":{},"40":{},"49":{},"55":{},"76":{}}}],["main(arg",{"_index":244,"title":{},"content":{"43":{},"44":{},"45":{},"46":{}}}],["main(deno.arg",{"_index":246,"title":{},"content":{"43":{},"44":{},"45":{},"46":{}}}],["main(filenam",{"_index":1371,"title":{},"content":{"80":{},"81":{},"82":{},"83":{},"85":{}}}],["main(nam",{"_index":1368,"title":{},"content":{"80":{},"81":{},"82":{},"83":{},"85":{}}}],["mainli",{"_index":1587,"title":{},"content":{"51":{},"68":{}}}],["maintain",{"_index":1499,"title":{},"content":{"49":{}}}],["mainten",{"_index":1491,"title":{},"content":{"49":{}}}],["major",{"_index":1489,"title":{},"content":{"49":{}}}],["make",{"_index":1243,"title":{},"content":{"37":{},"38":{},"40":{},"76":{}}}],["male",{"_index":566,"title":{},"content":{"22":{}}}],["manag",{"_index":1498,"title":{},"content":{"49":{}}}],["mani",{"_index":505,"title":{},"content":{"20":{},"28":{},"49":{},"68":{}}}],["map",{"_index":714,"title":{},"content":{"8":{},"35":{},"40":{}}}],["map((resolv",{"_index":1419,"title":{},"content":{"84":{}}}],["prone",{"_index":859,"title":{},"content":{"59":{}}}],["prop",{"_index":1264,"title":{},"content":{"37":{},"38":{},"40":{}}}],["proper",{"_index":707,"title":{},"content":{"26":{}}}],["properti",{"_index":202,"title":{},"content":{"7":{}}}],["provid",{"_index":10,"title":{},"content":{"2":{},"10":{},"11":{},"16":{},"33":{},"38":{},"47":{},"49":{},"78":{},"79":{}}}],["ps",{"_index":1671,"title":{},"content":{"72":{},"74":{}}}],["publish",{"_index":1711,"title":{},"content":{"53":{}}}],["pull",{"_index":1598,"title":{},"content":{"70":{},"71":{}}}],["purpos",{"_index":540,"title":{},"content":{"22":{}}}],["pwd",{"_index":1657,"title":{},"content":{"72":{}}}],["pwd}/ssr:/app",{"_index":1685,"title":{},"content":{"73":{}}}],["q",{"_index":1751,"title":{},"content":{"76":{}}}],["qa",{"_index":491,"title":{},"content":{"20":{}}}],["queri",{"_index":601,"title":{"25":{}},"content":{"23":{},"24":{},"25":{}}}],["query\":\"queri",{"_index":645,"title":{},"content":{"23":{},"25":{}}}],["query/alias",{"_index":704,"title":{},"content":{"26":{}}}],["query;}function",{"_index":1161,"title":{},"content":{"33":{}}}],["ssr

documenttodo'",{"_index":1206,"title":{},"content":{"67":{},"70":{}}}],["400",{"_index":618,"title":{},"content":{"28":{},"30":{}}}],["4000",{"_index":523,"title":{},"content":{"16":{},"26":{}}}],["401",{"_index":571,"title":{},"content":{"27":{}}}],["404",{"_index":1189,"title":{},"content":{"65":{},"70":{},"84":{}}}],["42ac",{"_index":553,"title":{},"content":{"27":{}}}],["47.com/knowledg",{"_index":1074,"title":{},"content":{"58":{}}}],["489",{"_index":574,"title":{},"content":{"27":{}}}],["49",{"_index":985,"title":{},"content":{"17":{}}}],["5",{"_index":596,"title":{"28":{}},"content":{"16":{},"17":{},"39":{},"52":{},"84":{}}}],["5215187d3d6a",{"_index":1601,"title":{},"content":{"46":{}}}],["56",{"_index":768,"title":{},"content":{"38":{},"40":{},"57":{}}}],["58a5",{"_index":552,"title":{},"content":{"27":{}}}],["6",{"_index":649,"title":{"29":{}},"content":{"40":{},"52":{}}}],["6027d46771b8a91a27bc9e13",{"_index":548,"title":{},"content":{"27":{}}}],["7",{"_index":688,"title":{"30":{}},"content":{}}],["8",{"_index":632,"title":{},"content":{"16":{},"28":{},"62":{},"63":{},"67":{},"70":{}}}],["8.9f",{"_index":933,"title":{},"content":{"16":{}}}],["8.f",{"_index":934,"title":{},"content":{"16":{}}}],["8000",{"_index":1107,"title":{},"content":{"62":{},"63":{},"70":{}}}],["8080",{"_index":38,"title":{"80":{}},"content":{"80":{},"81":{},"82":{},"84":{}}}],["8080copi",{"_index":1678,"title":{},"content":{"48":{}}}],["8080entrypoint",{"_index":1684,"title":{},"content":{"49":{}}}],["8bit",{"_index":978,"title":{},"content":{"17":{}}}],["9",{"_index":932,"title":{},"content":{"16":{}}}],["9.2f\\n",{"_index":936,"title":{},"content":{"16":{}}}],["90",{"_index":1647,"title":{},"content":{"48":{}}}],["980",{"_index":570,"title":{},"content":{"27":{}}}],["9f",{"_index":931,"title":{},"content":{"16":{}}}],["_",{"_index":259,"title":{},"content":{"6":{},"7":{},"29":{}}}],["__initial_state__",{"_index":1342,"title":{},"content":{"70":{}}}],["_append",{"_index":1405,"title":{},"content":{"38":{}}}],["_append(a",{"_index":1406,"title":{},"content":{"38":{}}}],["_append(chunk",{"_index":1395,"title":{},"content":{"38":{}}}],["_f",{"_index":1003,"title":{},"content":{"19":{}}}],["_format",{"_index":994,"title":{},"content":{"19":{}}}],["_id",{"_index":547,"title":{},"content":{"27":{},"29":{}}}],["_l",{"_index":1001,"title":{},"content":{"19":{}}}],["_level",{"_index":993,"title":{},"content":{"19":{}}}],["_readtilldon",{"_index":1426,"title":{},"content":{"39":{}}}],["_readtilldone(file?.rid",{"_index":1437,"title":{},"content":{"39":{}}}],["_readtilldone(rid",{"_index":1433,"title":{},"content":{"39":{}}}],["a.length",{"_index":1410,"title":{},"content":{"38":{}}}],["abil",{"_index":1573,"title":{},"content":{"44":{}}}],["abov",{"_index":165,"title":{},"content":{"1":{},"6":{},"10":{},"13":{},"31":{},"46":{},"47":{},"65":{},"68":{},"70":{},"84":{}}}],["accept",{"_index":122,"title":{},"content":{"8":{},"28":{},"82":{}}}],["access",{"_index":89,"title":{},"content":{"26":{},"48":{},"57":{},"67":{},"81":{}}}],["accord",{"_index":885,"title":{"16":{}},"content":{"15":{},"59":{}}}],["accordingli",{"_index":1466,"title":{},"content":{"84":{}}}],["accumul",{"_index":687,"title":{},"content":{"29":{}}}],["achiev",{"_index":1481,"title":{},"content":{"84":{}}}],["act",{"_index":655,"title":{},"content":{"29":{}}}],["actor",{"_index":765,"title":{},"content":{"36":{},"38":{},"40":{},"57":{}}}],["actor.movies[1",{"_index":814,"title":{},"content":{"57":{}}}],["actor.nam",{"_index":810,"title":{},"content":{"57":{}}}],["actual",{"_index":792,"title":{},"content":{"33":{},"37":{},"57":{},"75":{}}}],["ad",{"_index":963,"title":{"65":{},"68":{}},"content":{"17":{},"19":{},"40":{},"65":{},"67":{},"68":{},"84":{}}}],["add",{"_index":257,"title":{"63":{},"67":{}},"content":{"6":{},"7":{},"8":{},"9":{},"10":{},"19":{},"25":{},"46":{},"47":{},"48":{},"49":{},"52":{},"62":{},"63":{},"65":{},"67":{},"68":{},"84":{}}}],["addit",{"_index":964,"title":{},"content":{"17":{}}}],["address",{"_index":573,"title":{},"content":{"14":{},"27":{},"29":{}}}],["address.street",{"_index":875,"title":{},"content":{"14":{}}}],["advanc",{"_index":426,"title":{"20":{}},"content":{"51":{},"84":{}}}],["afraid",{"_index":1090,"title":{},"content":{"61":{}}}],["ag",{"_index":561,"title":{},"content":{"27":{},"29":{},"30":{},"38":{},"40":{},"57":{}}}],["again",{"_index":1164,"title":{},"content":{"52":{},"63":{},"68":{},"84":{}}}],["age\\n",{"_index":696,"title":{},"content":{"30":{}}}],["ago",{"_index":1689,"title":{},"content":{"50":{}}}],["alia",{"_index":60,"title":{"75":{}},"content":{"75":{},"81":{}}}],["allow",{"_index":53,"title":{},"content":{"7":{},"10":{},"19":{},"25":{},"26":{},"35":{},"36":{},"37":{},"38":{},"40":{},"44":{},"45":{},"47":{},"48":{},"49":{},"62":{},"63":{},"68":{},"70":{},"81":{},"82":{}}}],["allowsyntheticdefaultimport",{"_index":1329,"title":{},"content":{"68":{}}}],["along",{"_index":341,"title":{},"content":{"7":{},"47":{}}}],["alpin",{"_index":1595,"title":{},"content":{"46":{},"47":{}}}],["alreadi",{"_index":427,"title":{},"content":{"21":{}}}],["amd",{"_index":1318,"title":{},"content":{"68":{}}}],["anger",{"_index":961,"title":{},"content":{"17":{}}}],["anoth",{"_index":215,"title":{},"content":{"5":{},"17":{},"52":{},"57":{},"84":{}}}],["answer",{"_index":1280,"title":{},"content":{"68":{}}}],["any).hydr",{"_index":1343,"title":{},"content":{"70":{}}}],["any).hydrate(pleas",{"_index":626,"title":{},"content":{"28":{}}}],["backend",{"_index":511,"title":{"62":{},"65":{}},"content":{"26":{}}}],["background",{"_index":976,"title":{},"content":{"17":{}}}],["bad",{"_index":1076,"title":{},"content":{"58":{}}}],["baker",{"_index":862,"title":{},"content":{"14":{}}}],["balanc",{"_index":557,"title":{},"content":{"27":{},"29":{}}}],["bankruptci",{"_index":1619,"title":{},"content":{"47":{}}}],["base",{"_index":232,"title":{"8":{}},"content":{"5":{},"6":{},"7":{},"27":{},"29":{},"46":{},"57":{}}}],["base/webpack",{"_index":1075,"title":{},"content":{"58":{}}}],["baserout",{"_index":624,"title":{},"content":{"28":{}}}],["baseroute.get",{"_index":625,"title":{},"content":{"28":{}}}],["bash_profil",{"_index":1718,"title":{},"content":{"75":{}}}],["bash_profile(depend",{"_index":406,"title":{},"content":{"10":{}}}],["bashrc",{"_index":405,"title":{},"content":{"10":{}}}],["basic",{"_index":450,"title":{"18":{},"19":{},"24":{},"26":{},"27":{},"39":{}},"content":{"11":{},"12":{},"17":{},"19":{},"21":{},"22":{},"25":{},"26":{},"27":{},"29":{},"45":{},"57":{},"62":{},"67":{},"84":{}}}],["be",{"_index":316,"title":{},"content":{"7":{},"84":{}}}],["beach",{"_index":564,"title":{},"content":{"27":{},"30":{}}}],["becom",{"_index":283,"title":{},"content":{"6":{}}}],["becuas",{"_index":1673,"title":{},"content":{"48":{}}}],["befor",{"_index":1022,"title":{},"content":{"19":{},"33":{},"44":{},"50":{},"67":{},"68":{},"84":{}}}],["begin",{"_index":456,"title":{},"content":{"21":{}}}],["behav",{"_index":156,"title":{},"content":{"1":{}}}],["behavior",{"_index":367,"title":{},"content":{"8":{},"67":{}}}],["believ",{"_index":1083,"title":{},"content":{"59":{}}}],["bellow",{"_index":1642,"title":{},"content":{"47":{}}}],["below",{"_index":114,"title":{},"content":{"1":{},"5":{},"10":{},"16":{},"24":{},"31":{},"45":{},"46":{},"57":{},"62":{},"63":{},"67":{},"68":{},"70":{},"82":{}}}],["best",{"_index":823,"title":{},"content":{"11":{}}}],["beta",{"_index":1709,"title":{},"content":{"74":{}}}],["beta.16/cli.tscl",{"_index":495,"title":{},"content":{"25":{}}}],["better",{"_index":234,"title":{"9":{}},"content":{"5":{},"47":{}}}],["between",{"_index":433,"title":{},"content":{"21":{},"68":{},"84":{}}}],["bgrgb8",{"_index":974,"title":{},"content":{"17":{}}}],["bgrgb8(str",{"_index":981,"title":{},"content":{"17":{}}}],["big",{"_index":837,"title":{},"content":{"12":{},"37":{}}}],["bin",{"_index":1640,"title":{},"content":{"47":{}}}],["bin/deno",{"_index":1629,"title":{},"content":{"47":{},"48":{}}}],["bin/denoworkdir",{"_index":1683,"title":{},"content":{"49":{}}}],["binari",{"_index":906,"title":{},"content":{"16":{},"44":{},"47":{}}}],["bind",{"_index":542,"title":{},"content":{"27":{},"48":{}}}],["birthdat",{"_index":772,"title":{},"content":{"38":{},"40":{},"57":{}}}],["bit",{"_index":980,"title":{},"content":{"17":{}}}],["block",{"_index":1616,"title":{},"content":{"47":{}}}],["blog",{"_index":1181,"title":{},"content":{"44":{},"52":{},"65":{},"70":{}}}],["bodi",{"_index":49,"title":{},"content":{"62":{},"63":{},"65":{},"67":{},"68":{},"70":{},"81":{},"82":{},"84":{}}}],["body.typ",{"_index":1191,"title":{},"content":{"65":{},"70":{}}}],["body.valu",{"_index":1192,"title":{},"content":{"65":{},"70":{}}}],["bonu",{"_index":398,"title":{"10":{},"49":{}},"content":{"84":{}}}],["boolean",{"_index":284,"title":{},"content":{"6":{},"8":{},"16":{},"27":{},"29":{},"39":{}}}],["bootstrap",{"_index":1242,"title":{},"content":{"67":{}}}],["born",{"_index":769,"title":{},"content":{"38":{},"40":{},"57":{}}}],["both",{"_index":364,"title":{},"content":{"8":{},"48":{},"59":{}}}],["box",{"_index":962,"title":{},"content":{"17":{},"39":{},"84":{}}}],["break",{"_index":754,"title":{},"content":{"44":{},"57":{},"84":{}}}],["breakdown",{"_index":71,"title":{},"content":{"38":{},"39":{},"52":{},"81":{},"82":{},"84":{}}}],["brew",{"_index":1706,"title":{},"content":{"73":{}}}],["brief",{"_index":1557,"title":{},"content":{"44":{}}}],["britney",{"_index":1472,"title":{},"content":{"84":{}}}],["browser",{"_index":13,"title":{},"content":{"17":{},"45":{},"48":{},"63":{},"67":{},"78":{},"81":{},"82":{},"84":{}}}],["buf",{"_index":1374,"title":{},"content":{"36":{},"37":{},"38":{},"39":{}}}],["buf).then",{"_index":1398,"title":{},"content":{"38":{}}}],["buf).then(funct",{"_index":1393,"title":{},"content":{"38":{}}}],["buf).then(readbyt",{"_index":1396,"title":{},"content":{"38":{}}}],["buff",{"_index":1383,"title":{},"content":{"36":{}}}],["buffer",{"_index":739,"title":{},"content":{"36":{},"37":{},"39":{},"56":{}}}],["bug",{"_index":1575,"title":{},"content":{"44":{}}}],["build",{"_index":87,"title":{"5":{},"11":{},"20":{},"58":{}},"content":{"11":{},"21":{},"25":{},"26":{},"44":{},"46":{},"47":{},"48":{},"49":{},"51":{},"59":{},"65":{},"70":{},"81":{},"84":{}}}],["buildschema",{"_index":652,"title":{},"content":{"29":{}}}],["buildschema([bas",{"_index":664,"title":{},"content":{"29":{}}}],["built",{"_index":1698,"title":{},"content":{"72":{}}}],["bundl",{"_index":1288,"title":{},"content":{"68":{},"70":{}}}],["bundler",{"_index":1086,"title":{},"content":{"59":{}}}],["busi",{"_index":1487,"title":{},"content":{"84":{}}}],["button",{"_index":1220,"title":{},"content":{"67":{},"68":{},"70":{}}}],["buxton",{"_index":577,"title":{},"content":{"27":{}}}],["byte",{"_index":109,"title":{},"content":{"16":{},"36":{},"52":{},"82":{}}}],["c",{"_index":801,"title":{},"content":{"12":{},"16":{},"38":{},"45":{},"48":{},"49":{},"57":{},"68":{},"70":{}}}],["c.set(a",{"_index":1408,"title":{},"content":{"38":{}}}],["c.set(b.slice(0",{"_index":1409,"title":{},"content":{"38":{}}}],["call",{"_index":654,"title":{},"content":{"29":{},"36":{},"38":{},"39":{},"52":{},"84":{}}}],["callback",{"_index":603,"title":{},"content":{"28":{}}}],["can't",{"_index":853,"title":{},"content":{"13":{},"84":{}}}],["canda",{"_index":575,"title":{},"content":{"27":{}}}],["cant",{"_index":203,"title":{},"content":{"4":{},"48":{}}}],["capabl",{"_index":1282,"title":{},"content":{"68":{}}}],["case",{"_index":1256,"title":{},"content":{"67":{},"68":{},"84":{}}}],["cast",{"_index":171,"title":{},"content":{"1":{}}}],["cat",{"_index":728,"title":{},"content":{"55":{}}}],["catch",{"_index":799,"title":{},"content":{"57":{},"62":{},"63":{},"68":{},"70":{},"84":{}}}],["caus",{"_index":1635,"title":{},"content":{"47":{}}}],["cd",{"_index":1097,"title":{},"content":{"45":{},"61":{}}}],["cdn",{"_index":1132,"title":{},"content":{"63":{}}}],["cdn.skypack.dev",{"_index":657,"title":{},"content":{"29":{}}}],["chanc",{"_index":1069,"title":{},"content":{"58":{}}}],["chang",{"_index":204,"title":{},"content":{"4":{},"19":{},"44":{},"63":{},"67":{},"68":{},"70":{}}}],["char",{"_index":1727,"title":{},"content":{"52":{}}}],["charact",{"_index":907,"title":{},"content":{"16":{}}}],["charset=\"utf",{"_index":1115,"title":{},"content":{"62":{},"63":{},"67":{},"70":{}}}],["charset=utf",{"_index":631,"title":{},"content":{"28":{}}}],["check",{"_index":489,"title":{},"content":{"25":{},"38":{},"44":{},"47":{},"52":{},"68":{},"70":{}}}],["checkout",{"_index":1592,"title":{},"content":{"45":{}}}],["cheer",{"_index":1723,"title":{},"content":{"42":{}}}],["chuck",{"_index":1613,"title":{},"content":{"47":{}}}],["chucknorri",{"_index":1597,"title":{},"content":{"46":{},"47":{}}}],["chunk",{"_index":1372,"title":{},"content":{"35":{},"37":{},"38":{}}}],["ci",{"_index":1560,"title":{},"content":{"44":{}}}],["cicd",{"_index":1556,"title":{},"content":{"44":{}}}],["citi",{"_index":1617,"title":{},"content":{"47":{}}}],["clampandtruncate(color",{"_index":984,"title":{},"content":{"17":{}}}],["clap",{"_index":418,"title":{},"content":{"10":{},"19":{},"32":{},"40":{},"49":{},"52":{},"57":{},"71":{},"84":{}}}],["class",{"_index":987,"title":{"19":{}},"content":{"19":{}}}],["classname=\"contain",{"_index":1203,"title":{},"content":{"67":{},"70":{}}}],["classname=\"display",{"_index":1205,"title":{},"content":{"67":{},"70":{}}}],["classname=\"jumbotron",{"_index":1200,"title":{},"content":{"67":{},"70":{}}}],["classname=\"lead\">thi",{"_index":1208,"title":{},"content":{"67":{},"70":{}}}],["classname=\"list",{"_index":1214,"title":{},"content":{"67":{},"68":{},"70":{}}}],["classname=\"ml",{"_index":1222,"title":{},"content":{"67":{},"68":{},"70":{}}}],["clean",{"_index":1518,"title":{},"content":{"52":{},"84":{}}}],["cli",{"_index":129,"title":{"2":{},"5":{}},"content":{"5":{},"6":{},"9":{},"10":{},"51":{},"57":{},"68":{}}}],["click",{"_index":1276,"title":{},"content":{"68":{}}}],["client",{"_index":25,"title":{"66":{},"68":{}},"content":{"47":{},"59":{},"68":{},"78":{},"81":{}}}],["client.tsx",{"_index":1290,"title":{},"content":{"68":{},"70":{}}}],["clientj",{"_index":1294,"title":{},"content":{"68":{},"70":{}}}],["clone",{"_index":222,"title":{},"content":{"5":{}}}],["close",{"_index":543,"title":{},"content":{"27":{},"67":{},"68":{},"70":{}}}],["cmd",{"_index":500,"title":{},"content":{"25":{},"47":{},"49":{}}}],["code",{"_index":356,"title":{"32":{},"40":{}},"content":{"8":{},"9":{},"11":{},"19":{},"21":{},"24":{},"28":{},"29":{},"33":{},"38":{},"42":{},"44":{},"50":{},"52":{},"57":{},"62":{},"63":{},"65":{},"67":{},"68":{},"70":{},"74":{},"84":{}}}],["code([48",{"_index":983,"title":{},"content":{"17":{}}}],["codepoint",{"_index":909,"title":{},"content":{"16":{}}}],["collect",{"_index":256,"title":{},"content":{"6":{}}}],["color",{"_index":816,"title":{"11":{},"17":{}},"content":{"16":{},"17":{},"19":{},"52":{},"68":{},"70":{}}}],["combin",{"_index":277,"title":{},"content":{"6":{},"15":{},"28":{}}}],["come",{"_index":1062,"title":{},"content":{"58":{}}}],["comma",{"_index":857,"title":{},"content":{"13":{}}}],["commad",{"_index":1682,"title":{},"content":{"49":{}}}],["command",{"_index":58,"title":{"3":{},"6":{},"50":{}},"content":{"2":{},"5":{},"10":{},"25":{},"44":{},"46":{},"47":{},"48":{},"49":{},"62":{},"74":{},"81":{}}}],["command);}async",{"_index":392,"title":{},"content":{"9":{}}}],["comment",{"_index":415,"title":{},"content":{"10":{},"19":{},"32":{},"40":{},"57":{}}}],["common",{"_index":1146,"title":{},"content":{"63":{}}}],["commonj",{"_index":1316,"title":{},"content":{"68":{}}}],["commun",{"_index":438,"title":{},"content":{"21":{},"25":{},"26":{},"31":{}}}],["compat",{"_index":14,"title":{},"content":{"78":{}}}],["compil",{"_index":502,"title":{},"content":{"25":{},"29":{},"47":{},"63":{},"68":{}}}],["compileropt",{"_index":1304,"title":{},"content":{"68":{}}}],["complet",{"_index":791,"title":{},"content":{"36":{},"39":{},"48":{},"57":{},"84":{}}}],["complex",{"_index":938,"title":{},"content":{"16":{},"39":{},"84":{}}}],["compon",{"_index":1263,"title":{},"content":{"67":{}}}],["concept",{"_index":1555,"title":{},"content":{"44":{}}}],["concern",{"_index":1490,"title":{},"content":{"84":{}}}],["config",{"_index":515,"title":{},"content":{"26":{}}}],["configur",{"_index":1068,"title":{},"content":{"44":{},"58":{}}}],["conflict",{"_index":706,"title":{},"content":{"31":{}}}],["congrat",{"_index":697,"title":{},"content":{"30":{}}}],["connect",{"_index":77,"title":{},"content":{"81":{}}}],["consid",{"_index":280,"title":{},"content":{"6":{}}}],["consist",{"_index":1585,"title":{},"content":{"44":{}}}],["consol",{"_index":1165,"title":{},"content":{"63":{}}}],["console.error(error",{"_index":1124,"title":{},"content":{"62":{},"63":{},"68":{},"70":{}}}],["console.log",{"_index":262,"title":{},"content":{"6":{},"12":{},"13":{},"14":{},"17":{},"84":{}}}],["console.log(\"hello",{"_index":836,"title":{},"content":{"12":{}}}],["console.log(\"person",{"_index":866,"title":{},"content":{"14":{}}}],["console.log(\"serv",{"_index":1105,"title":{},"content":{"62":{},"63":{},"70":{}}}],["console.log(\"y",{"_index":1736,"title":{},"content":{"52":{}}}],["console.log(1.2",{"_index":184,"title":{},"content":{"1":{}}}],["console.log(_",{"_index":299,"title":{},"content":{"6":{}}}],["console.log(`hello",{"_index":144,"title":{},"content":{"3":{},"76":{}}}],["console.log(`info",{"_index":851,"title":{},"content":{"13":{}}}],["console.log(`mi",{"_index":845,"title":{},"content":{"13":{}}}],["console.log(`your",{"_index":43,"title":{},"content":{"81":{}}}],["console.log(arg",{"_index":245,"title":{},"content":{"6":{}}}],["console.log(const",{"_index":199,"title":{},"content":{"4":{}}}],["console.log(data",{"_index":1730,"title":{},"content":{"52":{}}}],["console.log(decoder.decode(buf",{"_index":1379,"title":{},"content":{"36":{},"37":{}}}],["console.log(decoder.decode(chunk",{"_index":1397,"title":{},"content":{"38":{}}}],["console.log(dir",{"_index":300,"title":{},"content":{"6":{}}}],["console.log(dirfullpath",{"_index":311,"title":{},"content":{"7":{}}}],["console.log(entri",{"_index":330,"title":{},"content":{"7":{}}}],["console.log(entry.path",{"_index":361,"title":{},"content":{"8":{}}}],["console.log(fil",{"_index":1370,"title":{},"content":{"35":{}}}],["console.log(flt",{"_index":175,"title":{},"content":{"1":{}}}],["console.log(json.stringify(obj",{"_index":784,"title":{},"content":{"57":{}}}],["console.log(lin",{"_index":1454,"title":{},"content":{"40":{}}}],["console.log(nan",{"_index":183,"title":{},"content":{"1":{}}}],["console.log(num3",{"_index":168,"title":{},"content":{"1":{}}}],["console.log(numofbyteread",{"_index":1378,"title":{},"content":{"36":{},"37":{}}}],["console.log(pars",{"_index":286,"title":{},"content":{"6":{}}}],["console.log(respons",{"_index":743,"title":{},"content":{"56":{},"57":{}}}],["console.log(safeeval(\"actor.movies[2",{"_index":789,"title":{},"content":{"57":{}}}],["console.log(safeeval(\"contributor",{"_index":787,"title":{},"content":{"57":{}}}],["console.log(safeeval(\"contributors[1",{"_index":788,"title":{},"content":{"57":{}}}],["console.log(safeeval(\"id",{"_index":786,"title":{},"content":{"57":{}}}],["console.log(safeeval(key",{"_index":797,"title":{},"content":{"57":{}}}],["console.log(stdincont",{"_index":737,"title":{},"content":{"56":{}}}],["console.log(typeof",{"_index":179,"title":{},"content":{"1":{}}}],["console.log(valu",{"_index":1423,"title":{},"content":{"39":{},"40":{}}}],["const",{"_index":39,"title":{},"content":{"1":{},"3":{},"4":{},"6":{},"7":{},"8":{},"9":{},"13":{},"14":{},"15":{},"16":{},"19":{},"26":{},"27":{},"28":{},"29":{},"30":{},"35":{},"36":{},"37":{},"38":{},"39":{},"40":{},"52":{},"56":{},"57":{},"62":{},"63":{},"65":{},"67":{},"68":{},"70":{},"80":{},"81":{},"82":{},"84":{}}}],["constant",{"_index":197,"title":{"4":{}},"content":{"4":{}}}],["constant/vari",{"_index":846,"title":{},"content":{"13":{}}}],["constructor",{"_index":990,"title":{},"content":{"19":{}}}],["constructor(opt",{"_index":995,"title":{},"content":{"19":{}}}],["consum",{"_index":1198,"title":{},"content":{"67":{}}}],["contain",{"_index":478,"title":{},"content":{"24":{},"28":{},"29":{},"34":{},"46":{},"48":{},"50":{},"67":{}}}],["content",{"_index":643,"title":{},"content":{"28":{},"30":{},"67":{},"72":{}}}],["content=\"width=devic",{"_index":1117,"title":{},"content":{"62":{},"63":{},"67":{},"70":{}}}],["context",{"_index":609,"title":{},"content":{"28":{},"29":{},"30":{},"48":{},"65":{},"68":{},"70":{}}}],["context.param",{"_index":1185,"title":{},"content":{"65":{},"70":{}}}],["context.params.id",{"_index":1186,"title":{},"content":{"65":{},"70":{}}}],["context.request",{"_index":691,"title":{},"content":{"30":{}}}],["context.request.bodi",{"_index":613,"title":{},"content":{"28":{},"30":{},"65":{},"70":{}}}],["context.respons",{"_index":692,"title":{},"content":{"30":{}}}],["context.response.bodi",{"_index":610,"title":{},"content":{"28":{},"30":{},"65":{},"68":{},"70":{}}}],["context.response.headers.append(\"cont",{"_index":629,"title":{},"content":{"28":{}}}],["context.response.headers.set(\"cont",{"_index":1298,"title":{},"content":{"68":{},"70":{}}}],["context.response.statu",{"_index":617,"title":{},"content":{"28":{},"30":{},"65":{},"70":{}}}],["continu",{"_index":1553,"title":{"43":{}},"content":{"44":{},"52":{}}}],["contributor",{"_index":763,"title":{},"content":{"36":{},"38":{},"40":{},"57":{}}}],["control",{"_index":1023,"title":{"65":{}},"content":{"19":{},"84":{}}}],["controller/handl",{"_index":1492,"title":{},"content":{"84":{}}}],["controllers.t",{"_index":1519,"title":{},"content":{"84":{}}}],["convers",{"_index":944,"title":{},"content":{"16":{}}}],["convert",{"_index":319,"title":{},"content":{"7":{},"10":{},"14":{},"52":{},"56":{},"68":{}}}],["cool",{"_index":507,"title":{"11":{}},"content":{"11":{},"13":{},"25":{},"52":{},"68":{},"84":{}}}],["copi",{"_index":1641,"title":{},"content":{"47":{},"48":{},"49":{},"72":{}}}],["coppi",{"_index":1654,"title":{},"content":{"48":{}}}],["core",{"_index":731,"title":{},"content":{"56":{},"65":{}}}],["corr",{"_index":908,"title":{},"content":{"16":{}}}],["correspond",{"_index":1265,"title":{},"content":{"67":{}}}],["coupl",{"_index":432,"title":{},"content":{"21":{}}}],["cp",{"_index":1659,"title":{},"content":{"48":{}}}],["creat",{"_index":29,"title":{"19":{},"28":{},"29":{},"45":{},"46":{},"55":{},"65":{},"75":{},"80":{},"81":{},"83":{}},"content":{"3":{},"4":{},"5":{},"9":{},"13":{},"19":{},"24":{},"26":{},"27":{},"28":{},"29":{},"30":{},"37":{},"39":{},"42":{},"45":{},"46":{},"51":{},"54":{},"57":{},"61":{},"62":{},"63":{},"65":{},"67":{},"68":{},"78":{},"81":{},"82":{},"84":{}}}],["creation",{"_index":1327,"title":{},"content":{"68":{}}}],["cross",{"_index":1277,"title":{},"content":{"68":{}}}],["crossorigin=\"anonym",{"_index":1233,"title":{},"content":{"67":{},"70":{}}}],["cruis",{"_index":767,"title":{},"content":{"38":{},"40":{},"57":{}}}],["cruise.jpg",{"_index":783,"title":{},"content":{"38":{},"40":{},"57":{}}}],["css",{"_index":965,"title":{},"content":{"17":{},"67":{}}}],["ctx.response.bodi",{"_index":1109,"title":{},"content":{"62":{},"63":{},"67":{},"68":{},"70":{}}}],["curl",{"_index":641,"title":{},"content":{"28":{},"30":{},"47":{},"48":{},"49":{},"57":{},"67":{},"73":{}}}],["curl\"]cmd",{"_index":1609,"title":{},"content":{"47":{}}}],["curlentrypoint",{"_index":1608,"title":{},"content":{"47":{}}}],["current",{"_index":318,"title":{},"content":{"7":{},"25":{},"26":{},"28":{},"29":{},"39":{},"58":{},"84":{}}}],["curv",{"_index":1066,"title":{},"content":{"58":{}}}],["custom",{"_index":1302,"title":{},"content":{"68":{}}}],["cxt.response.bodi",{"_index":526,"title":{},"content":{"26":{}}}],["cyan",{"_index":971,"title":{},"content":{"17":{},"19":{},"52":{}}}],["cycl",{"_index":1582,"title":{},"content":{"44":{}}}],["d",{"_index":267,"title":{},"content":{"6":{},"8":{},"14":{},"16":{},"29":{},"39":{},"48":{},"49":{},"57":{}}}],["d\\n",{"_index":897,"title":{},"content":{"15":{},"16":{},"52":{}}}],["daili",{"_index":1583,"title":{},"content":{"44":{}}}],["data",{"_index":296,"title":{"33":{}},"content":{"6":{},"21":{},"28":{},"30":{},"35":{},"52":{},"54":{},"55":{},"56":{},"65":{},"67":{},"70":{},"84":{}}}],["data.error",{"_index":693,"title":{},"content":{"30":{}}}],["databas",{"_index":539,"title":{"27":{}},"content":{"27":{},"67":{}}}],["database.t",{"_index":545,"title":{},"content":{"27":{}}}],["database/model",{"_index":481,"title":{},"content":{"24":{}}}],["date().toisostr",{"_index":1549,"title":{},"content":{"84":{}}}],["date.now",{"_index":1180,"title":{},"content":{"65":{},"70":{}}}],["day",{"_index":1564,"title":{},"content":{"44":{},"47":{}}}],["de",{"_index":272,"title":{},"content":{"6":{}}}],["debug",{"_index":822,"title":{},"content":{"11":{},"44":{}}}],["decim",{"_index":920,"title":{},"content":{"16":{}}}],["declar",{"_index":166,"title":{},"content":{"1":{},"67":{},"68":{},"70":{}}}],["decod",{"_index":1373,"title":{},"content":{"36":{},"37":{},"38":{}}}],["decoder.decod",{"_index":1402,"title":{},"content":{"38":{}}}],["decoder.decode(buf.slice(0",{"_index":1432,"title":{},"content":{"39":{}}}],["decoupl",{"_index":1650,"title":{},"content":{"48":{}}}],["deepak",{"_index":146,"title":{},"content":{"3":{},"4":{},"13":{},"14":{},"15":{},"16":{},"36":{},"38":{},"40":{},"57":{},"84":{}}}],["default",{"_index":12,"title":{},"content":{"6":{},"8":{},"16":{},"19":{},"28":{},"29":{},"30":{},"47":{},"67":{},"68":{},"70":{},"78":{},"81":{},"82":{},"84":{}}}],["defer>hello",{"_index":1160,"title":{},"content":{"63":{}}}],["haha",{"_index":1776,"title":{},"content":{"52":{}}}],["hand",{"_index":1578,"title":{},"content":{"44":{}}}],["handl",{"_index":598,"title":{"28":{},"30":{}},"content":{"30":{},"31":{},"84":{}}}],["handlepag",{"_index":1102,"title":{},"content":{"62":{},"63":{},"65":{},"70":{}}}],["handlepage(ctx",{"_index":1108,"title":{},"content":{"62":{},"63":{},"67":{},"68":{},"70":{}}}],["handlepost",{"_index":1504,"title":{},"content":{"84":{}}}],["handleposts(req",{"_index":1505,"title":{},"content":{"84":{}}}],["handler",{"_index":41,"title":{"81":{}},"content":{"84":{}}}],["handler[staticfil",{"_index":1536,"title":{},"content":{"84":{}}}],["handleus",{"_index":1497,"title":{},"content":{"84":{}}}],["handleusers(req",{"_index":1494,"title":{},"content":{"84":{}}}],["hard",{"_index":847,"title":{},"content":{"13":{},"37":{},"84":{}}}],["harder",{"_index":1777,"title":{},"content":{"52":{}}}],["have't",{"_index":63,"title":{},"content":{"81":{}}}],["head",{"_index":1113,"title":{},"content":{"62":{},"63":{},"67":{},"70":{}}}],["header",{"_index":94,"title":{},"content":{"28":{},"30":{},"67":{},"82":{}}}],["hello",{"_index":0,"title":{"64":{},"76":{},"77":{}},"content":{"3":{},"25":{},"26":{},"28":{},"29":{},"46":{},"63":{},"81":{},"82":{},"84":{}}}],["hello.t",{"_index":685,"title":{},"content":{"29":{}}}],["hello_world.t",{"_index":681,"title":{},"content":{"29":{}}}],["helloresolv",{"_index":672,"title":{},"content":{"29":{}}}],["helloworld",{"_index":646,"title":{},"content":{"28":{}}}],["help",{"_index":251,"title":{},"content":{"6":{},"7":{},"9":{},"21":{},"52":{},"75":{}}}],["helper",{"_index":653,"title":{},"content":{"29":{}}}],["here",{"_index":85,"title":{},"content":{"1":{},"6":{},"7":{},"11":{},"14":{},"17":{},"24":{},"33":{},"36":{},"37":{},"38":{},"39":{},"40":{},"45":{},"46":{},"52":{},"54":{},"55":{},"57":{},"62":{},"65":{},"67":{},"68":{},"70":{},"81":{},"84":{}}}],["herehttps://deno.land/x/deno_util",{"_index":382,"title":{},"content":{"9":{}}}],["hex",{"_index":913,"title":{},"content":{"16":{}}}],["hickman",{"_index":563,"title":{},"content":{"27":{},"28":{},"30":{}}}],["hickmanbeach@vidto.com",{"_index":568,"title":{},"content":{"27":{}}}],["hidden",{"_index":1067,"title":{},"content":{"58":{},"70":{}}}],["hidden=\"true\">×/graphql${body}

hello",{"_index":1122,"title":{},"content":{"62":{}}}],["id[rid",{"_index":1364,"title":{"34":{}},"content":{}}],["ie",{"_index":1666,"title":{},"content":{"48":{}}}],["imag",{"_index":1603,"title":{},"content":{"47":{},"48":{},"50":{}}}],["implecit",{"_index":1675,"title":{},"content":{"48":{}}}],["implement",{"_index":451,"title":{"18":{},"54":{}},"content":{"12":{},"14":{},"17":{},"19":{},"21":{},"39":{},"51":{}}}],["impli",{"_index":1328,"title":{},"content":{"68":{}}}],["implicitli",{"_index":1168,"title":{},"content":{"47":{},"63":{}}}],["import",{"_index":31,"title":{"79":{}},"content":{"6":{},"7":{},"9":{},"15":{},"17":{},"19":{},"26":{},"28":{},"29":{},"30":{},"40":{},"52":{},"57":{},"62":{},"63":{},"67":{},"68":{},"70":{},"79":{},"80":{},"81":{},"82":{},"84":{}}}],["imposs",{"_index":779,"title":{},"content":{"38":{},"40":{},"57":{}}}],["improv",{"_index":454,"title":{},"content":{"21":{}}}],["includ",{"_index":24,"title":{},"content":{"8":{},"58":{},"59":{},"63":{},"65":{},"68":{},"78":{}}}],["includedir",{"_index":350,"title":{},"content":{"8":{}}}],["includefil",{"_index":349,"title":{},"content":{"8":{}}}],["inconsist",{"_index":1333,"title":{},"content":{"68":{}}}],["increas",{"_index":1382,"title":{},"content":{"36":{},"37":{},"52":{}}}],["index",{"_index":549,"title":{},"content":{"16":{},"27":{},"29":{},"67":{},"68":{},"70":{}}}],["index.j",{"_index":1347,"title":{},"content":{"70":{}}}],["index.t",{"_index":619,"title":{},"content":{"28":{},"29":{}}}],["indexoflin",{"_index":1429,"title":{},"content":{"39":{}}}],["infin",{"_index":182,"title":{},"content":{"1":{}}}],["info",{"_index":274,"title":{},"content":{"6":{},"13":{},"14":{},"19":{},"26":{}}}],["info(...messag",{"_index":1009,"title":{},"content":{"19":{}}}],["info(format",{"_index":1029,"title":{},"content":{"19":{}}}],["inform",{"_index":236,"title":{"9":{}},"content":{"5":{}}}],["init",{"_index":98,"title":{"61":{}},"content":{"28":{},"61":{},"65":{},"70":{},"82":{}}}],["init(app",{"_index":633,"title":{},"content":{"28":{}}}],["initi",{"_index":1118,"title":{"70":{}},"content":{"62":{},"63":{},"65":{},"67":{},"68":{},"70":{}}}],["initialopt",{"_index":518,"title":{},"content":{"19":{},"26":{}}}],["input",{"_index":132,"title":{"3":{},"6":{},"51":{},"52":{}},"content":{"2":{},"5":{},"7":{},"52":{},"54":{},"84":{}}}],["insid",{"_index":1461,"title":{},"content":{"84":{}}}],["insist",{"_index":1456,"title":{},"content":{"84":{}}}],["inspir",{"_index":881,"title":{},"content":{"15":{}}}],["instal",{"_index":401,"title":{"47":{},"73":{}},"content":{"10":{},"12":{},"22":{},"25":{},"47":{},"59":{},"61":{},"73":{},"74":{}}}],["install/download",{"_index":1623,"title":{},"content":{"47":{}}}],["install/us",{"_index":656,"title":{},"content":{"29":{}}}],["instanc",{"_index":35,"title":{"80":{}},"content":{"28":{},"81":{},"82":{}}}],["instead",{"_index":718,"title":{},"content":{"19":{},"54":{},"84":{}}}],["int",{"_index":190,"title":{},"content":{"1":{},"29":{}}}],["integr",{"_index":447,"title":{"43":{}},"content":{"21":{},"25":{},"44":{}}}],["integrity=\"sha384",{"_index":1231,"title":{},"content":{"67":{},"70":{}}}],["intended/feas",{"_index":400,"title":{},"content":{"10":{}}}],["interact",{"_index":1250,"title":{},"content":{"52":{},"67":{}}}],["interfac",{"_index":112,"title":{},"content":{"3":{},"8":{},"19":{},"27":{},"63":{},"67":{},"70":{},"74":{},"82":{},"84":{}}}],["intermedi",{"_index":1602,"title":{},"content":{"46":{}}}],["intern",{"_index":1400,"title":{},"content":{"38":{}}}],["interoper",{"_index":1325,"title":{},"content":{"68":{}}}],["interpol",{"_index":926,"title":{},"content":{"16":{}}}],["intrinsicel",{"_index":1260,"title":{},"content":{"67":{}}}],["introduct",{"_index":2,"title":{"15":{},"21":{},"78":{},"84":{}},"content":{}}],["invalid",{"_index":616,"title":{},"content":{"28":{},"30":{}}}],["isact",{"_index":556,"title":{},"content":{"27":{},"29":{}}}],["isc",{"_index":1353,"title":{},"content":{"70":{}}}],["isdirectori",{"_index":335,"title":{},"content":{"7":{}}}],["isfil",{"_index":334,"title":{},"content":{"7":{}}}],["isol",{"_index":1674,"title":{},"content":{"48":{}}}],["isomorph",{"_index":1055,"title":{"58":{}},"content":{"59":{},"68":{},"71":{}}}],["issu",{"_index":208,"title":{"14":{}},"content":{"4":{},"17":{},"37":{},"44":{},"47":{},"74":{},"84":{}}}],["issymlink",{"_index":336,"title":{},"content":{"7":{}}}],["item",{"_index":1212,"title":{},"content":{"67":{},"68":{},"70":{}}}],["items.map((todo",{"_index":1216,"title":{},"content":{"67":{},"68":{},"70":{}}}],["items={array.from(todos.valu",{"_index":1211,"title":{},"content":{"67":{}}}],["items={todo",{"_index":1262,"title":{},"content":{"67":{},"70":{}}}],["iter",{"_index":1414,"title":{"39":{}},"content":{"38":{},"39":{},"52":{}}}],["j",{"_index":928,"title":{},"content":{"16":{}}}],["java",{"_index":840,"title":{},"content":{"12":{}}}],["javascript",{"_index":151,"title":{},"content":{"1":{},"12":{},"13":{},"59":{},"63":{},"72":{}}}],["javascript(also",{"_index":1080,"title":{},"content":{"59":{}}}],["jez",{"_index":1569,"title":{},"content":{"44":{}}}],["job",{"_index":1050,"title":{},"content":{"19":{},"48":{},"84":{}}}],["joke",{"_index":1611,"title":{},"content":{"47":{}}}],["jq",{"_index":710,"title":{"54":{}},"content":{"54":{},"57":{}}}],["js",{"_index":189,"title":{"13":{}},"content":{"1":{},"63":{},"68":{}}}],["json",{"_index":93,"title":{"57":{},"82":{}},"content":{"25":{},"28":{},"29":{},"30":{},"37":{},"54":{},"57":{},"65":{},"70":{},"82":{}}}],["json(tom.json",{"_index":806,"title":{},"content":{"57":{}}}],["json.parse(respons",{"_index":798,"title":{},"content":{"57":{}}}],["json.stringifi",{"_index":929,"title":{},"content":{"16":{},"70":{}}}],["json.stringify(address",{"_index":869,"title":{},"content":{"14":{}}}],["json.stringify(bodi",{"_index":106,"title":{},"content":{"82":{}}}],["json.stringify(person",{"_index":868,"title":{},"content":{"14":{}}}],["json.stringify(post",{"_index":1530,"title":{},"content":{"84":{}}}],["json.stringify(posts[postid",{"_index":1508,"title":{},"content":{"84":{}}}],["json.stringify(us",{"_index":1527,"title":{},"content":{"84":{}}}],["json.stringify(users[userid",{"_index":1479,"title":{},"content":{"84":{}}}],["jspm",{"_index":1136,"title":{},"content":{"63":{}}}],["jsx",{"_index":1143,"title":{},"content":{"63":{},"67":{}}}],["jsx(tsx",{"_index":1172,"title":{},"content":{"63":{}}}],["jsx.intrinsicel",{"_index":1169,"title":{},"content":{"63":{}}}],["juli",{"_index":773,"title":{},"content":{"38":{},"40":{},"57":{}}}],["jumbotron",{"_index":1201,"title":{},"content":{"67":{},"70":{}}}],["k",{"_index":812,"title":{},"content":{"57":{}}}],["keep",{"_index":5,"title":{},"content":{"24":{},"39":{},"42":{},"78":{}}}],["key",{"_index":745,"title":{},"content":{"57":{},"67":{}}}],["key.slice(!match[3",{"_index":757,"title":{},"content":{"57":{}}}],["key.substr(0",{"_index":755,"title":{},"content":{"57":{}}}],["key={index",{"_index":1218,"title":{},"content":{"67":{},"68":{},"70":{}}}],["keyword",{"_index":1350,"title":{},"content":{"70":{}}}],["know",{"_index":397,"title":{},"content":{"9":{},"10":{},"19":{},"32":{},"40":{},"57":{},"63":{}}}],["knowledg",{"_index":218,"title":{},"content":{"5":{},"22":{}}}],["known",{"_index":428,"title":{},"content":{"21":{},"59":{}}}],["label=\"clos",{"_index":1225,"title":{},"content":{"67":{},"68":{},"70":{}}}],["lang",{"_index":449,"title":{},"content":{"21":{}}}],["lang=\"en",{"_index":1112,"title":{},"content":{"62":{},"63":{},"67":{},"68":{},"70":{}}}],["languag",{"_index":738,"title":{"42":{}},"content":{"11":{},"56":{}}}],["larg",{"_index":1388,"title":{},"content":{"37":{}}}],["last",{"_index":377,"title":{},"content":{"9":{},"38":{},"39":{},"48":{}}}],["lastkey",{"_index":749,"title":{},"content":{"57":{}}}],["latest",{"_index":1643,"title":{},"content":{"47":{}}}],["lead",{"_index":1488,"title":{},"content":{"84":{}}}],["learn",{"_index":1065,"title":{},"content":{"51":{},"58":{},"84":{}}}],["less",{"_index":953,"title":{},"content":{"16":{}}}],["let",{"_index":1458,"title":{},"content":{"44":{},"49":{},"84":{}}}],["let'",{"_index":97,"title":{"18":{}},"content":{"6":{},"7":{},"10":{},"14":{},"17":{},"19":{},"25":{},"28":{},"29":{},"33":{},"35":{},"39":{},"46":{},"47":{},"48":{},"52":{},"57":{},"82":{},"84":{}}}],["let’",{"_index":1092,"title":{},"content":{"61":{},"63":{},"65":{},"67":{},"70":{}}}],["level",{"_index":519,"title":{},"content":{"19":{},"26":{}}}],["level(_l",{"_index":1000,"title":{},"content":{"19":{}}}],["li",{"_index":1217,"title":{},"content":{"67":{},"68":{},"70":{}}}],["lib",{"_index":1320,"title":{},"content":{"68":{}}}],["librari",{"_index":717,"title":{},"content":{"15":{},"17":{},"33":{},"47":{},"54":{},"59":{},"61":{},"67":{},"68":{},"84":{}}}],["licens",{"_index":1352,"title":{},"content":{"70":{}}}],["life",{"_index":968,"title":{},"content":{"17":{}}}],["lightest",{"_index":1599,"title":{},"content":{"46":{}}}],["limit",{"_index":698,"title":{"31":{}},"content":{"14":{},"31":{},"52":{}}}],["limit}]\\n",{"_index":1764,"title":{},"content":{"52":{}}}],["line",{"_index":135,"title":{"3":{},"33":{}},"content":{"2":{},"10":{},"11":{},"33":{},"38":{},"39":{},"40":{},"52":{},"63":{},"74":{}}}],["line(stream",{"_index":1363,"title":{},"content":{"33":{}}}],["line,rest",{"_index":1444,"title":{},"content":{"39":{}}}],["link",{"_index":1228,"title":{},"content":{"67":{},"70":{}}}],["linux",{"_index":1600,"title":{},"content":{"46":{},"47":{},"73":{}}}],["list",{"_index":916,"title":{"67":{}},"content":{"16":{},"65":{},"67":{},"70":{}}}],["list/array",{"_index":1500,"title":{},"content":{"84":{}}}],["listen",{"_index":36,"title":{"80":{}},"content":{}}],["listtodo",{"_index":1210,"title":{},"content":{"67":{},"68":{},"70":{}}}],["liter",{"_index":901,"title":{},"content":{"16":{}}}],["littl",{"_index":440,"title":{},"content":{"21":{},"39":{}}}],["live",{"_index":829,"title":{},"content":{"11":{}}}],["load",{"_index":1137,"title":{},"content":{"63":{}}}],["local",{"_index":825,"title":{},"content":{"11":{},"75":{}}}],["locat",{"_index":642,"title":{},"content":{"28":{},"30":{}}}],["log",{"_index":235,"title":{"9":{},"13":{},"17":{}},"content":{"5":{},"11":{},"12":{},"13":{},"19":{},"48":{},"50":{}}}],["log(...messag",{"_index":1007,"title":{},"content":{"19":{}}}],["log(format",{"_index":1025,"title":{},"content":{"19":{}}}],["logger",{"_index":233,"title":{"9":{},"11":{},"18":{},"19":{}},"content":{"5":{},"8":{},"9":{},"11":{},"17":{},"19":{},"26":{},"51":{},"52":{},"84":{}}}],["logger(initialopt",{"_index":522,"title":{},"content":{"26":{}}}],["logger.error",{"_index":1041,"title":{},"content":{"19":{}}}],["logger.error(\"thi",{"_index":1020,"title":{},"content":{"19":{}}}],["logger.error(`y",{"_index":1762,"title":{},"content":{"52":{}}}],["logger.format",{"_index":1047,"title":{},"content":{"19":{}}}],["logger.info(\"/%s:\\t%",{"_index":1546,"title":{},"content":{"84":{}}}],["logger.info(\"1.0.1",{"_index":1048,"title":{},"content":{"19":{}}}],["logger.info(\"1.0.2",{"_index":1049,"title":{},"content":{"19":{}}}],["logger.info(\"lotteri",{"_index":1742,"title":{},"content":{"52":{}}}],["logger.info(\"thank",{"_index":1756,"title":{},"content":{"52":{}}}],["logger.info(\"thi",{"_index":1017,"title":{},"content":{"19":{}}}],["logger.info(\"too",{"_index":1768,"title":{},"content":{"52":{}}}],["logger.info(\"y",{"_index":1737,"title":{},"content":{"52":{}}}],["logger.info(`welcom",{"_index":388,"title":{},"content":{"9":{}}}],["logger.inverse(entry.path",{"_index":395,"title":{},"content":{"9":{}}}],["logger.level",{"_index":1046,"title":{},"content":{"19":{}}}],["logger.lin",{"_index":527,"title":{},"content":{"26":{}}}],["logger.log",{"_index":1036,"title":{},"content":{"19":{}}}],["logger.log(\"thi",{"_index":1016,"title":{},"content":{"19":{}}}],["logger.t",{"_index":1015,"title":{},"content":{"19":{}}}],["logger.warn(\"bingo",{"_index":1771,"title":{},"content":{"52":{}}}],["logger.warn(\"gener",{"_index":1765,"title":{},"content":{"52":{}}}],["logger.warn(\"guess",{"_index":1739,"title":{},"content":{"52":{}}}],["logger.warn(\"thi",{"_index":1018,"title":{},"content":{"19":{}}}],["logger.warn(`guess",{"_index":1754,"title":{},"content":{"52":{}}}],["logger.warn(usesformat",{"_index":391,"title":{},"content":{"9":{}}}],["loggeropt",{"_index":517,"title":{},"content":{"19":{},"26":{}}}],["logic",{"_index":303,"title":{},"content":{"7":{},"8":{},"84":{}}}],["loglevel",{"_index":989,"title":{},"content":{"19":{}}}],["london",{"_index":863,"title":{},"content":{"14":{}}}],["london\",\"zip\":20000",{"_index":872,"title":{},"content":{"14":{}}}],["long",{"_index":1667,"title":{},"content":{"48":{}}}],["look",{"_index":113,"title":{},"content":{"15":{},"38":{},"46":{},"57":{},"70":{},"82":{}}}],["loop",{"_index":78,"title":{},"content":{"52":{},"81":{},"84":{}}}],["lorem",{"_index":580,"title":{},"content":{"27":{}}}],["lose",{"_index":1281,"title":{},"content":{"68":{}}}],["lot",{"_index":452,"title":{},"content":{"21":{},"25":{},"31":{},"70":{}}}],["lotteri",{"_index":1724,"title":{"51":{}},"content":{"51":{},"52":{}}}],["lottery_game.t",{"_index":1728,"title":{},"content":{"52":{}}}],["low",{"_index":1770,"title":{},"content":{"52":{}}}],["ls",{"_index":1687,"title":{},"content":{"50":{}}}],["lucki",{"_index":1620,"title":{},"content":{"47":{},"52":{}}}],["mac/unix",{"_index":223,"title":{},"content":{"5":{}}}],["maco",{"_index":1704,"title":{},"content":{"73":{}}}],["magic",{"_index":1551,"title":{},"content":{"84":{}}}],["main",{"_index":143,"title":{},"content":{"1":{},"3":{},"4":{},"52":{},"70":{},"76":{},"84":{}}}],["main(arg",{"_index":244,"title":{},"content":{"6":{},"7":{},"8":{},"9":{}}}],["main(deno.arg",{"_index":246,"title":{},"content":{"6":{},"7":{},"8":{},"9":{}}}],["main(filenam",{"_index":1371,"title":{},"content":{"35":{},"36":{},"37":{},"38":{},"40":{}}}],["main(nam",{"_index":1368,"title":{},"content":{"35":{},"36":{},"37":{},"38":{},"40":{}}}],["mainli",{"_index":1587,"title":{},"content":{"44":{},"72":{}}}],["maintain",{"_index":1499,"title":{},"content":{"84":{}}}],["mainten",{"_index":1491,"title":{},"content":{"84":{}}}],["major",{"_index":1489,"title":{},"content":{"84":{}}}],["make",{"_index":1243,"title":{},"content":{"52":{},"67":{},"68":{},"70":{}}}],["male",{"_index":566,"title":{},"content":{"27":{}}}],["manag",{"_index":1498,"title":{},"content":{"84":{}}}],["mani",{"_index":505,"title":{},"content":{"25":{},"44":{},"58":{},"84":{}}}],["map",{"_index":714,"title":{},"content":{"54":{},"65":{},"70":{}}}],["map((resolv",{"_index":1419,"title":{},"content":{"39":{}}}],["prone",{"_index":859,"title":{},"content":{"14":{}}}],["prop",{"_index":1264,"title":{},"content":{"67":{},"68":{},"70":{}}}],["proper",{"_index":707,"title":{},"content":{"31":{}}}],["properti",{"_index":202,"title":{},"content":{"4":{}}}],["provid",{"_index":10,"title":{},"content":{"10":{},"21":{},"33":{},"34":{},"56":{},"57":{},"63":{},"68":{},"78":{},"84":{}}}],["ps",{"_index":1671,"title":{},"content":{"48":{},"50":{}}}],["publish",{"_index":1711,"title":{},"content":{"74":{}}}],["pull",{"_index":1598,"title":{},"content":{"46":{},"47":{}}}],["purpos",{"_index":540,"title":{},"content":{"27":{}}}],["pwd",{"_index":1657,"title":{},"content":{"48":{}}}],["pwd}/ssr:/app",{"_index":1685,"title":{},"content":{"49":{}}}],["q",{"_index":1751,"title":{},"content":{"52":{}}}],["qa",{"_index":491,"title":{},"content":{"25":{}}}],["queri",{"_index":601,"title":{"30":{}},"content":{"28":{},"29":{},"30":{}}}],["query\":\"queri",{"_index":645,"title":{},"content":{"28":{},"30":{}}}],["query/alias",{"_index":704,"title":{},"content":{"31":{}}}],["query;}function",{"_index":1161,"title":{},"content":{"63":{}}}],["ssr

document