diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 5d38a187b..000000000 Binary files a/.DS_Store and /dev/null differ diff --git a/404.html b/404.html index 16e2de1b4..fb3b594be 100644 --- a/404.html +++ b/404.html @@ -1,3 +1,3 @@ 404: This page could not be found

404

This page could not be found.

\ No newline at end of file + ga('send', 'pageview');404: This page could not be found

404

This page could not be found.

\ No newline at end of file diff --git a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/authenticate-snowflake-rest-api-using-keycloak.json b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/authenticate-snowflake-rest-api-using-keycloak.json similarity index 94% rename from _next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/authenticate-snowflake-rest-api-using-keycloak.json rename to _next/data/tJlUn5_CjNiSTMoSsoO6j/blog/authenticate-snowflake-rest-api-using-keycloak.json index eb549f1ee..e58a03f8c 100644 --- a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/authenticate-snowflake-rest-api-using-keycloak.json +++ b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/authenticate-snowflake-rest-api-using-keycloak.json @@ -1 +1 @@ -{"pageProps":{"post":{"content":"\n\n# Authenticate Snowflake rest api via Keycloak\n\nHere in Vandebron we use Keycloak as our identity and access management (IAM) solution and Snowflake as our data warehousing platform. \nKeycloak is a powerful and extensible solution for managing user identities and access control, making it a popular choice for organizations seeking a comprehensive and open-source IAM platform.\nSnowflake is designed to handle and analyze large volumes of data with speed and efficiency. It is known for its scalability, flexibility, and ease of use in managing and analyzing diverse and massive datasets.\n\n## Accessing Snowflake data via Rest API\n\nThere are several ways to access data in Snowflake one of these are the Snowflake rest api, they are a comprehensive set of REST APIs for managing and interacting with various aspects of the Snowflake Data Cloud, including account management, data loading, querying, and more.\nThese REST APIs allow developers to programmatically perform tasks such as executing SQL queries, managing virtual warehouses, and administering user roles. They are designed to enable automation and integration with other applications and services.\n\n## Why via Rest Api?\n\nThe Snowflake SQL API is a REST API that you can use to access and update data in a Snowflake database. You can use this API to develop custom applications and integrations that can perform most of the queries you need. More info here: [Snowflake rest api](https://docs.snowflake.com/en/developer-guide/sql-api/index)\n\nWe decided to connect our microservices to snowflake via rest api mainly because we consider this mechanism the best way to decouple database processing with backend processing in fact the queries issued via the endpoint are processed inside Snowflake ecosystem asynchronously.\n\nThe service can poll snowflake to monitor the request until it is completed. See [Sql api response](https://docs.snowflake.com/en/developer-guide/sql-api/handling-responses) .\n\nUsing api communication has other very good benefits:\n\n- No additional library dependency\n- No Additional spark connectors\n- Since there is no way to run snowflake on a local machine unit test a snowflake connection would have been very hard ( impossible ). With Rest api communication we can unit test snowflake api client using contract test. ( one way contract test is better than nothing )\n\n## Snowflake Authentication\n\nSnowflake provides a convenient way to authenticate to it using “any” OAuth authentication server. Our authentication server is Keycloak so in the following sections you will learn how to integrate Keycloak with Snowflake.\nResources to this topic can be found here [auth-ext-overview ](https://docs.snowflake.com/en/user-guide/oauth-ext-overview) and here: [oauth-ext-custom](https://docs.snowflake.com/en/user-guide/oauth-ext-custom)\n\n\n## Keycloak side\n\nYou need to configure your client to return in the JWT access token the following claims:\n\n```json\n{\n \"aud\": \"\",\n \"iat\": 1576705500,\n \"exp\": 1576709100,\n \"iss\": \"\",\n \"scope\": [\n \"session:role-any\"\n ]\n}\n```\n\nmost of them are returned by default. Aud claims is the only one you should add\nTo add `aud` claim you can add a new mapper to your client with type Audience see image:\n\n![keycloak_aud.png](../images/keycloak_aud.png \"Keycloak aud mapper\")\n\n**Note**: You need to add a custom audience with the value **equal** to the login_name attribute value in snowflake. The audience value will be used to look up to the right user in snowflake integration\n\nThen you need to add the snowflake scope to your scope list: session:role-any\nFinally you can check that your token is correct:\n\n```json\n{\n .....\n \"iss\": \"https://test.vdbinfra.nl/auth/realms/vandebron\",\n \"scope\": \"session:role-any\",\n \"aud\": \"energy-trading-test\",\n ....\n}\n```\n\nThe `aud` must contain only the snowflake login_name. For instance, a token such as the following will not work (multiple audiences):\"aud\": [ \"batterypack-services-test\", \"account\" ],\n\n## Snowflake side\n\nHow to find keycloak public key: [stackoverflow](https://stackoverflow.com/a/57457227)\nRequired: `ACCOUNTADMIN` rights in Snowflake.\nExample integration command:\n\n```sql\ncreate or replace security integration external_oauth_keycloak_test\ntype = external_oauth\nenabled = true\nexternal_oauth_type = custom\nexternal_oauth_issuer = 'https://test.vdbinfra.nl/auth/realms/vandebron'\nexternal_oauth_rsa_public_key = ''\nexternal_oauth_audience_list = ('energy-trading-test')\nexternal_oauth_scope_mapping_attribute = 'scope'\nexternal_oauth_token_user_mapping_claim = 'aud'\nexternal_oauth_any_role_mode = 'ENABLE'\nexternal_oauth_scope_delimiter = ' '\nexternal_oauth_snowflake_user_mapping_attribute = 'login_name';\n```\n\nNote: the external_oauth_scope_delimiter setting must be enabled separately by Snowflake support.\nNext, you need to set the login name for the user you want associate with the integration:\n\n![snowflake_auth_conf.png](../images/snowflake_auth_conf.png \"Snowflake auth configuration\")\n\n### Example\n\nLet’s authenticate with keycloak as we do normally:\n\n```curl\ncurl --location --request POST 'https://keycloak.test-backend.vdbinfra.nl/auth/realms/vandebron/protocol/openid-connect/token/' \\\n--header 'Content-Type: application/x-www-form-urlencoded' \\\n--data-urlencode 'grant_type=client_credentials' \\\n--data-urlencode 'client_id=energy-trading' \\\n--data-urlencode 'client_secret='\n```\n\nNow you should get the token. Optional: van verify the token directly in snowflake with SQL:\n\n```sql\nSELECT SYSTEM$VERIFY_EXTERNAL_OAUTH_TOKEN( '' )\n```\n\nUse it in the snowflake statement endpoint. For example:\n\n```curl\ncurl --location --request POST 'https://.eu-central-1.snowflakecomputing.com/api/v2/statements?async=true' \\\n--header 'Authorization: Bearer \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n\"statement\": \"select \\\"data\\\" as prediction, to_number(\\\"lats\\\", 10, 4) as lats, to_number(\\\"lons\\\", 10, 4) as lons, \\\"scaledValueOfFirstFixedSurface\\\" as scaled_value_of_first_fixed_surface, to_timestamp_tz( concat(\\\"dataDate\\\", lpad(\\\"dataTime\\\", 4, 0)) || '\\''+0'\\'', '\\''yyyymmddhh24mi+tzh'\\'') as model_datetime, to_timestamp_tz( concat(\\\"validityDate\\\", lpad(\\\"validityTime\\\", 4, 0)) || '\\''+0'\\'', '\\''yyyymmddhh24mi+tzh'\\'') as predicted_datetime, insert_date_snowflake, current_timestamp()::timestamp_tz(9) as insert_date_staging from raw.icon_eu.alhfl_s;\"\n}'\n```\n\nNB: It is important to use the proper snowflake base url. In my case I am using https://.eu-central-1.snowflakecomputing.com/ where is my account identifier which was authorised during configuration phase the snowflake user the token is referring to in the clientId claim.\nYou should get a response such as:\n\n```json\n{\n \"code\": \"333334\",\n \"message\": \"Asynchronous execution in progress. Use provided query id to perform query monitoring and management.\",\n \"statementHandle\": \"01aafc80-3201-abed-0001-4a0e00e52816\",\n \"statementStatusUrl\": \"/api/v2/statements/01aafc80-3201-abed-0001-4a0e00e52816\"\n}\n```\n\nNow you can follow the async operation to the following get endpoint:\n\n```http\nhttps://.eu-central-1.snowflakecomputing.com/api/v2/statements/01aafc80-3201-abed-0001-4a0e00e52816\n```\n\nIt will return 202 if the processing is still ongoing. It will return 200 and the actual result when processing ends.\n\nHappy coding!","meta":{"title":"Authenticate Snowflake via Keycloak","description":"How to use Keycloak to authenticate against Snowflake rest api","createdAt":"Tue Dec 19 2023 01:00:00 GMT+0100 (GMT+01:00)","coverImage":"images/snowflake_keycloak.jpg","tags":["keycloak","snowflake","rest","oauth","bearer token","authentication","security"],"author":"Rosario Renga","slug":"blog/authenticate-snowflake-rest-api-using-keycloak","formattedDate":"19 december 2023","date":"Tue Dec 19 2023 01:00:00 GMT+0100 (GMT+01:00)"}}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"post":{"content":"\n\n# Authenticate Snowflake rest api via Keycloak\n\nHere in Vandebron we use Keycloak as our identity and access management (IAM) solution and Snowflake as our data warehousing platform. \nKeycloak is a powerful and extensible solution for managing user identities and access control, making it a popular choice for organizations seeking a comprehensive and open-source IAM platform.\nSnowflake is designed to handle and analyze large volumes of data with speed and efficiency. It is known for its scalability, flexibility, and ease of use in managing and analyzing diverse and massive datasets.\n\n## Accessing Snowflake data via Rest API\n\nThere are several ways to access data in Snowflake one of these are the Snowflake rest api, they are a comprehensive set of REST APIs for managing and interacting with various aspects of the Snowflake Data Cloud, including account management, data loading, querying, and more.\nThese REST APIs allow developers to programmatically perform tasks such as executing SQL queries, managing virtual warehouses, and administering user roles. They are designed to enable automation and integration with other applications and services.\n\n## Why via Rest Api?\n\nThe Snowflake SQL API is a REST API that you can use to access and update data in a Snowflake database. You can use this API to develop custom applications and integrations that can perform most of the queries you need. More info here: [Snowflake rest api](https://docs.snowflake.com/en/developer-guide/sql-api/index)\n\nWe decided to connect our microservices to snowflake via rest api mainly because we consider this mechanism the best way to decouple database processing with backend processing in fact the queries issued via the endpoint are processed inside Snowflake ecosystem asynchronously.\n\nThe service can poll snowflake to monitor the request until it is completed. See [Sql api response](https://docs.snowflake.com/en/developer-guide/sql-api/handling-responses) .\n\nUsing api communication has other very good benefits:\n\n- No additional library dependency\n- No Additional spark connectors\n- Since there is no way to run snowflake on a local machine unit test a snowflake connection would have been very hard ( impossible ). With Rest api communication we can unit test snowflake api client using contract test. ( one way contract test is better than nothing )\n\n## Snowflake Authentication\n\nSnowflake provides a convenient way to authenticate to it using “any” OAuth authentication server. Our authentication server is Keycloak so in the following sections you will learn how to integrate Keycloak with Snowflake.\nResources to this topic can be found here [auth-ext-overview ](https://docs.snowflake.com/en/user-guide/oauth-ext-overview) and here: [oauth-ext-custom](https://docs.snowflake.com/en/user-guide/oauth-ext-custom)\n\n\n## Keycloak side\n\nYou need to configure your client to return in the JWT access token the following claims:\n\n```json\n{\n \"aud\": \"\",\n \"iat\": 1576705500,\n \"exp\": 1576709100,\n \"iss\": \"\",\n \"scope\": [\n \"session:role-any\"\n ]\n}\n```\n\nmost of them are returned by default. Aud claims is the only one you should add\nTo add `aud` claim you can add a new mapper to your client with type Audience see image:\n\n![keycloak_aud.png](../images/keycloak_aud.png \"Keycloak aud mapper\")\n\n**Note**: You need to add a custom audience with the value **equal** to the login_name attribute value in snowflake. The audience value will be used to look up to the right user in snowflake integration\n\nThen you need to add the snowflake scope to your scope list: session:role-any\nFinally you can check that your token is correct:\n\n```json\n{\n .....\n \"iss\": \"https://test.vdbinfra.nl/auth/realms/vandebron\",\n \"scope\": \"session:role-any\",\n \"aud\": \"energy-trading-test\",\n ....\n}\n```\n\nThe `aud` must contain only the snowflake login_name. For instance, a token such as the following will not work (multiple audiences):\"aud\": [ \"batterypack-services-test\", \"account\" ],\n\n## Snowflake side\n\nHow to find keycloak public key: [stackoverflow](https://stackoverflow.com/a/57457227)\nRequired: `ACCOUNTADMIN` rights in Snowflake.\nExample integration command:\n\n```sql\ncreate or replace security integration external_oauth_keycloak_test\ntype = external_oauth\nenabled = true\nexternal_oauth_type = custom\nexternal_oauth_issuer = 'https://test.vdbinfra.nl/auth/realms/vandebron'\nexternal_oauth_rsa_public_key = ''\nexternal_oauth_audience_list = ('energy-trading-test')\nexternal_oauth_scope_mapping_attribute = 'scope'\nexternal_oauth_token_user_mapping_claim = 'aud'\nexternal_oauth_any_role_mode = 'ENABLE'\nexternal_oauth_scope_delimiter = ' '\nexternal_oauth_snowflake_user_mapping_attribute = 'login_name';\n```\n\nNote: the external_oauth_scope_delimiter setting must be enabled separately by Snowflake support.\nNext, you need to set the login name for the user you want associate with the integration:\n\n![snowflake_auth_conf.png](../images/snowflake_auth_conf.png \"Snowflake auth configuration\")\n\n### Example\n\nLet’s authenticate with keycloak as we do normally:\n\n```curl\ncurl --location --request POST 'https://keycloak.test-backend.vdbinfra.nl/auth/realms/vandebron/protocol/openid-connect/token/' \\\n--header 'Content-Type: application/x-www-form-urlencoded' \\\n--data-urlencode 'grant_type=client_credentials' \\\n--data-urlencode 'client_id=energy-trading' \\\n--data-urlencode 'client_secret='\n```\n\nNow you should get the token. Optional: van verify the token directly in snowflake with SQL:\n\n```sql\nSELECT SYSTEM$VERIFY_EXTERNAL_OAUTH_TOKEN( '' )\n```\n\nUse it in the snowflake statement endpoint. For example:\n\n```curl\ncurl --location --request POST 'https://.eu-central-1.snowflakecomputing.com/api/v2/statements?async=true' \\\n--header 'Authorization: Bearer \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n\"statement\": \"select \\\"data\\\" as prediction, to_number(\\\"lats\\\", 10, 4) as lats, to_number(\\\"lons\\\", 10, 4) as lons, \\\"scaledValueOfFirstFixedSurface\\\" as scaled_value_of_first_fixed_surface, to_timestamp_tz( concat(\\\"dataDate\\\", lpad(\\\"dataTime\\\", 4, 0)) || '\\''+0'\\'', '\\''yyyymmddhh24mi+tzh'\\'') as model_datetime, to_timestamp_tz( concat(\\\"validityDate\\\", lpad(\\\"validityTime\\\", 4, 0)) || '\\''+0'\\'', '\\''yyyymmddhh24mi+tzh'\\'') as predicted_datetime, insert_date_snowflake, current_timestamp()::timestamp_tz(9) as insert_date_staging from raw.icon_eu.alhfl_s;\"\n}'\n```\n\nNB: It is important to use the proper snowflake base url. In my case I am using https://.eu-central-1.snowflakecomputing.com/ where is my account identifier which was authorised during configuration phase the snowflake user the token is referring to in the clientId claim.\nYou should get a response such as:\n\n```json\n{\n \"code\": \"333334\",\n \"message\": \"Asynchronous execution in progress. Use provided query id to perform query monitoring and management.\",\n \"statementHandle\": \"01aafc80-3201-abed-0001-4a0e00e52816\",\n \"statementStatusUrl\": \"/api/v2/statements/01aafc80-3201-abed-0001-4a0e00e52816\"\n}\n```\n\nNow you can follow the async operation to the following get endpoint:\n\n```http\nhttps://.eu-central-1.snowflakecomputing.com/api/v2/statements/01aafc80-3201-abed-0001-4a0e00e52816\n```\n\nIt will return 202 if the processing is still ongoing. It will return 200 and the actual result when processing ends.\n\nHappy coding!","meta":{"title":"Authenticate Snowflake via Keycloak","description":"How to use Keycloak to authenticate against Snowflake rest api","createdAt":"Tue Dec 19 2023 01:00:00 GMT+0100 (Central European Standard Time)","coverImage":"images/snowflake_keycloak.jpg","tags":["keycloak","snowflake","rest","oauth","bearer token","authentication","security"],"author":"Rosario Renga","slug":"blog/authenticate-snowflake-rest-api-using-keycloak","formattedDate":"19 december 2023","date":"Tue Dec 19 2023 01:00:00 GMT+0100 (Central European Standard Time)"}}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/back-to-the-monolith.json b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/back-to-the-monolith.json similarity index 95% rename from _next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/back-to-the-monolith.json rename to _next/data/tJlUn5_CjNiSTMoSsoO6j/blog/back-to-the-monolith.json index bfd46d65b..ba855055f 100644 --- a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/back-to-the-monolith.json +++ b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/back-to-the-monolith.json @@ -1 +1 @@ -{"pageProps":{"post":{"content":"\n\n### Amazon embraces the mighty monolith\n\n\"image\n\nIn March 2023, Amazon published a [blog post](https://www.primevideotech.com/video-streaming/scaling-up-the-prime-video-audio-video-monitoring-service-and-reducing-costs-by-90)\n, detailing how they had managed to reduce the cost of their audio-video monitoring service by 90%.\nThe _key_ to this reduction was migrating from a distributed, microservice architecture to a _monolith_.\nThe blog post went viral, prompting some software industry celebrities to \n[question](https://world.hey.com/dhh/even-amazon-can-t-make-sense-of-serverless-or-microservices-59625580) the entire concept of microservices.\n\n### What should we learn from this?\n\nSo, does this mean microservices are fundamentally flawed? Should we all migrate back to monoliths?\n_No_ and _definitely no_ I would say. Instead, my takeaways from this article are:\n\n1. **Microservices aren't about scaling for performance.** At least not primarily. Although horizontally scalability for computationally intensive operations _can_ be very useful or even essential in some cases, it tends to be a rare benefit. Very often, performance bottlenecks are IO bound and caused by external systems beyond your control. Nevertheless, there _are_ other compelling reasons to consider microservices: they _force_ you to communicate via contracts, _encourage_ you to organize your functionality around domains, and _allow_ you to scale your organization. Of course, all this comes at considerable costs. There's no [free lunch 👇](#presentation).\n2. Don't underestimate the power of a single CPU in 2023. To judge whether a process is unreasonably slow or not, I tend to think of the fact that already in the 1990s, screens showed 65K pixels at any given time. Back then, multiple arithmetic calculations (additions, subtractions) could be performed for each pixel, fifty times per second. Nowadays, your screen probably displays more than 5 Million pixels at once. So, if the amount of datapoints you are dealing with in the order of millions, you should generally be able to process them in a matter of seconds on a single machine. If you can't, you may be doing something very inefficient.\n3. **Software engineering is hard**. Mistakes are made all the time, everywhere. Even at the big 4 tech companies. Kudos to Amazon 👏 for openly sharing the mistake they made so that we may all learn.\nIn the next section I will share one of our own experiences, not entirely different from the Amazon example.\n\n### The 90% cost reduction case at Vandebron\n\n#### Microservices or just distributed computing?\nConsidering that all the functionality used in the Amazon case belongs to the same _domain_, it arguably does not even serve as \na case against improper use of microservices, but instead a case against misuse *distributed computing*.
\nLet's look into an example of misuse of distributed computing at Vandebron now.\n\n#### Predicting the production of electricity\nFor utility companies, accurately predicting both electricity consumption and production is crucial.\nFailing to do so can result in blackouts or overproduction, both of which are [very costly](https://vandebron.nl/blog/hoe-houdt-onze-technologie-het-energienet-in-balans).\nVandebron is a unique utility company in that the electricity that our customers consume is produced by a [very large\namount](https://vandebron.nl/energiebronnen) of relatively small scale producers, who produce electricity using windmills or solar panels.\nThe large number and the weather dependent nature of these producers make it very hard to predict electricity generation accurately.\n\nTo do this, we use a machine learning model that is trained on historical production data \nand predictions from the national weather [institute](https://www.knmi.nl/). As you can imagine, this is a computationally intensive task, involving large amounts of data.\nFortunately, we have [tooling in place](https://www.vandebron.tech/blog/fueling-the-energy-transition-with-spark-part-1) that\nallows us to distribute computations of a cluster of machines if the task is too large for a single machine to handle.\n\nHowever, here's the catch: the fact that we _can_ distribute computations does not mean that we should. Initially it seemed that\nwe couldn't analyze the weather data quick enough for the estimation of our production to still be a _prediction_\nrather than a _postdiction_. We decided to distribute the computation of the weather data over a cluster of machines.\nThis worked, but it made our software more complex and Jeff Bezos even richer than he already was.\n\nUpon closer inspection, we found an extreme inefficiency in our code. It turned out that we were repeatedly reading the entire weather dataset\ninto memory, for _every_ single \"pixel\". After removing this performance bug, the entire analysis could _easily_ be done\non a single machine. \n\n### What more is there to say? \n\n\nSo if microservices aren't about performance, what _are_ they about? If I had to sum it up in one sentence It would be:\n> _Microservices are a way to scale your organization_\n\nThere is a lot of detail hiding in that sentence, which I can't unpack in the scope of this article. If you're interested\nwhat microservices have meant for us, I would recommend you watch the presentation below.\n\n\n#### Microservices at Vandebron\nAt [Vandebron](https://vandebron.nl/), we jumped onto the \"microservice bandwagon\" circa 2019. This wasn't a decision\nmade on a whim. We had seen a few industry trends come and go, so we first [read up](https://samnewman.io/books/building_microservices_2nd_edition/)\nand did our own analysis. We found that the concept of microservices held promise, but also knew that they would come at a cost.\n\nThese are some of the dangers we identified and what we did to mitigate them.\n\n| **Danger** | **Mitigation** |\n|-------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------|\n| _A stagnating architecture_ | Compile and unit-test time detection of breaking changes |\n| _Complicated and error prone deployments_ | Modular CI/CD [pipelines](https://github.com/Vandebron/mpyl) |\n| _Team siloization_ | A single repository (AKA monorepo) for all microservices and a discussion platform for cross-domain and cross-team concerns |\n| _Duplication of code_ | Shared in house libraries for common functionality |\n\n\n\nThe following presentation to the students of [VU University, Amsterdam](https://vu.nl/) explains how we implemented\nsome of these mitigations and what we learned from them.\n\n[![Presentation about micro services to students of VU Amsterdam](/images/play_presentation.webp)](https://youtu.be/HDs-pCsEzKM)\n","meta":{"title":"So, back to the monolith it is then?","description":"A recent Amazon article explaining how they managed to save costs by merging some of their services has lead some to question the value of microservices. What is our take?","createdAt":"Sat May 20 2023 02:00:00 GMT+0200 (GMT+02:00)","coverImage":"images/monolith.webp","tags":"dagster, cicd, ci-cd, orchestration, data pipeline, kubernetes, migration, helm, ansible","author":"Sam Theisens","slug":"blog/back-to-the-monolith","formattedDate":"20 mei 2023","date":"Sat May 20 2023 02:00:00 GMT+0200 (GMT+02:00)"}}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"post":{"content":"\n\n### Amazon embraces the mighty monolith\n\n\"image\n\nIn March 2023, Amazon published a [blog post](https://www.primevideotech.com/video-streaming/scaling-up-the-prime-video-audio-video-monitoring-service-and-reducing-costs-by-90)\n, detailing how they had managed to reduce the cost of their audio-video monitoring service by 90%.\nThe _key_ to this reduction was migrating from a distributed, microservice architecture to a _monolith_.\nThe blog post went viral, prompting some software industry celebrities to \n[question](https://world.hey.com/dhh/even-amazon-can-t-make-sense-of-serverless-or-microservices-59625580) the entire concept of microservices.\n\n### What should we learn from this?\n\nSo, does this mean microservices are fundamentally flawed? Should we all migrate back to monoliths?\n_No_ and _definitely no_ I would say. Instead, my takeaways from this article are:\n\n1. **Microservices aren't about scaling for performance.** At least not primarily. Although horizontally scalability for computationally intensive operations _can_ be very useful or even essential in some cases, it tends to be a rare benefit. Very often, performance bottlenecks are IO bound and caused by external systems beyond your control. Nevertheless, there _are_ other compelling reasons to consider microservices: they _force_ you to communicate via contracts, _encourage_ you to organize your functionality around domains, and _allow_ you to scale your organization. Of course, all this comes at considerable costs. There's no [free lunch 👇](#presentation).\n2. Don't underestimate the power of a single CPU in 2023. To judge whether a process is unreasonably slow or not, I tend to think of the fact that already in the 1990s, screens showed 65K pixels at any given time. Back then, multiple arithmetic calculations (additions, subtractions) could be performed for each pixel, fifty times per second. Nowadays, your screen probably displays more than 5 Million pixels at once. So, if the amount of datapoints you are dealing with in the order of millions, you should generally be able to process them in a matter of seconds on a single machine. If you can't, you may be doing something very inefficient.\n3. **Software engineering is hard**. Mistakes are made all the time, everywhere. Even at the big 4 tech companies. Kudos to Amazon 👏 for openly sharing the mistake they made so that we may all learn.\nIn the next section I will share one of our own experiences, not entirely different from the Amazon example.\n\n### The 90% cost reduction case at Vandebron\n\n#### Microservices or just distributed computing?\nConsidering that all the functionality used in the Amazon case belongs to the same _domain_, it arguably does not even serve as \na case against improper use of microservices, but instead a case against misuse *distributed computing*.
\nLet's look into an example of misuse of distributed computing at Vandebron now.\n\n#### Predicting the production of electricity\nFor utility companies, accurately predicting both electricity consumption and production is crucial.\nFailing to do so can result in blackouts or overproduction, both of which are [very costly](https://vandebron.nl/blog/hoe-houdt-onze-technologie-het-energienet-in-balans).\nVandebron is a unique utility company in that the electricity that our customers consume is produced by a [very large\namount](https://vandebron.nl/energiebronnen) of relatively small scale producers, who produce electricity using windmills or solar panels.\nThe large number and the weather dependent nature of these producers make it very hard to predict electricity generation accurately.\n\nTo do this, we use a machine learning model that is trained on historical production data \nand predictions from the national weather [institute](https://www.knmi.nl/). As you can imagine, this is a computationally intensive task, involving large amounts of data.\nFortunately, we have [tooling in place](https://www.vandebron.tech/blog/fueling-the-energy-transition-with-spark-part-1) that\nallows us to distribute computations of a cluster of machines if the task is too large for a single machine to handle.\n\nHowever, here's the catch: the fact that we _can_ distribute computations does not mean that we should. Initially it seemed that\nwe couldn't analyze the weather data quick enough for the estimation of our production to still be a _prediction_\nrather than a _postdiction_. We decided to distribute the computation of the weather data over a cluster of machines.\nThis worked, but it made our software more complex and Jeff Bezos even richer than he already was.\n\nUpon closer inspection, we found an extreme inefficiency in our code. It turned out that we were repeatedly reading the entire weather dataset\ninto memory, for _every_ single \"pixel\". After removing this performance bug, the entire analysis could _easily_ be done\non a single machine. \n\n### What more is there to say? \n\n\nSo if microservices aren't about performance, what _are_ they about? If I had to sum it up in one sentence It would be:\n> _Microservices are a way to scale your organization_\n\nThere is a lot of detail hiding in that sentence, which I can't unpack in the scope of this article. If you're interested\nwhat microservices have meant for us, I would recommend you watch the presentation below.\n\n\n#### Microservices at Vandebron\nAt [Vandebron](https://vandebron.nl/), we jumped onto the \"microservice bandwagon\" circa 2019. This wasn't a decision\nmade on a whim. We had seen a few industry trends come and go, so we first [read up](https://samnewman.io/books/building_microservices_2nd_edition/)\nand did our own analysis. We found that the concept of microservices held promise, but also knew that they would come at a cost.\n\nThese are some of the dangers we identified and what we did to mitigate them.\n\n| **Danger** | **Mitigation** |\n|-------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------|\n| _A stagnating architecture_ | Compile and unit-test time detection of breaking changes |\n| _Complicated and error prone deployments_ | Modular CI/CD [pipelines](https://github.com/Vandebron/mpyl) |\n| _Team siloization_ | A single repository (AKA monorepo) for all microservices and a discussion platform for cross-domain and cross-team concerns |\n| _Duplication of code_ | Shared in house libraries for common functionality |\n\n\n\nThe following presentation to the students of [VU University, Amsterdam](https://vu.nl/) explains how we implemented\nsome of these mitigations and what we learned from them.\n\n[![Presentation about micro services to students of VU Amsterdam](/images/play_presentation.webp)](https://youtu.be/HDs-pCsEzKM)\n","meta":{"title":"So, back to the monolith it is then?","description":"A recent Amazon article explaining how they managed to save costs by merging some of their services has lead some to question the value of microservices. What is our take?","createdAt":"Sat May 20 2023 02:00:00 GMT+0200 (Central European Summer Time)","coverImage":"images/monolith.webp","tags":"dagster, cicd, ci-cd, orchestration, data pipeline, kubernetes, migration, helm, ansible","author":"Sam Theisens","slug":"blog/back-to-the-monolith","formattedDate":"20 mei 2023","date":"Sat May 20 2023 02:00:00 GMT+0200 (Central European Summer Time)"}}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/balancing-dutch-energy-grid-with-flex-services.json b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/balancing-dutch-energy-grid-with-flex-services.json similarity index 91% rename from _next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/balancing-dutch-energy-grid-with-flex-services.json rename to _next/data/tJlUn5_CjNiSTMoSsoO6j/blog/balancing-dutch-energy-grid-with-flex-services.json index 49f1636ba..4ef93aba9 100644 --- a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/balancing-dutch-energy-grid-with-flex-services.json +++ b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/balancing-dutch-energy-grid-with-flex-services.json @@ -1 +1 @@ -{"pageProps":{"post":{"content":"\nVandebron is a Dutch green-tech energy company on a mission to accelerate the transition to 100% renewable energy, 100% of the time. As part of [our mission and strategy](https://vandebron.nl/100procentgroen), we are constantly innovating and looking for ways to optimize energy operations and reduce negative impacts when it comes to energy production.\n\nOur new mission: [100% renewable energy, 100% of the time](https://youtu.be/_Yf8jk4gZbI)\n\n### The importance of curtailment and flexibility services\n\nOne area where we are currently focusing our efforts is the area of curtailment and flexibility of wind turbines, solar parks, industrial batteries and electric vehicles. [Curtailment](https://vandebron.nl/blog/curtailment-slimmer-omgaan-met-goeie-energie) refers to the practice of reducing the electricity inflow to balance the electricity grid. In other words, it involves adjusting the operation of, for example, a wind turbine in order to match the demand for electricity at any given time.\n\n[This is often necessary](https://vandebron.nl/blog/hoe-houdt-onze-technologie-het-energienet-in-balans) because the output of renewable energy sources can vary significantly due to changes in weather conditions. If the output of these sources exceeds the demand for electricity, it can lead to an excess of electricity on the grid, which can cause stability issues. On the other hand, if the output of wind turbines is too low, it can lead to a deficit of electricity on the grid, which can cause blackouts or other disruptions. To tackle this, we look at our customer’s batteries and electric vehicles offering flexibility capabilities.\n\n### Our journey to finding reliable, secure and energy-efficient hardware and software\n\nTo optimize these curtailment and flexibility efforts, we were in need of a gateway device that we could place at the installations of the producers on our platform. To keep it close to our mission, we preferred an ARM-based CPU for its [energy efficiency](https://www.redhat.com/en/topics/linux/ARM-vs-x86) compared to an x86-based CPU. After all, we don’t want to consume all of the produced energy to power an actively cooled NUC… 😉\n\nWhile gathering our hardware requirements, we concluded there was really only one competitor. Therefore, we partnered up with OnLogic! We chose their [Factor 201 device](https://www.onlogic.com/fr201/), which boasts the ARM-based Raspberry Pi CM4 module packed in a small and beautiful orange industrial chassis. The model also enables a lot of custom configurations. For example, we are able to configure multiple (wireless) networks, add extra SSD storage or optionally mount on DIN rails.\n\n![OnLogic Factor 201](/images/flex-onlogic-factor-201.jpg \"OnLogic Factor 201\")\n\nTo ensure our gateway devices are secure and agile (like us, developers, 😛) we needed them to integrate well into our existing technology landscape based on Kubernetes. After struggling for some time to harden several (lightweight) operating systems and bootstrapping lightweight Kubernetes clusters our eyes fell on a new kid in town: ‘Talos Linux, the Kubernetes Operating system’ built by [Sidero Labs](https://www.siderolabs.com/). Again our predetermined wishlist was covered (even more), and what we got is a minimal OS tailored for Kubernetes, hardened, immutable and ephemeral out-of-the-box. Can you survive even more buzzwords than that? \n\nUntil the present day though, they have fulfilled every promise made on [their website](https://www.talos.dev/). It initially didn’t work on our ARM CM4-based device from OnLogic. But after testing a lot together with their team (thank you!) the [latest release (v1.3.0)](https://www.talos.dev/v1.3/introduction/what-is-new/#raspberry-generic-images) officially supports our ARM devices. Ready for action! Right after the stable release the first batches were shipped and connected to the installations of our producers on the platform.\n\nOverall, Vandebron's use of OnLogic's fabricated gateway devices running Talos Linux demonstrates the potential of IoT computing to drive innovation and sustainability in the renewable energy industry. By leveraging the power of these technologies combined, we are one step closer to achieving our goal of 100% renewable energy, 100% of the time. Care to join our mission? Look for [open positions](https://werkenbij.vandebron.nl/).\n\n","meta":{"title":"How Vandebron helps balancing the Dutch energy grid together with OnLogic & Talos Linux","description":"Our journey to find the best fitting hardware and operating system to use for our flex services","createdAt":"Wed Jan 11 2023 01:00:00 GMT+0100 (GMT+01:00)","coverImage":"images/flex-wallpaper.webp","tags":"iot, flexibility services, curtailment, onlogic, talos linux, kubernetes, arm64, raspberry pi","author":"Sietse Bruinsma & Tim van Druenen","slug":"blog/balancing-dutch-energy-grid-with-flex-services","formattedDate":"11 januari 2023","date":"Wed Jan 11 2023 01:00:00 GMT+0100 (GMT+01:00)"}}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"post":{"content":"\nVandebron is a Dutch green-tech energy company on a mission to accelerate the transition to 100% renewable energy, 100% of the time. As part of [our mission and strategy](https://vandebron.nl/100procentgroen), we are constantly innovating and looking for ways to optimize energy operations and reduce negative impacts when it comes to energy production.\n\nOur new mission: [100% renewable energy, 100% of the time](https://youtu.be/_Yf8jk4gZbI)\n\n### The importance of curtailment and flexibility services\n\nOne area where we are currently focusing our efforts is the area of curtailment and flexibility of wind turbines, solar parks, industrial batteries and electric vehicles. [Curtailment](https://vandebron.nl/blog/curtailment-slimmer-omgaan-met-goeie-energie) refers to the practice of reducing the electricity inflow to balance the electricity grid. In other words, it involves adjusting the operation of, for example, a wind turbine in order to match the demand for electricity at any given time.\n\n[This is often necessary](https://vandebron.nl/blog/hoe-houdt-onze-technologie-het-energienet-in-balans) because the output of renewable energy sources can vary significantly due to changes in weather conditions. If the output of these sources exceeds the demand for electricity, it can lead to an excess of electricity on the grid, which can cause stability issues. On the other hand, if the output of wind turbines is too low, it can lead to a deficit of electricity on the grid, which can cause blackouts or other disruptions. To tackle this, we look at our customer’s batteries and electric vehicles offering flexibility capabilities.\n\n### Our journey to finding reliable, secure and energy-efficient hardware and software\n\nTo optimize these curtailment and flexibility efforts, we were in need of a gateway device that we could place at the installations of the producers on our platform. To keep it close to our mission, we preferred an ARM-based CPU for its [energy efficiency](https://www.redhat.com/en/topics/linux/ARM-vs-x86) compared to an x86-based CPU. After all, we don’t want to consume all of the produced energy to power an actively cooled NUC… 😉\n\nWhile gathering our hardware requirements, we concluded there was really only one competitor. Therefore, we partnered up with OnLogic! We chose their [Factor 201 device](https://www.onlogic.com/fr201/), which boasts the ARM-based Raspberry Pi CM4 module packed in a small and beautiful orange industrial chassis. The model also enables a lot of custom configurations. For example, we are able to configure multiple (wireless) networks, add extra SSD storage or optionally mount on DIN rails.\n\n![OnLogic Factor 201](/images/flex-onlogic-factor-201.jpg \"OnLogic Factor 201\")\n\nTo ensure our gateway devices are secure and agile (like us, developers, 😛) we needed them to integrate well into our existing technology landscape based on Kubernetes. After struggling for some time to harden several (lightweight) operating systems and bootstrapping lightweight Kubernetes clusters our eyes fell on a new kid in town: ‘Talos Linux, the Kubernetes Operating system’ built by [Sidero Labs](https://www.siderolabs.com/). Again our predetermined wishlist was covered (even more), and what we got is a minimal OS tailored for Kubernetes, hardened, immutable and ephemeral out-of-the-box. Can you survive even more buzzwords than that? \n\nUntil the present day though, they have fulfilled every promise made on [their website](https://www.talos.dev/). It initially didn’t work on our ARM CM4-based device from OnLogic. But after testing a lot together with their team (thank you!) the [latest release (v1.3.0)](https://www.talos.dev/v1.3/introduction/what-is-new/#raspberry-generic-images) officially supports our ARM devices. Ready for action! Right after the stable release the first batches were shipped and connected to the installations of our producers on the platform.\n\nOverall, Vandebron's use of OnLogic's fabricated gateway devices running Talos Linux demonstrates the potential of IoT computing to drive innovation and sustainability in the renewable energy industry. By leveraging the power of these technologies combined, we are one step closer to achieving our goal of 100% renewable energy, 100% of the time. Care to join our mission? Look for [open positions](https://werkenbij.vandebron.nl/).\n\n","meta":{"title":"How Vandebron helps balancing the Dutch energy grid together with OnLogic & Talos Linux","description":"Our journey to find the best fitting hardware and operating system to use for our flex services","createdAt":"Wed Jan 11 2023 01:00:00 GMT+0100 (Central European Standard Time)","coverImage":"images/flex-wallpaper.webp","tags":"iot, flexibility services, curtailment, onlogic, talos linux, kubernetes, arm64, raspberry pi","author":"Sietse Bruinsma & Tim van Druenen","slug":"blog/balancing-dutch-energy-grid-with-flex-services","formattedDate":"11 januari 2023","date":"Wed Jan 11 2023 01:00:00 GMT+0100 (Central European Standard Time)"}}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/building-native-images-and-compiling-with-graalvm-and-sbt.json b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/building-native-images-and-compiling-with-graalvm-and-sbt.json similarity index 98% rename from _next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/building-native-images-and-compiling-with-graalvm-and-sbt.json rename to _next/data/tJlUn5_CjNiSTMoSsoO6j/blog/building-native-images-and-compiling-with-graalvm-and-sbt.json index c9b62c6cb..28e1f7cc4 100644 --- a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/building-native-images-and-compiling-with-graalvm-and-sbt.json +++ b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/building-native-images-and-compiling-with-graalvm-and-sbt.json @@ -1 +1 @@ -{"pageProps":{"post":{"content":"\nAt Vandebron we organize a two-day long Hackathon every quarter, and a colleague and I took this chance to dig into the wonderful world of GraalVM.\n\nI've first heard of GraalVM around two years ago when Oleg Šelajev toured through Java User Groups in Germany and held talks about GraalVM. [Here](https://www.youtube.com/watch?v=GinNxS3OSi0) is one from 2019 (not Germany, but Spain this time).\n\nGraalVM promises a significant speedup in compile times and as I am working with Scala, which is notoriously known for its long compile times, this seems interesting. Furthermore, GraalVM provides functionality to build native executables. Meaning, an application can be run without a Java Virtual Machine (JVM).\n \nThanks to the Hackathon I finally took the time to get to know GraalVM a bit better. With this blog post, I want to share our findings, experiences, and results, as they might be helpful for you too!\n\n## What is GraalVM?\n\nGraalVM is a high-performance JVM that supports efficient ahead-of-time (AOT) and just-in-time (JIT) compilation, but also allows non-JVM languages (e.g. Ruby, Python, C++) to run on the JVM. The ahead-of-time compilation feature is the base for creating native executable programs, meaning an application can be run independently from the JVM. Seeing the versatile features of GraalVM, it is worth looking a bit under its hood.\n\nActually, GraalVM is defined by three main technologies:\n\n- [Graal compiler](https://www.graalvm.org/reference-manual/jvm/), a high-performance JIT-compiler that can make JVM applications run faster from within the JVM\n- [SubstrateVM](https://www.graalvm.org/reference-manual/native-image/SubstrateVM/), includes the necessary components to run a JVM-app as a native executable ( Garbage Collector, Thread Scheduler, etc.)\n- [Truffle Language Implementation Framework](https://www.graalvm.org/graalvm-as-a-platform/language-implementation-framework/), the basis for the polyglot support from GraalVM\n\nOur motivation for trying out GraalVM was tackling the pain points of Scala, Java projects, and microservices. Shipping microservices written in Scala as Docker containers to your production system comes with the cost that startup can be a bit slow, having JVM and Docker overhead, and that those containers can be fairly large, as the application can only be run with a JVM. See [Building Docker images](#building-docker-images) for more information.\n\nDuring the hackathon, we were most interested in building native images for Scala applications. Hoping to reduce the size of our docker containers and reducing up the startup time.\n\n## Project setup\n\nThe project we worked on during the Hackathon is an API that should be used for applicants to submit their applications at Vandebron in the future. By exposing one endpoint through which a resume and contact information can be submitted.\n\nIt is also a good project to test out GraalVM, nothing too complex but also not as simple as \"Hello World\".\n\nThe full setup can be found [on Github](https://github.com/kgrunert/apply-at-vdb). But I'll summarise the used stack below. The project is built around the following libraries, no particular reason, simply because I like them.\n\n- _cats_ for working with effects, such as IO\n- _http4s_ for running the server\n- _tapir_ for defining the endpoints\n- _circe_ for JSON de/serialisation\n- _pureconfig_ for reading config-files\n- _logback_ for logging\n\nThe project can be run via `sbt run` and with Postman or similar a POST-request can be sent like so:\n\n```json\nPOST localhost:8080/api/v1/apply\n\n{\n\t\"email\": \"my@email.de\",\n\t\"name\": \"My Name\",\n\t\"phoneNumber\": \"+310123456789\",\n\t\"applicationBase64\": \"VGhpcyBjb3VsZCBiZSB5b3VyIGFwcGxpY2F0aW9uIQ==\"\n}\n\nResponse:\n\"*confetti* Thanks for handing in your application, we will get back to you within the next days! *confetti*\"\n```\n\n## Setup GraalVM with sbt\n\nWith this initial project setup in mind, GraalVM needs to be installed locally.\n\nFor the installation of GraalVM the [setup guide](https://www.graalvm.org/docs/getting-started-with-graalvm/#install-graalvm) can be followed.\n\nAfter the installation sbt needs to know that not the regular JDK/JVM is used. This can be done with the `java-home` option on sbt bootup.\nTo make the path to GraalVM a bit more accessible and easy to use it can be exported as an environment variable.\n\n```bash\nexport GRAAL_HOME=/Library/Java/JavaVirtualMachines/graalvm-ce-java8-20.1.0/Contents/Home\nsbt -java-home $GRAALHOME\n```\n\nThe path to GraalVM can vary depending on OS and installation. We followed the basic installation for macOS.\n\nNow sbt using GraalVM can be verified with:\n\n```bash\nsbt -java-home $GRAALHOME\nscala> eval System.getProperty(\"java.home\")\n[info] ans: String = /Library/Java/JavaVirtualMachines/graalvm-ce-java8-20.1.0/Contents/Home/jre\n```\n\nThat means everything running in this sbt instance is getting compiled by GraalVM. Awesome!\n\nThe next step is to become strong and independent and learn how to run without an underlying JVM with the help of building native images.\n\n## Building native images\n\nGraalVM ships with the [GraalVM Updater](https://www.graalvm.org/reference-manual/graalvm-updater/) (`gu`) to install the `native-image` on your machine.\n\n```bash\n$GRAALHOME/bin/gu install native-image\n```\n\n[sbt-native-packager](https://sbt-native-packager.readthedocs.io/en/latest/) provides functionality to build packages efficiently (e.g. building Docker images) and added to that, it also provides support for building native images.\nIn order to build native images with sbt commands this plugin has to be added to the project:\n\n```java scala\n// inside project/plugins.sbt\naddSbtPlugin(\"com.typesafe.sbt\" % \"sbt-native-packager\" % \"1.7.3\")\n```\n\nAnd the `GraalVMNativeImagePlugin` needs to be enabled:\n\n```java scala\n// inside build.sbt\nenablePlugins(GraalVMNativeImagePlugin)\n```\n\nFrom within sbt it should be able to autocomplete and suggest graal-commands, e.g.:\n\n```java scala\nsbt:apply-at-vdb> graalvm\ngraalvm-native-image: graalvmNativeImageOptions\n```\n\nWith that setup, native images are just a stone's throw away!\n\n---\n\n### Disclaimer\n\nThe next three sections are not a write-up but rather the main steps we had to take to make the project work. This includes failing images and troubleshooting.\nI want to keep this in because it might be interesting for others when they have to troubleshoot.\nFor the summary and happy path, you can jump directly to [Roundup](#roundup).\n\n---\n\n### First try building a native image\n\nNext up `graalvm-native-image:packageBin` can be run from within sbt. This might take a while (on our systems it took about a minute)\n\nSome warnings start to pop up:\n\n```\n[error] warning: unknown locality of class Lnl/vandebron/applyatvdb/Main$anon$exportedReader$macro$24$1;, assuming class is not local. To remove the warning report an issue to the library or language author. The issue is caused by Lnl/vandebron/applyatvdb/Main$anon$exportedReader$macro$24$1; which is not following the naming convention.\n\n[error] warning: unknown locality of class Lfs2/internal/Algebra$Done$2$;, assuming class is not local. To remove the warning report an issue to the library or language author. The issue is caused by Lfs2/internal/Algebra$Done$2$; which is not following the naming convention.\n```\n\nThe library-specific warnings can be ignored for now. Ultimately it fails with:\n\n```\nError: com.oracle.graal.pointsto.constraints.UnresolvedElementException:\nDiscovered unresolved type during parsing: org.slf4j.impl.StaticLoggerBinder.\nTo diagnose the issue you can use the --allow-incomplete-classpath option.\nThe missing type is then reported at run time when it is accessed the first time.\n```\nActually a good hint on where to start fine-tuning the GraalVM config:\n\n```java scala\n// inside build.sbt\ngraalVMNativeImageOptions ++= Seq(\n\t\"--allow-incomplete-classpath\",\n)\n```\n\nSome things like a `StaticLoggerBinder` only get resolved at runtime, meaning at build time the classpath needs to be allowed to be incomplete. This option allows resolution errors to be ignored at build time and only pop up during runtime.\n\nDuring the build of a native image, GraalVM tries to resolve those runtime dependencies already at compile-time, as it is part of the Ahead-Of-Time-compilation process. With this flag, GraalVM knows \"hey, don't worry about it now, we cross the bridge when we get there\" (or something like that).\n\n### Adding resource files\n\nA `reload` (or restart) of sbt is needed to activate these new options. And we can try to build the native image up new.\nThis time the build finished successfully and the executable file `target/graalvm-native-image/apply-at-vdb` has been created!\nThis is an executable that can be run without a JVM:\n\n```bash\ntarget/graalvm-native-image/apply-at-vdb\n```\n\nBut what's that? It actually cannot be started...\n\n```bash\ntarget/graalvm-native-image/apply-at-vdb\n\nSLF4J: Failed to load class \"org.slf4j.impl.StaticLoggerBinder\".\nSLF4J: Defaulting to no-operation (NOP) logger implementation\nSLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.\n*** An error occured! ***\nCannot convert configuration to a de.erewl.pricetracker.server.Config. Failures are:\nat the root:\n- Key not found: 'host'.\n- Key not found: 'port'.\n```\n\nThe first three lines relate to the error that occurred during the first build. It simply says that logging hasn't been set up correctly (maybe due to the absence of a `src/main/resources/logback.xml` or some other misconfiguration), triggering the default setting of not logging anything at all.\nThe second error states that a configuration file does not have the right keys or cannot be found at all.\nLooking into `src/main/resources`:\n\n```bash\nls src/main/resources/\napplication.conf logback.xml\n```\n\nand peeking into `application.conf`:\n\n```bash\ncat src/main/resources/application.conf\n\thost = \"localhost\"\n\tport = 8080\n```\n\nHm, so everything is actually in place. But somehow GraalVM can't find those files.\nIt still requires some more GraalVM fine-tuning here.\n\nBy default, GraalVM doesn't include any resource or configuration-files.\nThe option `-H:ResourceConfigurationFiles=path/to/resource-config.json` defines a path to a JSON configuration file. So inside the `resource-config.json` we can include our `application.conf` and our `logback.xml`.\n\nBut writing those config files can be tedious and it is difficult in larger projects to find all necessary classes that need to be included. GraalVM provides some support with writing those files and actually does all the work. In the project's root directory a configs-folder can be created which will contain all necessary config-files.\n\nFor writing the configuration files we will build a normal JAR-file with the help of the `sbt-assembly` plugin. Adding it to the project like so:\n\n```java scala sbt\n // inside project/plugins.sbt\n addSbtPlugin(\"com.eed3si9n\" % \"sbt-assembly\" % \"0.14.6\")\n```\n\nThe JAR-file will be built with `sbt assembly`.\n\nWith that we can now start the application, providing the path to the JAR-file that just has been created:\n\n```bash\nmkdir configs\n$GRAALHOME/bin/java -agentlib:native-image-agent=config-output-dir=./configs -jar target/scala-2.12/apply-at-vdb-assembly-0.1.0-SNAPSHOT.jar\n```\n\nWith the command above the JAR gets to run with GraalVM but adds [dynamic lookups](https://www.graalvm.org/reference-manual/native-image/Configuration/#assisted-configuration-of-native-image-builds) that are being intercepted during runtime and written to the files: `jni-config.json`, `proxy-config.json`, `reflect-config.json` and `resource-config.json`.\n\nThose generated files can be included in the GraalVMNativeImageOptions:\n\n```java scala\n// build.sbt\ngraalVMNativeImageOptions ++= Seq(\n\t\"--allow-incomplete-classpath\",\n\t\"-H:ResourceConfigurationFiles=../../configs/resource-config.json\",\n\t\"-H:ReflectionConfigurationFiles=../../configs/reflect-config.json\",\n\t\"-H:JNIConfigurationFiles=../../configs/jni-config.json\",\n\t\"-H:DynamicProxyConfigurationFiles=../../configs/proxy-config.json\"\n)\n```\n\nThe build with those updated options should succeed and the app can be run once again: \n\n```bash\ntarget/graalvm-native-image/apply-at-vdb\n\nSLF4J: Failed to load class \"org.slf4j.impl.StaticLoggerBinder\".\nSLF4J: Defaulting to no-operation (NOP) logger implementation\nSLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.\n```\n\nStill no logging, sadly. But the server is actually running and responds to POST requests via its exposed endpoint:\n\n```json\nPOST localhost:8080/api/v1/apply\n\n{\n\t\"email\": \"my@email.de\",\n\t\"name\": \"My Name\",\n\t\"phoneNumber\": \"+310123456789\",\n\t\"applicationBase64\": \"VGhpcyBjb3VsZCBiZSB5b3VyIGFwcGxpY2F0aW9uIQ==\"\n}\n\nResponse:\n\"*confetti* Thanks for handing in your application, we will get back to you within the next days! *confetti*\"\n```\n\nThe next and last step will investigate why logging is not picked up by GraalVM.\n\n### Investigating the missing logging\n\nSo first I wanted to have a look if it was an overall issue with logging. I stepped back from using logging-framework and tried the most basic logging with the java-integrated `java.util.Logging`. GraalVM's [docs](https://www.graalvm.org/docs/Native-Image/user/LOGGING) stated that GraalVM supports any logging that depends on that.\n\nBuilding and running the native-image with `java.util.Logging` instead of `logback` succeeded and everything is logged properly.\n\nSo it must be something with the dependencies?\n\nFor further investigation, I added the [sbt-dependency-graph](https://github.com/jrudolph/sbt-dependency-graph) plugin and checked out the dependency-tree with `sbt dependencyBrowserTree`. The library `logback` wasn't included in the dependency tree.\nWhich is odd, since `logback` is clearly present in the project's library-dependencies.\n\n```java scala\n// inside build.sbt\nlibraryDependencies ++= Seq(\n\t...\n\t\"ch.qos.logback\" % \"logback-classic\" % \"1.2.3\" % Runtime,\n\t\"ch.qos.logback\" % \"logback-core\" % \"1.2.3\" % Runtime,\n\t...\n)\n```\n\nHaving a closer look, the appendix `% Runtime` on logback's dependency is present.\n\nNot sure where this was coming from but it is most probably blindly copy-pasted from somewhere when gathering the dependencies for this project.\n\n[sbt reference manual](https://www.scala-sbt.org/1.x/docs/Scopes.html#Scoping+by+the+configuration+axis) states that the appendix `Runtime` defines that this dependency will be only included in the runtime classpath.\n\nSo this explains probably why logging was only working when the server was run from inside sbt.\n\nWith removing this and building the native-image, `logback` appears in the dependency-tree, and logging works when the native image is executed!\n\nThis \"bug\" was interesting as it emphasized what GraalVM can NOT do for you. Dynamic class loading/linking can not be supported by GraalVM as classes and dependencies have to be present during compile time to make a fully functional application. \n\n### Roundup\n\nA successful setup of sbt and GraalVM to build native-images requires to:\n\n- install GraalVM's native-image functionality via it's graal-updater: \n ```bash\n gu install native-image\n ```\n- add sbt-native-packager and sbt-assembly to sbt:\n ```java scala sbt\n // inside project/plugins.sbt\n addSbtPlugin(\"com.typesafe.sbt\" % \"sbt-native-packager\" % \"1.7.3\")\n addSbtPlugin(\"com.eed3si9n\" % \"sbt-assembly\" % \"0.14.6\")\n ```\n- enable the GraalVM-Plugin:\n ```java scala sbt\n // inside build.sbt\n enablePlugins(GraalVMNativeImagePlugin)\n ```\n- create a fat JAR and define which resource and configuration files should be intergated by intercepting look up calls during its execution:\n ```bash\n sbt assembly\n mkdir configs\n $GRAALHOME/bin/java -agentlib:native-image-agent=config-output-dir=./configs -jar target/scala-2.12/apply-at-vdb-assembly-0.1.0-SNAPSHOT.jar\n ```\n- fine-tune GraalVM with the following options and include the files that have been created in the previous step:\n ```java scala\n // build.sbt\n graalVMNativeImageOptions ++= Seq(\n \"--allow-incomplete-classpath\",\n \"-H:ResourceConfigurationFiles=../../configs/resource-config.json\",\n \"-H:ReflectionConfigurationFiles=../../configs/reflect-config.json\",\n \"-H:JNIConfigurationFiles=../../configs/jni-config.json\",\n \"-H:DynamicProxyConfigurationFiles=../../configs/proxy-config.json\"\n )\n ```\n- build the native image with:\n ```bash\n sbt graalvm-native-image:packageBin\n ```\n- run the executable file without the need of java\n ```\n ./target/graalvm-native-image/apply-at-vdb\n ```\n\nEven without benchmarking, you notice that the startup time is way faster than with a traditional JAR-file and the application is up and running almost instantly.\n\nIt is worth noting that the creation of a native image is a quite time-consuming process. For this project, it took between 1 and 2 minutes. This is, of course, something a CI/CD-Server like Jenkins would take care of but it has to be kept in mind. \n\nWith a working native-image, it is time to dockerize.\n\n## Building Docker images\n\nIn this section two Docker containers will be built. One, following the \"normal\"-java way and the other will be using the native-image to build a Docker-container without Java.\n\nBefore getting started with native images, a regular JAR-file and Docker image for comparison can be built.\n\nWith the [sbt-assembly](https://github.com/sbt/sbt-assembly) plugin you can create JAR-files with all of its dependencies (fat JARs).\n`sbt assembly` creates this `target/scala-2.12/apply-at-vdb-assembly-0.1.0-SNAPSHOT.jar` which has a size of around 42MB:\n\n```shell\n sbt assembly \n ls -lh target/scala-2.12/apply-at-vdb-assembly-0.1.0-SNAPSHOT.jar\n\n ... ... 42M target/scala-2.12/apply-at-vdb-assembly-0.1.0-SNAPSHOT.jar\n```\n\nThis application can be run locally via `java -jar target/scala-2.12/apply-at-vdb-assembly-0.1.0-SNAPSHOT.jar` with the prerequisite that Java is installed on that machine.\n\nCreating the Docker image for this JAR-file can be done manually, but luckily `sbt-native-package` supports building regular Docker images out of the box, only the `DockerPlugin` needs to be enabled:\n\n```java scala\n// build.sbt\nenablePlugins(DockerPlugin)\n```\n\n`sbt docker:publishLocal` creates the Docker image `apply-at-vdb`.\n \n```shell\ndocker images | grep apply-at-vdb\n apply-at-vdb \t0.1.0-SNAPSHOT \t\tf488d4c06f28 \t555MB\n```\n\nA whopping 555MB for a tiny app exposing one endpoint which JAR-file was only 42MB. But to run this JAR-file in a container, this container needs to ship with a JVM, and that's where the overhead lies.\n\nWith that Docker image and JAR-file as a reference, we can now look into how the native-image operates together with Docker.\n\nGraalVM does not support cross-building, meaning an application cannot be expected to be built in a MacOS environment and run in a Linux environment. It has to be built and run on the same platform. With the help of Docker, the desired built environment can be provided.\nThe `Dockerfile` looks as follows:\n```docker\nFROM oracle/graalvm-ce AS builder\nWORKDIR /app/vdb\nRUN gu install native-image\nRUN curl https://bintray.com/sbt/rpm/rpm > bintray-sbt-rpm.repo \\\n\t&& mv bintray-sbt-rpm.repo /etc/yum.repos.d/ \\\n\t&& yum install -y sbt\nCOPY . /app/vdb\nWORKDIR /app/vdb\nRUN sbt \"graalvm-native-image:packageBin\"\n\nFROM oraclelinux:7-slim\nCOPY --from=builder /app/vdb/target/graalvm-native-image/apply-at-vdb ./app/\nCMD ./app/apply-at-vdb\n\n```\n\nAnd can be run with:\n```bash\ndocker build -t native-apply-at-vdb .\n```\nThe Dockerfile describes to do the following:\nThe first docker container, as the name implies, is the builder. As a base image the official [GraalVM image](https://hub.docker.com/r/oracle/graalvm-ce) is used. \n\nThis image needs two more things, GraalVM's native-image command, and sbt, and this is what the two follow-up rows are providing. Once that's done, the project is copied into this container and the native image is built from within sbt.\n\nThe next steps bring the native executable into its own docker container.\nAs a base image, we use an Oracle Linux image and from our builder-container, we copy the native executable to this new container. The last step is that the app gets run on container startup.\n\n`docker run -p 8080:8080 -it native-apply-at-vdb` starts the container and shows that everything is working just as before.\n\nBut what about the image size? Let's have a look.\n```\ndocker images | grep apply-at-vdb\n native-apply-at-vdb\t\tlatest 17b559e78645\t\t199MB\n apply-at-vdb\t\t\t0.1.0-SNAPSHOT f488d4c06f28\t\t555MB\n```\nThat is impressive! We created an app that is approx. 2.8 times smaller than our original app.\n\n## Summary\n\nWe learned how to set up a Scala project with GraalVM, what steps have to be taken to build a native image with GraalVM, and let it run inside a Docker container. We also received a good overview of what's possible with GraalVM and what's not.\n\nThe initial start and setup of GraalVM with sbt is pretty easy and straightforward. Getting GraalVM to compile an sbt project is nice and simple. \n\nThis Hackathon showed us that it is difficult and requires a lot of fine-tuning to integrate GraalVM into an existing project or product. At Vandebron we work with a complex stack of technologies including Spark, Kafka, and Akka which made it difficult to port the findings from this small toy service to one of our existing microservices. This made extensive troubleshooting in the Hackathon not possible.\n\nAll in all, GraalVM allows you to give up some Java overhead and create significant smaller Docker images. Sadly, this comes at the cost of giving up dynamic linking and class loading. \nA silver lining is, that inside Scala's ecosystem this rarely a problem. Scala relies heavily on compile-time mechanisms for detecting bugs early and creating type-safe applications (read [here](https://blog.softwaremill.com/small-fast-docker-images-using-graalvms-native-image-99c0bc92e70b) but also see e.g. [Scala's compiler phases](https://typelevel.org/scala/docs/phases.html)).\n\n* * *\n\n## Sources and Reading\n- [Building Serverless Scala Services with GraalVM](https://www.inner-product.com/posts/serverless-scala-services-with-graalvm/) by Noel Welsh\n- [Small & fast Docker images using GraalVM’s native-image](https://blog.softwaremill.com/small-fast-docker-images-using-graalvms-native-image-99c0bc92e70b) by Adam Warski\n- [Run Scala applications with GraalVM and Docker](https://medium.com/rahasak/run-scala-applications-with-graalvm-and-docker-a1e67701e935) by @itseranga\n- [Getting Started with GraalVM and Scala](https://medium.com/graalvm/getting-started-with-graalvm-for-scala-d0a006dec1d1) by Oleg Šelajev\n- [Updates on Class Initialization in GraalVM Native Image Generation](https://medium.com/graalvm/updates-on-class-initialization-in-graalvm-native-image-generation-c61faca461f7) by \nChristian Wimmer\n- [GraalVM's Reference Manuals](https://www.graalvm.org/reference-manual/)\n","meta":{"title":"Building native images and compiling with GraalVM and sbt","description":"At Vandebron we organized a two-day long Hackathon, a colleague and I took the chance to dig into the wonderful world of GraalVM.","createdAt":"Tue Oct 06 2020 02:00:00 GMT+0200 (GMT+02:00)","coverImage":"images/building-native-images-and-compiling-with-graalvm-and-sbt.jpg","imageSource":"https://pixabay.com/users/lumix2004-3890388/","tags":"graalvm, scala","author":"Katrin Grunert","slug":"blog/building-native-images-and-compiling-with-graalvm-and-sbt","formattedDate":"6 oktober 2020","date":"Tue Oct 06 2020 02:00:00 GMT+0200 (GMT+02:00)"}}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"post":{"content":"\nAt Vandebron we organize a two-day long Hackathon every quarter, and a colleague and I took this chance to dig into the wonderful world of GraalVM.\n\nI've first heard of GraalVM around two years ago when Oleg Šelajev toured through Java User Groups in Germany and held talks about GraalVM. [Here](https://www.youtube.com/watch?v=GinNxS3OSi0) is one from 2019 (not Germany, but Spain this time).\n\nGraalVM promises a significant speedup in compile times and as I am working with Scala, which is notoriously known for its long compile times, this seems interesting. Furthermore, GraalVM provides functionality to build native executables. Meaning, an application can be run without a Java Virtual Machine (JVM).\n \nThanks to the Hackathon I finally took the time to get to know GraalVM a bit better. With this blog post, I want to share our findings, experiences, and results, as they might be helpful for you too!\n\n## What is GraalVM?\n\nGraalVM is a high-performance JVM that supports efficient ahead-of-time (AOT) and just-in-time (JIT) compilation, but also allows non-JVM languages (e.g. Ruby, Python, C++) to run on the JVM. The ahead-of-time compilation feature is the base for creating native executable programs, meaning an application can be run independently from the JVM. Seeing the versatile features of GraalVM, it is worth looking a bit under its hood.\n\nActually, GraalVM is defined by three main technologies:\n\n- [Graal compiler](https://www.graalvm.org/reference-manual/jvm/), a high-performance JIT-compiler that can make JVM applications run faster from within the JVM\n- [SubstrateVM](https://www.graalvm.org/reference-manual/native-image/SubstrateVM/), includes the necessary components to run a JVM-app as a native executable ( Garbage Collector, Thread Scheduler, etc.)\n- [Truffle Language Implementation Framework](https://www.graalvm.org/graalvm-as-a-platform/language-implementation-framework/), the basis for the polyglot support from GraalVM\n\nOur motivation for trying out GraalVM was tackling the pain points of Scala, Java projects, and microservices. Shipping microservices written in Scala as Docker containers to your production system comes with the cost that startup can be a bit slow, having JVM and Docker overhead, and that those containers can be fairly large, as the application can only be run with a JVM. See [Building Docker images](#building-docker-images) for more information.\n\nDuring the hackathon, we were most interested in building native images for Scala applications. Hoping to reduce the size of our docker containers and reducing up the startup time.\n\n## Project setup\n\nThe project we worked on during the Hackathon is an API that should be used for applicants to submit their applications at Vandebron in the future. By exposing one endpoint through which a resume and contact information can be submitted.\n\nIt is also a good project to test out GraalVM, nothing too complex but also not as simple as \"Hello World\".\n\nThe full setup can be found [on Github](https://github.com/kgrunert/apply-at-vdb). But I'll summarise the used stack below. The project is built around the following libraries, no particular reason, simply because I like them.\n\n- _cats_ for working with effects, such as IO\n- _http4s_ for running the server\n- _tapir_ for defining the endpoints\n- _circe_ for JSON de/serialisation\n- _pureconfig_ for reading config-files\n- _logback_ for logging\n\nThe project can be run via `sbt run` and with Postman or similar a POST-request can be sent like so:\n\n```json\nPOST localhost:8080/api/v1/apply\n\n{\n\t\"email\": \"my@email.de\",\n\t\"name\": \"My Name\",\n\t\"phoneNumber\": \"+310123456789\",\n\t\"applicationBase64\": \"VGhpcyBjb3VsZCBiZSB5b3VyIGFwcGxpY2F0aW9uIQ==\"\n}\n\nResponse:\n\"*confetti* Thanks for handing in your application, we will get back to you within the next days! *confetti*\"\n```\n\n## Setup GraalVM with sbt\n\nWith this initial project setup in mind, GraalVM needs to be installed locally.\n\nFor the installation of GraalVM the [setup guide](https://www.graalvm.org/docs/getting-started-with-graalvm/#install-graalvm) can be followed.\n\nAfter the installation sbt needs to know that not the regular JDK/JVM is used. This can be done with the `java-home` option on sbt bootup.\nTo make the path to GraalVM a bit more accessible and easy to use it can be exported as an environment variable.\n\n```bash\nexport GRAAL_HOME=/Library/Java/JavaVirtualMachines/graalvm-ce-java8-20.1.0/Contents/Home\nsbt -java-home $GRAALHOME\n```\n\nThe path to GraalVM can vary depending on OS and installation. We followed the basic installation for macOS.\n\nNow sbt using GraalVM can be verified with:\n\n```bash\nsbt -java-home $GRAALHOME\nscala> eval System.getProperty(\"java.home\")\n[info] ans: String = /Library/Java/JavaVirtualMachines/graalvm-ce-java8-20.1.0/Contents/Home/jre\n```\n\nThat means everything running in this sbt instance is getting compiled by GraalVM. Awesome!\n\nThe next step is to become strong and independent and learn how to run without an underlying JVM with the help of building native images.\n\n## Building native images\n\nGraalVM ships with the [GraalVM Updater](https://www.graalvm.org/reference-manual/graalvm-updater/) (`gu`) to install the `native-image` on your machine.\n\n```bash\n$GRAALHOME/bin/gu install native-image\n```\n\n[sbt-native-packager](https://sbt-native-packager.readthedocs.io/en/latest/) provides functionality to build packages efficiently (e.g. building Docker images) and added to that, it also provides support for building native images.\nIn order to build native images with sbt commands this plugin has to be added to the project:\n\n```java scala\n// inside project/plugins.sbt\naddSbtPlugin(\"com.typesafe.sbt\" % \"sbt-native-packager\" % \"1.7.3\")\n```\n\nAnd the `GraalVMNativeImagePlugin` needs to be enabled:\n\n```java scala\n// inside build.sbt\nenablePlugins(GraalVMNativeImagePlugin)\n```\n\nFrom within sbt it should be able to autocomplete and suggest graal-commands, e.g.:\n\n```java scala\nsbt:apply-at-vdb> graalvm\ngraalvm-native-image: graalvmNativeImageOptions\n```\n\nWith that setup, native images are just a stone's throw away!\n\n---\n\n### Disclaimer\n\nThe next three sections are not a write-up but rather the main steps we had to take to make the project work. This includes failing images and troubleshooting.\nI want to keep this in because it might be interesting for others when they have to troubleshoot.\nFor the summary and happy path, you can jump directly to [Roundup](#roundup).\n\n---\n\n### First try building a native image\n\nNext up `graalvm-native-image:packageBin` can be run from within sbt. This might take a while (on our systems it took about a minute)\n\nSome warnings start to pop up:\n\n```\n[error] warning: unknown locality of class Lnl/vandebron/applyatvdb/Main$anon$exportedReader$macro$24$1;, assuming class is not local. To remove the warning report an issue to the library or language author. The issue is caused by Lnl/vandebron/applyatvdb/Main$anon$exportedReader$macro$24$1; which is not following the naming convention.\n\n[error] warning: unknown locality of class Lfs2/internal/Algebra$Done$2$;, assuming class is not local. To remove the warning report an issue to the library or language author. The issue is caused by Lfs2/internal/Algebra$Done$2$; which is not following the naming convention.\n```\n\nThe library-specific warnings can be ignored for now. Ultimately it fails with:\n\n```\nError: com.oracle.graal.pointsto.constraints.UnresolvedElementException:\nDiscovered unresolved type during parsing: org.slf4j.impl.StaticLoggerBinder.\nTo diagnose the issue you can use the --allow-incomplete-classpath option.\nThe missing type is then reported at run time when it is accessed the first time.\n```\nActually a good hint on where to start fine-tuning the GraalVM config:\n\n```java scala\n// inside build.sbt\ngraalVMNativeImageOptions ++= Seq(\n\t\"--allow-incomplete-classpath\",\n)\n```\n\nSome things like a `StaticLoggerBinder` only get resolved at runtime, meaning at build time the classpath needs to be allowed to be incomplete. This option allows resolution errors to be ignored at build time and only pop up during runtime.\n\nDuring the build of a native image, GraalVM tries to resolve those runtime dependencies already at compile-time, as it is part of the Ahead-Of-Time-compilation process. With this flag, GraalVM knows \"hey, don't worry about it now, we cross the bridge when we get there\" (or something like that).\n\n### Adding resource files\n\nA `reload` (or restart) of sbt is needed to activate these new options. And we can try to build the native image up new.\nThis time the build finished successfully and the executable file `target/graalvm-native-image/apply-at-vdb` has been created!\nThis is an executable that can be run without a JVM:\n\n```bash\ntarget/graalvm-native-image/apply-at-vdb\n```\n\nBut what's that? It actually cannot be started...\n\n```bash\ntarget/graalvm-native-image/apply-at-vdb\n\nSLF4J: Failed to load class \"org.slf4j.impl.StaticLoggerBinder\".\nSLF4J: Defaulting to no-operation (NOP) logger implementation\nSLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.\n*** An error occured! ***\nCannot convert configuration to a de.erewl.pricetracker.server.Config. Failures are:\nat the root:\n- Key not found: 'host'.\n- Key not found: 'port'.\n```\n\nThe first three lines relate to the error that occurred during the first build. It simply says that logging hasn't been set up correctly (maybe due to the absence of a `src/main/resources/logback.xml` or some other misconfiguration), triggering the default setting of not logging anything at all.\nThe second error states that a configuration file does not have the right keys or cannot be found at all.\nLooking into `src/main/resources`:\n\n```bash\nls src/main/resources/\napplication.conf logback.xml\n```\n\nand peeking into `application.conf`:\n\n```bash\ncat src/main/resources/application.conf\n\thost = \"localhost\"\n\tport = 8080\n```\n\nHm, so everything is actually in place. But somehow GraalVM can't find those files.\nIt still requires some more GraalVM fine-tuning here.\n\nBy default, GraalVM doesn't include any resource or configuration-files.\nThe option `-H:ResourceConfigurationFiles=path/to/resource-config.json` defines a path to a JSON configuration file. So inside the `resource-config.json` we can include our `application.conf` and our `logback.xml`.\n\nBut writing those config files can be tedious and it is difficult in larger projects to find all necessary classes that need to be included. GraalVM provides some support with writing those files and actually does all the work. In the project's root directory a configs-folder can be created which will contain all necessary config-files.\n\nFor writing the configuration files we will build a normal JAR-file with the help of the `sbt-assembly` plugin. Adding it to the project like so:\n\n```java scala sbt\n // inside project/plugins.sbt\n addSbtPlugin(\"com.eed3si9n\" % \"sbt-assembly\" % \"0.14.6\")\n```\n\nThe JAR-file will be built with `sbt assembly`.\n\nWith that we can now start the application, providing the path to the JAR-file that just has been created:\n\n```bash\nmkdir configs\n$GRAALHOME/bin/java -agentlib:native-image-agent=config-output-dir=./configs -jar target/scala-2.12/apply-at-vdb-assembly-0.1.0-SNAPSHOT.jar\n```\n\nWith the command above the JAR gets to run with GraalVM but adds [dynamic lookups](https://www.graalvm.org/reference-manual/native-image/Configuration/#assisted-configuration-of-native-image-builds) that are being intercepted during runtime and written to the files: `jni-config.json`, `proxy-config.json`, `reflect-config.json` and `resource-config.json`.\n\nThose generated files can be included in the GraalVMNativeImageOptions:\n\n```java scala\n// build.sbt\ngraalVMNativeImageOptions ++= Seq(\n\t\"--allow-incomplete-classpath\",\n\t\"-H:ResourceConfigurationFiles=../../configs/resource-config.json\",\n\t\"-H:ReflectionConfigurationFiles=../../configs/reflect-config.json\",\n\t\"-H:JNIConfigurationFiles=../../configs/jni-config.json\",\n\t\"-H:DynamicProxyConfigurationFiles=../../configs/proxy-config.json\"\n)\n```\n\nThe build with those updated options should succeed and the app can be run once again: \n\n```bash\ntarget/graalvm-native-image/apply-at-vdb\n\nSLF4J: Failed to load class \"org.slf4j.impl.StaticLoggerBinder\".\nSLF4J: Defaulting to no-operation (NOP) logger implementation\nSLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.\n```\n\nStill no logging, sadly. But the server is actually running and responds to POST requests via its exposed endpoint:\n\n```json\nPOST localhost:8080/api/v1/apply\n\n{\n\t\"email\": \"my@email.de\",\n\t\"name\": \"My Name\",\n\t\"phoneNumber\": \"+310123456789\",\n\t\"applicationBase64\": \"VGhpcyBjb3VsZCBiZSB5b3VyIGFwcGxpY2F0aW9uIQ==\"\n}\n\nResponse:\n\"*confetti* Thanks for handing in your application, we will get back to you within the next days! *confetti*\"\n```\n\nThe next and last step will investigate why logging is not picked up by GraalVM.\n\n### Investigating the missing logging\n\nSo first I wanted to have a look if it was an overall issue with logging. I stepped back from using logging-framework and tried the most basic logging with the java-integrated `java.util.Logging`. GraalVM's [docs](https://www.graalvm.org/docs/Native-Image/user/LOGGING) stated that GraalVM supports any logging that depends on that.\n\nBuilding and running the native-image with `java.util.Logging` instead of `logback` succeeded and everything is logged properly.\n\nSo it must be something with the dependencies?\n\nFor further investigation, I added the [sbt-dependency-graph](https://github.com/jrudolph/sbt-dependency-graph) plugin and checked out the dependency-tree with `sbt dependencyBrowserTree`. The library `logback` wasn't included in the dependency tree.\nWhich is odd, since `logback` is clearly present in the project's library-dependencies.\n\n```java scala\n// inside build.sbt\nlibraryDependencies ++= Seq(\n\t...\n\t\"ch.qos.logback\" % \"logback-classic\" % \"1.2.3\" % Runtime,\n\t\"ch.qos.logback\" % \"logback-core\" % \"1.2.3\" % Runtime,\n\t...\n)\n```\n\nHaving a closer look, the appendix `% Runtime` on logback's dependency is present.\n\nNot sure where this was coming from but it is most probably blindly copy-pasted from somewhere when gathering the dependencies for this project.\n\n[sbt reference manual](https://www.scala-sbt.org/1.x/docs/Scopes.html#Scoping+by+the+configuration+axis) states that the appendix `Runtime` defines that this dependency will be only included in the runtime classpath.\n\nSo this explains probably why logging was only working when the server was run from inside sbt.\n\nWith removing this and building the native-image, `logback` appears in the dependency-tree, and logging works when the native image is executed!\n\nThis \"bug\" was interesting as it emphasized what GraalVM can NOT do for you. Dynamic class loading/linking can not be supported by GraalVM as classes and dependencies have to be present during compile time to make a fully functional application. \n\n### Roundup\n\nA successful setup of sbt and GraalVM to build native-images requires to:\n\n- install GraalVM's native-image functionality via it's graal-updater: \n ```bash\n gu install native-image\n ```\n- add sbt-native-packager and sbt-assembly to sbt:\n ```java scala sbt\n // inside project/plugins.sbt\n addSbtPlugin(\"com.typesafe.sbt\" % \"sbt-native-packager\" % \"1.7.3\")\n addSbtPlugin(\"com.eed3si9n\" % \"sbt-assembly\" % \"0.14.6\")\n ```\n- enable the GraalVM-Plugin:\n ```java scala sbt\n // inside build.sbt\n enablePlugins(GraalVMNativeImagePlugin)\n ```\n- create a fat JAR and define which resource and configuration files should be intergated by intercepting look up calls during its execution:\n ```bash\n sbt assembly\n mkdir configs\n $GRAALHOME/bin/java -agentlib:native-image-agent=config-output-dir=./configs -jar target/scala-2.12/apply-at-vdb-assembly-0.1.0-SNAPSHOT.jar\n ```\n- fine-tune GraalVM with the following options and include the files that have been created in the previous step:\n ```java scala\n // build.sbt\n graalVMNativeImageOptions ++= Seq(\n \"--allow-incomplete-classpath\",\n \"-H:ResourceConfigurationFiles=../../configs/resource-config.json\",\n \"-H:ReflectionConfigurationFiles=../../configs/reflect-config.json\",\n \"-H:JNIConfigurationFiles=../../configs/jni-config.json\",\n \"-H:DynamicProxyConfigurationFiles=../../configs/proxy-config.json\"\n )\n ```\n- build the native image with:\n ```bash\n sbt graalvm-native-image:packageBin\n ```\n- run the executable file without the need of java\n ```\n ./target/graalvm-native-image/apply-at-vdb\n ```\n\nEven without benchmarking, you notice that the startup time is way faster than with a traditional JAR-file and the application is up and running almost instantly.\n\nIt is worth noting that the creation of a native image is a quite time-consuming process. For this project, it took between 1 and 2 minutes. This is, of course, something a CI/CD-Server like Jenkins would take care of but it has to be kept in mind. \n\nWith a working native-image, it is time to dockerize.\n\n## Building Docker images\n\nIn this section two Docker containers will be built. One, following the \"normal\"-java way and the other will be using the native-image to build a Docker-container without Java.\n\nBefore getting started with native images, a regular JAR-file and Docker image for comparison can be built.\n\nWith the [sbt-assembly](https://github.com/sbt/sbt-assembly) plugin you can create JAR-files with all of its dependencies (fat JARs).\n`sbt assembly` creates this `target/scala-2.12/apply-at-vdb-assembly-0.1.0-SNAPSHOT.jar` which has a size of around 42MB:\n\n```shell\n sbt assembly \n ls -lh target/scala-2.12/apply-at-vdb-assembly-0.1.0-SNAPSHOT.jar\n\n ... ... 42M target/scala-2.12/apply-at-vdb-assembly-0.1.0-SNAPSHOT.jar\n```\n\nThis application can be run locally via `java -jar target/scala-2.12/apply-at-vdb-assembly-0.1.0-SNAPSHOT.jar` with the prerequisite that Java is installed on that machine.\n\nCreating the Docker image for this JAR-file can be done manually, but luckily `sbt-native-package` supports building regular Docker images out of the box, only the `DockerPlugin` needs to be enabled:\n\n```java scala\n// build.sbt\nenablePlugins(DockerPlugin)\n```\n\n`sbt docker:publishLocal` creates the Docker image `apply-at-vdb`.\n \n```shell\ndocker images | grep apply-at-vdb\n apply-at-vdb \t0.1.0-SNAPSHOT \t\tf488d4c06f28 \t555MB\n```\n\nA whopping 555MB for a tiny app exposing one endpoint which JAR-file was only 42MB. But to run this JAR-file in a container, this container needs to ship with a JVM, and that's where the overhead lies.\n\nWith that Docker image and JAR-file as a reference, we can now look into how the native-image operates together with Docker.\n\nGraalVM does not support cross-building, meaning an application cannot be expected to be built in a MacOS environment and run in a Linux environment. It has to be built and run on the same platform. With the help of Docker, the desired built environment can be provided.\nThe `Dockerfile` looks as follows:\n```docker\nFROM oracle/graalvm-ce AS builder\nWORKDIR /app/vdb\nRUN gu install native-image\nRUN curl https://bintray.com/sbt/rpm/rpm > bintray-sbt-rpm.repo \\\n\t&& mv bintray-sbt-rpm.repo /etc/yum.repos.d/ \\\n\t&& yum install -y sbt\nCOPY . /app/vdb\nWORKDIR /app/vdb\nRUN sbt \"graalvm-native-image:packageBin\"\n\nFROM oraclelinux:7-slim\nCOPY --from=builder /app/vdb/target/graalvm-native-image/apply-at-vdb ./app/\nCMD ./app/apply-at-vdb\n\n```\n\nAnd can be run with:\n```bash\ndocker build -t native-apply-at-vdb .\n```\nThe Dockerfile describes to do the following:\nThe first docker container, as the name implies, is the builder. As a base image the official [GraalVM image](https://hub.docker.com/r/oracle/graalvm-ce) is used. \n\nThis image needs two more things, GraalVM's native-image command, and sbt, and this is what the two follow-up rows are providing. Once that's done, the project is copied into this container and the native image is built from within sbt.\n\nThe next steps bring the native executable into its own docker container.\nAs a base image, we use an Oracle Linux image and from our builder-container, we copy the native executable to this new container. The last step is that the app gets run on container startup.\n\n`docker run -p 8080:8080 -it native-apply-at-vdb` starts the container and shows that everything is working just as before.\n\nBut what about the image size? Let's have a look.\n```\ndocker images | grep apply-at-vdb\n native-apply-at-vdb\t\tlatest 17b559e78645\t\t199MB\n apply-at-vdb\t\t\t0.1.0-SNAPSHOT f488d4c06f28\t\t555MB\n```\nThat is impressive! We created an app that is approx. 2.8 times smaller than our original app.\n\n## Summary\n\nWe learned how to set up a Scala project with GraalVM, what steps have to be taken to build a native image with GraalVM, and let it run inside a Docker container. We also received a good overview of what's possible with GraalVM and what's not.\n\nThe initial start and setup of GraalVM with sbt is pretty easy and straightforward. Getting GraalVM to compile an sbt project is nice and simple. \n\nThis Hackathon showed us that it is difficult and requires a lot of fine-tuning to integrate GraalVM into an existing project or product. At Vandebron we work with a complex stack of technologies including Spark, Kafka, and Akka which made it difficult to port the findings from this small toy service to one of our existing microservices. This made extensive troubleshooting in the Hackathon not possible.\n\nAll in all, GraalVM allows you to give up some Java overhead and create significant smaller Docker images. Sadly, this comes at the cost of giving up dynamic linking and class loading. \nA silver lining is, that inside Scala's ecosystem this rarely a problem. Scala relies heavily on compile-time mechanisms for detecting bugs early and creating type-safe applications (read [here](https://blog.softwaremill.com/small-fast-docker-images-using-graalvms-native-image-99c0bc92e70b) but also see e.g. [Scala's compiler phases](https://typelevel.org/scala/docs/phases.html)).\n\n* * *\n\n## Sources and Reading\n- [Building Serverless Scala Services with GraalVM](https://www.inner-product.com/posts/serverless-scala-services-with-graalvm/) by Noel Welsh\n- [Small & fast Docker images using GraalVM’s native-image](https://blog.softwaremill.com/small-fast-docker-images-using-graalvms-native-image-99c0bc92e70b) by Adam Warski\n- [Run Scala applications with GraalVM and Docker](https://medium.com/rahasak/run-scala-applications-with-graalvm-and-docker-a1e67701e935) by @itseranga\n- [Getting Started with GraalVM and Scala](https://medium.com/graalvm/getting-started-with-graalvm-for-scala-d0a006dec1d1) by Oleg Šelajev\n- [Updates on Class Initialization in GraalVM Native Image Generation](https://medium.com/graalvm/updates-on-class-initialization-in-graalvm-native-image-generation-c61faca461f7) by \nChristian Wimmer\n- [GraalVM's Reference Manuals](https://www.graalvm.org/reference-manual/)\n","meta":{"title":"Building native images and compiling with GraalVM and sbt","description":"At Vandebron we organized a two-day long Hackathon, a colleague and I took the chance to dig into the wonderful world of GraalVM.","createdAt":"Tue Oct 06 2020 02:00:00 GMT+0200 (Central European Summer Time)","coverImage":"images/building-native-images-and-compiling-with-graalvm-and-sbt.jpg","imageSource":"https://pixabay.com/users/lumix2004-3890388/","tags":"graalvm, scala","author":"Katrin Grunert","slug":"blog/building-native-images-and-compiling-with-graalvm-and-sbt","formattedDate":"6 oktober 2020","date":"Tue Oct 06 2020 02:00:00 GMT+0200 (Central European Summer Time)"}}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/cassandra-its-not-you-its-us.json b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/cassandra-its-not-you-its-us.json similarity index 93% rename from _next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/cassandra-its-not-you-its-us.json rename to _next/data/tJlUn5_CjNiSTMoSsoO6j/blog/cassandra-its-not-you-its-us.json index e28ad2c9e..d1008cf54 100644 --- a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/cassandra-its-not-you-its-us.json +++ b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/cassandra-its-not-you-its-us.json @@ -1 +1 @@ -{"pageProps":{"post":{"content":"\n# Cassandra, it’s not you, it’s us\n\nI want you to know that you are probably an amazing product that has so much to offer to the world. However, it sadly just isn’t working out for us anymore.\n\nWe've encountered challenges such as escalating costs, inconsistent write and read performances, and setup misalignments that have constrained our growth. Of course, this is not entirely your fault, we set you up to fail with our infrastructure and use cases.\n\nI hope we can part on good terms, with mutual respect and appreciation for the time we shared. \nI wish you all the happiness, success, and fulfilment in the world, and I hope you find a company that complements your life in the way you deserve.\n\nThank you for understanding, and I truly wish you the best.\n\nYours truly, Vandebron\n\n## Our Data Storage Prince Charming\n![data-prince-charming.jpg](../images/data-prince-charming.jpg \"Data Prince\")\n\nA list of some of the qualities we are looking for:\n- Kindness and compassion. \n- High availability.\n- Low Maintenance.\n- Ability to store large volumes of data (currently around 10TB), though not everything has to be queried fast.\n- Capable of ingesting real-time energy usage data (every 15 minutes per customer, possibly higher frequency in the future).\n- Ideally, we can use our current tech stack as much as possible (flyway migrations, roundtrip tests, spark).\n- Ideally, use as few different database technologies as possible.\n- It does not need to be horizontally scalable, due to moving from 1 central data storage to a separate data storage per service.\n\nWith enough work, time and commitment, Cassandra could have fulfilled most of these requirements. However, love is a two-way street, and we didn't put in the time and effort to make it work.\n\n## Speed Dating Round\nSome potential suitors we considered for replacing Cassandra:\n\n#### ScyllaDB\nScyllaDB is very similar to Cassandra. It should have better performance but still have (almost) all the same functionality as Cassandra.\n\n#### PostgreSQL\nPostgreSQL is a relational database. We already use it extensively in our services.\n\n#### Cockroach\nIt is similar to PostgreSQL but with some limitations: [Known Limitations in CockroachDB v23.2](https://www.cockroachlabs.com/docs/stable/known-limitations.html)\n\nIt is horizontally scalable, which is an advantage over PostgreSQL when it comes to high availability and fault tolerance. We are also currently using it in some of our services.\n\n#### Timescale\nTimescale is a PostgreSQL extension that uses the same query layer, but a different storage layer, to have efficient time series-related features.\n\nIt can also distribute data, but this is still in early access and is not recommended.\n\n#### Yugabyte\n\nYugabyte is a PostgreSQL extension to make PostgreSQL into a distributed database.\n\n## Comparisons\n\nTo determine the most suitable match, we did some quick performance tests. One where we inserted 2 million + weather data records as fast as possible via recurring inserts, to see how easy it would be to migrate over to. And another test to determine general query speed.\n\n### Write Speed Results\n![insert-perf-database.jpg](../images/insert-perf-database.jpg \"Insert Graph\")\n\nNote that the test results are not 100% fair, because Timescale and Postgres don’t have to distribute the data over multiple nodes (though Timescale does have 2 replicas), and Cassandra already contained a lot of data (though with some testing timescale didn’t seem to become slower when it already had more data). For Yugabyte and Cockroach, we gave up after 1 hour. Also, the tests were done with the existing setup for Cassandra.\n\n### Query Speed Results\n![query-perf-database.jpg](../images/query-perf-database.jpg \"Query Graph\")\n\nWe also did some tests to query aggregated data from streaming data.\n- For this, we copied over 2.6M rows to each database.\n- For this data we need to aggregate (sum) some values per 15-minute time block).\n- For Cassandra/Scylla, this is done via spark.\n- For timescale use buckets based on timestamps.\n- For Postgres by grouping on floor(extract(epoch from timestamp) / 60 / 15)\n\n## Our Happily Ever After\n\nTimescale emerged as the clear winner here, not just for its performance in the above tests, but also for its seamless integration with our existing PostgreSQL setup. This compatibility allows us to maintain our current libraries and reduce code complexity, making Timescale an ideal choice for our time series data. At the same time, we continue to rely on Postgres for our other needs.\n\nCassandra, you won’t be missed.","meta":{"title":"Cassandra, it’s not you, it’s us","description":"Our Journey to find the perfect data storage solution for us","createdAt":"Fri Feb 16 2024 01:00:00 GMT+0100 (GMT+01:00)","coverImage":"images/heart-breaking.jpg","tags":["cassandra","timescale","postgresql"],"author":"Tomás Phelan","slug":"blog/cassandra-its-not-you-its-us","formattedDate":"16 februari 2024","date":"Fri Feb 16 2024 01:00:00 GMT+0100 (GMT+01:00)"}}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"post":{"content":"\n# Cassandra, it’s not you, it’s us\n\nI want you to know that you are probably an amazing product that has so much to offer to the world. However, it sadly just isn’t working out for us anymore.\n\nWe've encountered challenges such as escalating costs, inconsistent write and read performances, and setup misalignments that have constrained our growth. Of course, this is not entirely your fault, we set you up to fail with our infrastructure and use cases.\n\nI hope we can part on good terms, with mutual respect and appreciation for the time we shared. \nI wish you all the happiness, success, and fulfilment in the world, and I hope you find a company that complements your life in the way you deserve.\n\nThank you for understanding, and I truly wish you the best.\n\nYours truly, Vandebron\n\n## Our Data Storage Prince Charming\n![data-prince-charming.jpg](../images/data-prince-charming.jpg \"Data Prince\")\n\nA list of some of the qualities we are looking for:\n- Kindness and compassion. \n- High availability.\n- Low Maintenance.\n- Ability to store large volumes of data (currently around 10TB), though not everything has to be queried fast.\n- Capable of ingesting real-time energy usage data (every 15 minutes per customer, possibly higher frequency in the future).\n- Ideally, we can use our current tech stack as much as possible (flyway migrations, roundtrip tests, spark).\n- Ideally, use as few different database technologies as possible.\n- It does not need to be horizontally scalable, due to moving from 1 central data storage to a separate data storage per service.\n\nWith enough work, time and commitment, Cassandra could have fulfilled most of these requirements. However, love is a two-way street, and we didn't put in the time and effort to make it work.\n\n## Speed Dating Round\nSome potential suitors we considered for replacing Cassandra:\n\n#### ScyllaDB\nScyllaDB is very similar to Cassandra. It should have better performance but still have (almost) all the same functionality as Cassandra.\n\n#### PostgreSQL\nPostgreSQL is a relational database. We already use it extensively in our services.\n\n#### Cockroach\nIt is similar to PostgreSQL but with some limitations: [Known Limitations in CockroachDB v23.2](https://www.cockroachlabs.com/docs/stable/known-limitations.html)\n\nIt is horizontally scalable, which is an advantage over PostgreSQL when it comes to high availability and fault tolerance. We are also currently using it in some of our services.\n\n#### Timescale\nTimescale is a PostgreSQL extension that uses the same query layer, but a different storage layer, to have efficient time series-related features.\n\nIt can also distribute data, but this is still in early access and is not recommended.\n\n#### Yugabyte\n\nYugabyte is a PostgreSQL extension to make PostgreSQL into a distributed database.\n\n## Comparisons\n\nTo determine the most suitable match, we did some quick performance tests. One where we inserted 2 million + weather data records as fast as possible via recurring inserts, to see how easy it would be to migrate over to. And another test to determine general query speed.\n\n### Write Speed Results\n![insert-perf-database.jpg](../images/insert-perf-database.jpg \"Insert Graph\")\n\nNote that the test results are not 100% fair, because Timescale and Postgres don’t have to distribute the data over multiple nodes (though Timescale does have 2 replicas), and Cassandra already contained a lot of data (though with some testing timescale didn’t seem to become slower when it already had more data). For Yugabyte and Cockroach, we gave up after 1 hour. Also, the tests were done with the existing setup for Cassandra.\n\n### Query Speed Results\n![query-perf-database.jpg](../images/query-perf-database.jpg \"Query Graph\")\n\nWe also did some tests to query aggregated data from streaming data.\n- For this, we copied over 2.6M rows to each database.\n- For this data we need to aggregate (sum) some values per 15-minute time block).\n- For Cassandra/Scylla, this is done via spark.\n- For timescale use buckets based on timestamps.\n- For Postgres by grouping on floor(extract(epoch from timestamp) / 60 / 15)\n\n## Our Happily Ever After\n\nTimescale emerged as the clear winner here, not just for its performance in the above tests, but also for its seamless integration with our existing PostgreSQL setup. This compatibility allows us to maintain our current libraries and reduce code complexity, making Timescale an ideal choice for our time series data. At the same time, we continue to rely on Postgres for our other needs.\n\nCassandra, you won’t be missed.","meta":{"title":"Cassandra, it’s not you, it’s us","description":"Our Journey to find the perfect data storage solution for us","createdAt":"Fri Feb 16 2024 01:00:00 GMT+0100 (Central European Standard Time)","coverImage":"images/heart-breaking.jpg","tags":["cassandra","timescale","postgresql"],"author":"Tomás Phelan","slug":"blog/cassandra-its-not-you-its-us","formattedDate":"16 februari 2024","date":"Fri Feb 16 2024 01:00:00 GMT+0100 (Central European Standard Time)"}}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/choosing-remix-as-an-ssr-framework.json b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/choosing-remix-as-an-ssr-framework.json similarity index 95% rename from _next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/choosing-remix-as-an-ssr-framework.json rename to _next/data/tJlUn5_CjNiSTMoSsoO6j/blog/choosing-remix-as-an-ssr-framework.json index d98b2a8e5..ea58c1a10 100644 --- a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/choosing-remix-as-an-ssr-framework.json +++ b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/choosing-remix-as-an-ssr-framework.json @@ -1 +1 @@ -{"pageProps":{"post":{"content":"\n## The Background\n\nWe at Vandebron have a mission to get the news out about [our good work](https://vandebron.nl/missie), and we understand that [Server Side Rendering (SSR)](https://web.dev/articles/rendering-on-the-web#server-side) can really help with that. Among other things, it provides an easy way for search engines to discover our pages, so you, our (future?!) customer, can find them more easily. That means more people choosing green energy, and ultimately, a cleaner environment! 🎉\n\n## We rolled our own\n\nThe year was 2017, Covid was still a word that sounded more like a bird than anything else... The world was heating up and Vandebron was 4 years into its mission to bring 100% renewable energy throughout all of the Netherlands.\n\nAs far as web technologies are concerned, 4 years was ages ago. It was a time when NextJS was less than a year old, and Remix was still several years from coming out. But we needed a way to deliver that high-quality content to all of you. So, the innovators that we were, we decided to build our own SSR framework. In short, we wanted pizza, but there were no pizza shops in town... So we made our own!\n\nIt's been great but not without issue...\n\n\n \n \n \n \n
\"ugly-window-mock\"\"remix-migration-mocking-a-window\"
\n\n\n\n## A Short Note: Why Server Side Rendering\n\nYou might not be satisfied with the short explanation of why we picked an SSR framework in the first place. This article isn't really about that - if you're interested in more analysis on when and where to choose an SSR framework, check out these excellent articles from Splunk:\n* [The User Experience (UX) Benefits of SSR](https://www.splunk.com/en_us/blog/learn/server-side-rendering-ssr.html)\n* [The SEO Benefits of SSR](https://www.splunk.com/en_us/blog/learn/server-side-rendering-ssr.html)\n\n## Decisions Made the Right Way - A Comparison\n\nNowadays, there are better, industry standard technologies available! I.e. pizza shops have opened nearby!! Let's find a good one. Of course, you don't want to just go to any spot. Especially if there's more than one shop in town - you'd be silly not to check which one is closest, and look at the menu. Which one has better reviews, is that one very angry customer just upset that there wasn't any anchovies in the vegan pizza shop? What were they expecting anyway?\n\"vegan-pizza-shop\"\n\nAt Vandebron we're a React shop, so we limited ourselves to just SSR frameworks supporting React. The choice of one framework over another is of crucial importance, so, as part of our analysis, we built a small part of our [vandebron.nl/blog](https://vandebron.nl/blog) page twice. Two of our engineers then presented these prototypes to our Front End Guild, and this discussion fed heavily into the Architecture Decision Record that we wrote comparing the results.\n\n\\* At Vandebron, Guilds are groups of engineers from disparate teams that are interested in a single domain: i.e. Backend, Frontend, IAM and Auth, etc. \n\nThe Background for the decision record states this:\n\n> _\"Our Frontend currently uses a custom-built, hard to maintain SSR solution, which we'd like to replace with a modern and standard library. Possible candidates are NextJS and Remix. The goal is to investigate which one suits our needs best.\"_\n\nYes, there are other options we could have considered but we wanted to stay with a tried-and-tested framework and one that was compatible with our existing React setup.\n![remix-migration-adr-options-considered.png](../images/remix-migration-adr-options-considered.png)\n\nAs you can see, the comparison between the two frameworks was very similar. In the end we favoured the simple, opinionated direction of Remix over that of the more full-featured but potentially complex setup of NextJS. Even though Remix has a smaller community, we attributed this mostly to the age of the framework and not the quality of the framework itself. Though the Positivity has gone down a bit (as listed in [the 2023 StateOfJS survey](https://2023.stateofjs.com/en-US/libraries/meta-frameworks/),) the decrease has been relatively minor and in line with most-other frameworks (notable exceptions for Astro and SvelteKit which have both seen big upticks in both Usage and Positivity)\n![State of JS Positivity](../images/remix-migration-sojs-framework-positivity.png)\nFinally, we noted that NextJS is tightly coupled with Vercel. At Vandebron we value platform independence and not getting tied to specific hosting providers or platforms. Remix gives us the independence we're looking for by providing a SSR framework without a potential to be tied into other solutions/platforms in the future.\n\nOutcome\n> _\"Most members favoured Remix’s focus on web standards and usage of standard libraries and were put off (a little) by NextJS’s uncertainty in development direction.\"_\n\n## So, How's it Going?\n\nThe migration effort is still underway but already we can report that it's going quite well - developers are excited to work on the new tech stack because it's seen as a developer-friendly platform and one of the two leading frameworks in the industry. In the words of one engineer: \"Dev experience has improved massively, it's fun, it's easy to work with\"\nHere are some of the things we still need to work on:\n- Our Docker image is quite large as it includes all the `node_modules`. We think we can clean this up a bit by using Yarn's Plug'n'Play (PnP) feature which should lead to faster image-build times and faster container startup times.\n- With our custom SSR solution, we use Redux Toolkit (RTK) and RTKQuery on the server... This is of course an anti pattern on the server, since server-side logic should be stateless. The Remix framework does already tries to be smart with it's loaders, so the benefits we might have gotten from RTK aren't needed there.\n- We feel the application we're migrating from is doing too much - it includes our marketing pages like the _Blog_ and _Mission_ pages we've been working on for the initial release, as well as the pages for our our signup and renewal process (become a Vandebron customer [here](https://vandebron.nl)!!!) This is a separate conversation, and ultimately one for the FE Guild, but the existing app's size and purpose is making the migration take longer than it should, and forcing us to put some routing rules in place to make sure the right parts of our old site are getting swapped out for the new.\n- Previously, many of the images and PDFs we used on our website were checked directly into the repo. Part of our migration to Remix made us realize we should be using a CMS for this. We are already integrated with a CMS, we just need to be making better use of it in some cases.\n- We haven't explored the Remix-specific linting rules yet. While we're confident in the existing React and TS lint rules we already have, it seems like configs like [@remix-run/eslint-config](https://www.npmjs.com/package/@remix-run/eslint-config) could be quite handy.\n","meta":{"title":"Choosing Remix as a Server-Side Rendering (SSR) Framework","description":"We had our own custom SSR framework. It was time to move on. Find out why we picked Remix over NextJS as the replacement!","createdAt":"Fri Oct 18 2024 02:00:00 GMT+0200 (GMT+02:00)","coverImage":"images/remix-migration-remix-vs-nextjs.png","tags":["remix","ssr","typescript","react","nextjs","ADR"],"author":"John Fisher","slug":"blog/choosing-remix-as-an-ssr-framework","formattedDate":"18 oktober 2024","date":"Fri Oct 18 2024 02:00:00 GMT+0200 (GMT+02:00)"}}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"post":{"content":"\n## The Background\n\nWe at Vandebron have a mission to get the news out about [our good work](https://vandebron.nl/missie), and we understand that [Server Side Rendering (SSR)](https://web.dev/articles/rendering-on-the-web#server-side) can really help with that. Among other things, it provides an easy way for search engines to discover our pages, so you, our (future?!) customer, can find them more easily. That means more people choosing green energy, and ultimately, a cleaner environment! 🎉\n\n## We rolled our own\n\nThe year was 2017, Covid was still a word that sounded more like a bird than anything else... The world was heating up and Vandebron was 4 years into its mission to bring 100% renewable energy throughout all of the Netherlands.\n\nAs far as web technologies are concerned, 4 years was ages ago. It was a time when NextJS was less than a year old, and Remix was still several years from coming out. But we needed a way to deliver that high-quality content to all of you. So, the innovators that we were, we decided to build our own SSR framework. In short, we wanted pizza, but there were no pizza shops in town... So we made our own!\n\nIt's been great but not without issue...\n\n\n \n \n \n \n
\"ugly-window-mock\"\"remix-migration-mocking-a-window\"
\n\n\n\n## A Short Note: Why Server Side Rendering\n\nYou might not be satisfied with the short explanation of why we picked an SSR framework in the first place. This article isn't really about that - if you're interested in more analysis on when and where to choose an SSR framework, check out these excellent articles from Splunk:\n* [The User Experience (UX) Benefits of SSR](https://www.splunk.com/en_us/blog/learn/server-side-rendering-ssr.html)\n* [The SEO Benefits of SSR](https://www.splunk.com/en_us/blog/learn/server-side-rendering-ssr.html)\n\n## Decisions Made the Right Way - A Comparison\n\nNowadays, there are better, industry standard technologies available! I.e. pizza shops have opened nearby!! Let's find a good one. Of course, you don't want to just go to any spot. Especially if there's more than one shop in town - you'd be silly not to check which one is closest, and look at the menu. Which one has better reviews, is that one very angry customer just upset that there wasn't any anchovies in the vegan pizza shop? What were they expecting anyway?\n\"vegan-pizza-shop\"\n\nAt Vandebron we're a React shop, so we limited ourselves to just SSR frameworks supporting React. The choice of one framework over another is of crucial importance, so, as part of our analysis, we built a small part of our [vandebron.nl/blog](https://vandebron.nl/blog) page twice. Two of our engineers then presented these prototypes to our Front End Guild, and this discussion fed heavily into the Architecture Decision Record that we wrote comparing the results.\n\n\\* At Vandebron, Guilds are groups of engineers from disparate teams that are interested in a single domain: i.e. Backend, Frontend, IAM and Auth, etc. \n\nThe Background for the decision record states this:\n\n> _\"Our Frontend currently uses a custom-built, hard to maintain SSR solution, which we'd like to replace with a modern and standard library. Possible candidates are NextJS and Remix. The goal is to investigate which one suits our needs best.\"_\n\nYes, there are other options we could have considered but we wanted to stay with a tried-and-tested framework and one that was compatible with our existing React setup.\n![remix-migration-adr-options-considered.png](../images/remix-migration-adr-options-considered.png)\n\nAs you can see, the comparison between the two frameworks was very similar. In the end we favoured the simple, opinionated direction of Remix over that of the more full-featured but potentially complex setup of NextJS. Even though Remix has a smaller community, we attributed this mostly to the age of the framework and not the quality of the framework itself. Though the Positivity has gone down a bit (as listed in [the 2023 StateOfJS survey](https://2023.stateofjs.com/en-US/libraries/meta-frameworks/),) the decrease has been relatively minor and in line with most-other frameworks (notable exceptions for Astro and SvelteKit which have both seen big upticks in both Usage and Positivity)\n![State of JS Positivity](../images/remix-migration-sojs-framework-positivity.png)\nFinally, we noted that NextJS is tightly coupled with Vercel. At Vandebron we value platform independence and not getting tied to specific hosting providers or platforms. Remix gives us the independence we're looking for by providing a SSR framework without a potential to be tied into other solutions/platforms in the future.\n\nOutcome\n> _\"Most members favoured Remix’s focus on web standards and usage of standard libraries and were put off (a little) by NextJS’s uncertainty in development direction.\"_\n\n## So, How's it Going?\n\nThe migration effort is still underway but already we can report that it's going quite well - developers are excited to work on the new tech stack because it's seen as a developer-friendly platform and one of the two leading frameworks in the industry. In the words of one engineer: \"Dev experience has improved massively, it's fun, it's easy to work with\"\nHere are some of the things we still need to work on:\n- Our Docker image is quite large as it includes all the `node_modules`. We think we can clean this up a bit by using Yarn's Plug'n'Play (PnP) feature which should lead to faster image-build times and faster container startup times.\n- With our custom SSR solution, we use Redux Toolkit (RTK) and RTKQuery on the server... This is of course an anti pattern on the server, since server-side logic should be stateless. The Remix framework does already tries to be smart with it's loaders, so the benefits we might have gotten from RTK aren't needed there.\n- We feel the application we're migrating from is doing too much - it includes our marketing pages like the _Blog_ and _Mission_ pages we've been working on for the initial release, as well as the pages for our our signup and renewal process (become a Vandebron customer [here](https://vandebron.nl)!!!) This is a separate conversation, and ultimately one for the FE Guild, but the existing app's size and purpose is making the migration take longer than it should, and forcing us to put some routing rules in place to make sure the right parts of our old site are getting swapped out for the new.\n- Previously, many of the images and PDFs we used on our website were checked directly into the repo. Part of our migration to Remix made us realize we should be using a CMS for this. We are already integrated with a CMS, we just need to be making better use of it in some cases.\n- We haven't explored the Remix-specific linting rules yet. While we're confident in the existing React and TS lint rules we already have, it seems like configs like [@remix-run/eslint-config](https://www.npmjs.com/package/@remix-run/eslint-config) could be quite handy.\n","meta":{"title":"Choosing Remix as a Server-Side Rendering (SSR) Framework","description":"We had our own custom SSR framework. It was time to move on. Find out why we picked Remix over NextJS as the replacement!","createdAt":"Fri Oct 18 2024 02:00:00 GMT+0200 (Central European Summer Time)","coverImage":"images/remix-migration-remix-vs-nextjs.png","tags":["remix","ssr","typescript","react","nextjs","ADR"],"author":"John Fisher","slug":"blog/choosing-remix-as-an-ssr-framework","formattedDate":"18 oktober 2024","date":"Fri Oct 18 2024 02:00:00 GMT+0200 (Central European Summer Time)"}}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/cicd-dagster-user-code.json b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/cicd-dagster-user-code.json similarity index 96% rename from _next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/cicd-dagster-user-code.json rename to _next/data/tJlUn5_CjNiSTMoSsoO6j/blog/cicd-dagster-user-code.json index 20065a1ee..26ca86336 100644 --- a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/cicd-dagster-user-code.json +++ b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/cicd-dagster-user-code.json @@ -1 +1 @@ -{"pageProps":{"post":{"content":"\n### TL;DR\nIf you want to deploy new Dagster user code respositories, you need to modify and redeploy the whole Dagster system (while they are [presented as separate](https://docs.dagster.io/deployment/guides/kubernetes/customizing-your-deployment#separately-deploying-dagster-infrastructure-and-user-code) in the docs). This is undesirable for many reasons, most notably because it slows down a migration or the regular development process. This post presents a way to avoid this and build a fully automated CI/CD-pipeline for (new) user code.\n\nThis article assumes that:\n* you (plan to) host Dagster on Kubernetes and manage its deployment with Helm and Ansible;\n* you want to automate the deployment of new Dagster user code repositories with a CI/CD pipeline automation tool of choice;\n* and you want to be able to (re)deploy the whole Dagster system and user code from scratch.\n\n### Why Dagster?\n\nIn short Dagster is a tool to build and orchestrate complex data applications in Python. For us, in the end, Dagster improved the development cycle for things like simple cron jobs as well as for complex ML pipelines. Testing the flows locally was never so easy, for instance. And with features like [asset materialization](https://docs.dagster.io/concepts/assets/asset-materializations) and [sensors](https://docs.dagster.io/concepts/partitions-schedules-sensors/sensors), we can trigger downstream jobs based on the change of an external state that an upstream job caused, without these jobs having to know of each other's existence.\n\nHowever, deployment of new [user code respositories](https://docs.dagster.io/concepts/repositories-workspaces/repositories) caused us some CI/CD related headaches...\n\n### System and user code are separated\n\nDagster separates the system deployment - the Dagit (UI) web server and the daemons that coordinate the runs - from the user code deployment - the actual data pipeline. In other words: the user code servers run in complete isolation from the system and each other. \n\nThis is a great feature of which the advantages are obvious: user code repositories have their own Python environment, teams can manage these separately, and if a user code server breaks down the system is not impacted. In fact, it even doesn't require a restart when user code is updated!\n\n![Schematic of the Dagster architecture. The user code repositories (green) are separate from the rest of the system (yellow and blue). The right side — irrelevant for now — shows the job runs. Source: https://docs.dagster.io/deployment/overview.](/images/dagster-architecture.png)\n\nIn Helm terms: there are 2 charts, namely the _system_: `dagster/dagster` ([values.yaml](https://github.com/dagster-io/dagster/blob/master/helm/dagster/values.yaml)), and the _user code_: `dagster/dagster-user-deployments` ([values.yaml](https://github.com/dagster-io/dagster/blob/master/helm/dagster/charts/dagster-user-deployments/values.yaml)). Note that you have to set `dagster-user-deployments.enabled: true` in the `dagster/dagster` values-yaml to enable this.\n\n#### Or are they?\n\nThat having said, you might find it peculiar that in the values-yaml of the system deployment, _you need to specify the user code servers_. That looks like this:\n\n```yaml\nworkspace:\n enabled: true\n servers:\n - host: \"k8s-example-user-code-1\"\n port: 3030\n name: \"user-code-example\"\n```\n\n**This means system and user deployments are not actually completely separated!**\n\nThis implies that, if you want to add a _new_ user code repository, not only do you need to:\n\n1. add the repo to the user code's `values.yaml` (via a PR in the Git repo of your company's platform team, probably);\n2. do a helm-upgrade of the corresponding `dagster/dagster-user-deployments` chart;\n\nbut because of the not-so-separation, you still need to:\n\n3. add the user code server to the system's `values.yaml` (via that same PR);\n4. and do a helm-upgrade of the corresponding `dagster/dagster` chart.\n\nFormally this is the process to go through. If you are fine with this, stop reading here. It's the cleanest solution anyway. But it is quite cumbersome, so...\n\nIf you are in a situation in which new repositories can get added multiple times a day - for instance because you are in the middle of a migration to Dagster, or you want a staging environment for every single PR - then read on.\n\n#### Give me more details\n\nHow it works is that [for every new repo Dagster spins up a (gRPC) server to host the user code](https://docs.dagster.io/deployment/guides/kubernetes/deploying-with-helm#user-code-deployment). The separation is clear here. But the Dagster _system_ also needs to know about these user code servers, and it does so through a workspace-yaml file. If you run Dagit locally it relies on a `workspace.yaml` file; on Kubernetes it relies on a [ConfigMap](https://kubernetes.io/docs/concepts/configuration/configmap/) - a Kubernetes object used to store non-confidential data in key-value pairs, e.g. the content of a file - which they named `dagster-workspace-yaml`.\n\nThis workspace-yaml is the connection between the system and the user code. The fact that the charts are designed as such that this workspace-yaml is created and modified through the system deployment rather than the user code deployment is the reason we need to redeploy the system. \n\n**But what if we could modify this workspace-yaml file ourselves? Can we make the system redeployment obsolete? Short answer: we can.**\n\n### Our solution\n\n_Disclaimer: what we present here is a workaround that we'll keep in place until the moment Dagster releases a version in which the Dagster user code deployment is **actually completely separated** from the system deployment. And it works like a charm._\n\n**Remember: the desired situation is that we do not have to edit the values-yaml files (through a PR) and redeploy all of Dagster for every new repo.**\n\nFirst of all, we added an extra ConfigMap in Kubernetes that contains the `values.yaml` for the `dagster/dagster-user-deployments` chart. We named it `dagster-user-deployments-values-yaml`. The fact that this is a ConfigMap is crucial to prevent conflicts (see next section).\n\nWith the extra ConfigMap in place, these are the steps when a repo gets added:\n1. Add the new repo to the `dagster-user-deployments-values-yaml` Configmap.\n2. Helm-upgrade the `dagster/dagster-user-deployments` chart with the content of that ConfigMap.\n3. Add the server to the `dagster-workspace-yaml` ConfigMap.\n4. Do a rolling restart of the `dagster-dagit` and `dagster-daemon` deployment to pull the latest workspace to these services.\n\n**Refresh the workspace in the UI and there it is, your new repo!**\n\nNotes:\n* The steps above are completely automatable through your favorite CI/CD pipeline automation tool.\n* There is no interaction with a (platform team) Git repo.\n* The process, unfortunately, still requires a restart of the system in order to pull the latest workspace-yaml to the system services. The daemon terminates, then restarts, and it might cause a short interruption. Note that this is unavoidable if you add a new repo, no matter how you add it. This could be avoided if a reload of the ConfigMap would be triggered upon a change, [which is possible](https://kubernetes.io/docs/concepts/configuration/configmap/#mounted-configmaps-are-updated-automatically) but not enabled.\n* If you want to make changes to an existing repo (not code changes but server setting changes), you only have to do the first step (and _modify_ instead of _add_).\n\n#### How to prevent conflicts\n\nWith many of your team members adding new Dagster repositories through an automated CI/CD pipeline, you might face the situation that 2 people are adding a new repo at around the same time. \n\nWhen this happens, the `dagster-user-deployments-values-yaml` ConfigMap cannot be uploaded in the first step because Kubernetes demands that you provide the _last-applied-configuration_ when doing an update. If it doesn't match, the upload fails. \n\nThis is perfect as we do not want to overwrite the changes of the conflicting flow. You can optionally build in a retry-mechanism that starts over with pulling the ConfigMap again.\n\n#### How to deploy from scratch\n\nThe above does not yet cover how we are able to deploy the Dagster system _and user code_ completely from scratch. Why do we want this? Well, for instance when somebody accidently deletes the `dagster` namespace for instance. Or hell breaks loose in any other physical or non-physical form. Or when we simply want to bump the Dagster version, actually.\n\nThe key to this is that we version both the `dagster-user-deployments-values-yaml` and `dagster-workspace-yaml` as a final step to the flow described above (we do it on S3, in a versioned bucket). Whenever we redeploy Dagster (with Ansible) we pull the latest versions and use them to compile both the values-yaml files from it. \n\n#### How to clean up old repositories\n\nThe above described automation _adds_ new repos but doesn't take care of old obsolete repos. The steps for removing a repo are the same for adding one. The exact implementation depends on your situation. You might want to automatically remove PR staging environments after closing a PR, for instance.\n\n### Conclusion\n\nDagster is an incredibly powerful tool that enabled us to build complex data pipelines with ease. This posts explains how we **streamlined the CI/CD pipeline for user code respositories**, which enabled us to migrate to Dagster very quickly and saves us lots of time on a daily basis.\n","meta":{"title":"The Why and How of Dagster User Code Deployment Automation","description":"If you frequently deploy new user code repositories in Dagster, you want to automate this process. However, this is not so straightforward as it may seem at first. This post explains what we did at Vandebron.","createdAt":"Fri Jul 08 2022 02:00:00 GMT+0200 (GMT+02:00)","coverImage":"images/dagster-cicd.png","tags":"dagster, cicd, ci-cd, orchestration, data pipeline, kubernetes, migration, helm, ansible","author":"Pieter Custers","slug":"blog/cicd-dagster-user-code","formattedDate":"8 juli 2022","date":"Fri Jul 08 2022 02:00:00 GMT+0200 (GMT+02:00)"}}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"post":{"content":"\n### TL;DR\nIf you want to deploy new Dagster user code respositories, you need to modify and redeploy the whole Dagster system (while they are [presented as separate](https://docs.dagster.io/deployment/guides/kubernetes/customizing-your-deployment#separately-deploying-dagster-infrastructure-and-user-code) in the docs). This is undesirable for many reasons, most notably because it slows down a migration or the regular development process. This post presents a way to avoid this and build a fully automated CI/CD-pipeline for (new) user code.\n\nThis article assumes that:\n* you (plan to) host Dagster on Kubernetes and manage its deployment with Helm and Ansible;\n* you want to automate the deployment of new Dagster user code repositories with a CI/CD pipeline automation tool of choice;\n* and you want to be able to (re)deploy the whole Dagster system and user code from scratch.\n\n### Why Dagster?\n\nIn short Dagster is a tool to build and orchestrate complex data applications in Python. For us, in the end, Dagster improved the development cycle for things like simple cron jobs as well as for complex ML pipelines. Testing the flows locally was never so easy, for instance. And with features like [asset materialization](https://docs.dagster.io/concepts/assets/asset-materializations) and [sensors](https://docs.dagster.io/concepts/partitions-schedules-sensors/sensors), we can trigger downstream jobs based on the change of an external state that an upstream job caused, without these jobs having to know of each other's existence.\n\nHowever, deployment of new [user code respositories](https://docs.dagster.io/concepts/repositories-workspaces/repositories) caused us some CI/CD related headaches...\n\n### System and user code are separated\n\nDagster separates the system deployment - the Dagit (UI) web server and the daemons that coordinate the runs - from the user code deployment - the actual data pipeline. In other words: the user code servers run in complete isolation from the system and each other. \n\nThis is a great feature of which the advantages are obvious: user code repositories have their own Python environment, teams can manage these separately, and if a user code server breaks down the system is not impacted. In fact, it even doesn't require a restart when user code is updated!\n\n![Schematic of the Dagster architecture. The user code repositories (green) are separate from the rest of the system (yellow and blue). The right side — irrelevant for now — shows the job runs. Source: https://docs.dagster.io/deployment/overview.](/images/dagster-architecture.png)\n\nIn Helm terms: there are 2 charts, namely the _system_: `dagster/dagster` ([values.yaml](https://github.com/dagster-io/dagster/blob/master/helm/dagster/values.yaml)), and the _user code_: `dagster/dagster-user-deployments` ([values.yaml](https://github.com/dagster-io/dagster/blob/master/helm/dagster/charts/dagster-user-deployments/values.yaml)). Note that you have to set `dagster-user-deployments.enabled: true` in the `dagster/dagster` values-yaml to enable this.\n\n#### Or are they?\n\nThat having said, you might find it peculiar that in the values-yaml of the system deployment, _you need to specify the user code servers_. That looks like this:\n\n```yaml\nworkspace:\n enabled: true\n servers:\n - host: \"k8s-example-user-code-1\"\n port: 3030\n name: \"user-code-example\"\n```\n\n**This means system and user deployments are not actually completely separated!**\n\nThis implies that, if you want to add a _new_ user code repository, not only do you need to:\n\n1. add the repo to the user code's `values.yaml` (via a PR in the Git repo of your company's platform team, probably);\n2. do a helm-upgrade of the corresponding `dagster/dagster-user-deployments` chart;\n\nbut because of the not-so-separation, you still need to:\n\n3. add the user code server to the system's `values.yaml` (via that same PR);\n4. and do a helm-upgrade of the corresponding `dagster/dagster` chart.\n\nFormally this is the process to go through. If you are fine with this, stop reading here. It's the cleanest solution anyway. But it is quite cumbersome, so...\n\nIf you are in a situation in which new repositories can get added multiple times a day - for instance because you are in the middle of a migration to Dagster, or you want a staging environment for every single PR - then read on.\n\n#### Give me more details\n\nHow it works is that [for every new repo Dagster spins up a (gRPC) server to host the user code](https://docs.dagster.io/deployment/guides/kubernetes/deploying-with-helm#user-code-deployment). The separation is clear here. But the Dagster _system_ also needs to know about these user code servers, and it does so through a workspace-yaml file. If you run Dagit locally it relies on a `workspace.yaml` file; on Kubernetes it relies on a [ConfigMap](https://kubernetes.io/docs/concepts/configuration/configmap/) - a Kubernetes object used to store non-confidential data in key-value pairs, e.g. the content of a file - which they named `dagster-workspace-yaml`.\n\nThis workspace-yaml is the connection between the system and the user code. The fact that the charts are designed as such that this workspace-yaml is created and modified through the system deployment rather than the user code deployment is the reason we need to redeploy the system. \n\n**But what if we could modify this workspace-yaml file ourselves? Can we make the system redeployment obsolete? Short answer: we can.**\n\n### Our solution\n\n_Disclaimer: what we present here is a workaround that we'll keep in place until the moment Dagster releases a version in which the Dagster user code deployment is **actually completely separated** from the system deployment. And it works like a charm._\n\n**Remember: the desired situation is that we do not have to edit the values-yaml files (through a PR) and redeploy all of Dagster for every new repo.**\n\nFirst of all, we added an extra ConfigMap in Kubernetes that contains the `values.yaml` for the `dagster/dagster-user-deployments` chart. We named it `dagster-user-deployments-values-yaml`. The fact that this is a ConfigMap is crucial to prevent conflicts (see next section).\n\nWith the extra ConfigMap in place, these are the steps when a repo gets added:\n1. Add the new repo to the `dagster-user-deployments-values-yaml` Configmap.\n2. Helm-upgrade the `dagster/dagster-user-deployments` chart with the content of that ConfigMap.\n3. Add the server to the `dagster-workspace-yaml` ConfigMap.\n4. Do a rolling restart of the `dagster-dagit` and `dagster-daemon` deployment to pull the latest workspace to these services.\n\n**Refresh the workspace in the UI and there it is, your new repo!**\n\nNotes:\n* The steps above are completely automatable through your favorite CI/CD pipeline automation tool.\n* There is no interaction with a (platform team) Git repo.\n* The process, unfortunately, still requires a restart of the system in order to pull the latest workspace-yaml to the system services. The daemon terminates, then restarts, and it might cause a short interruption. Note that this is unavoidable if you add a new repo, no matter how you add it. This could be avoided if a reload of the ConfigMap would be triggered upon a change, [which is possible](https://kubernetes.io/docs/concepts/configuration/configmap/#mounted-configmaps-are-updated-automatically) but not enabled.\n* If you want to make changes to an existing repo (not code changes but server setting changes), you only have to do the first step (and _modify_ instead of _add_).\n\n#### How to prevent conflicts\n\nWith many of your team members adding new Dagster repositories through an automated CI/CD pipeline, you might face the situation that 2 people are adding a new repo at around the same time. \n\nWhen this happens, the `dagster-user-deployments-values-yaml` ConfigMap cannot be uploaded in the first step because Kubernetes demands that you provide the _last-applied-configuration_ when doing an update. If it doesn't match, the upload fails. \n\nThis is perfect as we do not want to overwrite the changes of the conflicting flow. You can optionally build in a retry-mechanism that starts over with pulling the ConfigMap again.\n\n#### How to deploy from scratch\n\nThe above does not yet cover how we are able to deploy the Dagster system _and user code_ completely from scratch. Why do we want this? Well, for instance when somebody accidently deletes the `dagster` namespace for instance. Or hell breaks loose in any other physical or non-physical form. Or when we simply want to bump the Dagster version, actually.\n\nThe key to this is that we version both the `dagster-user-deployments-values-yaml` and `dagster-workspace-yaml` as a final step to the flow described above (we do it on S3, in a versioned bucket). Whenever we redeploy Dagster (with Ansible) we pull the latest versions and use them to compile both the values-yaml files from it. \n\n#### How to clean up old repositories\n\nThe above described automation _adds_ new repos but doesn't take care of old obsolete repos. The steps for removing a repo are the same for adding one. The exact implementation depends on your situation. You might want to automatically remove PR staging environments after closing a PR, for instance.\n\n### Conclusion\n\nDagster is an incredibly powerful tool that enabled us to build complex data pipelines with ease. This posts explains how we **streamlined the CI/CD pipeline for user code respositories**, which enabled us to migrate to Dagster very quickly and saves us lots of time on a daily basis.\n","meta":{"title":"The Why and How of Dagster User Code Deployment Automation","description":"If you frequently deploy new user code repositories in Dagster, you want to automate this process. However, this is not so straightforward as it may seem at first. This post explains what we did at Vandebron.","createdAt":"Fri Jul 08 2022 02:00:00 GMT+0200 (Central European Summer Time)","coverImage":"images/dagster-cicd.png","tags":"dagster, cicd, ci-cd, orchestration, data pipeline, kubernetes, migration, helm, ansible","author":"Pieter Custers","slug":"blog/cicd-dagster-user-code","formattedDate":"8 juli 2022","date":"Fri Jul 08 2022 02:00:00 GMT+0200 (Central European Summer Time)"}}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/creating_a_self-service_data_model.json b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/creating_a_self-service_data_model.json similarity index 94% rename from _next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/creating_a_self-service_data_model.json rename to _next/data/tJlUn5_CjNiSTMoSsoO6j/blog/creating_a_self-service_data_model.json index 0dd31c4ba..e365dc011 100644 --- a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/creating_a_self-service_data_model.json +++ b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/creating_a_self-service_data_model.json @@ -1 +1 @@ -{"pageProps":{"post":{"content":"\nThe title of this article could have also been \"*Getting Rid of an Unmanageable Legacy Data Model*\", but after a year-long migration project the current title does more justice to the progress made. \n\n#### Compiled Legacy as a Data Model\n\nOur former data model was a series of parallel custom python jobs all covering every step of the *Extract-Transform-Load* (ETL) process from sources into report. Specific transformation got performed a numerous amount of times in multiple different jobs, daily. This made us prone to bugs, slow on development and maxing out on compute. \n\nThe situation became so pressing that keeping alive simple reporting to the business became a daily burden on the Data Analytics team, limiting resources for advanced analytics and leveraging data sources for competitive insights.\n\nWe concluded the old set-up to be outdated and looked around for current best practices concerning data infrastructure. Trying not to reinvent the wheel and staying away from designing custom solutions that had bitten us in the past, we decided to adopt a combination of *Snowflake*, *dbt* and *Lightdash* to start forming a new data landscape.\n\nThis revamping of the set-up gave us the opportunity to start over, using the power of *dbt* to create a modular data model where you could leverage different stages of data, while creating shared definitions, a single source of truth and documentation.\n\n#### What We Came Up With?\n\nWe went for a pretty classic *dbt* data model design, introducing 5 layers of data: staging, entity, intermediate, mart and api. Each layer serving a specific purpose.\n\n##### Staging\n\nWith all data coming in from different sources, this is where we ensure the data all adheres to the same conventions and formatting. This introduces a nice developer experience for the next layers, by introducing consistency across different sources. It also serves as the go to place for advanced or deep dive analysis that do not get answered by the downstream layers, which could potentially spark data modelling developments.\n\n##### Entity\n\nAfter uniforming the data, we create entities that form the building blocks of the downstream layers and analyses of our business analysts. We built entities along the core aspects of our product, capturing shared definitions in data and bringing together relevant features using the *One-Big-Table* (OBT) principle. We try to refrain from long queries or extensive use of CTE's, resulting in simplistic models. These models serve our business analysts by reducing the complexity of their queries with all joins and filters taken care of, denormalizing the database structure. This has shifted the place where ad-hoc BI requests are fulfilled from the central data team to the domain business teams, applying principles of a data mesh.\n\n##### Intermediate\n\nWith some models rising in complexity and computation, we use the intermediate layer to split this complexity and computation across multiple models. These intermediate models are rarely queried because they serve no reporting or analytical purpose. Think of incremental date spine explosions or highly complex business logic broken down into multiple models.\n\n##### Mart\n\nThis is the main layer where we provide self-service to less technical employees within the organization, creating ready-made tables. We aggregate along date spines and dimensions to create readable models. It is where we leverage *Lightdash* metrics to create dynamic tables to provide business teams with a certain amount of freedom in terms of the granularity and dimensions they want to report on in their dashboarding. The use of entities as building blocks has aligned reporting across domain business teams, creating a single and centralized source of truth and relieving the data team from explaining distinctions. So while the dimensions can be tweaked for specific use cases, the definitions of the metrics are set in code.\n\n##### API\n\nWith some dependencies outside of the data model, we use an API layer on top of our mart to record exposures towards different services and provide views which explicitly contain only the necessary datapoints.\n\n![A schematic overview of the data model structure](/images/schematic_data_layers.jpg \"A schematic overview of the data model structure\")\n\n#### The Process\n\nWe decided to take advantage of the chaos created by the old situation: no real single source of truth gave us the opportunity to create a truth. Investigating business teams' needs, we created data definitions in entities. We kept a pragmatic approach to these definitions, being flexible towards business teams' specific needs but also limiting the allowed complexity or number of exceptions. The new data model should answer everyone's questions, but should also be understood by everyone.\n\nWe forced ourselves to have descriptions for all data from the entity layer onwards, because only defining and describing the entities in code is not enough. We leveraged the embedded business analysts' knowledge to form the descriptions, noting that the best description is the one the user understands (because they wrote it).\n\nWith the ready-made marts in place, we decided to give away most of the dashboarding responsibility to the business teams. The embedded analysts are very apt at defining and designing their relevant insights into dashboards. The central data team only took ownership of company wide dashboards and provided support on the dashboarding where necessary.\n\nAfter the adoption of the new stack, we noticed that the more technical embedded analysts were very interested in learning a new tool and language. So, we started a data model group and onboarded multiple embedded business analysts as data model developers. This has massively increased the speed of development of the data model. Primarily, because of specific business domain knowledge not needed to be transferred to the developers in the central data team first, but the knowledge holders developed models themselves. The central data team took on a different role: providing infrastructural support, improving on efficiency, monitoring costs and creating a vision and strategy for organic but structured growth.\n\n![A schematic overview of the final self-servicing data model product](/images/schematic_data_product.jpg \"A schematic overview of the final self-servicing data model product\")\n\n#### What Did We Learn?\n\nFew key takeaways:\n\n- Some business teams have more requirements in terms of definitions than other teams, so if other teams allow, be pragmatic and just go for the stricter requirements.\n- Enabling self-service analysis means giving away control, take this into account in your data descriptions. They should be clear and concise.\n- Educate users on the designed structure of the data model, explain what layer serves which purpose and what questions can be answered how and where.\n- Create clear communication and support channels for the business to kickstart the adoption, you are not the only one learning a new tool.\n- Data is not only for the data team, so encourage those passionate and enthusiastic analysts to co-create! (Just keep an eye on the project.) ","meta":{"title":"Creating a Self-Service Data Model","description":"How we migrated to a modern data stack to enable self-servicing across the business","createdAt":"Wed Feb 07 2024 01:00:00 GMT+0100 (GMT+01:00)","coverImage":"images/self_service.jpg","tags":["dbt","snowflake","lightdash","datamodel","self-service"],"author":"Mats Stijlaart","slug":"blog/creating_a_self-service_data_model","formattedDate":"7 februari 2024","date":"Wed Feb 07 2024 01:00:00 GMT+0100 (GMT+01:00)"}}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"post":{"content":"\nThe title of this article could have also been \"*Getting Rid of an Unmanageable Legacy Data Model*\", but after a year-long migration project the current title does more justice to the progress made. \n\n#### Compiled Legacy as a Data Model\n\nOur former data model was a series of parallel custom python jobs all covering every step of the *Extract-Transform-Load* (ETL) process from sources into report. Specific transformation got performed a numerous amount of times in multiple different jobs, daily. This made us prone to bugs, slow on development and maxing out on compute. \n\nThe situation became so pressing that keeping alive simple reporting to the business became a daily burden on the Data Analytics team, limiting resources for advanced analytics and leveraging data sources for competitive insights.\n\nWe concluded the old set-up to be outdated and looked around for current best practices concerning data infrastructure. Trying not to reinvent the wheel and staying away from designing custom solutions that had bitten us in the past, we decided to adopt a combination of *Snowflake*, *dbt* and *Lightdash* to start forming a new data landscape.\n\nThis revamping of the set-up gave us the opportunity to start over, using the power of *dbt* to create a modular data model where you could leverage different stages of data, while creating shared definitions, a single source of truth and documentation.\n\n#### What We Came Up With?\n\nWe went for a pretty classic *dbt* data model design, introducing 5 layers of data: staging, entity, intermediate, mart and api. Each layer serving a specific purpose.\n\n##### Staging\n\nWith all data coming in from different sources, this is where we ensure the data all adheres to the same conventions and formatting. This introduces a nice developer experience for the next layers, by introducing consistency across different sources. It also serves as the go to place for advanced or deep dive analysis that do not get answered by the downstream layers, which could potentially spark data modelling developments.\n\n##### Entity\n\nAfter uniforming the data, we create entities that form the building blocks of the downstream layers and analyses of our business analysts. We built entities along the core aspects of our product, capturing shared definitions in data and bringing together relevant features using the *One-Big-Table* (OBT) principle. We try to refrain from long queries or extensive use of CTE's, resulting in simplistic models. These models serve our business analysts by reducing the complexity of their queries with all joins and filters taken care of, denormalizing the database structure. This has shifted the place where ad-hoc BI requests are fulfilled from the central data team to the domain business teams, applying principles of a data mesh.\n\n##### Intermediate\n\nWith some models rising in complexity and computation, we use the intermediate layer to split this complexity and computation across multiple models. These intermediate models are rarely queried because they serve no reporting or analytical purpose. Think of incremental date spine explosions or highly complex business logic broken down into multiple models.\n\n##### Mart\n\nThis is the main layer where we provide self-service to less technical employees within the organization, creating ready-made tables. We aggregate along date spines and dimensions to create readable models. It is where we leverage *Lightdash* metrics to create dynamic tables to provide business teams with a certain amount of freedom in terms of the granularity and dimensions they want to report on in their dashboarding. The use of entities as building blocks has aligned reporting across domain business teams, creating a single and centralized source of truth and relieving the data team from explaining distinctions. So while the dimensions can be tweaked for specific use cases, the definitions of the metrics are set in code.\n\n##### API\n\nWith some dependencies outside of the data model, we use an API layer on top of our mart to record exposures towards different services and provide views which explicitly contain only the necessary datapoints.\n\n![A schematic overview of the data model structure](/images/schematic_data_layers.jpg \"A schematic overview of the data model structure\")\n\n#### The Process\n\nWe decided to take advantage of the chaos created by the old situation: no real single source of truth gave us the opportunity to create a truth. Investigating business teams' needs, we created data definitions in entities. We kept a pragmatic approach to these definitions, being flexible towards business teams' specific needs but also limiting the allowed complexity or number of exceptions. The new data model should answer everyone's questions, but should also be understood by everyone.\n\nWe forced ourselves to have descriptions for all data from the entity layer onwards, because only defining and describing the entities in code is not enough. We leveraged the embedded business analysts' knowledge to form the descriptions, noting that the best description is the one the user understands (because they wrote it).\n\nWith the ready-made marts in place, we decided to give away most of the dashboarding responsibility to the business teams. The embedded analysts are very apt at defining and designing their relevant insights into dashboards. The central data team only took ownership of company wide dashboards and provided support on the dashboarding where necessary.\n\nAfter the adoption of the new stack, we noticed that the more technical embedded analysts were very interested in learning a new tool and language. So, we started a data model group and onboarded multiple embedded business analysts as data model developers. This has massively increased the speed of development of the data model. Primarily, because of specific business domain knowledge not needed to be transferred to the developers in the central data team first, but the knowledge holders developed models themselves. The central data team took on a different role: providing infrastructural support, improving on efficiency, monitoring costs and creating a vision and strategy for organic but structured growth.\n\n![A schematic overview of the final self-servicing data model product](/images/schematic_data_product.jpg \"A schematic overview of the final self-servicing data model product\")\n\n#### What Did We Learn?\n\nFew key takeaways:\n\n- Some business teams have more requirements in terms of definitions than other teams, so if other teams allow, be pragmatic and just go for the stricter requirements.\n- Enabling self-service analysis means giving away control, take this into account in your data descriptions. They should be clear and concise.\n- Educate users on the designed structure of the data model, explain what layer serves which purpose and what questions can be answered how and where.\n- Create clear communication and support channels for the business to kickstart the adoption, you are not the only one learning a new tool.\n- Data is not only for the data team, so encourage those passionate and enthusiastic analysts to co-create! (Just keep an eye on the project.) ","meta":{"title":"Creating a Self-Service Data Model","description":"How we migrated to a modern data stack to enable self-servicing across the business","createdAt":"Wed Feb 07 2024 01:00:00 GMT+0100 (Central European Standard Time)","coverImage":"images/self_service.jpg","tags":["dbt","snowflake","lightdash","datamodel","self-service"],"author":"Mats Stijlaart","slug":"blog/creating_a_self-service_data_model","formattedDate":"7 februari 2024","date":"Wed Feb 07 2024 01:00:00 GMT+0100 (Central European Standard Time)"}}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/cypress-component-design-technique-for-react-applications.json b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/cypress-component-design-technique-for-react-applications.json similarity index 91% rename from _next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/cypress-component-design-technique-for-react-applications.json rename to _next/data/tJlUn5_CjNiSTMoSsoO6j/blog/cypress-component-design-technique-for-react-applications.json index 02acc5051..b32d08161 100644 --- a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/cypress-component-design-technique-for-react-applications.json +++ b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/cypress-component-design-technique-for-react-applications.json @@ -1 +1 @@ -{"pageProps":{"post":{"content":"\nCypress is a game-changer in the automation testing world, the way that Cypress was built and its architecture allows us as testers to cover more scenarios.\n\nCypress is not Selenium; in fact, it is different. And the way to build and design a framework should be different as well.\n\nThe most famous design technique in Selenium is the Page Object Model, and many testers use the same design technique with Cypress. Even that Cypress on their official website [recommended](https://www.cypress.io/blog/2019/01/03/stop-using-page-objects-and-start-using-app-actions/) us not to go with that approach.\n\n## Page Object Model\n\nThe main benefit of using the page object model Is to make the automation framework maintenance-friendly. We can define a specific page's selectors in a separate file and then use these selectors in our test cases.\n\n```js\nclass SignInPage {\n visit() {\n cy.visit(\"/signin\");\n }\n getEmailError() {\n return cy.get(`[data-testid=SignInEmailError]`);\n }\n getPasswordError() {\n return cy.get(`[data-testid=SignInPasswordError]`);\n }\n fillEmail(value) {\n const field = cy.get(`[data-testid=SignInEmailField]`);\n field.clear();\n field.type(value);\n return this;\n }\n fillPassword(value) {\n const field = cy.get(`[data-testid=SignInPasswordField]`);\n field.clear();\n field.type(value);\n return this;\n }\n submit() {\n const button = cy.get(`[data-testid=SignInSubmitButton]`);\n button.click();\n }\n}\nexport default SignInPage;\n```\n\nThe main two downsides using the typical page object model with cypress are:\n\n- Page objects introduce an additional state into the tests, separate from the application’s internal state. This makes understanding the tests and failures harder.\n- Page objects make tests slow because they force the tests to always go through the application user interface.\n\n## Component-Based Architecture\n\nOn the other hand, a React application is component-based, where a specific page will be built from a collection of components. And components in React can be used on different pages too. So if we want to use the Page Object Model, we may define the same locator twice on different pages.\n\nSo having these two facts, At Vandebron, we came up with a new way to design our Cypress Automation framework by creating a separate JavaScript file for every component in our application, inside a folder called `components` within our Cypress project as below:\n\n```js\n// Locators\nexport const getEmailError = () => cy.get(`[data-testid=SignInEmailError]`);\nexport const getPasswordError = () =>\n cy.get(`[data-testid=SignInPasswordError]`);\nexport const emailField = () => cy.get(`[data-testid=SignInEmailField]`);\nexport const passwordField = () => cy.get(`[data-testid=SignInPasswordField]`);\nexport const submitButton = () => cy.get(`[data-testid=SignInSubmitButton]`);\n\n// Actions\nexport const visit = () => cy.visit(\"/signin\");\nexport const performLogin = (email, password) => {\n emailField().clear().type(email);\n passwordField().clear().type(password);\n submitButton().click();\n};\n```\n\nHaving it built this way, we eliminated all the previous problems mentioned earlier; we are not adding any classes, and we are defining objects within our test cases. And the most important part is that we are following the way that Cypress recommends it.\n\nAnd after defining the component locators and actions, we can import them inside our test case and use them as below:\n\n```js\nimport LoginComponent from \"../components/loginComponent\";\nimport Menu from \"../components/Menu\";\n\ndescribe(\"Test Login Page\", () => {\n it(\"should show an error message if the password in wrong\", () => {\n LoginComponent.visit();\n LoginComponent.performLogin(\"email@gmail.com\", \"wrongPassword\");\n LoginComponent.getPasswordError().should(\"be.visible\");\n });\n it(\"should show the logout button if the user logged in succesfully\", () => {\n LoginComponent.visit();\n LoginComponent.performLogin(\"email@gmail.com\", \"correctPassword\");\n Menu.LogoutButton().should(\"be.visible\");\n });\n});\n```\n\nAnd as you can see, our test cases are readable for anyone! And if any locator changes in any of the components, we can easily fix it in one location and from the same file. And lastly, if a component will be used in different places, we can use the same code.\n\nIn the next article, I will talk about how we use Cypress in our manual testing during the sprint and how it saves us tons of time and effort.\n","meta":{"title":"Cypress.io Component Design Technique for React Applications","description":"Cypress is a game-changer in the automation testing world, the way that Cypress was built and its architecture allows us as testers to cover more scenarios.","createdAt":"Fri Feb 05 2021 01:00:00 GMT+0100 (GMT+01:00)","coverImage":"images/cypress-component-design-technique-for-react-applications.png","tags":"Cypress, Testing, React","author":"Hatem Hatamleh","slug":"blog/cypress-component-design-technique-for-react-applications","formattedDate":"5 februari 2021","date":"Fri Feb 05 2021 01:00:00 GMT+0100 (GMT+01:00)"}}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"post":{"content":"\nCypress is a game-changer in the automation testing world, the way that Cypress was built and its architecture allows us as testers to cover more scenarios.\n\nCypress is not Selenium; in fact, it is different. And the way to build and design a framework should be different as well.\n\nThe most famous design technique in Selenium is the Page Object Model, and many testers use the same design technique with Cypress. Even that Cypress on their official website [recommended](https://www.cypress.io/blog/2019/01/03/stop-using-page-objects-and-start-using-app-actions/) us not to go with that approach.\n\n## Page Object Model\n\nThe main benefit of using the page object model Is to make the automation framework maintenance-friendly. We can define a specific page's selectors in a separate file and then use these selectors in our test cases.\n\n```js\nclass SignInPage {\n visit() {\n cy.visit(\"/signin\");\n }\n getEmailError() {\n return cy.get(`[data-testid=SignInEmailError]`);\n }\n getPasswordError() {\n return cy.get(`[data-testid=SignInPasswordError]`);\n }\n fillEmail(value) {\n const field = cy.get(`[data-testid=SignInEmailField]`);\n field.clear();\n field.type(value);\n return this;\n }\n fillPassword(value) {\n const field = cy.get(`[data-testid=SignInPasswordField]`);\n field.clear();\n field.type(value);\n return this;\n }\n submit() {\n const button = cy.get(`[data-testid=SignInSubmitButton]`);\n button.click();\n }\n}\nexport default SignInPage;\n```\n\nThe main two downsides using the typical page object model with cypress are:\n\n- Page objects introduce an additional state into the tests, separate from the application’s internal state. This makes understanding the tests and failures harder.\n- Page objects make tests slow because they force the tests to always go through the application user interface.\n\n## Component-Based Architecture\n\nOn the other hand, a React application is component-based, where a specific page will be built from a collection of components. And components in React can be used on different pages too. So if we want to use the Page Object Model, we may define the same locator twice on different pages.\n\nSo having these two facts, At Vandebron, we came up with a new way to design our Cypress Automation framework by creating a separate JavaScript file for every component in our application, inside a folder called `components` within our Cypress project as below:\n\n```js\n// Locators\nexport const getEmailError = () => cy.get(`[data-testid=SignInEmailError]`);\nexport const getPasswordError = () =>\n cy.get(`[data-testid=SignInPasswordError]`);\nexport const emailField = () => cy.get(`[data-testid=SignInEmailField]`);\nexport const passwordField = () => cy.get(`[data-testid=SignInPasswordField]`);\nexport const submitButton = () => cy.get(`[data-testid=SignInSubmitButton]`);\n\n// Actions\nexport const visit = () => cy.visit(\"/signin\");\nexport const performLogin = (email, password) => {\n emailField().clear().type(email);\n passwordField().clear().type(password);\n submitButton().click();\n};\n```\n\nHaving it built this way, we eliminated all the previous problems mentioned earlier; we are not adding any classes, and we are defining objects within our test cases. And the most important part is that we are following the way that Cypress recommends it.\n\nAnd after defining the component locators and actions, we can import them inside our test case and use them as below:\n\n```js\nimport LoginComponent from \"../components/loginComponent\";\nimport Menu from \"../components/Menu\";\n\ndescribe(\"Test Login Page\", () => {\n it(\"should show an error message if the password in wrong\", () => {\n LoginComponent.visit();\n LoginComponent.performLogin(\"email@gmail.com\", \"wrongPassword\");\n LoginComponent.getPasswordError().should(\"be.visible\");\n });\n it(\"should show the logout button if the user logged in succesfully\", () => {\n LoginComponent.visit();\n LoginComponent.performLogin(\"email@gmail.com\", \"correctPassword\");\n Menu.LogoutButton().should(\"be.visible\");\n });\n});\n```\n\nAnd as you can see, our test cases are readable for anyone! And if any locator changes in any of the components, we can easily fix it in one location and from the same file. And lastly, if a component will be used in different places, we can use the same code.\n\nIn the next article, I will talk about how we use Cypress in our manual testing during the sprint and how it saves us tons of time and effort.\n","meta":{"title":"Cypress.io Component Design Technique for React Applications","description":"Cypress is a game-changer in the automation testing world, the way that Cypress was built and its architecture allows us as testers to cover more scenarios.","createdAt":"Fri Feb 05 2021 01:00:00 GMT+0100 (Central European Standard Time)","coverImage":"images/cypress-component-design-technique-for-react-applications.png","tags":"Cypress, Testing, React","author":"Hatem Hatamleh","slug":"blog/cypress-component-design-technique-for-react-applications","formattedDate":"5 februari 2021","date":"Fri Feb 05 2021 01:00:00 GMT+0100 (Central European Standard Time)"}}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/fueling-the-energy-transition-with-spark-part-1.json b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/fueling-the-energy-transition-with-spark-part-1.json similarity index 95% rename from _next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/fueling-the-energy-transition-with-spark-part-1.json rename to _next/data/tJlUn5_CjNiSTMoSsoO6j/blog/fueling-the-energy-transition-with-spark-part-1.json index 4554e5bd1..b65df012e 100644 --- a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/fueling-the-energy-transition-with-spark-part-1.json +++ b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/fueling-the-energy-transition-with-spark-part-1.json @@ -1 +1 @@ -{"pageProps":{"post":{"content":"\nHere at Vandebron, we have several projects which need to compute large amounts of data. To achieve acceptable results, we had to choose a computing tool that should have helped us to build such algorithms.\n\nAs you may have read in other articles our main backend language is Scala so the natural choice to build distributed parallel algorithms was indeed Spark.\n\n## What is Spark\n\nWe will briefly introduce Spark in the next few lines and then we will dive deep into some of its key concepts.\n\nSpark is an ETL distributed tool. ETL are three phases that describe a general procedure for moving data from a source to a destination.\n\n![ETL Diagram](/images/etlprocess.png \"ETL\")\n\n- **_Extract_** is the act of retrieving data from a data source which could be a database or a file system.\n- **_Transform_** is the core part of an algorithm. As you may know, functional programming is all about transformation. Whenever you write a block of code in Scala you go from an initial data structure to a resulting data structure, the same goes with Spark but the data structures you use are specific Spark structures we will describe later.\n- **_Load_** is the final part. Here you need to save (load) the resulting data structure from the transformation phase to a data source. This can either be the same as the extract phase or a different one.\n- **_Distributed_**: Spark is meant to be run in a cluster of nodes. Each node runs its own JVM and every Spark data structure can/should be distributed among all the nodes of the cluster (using serialization) to parallelize the computation.\n\n### Spark data structure: RDD, DataFrame, and Dataset\n\nThe core of Spark is its _distributed resilient dataset (RDD)_.\n\n![Spark API history](/images/sparkapihistory.png \"Spark API history\")\n\nAn **_RDD_** is a collection of elements partitioned across the nodes of the cluster that can be operated on in parallel. _Extracting_ data from a source creates an RDD. Operating on the RDD allows us to _transform_ the data. Writing the RDD _loads_ the data into the end target like a database for example). They are made to be distributed over the cluster to parallelize the computation.\n\nA **_DataFrame_** is an abstraction on top of an RDD. It is the first attempt of Spark (2013) to organize the data inside and RDD with an SQL-like structure. With dataframe, you can actually make a transformation in an SQL fashion. Every element in a dataframe is a Row and you can actually transform a dataframe to another by adding or removing columns.\n\nA **_DataSet_** finally is a further abstraction on top of a dataframe to organize data in an OO fashion (2015). Every element in a dataset is a case class and you can operate transformation in a scala fashion from a case class to another.\n\n## Spark in action\n\nLet’s see now some code samples from our codebase to illustrate in more detail each of the ETL phases.\n\n### Extract\n\nThe extraction phase is the first step in which you gather the data from a datasource.\n\n```scala\nval allConnections = sparkSession\n.read\n.jdbc(connectionString, tableName, props)\n\nval selectedConnections = allConnections\n.select(ColumnNames.head, ColumnNames.tail: _*)\n\nval p4Connections = selectedConnections\n.filter(allConnections(\"HasP4Day activated\").equalTo(1))\n.filter(allConnections(\"HasP4INT activated\").equalTo(1))\n.as[Connection]\n\np4Connections.show()\n```\n\nFor most people the extraction phase is just the first line (the invocation to the read method), they are not wrong because extracting means reading data from a datasource (in this case an SQL server database). I decided to include in this phase also some filtering and projection operations because I think these are not really part of the algorithm, this is still the preparation phase before you actually process the data. We can ultimately say that _preparing the data_ is something in between extraction and transformation therefore it is up to you to decide which phase it belongs to.\n\n### Transform\n\nTransformation phase is the core of the algorithm. Here you actually process your data to reach your final result.\n\n```java scala\nusageDF\n.groupBy('ConnectionId, window('ReadingDate, \"1 day\"))\n.agg(\n sum('Consumption).as(\"Consumption\"),\n sum('OffPeak_consumption).as(\"OffPeak_consumption\"),\n sum('Peak_consumption).as(\"Peak_consumption\"),\n sum('Production).as(\"Production\"),\n sum('OffPeak_production).as(\"OffPeak_production\"),\n sum('Peak_production).as(\"Peak_production\"),\n first('ReadingDate).as(\"ReadingDate\"),\n first('marketsegment).as(\"marketsegment\"),\n collect_set('Source).as(\"Sources\"),\n collect_set('Tag).as(\"Tags\"),\n max('Last_modified).as(\"Last_modified\")\n)\n.withColumn(\n \"Tag\", when(array_contains('Tags, “Interpolated”),\nlit(Tag.Interpolated.toString)).otherwise(lit(“Measured”)))\n.withColumn(\"Source\",\nwhen(size('Sources) > 1,\nlit(Source.Multiple.toString)).otherwise(mkString('Sources)))\n.orderBy('ConnectionId, 'ReadingDate)\n.drop(\"window\", \"sources\", \"tags\")\n```\n\nIn this specific example, we are processing connection usage data by aggregating it daily. In the `usageDF` we have 15 minutes interval usage data, now we want to show to the user the same data but with a different aggregation interval (1 day). So we group the whole data by connection id and window the reading date by 1 day (A window function calculates a return value for every input row of a table based on a group of rows [Introducing Window Functions in Spark SQL - The Databricks Blog](https://databricks.com/blog/2015/07/15/introducing-window-functions-in-spark-sql.html).\n\nOnce the data is grouped we can aggregate it, using the `agg` method which allows us to call the aggregation functions over the dataframe (for example: `sum`, `first`,`max` or `collect_set`). Successively we transform the dataframe to suit our visualization needs, the methods used are self-explanatory and the documentation is very clear. [Getting Started - Spark 3.0.1 Documentation](https://spark.apache.org/docs/latest/sql-getting-started.html)\n\n### Load\n\nThe final phase is the one which `save`, `put`, `show` the transformed data into the target data source.\n\n```java scala\ndataFrame\n.select(columns.head, columns.tail: _*)\n.write\n.cassandraFormat(tableName, keySpace)\n.mode(saveMode)\n.save()\n```\n\nIn this specific case, we will save our dataframe into a Cassandra database. In Spark, methods used to achieve the load phase are called _actions_. It is very important to distinguish Spark actions from the rest because actions are the only ones that trigger Spark to actually perform the whole transformation chain you have defined previously.\n\nIf our transformation phase, as we described above, wasn’t followed by an action (for example `save`) nothing would have happened, the software would have simply terminated without doing anything.\n\n## One concept to rule them all\n\n```java scala\nval rdd1 = sc.parallelize(1 to 10)\nval rdd2 = sc.parallelize(11 to 20)\nval rdd2Count = rdd1.map(\nx => rdd2.values.count() * x //This will NEVER work!!!!\n)\n```\n\n_One does not simply use RDD inside another RDD_. (Same goes for Dataframes or Datasets).\n\nThis is a very simple concept that leads very often to lots of questions because many people just want to use Spark as a normal scala library. But this is not possible due to the inner distributed nature of Spark and its data structures. We have said that an RDD is a resilient distributed dataset, let’s focus on the word _distributed_, it means that the data inside it is spread across the nodes of the cluster. Every node has its own JVM and it is called _Executor_, except for the master node where your program starts which is called _Driver_:\n\n![Spark cluster overview](/images/spark-cluster-overview.png \"Spark cluster overview\")\n\nYour code starts from the Driver and a copy is distributed to all executors, this also means that each executor needs to have the same working environment of the Driver, for Scala it is not a problem since it just needs a JVM to run. (but we will see that if you use _pySpark_ you need to take extra care when you distribute your application.) Every Spark data structure you have defined in your code will also be distributed across the executors and every time you perform a transformation it will be performed to each chunk of data in each executor.\n\nNow let’s go back to our example, a `map` is a transformation on `rdd1` this means that block inside will be executed at the executor level, if we need `rdd2` to perform this block Spark should somehow serialize the whole `rdd2` and send it to each executor. You can understand now that _it is really not possible to serialize the whole RDD since it is by its nature already a distributed data structure_. So what can you do to actually perform such computation we showed in the example? The solution is “simple”: _prepare your data in such a way that it will be contained in one single RDD_. To do so you can take advantage of all the transformation functions Spark has to offer such `map` `join` `union` `reduce` etc.\n\n## Next step…\n\nWe have explained all the main concepts of Spark and we have shown some real snippets of our codebase. In the next article, I would like to show you a real-life problem we have solved in our company using [_pySpark_](https://spark.apache.org/docs/latest/api/python/index.html). I will show you how to customize Spark infrastructure to correctly parallelize the ETL algorithm you have built.\n","meta":{"title":"Fueling the Energy Transition With Spark - Part 1","description":"Our main backend language is Scala, and by using Spark we build distributed parallel algorithms to fuel the Energy Transition. But why is Spark the best choice for that job?","createdAt":"Wed Nov 04 2020 01:00:00 GMT+0100 (GMT+01:00)","coverImage":"images/fueling-the-energy-transition-with-spark-part-1.jpg","imageSource":"https://www.pexels.com/photo/shallow-focus-photography-of-light-bulbs-2764942","tags":"spark, scala","author":"Rosario Renga","slug":"blog/fueling-the-energy-transition-with-spark-part-1","formattedDate":"4 november 2020","date":"Wed Nov 04 2020 01:00:00 GMT+0100 (GMT+01:00)"}}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"post":{"content":"\nHere at Vandebron, we have several projects which need to compute large amounts of data. To achieve acceptable results, we had to choose a computing tool that should have helped us to build such algorithms.\n\nAs you may have read in other articles our main backend language is Scala so the natural choice to build distributed parallel algorithms was indeed Spark.\n\n## What is Spark\n\nWe will briefly introduce Spark in the next few lines and then we will dive deep into some of its key concepts.\n\nSpark is an ETL distributed tool. ETL are three phases that describe a general procedure for moving data from a source to a destination.\n\n![ETL Diagram](/images/etlprocess.png \"ETL\")\n\n- **_Extract_** is the act of retrieving data from a data source which could be a database or a file system.\n- **_Transform_** is the core part of an algorithm. As you may know, functional programming is all about transformation. Whenever you write a block of code in Scala you go from an initial data structure to a resulting data structure, the same goes with Spark but the data structures you use are specific Spark structures we will describe later.\n- **_Load_** is the final part. Here you need to save (load) the resulting data structure from the transformation phase to a data source. This can either be the same as the extract phase or a different one.\n- **_Distributed_**: Spark is meant to be run in a cluster of nodes. Each node runs its own JVM and every Spark data structure can/should be distributed among all the nodes of the cluster (using serialization) to parallelize the computation.\n\n### Spark data structure: RDD, DataFrame, and Dataset\n\nThe core of Spark is its _distributed resilient dataset (RDD)_.\n\n![Spark API history](/images/sparkapihistory.png \"Spark API history\")\n\nAn **_RDD_** is a collection of elements partitioned across the nodes of the cluster that can be operated on in parallel. _Extracting_ data from a source creates an RDD. Operating on the RDD allows us to _transform_ the data. Writing the RDD _loads_ the data into the end target like a database for example). They are made to be distributed over the cluster to parallelize the computation.\n\nA **_DataFrame_** is an abstraction on top of an RDD. It is the first attempt of Spark (2013) to organize the data inside and RDD with an SQL-like structure. With dataframe, you can actually make a transformation in an SQL fashion. Every element in a dataframe is a Row and you can actually transform a dataframe to another by adding or removing columns.\n\nA **_DataSet_** finally is a further abstraction on top of a dataframe to organize data in an OO fashion (2015). Every element in a dataset is a case class and you can operate transformation in a scala fashion from a case class to another.\n\n## Spark in action\n\nLet’s see now some code samples from our codebase to illustrate in more detail each of the ETL phases.\n\n### Extract\n\nThe extraction phase is the first step in which you gather the data from a datasource.\n\n```scala\nval allConnections = sparkSession\n.read\n.jdbc(connectionString, tableName, props)\n\nval selectedConnections = allConnections\n.select(ColumnNames.head, ColumnNames.tail: _*)\n\nval p4Connections = selectedConnections\n.filter(allConnections(\"HasP4Day activated\").equalTo(1))\n.filter(allConnections(\"HasP4INT activated\").equalTo(1))\n.as[Connection]\n\np4Connections.show()\n```\n\nFor most people the extraction phase is just the first line (the invocation to the read method), they are not wrong because extracting means reading data from a datasource (in this case an SQL server database). I decided to include in this phase also some filtering and projection operations because I think these are not really part of the algorithm, this is still the preparation phase before you actually process the data. We can ultimately say that _preparing the data_ is something in between extraction and transformation therefore it is up to you to decide which phase it belongs to.\n\n### Transform\n\nTransformation phase is the core of the algorithm. Here you actually process your data to reach your final result.\n\n```java scala\nusageDF\n.groupBy('ConnectionId, window('ReadingDate, \"1 day\"))\n.agg(\n sum('Consumption).as(\"Consumption\"),\n sum('OffPeak_consumption).as(\"OffPeak_consumption\"),\n sum('Peak_consumption).as(\"Peak_consumption\"),\n sum('Production).as(\"Production\"),\n sum('OffPeak_production).as(\"OffPeak_production\"),\n sum('Peak_production).as(\"Peak_production\"),\n first('ReadingDate).as(\"ReadingDate\"),\n first('marketsegment).as(\"marketsegment\"),\n collect_set('Source).as(\"Sources\"),\n collect_set('Tag).as(\"Tags\"),\n max('Last_modified).as(\"Last_modified\")\n)\n.withColumn(\n \"Tag\", when(array_contains('Tags, “Interpolated”),\nlit(Tag.Interpolated.toString)).otherwise(lit(“Measured”)))\n.withColumn(\"Source\",\nwhen(size('Sources) > 1,\nlit(Source.Multiple.toString)).otherwise(mkString('Sources)))\n.orderBy('ConnectionId, 'ReadingDate)\n.drop(\"window\", \"sources\", \"tags\")\n```\n\nIn this specific example, we are processing connection usage data by aggregating it daily. In the `usageDF` we have 15 minutes interval usage data, now we want to show to the user the same data but with a different aggregation interval (1 day). So we group the whole data by connection id and window the reading date by 1 day (A window function calculates a return value for every input row of a table based on a group of rows [Introducing Window Functions in Spark SQL - The Databricks Blog](https://databricks.com/blog/2015/07/15/introducing-window-functions-in-spark-sql.html).\n\nOnce the data is grouped we can aggregate it, using the `agg` method which allows us to call the aggregation functions over the dataframe (for example: `sum`, `first`,`max` or `collect_set`). Successively we transform the dataframe to suit our visualization needs, the methods used are self-explanatory and the documentation is very clear. [Getting Started - Spark 3.0.1 Documentation](https://spark.apache.org/docs/latest/sql-getting-started.html)\n\n### Load\n\nThe final phase is the one which `save`, `put`, `show` the transformed data into the target data source.\n\n```java scala\ndataFrame\n.select(columns.head, columns.tail: _*)\n.write\n.cassandraFormat(tableName, keySpace)\n.mode(saveMode)\n.save()\n```\n\nIn this specific case, we will save our dataframe into a Cassandra database. In Spark, methods used to achieve the load phase are called _actions_. It is very important to distinguish Spark actions from the rest because actions are the only ones that trigger Spark to actually perform the whole transformation chain you have defined previously.\n\nIf our transformation phase, as we described above, wasn’t followed by an action (for example `save`) nothing would have happened, the software would have simply terminated without doing anything.\n\n## One concept to rule them all\n\n```java scala\nval rdd1 = sc.parallelize(1 to 10)\nval rdd2 = sc.parallelize(11 to 20)\nval rdd2Count = rdd1.map(\nx => rdd2.values.count() * x //This will NEVER work!!!!\n)\n```\n\n_One does not simply use RDD inside another RDD_. (Same goes for Dataframes or Datasets).\n\nThis is a very simple concept that leads very often to lots of questions because many people just want to use Spark as a normal scala library. But this is not possible due to the inner distributed nature of Spark and its data structures. We have said that an RDD is a resilient distributed dataset, let’s focus on the word _distributed_, it means that the data inside it is spread across the nodes of the cluster. Every node has its own JVM and it is called _Executor_, except for the master node where your program starts which is called _Driver_:\n\n![Spark cluster overview](/images/spark-cluster-overview.png \"Spark cluster overview\")\n\nYour code starts from the Driver and a copy is distributed to all executors, this also means that each executor needs to have the same working environment of the Driver, for Scala it is not a problem since it just needs a JVM to run. (but we will see that if you use _pySpark_ you need to take extra care when you distribute your application.) Every Spark data structure you have defined in your code will also be distributed across the executors and every time you perform a transformation it will be performed to each chunk of data in each executor.\n\nNow let’s go back to our example, a `map` is a transformation on `rdd1` this means that block inside will be executed at the executor level, if we need `rdd2` to perform this block Spark should somehow serialize the whole `rdd2` and send it to each executor. You can understand now that _it is really not possible to serialize the whole RDD since it is by its nature already a distributed data structure_. So what can you do to actually perform such computation we showed in the example? The solution is “simple”: _prepare your data in such a way that it will be contained in one single RDD_. To do so you can take advantage of all the transformation functions Spark has to offer such `map` `join` `union` `reduce` etc.\n\n## Next step…\n\nWe have explained all the main concepts of Spark and we have shown some real snippets of our codebase. In the next article, I would like to show you a real-life problem we have solved in our company using [_pySpark_](https://spark.apache.org/docs/latest/api/python/index.html). I will show you how to customize Spark infrastructure to correctly parallelize the ETL algorithm you have built.\n","meta":{"title":"Fueling the Energy Transition With Spark - Part 1","description":"Our main backend language is Scala, and by using Spark we build distributed parallel algorithms to fuel the Energy Transition. But why is Spark the best choice for that job?","createdAt":"Wed Nov 04 2020 01:00:00 GMT+0100 (Central European Standard Time)","coverImage":"images/fueling-the-energy-transition-with-spark-part-1.jpg","imageSource":"https://www.pexels.com/photo/shallow-focus-photography-of-light-bulbs-2764942","tags":"spark, scala","author":"Rosario Renga","slug":"blog/fueling-the-energy-transition-with-spark-part-1","formattedDate":"4 november 2020","date":"Wed Nov 04 2020 01:00:00 GMT+0100 (Central European Standard Time)"}}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/how-to-sign-soap-messages.json b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/how-to-sign-soap-messages.json similarity index 97% rename from _next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/how-to-sign-soap-messages.json rename to _next/data/tJlUn5_CjNiSTMoSsoO6j/blog/how-to-sign-soap-messages.json index c00444b52..9d366f174 100644 --- a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/how-to-sign-soap-messages.json +++ b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/how-to-sign-soap-messages.json @@ -1 +1 @@ -{"pageProps":{"post":{"content":"\n# Signing and verfiying SOAP messages with wss4j and Scala\n\nSOAP is not dead. It is an established, XML-based and mature messaging protocol that comes with built-in security mechanisms, integrity checks, content validation and much more. A lot of enterprises and corporations are using it (sadly) still.\nJust recently, Vandebron had to implement a SOAP client to communicate with an external party. \nThis blog post will explain with code examples how we at Vandebron are signing and verifying SOAP messages for our latest SOAP client implementation. \n\nFor this process, we are using Apache's Web Service Security Library [wss4j](https://ws.apache.org/wss4j/) as it is a proven tool in the WSS context and provides, as a Java library, great interoperability with the programming language Scala.\n\n## Signing SOAP messages\n\nHere we will take a look at the necessary steps to sign a SOAP message like this one:\n```xml\n\n \n \n Hello World\n I am just a test\n \n\n```\nTo look after signing like this:\n```xml\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n 7KfPcTwDYWtLj4ZVWmWmVqX4IGwbBAAmUPigCdXdk4U=\n \n \n \n OBnbBWv8S70xDDn5uG++7cTRFa2Uz3D47oxTHuO163Y3/V7H35M1GHXbKaUDOHsgsfx3SdVmVi++ra06cpwJknzqoIQgDV9Qc0ydzfxljCqupPKBnfONDYJtihEE1jtQ0RP7OLzPVNUpgOgHqbLwJu2pRUA05ool+lxIs924OwPVPKyUryoYwWhwY1ttY4P+WY2L3ZqsH3fgoLCyjlvhDEAhsP9PCxsEzPSq3ECC55Nh7nqMoHPj2uNxonuMlPeYbrlMnwyiqEW8s3Sc+WmfiIOgekRE1AdNhpn3ARlO490nObQtXCU/TxeTfbh98TMbQRZWWyT4HuLS3fF6aeyD/Q==\n \n \n \n \n ox4ajWTdigy9oApTYs97CuCV/4k=\n \n \n \n \n \n \n \n Hello World\n I am just a test\n \n\n```\n\nFor implementing the steps of the blog post you will need:\n- a SOAP service you want to send messages to\n- documentation of that SOAP service that describes:\n - signature algorithm\n - canonicalization method\n - digest algorithm\n - key identifier type\n- a private key with which you will sign your messages\n- a certificate that is the counterpart of the private key\n- (optional) a pool of trusted certificates\n\nOur private and public key pair are available in the PKCS#12-format (.p12 file extension). Check out [this](https://www.ssl.com/how-to/create-a-pfx-p12-certificate-file-using-openssl/) to learn more about this format and how to achieve it.\nThe pool of trusted certificates are in the [PKCS#7 format](https://www.ssl.com/guide/pem-der-crt-and-cer-x-509-encodings-and-conversions/) (.p7b file extension).\n\nFirst we have to setup the necessary dependencies:\n\n```scala\n // in your build.sbt or project/Dependencies.scala\n // enabling signing and signature verification for SOAP messages\n lazy val webServiceSecurity = Seq(\n \"org.apache.wss4j\" % \"wss4j\" % \"2.3.1\" pomOnly (),\n \"org.apache.wss4j\" % \"wss4j-ws-security-dom\" % \"2.3.1\",\n \"org.apache.wss4j\" % \"wss4j-ws-security-common\" % \"2.3.1\"\n )\n\n libraryDependencies ++= webServiceSecurity\n```\n\nNext, we continue with a scala representation of our certificate we are using for signing:\n\n```scala\n import org.apache.wss4j.dom.WSConstants\n \n // algorithm configuration\n object SigningCertificate {\n val CanonicalizationMethodURI: String = \"http://www.w3.org/2001/10/xml-exc-c14n#\"\n val DigestAlgorithmURI: String = DigestMethod.SHA256\n val SignatureAlgorithmURI: String = \"http://www.w3.org/2001/04/xmldsig-more#rsa-sha256\"\n val KeyIdentifierType: Int = WSConstants.SKI_KEY_IDENTIFIER\n }\n\n case class SigningCertificate(keyStore: KeyStore, password: String) {\n require(\n keyStore.aliases().asScala.size == 1,\n s\"Certificate of Keystore needs to have one alias but had ${keyStore.aliases().asScala.size}\"\n )\n val alias: String = keyStore.aliases().nextElement()\n\n override def toString: String = s\"SigningCertificate(alias=$alias)\"\n }\n```\nIn the documentation of the SOAP service that you want to call should stand some information regarding the canonicalization method, signature algorithm, digest algorithm, and the key identifier type. Those are algorithms and information that define the signing process and we explain roughly now.\n\nBefore signing a message it has to be canonicalized. \"Canonicalization is a method for generating a physical representation, the canonical form, of an XML document that accounts for syntactic changes permitted by the XML specification\" (from [here](https://www.di-mgt.com.au/xmldsig-c14n.html)). In our case, the Exclusive XML Canonicalization is used.\n\nThe digest algorithm is used to ensure the integrity of the message during the verification of a signature. The algorithm is used to calculate a hash of the signed message. It should be documented in the SOAP service documentation. Here we will use SHA256 as a hashing algorithm.\n\nThe signature algorithm describes how the message will be signed. It can be defined in the SOAP service documentation but in the worst case you can read this algorithm from the certificate itself by using [`keytool`](https://docs.oracle.com/en/java/javase/12/tools/keytool.html):\n```bash\n$ keytool -list -v -keystore signature.p12\nEnter keystore password: ...\n\n[...] # more information about the certificates\n\nSignature algorithm name: SHA256withRSA # thats what we are after!\n\n[...] # more information about the certificates\n```\nAccording to the keytool inspection we will use SHA256withRSA (http://www.w3.org/2001/04/xmldsig-more#rsa-sha256) for signing.\n\nLast but not least, in our signature, a `` element is included. This element contains information about the public key of the sender (us) and is needed for the signature verification once the message is received (read more [here](https://www.xml.com/pub/a/2001/08/08/xmldsig.html)). Since we have our public key provided we don't need to do much here. The `KeyIdentifierType` describes which form of key identifier is used to present the public key information.\n\nHaving all this information about our certificate in place, we build the mechanism to load in our signing certificate. For this, we create the object `KeyStoreBuilder`.\n\n```scala\nimport java.io.{File, FileInputStream}\n\nobject KeyStoreBuilder {\n\n def loadSigningCertificate(signingCertificate: File, password: String): SigningCertificate = {\n val fis = new FileInputStream(signingCertificate)\n val ks: KeyStore = KeyStore.getInstance(\"PKCS12\")\n ks.load(fis, password.toCharArray)\n SigningCertificate(ks, password)\n } \n}\n```\nBear in mind, that you probably **don't** want to version any sensitive information like private keys and passwords hard-coded or in any environment variables, so a safe mechanism for storing/fetching passwords and certificates (like [Vault](https://www.hashicorp.com/products/vault)) should be in place.\n\nWith the signing certificate in place, we can actually start signing a message. The next code example contains quite some Java boilerplate from wss4j that is required to make the signing mechanism work.\n\nTo restrict the usage of Java classes to a small portion of our code we will firstly implement a conversion method `.toElem` inside of the companion object `SigningService`:\n\n```scala\n import java.io.StringWriter\n import javax.xml.transform.{OutputKeys, TransformerFactory}\n import javax.xml.transform.dom.DOMSource\n import javax.xml.transform.stream.StreamResult\n\n import org.w3c.dom.Document\n\n import scala.xml.Elem\n\n object SigningService {\n implicit class RichDocument(document: Document) {\n private val tf = TransformerFactory.newInstance()\n\n def toElem: Elem =\n val transformer = tf.newTransformer()\n transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, \"yes\");\n val stringWriter = new StringWriter()\n transformer.transform(new DOMSource(document), new StreamResult(stringWriter))\n scala.xml.XML.loadString(stringWriter.getBuffer.toString)\n }\n }\n```\nWith that, we can convert any `Document` SOAP message representation back to the `scala.xml` supported `Elem` format.\n\n```scala\nclass SigningService(signingCertificate: SigningCertificate) {\n\n // importing our conversion method\n import SigningService.RichDocument\n\n /**\n * REQUIRED, otherwise it will throw:\n *\n * org.apache.wss4j.common.ext.WSSecurityException:\n * You must initialize the xml-security library correctly before you use it.\n * Call the static method \"org.apache.xml.security.Init.init();\"\n * to do that before you use any functionality from that library\n */\n org.apache.xml.security.Init.init()\n \n private val documentBuilderFactory = DocumentBuilderFactory.newInstance()\n private val crypto: Merlin = getCrypto\n\n crypto.setKeyStore(signingCertificate.keyStore)\n\n def signElement(elem: Elem): Elem = {\n documentBuilderFactory.setNamespaceAware(true)\n // converting Elem to Document (Scala to Java conversion)\n val doc = documentBuilderFactory.newDocumentBuilder().parse(new InputSource(new StringReader(elem.toString())))\n\n // WSSecHeader wraps around the document we want to sign\n val header = new WSSecHeader(doc)\n header.setMustUnderstand(true)\n header.insertSecurityHeader()\n\n // start building Signature, use the (wrapper) header-instance\n val builder = new WSSecSignature(header)\n builder.setUserInfo(signingCertificate.alias, signingCertificate.password)\n\n // setting algorithms\n builder.setSignatureAlgorithm(SigningCertificate.SignatureAlgorithmURI)\n builder.setSigCanonicalization(SigningCertificate.CanonicalizationMethodURI)\n builder.setDigestAlgo(SigningCertificate.DigestAlgorithmURI)\n builder.setKeyIdentifierType(SigningCertificate.KeyIdentifierType)\n builder.setAddInclusivePrefixes(true)\n\n // signing the document!\n val signedDocument = builder.build(crypto)\n // conversion back to Elem\n signedDocument.toElem\n }\n\n private def getCrypto: Merlin = {\n val properties = new Properties()\n properties.setProperty(\"org.apache.wss4j.crypto.provider\", \"class org.apache.ws.security.components.crypto.Merlin\")\n CryptoFactory.getInstance().asInstanceOf[Merlin]\n }\n}\n```\n\nWss4j is a library that maintains an internal state during a signing process, but to avoid confusion it can be summarized as:\n1. `WSSecHeader` wraps around the document to be signed\n2. the WSSecHeader instance `header` will be used as part of the `WSSecSignature`-Builder\n3. the WSSecSignature instance `builder` gets configured with all necessary information, which algorithms are used for signing, digesting, canonicalization, which key identifier should be included. Those settings an vary from webservice to webservice.\n\nThe actual signing of the document, which is now nested like a matryoshka doll, is happening with the help of an instance of `Crypto`. `Crypto` will contain either a keystore or a truststore or even both. It needs to be specified in the `crypto.properties` file or a runtime which class of Crypto will be used.\n The most common one is [`Merlin`](https://ws.apache.org/wss4j/apidocs/org/apache/wss4j/common/crypto/Merlin.html).\nWe have decided to specify its configuration during runtime, since it is more visible than a properties file. Nevertheless, the `crypto.properties`-file needs to exist in your `resources` folder neverthless otherwise you will get a following `WSSecurityException`:\n```java\n org.apache.wss4j.common.ext.WSSecurityException: No message with ID \"resourceNotFound\" found in resource bundle \"org/apache/xml/security/resource/xmlsecurity\"\n [... rest of stacktrace ...]\n Cause: java.nio.file.NoSuchFileException: crypto.properties\n```\n\nAnd that's it! The `KeyStoreBuilder` helps us to load a `SigningCertificate` and the `SigningService` uses this loaded certificate to sign SOAP messages. \nA receiver of our SOAP message has all the necessary information in our signature to verify that this message has not been tampered with and we are the original sender.\n\nThis verification is something we should also do on our side for incoming messages. So let's take a look at how we can verify the signature of received messages.\n\n## Verification of SOAP messages\n\nVerifying the signature of incoming messages is equally important to ensure that the connection is secure. A verification process will tell you if the message is coming from a trusted source and has not been tampered with.\n\nAs previously mentioned we need our source of truth, a pool of trusted public keys from all parties which will receive our SOAP messages. These build the basis of the trust store.\n\nWe will create a `TrustedCertificates` wrapper class in which we will load in the trust store and add this method to the `KeyStoreBuilder`.\n```scala\ncase class TrustedCertificates(keyStore: KeyStore)\n\nobject KeyStoreBuilder {\n\n def loadTrustedCertificate(certificates: Seq[File]): TrustedCertificates = {\n val ks = KeyStore.getInstance(KeyStore.getDefaultType)\n // we just want the keystore to act as a truststore (only containing trusted certificates), so we initialize it empty\n ks.load(null, null)\n val cf = CertificateFactory.getInstance(\"X.509\")\n certificates.foreach { file =>\n CloseableUtil.using(getClass.getResourceAsStream(file.getPath)) { fis =>\n val certPath = cf.generateCertPath(fis, \"PKCS7\")\n certPath.getCertificates.asScala.toList.foreach { certificate =>\n ks.setCertificateEntry(file.getName, certificate)\n }\n }\n }\n TrustedCertificates(ks)\n }\n}\n```\nThis trust store is under the hood also just a KeyStore, without containing a private key that requires a password, that's why we can initialize the KeyStore with `null`-parameters.\n\nNow, the SigningService needs to be extended with this trusted certificates and a `verifySignatureOf`-method:\n\n```scala\nimport java.io.StringReader\nimport java.util.Properties\nimport javax.xml.parsers.DocumentBuilderFactory\n\nimport org.apache.wss4j.common.crypto.{ CryptoFactory, Merlin }\nimport org.apache.wss4j.dom.engine.WSSecurityEngine\nimport org.xml.sax.InputSource\n\nimport scala.util.{Failure, Success, Try}\nimport scala.xml.Elem\n\nclass SigningService(signingCertificate: SigningCertificate, trustedCertificates: TrustedCertificates) {\n\n private val engine = new WSSecurityEngine()\n private val documentBuilderFactory = DocumentBuilderFactory.newInstance()\n private val crypto: Merlin = getCrypto\n\n crypto.setKeyStore(signingCertificate.keyStore)\n crypto.setTrustStore(trustedCertificates.keyStore)\n\n def verifySignatureOf(elem: Elem): Boolean = {\n documentBuilderFactory.setNamespaceAware(true)\n val doc = documentBuilderFactory.newDocumentBuilder().parse(new InputSource(new StringReader(elem.toString())))\n\n Try(engine.processSecurityHeader(doc, null, null, crypto)) match {\n case Success(_) => true\n case Failure(exception) =>\n // replace with proper logging\n println(\n s\"Unsuccessful signature verification, it is most likely that the certificate used for signing is not in our Truststore: ${exception.getMessage}\")\n false\n }\n }\n\n private def getCrypto: Merlin = {\n val properties = new Properties()\n properties.setProperty(\"org.apache.wss4j.crypto.provider\", \"class org.apache.ws.security.components.crypto.Merlin\")\n CryptoFactory.getInstance().asInstanceOf[Merlin]\n }\n}\n```\n\nAnd with that, we have completed our roundtrip of signing and verifying SOAP messages!\n\nHere are gists, articles, and documentation that inspired and helped us to figure out the signing and verification process for our SOAP client. Feel free to check them out!\n\n* * *\n\n### Sources\n\n[WSSecurityVerifier by Luis Wolff](https://gist.github.com/luiswolff/1d388ec8c1d63cfb58974a6f826bc1be) \n\n[WSSecuritySigner by Luis Wolff](https://gist.github.com/luiswolff/64d15a99fbb5ec4b4e90eec04b09e053)\n\n[Unit Tests from ws-wss4j](https://github.com/apache/ws-wss4j/blob/master/ws-security-dom/src/test/java/org/apache/wss4j/dom/message/SignatureTest.java)\n\n[An Introduction to XML Digital Signatures](https://www.xml.com/pub/a/2001/08/08/xmldsig.html)\n\n[SOAP vs. REST](https://stackify.com/soap-vs-rest/)","meta":{"title":"Signing and verifying SOAP messages with wss4j and Scala","description":"This blogpost will explain with code examples how we at Vandebron are signing and verifying SOAP messages for our latest SOAP client implementation.","createdAt":"Mon Jun 28 2021 02:00:00 GMT+0200 (GMT+02:00)","coverImage":"images/soap.jpg","imageSource":"https://cdn.pixabay.com/photo/2020/03/15/18/36/wash-4934590_960_720.jpg","tags":"SOAP, xml, scala, wss4j, signature, verification","author":"Katrin Grunert","slug":"blog/how-to-sign-soap-messages","formattedDate":"28 juni 2021","date":"Mon Jun 28 2021 02:00:00 GMT+0200 (GMT+02:00)"}}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"post":{"content":"\n# Signing and verfiying SOAP messages with wss4j and Scala\n\nSOAP is not dead. It is an established, XML-based and mature messaging protocol that comes with built-in security mechanisms, integrity checks, content validation and much more. A lot of enterprises and corporations are using it (sadly) still.\nJust recently, Vandebron had to implement a SOAP client to communicate with an external party. \nThis blog post will explain with code examples how we at Vandebron are signing and verifying SOAP messages for our latest SOAP client implementation. \n\nFor this process, we are using Apache's Web Service Security Library [wss4j](https://ws.apache.org/wss4j/) as it is a proven tool in the WSS context and provides, as a Java library, great interoperability with the programming language Scala.\n\n## Signing SOAP messages\n\nHere we will take a look at the necessary steps to sign a SOAP message like this one:\n```xml\n\n \n \n Hello World\n I am just a test\n \n\n```\nTo look after signing like this:\n```xml\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n 7KfPcTwDYWtLj4ZVWmWmVqX4IGwbBAAmUPigCdXdk4U=\n \n \n \n OBnbBWv8S70xDDn5uG++7cTRFa2Uz3D47oxTHuO163Y3/V7H35M1GHXbKaUDOHsgsfx3SdVmVi++ra06cpwJknzqoIQgDV9Qc0ydzfxljCqupPKBnfONDYJtihEE1jtQ0RP7OLzPVNUpgOgHqbLwJu2pRUA05ool+lxIs924OwPVPKyUryoYwWhwY1ttY4P+WY2L3ZqsH3fgoLCyjlvhDEAhsP9PCxsEzPSq3ECC55Nh7nqMoHPj2uNxonuMlPeYbrlMnwyiqEW8s3Sc+WmfiIOgekRE1AdNhpn3ARlO490nObQtXCU/TxeTfbh98TMbQRZWWyT4HuLS3fF6aeyD/Q==\n \n \n \n \n ox4ajWTdigy9oApTYs97CuCV/4k=\n \n \n \n \n \n \n \n Hello World\n I am just a test\n \n\n```\n\nFor implementing the steps of the blog post you will need:\n- a SOAP service you want to send messages to\n- documentation of that SOAP service that describes:\n - signature algorithm\n - canonicalization method\n - digest algorithm\n - key identifier type\n- a private key with which you will sign your messages\n- a certificate that is the counterpart of the private key\n- (optional) a pool of trusted certificates\n\nOur private and public key pair are available in the PKCS#12-format (.p12 file extension). Check out [this](https://www.ssl.com/how-to/create-a-pfx-p12-certificate-file-using-openssl/) to learn more about this format and how to achieve it.\nThe pool of trusted certificates are in the [PKCS#7 format](https://www.ssl.com/guide/pem-der-crt-and-cer-x-509-encodings-and-conversions/) (.p7b file extension).\n\nFirst we have to setup the necessary dependencies:\n\n```scala\n // in your build.sbt or project/Dependencies.scala\n // enabling signing and signature verification for SOAP messages\n lazy val webServiceSecurity = Seq(\n \"org.apache.wss4j\" % \"wss4j\" % \"2.3.1\" pomOnly (),\n \"org.apache.wss4j\" % \"wss4j-ws-security-dom\" % \"2.3.1\",\n \"org.apache.wss4j\" % \"wss4j-ws-security-common\" % \"2.3.1\"\n )\n\n libraryDependencies ++= webServiceSecurity\n```\n\nNext, we continue with a scala representation of our certificate we are using for signing:\n\n```scala\n import org.apache.wss4j.dom.WSConstants\n \n // algorithm configuration\n object SigningCertificate {\n val CanonicalizationMethodURI: String = \"http://www.w3.org/2001/10/xml-exc-c14n#\"\n val DigestAlgorithmURI: String = DigestMethod.SHA256\n val SignatureAlgorithmURI: String = \"http://www.w3.org/2001/04/xmldsig-more#rsa-sha256\"\n val KeyIdentifierType: Int = WSConstants.SKI_KEY_IDENTIFIER\n }\n\n case class SigningCertificate(keyStore: KeyStore, password: String) {\n require(\n keyStore.aliases().asScala.size == 1,\n s\"Certificate of Keystore needs to have one alias but had ${keyStore.aliases().asScala.size}\"\n )\n val alias: String = keyStore.aliases().nextElement()\n\n override def toString: String = s\"SigningCertificate(alias=$alias)\"\n }\n```\nIn the documentation of the SOAP service that you want to call should stand some information regarding the canonicalization method, signature algorithm, digest algorithm, and the key identifier type. Those are algorithms and information that define the signing process and we explain roughly now.\n\nBefore signing a message it has to be canonicalized. \"Canonicalization is a method for generating a physical representation, the canonical form, of an XML document that accounts for syntactic changes permitted by the XML specification\" (from [here](https://www.di-mgt.com.au/xmldsig-c14n.html)). In our case, the Exclusive XML Canonicalization is used.\n\nThe digest algorithm is used to ensure the integrity of the message during the verification of a signature. The algorithm is used to calculate a hash of the signed message. It should be documented in the SOAP service documentation. Here we will use SHA256 as a hashing algorithm.\n\nThe signature algorithm describes how the message will be signed. It can be defined in the SOAP service documentation but in the worst case you can read this algorithm from the certificate itself by using [`keytool`](https://docs.oracle.com/en/java/javase/12/tools/keytool.html):\n```bash\n$ keytool -list -v -keystore signature.p12\nEnter keystore password: ...\n\n[...] # more information about the certificates\n\nSignature algorithm name: SHA256withRSA # thats what we are after!\n\n[...] # more information about the certificates\n```\nAccording to the keytool inspection we will use SHA256withRSA (http://www.w3.org/2001/04/xmldsig-more#rsa-sha256) for signing.\n\nLast but not least, in our signature, a `` element is included. This element contains information about the public key of the sender (us) and is needed for the signature verification once the message is received (read more [here](https://www.xml.com/pub/a/2001/08/08/xmldsig.html)). Since we have our public key provided we don't need to do much here. The `KeyIdentifierType` describes which form of key identifier is used to present the public key information.\n\nHaving all this information about our certificate in place, we build the mechanism to load in our signing certificate. For this, we create the object `KeyStoreBuilder`.\n\n```scala\nimport java.io.{File, FileInputStream}\n\nobject KeyStoreBuilder {\n\n def loadSigningCertificate(signingCertificate: File, password: String): SigningCertificate = {\n val fis = new FileInputStream(signingCertificate)\n val ks: KeyStore = KeyStore.getInstance(\"PKCS12\")\n ks.load(fis, password.toCharArray)\n SigningCertificate(ks, password)\n } \n}\n```\nBear in mind, that you probably **don't** want to version any sensitive information like private keys and passwords hard-coded or in any environment variables, so a safe mechanism for storing/fetching passwords and certificates (like [Vault](https://www.hashicorp.com/products/vault)) should be in place.\n\nWith the signing certificate in place, we can actually start signing a message. The next code example contains quite some Java boilerplate from wss4j that is required to make the signing mechanism work.\n\nTo restrict the usage of Java classes to a small portion of our code we will firstly implement a conversion method `.toElem` inside of the companion object `SigningService`:\n\n```scala\n import java.io.StringWriter\n import javax.xml.transform.{OutputKeys, TransformerFactory}\n import javax.xml.transform.dom.DOMSource\n import javax.xml.transform.stream.StreamResult\n\n import org.w3c.dom.Document\n\n import scala.xml.Elem\n\n object SigningService {\n implicit class RichDocument(document: Document) {\n private val tf = TransformerFactory.newInstance()\n\n def toElem: Elem =\n val transformer = tf.newTransformer()\n transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, \"yes\");\n val stringWriter = new StringWriter()\n transformer.transform(new DOMSource(document), new StreamResult(stringWriter))\n scala.xml.XML.loadString(stringWriter.getBuffer.toString)\n }\n }\n```\nWith that, we can convert any `Document` SOAP message representation back to the `scala.xml` supported `Elem` format.\n\n```scala\nclass SigningService(signingCertificate: SigningCertificate) {\n\n // importing our conversion method\n import SigningService.RichDocument\n\n /**\n * REQUIRED, otherwise it will throw:\n *\n * org.apache.wss4j.common.ext.WSSecurityException:\n * You must initialize the xml-security library correctly before you use it.\n * Call the static method \"org.apache.xml.security.Init.init();\"\n * to do that before you use any functionality from that library\n */\n org.apache.xml.security.Init.init()\n \n private val documentBuilderFactory = DocumentBuilderFactory.newInstance()\n private val crypto: Merlin = getCrypto\n\n crypto.setKeyStore(signingCertificate.keyStore)\n\n def signElement(elem: Elem): Elem = {\n documentBuilderFactory.setNamespaceAware(true)\n // converting Elem to Document (Scala to Java conversion)\n val doc = documentBuilderFactory.newDocumentBuilder().parse(new InputSource(new StringReader(elem.toString())))\n\n // WSSecHeader wraps around the document we want to sign\n val header = new WSSecHeader(doc)\n header.setMustUnderstand(true)\n header.insertSecurityHeader()\n\n // start building Signature, use the (wrapper) header-instance\n val builder = new WSSecSignature(header)\n builder.setUserInfo(signingCertificate.alias, signingCertificate.password)\n\n // setting algorithms\n builder.setSignatureAlgorithm(SigningCertificate.SignatureAlgorithmURI)\n builder.setSigCanonicalization(SigningCertificate.CanonicalizationMethodURI)\n builder.setDigestAlgo(SigningCertificate.DigestAlgorithmURI)\n builder.setKeyIdentifierType(SigningCertificate.KeyIdentifierType)\n builder.setAddInclusivePrefixes(true)\n\n // signing the document!\n val signedDocument = builder.build(crypto)\n // conversion back to Elem\n signedDocument.toElem\n }\n\n private def getCrypto: Merlin = {\n val properties = new Properties()\n properties.setProperty(\"org.apache.wss4j.crypto.provider\", \"class org.apache.ws.security.components.crypto.Merlin\")\n CryptoFactory.getInstance().asInstanceOf[Merlin]\n }\n}\n```\n\nWss4j is a library that maintains an internal state during a signing process, but to avoid confusion it can be summarized as:\n1. `WSSecHeader` wraps around the document to be signed\n2. the WSSecHeader instance `header` will be used as part of the `WSSecSignature`-Builder\n3. the WSSecSignature instance `builder` gets configured with all necessary information, which algorithms are used for signing, digesting, canonicalization, which key identifier should be included. Those settings an vary from webservice to webservice.\n\nThe actual signing of the document, which is now nested like a matryoshka doll, is happening with the help of an instance of `Crypto`. `Crypto` will contain either a keystore or a truststore or even both. It needs to be specified in the `crypto.properties` file or a runtime which class of Crypto will be used.\n The most common one is [`Merlin`](https://ws.apache.org/wss4j/apidocs/org/apache/wss4j/common/crypto/Merlin.html).\nWe have decided to specify its configuration during runtime, since it is more visible than a properties file. Nevertheless, the `crypto.properties`-file needs to exist in your `resources` folder neverthless otherwise you will get a following `WSSecurityException`:\n```java\n org.apache.wss4j.common.ext.WSSecurityException: No message with ID \"resourceNotFound\" found in resource bundle \"org/apache/xml/security/resource/xmlsecurity\"\n [... rest of stacktrace ...]\n Cause: java.nio.file.NoSuchFileException: crypto.properties\n```\n\nAnd that's it! The `KeyStoreBuilder` helps us to load a `SigningCertificate` and the `SigningService` uses this loaded certificate to sign SOAP messages. \nA receiver of our SOAP message has all the necessary information in our signature to verify that this message has not been tampered with and we are the original sender.\n\nThis verification is something we should also do on our side for incoming messages. So let's take a look at how we can verify the signature of received messages.\n\n## Verification of SOAP messages\n\nVerifying the signature of incoming messages is equally important to ensure that the connection is secure. A verification process will tell you if the message is coming from a trusted source and has not been tampered with.\n\nAs previously mentioned we need our source of truth, a pool of trusted public keys from all parties which will receive our SOAP messages. These build the basis of the trust store.\n\nWe will create a `TrustedCertificates` wrapper class in which we will load in the trust store and add this method to the `KeyStoreBuilder`.\n```scala\ncase class TrustedCertificates(keyStore: KeyStore)\n\nobject KeyStoreBuilder {\n\n def loadTrustedCertificate(certificates: Seq[File]): TrustedCertificates = {\n val ks = KeyStore.getInstance(KeyStore.getDefaultType)\n // we just want the keystore to act as a truststore (only containing trusted certificates), so we initialize it empty\n ks.load(null, null)\n val cf = CertificateFactory.getInstance(\"X.509\")\n certificates.foreach { file =>\n CloseableUtil.using(getClass.getResourceAsStream(file.getPath)) { fis =>\n val certPath = cf.generateCertPath(fis, \"PKCS7\")\n certPath.getCertificates.asScala.toList.foreach { certificate =>\n ks.setCertificateEntry(file.getName, certificate)\n }\n }\n }\n TrustedCertificates(ks)\n }\n}\n```\nThis trust store is under the hood also just a KeyStore, without containing a private key that requires a password, that's why we can initialize the KeyStore with `null`-parameters.\n\nNow, the SigningService needs to be extended with this trusted certificates and a `verifySignatureOf`-method:\n\n```scala\nimport java.io.StringReader\nimport java.util.Properties\nimport javax.xml.parsers.DocumentBuilderFactory\n\nimport org.apache.wss4j.common.crypto.{ CryptoFactory, Merlin }\nimport org.apache.wss4j.dom.engine.WSSecurityEngine\nimport org.xml.sax.InputSource\n\nimport scala.util.{Failure, Success, Try}\nimport scala.xml.Elem\n\nclass SigningService(signingCertificate: SigningCertificate, trustedCertificates: TrustedCertificates) {\n\n private val engine = new WSSecurityEngine()\n private val documentBuilderFactory = DocumentBuilderFactory.newInstance()\n private val crypto: Merlin = getCrypto\n\n crypto.setKeyStore(signingCertificate.keyStore)\n crypto.setTrustStore(trustedCertificates.keyStore)\n\n def verifySignatureOf(elem: Elem): Boolean = {\n documentBuilderFactory.setNamespaceAware(true)\n val doc = documentBuilderFactory.newDocumentBuilder().parse(new InputSource(new StringReader(elem.toString())))\n\n Try(engine.processSecurityHeader(doc, null, null, crypto)) match {\n case Success(_) => true\n case Failure(exception) =>\n // replace with proper logging\n println(\n s\"Unsuccessful signature verification, it is most likely that the certificate used for signing is not in our Truststore: ${exception.getMessage}\")\n false\n }\n }\n\n private def getCrypto: Merlin = {\n val properties = new Properties()\n properties.setProperty(\"org.apache.wss4j.crypto.provider\", \"class org.apache.ws.security.components.crypto.Merlin\")\n CryptoFactory.getInstance().asInstanceOf[Merlin]\n }\n}\n```\n\nAnd with that, we have completed our roundtrip of signing and verifying SOAP messages!\n\nHere are gists, articles, and documentation that inspired and helped us to figure out the signing and verification process for our SOAP client. Feel free to check them out!\n\n* * *\n\n### Sources\n\n[WSSecurityVerifier by Luis Wolff](https://gist.github.com/luiswolff/1d388ec8c1d63cfb58974a6f826bc1be) \n\n[WSSecuritySigner by Luis Wolff](https://gist.github.com/luiswolff/64d15a99fbb5ec4b4e90eec04b09e053)\n\n[Unit Tests from ws-wss4j](https://github.com/apache/ws-wss4j/blob/master/ws-security-dom/src/test/java/org/apache/wss4j/dom/message/SignatureTest.java)\n\n[An Introduction to XML Digital Signatures](https://www.xml.com/pub/a/2001/08/08/xmldsig.html)\n\n[SOAP vs. REST](https://stackify.com/soap-vs-rest/)","meta":{"title":"Signing and verifying SOAP messages with wss4j and Scala","description":"This blogpost will explain with code examples how we at Vandebron are signing and verifying SOAP messages for our latest SOAP client implementation.","createdAt":"Mon Jun 28 2021 02:00:00 GMT+0200 (Central European Summer Time)","coverImage":"images/soap.jpg","imageSource":"https://cdn.pixabay.com/photo/2020/03/15/18/36/wash-4934590_960_720.jpg","tags":"SOAP, xml, scala, wss4j, signature, verification","author":"Katrin Grunert","slug":"blog/how-to-sign-soap-messages","formattedDate":"28 juni 2021","date":"Mon Jun 28 2021 02:00:00 GMT+0200 (Central European Summer Time)"}}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/looking-back-at-vandebron-greentech-hackathon-2021.json b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/looking-back-at-vandebron-greentech-hackathon-2021.json similarity index 94% rename from _next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/looking-back-at-vandebron-greentech-hackathon-2021.json rename to _next/data/tJlUn5_CjNiSTMoSsoO6j/blog/looking-back-at-vandebron-greentech-hackathon-2021.json index dfa7f702f..1d6c452a2 100644 --- a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/looking-back-at-vandebron-greentech-hackathon-2021.json +++ b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/looking-back-at-vandebron-greentech-hackathon-2021.json @@ -1 +1 @@ -{"pageProps":{"post":{"content":"\nAt the end of March, we organized a public hackathon to create solutions to tackle climate challenges. After having done internal hackathons, we thought it was time to share our technologies with other innovative people and companies. Together with a group of partners, and enthusiastic participants, spend three full days of (remote) hacking with great results.\n\n### Why organize a public hackathon?\n\nClimate change is one of the many pressing challenges our society is currently facing. At [Vandebron](https://vandebron.nl/), we want to continue finding ways to tackle this immense challenge. That’s why we decided to organize a 3-day GreenTech hackathon that ran from March 31st to April 2nd, 2021. We've been organizing internal hackathons for the past four years, to foster innovation within our company and allow our developers to work on something exciting without any constraints. If you want to read more about why we organize internal hackathons, you can find an article by our CTO [here](https://www.vandebron.tech/blog/power-regular-hackathons). \n\nBy organizing a public hackathon, we hoped to attract a bigger audience, possibly even outside our country, The Netherlands, and attract partners to work together with. We succeeded in both, and together with [Hack the Planet](https://hack-the-planet.io/) and [Top Dutch Solar Racing](https://solarracing.nl/), we wanted to find technological solutions to problems in wildlife conservation and renewable energy. For these three days, all participants got the opportunity to work on challenges from our partners, access their technology and knowledge, and got the chance to win unique prizes. Also, we organized a free event with speakers Florian Dirkse ([The Ocean Cleanup](https://theoceancleanup.com/)), Thijs Suijten (Hack the Planet) and Heleen Klinkert ([Nieuw Groen](https://nieuw-groen.nl/)). \n\n### Looking back\n\nThe event started on March 31st, when all hackathon challenges were presented and the participants could select which challenge they wanted to work on. People from all over The Netherlands (and even beyond) signed up for the hackathon, ranging from students from the University of Amsterdam to young professionals looking for a job. The first challenge the participants could subscribe to was from Vandebron itself, where teams got the opportunity to use a selection of our Electronic Vehicle (EV) data. With this data, they could for example make a forecast on the amount of charging sessions we could expect on a typical day. Second, our partner Hack the Planet presented their challenge that was aimed at thinking of innovative solutions for their project [Hack the Poacher](https://www.hackthepoacher.com/). With Hack the Poacher, they install smart camera traps in African wildlife reservations to detect poachers. The teams could use their camera traps and data to create more solutions to map the poachers or use the camera traps for other needs. Finally, the students from Top Dutch Solar Racing presented a challenge to simulate the race they were supposed to join at the end of the year in Australia. Using their weather and traffic data, the teams could simulate the race and predict how much time they would need to complete the race. After selecting a challenge, all teams started the hackathon and participated in sessions to learn more about the challenges to get started.\n\nAll teams continued working on the hackathon challenge on the second day, after a nice warming-up quiz about climate change in the morning. For most teams this second day was when their project started to take shape, and they got a better idea about what they would be presenting on the final day. This second day was also an opportunity for non-technical people to get to know Vandebron and their partners better as we organized inspirational sessions with talks from different speakers in the afternoon. One of the co-founders from The Ocean Cleanup, Florian Dirkse, inspired us with his story behind making a difference in the world. After which, one of our hackathon partners Thijs Suijten, from Hack the Planet, demonstrated how technology can be used for the good. Our third, and final, speaker Heleen Klinkert (Nieuw Groen), showed how we can compensate for our CO2 emissions by storing them in the soil.\n\nOn the final day of the hackathon, all teams had to finalize their projects and create a presentation for the closing ceremony. During this ceremony, all participants and partners looked back at the past three days and shared what they had been working on during the hackathon. For every challenge, one team could win and take home several prizes, sponsored by [Marie-Stella-Maris](https://marie-stella-maris.com/), [EV Experience](https://evexperience.nl/), and [Klimaatroute](https://www.klimaatroute.nl/). The first presentations were for the Vandebron challenge about EV forecasts. This challenge was won by not one but two teams as the jury and audience were so impressed by their solutions. Both teams created not only the forecast based on the sample data provided, but also created interactive dashboards. On the challenge for Hack the Planet, the team that won came up with a unique solution to use the camera traps to detect wild animals on the streets. For countries like India, this is a huge problem, as wild animals get stuck in traffic or walk through rural areas. The final winner of the hackathon was a group of students that simulated the Top Dutch Solar Racing trip through Australia and forecasted they could complete the race within 7 days.\n\n### Thanks everyone\n\nI'd like to thank all the participants, prize/challenge partners, and speakers for their efforts during these days. The GreenTech Hackathon 2021 was a huge success thanks to everyone that has been involved. Keep following the [vandebron.tech](https://vandebron.tech) to be updated on future hackathons and events.\n","meta":{"title":"Looking back at the Vandebron GreenTech Hackathon 2021","description":"At the end of March, we organized a public hackathon to create solutions to tackle climate challenges. After having done internal hackathons, we thought it was time to share our technologies with other innovative people and companies.","createdAt":"Mon Apr 05 2021 02:00:00 GMT+0200 (GMT+02:00)","coverImage":"images/looking-back-at-vandebron-greentech-hackathon-2021.png","tags":"hackathon, innovation","author":"Roy Derks","slug":"blog/looking-back-at-vandebron-greentech-hackathon-2021","formattedDate":"5 april 2021","date":"Mon Apr 05 2021 02:00:00 GMT+0200 (GMT+02:00)"}}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"post":{"content":"\nAt the end of March, we organized a public hackathon to create solutions to tackle climate challenges. After having done internal hackathons, we thought it was time to share our technologies with other innovative people and companies. Together with a group of partners, and enthusiastic participants, spend three full days of (remote) hacking with great results.\n\n### Why organize a public hackathon?\n\nClimate change is one of the many pressing challenges our society is currently facing. At [Vandebron](https://vandebron.nl/), we want to continue finding ways to tackle this immense challenge. That’s why we decided to organize a 3-day GreenTech hackathon that ran from March 31st to April 2nd, 2021. We've been organizing internal hackathons for the past four years, to foster innovation within our company and allow our developers to work on something exciting without any constraints. If you want to read more about why we organize internal hackathons, you can find an article by our CTO [here](https://www.vandebron.tech/blog/power-regular-hackathons). \n\nBy organizing a public hackathon, we hoped to attract a bigger audience, possibly even outside our country, The Netherlands, and attract partners to work together with. We succeeded in both, and together with [Hack the Planet](https://hack-the-planet.io/) and [Top Dutch Solar Racing](https://solarracing.nl/), we wanted to find technological solutions to problems in wildlife conservation and renewable energy. For these three days, all participants got the opportunity to work on challenges from our partners, access their technology and knowledge, and got the chance to win unique prizes. Also, we organized a free event with speakers Florian Dirkse ([The Ocean Cleanup](https://theoceancleanup.com/)), Thijs Suijten (Hack the Planet) and Heleen Klinkert ([Nieuw Groen](https://nieuw-groen.nl/)). \n\n### Looking back\n\nThe event started on March 31st, when all hackathon challenges were presented and the participants could select which challenge they wanted to work on. People from all over The Netherlands (and even beyond) signed up for the hackathon, ranging from students from the University of Amsterdam to young professionals looking for a job. The first challenge the participants could subscribe to was from Vandebron itself, where teams got the opportunity to use a selection of our Electronic Vehicle (EV) data. With this data, they could for example make a forecast on the amount of charging sessions we could expect on a typical day. Second, our partner Hack the Planet presented their challenge that was aimed at thinking of innovative solutions for their project [Hack the Poacher](https://www.hackthepoacher.com/). With Hack the Poacher, they install smart camera traps in African wildlife reservations to detect poachers. The teams could use their camera traps and data to create more solutions to map the poachers or use the camera traps for other needs. Finally, the students from Top Dutch Solar Racing presented a challenge to simulate the race they were supposed to join at the end of the year in Australia. Using their weather and traffic data, the teams could simulate the race and predict how much time they would need to complete the race. After selecting a challenge, all teams started the hackathon and participated in sessions to learn more about the challenges to get started.\n\nAll teams continued working on the hackathon challenge on the second day, after a nice warming-up quiz about climate change in the morning. For most teams this second day was when their project started to take shape, and they got a better idea about what they would be presenting on the final day. This second day was also an opportunity for non-technical people to get to know Vandebron and their partners better as we organized inspirational sessions with talks from different speakers in the afternoon. One of the co-founders from The Ocean Cleanup, Florian Dirkse, inspired us with his story behind making a difference in the world. After which, one of our hackathon partners Thijs Suijten, from Hack the Planet, demonstrated how technology can be used for the good. Our third, and final, speaker Heleen Klinkert (Nieuw Groen), showed how we can compensate for our CO2 emissions by storing them in the soil.\n\nOn the final day of the hackathon, all teams had to finalize their projects and create a presentation for the closing ceremony. During this ceremony, all participants and partners looked back at the past three days and shared what they had been working on during the hackathon. For every challenge, one team could win and take home several prizes, sponsored by [Marie-Stella-Maris](https://marie-stella-maris.com/), [EV Experience](https://evexperience.nl/), and [Klimaatroute](https://www.klimaatroute.nl/). The first presentations were for the Vandebron challenge about EV forecasts. This challenge was won by not one but two teams as the jury and audience were so impressed by their solutions. Both teams created not only the forecast based on the sample data provided, but also created interactive dashboards. On the challenge for Hack the Planet, the team that won came up with a unique solution to use the camera traps to detect wild animals on the streets. For countries like India, this is a huge problem, as wild animals get stuck in traffic or walk through rural areas. The final winner of the hackathon was a group of students that simulated the Top Dutch Solar Racing trip through Australia and forecasted they could complete the race within 7 days.\n\n### Thanks everyone\n\nI'd like to thank all the participants, prize/challenge partners, and speakers for their efforts during these days. The GreenTech Hackathon 2021 was a huge success thanks to everyone that has been involved. Keep following the [vandebron.tech](https://vandebron.tech) to be updated on future hackathons and events.\n","meta":{"title":"Looking back at the Vandebron GreenTech Hackathon 2021","description":"At the end of March, we organized a public hackathon to create solutions to tackle climate challenges. After having done internal hackathons, we thought it was time to share our technologies with other innovative people and companies.","createdAt":"Mon Apr 05 2021 02:00:00 GMT+0200 (Central European Summer Time)","coverImage":"images/looking-back-at-vandebron-greentech-hackathon-2021.png","tags":"hackathon, innovation","author":"Roy Derks","slug":"blog/looking-back-at-vandebron-greentech-hackathon-2021","formattedDate":"5 april 2021","date":"Mon Apr 05 2021 02:00:00 GMT+0200 (Central European Summer Time)"}}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/migrating-dcos-kubernetes-l4lb.json b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/migrating-dcos-kubernetes-l4lb.json similarity index 97% rename from _next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/migrating-dcos-kubernetes-l4lb.json rename to _next/data/tJlUn5_CjNiSTMoSsoO6j/blog/migrating-dcos-kubernetes-l4lb.json index e6fc80ac8..badf5aff3 100644 --- a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/migrating-dcos-kubernetes-l4lb.json +++ b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/migrating-dcos-kubernetes-l4lb.json @@ -1 +1 @@ -{"pageProps":{"post":{"content":"\nIn October 2020 D2IQ [announced](https://d2iq.com/blog/d2iq-takes-the-next-step-forward) that they are moving onwards with their Kubernetes offering. Vandebron has been a D2IQ customer for their DCOS offering, we were just in the middle of a migration of our first workloads to DCOS Enterprise. We have evaluated the D2IQ K8s offering and decided to go for another Kubernetes product. We had a few migrations over the years, we migrated from Azure to AWS, we migrated workloads from normal instances to spot instances and all these migrations were done with nearly any downtime. We plan to reduce the downtime to a couple of minutes this migration and this is a real challenge. The first challenge that we will discuss today: We want to pair our Kubernetes clusters to the DCOS/Mesos clusters, while we move a workload it should be able to connect to its dependencies in the DCOS cluster. We use DCOS for our NoSQL databases like Cassandra, internal data that we want to keep internal. Pairing DCOS and Kubernetes clusters enable us to reduce downtime, enabling us to switch back if we run into issues and move faster because it reduces complexity.\n\n## L4LB\n\nThe internal layer 4 load balancer DCOS provides is used in the majority of our workloads. When our data scientists schedule a spark driver, they connect to the spark dispatcher through the Layer 4 load balancer. Most of the DCOS frameworks use this Layer 4 load balancer as an internal service discovery tool, with Vandebron we use this layer 4 load balancer to communicate between services. In a default DCOS set up this load balancer responds on domain names like: `spark-dispatcher.marathon.l4lb.thisdcos.directory:7077`\n\nWhen we ping the spark dispatcher we get the following:\n\n```bash\nPING spark-dispatcher.marathon.l4lb.thisdcos.directory (11.155.161.35) 56(84) bytes of data.\n64 bytes from 11.155.161.35 (11.155.161.35): icmp_seq=1 ttl=64 time=0.024 ms\n```\n\nAfter some investigation we found out that this IP range is not actually on a network interface, it is a Linux kernel functionality called `IPVS`. With IPVS you can do layer 4 load balancing, you provide the target location and the location you want to respond on.\n\nWhen we search for the IP from the spark dispatcher with ipvsadm, we get 3 results:\n\n```bash\nsudo ipvsadm -L -n |grep --color '11.155.161.35\\|$'\nTCP 11.155.161.35:80 wlc\n -> 10.2.7.146:16827 Masq 1 0 0\nTCP 11.155.161.35:4040 wlc\n -> 10.2.7.146:16826 Masq 1 0 0\nTCP 11.155.161.35:7077 wlc\n -> 10.2.7.146:16825 Masq 1 0 0\n````\n\nAs you can see the IP `11.155.161.35` points towards `10.2.7.146`, even the ports are configured and forwarded. We can add our route with ipvsadm, to understand IPVS a bit better. For example:\n\n```bash\nsudo ipvsadm -A -t 1.2.3.4:80 -s wlc # we add the target server and assign the scheduler\nsudo ipvsadm -a -r 10.2.7.146:16825 -t 1.2.3.4:80 -m # we configure the real server and target server and configure Masquerading\ncurl 1.2.3.4:80\n{\n \"action\" : \"ErrorResponse\",\n \"message\" : \"Missing protocol version. Please submit requests through http://[host]:[port]/v1/submissions/...\",\n \"serverSparkVersion\" : \"2.3.4\"\n}\n```\n\nThis results in that the spark dispatcher now also is available on `1.2.3.4:80`. As mentioned before we wanted to connect our DCOS and Kubernetes clusters, getting hundreds of entries from ipvsadm and manually adding them one by one didn’t sound appealing to us. Especially if you consider that sometimes services fail and run on a different port or different host after recovery, maintaining this by hand would be a nightmare. We therefore decided to build a tool to sync IPVS entries from DCOS to Kubernetes.\n\n## Stack\n\nWithin Vandebron we have our tech stack, we strongly believe it is good to eat your own dog food. When possible and when our use cases are similar we use the same tools as our Developers use. The parts of the stack we will be using are:\n\n- AWS ELB in front of Traefik 1.7\n- DCOS\n- Kubernetes\n\nWithin our platform team, we use Golang as our scripting language. Golang gives us the ability to build binary files with all the required libraries in the binary, we don’t have to install any packages, we do not even need to install Golang on the machine the application will be running on.\n\nIn our DCOS cluster we use Traefik 1.7, this version of Traefik only forwards HTTP requests. We decided to use Traefik to expose a JSON endpoint so we can gather the IPVS information from this location.\n\n## ipvs-server\n\nWithin our DCOS cluster we will expose the IPVS information through a JSON endpoint. We have built a tool for this to expose this information in multiple ways. In the next section, we are going to discuss some of the concepts and choices we made, we won’t deep dive into Go specifics. We have provided the entire code for this project in the examples directory of our GitHub repo:\n\n\nFirst, let’s discuss the library we use: . This library in its essence translates to ipvsadm commands, it helped save us time to implement this ourselves. There are some gotcha’s, such as newlines are not filtered out from the output. We solved this by cleaning up some of the data.\n\nIn the `childChan` function we create a go channel that is responsible for polling `ipvsadm` every 10 seconds and stores the result in a couple of variables we use in our HTTP endpoints. IPVS is a Linux kernel functionality and should be highly performant, we do not want to trigger kernel panics when the server gets overloaded with requests. We expect that every 10 seconds gives us accurate enough results, we can always lower this interval to ensure faster results. We also added in this function the string manipulation to ensure all the newlines were gone in the JSON output. The newline gave issues when we tried to add the IPVS scheduler entries.\n\n```go\nfunc childChan(c chan bool) {\n fmt.Println(\"Starting time based IPVS Admin poll\")\n\n pollInterval := 10\n timerCh := time.Tick(time.Duration(pollInterval) * time.Second)\n // Time based loop to generate Global variable\n for range timerCh {\n select {\n // when shutdown is received we break\n case <-c:\n fmt.Println(\"Received shutdown, stopping timer\")\n break\n default:\n var err error\n listIpvs.Save()\n ipvsString = fmt.Sprintln(listIpvs.Services)\n\n res := &responseObject{\n Services: listIpvs.Services,\n }\n \n ipvsJSONbyte, err := json.Marshal(res)\n if err != nil {\n logToErr.Printf(\"ERROR: -- Marshal JSON -- %v\\n\", err)\n }\n \n ipvsString = string(ipvsJSONbyte)\n ipvsJSON = strings.Replace(ipvsString, `\\n`, ``, -1)\n if debug != false {\n logToOut.Println(\"DEBUG: -- ipvsJSON --\", ipvsJSON)\n }\n }\n }\n}\n```\n\nNext is the index handler, we set our headers correctly and print the result as we would receive through ipvsadm. The index is mainly for our platform engineers to debug and verify the output. Thanks to this overview we found much faster that there was a newline hidden in the scheduler output.\n\n```go\nfunc index() http.Handler {\n // Generating the Index\n return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\n // Only available when debug is on\n if debug != false {\n logToOut.Println(\"DEBUG: -- index --\", ipvsString)\n }\n \n if r.URL.Path != \"/\" {\n http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)\n return\n }\n w.Header().Set(\"Content-Type\", \"text/plain; charset=utf-8\")\n // Site security testers expect this header to be set\n w.Header().Set(\"X-Content-Type-Options\", \"nosniff\")\n w.WriteHeader(http.StatusOK)\n fmt.Fprintln(w, ipvsString)\n })\n}\n```\n\nThe JSON endpoint is what we use in the client communicate with the server. \n\n```go\nfunc jsonz() http.Handler {\n // Generating the Index\n return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\n // Only available when debug is on\n if debug != false {\n logToOut.Println(\"DEBUG: -- jsonz --\", ipvsJSON)\n }\n \n if r.URL.Path != \"/json\" {\n http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)\n return\n }\n w.Header().Set(\"Content-Type\", \"application/json; charset=utf-8\")\n // Site security testers expect this header to be set\n w.Header().Set(\"X-Content-Type-Options\", \"nosniff\")\n w.WriteHeader(http.StatusOK)\n fmt.Fprintln(w, ipvsJSON)\n })\n}\n```\n\nWe ask our Developers often to implement a basic health endpoint, in DCOS we use this to see if a service needs to be restarted. In our application we enable set the statusOK in the index or in the JSON endpoint.\n\n```go\nfunc healthz() http.Handler {\n // Generating the healthz endpoint\n return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n if atomic.LoadInt32(&healthy) == 1 {\n w.WriteHeader(http.StatusNoContent)\n return\n }\n w.WriteHeader(http.StatusServiceUnavailable)\n })\n}\n```\n\nIn our logging and tracing functions we want to register the clients that are connecting, this gives us information where calls are coming from. It helps us debugging if we see weird behaviour.\n\n```go\nfunc tracing(nextRequestID func() string) func(http.Handler) http.Handler {\n // Tracing the http requests so its easier to check if server is reached\n return func(next http.Handler) http.Handler {\n return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n requestID := r.Header.Get(\"X-Request-Id\")\n if requestID == \"\" {\n requestID = nextRequestID()\n }\n ctx := context.WithValue(r.Context(), requestIDKey, requestID)\n w.Header().Set(\"X-Request-Id\", requestID)\n next.ServeHTTP(w, r.WithContext(ctx))\n })\n }\n}\n\nfunc logging(logToOut *log.Logger) func(http.Handler) http.Handler {\n // Creating logging entry tracing the http requests\n return func(next http.Handler) http.Handler {\n return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n defer func() {\n requestID, ok := r.Context().Value(requestIDKey).(string)\n if !ok {\n requestID = \"unknown\"\n }\n logToOut.Println(requestID, r.Method, r.URL.Path, r.RemoteAddr, r.UserAgent())\n }()\n next.ServeHTTP(w, r)\n })\n }\n}\n```\n\nIPVS needs to be executed with root privileges, to ensure this is correct we get the userid and print it when starting the server.\n\n```go\n// getProcessOwner function is to see who is running the process. It needs to be a sudo / root user\nfunc getProcessOwner() string {\n stdout, err := exec.Command(\"ps\", \"-o\", \"user=\", \"-p\", strconv.Itoa(os.Getpid())).Output()\n if err != nil {\n logToErr.Printf(\"ERROR: -- getProcessOwner -- %v\\n\", err)\n os.Exit(1)\n }\n return string(stdout)\n}\n```\n\nWe added the init function to ensure we print results the moment the server starts up, if we would not do this it would take 10 seconds for the go channel to activate\n\n```go\nfunc init() {\n // Placing the Save and val in the init, else we will need to wait for channel to perform its first run\n listIpvs.Save()\n ipvsString = fmt.Sprintln(listIpvs.Services)\n}\n```\n\nIn the main function, we set the configurable flags, such as debugging to show error messages. It proved useful during the creation of this tool to keep track and print output. If we would print the output at every call to our logs, our Elastic cluster would get thousands of logs that add little to no value.\n\nWe configure the listen port in the flags, we can use the portIndex from DCOS to assign a random port on the host to listen on. We also provided to print the version we are running. In our versioning, we use a constant to list the application semver version, we also provide the git-commit hash.\nWhen we begin the server we print the version information, the port we listen on and the user running the process. We then start the server process with the go channel, in setting up the go channel we ensure that when the server stops we try to gracefully stop the server within a 30-second timeframe. Since our ipvsadm timer is 10 seconds it should be able to cleanly shutdown within that period.\n\n### Docker build\n\nIn the repository, we have included a Dockerfile and a script to build the Dockerfile. In this Dockerfile, we pass the git commit hash to the go install. This way we always get the Git Hash from our GitHub repo and we can use this information in our version output.\n\n### DCOS service.json\n\nIn the repository, we have provided the service.json file, since it is opinionated on using Traefik you might need to change it. But in this service.json you see how we set up Traefik, the health check, and port index. Since the Mesos UCR container has fewer abstractions and has fewer limited capabilities. We can run the IPVS server inside a UCR container and get all the output as if we were running this directly as root on the host machine.\n\n## ipvs-client\n\nThe IPVS client is the component we use in the Kubernetes environment. The client connects to the server and gets the IPVS entries from the IPVS server inside our DCOS cluster. It then adds these IPVS entries to each node in the Kubernetes cluster. You, therefore, need to run each client per Kubernetes node.\n\nYou can find the code from the IPVS client in our repository.\n\n```go\nfunc httpGet(remoteURL string) []byte {\n if debug != false {\n _, err := url.ParseRequestURI(remoteURL)\n if err != nil {\n panic(err)\n }\n }\n\n req, err := http.NewRequest(http.MethodGet, remoteURL, nil)\n if err != nil {\n logToErr.Fatalf(\"ERROR: -- new HTTP request -- %v\", err)\n }\n\n ipvsClient := http.Client{\n Timeout: time.Second * 2, // Timeout after 2 seconds\n }\n req.Header.Set(\"User-Agent\", \"go-ipvs-get \\tversion: \"+version+\"\\t Git Commit: \"+gitCommit)\n res, err := ipvsClient.Do(req)\n if err != nil {\n logToErr.Fatalf(\"ERROR: -- ipvsClient -- %v\\n\", err)\n }\n\n if res.Body != nil {\n defer res.Body.Close()\n }\n\n body, readErr := ioutil.ReadAll(res.Body)\n if readErr != nil {\n logToErr.Fatalf(\"ERROR: -- body -- %v\\n\", readErr)\n }\n\n return body\n}\n```\n\nIn the httpGet function we can debug the URL and check if it is valid. Again we set the correct headers and retrieve the JSON body.\n\n```go\nfunc unmarshal(body []byte) []lvs.Service {\n\n res := &responseObject{\n Services: listIpvs.Services,\n }\n\n jsonErr := json.Unmarshal(body, &res)\n if jsonErr != nil {\n logToErr.Fatalf(\"ERROR: -- Unmarshal -- %v \\n\", jsonErr)\n }\n\n if debug != false {\n logToOut.Fatalf(\"DEBUG: -- res -- %v \\n\", res.Services)\n }\n\n r := res.Services\n\n return r\n}\n```\n\nIn the unmarshal function we unmarshal the JSON and turn it in a slice of lvs.Service.\n\n```go\nfunc addServers(remoteAddr string) {\n body := httpGet(remoteAddr)\n jsonData := unmarshal(body)\n\n for i, v := range jsonData {\n if debug != false {\n logToOut.Printf(\"DEBUG: -- range jsonDATA --\\n\")\n logToOut.Printf(\"ipvsCount=%v, value=%v\", i, v)\n }\n\n err := lvs.DefaultIpvs.AddService(v)\n if err != nil {\n logToErr.Printf(\"ERROR: -- AddService -- %v\", err)\n }\n \n i++\n ipvsServerCount = float64(i)\n }\n}\n```\n\nIn the addServers function we add the servers to IPVS.\n\n```go\nfunc clientChan(c chan bool) {\n logToOut.Println(\"Starting time based IPVS Admin add\")\n\n pollInterval := 10\n timerCh := time.Tick(time.Duration(pollInterval) * time.Second)\n // Time based loop to generate Global variable\n for range timerCh {\n select {\n // when shutdown is received we break\n case <-c:\n logToOut.Println(\"Received shutdown, stopping timer\")\n break\n default:\n\n logToOut.Println(\"Clearing & Adding servers...\")\n // Before we add Servers we need to clear the existing list\n lvs.Clear()\n addServers(remoteAddr)\n if debug != false {\n logToOut.Printf(\"IPVS servers added:\\t%v\", ipvsServerCount)\n }\n }\n }\n}\n```\n\nLike we did in the IPVS server we create a go channel to poll every 10 seconds the server endpoint. We perform this to get at a set interval the IPVS entries.\n\nSince we run the IPVS client as a binary directly on the Kubernetes hosts we build the binary with a few parameters we pass to the go build command. The binary we build with this command we host on an internal s3 bucket, we can download this binary with systemd unit files.\n\n```bash\nGOOS=linux\nGOARCH=amd64\nGIT_COMMIT=$(git rev-list -1 HEAD)\n\nexport GOOS\nexport GOARCH\nexport GIT_COMMIT\n\nenv GOOS=${GOOS} GOARCH=${GOARCH} go build -v -ldflags \"-X main.gitCommit=${GIT_COMMIT}\" .\n```\n\nWhen we run the IPVS client we can verify if the IPVS routes are added by running the `ipvsadm -L -n` command.\n\n### Unit files\n\nSince IPVS is part of the Linux kernel it is hard to deploy this in a docker container, the capabilities are more restricted in Kubernetes. We decided to deploy the IPVS client on each host machine through a systemd unit file, the main reason was that we ran into restrictions that slowed us down and this is not a permanent solution. By adding the IPVS client on the machines alone does not make it possible for containers to use the IPVS routes. We needed to add NET_ADMIN capabilities to all containers using the l4lb loadbalancer locations and configure `hostNetworking: true` in the Kubernetes pods.\n\nWe provided a deployment.yml file that runs a Ubuntu docker container with ipvsadm only installed extra. When the pods are deployed in this deployment you can use kubectl exec to get into the pod and run the `ipvsadm -L -n` command.\n\n## Vacancy at Vandebron\n\nWe are looking for a platform engineer in Vandebron. As you can understand this is not a typical scenario we daily run across, but it is part of the workloads that we will support when working on our platform. Within Vandebron we try to use the best technology available, when it is not available we build it. Due to this as platform engineers, we have many interesting challenges and offer engineers to support further than only a strict domain. We support all components of our entire platform, regardless if it is a Linux kernel issue like this, involves setting up and maintaining a NoSQL cluster, or helping the business with something like requesting a certificate.\n\nIf you are interested in learning more about this position, take a look at our Vacancy and get in contact with us.\n\n","meta":{"title":"Migrating from DCOS to Kubernetes, dealing with the l4lb loadbalancer","description":"When you want minimal downtime, you need to build your own tools","createdAt":"Fri Mar 05 2021 01:00:00 GMT+0100 (GMT+01:00)","coverImage":"images/migrating-dcos-kubernetes-l4lb.jpg","imageSource":"https://pixabay.com/users/praesentator-4372890/","tags":"Kubernetes, k8s, mesos, l4lb, ipvs, ipvsadm","author":"Rogier Dikkes","slug":"blog/migrating-dcos-kubernetes-l4lb","formattedDate":"5 maart 2021","date":"Fri Mar 05 2021 01:00:00 GMT+0100 (GMT+01:00)"}}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"post":{"content":"\nIn October 2020 D2IQ [announced](https://d2iq.com/blog/d2iq-takes-the-next-step-forward) that they are moving onwards with their Kubernetes offering. Vandebron has been a D2IQ customer for their DCOS offering, we were just in the middle of a migration of our first workloads to DCOS Enterprise. We have evaluated the D2IQ K8s offering and decided to go for another Kubernetes product. We had a few migrations over the years, we migrated from Azure to AWS, we migrated workloads from normal instances to spot instances and all these migrations were done with nearly any downtime. We plan to reduce the downtime to a couple of minutes this migration and this is a real challenge. The first challenge that we will discuss today: We want to pair our Kubernetes clusters to the DCOS/Mesos clusters, while we move a workload it should be able to connect to its dependencies in the DCOS cluster. We use DCOS for our NoSQL databases like Cassandra, internal data that we want to keep internal. Pairing DCOS and Kubernetes clusters enable us to reduce downtime, enabling us to switch back if we run into issues and move faster because it reduces complexity.\n\n## L4LB\n\nThe internal layer 4 load balancer DCOS provides is used in the majority of our workloads. When our data scientists schedule a spark driver, they connect to the spark dispatcher through the Layer 4 load balancer. Most of the DCOS frameworks use this Layer 4 load balancer as an internal service discovery tool, with Vandebron we use this layer 4 load balancer to communicate between services. In a default DCOS set up this load balancer responds on domain names like: `spark-dispatcher.marathon.l4lb.thisdcos.directory:7077`\n\nWhen we ping the spark dispatcher we get the following:\n\n```bash\nPING spark-dispatcher.marathon.l4lb.thisdcos.directory (11.155.161.35) 56(84) bytes of data.\n64 bytes from 11.155.161.35 (11.155.161.35): icmp_seq=1 ttl=64 time=0.024 ms\n```\n\nAfter some investigation we found out that this IP range is not actually on a network interface, it is a Linux kernel functionality called `IPVS`. With IPVS you can do layer 4 load balancing, you provide the target location and the location you want to respond on.\n\nWhen we search for the IP from the spark dispatcher with ipvsadm, we get 3 results:\n\n```bash\nsudo ipvsadm -L -n |grep --color '11.155.161.35\\|$'\nTCP 11.155.161.35:80 wlc\n -> 10.2.7.146:16827 Masq 1 0 0\nTCP 11.155.161.35:4040 wlc\n -> 10.2.7.146:16826 Masq 1 0 0\nTCP 11.155.161.35:7077 wlc\n -> 10.2.7.146:16825 Masq 1 0 0\n````\n\nAs you can see the IP `11.155.161.35` points towards `10.2.7.146`, even the ports are configured and forwarded. We can add our route with ipvsadm, to understand IPVS a bit better. For example:\n\n```bash\nsudo ipvsadm -A -t 1.2.3.4:80 -s wlc # we add the target server and assign the scheduler\nsudo ipvsadm -a -r 10.2.7.146:16825 -t 1.2.3.4:80 -m # we configure the real server and target server and configure Masquerading\ncurl 1.2.3.4:80\n{\n \"action\" : \"ErrorResponse\",\n \"message\" : \"Missing protocol version. Please submit requests through http://[host]:[port]/v1/submissions/...\",\n \"serverSparkVersion\" : \"2.3.4\"\n}\n```\n\nThis results in that the spark dispatcher now also is available on `1.2.3.4:80`. As mentioned before we wanted to connect our DCOS and Kubernetes clusters, getting hundreds of entries from ipvsadm and manually adding them one by one didn’t sound appealing to us. Especially if you consider that sometimes services fail and run on a different port or different host after recovery, maintaining this by hand would be a nightmare. We therefore decided to build a tool to sync IPVS entries from DCOS to Kubernetes.\n\n## Stack\n\nWithin Vandebron we have our tech stack, we strongly believe it is good to eat your own dog food. When possible and when our use cases are similar we use the same tools as our Developers use. The parts of the stack we will be using are:\n\n- AWS ELB in front of Traefik 1.7\n- DCOS\n- Kubernetes\n\nWithin our platform team, we use Golang as our scripting language. Golang gives us the ability to build binary files with all the required libraries in the binary, we don’t have to install any packages, we do not even need to install Golang on the machine the application will be running on.\n\nIn our DCOS cluster we use Traefik 1.7, this version of Traefik only forwards HTTP requests. We decided to use Traefik to expose a JSON endpoint so we can gather the IPVS information from this location.\n\n## ipvs-server\n\nWithin our DCOS cluster we will expose the IPVS information through a JSON endpoint. We have built a tool for this to expose this information in multiple ways. In the next section, we are going to discuss some of the concepts and choices we made, we won’t deep dive into Go specifics. We have provided the entire code for this project in the examples directory of our GitHub repo:\n\n\nFirst, let’s discuss the library we use: . This library in its essence translates to ipvsadm commands, it helped save us time to implement this ourselves. There are some gotcha’s, such as newlines are not filtered out from the output. We solved this by cleaning up some of the data.\n\nIn the `childChan` function we create a go channel that is responsible for polling `ipvsadm` every 10 seconds and stores the result in a couple of variables we use in our HTTP endpoints. IPVS is a Linux kernel functionality and should be highly performant, we do not want to trigger kernel panics when the server gets overloaded with requests. We expect that every 10 seconds gives us accurate enough results, we can always lower this interval to ensure faster results. We also added in this function the string manipulation to ensure all the newlines were gone in the JSON output. The newline gave issues when we tried to add the IPVS scheduler entries.\n\n```go\nfunc childChan(c chan bool) {\n fmt.Println(\"Starting time based IPVS Admin poll\")\n\n pollInterval := 10\n timerCh := time.Tick(time.Duration(pollInterval) * time.Second)\n // Time based loop to generate Global variable\n for range timerCh {\n select {\n // when shutdown is received we break\n case <-c:\n fmt.Println(\"Received shutdown, stopping timer\")\n break\n default:\n var err error\n listIpvs.Save()\n ipvsString = fmt.Sprintln(listIpvs.Services)\n\n res := &responseObject{\n Services: listIpvs.Services,\n }\n \n ipvsJSONbyte, err := json.Marshal(res)\n if err != nil {\n logToErr.Printf(\"ERROR: -- Marshal JSON -- %v\\n\", err)\n }\n \n ipvsString = string(ipvsJSONbyte)\n ipvsJSON = strings.Replace(ipvsString, `\\n`, ``, -1)\n if debug != false {\n logToOut.Println(\"DEBUG: -- ipvsJSON --\", ipvsJSON)\n }\n }\n }\n}\n```\n\nNext is the index handler, we set our headers correctly and print the result as we would receive through ipvsadm. The index is mainly for our platform engineers to debug and verify the output. Thanks to this overview we found much faster that there was a newline hidden in the scheduler output.\n\n```go\nfunc index() http.Handler {\n // Generating the Index\n return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\n // Only available when debug is on\n if debug != false {\n logToOut.Println(\"DEBUG: -- index --\", ipvsString)\n }\n \n if r.URL.Path != \"/\" {\n http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)\n return\n }\n w.Header().Set(\"Content-Type\", \"text/plain; charset=utf-8\")\n // Site security testers expect this header to be set\n w.Header().Set(\"X-Content-Type-Options\", \"nosniff\")\n w.WriteHeader(http.StatusOK)\n fmt.Fprintln(w, ipvsString)\n })\n}\n```\n\nThe JSON endpoint is what we use in the client communicate with the server. \n\n```go\nfunc jsonz() http.Handler {\n // Generating the Index\n return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\n // Only available when debug is on\n if debug != false {\n logToOut.Println(\"DEBUG: -- jsonz --\", ipvsJSON)\n }\n \n if r.URL.Path != \"/json\" {\n http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)\n return\n }\n w.Header().Set(\"Content-Type\", \"application/json; charset=utf-8\")\n // Site security testers expect this header to be set\n w.Header().Set(\"X-Content-Type-Options\", \"nosniff\")\n w.WriteHeader(http.StatusOK)\n fmt.Fprintln(w, ipvsJSON)\n })\n}\n```\n\nWe ask our Developers often to implement a basic health endpoint, in DCOS we use this to see if a service needs to be restarted. In our application we enable set the statusOK in the index or in the JSON endpoint.\n\n```go\nfunc healthz() http.Handler {\n // Generating the healthz endpoint\n return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n if atomic.LoadInt32(&healthy) == 1 {\n w.WriteHeader(http.StatusNoContent)\n return\n }\n w.WriteHeader(http.StatusServiceUnavailable)\n })\n}\n```\n\nIn our logging and tracing functions we want to register the clients that are connecting, this gives us information where calls are coming from. It helps us debugging if we see weird behaviour.\n\n```go\nfunc tracing(nextRequestID func() string) func(http.Handler) http.Handler {\n // Tracing the http requests so its easier to check if server is reached\n return func(next http.Handler) http.Handler {\n return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n requestID := r.Header.Get(\"X-Request-Id\")\n if requestID == \"\" {\n requestID = nextRequestID()\n }\n ctx := context.WithValue(r.Context(), requestIDKey, requestID)\n w.Header().Set(\"X-Request-Id\", requestID)\n next.ServeHTTP(w, r.WithContext(ctx))\n })\n }\n}\n\nfunc logging(logToOut *log.Logger) func(http.Handler) http.Handler {\n // Creating logging entry tracing the http requests\n return func(next http.Handler) http.Handler {\n return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n defer func() {\n requestID, ok := r.Context().Value(requestIDKey).(string)\n if !ok {\n requestID = \"unknown\"\n }\n logToOut.Println(requestID, r.Method, r.URL.Path, r.RemoteAddr, r.UserAgent())\n }()\n next.ServeHTTP(w, r)\n })\n }\n}\n```\n\nIPVS needs to be executed with root privileges, to ensure this is correct we get the userid and print it when starting the server.\n\n```go\n// getProcessOwner function is to see who is running the process. It needs to be a sudo / root user\nfunc getProcessOwner() string {\n stdout, err := exec.Command(\"ps\", \"-o\", \"user=\", \"-p\", strconv.Itoa(os.Getpid())).Output()\n if err != nil {\n logToErr.Printf(\"ERROR: -- getProcessOwner -- %v\\n\", err)\n os.Exit(1)\n }\n return string(stdout)\n}\n```\n\nWe added the init function to ensure we print results the moment the server starts up, if we would not do this it would take 10 seconds for the go channel to activate\n\n```go\nfunc init() {\n // Placing the Save and val in the init, else we will need to wait for channel to perform its first run\n listIpvs.Save()\n ipvsString = fmt.Sprintln(listIpvs.Services)\n}\n```\n\nIn the main function, we set the configurable flags, such as debugging to show error messages. It proved useful during the creation of this tool to keep track and print output. If we would print the output at every call to our logs, our Elastic cluster would get thousands of logs that add little to no value.\n\nWe configure the listen port in the flags, we can use the portIndex from DCOS to assign a random port on the host to listen on. We also provided to print the version we are running. In our versioning, we use a constant to list the application semver version, we also provide the git-commit hash.\nWhen we begin the server we print the version information, the port we listen on and the user running the process. We then start the server process with the go channel, in setting up the go channel we ensure that when the server stops we try to gracefully stop the server within a 30-second timeframe. Since our ipvsadm timer is 10 seconds it should be able to cleanly shutdown within that period.\n\n### Docker build\n\nIn the repository, we have included a Dockerfile and a script to build the Dockerfile. In this Dockerfile, we pass the git commit hash to the go install. This way we always get the Git Hash from our GitHub repo and we can use this information in our version output.\n\n### DCOS service.json\n\nIn the repository, we have provided the service.json file, since it is opinionated on using Traefik you might need to change it. But in this service.json you see how we set up Traefik, the health check, and port index. Since the Mesos UCR container has fewer abstractions and has fewer limited capabilities. We can run the IPVS server inside a UCR container and get all the output as if we were running this directly as root on the host machine.\n\n## ipvs-client\n\nThe IPVS client is the component we use in the Kubernetes environment. The client connects to the server and gets the IPVS entries from the IPVS server inside our DCOS cluster. It then adds these IPVS entries to each node in the Kubernetes cluster. You, therefore, need to run each client per Kubernetes node.\n\nYou can find the code from the IPVS client in our repository.\n\n```go\nfunc httpGet(remoteURL string) []byte {\n if debug != false {\n _, err := url.ParseRequestURI(remoteURL)\n if err != nil {\n panic(err)\n }\n }\n\n req, err := http.NewRequest(http.MethodGet, remoteURL, nil)\n if err != nil {\n logToErr.Fatalf(\"ERROR: -- new HTTP request -- %v\", err)\n }\n\n ipvsClient := http.Client{\n Timeout: time.Second * 2, // Timeout after 2 seconds\n }\n req.Header.Set(\"User-Agent\", \"go-ipvs-get \\tversion: \"+version+\"\\t Git Commit: \"+gitCommit)\n res, err := ipvsClient.Do(req)\n if err != nil {\n logToErr.Fatalf(\"ERROR: -- ipvsClient -- %v\\n\", err)\n }\n\n if res.Body != nil {\n defer res.Body.Close()\n }\n\n body, readErr := ioutil.ReadAll(res.Body)\n if readErr != nil {\n logToErr.Fatalf(\"ERROR: -- body -- %v\\n\", readErr)\n }\n\n return body\n}\n```\n\nIn the httpGet function we can debug the URL and check if it is valid. Again we set the correct headers and retrieve the JSON body.\n\n```go\nfunc unmarshal(body []byte) []lvs.Service {\n\n res := &responseObject{\n Services: listIpvs.Services,\n }\n\n jsonErr := json.Unmarshal(body, &res)\n if jsonErr != nil {\n logToErr.Fatalf(\"ERROR: -- Unmarshal -- %v \\n\", jsonErr)\n }\n\n if debug != false {\n logToOut.Fatalf(\"DEBUG: -- res -- %v \\n\", res.Services)\n }\n\n r := res.Services\n\n return r\n}\n```\n\nIn the unmarshal function we unmarshal the JSON and turn it in a slice of lvs.Service.\n\n```go\nfunc addServers(remoteAddr string) {\n body := httpGet(remoteAddr)\n jsonData := unmarshal(body)\n\n for i, v := range jsonData {\n if debug != false {\n logToOut.Printf(\"DEBUG: -- range jsonDATA --\\n\")\n logToOut.Printf(\"ipvsCount=%v, value=%v\", i, v)\n }\n\n err := lvs.DefaultIpvs.AddService(v)\n if err != nil {\n logToErr.Printf(\"ERROR: -- AddService -- %v\", err)\n }\n \n i++\n ipvsServerCount = float64(i)\n }\n}\n```\n\nIn the addServers function we add the servers to IPVS.\n\n```go\nfunc clientChan(c chan bool) {\n logToOut.Println(\"Starting time based IPVS Admin add\")\n\n pollInterval := 10\n timerCh := time.Tick(time.Duration(pollInterval) * time.Second)\n // Time based loop to generate Global variable\n for range timerCh {\n select {\n // when shutdown is received we break\n case <-c:\n logToOut.Println(\"Received shutdown, stopping timer\")\n break\n default:\n\n logToOut.Println(\"Clearing & Adding servers...\")\n // Before we add Servers we need to clear the existing list\n lvs.Clear()\n addServers(remoteAddr)\n if debug != false {\n logToOut.Printf(\"IPVS servers added:\\t%v\", ipvsServerCount)\n }\n }\n }\n}\n```\n\nLike we did in the IPVS server we create a go channel to poll every 10 seconds the server endpoint. We perform this to get at a set interval the IPVS entries.\n\nSince we run the IPVS client as a binary directly on the Kubernetes hosts we build the binary with a few parameters we pass to the go build command. The binary we build with this command we host on an internal s3 bucket, we can download this binary with systemd unit files.\n\n```bash\nGOOS=linux\nGOARCH=amd64\nGIT_COMMIT=$(git rev-list -1 HEAD)\n\nexport GOOS\nexport GOARCH\nexport GIT_COMMIT\n\nenv GOOS=${GOOS} GOARCH=${GOARCH} go build -v -ldflags \"-X main.gitCommit=${GIT_COMMIT}\" .\n```\n\nWhen we run the IPVS client we can verify if the IPVS routes are added by running the `ipvsadm -L -n` command.\n\n### Unit files\n\nSince IPVS is part of the Linux kernel it is hard to deploy this in a docker container, the capabilities are more restricted in Kubernetes. We decided to deploy the IPVS client on each host machine through a systemd unit file, the main reason was that we ran into restrictions that slowed us down and this is not a permanent solution. By adding the IPVS client on the machines alone does not make it possible for containers to use the IPVS routes. We needed to add NET_ADMIN capabilities to all containers using the l4lb loadbalancer locations and configure `hostNetworking: true` in the Kubernetes pods.\n\nWe provided a deployment.yml file that runs a Ubuntu docker container with ipvsadm only installed extra. When the pods are deployed in this deployment you can use kubectl exec to get into the pod and run the `ipvsadm -L -n` command.\n\n## Vacancy at Vandebron\n\nWe are looking for a platform engineer in Vandebron. As you can understand this is not a typical scenario we daily run across, but it is part of the workloads that we will support when working on our platform. Within Vandebron we try to use the best technology available, when it is not available we build it. Due to this as platform engineers, we have many interesting challenges and offer engineers to support further than only a strict domain. We support all components of our entire platform, regardless if it is a Linux kernel issue like this, involves setting up and maintaining a NoSQL cluster, or helping the business with something like requesting a certificate.\n\nIf you are interested in learning more about this position, take a look at our Vacancy and get in contact with us.\n\n","meta":{"title":"Migrating from DCOS to Kubernetes, dealing with the l4lb loadbalancer","description":"When you want minimal downtime, you need to build your own tools","createdAt":"Fri Mar 05 2021 01:00:00 GMT+0100 (Central European Standard Time)","coverImage":"images/migrating-dcos-kubernetes-l4lb.jpg","imageSource":"https://pixabay.com/users/praesentator-4372890/","tags":"Kubernetes, k8s, mesos, l4lb, ipvs, ipvsadm","author":"Rogier Dikkes","slug":"blog/migrating-dcos-kubernetes-l4lb","formattedDate":"5 maart 2021","date":"Fri Mar 05 2021 01:00:00 GMT+0100 (Central European Standard Time)"}}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/optimizing-converting-and-exporting-svg-icons-in-react.json b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/optimizing-converting-and-exporting-svg-icons-in-react.json similarity index 96% rename from _next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/optimizing-converting-and-exporting-svg-icons-in-react.json rename to _next/data/tJlUn5_CjNiSTMoSsoO6j/blog/optimizing-converting-and-exporting-svg-icons-in-react.json index 420e61522..c7770062d 100644 --- a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/optimizing-converting-and-exporting-svg-icons-in-react.json +++ b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/optimizing-converting-and-exporting-svg-icons-in-react.json @@ -1 +1 @@ -{"pageProps":{"post":{"content":"\nAt Vandebron we're maintaining a component library called [Windmolen](https://windmolen.netlify.app/) (Dutch for \"wind turbine\"). And if you've ever built a component library, you probably dealt with optimizing and converting icons before. With SVGO and SVGR you can do this at scale, without compromising the quality or size of your icons.\n\n## The problem\n\nThe web is full of icons, and often these icons are rendered from SVG files to ensure you can increase (or decrease) the size of the icons depending on the use case. Designers often create these icons from design tools like Adobe Photoshop or Sketch. Although these icons might look pretty, exporting a SVG out of these tools is often difficult as [this article](https://medium.com/sketch-app-sources/the-best-way-to-export-an-svg-from-sketch-dd8c66bb6ef2) explains. Also, added lot of code in the form of metadata is added to the SVG file. Let's have a look at what a typical SVG file exported out of Sketch looks like:\n\n```svg\n\n\n\n \n last\n Created with Sketch.\n \n \n \n \n \n \n\n```\n\nThe SVG file above holds a lot of information about Sketch, such as the `title` of the icon and a `desc`ription. Next to that, there's a lot of elements that could be combined into one element to reduce the file size.\n\n## Optimizing SVGs\n\nWhat's cool about SVG files is that you can optimize and minify them, without affecting what the SVG looks like. This is something you can try out yourself using the website [SVGOMG](https://jakearchibald.github.io/svgomg/), which is powered by the library SVGO that you'll learn more about later.\n\n\nYou can optimize the SVG file above by following these steps:\n\n1. Go to [https://jakearchibald.github.io/svgomg/](https://jakearchibald.github.io/svgomg/)\n2. Click on `Paste markup` an paste the SVG code that you exported from Sketch (a.k.a. the SVG file above)\n3. You will see the icon rendered, now you have to either click at the `Copy as a text` or `Download` button to get the optimized SVG file\n\nWith these simple steps you've optimized the SVG from over 450 bytes, which is already small, to 173 bytes (a decrease of over 62%!). If you'd open this file in the editor of your choice, you can see a lot of the useless (meta)data from the original file has been deleted. Also, the different elements of the SVG are combined in a single `path` that renders the icon:\n\n```svg\n\n\n \n\n```\n\nThis SVG can be even further optimized by checking the \"Prefer viewbox to width/height\" in SVGOMG, but let's save that for later when we use SVGO instead.\n\n## Using SVGO\n\nBy using SVGOMG you've already experienced what power [SVGO](https://github.com/svg/svgo) has, as SVGOMG is described by its creators as *\" SVGO's Missing GUI, aiming to expose the majority if not all the configuration options of SVGO\"*. Instead of using the GUI, you can also use SVGO directly from the command line as a CLI-tool or as a Node.js module. For the sake of this article, we'll be using it solely as CLI.\n\nSVGO can be installed globally on your machine, or locally in your project, from npm by running:\n\n```bash\nnpm i -g svgo\n\n# Yarn equivalent\nyarn add -G svgo\n```\n\nAfter doing this you can run `svgo` from the command line and optimize any SVG file instantly. But, you don't want to do this manually on your machine anytime you're adding a new icon to a project (or component library). Therefore, you can also add SVGO to a project locally and add a script to the `package.json` file to optimize all SVGs in a certain directory.\n\n```json\n// package.json\n{\n // ...\n \"scripts\": {\n // ...\n \"optimize-svg\": \"svgo --config=.svgo.yml -f ./src/assets/icons\"\n }\n}\n```\n\nThe `optimize-svg` script will run SVGO in the directory `src/assets/icons` and optimize all the SVG files based on the settings in `.svgo.yml`. This file is where you can configure the rules for SVGO, as the previously mentioned \"Prefer viewbox to width/height\":\n\n```yaml\n# .svgo.yml\nplugins:\n - removeViewBox: false\n - removeDimensions: true # this deletes width/height and adds it to the viewBox\n - removeDoctype: true\n - removeComments: true\n - removeMetadata: true\n - removeEditorsNSData: true\n - cleanupIDs: true\n - removeRasterImages: true\n - removeUselessDefs: true\n - removeUnknownsAndDefaults: true\n - removeUselessStrokeAndFill: true\n - removeHiddenElems: true\n - removeEmptyText: true\n - removeEmptyAttrs: true\n - removeEmptyContainers: true\n - removeUnusedNS: true\n - removeDesc: true\n - prefixIds: false\n - prefixClassNames: false\n```\n \nFrom the rules above you'll get an idea about all the redundant and useless lines of code that might be present in your SVG files. But luckily, they will all get removed when you run the command `npm run optimize-svg`.\n\n## Converting SVGs with SVGR\n\nYou've now learned how to optimize your SVG files, and are probably wondering how to use these files in a React application. To render an SVG in React, you need to either configure Webpack in a way that it knows how to deal with SVG files or use a library called SVGR. By default, any application created with `create-react-app` can render SVG files as a component, using the following `import` statement:\n\n```jsx\n// MyComponent.jsx\nimport React from 'react';\nimport { ReactComponent as MySVG } from './something.svg';\n\nconst MyComponent = () => {\n return (\n
\n \n
\n );\n}\nexport default MyComponent;\n```\n\nMore information about how this is done can be found in [this article](https://blog.logrocket.com/how-to-use-svgs-in-react/), but let me show you how to solve that with SVGR.\n\nWith [SVGR](https://react-svgr.com/) you can convert SVG files into React Components, either by adding it to Webpack or by using the SVGR CLI or Node.js module. In the same way, as we optimized the SVGs from the command line with SVGO, we can also convert these icons from the command line with SVGR:\n\n```json\n// package.json\n{\n // ...\n \"scripts\": {\n // ...\n \"optimize-svg\": \"svgo --config=.svgo.yml -f ./src/assets/icons\",\n \"convert-svg\": \"svgr -d ./src/components/Icon ./src/assets/icons\"\n }\n}\n```\n\nWhenever you run the command `npm run convert-svg` a JSX file will be created for every SVG file that's present in the directory `src/assets/icons`. These JSX files can be found in the directory `src/components/Icons`, together with an `index.js` file that exports all these components from this directory.\n\nAn example of such a converted SVG file is:\n\n\n```jsx\n// MySVG.jsx\nimport * as React from 'react';\n\nconst MySVG = (props) => (\n \n \n \n);\n\nexport default MySVG;\n```\n\nAnd, as we now have a directory filled with converted SVGs these can be imported into any React component like this:\n\n```jsx\n// MyComponent.jsx\nimport React from 'react';\nimport MySVG from './MySVG.jsx';\n\nconst MyComponent = () => {\n return (\n
\n \n
\n );\n}\nexport default MyComponent;\n```\n\nOften SVGR is used alongside SVGO, so you can even automatically optimize all SVGS that will be converted by SVGR. This is done by adding the flag `--no-svgo true` and point it towards your SVGO configuration file:\n\n```json\n// package.json\n{\n // ...\n \"scripts\": {\n // ...\n \"convert-svg\": \"svgr -d ./src/components/Icon ./src/assets/icons --no-svgo true --svgo-config .svgo.yml\"\n }\n}\n```\n\nBy running the `convert-svg` script you both optimize and convert all the SVG files in `src/assets/icons` to React components based on optimized SVGs.\n\n## Reading further\n\nThe examples in this post are the tip of the metaphorical iceberg on what problems SVGO and SVGR can solve. There are many other features you can enable, such as using them as Node.js modules or enabling TypeScript support. To read further make sure to have a look at the SVGR [playground](https://react-svgr.com/playground/) or [documentation](https://react-svgr.com/docs/getting-started/).\n","meta":{"title":"Optimizing, Converting And Exporting SVG Icons In React","description":"If you've ever build a component library, you probably dealt with optimizing and converting icons before. With SVGO and SVGR you can do this at scale.","createdAt":"Thu Dec 10 2020 01:00:00 GMT+0100 (GMT+01:00)","coverImage":"images/optimizing-converting-and-exporting-svg-icons-in-react.jpg","tags":"React, component library","author":"Roy Derks","slug":"blog/optimizing-converting-and-exporting-svg-icons-in-react","formattedDate":"10 december 2020","date":"Thu Dec 10 2020 01:00:00 GMT+0100 (GMT+01:00)"}}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"post":{"content":"\nAt Vandebron we're maintaining a component library called [Windmolen](https://windmolen.netlify.app/) (Dutch for \"wind turbine\"). And if you've ever built a component library, you probably dealt with optimizing and converting icons before. With SVGO and SVGR you can do this at scale, without compromising the quality or size of your icons.\n\n## The problem\n\nThe web is full of icons, and often these icons are rendered from SVG files to ensure you can increase (or decrease) the size of the icons depending on the use case. Designers often create these icons from design tools like Adobe Photoshop or Sketch. Although these icons might look pretty, exporting a SVG out of these tools is often difficult as [this article](https://medium.com/sketch-app-sources/the-best-way-to-export-an-svg-from-sketch-dd8c66bb6ef2) explains. Also, added lot of code in the form of metadata is added to the SVG file. Let's have a look at what a typical SVG file exported out of Sketch looks like:\n\n```svg\n\n\n\n \n last\n Created with Sketch.\n \n \n \n \n \n \n\n```\n\nThe SVG file above holds a lot of information about Sketch, such as the `title` of the icon and a `desc`ription. Next to that, there's a lot of elements that could be combined into one element to reduce the file size.\n\n## Optimizing SVGs\n\nWhat's cool about SVG files is that you can optimize and minify them, without affecting what the SVG looks like. This is something you can try out yourself using the website [SVGOMG](https://jakearchibald.github.io/svgomg/), which is powered by the library SVGO that you'll learn more about later.\n\n\nYou can optimize the SVG file above by following these steps:\n\n1. Go to [https://jakearchibald.github.io/svgomg/](https://jakearchibald.github.io/svgomg/)\n2. Click on `Paste markup` an paste the SVG code that you exported from Sketch (a.k.a. the SVG file above)\n3. You will see the icon rendered, now you have to either click at the `Copy as a text` or `Download` button to get the optimized SVG file\n\nWith these simple steps you've optimized the SVG from over 450 bytes, which is already small, to 173 bytes (a decrease of over 62%!). If you'd open this file in the editor of your choice, you can see a lot of the useless (meta)data from the original file has been deleted. Also, the different elements of the SVG are combined in a single `path` that renders the icon:\n\n```svg\n\n\n \n\n```\n\nThis SVG can be even further optimized by checking the \"Prefer viewbox to width/height\" in SVGOMG, but let's save that for later when we use SVGO instead.\n\n## Using SVGO\n\nBy using SVGOMG you've already experienced what power [SVGO](https://github.com/svg/svgo) has, as SVGOMG is described by its creators as *\" SVGO's Missing GUI, aiming to expose the majority if not all the configuration options of SVGO\"*. Instead of using the GUI, you can also use SVGO directly from the command line as a CLI-tool or as a Node.js module. For the sake of this article, we'll be using it solely as CLI.\n\nSVGO can be installed globally on your machine, or locally in your project, from npm by running:\n\n```bash\nnpm i -g svgo\n\n# Yarn equivalent\nyarn add -G svgo\n```\n\nAfter doing this you can run `svgo` from the command line and optimize any SVG file instantly. But, you don't want to do this manually on your machine anytime you're adding a new icon to a project (or component library). Therefore, you can also add SVGO to a project locally and add a script to the `package.json` file to optimize all SVGs in a certain directory.\n\n```json\n// package.json\n{\n // ...\n \"scripts\": {\n // ...\n \"optimize-svg\": \"svgo --config=.svgo.yml -f ./src/assets/icons\"\n }\n}\n```\n\nThe `optimize-svg` script will run SVGO in the directory `src/assets/icons` and optimize all the SVG files based on the settings in `.svgo.yml`. This file is where you can configure the rules for SVGO, as the previously mentioned \"Prefer viewbox to width/height\":\n\n```yaml\n# .svgo.yml\nplugins:\n - removeViewBox: false\n - removeDimensions: true # this deletes width/height and adds it to the viewBox\n - removeDoctype: true\n - removeComments: true\n - removeMetadata: true\n - removeEditorsNSData: true\n - cleanupIDs: true\n - removeRasterImages: true\n - removeUselessDefs: true\n - removeUnknownsAndDefaults: true\n - removeUselessStrokeAndFill: true\n - removeHiddenElems: true\n - removeEmptyText: true\n - removeEmptyAttrs: true\n - removeEmptyContainers: true\n - removeUnusedNS: true\n - removeDesc: true\n - prefixIds: false\n - prefixClassNames: false\n```\n \nFrom the rules above you'll get an idea about all the redundant and useless lines of code that might be present in your SVG files. But luckily, they will all get removed when you run the command `npm run optimize-svg`.\n\n## Converting SVGs with SVGR\n\nYou've now learned how to optimize your SVG files, and are probably wondering how to use these files in a React application. To render an SVG in React, you need to either configure Webpack in a way that it knows how to deal with SVG files or use a library called SVGR. By default, any application created with `create-react-app` can render SVG files as a component, using the following `import` statement:\n\n```jsx\n// MyComponent.jsx\nimport React from 'react';\nimport { ReactComponent as MySVG } from './something.svg';\n\nconst MyComponent = () => {\n return (\n
\n \n
\n );\n}\nexport default MyComponent;\n```\n\nMore information about how this is done can be found in [this article](https://blog.logrocket.com/how-to-use-svgs-in-react/), but let me show you how to solve that with SVGR.\n\nWith [SVGR](https://react-svgr.com/) you can convert SVG files into React Components, either by adding it to Webpack or by using the SVGR CLI or Node.js module. In the same way, as we optimized the SVGs from the command line with SVGO, we can also convert these icons from the command line with SVGR:\n\n```json\n// package.json\n{\n // ...\n \"scripts\": {\n // ...\n \"optimize-svg\": \"svgo --config=.svgo.yml -f ./src/assets/icons\",\n \"convert-svg\": \"svgr -d ./src/components/Icon ./src/assets/icons\"\n }\n}\n```\n\nWhenever you run the command `npm run convert-svg` a JSX file will be created for every SVG file that's present in the directory `src/assets/icons`. These JSX files can be found in the directory `src/components/Icons`, together with an `index.js` file that exports all these components from this directory.\n\nAn example of such a converted SVG file is:\n\n\n```jsx\n// MySVG.jsx\nimport * as React from 'react';\n\nconst MySVG = (props) => (\n \n \n \n);\n\nexport default MySVG;\n```\n\nAnd, as we now have a directory filled with converted SVGs these can be imported into any React component like this:\n\n```jsx\n// MyComponent.jsx\nimport React from 'react';\nimport MySVG from './MySVG.jsx';\n\nconst MyComponent = () => {\n return (\n
\n \n
\n );\n}\nexport default MyComponent;\n```\n\nOften SVGR is used alongside SVGO, so you can even automatically optimize all SVGS that will be converted by SVGR. This is done by adding the flag `--no-svgo true` and point it towards your SVGO configuration file:\n\n```json\n// package.json\n{\n // ...\n \"scripts\": {\n // ...\n \"convert-svg\": \"svgr -d ./src/components/Icon ./src/assets/icons --no-svgo true --svgo-config .svgo.yml\"\n }\n}\n```\n\nBy running the `convert-svg` script you both optimize and convert all the SVG files in `src/assets/icons` to React components based on optimized SVGs.\n\n## Reading further\n\nThe examples in this post are the tip of the metaphorical iceberg on what problems SVGO and SVGR can solve. There are many other features you can enable, such as using them as Node.js modules or enabling TypeScript support. To read further make sure to have a look at the SVGR [playground](https://react-svgr.com/playground/) or [documentation](https://react-svgr.com/docs/getting-started/).\n","meta":{"title":"Optimizing, Converting And Exporting SVG Icons In React","description":"If you've ever build a component library, you probably dealt with optimizing and converting icons before. With SVGO and SVGR you can do this at scale.","createdAt":"Thu Dec 10 2020 01:00:00 GMT+0100 (Central European Standard Time)","coverImage":"images/optimizing-converting-and-exporting-svg-icons-in-react.jpg","tags":"React, component library","author":"Roy Derks","slug":"blog/optimizing-converting-and-exporting-svg-icons-in-react","formattedDate":"10 december 2020","date":"Thu Dec 10 2020 01:00:00 GMT+0100 (Central European Standard Time)"}}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/power-regular-hackathons.json b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/power-regular-hackathons.json similarity index 95% rename from _next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/power-regular-hackathons.json rename to _next/data/tJlUn5_CjNiSTMoSsoO6j/blog/power-regular-hackathons.json index a3c62e5d2..fc98c3d7d 100644 --- a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/power-regular-hackathons.json +++ b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/power-regular-hackathons.json @@ -1 +1 @@ -{"pageProps":{"post":{"content":"\nAt Vandebron we have been organizing a regular hackathon for the last four years. Every three months we organize a two-day event. At first glance this seems quite an investment. Eight days a year, almost losing two working-weeks of productivity for your teams! \n\nOur company is like any other. Our roadmaps are stuffed, our backlogs are never-ending and pressure for delivering value to our customers is always present. Our ambitions are always higher than what we can handle with the amount of teams and people available. We like to say: ‘the energy transition can’t wait!’, but we sure do have to prioritize our projects very carefully.\n\nHowever this does not stop us from organizing our quarterly hackathons. Most of the time our regular hackathons are light-weight. People within the company know how it works. We try not to waste too much time in ‘organizing’ the event. We get right to it. \n\n#### Reasons why you should be organizing (regular) hackathons:\n- Fun - this reason does not need much explanation. Working on challenging, fun and creative ideas with uncertain outcome in a not-business-as-usual way. It makes you step out of your daily comfort zone and explore new things. \n- Walk the extra mile - Some team-members will have the energy, enthusiasm and commitment to use their spare time to fuel their curiosity and bring new insights to the workplace. These are the same people that you also expect to walk the extra mile if the team- or company objectives are at stake. This is in that same spare time! But in the end, if you value your teams to continuously think about new ideas, insights and work on out-of-the-box ideas, it is not a weird idea to create this environment within the company.\n- Bottled up energy - our people are focused on reaching goals and objectives. Every day, every week and every sprint the focus is clear. This also means that there is not always time for creative or high risk escapades that could hurt the overall team objectives. This might give an unsatisfied feeling to people. If the bottled up energy can not be released, engineers might get frustrated. But maybe even more important, you might be missing opportunities for the company.\n- Cross team collaboration - in an agile way of working the concept of the team is very important. At Vandebron we focus on teams staying together for a long period of time. This makes the relationship between individuals stronger, the knowledge of the product deeper and the team as a whole more effective. However, the company is bigger than your team. There might be different ways of connecting with other people within your company, but a hackathon is an ideal way of linking yourself up with people that you can learn from. It can really bring you new insights as an individual, and it will also be an investment for improved cross-team collaboration going forward.\n- Learning organisation - as mentioned, hackathons give you an excellent opportunity to learn new things. For yourself, but definitely also for the company. In my experience I often see that topics get selected that have high-risk and high-reward kind of characteristics. These topics can be scary to touch, which make you go out of your comfort zone. This is where you learn the most! These high-risk and high-reward projects are also very likely to fail, meaning that the reward is not as high as expected, or the complexity and risks are even greater than anticipated. At these moments the pressure-cooker of a hackathon is very valuable, because it forces the participants to draw conclusions in a short time-frame. The insights gained from these projects can be used to further steer the roadmap. And last but not least, it supports building a culture of being bold enough to try new things, and fail fast. I’ve noticed this is appreciated by a lot of people within the company and the hackathon contributes to a culture of innovation.\n\n#### Our most important learnings over the years\n- Spotlights on - It is good to put teams and their results in the spotlight. Let them take the podium and make sure there is an audience. However don’t make it too much about winning. Ideas that have completely failed are just as important as over-engineered fancy product demos. At Vandebron we like to declare ‘winners’ in different categories: ‘Fun & Original’, ’Impactful’, ‘Exploration & Learning’ and ‘Technical achievement’. \n- Harvest your ideas continuously - during normal work and life you hit those topics that you would like to investigate a bit deeper. But while you stumble upon such a topic you don’t have the time to dive into it. So therefore, write your idea down and publish it in the ‘hackathon-idea-box’ for everyone to see! It might already give you some good conversations during coffee or lunch, and it might already generate you some people that would like to join forces with you during the hackathon. Because rest assured, a new hackathon is always coming up!\n- To-theme-or-not-to-theme - we have experimented with adding a theme to a hackathon. It can help the company to generate ideas and action in a certain area of interest. It also helps to generate more focus within the company on a certain persistent challenge that we feel deserves a solution. Although everyone will be working on different sub-topics the full event will be experienced as more correlated and unified. But be careful not to push normal business-projects disguised as hackathon projects to your teams. This goes against the basic concept of a hackathon. At Vandebron we sometimes pick a theme if we would like to motivate people to think about ideas in a certain direction. But most of the time we keep it open.\n- Participation is optional. - At Vandebron we have autonomous teams with professionals that can manage their own agenda. As a team and as an individual. We put effort in promoting the hackathon by trying to make people enthusiastic about participating. But in the end people make their own decisions. Sometimes the team and company objectives do need to have priority, but the teams are perfectly able to make this judgement call themselves.\n- Magnify impact - show everyone what the impact is they have been making. It is good if people recognize how some projects have become reality and that feedback will be appreciated by the community. It gives people a feeling that the podium of the hackathon is a strong force. And ultimately that is how you also proof the value of organizing a hackathon.\n\nFor our next hackathon we are opening our (virtual) doors also for guests, as we are organizing a GreenTech hackathon with other sustainability minded companies (‘Hack the Planet’ and ‘Top Dutch Solar Racing’). You can find more information and sign up via [this link](https://www.vandebron.tech/greentech-hackathon). It is the first time we do it like this, and we sure will learn another thing or two!\n","meta":{"title":"The power of regular hackathons","description":"At Vandebron we have been organizing a regular hackathon for the last four years. Every three months we organize a two-day event. At first glance this seems quite an investment. Eight days a year, almost losing two working-weeks of productivity for your teams!","createdAt":"Fri Mar 19 2021 01:00:00 GMT+0100 (GMT+01:00)","coverImage":"images/power-regular-hackathons.png","tags":"hackathon, innovation, scrum","author":"Arno van den Berg","slug":"blog/power-regular-hackathons","formattedDate":"19 maart 2021","date":"Fri Mar 19 2021 01:00:00 GMT+0100 (GMT+01:00)"}}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"post":{"content":"\nAt Vandebron we have been organizing a regular hackathon for the last four years. Every three months we organize a two-day event. At first glance this seems quite an investment. Eight days a year, almost losing two working-weeks of productivity for your teams! \n\nOur company is like any other. Our roadmaps are stuffed, our backlogs are never-ending and pressure for delivering value to our customers is always present. Our ambitions are always higher than what we can handle with the amount of teams and people available. We like to say: ‘the energy transition can’t wait!’, but we sure do have to prioritize our projects very carefully.\n\nHowever this does not stop us from organizing our quarterly hackathons. Most of the time our regular hackathons are light-weight. People within the company know how it works. We try not to waste too much time in ‘organizing’ the event. We get right to it. \n\n#### Reasons why you should be organizing (regular) hackathons:\n- Fun - this reason does not need much explanation. Working on challenging, fun and creative ideas with uncertain outcome in a not-business-as-usual way. It makes you step out of your daily comfort zone and explore new things. \n- Walk the extra mile - Some team-members will have the energy, enthusiasm and commitment to use their spare time to fuel their curiosity and bring new insights to the workplace. These are the same people that you also expect to walk the extra mile if the team- or company objectives are at stake. This is in that same spare time! But in the end, if you value your teams to continuously think about new ideas, insights and work on out-of-the-box ideas, it is not a weird idea to create this environment within the company.\n- Bottled up energy - our people are focused on reaching goals and objectives. Every day, every week and every sprint the focus is clear. This also means that there is not always time for creative or high risk escapades that could hurt the overall team objectives. This might give an unsatisfied feeling to people. If the bottled up energy can not be released, engineers might get frustrated. But maybe even more important, you might be missing opportunities for the company.\n- Cross team collaboration - in an agile way of working the concept of the team is very important. At Vandebron we focus on teams staying together for a long period of time. This makes the relationship between individuals stronger, the knowledge of the product deeper and the team as a whole more effective. However, the company is bigger than your team. There might be different ways of connecting with other people within your company, but a hackathon is an ideal way of linking yourself up with people that you can learn from. It can really bring you new insights as an individual, and it will also be an investment for improved cross-team collaboration going forward.\n- Learning organisation - as mentioned, hackathons give you an excellent opportunity to learn new things. For yourself, but definitely also for the company. In my experience I often see that topics get selected that have high-risk and high-reward kind of characteristics. These topics can be scary to touch, which make you go out of your comfort zone. This is where you learn the most! These high-risk and high-reward projects are also very likely to fail, meaning that the reward is not as high as expected, or the complexity and risks are even greater than anticipated. At these moments the pressure-cooker of a hackathon is very valuable, because it forces the participants to draw conclusions in a short time-frame. The insights gained from these projects can be used to further steer the roadmap. And last but not least, it supports building a culture of being bold enough to try new things, and fail fast. I’ve noticed this is appreciated by a lot of people within the company and the hackathon contributes to a culture of innovation.\n\n#### Our most important learnings over the years\n- Spotlights on - It is good to put teams and their results in the spotlight. Let them take the podium and make sure there is an audience. However don’t make it too much about winning. Ideas that have completely failed are just as important as over-engineered fancy product demos. At Vandebron we like to declare ‘winners’ in different categories: ‘Fun & Original’, ’Impactful’, ‘Exploration & Learning’ and ‘Technical achievement’. \n- Harvest your ideas continuously - during normal work and life you hit those topics that you would like to investigate a bit deeper. But while you stumble upon such a topic you don’t have the time to dive into it. So therefore, write your idea down and publish it in the ‘hackathon-idea-box’ for everyone to see! It might already give you some good conversations during coffee or lunch, and it might already generate you some people that would like to join forces with you during the hackathon. Because rest assured, a new hackathon is always coming up!\n- To-theme-or-not-to-theme - we have experimented with adding a theme to a hackathon. It can help the company to generate ideas and action in a certain area of interest. It also helps to generate more focus within the company on a certain persistent challenge that we feel deserves a solution. Although everyone will be working on different sub-topics the full event will be experienced as more correlated and unified. But be careful not to push normal business-projects disguised as hackathon projects to your teams. This goes against the basic concept of a hackathon. At Vandebron we sometimes pick a theme if we would like to motivate people to think about ideas in a certain direction. But most of the time we keep it open.\n- Participation is optional. - At Vandebron we have autonomous teams with professionals that can manage their own agenda. As a team and as an individual. We put effort in promoting the hackathon by trying to make people enthusiastic about participating. But in the end people make their own decisions. Sometimes the team and company objectives do need to have priority, but the teams are perfectly able to make this judgement call themselves.\n- Magnify impact - show everyone what the impact is they have been making. It is good if people recognize how some projects have become reality and that feedback will be appreciated by the community. It gives people a feeling that the podium of the hackathon is a strong force. And ultimately that is how you also proof the value of organizing a hackathon.\n\nFor our next hackathon we are opening our (virtual) doors also for guests, as we are organizing a GreenTech hackathon with other sustainability minded companies (‘Hack the Planet’ and ‘Top Dutch Solar Racing’). You can find more information and sign up via [this link](https://www.vandebron.tech/greentech-hackathon). It is the first time we do it like this, and we sure will learn another thing or two!\n","meta":{"title":"The power of regular hackathons","description":"At Vandebron we have been organizing a regular hackathon for the last four years. Every three months we organize a two-day event. At first glance this seems quite an investment. Eight days a year, almost losing two working-weeks of productivity for your teams!","createdAt":"Fri Mar 19 2021 01:00:00 GMT+0100 (Central European Standard Time)","coverImage":"images/power-regular-hackathons.png","tags":"hackathon, innovation, scrum","author":"Arno van den Berg","slug":"blog/power-regular-hackathons","formattedDate":"19 maart 2021","date":"Fri Mar 19 2021 01:00:00 GMT+0100 (Central European Standard Time)"}}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/salesforce-camunda-bpm-migration.json b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/salesforce-camunda-bpm-migration.json similarity index 96% rename from _next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/salesforce-camunda-bpm-migration.json rename to _next/data/tJlUn5_CjNiSTMoSsoO6j/blog/salesforce-camunda-bpm-migration.json index 364c690d9..b017266eb 100644 --- a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/salesforce-camunda-bpm-migration.json +++ b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/salesforce-camunda-bpm-migration.json @@ -1 +1 @@ -{"pageProps":{"post":{"content":"\n\n## Salesforce + FlowRunner golden age\n\nSince 2015, Vandebron has been using Salesforce. At the time, Salesforce for Vandebron, was like a Swiss Army knife - versatile, multifunctional, and seemingly capable of addressing most of the business requirements. It quickly became the central hub for various operations - it became a workspace for agents, a CTI platform, a platform to send service emails and much more. Over time, Salesforce evolved beyond just a customer relationship management tool for Vandebron. It became a full-fledged platform that managed customer-related processes, such as the Signup process, Renewal process, Meter Reading process, etc. \nTo support this transition, Vandebron developed a custom mechanism known as FlowRunner, which was designed to automate and execute these processes within Salesforce.\nInitially, FlowRunner seemed like the perfect solution. It was tailor-made to handle the increasingly complex workflows that Vandebron needed to manage. While it successfully managed to support Vandebron’s operations for several years, this system was not without its flaws. These issues, which will be discussed in detail later, eventually led to the need for a more robust and scalable solution. But for a time, FlowRunner did its job, enabling Vandebron to leverage Salesforce far beyond its original purpose.\n\n\n## Salesforce + FlowRunner solution problems\n\n\nBroadly, the problems can be divided into two categories: technical and organizational.\n\nTechnical Problems: \n- Async Transactions Daily Limit. 250000 async transactions per 24 hours. For bulk processes, it is often not enough. We need to watch it carefully and adjust settings to avoid disaster.\n- Number of concurrent async jobs. Up to 5 async jobs simultaneously. \n- The FlowRunner mechanism in Salesforce creates lots of data. It uses ~ 25% of our storage. Data is expensive in Salesforce. \n- The Salesforce platform is not equipped for a custom BPM solution.This makes the Vandebron Salesforce codebase too large to be used with Salesforce DX (Salesforce CI/CD product). Furthermore, it forces us to maintain a lot of custom code that is available on the market.\n\nOrganizational Problems:\n- Centralization of Customer-Related Processes: With most customer-related processes embedded in Salesforce, any changes to these processes require intervention from the Salesforce team. This centralization creates a bottleneck, as all modifications, updates, and optimizations must pass through a single team, slowing down the overall pace of innovation and response.\n- Domain Overlap and Knowledge Dilution: The Salesforce team at Vandebron is responsible for managing approximately 50 different processes, each belonging to various business domains. This wide scope of responsibility leads to a dilution of expertise, as the team cannot maintain deep knowledge of every process. The result is a lower overall level of understanding and efficiency, making it difficult to ensure the smooth operation and timely updates of all processes.\n\n\n\n## Point of no return\n\nAt the beginning of 2022, Europe was hit by an unprecedented energy crisis. Gas and electricity prices skyrocketed, fluctuating unpredictably, and placing immense pressure on energy providers like Vandebron to adapt swiftly. In response, Vandebron introduced a solution designed to navigate this volatile market: the Flexible Variable Tariffs proposition.\nFrom a technical standpoint, implementing this new offering required the execution of a relatively complex process - Flow_VariableTariff for approximately 50% of our customer base. However, it soon became clear that the FlowRunner mechanism and Salesforce in general were not sufficient to handle the demands of this new process. The total execution time for Flow_VariableTariff was projected to be enormous, spanning over 20 days, which was far too long for a business that needed to respond rapidly to market changes.\nRecognizing the urgency of the situation, we immediately sought ways to optimize the process. While we succeeded in significantly simplifying Flow_VariableTariff, these improvements alone were insufficient to meet our needs. It was at this critical juncture that we realized Salesforce and the FlowRunner were no longer adequate for Vandebron’s evolving requirements. The limitations of these tools became glaringly apparent, signaling the need for a more powerful and flexible solution to support our operations in the face of such a dynamic and challenging environment.\n\n\n## Why Camunda?\n\nChoosing the right process orchestration tool is a critical decision, especially for a company like Vandebron, where efficient workflow management is essential for operational success. To ensure we made the best choice, we began by establishing a set of criteria that the new tool needed to meet. These criteria were designed to address our current challenges and future-proof our operations. Here are some of the most crucial criteria:\n- Compliance with BPMN 2.0 Standard: We prioritized tools that adhered to the BPMN 2.0 standard. This would make any future migration to another tool less painful, ensuring a smoother transition if needed.\n- CI/CD Integration: The ability to seamlessly integrate the tool with Vandebron's CI/CD pipeline was crucial. This integration would allow us to automate deployments, streamline updates, and maintain a high level of consistency across our development processes.\n- Support for Multiple Programming Languages: Given our diverse technology stack, we needed a tool that allowed us to implement flowstep logic in multiple programming languages, with a particular emphasis on supporting Scala, which is heavily used within our systems.\n- Unit Testing: The tool had to enable us to unit-test individual steps and parts of flows. This capability was essential for ensuring the reliability and accuracy of our processes before they were deployed to production.\n\nOur market analysis of process orchestration tools led us to evaluate five potential solutions:\n- Camunda 8\n- IBM Business Automation Workflow (BAW)\n- Bonita\n- Kogito\n- Flowable\n\n\nEach vendor provided us with a demo and/or a trial version of their product. During this evaluation process, we rigorously tested each tool against our criteria. Although all five options met our hard requirements, it quickly became evident that Camunda is the true leader in the market.\n\nSeveral factors contributed to our decision to choose Camunda:\n\n- SaaS Offering: Camunda's SaaS version provided us with the flexibility and scalability we needed, reducing the burden on our infrastructure and allowing us to focus on process management rather than platform maintenance.\n- Comprehensive Documentation: Camunda's clear and well-organized documentation made it easier for our teams to learn and implement the tool effectively, reducing the learning curve and speeding up the integration process.\n- Out-of-the-Box Connectors: Camunda offers a wide range of connectors right out of the box, enabling quick integration with various systems and services. This saved us time and effort, allowing us to implement new workflows faster.\n- User-Friendly Interface: The tool's intuitive and clean UI made it accessible to both technical and non-technical users, facilitating collaboration across teams and improving overall efficiency.\n- Responsive Support: Camunda's quick and helpful support was another decisive factor. Their team was readily available to assist us with any issues or questions, ensuring a smooth onboarding experience.\n\nIn the end, Camunda stood out as the optimal choice for Vandebron’s process orchestration needs, offering the perfect balance of functionality, usability, and support.\n\n## First steps with Camunda\n\nBefore we could begin migrating our processes from Salesforce to Camunda, it was essential to establish a robust infrastructure that would allow Camunda to seamlessly integrate with the rest of Vandebron’s ecosystem, particularly Salesforce. Since Salesforce would continue to serve as the primary workspace for our agents, we needed to ensure smooth communication and data flow between the two platforms. To achieve this, we developed several key infrastructural applications:\n\n- CamundaGateway: Camunda API (Zeebe API) operates using the gRPC protocol, which is not natively supported by Salesforce. To bridge this gap, we created the CamundaGateway, a proxy application that translates HTTP calls into a format that Zeebe API can understand. This application acts as an intermediary, enabling effective communication between Salesforce and Camunda.\n- CamundaSync: Each Camunda process instance has a corresponding representation in Salesforce. To keep the status of these instances up to date across both platforms, we implemented CamundaSync. This job regularly pulls the status of process instances from Camunda and updates the relevant records in Salesforce, ensuring that agents always have access to the most current information.\n- CamundaJobWorker: Not all process steps can be handled by simple connectors like the RestConnector. Some steps are more complex and require custom logic to be executed. To manage these, we developed the CamundaJobWorker service, which contains handlers for these complex process steps. This service allows us to extend Camunda’s capabilities and handle sophisticated workflow requirements efficiently.\n- BPM app (React): Certain processes require input from users, particularly agents working within Salesforce. To facilitate this, we built the BPM app, which includes a set of forms necessary for running specific processes. This application ensures that agents can interact with and influence the workflow directly from their workspace, maintaining the user experience they are accustomed to.\n\n\n![A schematic overview of the camunda infrastructure](../images/camunda_infrastructure.png \"A schematic overview of the camunda infrastructure\")\n\nAs of September 2024, we have successfully implemented the basic infrastructure needed for Camunda integration, and three customer-related processes have been migrated from Salesforce to Camunda, with several more in progress. \nIt's important to highlight that the migration process involved a comprehensive analysis of the existing process, including the removal of legacy components, identification of common errors, and targeted optimization efforts. As a result, we achieved a substantial reduction in errors. Specifically, the Flow_Renewal process, which previously had a 2% failure rate, now experiences only a 0.62% dropout rate post-migration, reflecting a 69% decrease in errors.\n\n\n## Future plans\n\nBy the end of the year, we aim to migrate up to 10 processes to Camunda, further reducing our reliance on Salesforce for process orchestration. In parallel, we plan to enhance our infrastructure applications—CamundaGateway, CamundaSync, CamundaJobWorker, and the BPM frontend app - to improve their performance, scalability, and ease of use. These enhancements will ensure that our systems remain robust and efficient as we expand our use of Camunda across more of Vandebron's operations.\nMoving forward, We will continue to leverage Camunda's capabilities to automate and optimize more processes, ultimately driving greater efficiencies and innovations across Vandebron.","meta":{"title":"Camunda BPM migration","description":"Migration from Salesforce Flow_Runner to Camunda BPM","createdAt":"Wed Sep 04 2024 02:00:00 GMT+0200 (GMT+02:00)","coverImage":"images/camunda-rising.png","tags":["salesforce","camunda","bpm","process_orchestration"],"author":"Andrei Karabovich","slug":"blog/salesforce-camunda-bpm-migration","formattedDate":"4 september 2024","date":"Wed Sep 04 2024 02:00:00 GMT+0200 (GMT+02:00)"}}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"post":{"content":"\n\n## Salesforce + FlowRunner golden age\n\nSince 2015, Vandebron has been using Salesforce. At the time, Salesforce for Vandebron, was like a Swiss Army knife - versatile, multifunctional, and seemingly capable of addressing most of the business requirements. It quickly became the central hub for various operations - it became a workspace for agents, a CTI platform, a platform to send service emails and much more. Over time, Salesforce evolved beyond just a customer relationship management tool for Vandebron. It became a full-fledged platform that managed customer-related processes, such as the Signup process, Renewal process, Meter Reading process, etc. \nTo support this transition, Vandebron developed a custom mechanism known as FlowRunner, which was designed to automate and execute these processes within Salesforce.\nInitially, FlowRunner seemed like the perfect solution. It was tailor-made to handle the increasingly complex workflows that Vandebron needed to manage. While it successfully managed to support Vandebron’s operations for several years, this system was not without its flaws. These issues, which will be discussed in detail later, eventually led to the need for a more robust and scalable solution. But for a time, FlowRunner did its job, enabling Vandebron to leverage Salesforce far beyond its original purpose.\n\n\n## Salesforce + FlowRunner solution problems\n\n\nBroadly, the problems can be divided into two categories: technical and organizational.\n\nTechnical Problems: \n- Async Transactions Daily Limit. 250000 async transactions per 24 hours. For bulk processes, it is often not enough. We need to watch it carefully and adjust settings to avoid disaster.\n- Number of concurrent async jobs. Up to 5 async jobs simultaneously. \n- The FlowRunner mechanism in Salesforce creates lots of data. It uses ~ 25% of our storage. Data is expensive in Salesforce. \n- The Salesforce platform is not equipped for a custom BPM solution.This makes the Vandebron Salesforce codebase too large to be used with Salesforce DX (Salesforce CI/CD product). Furthermore, it forces us to maintain a lot of custom code that is available on the market.\n\nOrganizational Problems:\n- Centralization of Customer-Related Processes: With most customer-related processes embedded in Salesforce, any changes to these processes require intervention from the Salesforce team. This centralization creates a bottleneck, as all modifications, updates, and optimizations must pass through a single team, slowing down the overall pace of innovation and response.\n- Domain Overlap and Knowledge Dilution: The Salesforce team at Vandebron is responsible for managing approximately 50 different processes, each belonging to various business domains. This wide scope of responsibility leads to a dilution of expertise, as the team cannot maintain deep knowledge of every process. The result is a lower overall level of understanding and efficiency, making it difficult to ensure the smooth operation and timely updates of all processes.\n\n\n\n## Point of no return\n\nAt the beginning of 2022, Europe was hit by an unprecedented energy crisis. Gas and electricity prices skyrocketed, fluctuating unpredictably, and placing immense pressure on energy providers like Vandebron to adapt swiftly. In response, Vandebron introduced a solution designed to navigate this volatile market: the Flexible Variable Tariffs proposition.\nFrom a technical standpoint, implementing this new offering required the execution of a relatively complex process - Flow_VariableTariff for approximately 50% of our customer base. However, it soon became clear that the FlowRunner mechanism and Salesforce in general were not sufficient to handle the demands of this new process. The total execution time for Flow_VariableTariff was projected to be enormous, spanning over 20 days, which was far too long for a business that needed to respond rapidly to market changes.\nRecognizing the urgency of the situation, we immediately sought ways to optimize the process. While we succeeded in significantly simplifying Flow_VariableTariff, these improvements alone were insufficient to meet our needs. It was at this critical juncture that we realized Salesforce and the FlowRunner were no longer adequate for Vandebron’s evolving requirements. The limitations of these tools became glaringly apparent, signaling the need for a more powerful and flexible solution to support our operations in the face of such a dynamic and challenging environment.\n\n\n## Why Camunda?\n\nChoosing the right process orchestration tool is a critical decision, especially for a company like Vandebron, where efficient workflow management is essential for operational success. To ensure we made the best choice, we began by establishing a set of criteria that the new tool needed to meet. These criteria were designed to address our current challenges and future-proof our operations. Here are some of the most crucial criteria:\n- Compliance with BPMN 2.0 Standard: We prioritized tools that adhered to the BPMN 2.0 standard. This would make any future migration to another tool less painful, ensuring a smoother transition if needed.\n- CI/CD Integration: The ability to seamlessly integrate the tool with Vandebron's CI/CD pipeline was crucial. This integration would allow us to automate deployments, streamline updates, and maintain a high level of consistency across our development processes.\n- Support for Multiple Programming Languages: Given our diverse technology stack, we needed a tool that allowed us to implement flowstep logic in multiple programming languages, with a particular emphasis on supporting Scala, which is heavily used within our systems.\n- Unit Testing: The tool had to enable us to unit-test individual steps and parts of flows. This capability was essential for ensuring the reliability and accuracy of our processes before they were deployed to production.\n\nOur market analysis of process orchestration tools led us to evaluate five potential solutions:\n- Camunda 8\n- IBM Business Automation Workflow (BAW)\n- Bonita\n- Kogito\n- Flowable\n\n\nEach vendor provided us with a demo and/or a trial version of their product. During this evaluation process, we rigorously tested each tool against our criteria. Although all five options met our hard requirements, it quickly became evident that Camunda is the true leader in the market.\n\nSeveral factors contributed to our decision to choose Camunda:\n\n- SaaS Offering: Camunda's SaaS version provided us with the flexibility and scalability we needed, reducing the burden on our infrastructure and allowing us to focus on process management rather than platform maintenance.\n- Comprehensive Documentation: Camunda's clear and well-organized documentation made it easier for our teams to learn and implement the tool effectively, reducing the learning curve and speeding up the integration process.\n- Out-of-the-Box Connectors: Camunda offers a wide range of connectors right out of the box, enabling quick integration with various systems and services. This saved us time and effort, allowing us to implement new workflows faster.\n- User-Friendly Interface: The tool's intuitive and clean UI made it accessible to both technical and non-technical users, facilitating collaboration across teams and improving overall efficiency.\n- Responsive Support: Camunda's quick and helpful support was another decisive factor. Their team was readily available to assist us with any issues or questions, ensuring a smooth onboarding experience.\n\nIn the end, Camunda stood out as the optimal choice for Vandebron’s process orchestration needs, offering the perfect balance of functionality, usability, and support.\n\n## First steps with Camunda\n\nBefore we could begin migrating our processes from Salesforce to Camunda, it was essential to establish a robust infrastructure that would allow Camunda to seamlessly integrate with the rest of Vandebron’s ecosystem, particularly Salesforce. Since Salesforce would continue to serve as the primary workspace for our agents, we needed to ensure smooth communication and data flow between the two platforms. To achieve this, we developed several key infrastructural applications:\n\n- CamundaGateway: Camunda API (Zeebe API) operates using the gRPC protocol, which is not natively supported by Salesforce. To bridge this gap, we created the CamundaGateway, a proxy application that translates HTTP calls into a format that Zeebe API can understand. This application acts as an intermediary, enabling effective communication between Salesforce and Camunda.\n- CamundaSync: Each Camunda process instance has a corresponding representation in Salesforce. To keep the status of these instances up to date across both platforms, we implemented CamundaSync. This job regularly pulls the status of process instances from Camunda and updates the relevant records in Salesforce, ensuring that agents always have access to the most current information.\n- CamundaJobWorker: Not all process steps can be handled by simple connectors like the RestConnector. Some steps are more complex and require custom logic to be executed. To manage these, we developed the CamundaJobWorker service, which contains handlers for these complex process steps. This service allows us to extend Camunda’s capabilities and handle sophisticated workflow requirements efficiently.\n- BPM app (React): Certain processes require input from users, particularly agents working within Salesforce. To facilitate this, we built the BPM app, which includes a set of forms necessary for running specific processes. This application ensures that agents can interact with and influence the workflow directly from their workspace, maintaining the user experience they are accustomed to.\n\n\n![A schematic overview of the camunda infrastructure](../images/camunda_infrastructure.png \"A schematic overview of the camunda infrastructure\")\n\nAs of September 2024, we have successfully implemented the basic infrastructure needed for Camunda integration, and three customer-related processes have been migrated from Salesforce to Camunda, with several more in progress. \nIt's important to highlight that the migration process involved a comprehensive analysis of the existing process, including the removal of legacy components, identification of common errors, and targeted optimization efforts. As a result, we achieved a substantial reduction in errors. Specifically, the Flow_Renewal process, which previously had a 2% failure rate, now experiences only a 0.62% dropout rate post-migration, reflecting a 69% decrease in errors.\n\n\n## Future plans\n\nBy the end of the year, we aim to migrate up to 10 processes to Camunda, further reducing our reliance on Salesforce for process orchestration. In parallel, we plan to enhance our infrastructure applications—CamundaGateway, CamundaSync, CamundaJobWorker, and the BPM frontend app - to improve their performance, scalability, and ease of use. These enhancements will ensure that our systems remain robust and efficient as we expand our use of Camunda across more of Vandebron's operations.\nMoving forward, We will continue to leverage Camunda's capabilities to automate and optimize more processes, ultimately driving greater efficiencies and innovations across Vandebron.","meta":{"title":"Camunda BPM migration","description":"Migration from Salesforce Flow_Runner to Camunda BPM","createdAt":"Wed Sep 04 2024 02:00:00 GMT+0200 (Central European Summer Time)","coverImage":"images/camunda-rising.png","tags":["salesforce","camunda","bpm","process_orchestration"],"author":"Andrei Karabovich","slug":"blog/salesforce-camunda-bpm-migration","formattedDate":"4 september 2024","date":"Wed Sep 04 2024 02:00:00 GMT+0200 (Central European Summer Time)"}}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/spin-up-kubernetes-on-macbook.json b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/spin-up-kubernetes-on-macbook.json similarity index 95% rename from _next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/spin-up-kubernetes-on-macbook.json rename to _next/data/tJlUn5_CjNiSTMoSsoO6j/blog/spin-up-kubernetes-on-macbook.json index c301f4273..9fca62767 100644 --- a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/spin-up-kubernetes-on-macbook.json +++ b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/spin-up-kubernetes-on-macbook.json @@ -1 +1 @@ -{"pageProps":{"post":{"content":"\nIn Vandebron we have been using container clusters to host our services since the foundation of our Big Data team. \nRecently our cluster of choice has declared End-Of-Life development stage, so we decided to take a step forward and get a ticket for the Kubernetes boat.\n\nA change in the OS that is used to run your services and applications can look quite challenging and not everyone is on the same experience level. To make everyone comfortable it is a good choice to give everyone the possibility to play with the new tools and learn what can be done and how: **you need a sandbox.**\n\nOur developers are provided with a Macbook and at the moment of writing there some options you can go for when deciding how to set up your playground:\n\n- **Docker CE Kubernetes**: This is the easiest solution since there is a handy button to run your containers into a Kubernetes environment.\n\n- **Vagrant and Virtualbox**: This solution is the one that can give you more control and you can easily create a cluster the size you want, but you need to be handy with VMs, the hypervisor of choice, and Vagrant. It's the old school way to do it but, while it's a chunk your platform engineers can bite, it can be a steep and frustrating process for people that are not used to handle VMs.\n\n- **Multipass + some bash magic glue**: Since Canonical created this tool for macOS, creating an Ubuntu VM became a breeze and you can have a single, easily manageable VM with its networking up and running in less than a minute, without having to handle disks, distros, and stuff. On top of it, the command line interface is straight forward and it has just the basic commands we will need, so wrapping the entire process into a bash script is a piece of cake.\n\nI have found this super cool in-depth [article](https://jyeee.medium.com/kubernetes-on-your-macos-laptop-with-multipass-k3s-and-rancher-2-4-6e9cbf013f58) from Jason Yee (kudos to you bruh) that guided me through the installation of my first single node Kubernetes cluster.\n\nThe process is not that long but it involves a lot of copy/pasting and, once learned the basics, I didn't want to go under the same process more times, plus it could be interesting for me as a Platform Engineer, but it may be boring and pointless for developers who just want to have a sandbox replica of what they are working on in the remote environment.\nMy automator (aka do-it-once-never-do-it-again) spirit kicked in and I decided to wrap every step in a small command-line tool with only 3 options:\n- **install**\n- **cleanup**\n- **help**\n\n\n### What is happening under the hood\n\nWhat the script does is substantially automating all the steps needed to:\n1. Create a new VM using Multipass (tool released by Canonical)\n2. Fetch the VM IP address and adding it to your local `/etc/hosts` file\n3. Install k3s (a lightweight distribution of Kubernetes) on top of the VM\n4. Install the Kubernetes command-line tools on your laptop\n5. Install Helm (the Kubernetes package manager) on your laptop\n6. Install cert-manager (certificate manager) package on top of your k3s cluster\n7. Install Rancher (a Kubernetes control plane) package on top of your k3s cluster\n\nIf you are looking for a more in-depth breakdown of the single steps you can download and inspect [the script](https://gist.githubusercontent.com/nikotrone/50b1a5f8d137411879eb2467e689bfbe/raw/090b4b4323d96ac28d96bbb346e2e657073722e6/bronernetes) (one of the many advantages of [OpenSource](https://en.wikipedia.org/wiki/Open_source) projects) or checkout and read the original [article](https://jyeee.medium.com/kubernetes-on-your-macos-laptop-with-multipass-k3s-and-rancher-2-4-6e9cbf013f58): it explains line by line what the specific commands are doing.\n\n#### 1. Multipass VM\n[Multipass](https://multipass.run/) is a tool from Canonical (the company developing and maintaining the Ubuntu Linux distribution) that leverages Hyperkit (macOS feature to handle virtualization) to create and handle a Virtual Machine directly on your Mac.\n\n#### 2. Edit /etc/hosts\nOnce we have our VM up and running we need to make it available with an easy url that is also gonna be used to generate the SSL certificate, in our case we picked up `rancher.localdev`.\nIt is important to have a name setup in the beginning since this one will need to match with the certificate so we can use it programmatically.\n\n#### 3. Install K3S\nThis step is pretty straightforward: just fetch a script that is publicly available on the [k3s official website](https://get.k3s.io) and feed it to your bash.\nK3s is a lightweight version of Kubernetes with all the needed dependencies and executable packaged in a convenient installation script. Because of its light nature, it is often used in embedded devices that have a limited amount of resources to offer.\n\n#### 4 & 5. Kubernetes and Helm cli\n**Kubernetes cli** (`kubectl`) is used to talk and interact with your Kubernetes cluster. It can be used to manage multiple clusters according to the content of your KUBECONFIG environment variable. \nThe variable itself contains just a path to where your cluster configuration is stored, so you can switch from a cluster to another by simply pointing to another file that contains the configuration of another cluster.\n\n**Helm** instead is the \"package manager\" of Kubernetes: you can use it to add repositories to specific `charts` which are the blueprint that contains a way to install a specific tool on your cluster.\nBoth of these tools have to be installed and run from your local laptop, either in the case you are managing a local VM or in the case you are interacting with a remote cluster.\n\n#### 6 & 7. cert-manager and Rancher\n\n**Rancher** is the control plane for our cluster: it provides a GUI and an overview of our single node cluster. It offers other goodies like management of multiple clusters, deployed on different locations like AWS Azure and GCP or even on your own hardware, plus certificate deployment and some other handy functionalities.\n\n**cert-manager** is installed via Helm chart and it is the tool used by Rancher to generate and deploy a certificate across the entire cluster.\n\n### How to use it\n\nAll the steps will involve the use of a Terminal window\n#### Installation\nThe first thing you need to do is download [this script](https://gist.github.com/nikotrone/50b1a5f8d137411879eb2467e689bfbe) and save it in a folder on your Mac (let's assume `~/bronernetes`) by executing\n```bash\n mkdir ~/bronernetes\n cd ~/bronernetes\n curl https://gist.githubusercontent.com/nikotrone/50b1a5f8d137411879eb2467e689bfbe/raw/090b4b4323d96ac28d96bbb346e2e657073722e6/bronernetes > bronernetes\n export PATH=$PATH:$(pwd)\n```\n\nNow we have the toolset and you can confirm it works by simply running `bronernetes help`.\n\n#### Spin up Kubernetes\nThe next step is to run the installation process with the command `bronernetes install`\n\n#### Clean up\nWhen you are done or you just want to hard reset your environment you can just type `bronernetes cleanup` and it will take care of cleaning up the VM you just used, leaving you with a pristine machine, as nothing ever happened :)\n\n### Conclusion\n\nHaving a sandbox is very useful to play around with the concepts of a new setup or service and it packs up a huge amount of positive sides. No matter what is the language or the nature of the system you are trying to replicate, it can be challenging and involve a long list of instructions or manual operations and, sometimes, even dedicated hardware. Although with some bash glue, it is possible to automate most of those processes and the investment cost can be enormously beneficial for yourself (less work the next time you do it) and for the other people working with you (they can use the tool, comment and suggest improvements). Most of all, in the case of infrastructure, it helps raise the knowledge of \"what's going on here\" and documents for the ones interested in taking a trip down the rabbit hole.\n","meta":{"title":"How to Spin Up A Kubernetes Cluster On Your Macbook","description":"It is can be useful to create a disposable Kubernetes sandbox to play with when you are exploring a new application and how it could work.","createdAt":"Mon Jan 25 2021 01:00:00 GMT+0100 (GMT+01:00)","coverImage":"images/spin-up-kubernetes-on-macbook.jpg","imageSource":"https://pixabay.com/it/users/mari_sparrow-13090456/","tags":"Kubernetes, k8s, local","author":"Marco Nicotra","slug":"blog/spin-up-kubernetes-on-macbook","formattedDate":"25 januari 2021","date":"Mon Jan 25 2021 01:00:00 GMT+0100 (GMT+01:00)"}}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"post":{"content":"\nIn Vandebron we have been using container clusters to host our services since the foundation of our Big Data team. \nRecently our cluster of choice has declared End-Of-Life development stage, so we decided to take a step forward and get a ticket for the Kubernetes boat.\n\nA change in the OS that is used to run your services and applications can look quite challenging and not everyone is on the same experience level. To make everyone comfortable it is a good choice to give everyone the possibility to play with the new tools and learn what can be done and how: **you need a sandbox.**\n\nOur developers are provided with a Macbook and at the moment of writing there some options you can go for when deciding how to set up your playground:\n\n- **Docker CE Kubernetes**: This is the easiest solution since there is a handy button to run your containers into a Kubernetes environment.\n\n- **Vagrant and Virtualbox**: This solution is the one that can give you more control and you can easily create a cluster the size you want, but you need to be handy with VMs, the hypervisor of choice, and Vagrant. It's the old school way to do it but, while it's a chunk your platform engineers can bite, it can be a steep and frustrating process for people that are not used to handle VMs.\n\n- **Multipass + some bash magic glue**: Since Canonical created this tool for macOS, creating an Ubuntu VM became a breeze and you can have a single, easily manageable VM with its networking up and running in less than a minute, without having to handle disks, distros, and stuff. On top of it, the command line interface is straight forward and it has just the basic commands we will need, so wrapping the entire process into a bash script is a piece of cake.\n\nI have found this super cool in-depth [article](https://jyeee.medium.com/kubernetes-on-your-macos-laptop-with-multipass-k3s-and-rancher-2-4-6e9cbf013f58) from Jason Yee (kudos to you bruh) that guided me through the installation of my first single node Kubernetes cluster.\n\nThe process is not that long but it involves a lot of copy/pasting and, once learned the basics, I didn't want to go under the same process more times, plus it could be interesting for me as a Platform Engineer, but it may be boring and pointless for developers who just want to have a sandbox replica of what they are working on in the remote environment.\nMy automator (aka do-it-once-never-do-it-again) spirit kicked in and I decided to wrap every step in a small command-line tool with only 3 options:\n- **install**\n- **cleanup**\n- **help**\n\n\n### What is happening under the hood\n\nWhat the script does is substantially automating all the steps needed to:\n1. Create a new VM using Multipass (tool released by Canonical)\n2. Fetch the VM IP address and adding it to your local `/etc/hosts` file\n3. Install k3s (a lightweight distribution of Kubernetes) on top of the VM\n4. Install the Kubernetes command-line tools on your laptop\n5. Install Helm (the Kubernetes package manager) on your laptop\n6. Install cert-manager (certificate manager) package on top of your k3s cluster\n7. Install Rancher (a Kubernetes control plane) package on top of your k3s cluster\n\nIf you are looking for a more in-depth breakdown of the single steps you can download and inspect [the script](https://gist.githubusercontent.com/nikotrone/50b1a5f8d137411879eb2467e689bfbe/raw/090b4b4323d96ac28d96bbb346e2e657073722e6/bronernetes) (one of the many advantages of [OpenSource](https://en.wikipedia.org/wiki/Open_source) projects) or checkout and read the original [article](https://jyeee.medium.com/kubernetes-on-your-macos-laptop-with-multipass-k3s-and-rancher-2-4-6e9cbf013f58): it explains line by line what the specific commands are doing.\n\n#### 1. Multipass VM\n[Multipass](https://multipass.run/) is a tool from Canonical (the company developing and maintaining the Ubuntu Linux distribution) that leverages Hyperkit (macOS feature to handle virtualization) to create and handle a Virtual Machine directly on your Mac.\n\n#### 2. Edit /etc/hosts\nOnce we have our VM up and running we need to make it available with an easy url that is also gonna be used to generate the SSL certificate, in our case we picked up `rancher.localdev`.\nIt is important to have a name setup in the beginning since this one will need to match with the certificate so we can use it programmatically.\n\n#### 3. Install K3S\nThis step is pretty straightforward: just fetch a script that is publicly available on the [k3s official website](https://get.k3s.io) and feed it to your bash.\nK3s is a lightweight version of Kubernetes with all the needed dependencies and executable packaged in a convenient installation script. Because of its light nature, it is often used in embedded devices that have a limited amount of resources to offer.\n\n#### 4 & 5. Kubernetes and Helm cli\n**Kubernetes cli** (`kubectl`) is used to talk and interact with your Kubernetes cluster. It can be used to manage multiple clusters according to the content of your KUBECONFIG environment variable. \nThe variable itself contains just a path to where your cluster configuration is stored, so you can switch from a cluster to another by simply pointing to another file that contains the configuration of another cluster.\n\n**Helm** instead is the \"package manager\" of Kubernetes: you can use it to add repositories to specific `charts` which are the blueprint that contains a way to install a specific tool on your cluster.\nBoth of these tools have to be installed and run from your local laptop, either in the case you are managing a local VM or in the case you are interacting with a remote cluster.\n\n#### 6 & 7. cert-manager and Rancher\n\n**Rancher** is the control plane for our cluster: it provides a GUI and an overview of our single node cluster. It offers other goodies like management of multiple clusters, deployed on different locations like AWS Azure and GCP or even on your own hardware, plus certificate deployment and some other handy functionalities.\n\n**cert-manager** is installed via Helm chart and it is the tool used by Rancher to generate and deploy a certificate across the entire cluster.\n\n### How to use it\n\nAll the steps will involve the use of a Terminal window\n#### Installation\nThe first thing you need to do is download [this script](https://gist.github.com/nikotrone/50b1a5f8d137411879eb2467e689bfbe) and save it in a folder on your Mac (let's assume `~/bronernetes`) by executing\n```bash\n mkdir ~/bronernetes\n cd ~/bronernetes\n curl https://gist.githubusercontent.com/nikotrone/50b1a5f8d137411879eb2467e689bfbe/raw/090b4b4323d96ac28d96bbb346e2e657073722e6/bronernetes > bronernetes\n export PATH=$PATH:$(pwd)\n```\n\nNow we have the toolset and you can confirm it works by simply running `bronernetes help`.\n\n#### Spin up Kubernetes\nThe next step is to run the installation process with the command `bronernetes install`\n\n#### Clean up\nWhen you are done or you just want to hard reset your environment you can just type `bronernetes cleanup` and it will take care of cleaning up the VM you just used, leaving you with a pristine machine, as nothing ever happened :)\n\n### Conclusion\n\nHaving a sandbox is very useful to play around with the concepts of a new setup or service and it packs up a huge amount of positive sides. No matter what is the language or the nature of the system you are trying to replicate, it can be challenging and involve a long list of instructions or manual operations and, sometimes, even dedicated hardware. Although with some bash glue, it is possible to automate most of those processes and the investment cost can be enormously beneficial for yourself (less work the next time you do it) and for the other people working with you (they can use the tool, comment and suggest improvements). Most of all, in the case of infrastructure, it helps raise the knowledge of \"what's going on here\" and documents for the ones interested in taking a trip down the rabbit hole.\n","meta":{"title":"How to Spin Up A Kubernetes Cluster On Your Macbook","description":"It is can be useful to create a disposable Kubernetes sandbox to play with when you are exploring a new application and how it could work.","createdAt":"Mon Jan 25 2021 01:00:00 GMT+0100 (Central European Standard Time)","coverImage":"images/spin-up-kubernetes-on-macbook.jpg","imageSource":"https://pixabay.com/it/users/mari_sparrow-13090456/","tags":"Kubernetes, k8s, local","author":"Marco Nicotra","slug":"blog/spin-up-kubernetes-on-macbook","formattedDate":"25 januari 2021","date":"Mon Jan 25 2021 01:00:00 GMT+0100 (Central European Standard Time)"}}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/sustainable-tech-hardware.json b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/sustainable-tech-hardware.json similarity index 92% rename from _next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/sustainable-tech-hardware.json rename to _next/data/tJlUn5_CjNiSTMoSsoO6j/blog/sustainable-tech-hardware.json index 642562c16..5e16c341a 100644 --- a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/sustainable-tech-hardware.json +++ b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/sustainable-tech-hardware.json @@ -1 +1 @@ -{"pageProps":{"post":{"content":"\nIn our sustainable journey at Vandebron, we are not only striving to revolutionize the renewable energy sector, but we are also rethinking how we interact with technology ourselves. As a part of this initiative, we have been looking at how to reduce our digital footprint. One of our most recent projects involves transforming our ageing fleet of iMacs into revitalized, lightweight machines. \n\nWe proudly introduce the 'flexMac'.\n\n### Regained speed, sustainability and enhanced security\nOur customer contact department, the core of our operation, was equipped with older iMacs running on slower HDD drives. While replacing these machines with newer models might have been the easier route, it didn't align with our commitment to sustainability. \n\nInstead, we decided to be creative and look for ways to upcycle our older iMacs. Our choice of tool? Google's ChromeOS Flex. As the slogan suggests, [‘don’t bin it, just flex it’](https://www.linkedin.com/feed/update/urn:li:activity:7066377989831233536/) we figured this could very well meet our wishes. By installing this onto our iMacs, we have given birth to our new line of workstations, naming them 'flexMacs'.\n\n[ChromeOS Flex](https://chromeenterprise.google/os/chromeosflex/) is a free, open-source operating system by Google that breathes [new life into older PCs and Macs](https://cloud.google.com/blog/products/chrome-enterprise/chromeos-flex-ready-to-scale-to-pcs-and-macs). It's lightweight, fast, and ideal for the web-centric applications and services our customer contact department uses every day. Once ChromeOS Flex was installed, the transformation was remarkable. The old machines metamorphosed from very slow to production-ready again in a breath, adept at handling all our workflows at the Customer Contact department.\n\nThese workflows at Customer Contact are fully web-based. It enables us multichannel support, integration capabilities, and data-driven insights. These help our support agents to provide personalized and efficient service across various communication channels. By using these technologies and insights, we optimize our customer service strategies, leading (hopefully) to higher customer satisfaction.\n\nAnother important benefit of this transformation was an added layer of security. ChromeOS Flex allows our users to log in using their Google identity, ensuring a personalized and secure workspace for every team member. This means each user experiences a secure, tailored environment, whilst bringing an additional level of security and control to our IT operations.\n\n### The importance of circularity\nBesides the operational benefits, the broader environmental impact of this initiative is important to us. By extending the life of our technology, we contribute directly to reducing e-waste, one of [the fastest-growing waste streams in the EU](https://www.europarl.europa.eu/news/en/headlines/society/20201208STO93325/e-waste-in-the-eu-facts-and-figures-infographic). As a company, Vandebron is not only promoting sustainable innovations but striving to actively embody them. Our 'flexMacs project is a testament to this commitment.\n\nOur 'flexMacs' project demonstrates how we can repurpose and upgrade older hardware, which according to Emerce is a [hot thing to do](https://www.emerce.nl/achtergrond/circulaire-hardware-is-hot-dit-is-waarom). We hope this blogpost inspires you to consider similar sustainability initiatives. By choosing to upgrade rather than replace, we extend the life of existing hardware and contribute to a reduction in e-waste.\n\nStay tuned for more updates from our tech-driven sustainability journey.\n","meta":{"title":"Sustainable Tech-Hardware - Introducing the 'flexMac'","description":"Enhanced security, sustainability, and regained speed at Customer Contact revitalizing our old iMacs.","createdAt":"Mon Jul 03 2023 02:00:00 GMT+0200 (GMT+02:00)","coverImage":"images/circular.jpeg","tags":"sustainable-tech, flexmac, circularity","author":"Gehdrio Lake & Sietse Bruinsma","slug":"blog/sustainable-tech-hardware","formattedDate":"3 juli 2023","date":"Mon Jul 03 2023 02:00:00 GMT+0200 (GMT+02:00)"}}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"post":{"content":"\nIn our sustainable journey at Vandebron, we are not only striving to revolutionize the renewable energy sector, but we are also rethinking how we interact with technology ourselves. As a part of this initiative, we have been looking at how to reduce our digital footprint. One of our most recent projects involves transforming our ageing fleet of iMacs into revitalized, lightweight machines. \n\nWe proudly introduce the 'flexMac'.\n\n### Regained speed, sustainability and enhanced security\nOur customer contact department, the core of our operation, was equipped with older iMacs running on slower HDD drives. While replacing these machines with newer models might have been the easier route, it didn't align with our commitment to sustainability. \n\nInstead, we decided to be creative and look for ways to upcycle our older iMacs. Our choice of tool? Google's ChromeOS Flex. As the slogan suggests, [‘don’t bin it, just flex it’](https://www.linkedin.com/feed/update/urn:li:activity:7066377989831233536/) we figured this could very well meet our wishes. By installing this onto our iMacs, we have given birth to our new line of workstations, naming them 'flexMacs'.\n\n[ChromeOS Flex](https://chromeenterprise.google/os/chromeosflex/) is a free, open-source operating system by Google that breathes [new life into older PCs and Macs](https://cloud.google.com/blog/products/chrome-enterprise/chromeos-flex-ready-to-scale-to-pcs-and-macs). It's lightweight, fast, and ideal for the web-centric applications and services our customer contact department uses every day. Once ChromeOS Flex was installed, the transformation was remarkable. The old machines metamorphosed from very slow to production-ready again in a breath, adept at handling all our workflows at the Customer Contact department.\n\nThese workflows at Customer Contact are fully web-based. It enables us multichannel support, integration capabilities, and data-driven insights. These help our support agents to provide personalized and efficient service across various communication channels. By using these technologies and insights, we optimize our customer service strategies, leading (hopefully) to higher customer satisfaction.\n\nAnother important benefit of this transformation was an added layer of security. ChromeOS Flex allows our users to log in using their Google identity, ensuring a personalized and secure workspace for every team member. This means each user experiences a secure, tailored environment, whilst bringing an additional level of security and control to our IT operations.\n\n### The importance of circularity\nBesides the operational benefits, the broader environmental impact of this initiative is important to us. By extending the life of our technology, we contribute directly to reducing e-waste, one of [the fastest-growing waste streams in the EU](https://www.europarl.europa.eu/news/en/headlines/society/20201208STO93325/e-waste-in-the-eu-facts-and-figures-infographic). As a company, Vandebron is not only promoting sustainable innovations but striving to actively embody them. Our 'flexMacs project is a testament to this commitment.\n\nOur 'flexMacs' project demonstrates how we can repurpose and upgrade older hardware, which according to Emerce is a [hot thing to do](https://www.emerce.nl/achtergrond/circulaire-hardware-is-hot-dit-is-waarom). We hope this blogpost inspires you to consider similar sustainability initiatives. By choosing to upgrade rather than replace, we extend the life of existing hardware and contribute to a reduction in e-waste.\n\nStay tuned for more updates from our tech-driven sustainability journey.\n","meta":{"title":"Sustainable Tech-Hardware - Introducing the 'flexMac'","description":"Enhanced security, sustainability, and regained speed at Customer Contact revitalizing our old iMacs.","createdAt":"Mon Jul 03 2023 02:00:00 GMT+0200 (Central European Summer Time)","coverImage":"images/circular.jpeg","tags":"sustainable-tech, flexmac, circularity","author":"Gehdrio Lake & Sietse Bruinsma","slug":"blog/sustainable-tech-hardware","formattedDate":"3 juli 2023","date":"Mon Jul 03 2023 02:00:00 GMT+0200 (Central European Summer Time)"}}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/the-difference-between-a-component-library-and-a-design-system.json b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/the-difference-between-a-component-library-and-a-design-system.json similarity index 97% rename from _next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/the-difference-between-a-component-library-and-a-design-system.json rename to _next/data/tJlUn5_CjNiSTMoSsoO6j/blog/the-difference-between-a-component-library-and-a-design-system.json index f92685324..ab2366464 100644 --- a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/the-difference-between-a-component-library-and-a-design-system.json +++ b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/the-difference-between-a-component-library-and-a-design-system.json @@ -1 +1 @@ -{"pageProps":{"post":{"content":"\n**A while back, our former technology manager Roy Derks covered the subject of component libraries here on the blog. From a technical perspective, he spoke about when you need one (and when you don’t need one) and what to consider when building one. Since then, obviously a lot has happened at Vandebron. But one of the more interesting things to happen is that design became an integrated part of the digital department, as opposed to previously being attached to marketing. In this new setup, one of the first major projects the design team was involved in was the alignment of our component libraries. And no that’s not a typo, that’s libraries as in the plural form of library. Confusing? I thought so too. In this blog I’ll try to explain further why that was the case, how the work actually helped us bridge the gap between design and development, and dissect the work of unifying those component libraries into one single source of truth and ultimately what’s to become our design system.**\n\n### A bit of a mess\nBefore we get into it, some background as to where we started out might be useful. As previously mentioned, the design team had just become a part of the digital department and one of the first tasks at hand was the creation of a design system. In the design team, we had previously worked with a certain set of brand guidelines, a style guide if you will, which had not necessarily been translated or aligned to the requirements of a digital product or development environment. Development had also created a set of stylesheets and libraries with reusable components which they used to reduce development time. Having it all separately might sound a bit counter-intuitive, but not very surprising if you consider designers and developers not being in the same department, working on a different timeline, different priorities and so forth. However, this only highlighted the importance of designers and developers working together and the need for a proper design system to help prevent creating a fence between the teams causing unnecessary and ineffective work on both sides. The result of this previous “unsynciness”, a rebrand in 2017, and a re-aligned techstack, was the existence of 3 different libraries and subsequently 3 different sources of truth within the development environment. To add to this, we also had separate design guidelines geared more towards brand/marketing purposes in the design team. Now came the rather massive task of unifying these and eventually, rather than having just a library, _having a system_. \n\n### Component library ≠ design system\nNow, there’s a lot of terminology here that might be difficult to grasp if you’re new to the subject. So I thought I’d clarify what we mean when referring to these, how they fit into the context of our situation, and how many of them we had!\n\n- #### Brand guidelines / style guide (design)\n A set of guidelines and examples outlining all the visual elements of a brand such as logos, color, typography, imagery etc. and subsequently in what - - manner they should be applied. It can also be expanded to include more things brand related such as tone of voice, brand values and so forth. Often with brand guidelines, they are created from a marketing perspective and the digital experience(or product) aspect of how the brand should be applied/represented is usually thought about in the second hand, or not included at all. \n\n _Amount: 1_\n \n- #### Design kit/library (design)\n A designer resource file with all the available building blocks that make up the digital design language of a brand and/or the user interface of a product. This is usually only visual(no code) and lives in the design software of the designer's choosing. For us this used to be Sketch, but we recently moved to Figma. Can also include documentation and examples of how the different building blocks should be applied and utilized. \n\n _Amount: 1_\n \n- #### Style sheet (front-end)\n A set of styling properties to be applied when rendering a web page, usually in the format of CSS. This can include things related to the brand guidelines such as font size, colors, etc. but also things related to web layout such as the margins and paddings of different web elements.\n\n _Amount: 1_\n\n- #### Component library (front-end)\n A set of dynamic web components that can be used in a development environment in order to quickly build user interfaces. This helps to ensure consistency, to avoid rebuilding the same component more than once and to avoid changing said component in more places than one, and subsequently help reduce development time. \n\n _Amount: 3_\n \nAll of the above mentioned things, together with rigorous documentation, amount to what’s called a design system. Having it all combined in a structured way is key to getting the most out of such a system. In our case, most of these things were separate and not necessarily connected to each other. But what stands out most of the things above is probably the fact that we, over time, had amounted to 3 different component libraries. I mentioned earlier how that scenario had transpired so I won’t go into too much detail as to how that happened, but if you’re a developer in a small to medium-sized company and I mention “rebrand” and “new techstack” you can probably figure out how. However complex, this also proved to be an excellent opportunity for our developers and for us in the design team. We finally get to unify our component libraries into one, while simultaneously aligning it with our design kit and expanding the guidelines with new and updated documentation. Thus ensuring that designers and developers speak the same language and share the same single source of truth.\n\n### A guild forms\nTo kickstart this process we formed a project group(or ‘guild’) composed of 2 designers and 2 developers, each designer and developer from the two consumer-facing scrum teams. The idea was to let the developers work on the migration and unification of the component libraries in collaboration with us designers in the same project, making it easier to align and to create co-ownership of the product. Our first step was to decide on the structure of our component library, this way the developers could slot all the existing, reworked and new components into the right place in the new library. Easy enough right? Well, here comes our first challenge. We initially wanted to take an atomic approach and build our components from the well known and widely used atomic design principles. We also needed to consider the 3 different “product groups” which the library should apply to, all still utilizing the same style properties. \n\nVandebron has a wide range of products serving different platforms, with the visual language remaining the same but where the user interface might differ. This requires the top elements of the system(such as colors and typography) to be shared across all products, whereas the lower you get the more product-specific an element becomes. This is the reason why we wanted to structure the system according to the principles of Atomic Design first, in order to assign the components to a hierarchical structure.\n\n![Atomic Design](/images/AtomicDesign.jpg \"Atomic Design\")\n\nWith this approach the atoms would work like design tokens and the molecules would be components general enough that they’d be shared across all product groups, this CORE part of the library would essentially be the stylesheet that impacts all visual aspects of the digital brand experience. Only on organism-level do we start to differentiate what product group the component belongs to. So a change to the CORE parts of the library(atoms or molecules) would impact all components in all product groups.\n\nHowever, this approach actually made less sense from a development perspective. Not that it wouldn’t work or that the categorization didn’t make sense, but it would require us rewriting all the already existing components. Components that are actively in use. We deemed this approach a bit too high-risk and high-effort for the time being and started looking into alternatives, while still keeping the atomic structure as a more long-term goal. Another thing our initial idea didn’t take into account was the experience of the future main user of the library, **_the developer!_** Organizing a design system after the brand properties and product groups makes a lot of sense from a designers or a marketeers perspective, and it should probably still be presented outwards that way, but a component library is something else(remember?). So based on our development environment and the way we build our websites and apps our developers suggested a different structure:\n\n![Iteration](/images/Iteration.jpg \"Iteration\")\n\nIn this structure, similar to the previous one, the components are instead categorized and sorted by how they should be applied to the page or application that’s being built. Styles, layouts and inputs are general enough to be applied to all product groups whereas from the surface level the components start becoming more specific in their use case. That way, the components can be separated into specific or even several product groups. In this format the components themselves are not as intertwined as in the atomic structure, albeit still connected by the style element. So while it’s a bit more resistant to overall changes the main idea of having the same style properties applying to everything still works, and it helps us designers to better relate and contextualize what we’re designing from more of a development perspective, thus helping bridge the gap between development and design even further. The main insight we drew from this experience is to not let industry standards and certain trends dictate what you should do. Sure they’re important to keep an eye on, but do it with carefulness and always apply an asterisk to it. Figure out what works best for your specific situation and what’s realistic in the short-term vs. in the long-term. There’s no one-size-fits-all.\n\n### Speaking the same language\nWith the component library migration now underway, we started looking into ways to improve our system from the designers' side of things. As previously mentioned, we had just gone from using Sketch to using Figma and with that came a good opportunity to rebuild, adjust and expand our design kit also. We did that by removing, adding, simplifying and renaming a lot of what was in there since before and with the design kit now adjusted to match the component library we were now also speaking the same language. We can actually now compare this side-by-side with the tools we’re using. In Storybook we have attached the Figma design of every component, simply by activating the feature and pasting the link to its page or artboard in the Figma file. This will refresh in almost real-time if any changes are made so we can easily spot any differences and inconsistencies between what’s live and how the design looks. In Figma, we try to document all our components and give some context as to how it works and should be applied. This is now also directly visible to the developer in the context of the component library. Expanding on our documentation and exposing our digital design guidelines like that has been a great way to create a shared understanding of our designs. Rather than just an image being tossed over a fence, there is now quite literally a direct connection between design and development and therefore also more of a shared ownership.\n\n![Storybook & Figma](/images/StorybookFigma.jpg \"Storybook & Figma\")\n\n### Further defining the process\nAs all the alignment on the design side and the migration neared completion, we started seeing a lot of things that could be improved upon or even added to our component library. When we started logging these things down on our project backlog we quickly realized that the scope of our project had quickly been growing into something beyond what was initially intended, and that rather than giving us focus this guild format was instead at risk of creating an isolated bubble of knowledge surrounding the design system. This prompted us to gauge the opportunity and capacity among our development teams to instead tackle these tasks together, either alongside or within their respective day-to-day tasks. In order to do so we needed the buy-in from key stakeholders such as the product owners from the respective development teams. It’s obviously a big ask to get 1 developer from each team to work on improving a component library, especially when they’ve already given us a quarter on migration and have other important business and/or user needs to tend to. So instead, we looked into how we can embed the improvement and further development of our design system into the developers current processes and primary day-to-day work. We structure this by linking our component library improvement/addition tickets to relevant tickets in their respective sprints. In defining the workflow like this, our 2 designer 2 developer guild in effect rendered unnecessary and instead we opened up the co-ownership and contribution to all developers in all customer-facing development teams and in the process of it preventing isolating knowledge too much. In opening up the process like this, another positive side effect we see is the involvement, engagement and subsequent use of our component library going up. With the product designers now also actively a part of the front-end guild meetings, we have an ever bigger forum and bigger opportunity to build a world class component library and design system while also having more hands on deck to work on maintenance and improvements. We still have a long way to go, but all parts are now even more aligned and the future is looking bright!\n\n### What’s next\nIn the newly formed designer+developer guild, the work of defining requirements and improvements on the design system continues. From the design side we’re also looking to constantly improve on the documentation and the presentation of our system. This is something we imagine we’ll keep on doing continuously and iteratively for as long as it’s needed, if not even forever. After all, “design is never done” and a design system can and should be a living thing constantly evolving along with the products and the brand it serves, and in extension even the promise the brand and it’s products. In our case, that’s to aid in **accelerating the energy transition towards 100% renewable energy**. More on how we exactly do that, and how we always aim to design for impact, in the next blog post. Thanks for reading and stay tuned!\n\n\nPetter Andersson, Product Designer at Vandebron\n\n\n\n_If the type of work mentioned in this blog post sounds interesting to you, [take a look at our job openings here](https://werkenbij.vandebron.nl/l/en/)._ \n","meta":{"title":"The difference between a component library and a design system, and how they can help bridge the gap between design and development","description":"A while back we started a rather extensive project of migrating and unifying our component library, these are some of the learnings we made during the project.","createdAt":"Wed Jul 06 2022 02:00:00 GMT+0200 (GMT+02:00)","coverImage":"images/WindmolenCover.jpg","imageSource":null,"tags":"product, design, design system, component library","author":"Petter Andersson","slug":"blog/the-difference-between-a-component-library-and-a-design-system","formattedDate":"6 juli 2022","date":"Wed Jul 06 2022 02:00:00 GMT+0200 (GMT+02:00)"}}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"post":{"content":"\n**A while back, our former technology manager Roy Derks covered the subject of component libraries here on the blog. From a technical perspective, he spoke about when you need one (and when you don’t need one) and what to consider when building one. Since then, obviously a lot has happened at Vandebron. But one of the more interesting things to happen is that design became an integrated part of the digital department, as opposed to previously being attached to marketing. In this new setup, one of the first major projects the design team was involved in was the alignment of our component libraries. And no that’s not a typo, that’s libraries as in the plural form of library. Confusing? I thought so too. In this blog I’ll try to explain further why that was the case, how the work actually helped us bridge the gap between design and development, and dissect the work of unifying those component libraries into one single source of truth and ultimately what’s to become our design system.**\n\n### A bit of a mess\nBefore we get into it, some background as to where we started out might be useful. As previously mentioned, the design team had just become a part of the digital department and one of the first tasks at hand was the creation of a design system. In the design team, we had previously worked with a certain set of brand guidelines, a style guide if you will, which had not necessarily been translated or aligned to the requirements of a digital product or development environment. Development had also created a set of stylesheets and libraries with reusable components which they used to reduce development time. Having it all separately might sound a bit counter-intuitive, but not very surprising if you consider designers and developers not being in the same department, working on a different timeline, different priorities and so forth. However, this only highlighted the importance of designers and developers working together and the need for a proper design system to help prevent creating a fence between the teams causing unnecessary and ineffective work on both sides. The result of this previous “unsynciness”, a rebrand in 2017, and a re-aligned techstack, was the existence of 3 different libraries and subsequently 3 different sources of truth within the development environment. To add to this, we also had separate design guidelines geared more towards brand/marketing purposes in the design team. Now came the rather massive task of unifying these and eventually, rather than having just a library, _having a system_. \n\n### Component library ≠ design system\nNow, there’s a lot of terminology here that might be difficult to grasp if you’re new to the subject. So I thought I’d clarify what we mean when referring to these, how they fit into the context of our situation, and how many of them we had!\n\n- #### Brand guidelines / style guide (design)\n A set of guidelines and examples outlining all the visual elements of a brand such as logos, color, typography, imagery etc. and subsequently in what - - manner they should be applied. It can also be expanded to include more things brand related such as tone of voice, brand values and so forth. Often with brand guidelines, they are created from a marketing perspective and the digital experience(or product) aspect of how the brand should be applied/represented is usually thought about in the second hand, or not included at all. \n\n _Amount: 1_\n \n- #### Design kit/library (design)\n A designer resource file with all the available building blocks that make up the digital design language of a brand and/or the user interface of a product. This is usually only visual(no code) and lives in the design software of the designer's choosing. For us this used to be Sketch, but we recently moved to Figma. Can also include documentation and examples of how the different building blocks should be applied and utilized. \n\n _Amount: 1_\n \n- #### Style sheet (front-end)\n A set of styling properties to be applied when rendering a web page, usually in the format of CSS. This can include things related to the brand guidelines such as font size, colors, etc. but also things related to web layout such as the margins and paddings of different web elements.\n\n _Amount: 1_\n\n- #### Component library (front-end)\n A set of dynamic web components that can be used in a development environment in order to quickly build user interfaces. This helps to ensure consistency, to avoid rebuilding the same component more than once and to avoid changing said component in more places than one, and subsequently help reduce development time. \n\n _Amount: 3_\n \nAll of the above mentioned things, together with rigorous documentation, amount to what’s called a design system. Having it all combined in a structured way is key to getting the most out of such a system. In our case, most of these things were separate and not necessarily connected to each other. But what stands out most of the things above is probably the fact that we, over time, had amounted to 3 different component libraries. I mentioned earlier how that scenario had transpired so I won’t go into too much detail as to how that happened, but if you’re a developer in a small to medium-sized company and I mention “rebrand” and “new techstack” you can probably figure out how. However complex, this also proved to be an excellent opportunity for our developers and for us in the design team. We finally get to unify our component libraries into one, while simultaneously aligning it with our design kit and expanding the guidelines with new and updated documentation. Thus ensuring that designers and developers speak the same language and share the same single source of truth.\n\n### A guild forms\nTo kickstart this process we formed a project group(or ‘guild’) composed of 2 designers and 2 developers, each designer and developer from the two consumer-facing scrum teams. The idea was to let the developers work on the migration and unification of the component libraries in collaboration with us designers in the same project, making it easier to align and to create co-ownership of the product. Our first step was to decide on the structure of our component library, this way the developers could slot all the existing, reworked and new components into the right place in the new library. Easy enough right? Well, here comes our first challenge. We initially wanted to take an atomic approach and build our components from the well known and widely used atomic design principles. We also needed to consider the 3 different “product groups” which the library should apply to, all still utilizing the same style properties. \n\nVandebron has a wide range of products serving different platforms, with the visual language remaining the same but where the user interface might differ. This requires the top elements of the system(such as colors and typography) to be shared across all products, whereas the lower you get the more product-specific an element becomes. This is the reason why we wanted to structure the system according to the principles of Atomic Design first, in order to assign the components to a hierarchical structure.\n\n![Atomic Design](/images/AtomicDesign.jpg \"Atomic Design\")\n\nWith this approach the atoms would work like design tokens and the molecules would be components general enough that they’d be shared across all product groups, this CORE part of the library would essentially be the stylesheet that impacts all visual aspects of the digital brand experience. Only on organism-level do we start to differentiate what product group the component belongs to. So a change to the CORE parts of the library(atoms or molecules) would impact all components in all product groups.\n\nHowever, this approach actually made less sense from a development perspective. Not that it wouldn’t work or that the categorization didn’t make sense, but it would require us rewriting all the already existing components. Components that are actively in use. We deemed this approach a bit too high-risk and high-effort for the time being and started looking into alternatives, while still keeping the atomic structure as a more long-term goal. Another thing our initial idea didn’t take into account was the experience of the future main user of the library, **_the developer!_** Organizing a design system after the brand properties and product groups makes a lot of sense from a designers or a marketeers perspective, and it should probably still be presented outwards that way, but a component library is something else(remember?). So based on our development environment and the way we build our websites and apps our developers suggested a different structure:\n\n![Iteration](/images/Iteration.jpg \"Iteration\")\n\nIn this structure, similar to the previous one, the components are instead categorized and sorted by how they should be applied to the page or application that’s being built. Styles, layouts and inputs are general enough to be applied to all product groups whereas from the surface level the components start becoming more specific in their use case. That way, the components can be separated into specific or even several product groups. In this format the components themselves are not as intertwined as in the atomic structure, albeit still connected by the style element. So while it’s a bit more resistant to overall changes the main idea of having the same style properties applying to everything still works, and it helps us designers to better relate and contextualize what we’re designing from more of a development perspective, thus helping bridge the gap between development and design even further. The main insight we drew from this experience is to not let industry standards and certain trends dictate what you should do. Sure they’re important to keep an eye on, but do it with carefulness and always apply an asterisk to it. Figure out what works best for your specific situation and what’s realistic in the short-term vs. in the long-term. There’s no one-size-fits-all.\n\n### Speaking the same language\nWith the component library migration now underway, we started looking into ways to improve our system from the designers' side of things. As previously mentioned, we had just gone from using Sketch to using Figma and with that came a good opportunity to rebuild, adjust and expand our design kit also. We did that by removing, adding, simplifying and renaming a lot of what was in there since before and with the design kit now adjusted to match the component library we were now also speaking the same language. We can actually now compare this side-by-side with the tools we’re using. In Storybook we have attached the Figma design of every component, simply by activating the feature and pasting the link to its page or artboard in the Figma file. This will refresh in almost real-time if any changes are made so we can easily spot any differences and inconsistencies between what’s live and how the design looks. In Figma, we try to document all our components and give some context as to how it works and should be applied. This is now also directly visible to the developer in the context of the component library. Expanding on our documentation and exposing our digital design guidelines like that has been a great way to create a shared understanding of our designs. Rather than just an image being tossed over a fence, there is now quite literally a direct connection between design and development and therefore also more of a shared ownership.\n\n![Storybook & Figma](/images/StorybookFigma.jpg \"Storybook & Figma\")\n\n### Further defining the process\nAs all the alignment on the design side and the migration neared completion, we started seeing a lot of things that could be improved upon or even added to our component library. When we started logging these things down on our project backlog we quickly realized that the scope of our project had quickly been growing into something beyond what was initially intended, and that rather than giving us focus this guild format was instead at risk of creating an isolated bubble of knowledge surrounding the design system. This prompted us to gauge the opportunity and capacity among our development teams to instead tackle these tasks together, either alongside or within their respective day-to-day tasks. In order to do so we needed the buy-in from key stakeholders such as the product owners from the respective development teams. It’s obviously a big ask to get 1 developer from each team to work on improving a component library, especially when they’ve already given us a quarter on migration and have other important business and/or user needs to tend to. So instead, we looked into how we can embed the improvement and further development of our design system into the developers current processes and primary day-to-day work. We structure this by linking our component library improvement/addition tickets to relevant tickets in their respective sprints. In defining the workflow like this, our 2 designer 2 developer guild in effect rendered unnecessary and instead we opened up the co-ownership and contribution to all developers in all customer-facing development teams and in the process of it preventing isolating knowledge too much. In opening up the process like this, another positive side effect we see is the involvement, engagement and subsequent use of our component library going up. With the product designers now also actively a part of the front-end guild meetings, we have an ever bigger forum and bigger opportunity to build a world class component library and design system while also having more hands on deck to work on maintenance and improvements. We still have a long way to go, but all parts are now even more aligned and the future is looking bright!\n\n### What’s next\nIn the newly formed designer+developer guild, the work of defining requirements and improvements on the design system continues. From the design side we’re also looking to constantly improve on the documentation and the presentation of our system. This is something we imagine we’ll keep on doing continuously and iteratively for as long as it’s needed, if not even forever. After all, “design is never done” and a design system can and should be a living thing constantly evolving along with the products and the brand it serves, and in extension even the promise the brand and it’s products. In our case, that’s to aid in **accelerating the energy transition towards 100% renewable energy**. More on how we exactly do that, and how we always aim to design for impact, in the next blog post. Thanks for reading and stay tuned!\n\n\nPetter Andersson, Product Designer at Vandebron\n\n\n\n_If the type of work mentioned in this blog post sounds interesting to you, [take a look at our job openings here](https://werkenbij.vandebron.nl/l/en/)._ \n","meta":{"title":"The difference between a component library and a design system, and how they can help bridge the gap between design and development","description":"A while back we started a rather extensive project of migrating and unifying our component library, these are some of the learnings we made during the project.","createdAt":"Wed Jul 06 2022 02:00:00 GMT+0200 (Central European Summer Time)","coverImage":"images/WindmolenCover.jpg","imageSource":null,"tags":"product, design, design system, component library","author":"Petter Andersson","slug":"blog/the-difference-between-a-component-library-and-a-design-system","formattedDate":"6 juli 2022","date":"Wed Jul 06 2022 02:00:00 GMT+0200 (Central European Summer Time)"}}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/vandebron-the-video-game.json b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/vandebron-the-video-game.json new file mode 100644 index 000000000..95d06e2b2 --- /dev/null +++ b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/vandebron-the-video-game.json @@ -0,0 +1 @@ +{"pageProps":{"post":{"content":"\n# Grid City: A Hackathon Journey into the Energy Transition by Vandebron\n\nDuring the last couple of hackathons, we set out to gamify one of the most pressing challenges of our time, the transition to green energy.\nA problem our team, VPP [Virtual Power Plant], deals with on a daily basis.\nWhat emerged was an interactive game designed to educate players about the complexities of energy grid management in a fun and manageable way,\nthough debatable if it is fun or well-balanced. It was a hackathon project after all.\n\n\n\nLet’s dive into the vision, mechanics, and what we hope players take away from this experience.\n\n### Vision: Educate Through Play\nOur goal was to create more than just a game. We envisioned a tool that serves as an onboarding experience,\nnot just for our colleagues, but also anyone interested in the energy transition.\n\nTo realize this vision we chose to go with Godot as our game engine of choice.\nAn open-source game engine that is a super fun and fantastic tool that allowed us to quickly prototype and iterate on our ideas and feedback.\n\n### The Core Gameplay Loop: Keeping the Grid Balanced\nIn this game, your primary goal is to keep the energy grid frequency within the \"goldilocks zone\", i.e. not too much power production, not too little.\nThe longer you can maintain this balance, the better!\n\n#### Key Concepts:\n- **Keeping within the goldilocks zone:** energy production must match energy demand. Fall outside the goldilocks zone, and the grid becomes unstable. If it is unstable for too long, then it's game over.\n- **Keeping up with demand:** Houses are automatically built over time, mimicking real-life construction. It’s up to the player to meet this increasing demand by manually adding renewable energy assets, like wind turbines, solar panels, and batteries.\n- **Forecasting:** Players can use weather forecasts to anticipate and plan for energy production challenges. Too much wind? Better disable some wind turbines for the time being.\n- **Curtailment:** Too much energy? Players must decide when to turn off assets to avoid overproduction. This introduces the concept of curtailment and highlights the work often required in grid management, due to not being able to store the excess energy.\n- **The Main Goal:** A 100% Green Energy Grid, 100% of the time.\n\nWhat does success look like in the game? Maintaining the grid with 100% green power for as long as possible, via strategically managing energy production and curtailment to ensure sustainability.\nPlayers experience the dual challenge of meeting growing energy demands and avoiding excess production, a dilemma central to real-world energy grids.\n\n\n\n### Final Thoughts\n\nWhile we did meet most of these goals, we definitely see room for improvement.\nFor instance, the city building aspect of the game does not exactly match what we want to teach the player. A Virtual Power Plant mainly balances the grid through smart curtailment.\nIt doesn't involve building new renewables. So we considered removing the building mechanic from the game, but we were already to deep into development.\n\nTo work around this design issue, we toyed with the idea of having a coal plant in the game, amongst others.\nThe goal was to shut down the coal plant before it fully pollutes the planet.\nAfter shutdown, players face the challenge of balancing the grid reliably using just renewable energy.\nUnfortunately, we ran out of time before we could fine-tune this part of the game.\n\n\n\n*Here's an early prototype of the coal plant that didn't make it in to the game.*\n\nAt some point, though, you have to wrap up the hackathon. So we polished what we had and declared the game \"done\".\nWhether you’re a gamer, an energy enthusiast, or someone entirely new to the topic, we hope this game sparks your interest in the energy transition :)\n\nYou can play the game right from your browser [here](https://djvisser.itch.io/grid-city)!\nIf you want to take a look at the (hackathon-quality) code, check out our [public repo](https://github.com/Vandebron/vandebron_game).","meta":{"title":"Grid City: A Hackathon Journey into the Energy Transition by Vandebron","description":"A journey into the energy transition through the lens of a video game","createdAt":"Mon Jan 27 2025 01:00:00 GMT+0100 (Central European Standard Time)","coverImage":"images/game-start-screen.png","tags":["godot","energy transition","gaming"],"author":"Dick Visser & Tomás Phelan","slug":"blog/vandebron-the-video-game","formattedDate":"27 januari 2025","date":"Mon Jan 27 2025 01:00:00 GMT+0100 (Central European Standard Time)"}}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/when-not-to-build-a-reusable-component-library.json b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/when-not-to-build-a-reusable-component-library.json similarity index 95% rename from _next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/when-not-to-build-a-reusable-component-library.json rename to _next/data/tJlUn5_CjNiSTMoSsoO6j/blog/when-not-to-build-a-reusable-component-library.json index 6317ab427..6e919cd96 100644 --- a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/blog/when-not-to-build-a-reusable-component-library.json +++ b/_next/data/tJlUn5_CjNiSTMoSsoO6j/blog/when-not-to-build-a-reusable-component-library.json @@ -1 +1 @@ -{"pageProps":{"post":{"content":"\nTwo months ago, I started my journey at Vandebron. One of the projects I first dove into was their efforts to build a [component library](https://windmolen.netlify.app/). Something I was already familiar with from previous companies I worked at. \n\nOn the internet, you can find many articles that describe why a reusable component library is a good investment for your development team(s). Although there's much to say about the advantages of component libraries, most articles don't state the (obvious) disadvantages such projects can have. In this post, I'll point out some of our learnings and why you might not need such a reusable component library.\n\n## About component libraries\n\nOften you find yourself repeating the same lines of code to make, for example, a button or the layout of a page look nice, especially when you're working on multiple projects. Or as a designer, you get frustrated every time the styling for a part of the application is off when a new page or project is created. Many companies have already found multiple solutions to preventing themselves from repeating styling, which is the main reason for design inconsistencies. And therefore component libraries were created.\n\nA component library is a collection of all the styled parts (or components) of a website or multiple websites that make it easier for developers to reuse these parts. Also, designers will know for sure that all components in the component library adhere to their designs, and therefore all projects that use these components will conform. Often these libraries consist of different layers of components, for example, offering atoms, molecules, and organisms when an [Atomic Design](https://bradfrost.com/blog/post/atomic-web-design/) pattern is applied. Following this pattern, developers can use the parts to style their templates and pages consistently.\n\nComponent libraries are becoming more and more popular with the rise of JavaScript libraries and frameworks like React and Vue. These technologies are very suitable for quickly building interactive components that you can use in your application, and can easily be exposed as a library on NPM or Github Packages. At Vandebron, we're building all our web and mobile applications with React and React Native and are using [Storybook](https://storybook.js.org/) to develop our components in a shared library between the engineering and design teams. This can potentially create a lot of advantages for both the developers and designers, as you can read below.\n\n## Why you *might* need a component library\n\nBefore deciding to create a component library for your team or company, you probably want to hear about the advantages such a project can lead to. The main advantages of component libraries are briefly mentioned in the first section above and are often defined as:\n\n- **Reducing code duplication**: With a component library, you can create components that can be shared across multiple websites or applications. This way you no longer have to duplicate styling in different projects. This can seriously decrease the amount of code duplication that you have in your projects, also reducing the number of bugs or design inconsistencies.\n\n- **Preventing design inconsistencies**: By adding all your components and styled parts to the component library you're certain that these will look the same on all the places they're used. Not only will all the components look the same on every page, when designers make a change to one of these components they can be easily updated on all the places they're used.\n\n- **Easier collaborating**: Component libraries make it easier for developers and designers to collaborate on applications and designs, with the component library as the common \"playground\". By using a tool, like Storybook, you can also make this playground visible to non-technical people and show what components are already available to use for new features.\n\nBut these advantages come at a certain price, as I'll explain in the next section.\n\n## Disadvantages of component libraries\n\nBesides the obvious advantages of a component library, it can also have serious disadvantages that are listed below. Whether or not these disadvantages apply to you depends on numerous things that are discussed later on in this article.\n\n- **Increasing complexity**: With all attempts to make code more generic, an increased level of complexity also comes to play. Reusable components should be easy to extend or customize, which requires you to think about the different use cases beforehand or force you to add many different variations to a component. With every new project that starts to use the component library, you get the risk of increasing the complexity of the library even more.\n\n- **Time-consuming**: Every time you want to add a component to your project, you need to create that component in the component library first and import it locally in the project to test it. Therefore you need to be working in multiple projects at the same time, which requires you to set up a more time-consuming workflow. Also, when you want to use this new component from the library, you have to publish a new version of the library to make the component available.\n\n- **Conflicting dependencies**: When you're using different versions of dependencies across your projects and the component library, you're forced to sync those with each other. Imagine having, for example, an older version of React running in one of your projects that doesn't use a recent React API that you want to use in your component library. In this scenario, you either have to update that project or are unable to keep your component library on par with the latest release of your dependency on React. Both solutions have pros and cons, and would rather be avoided.\n\nAs mentioned before, there are reasons why these disadvantages might apply to you that are the team size, the number of teams and projects at the company, development or release lifecycles, and how your source code is organized. It clearly doesn't make sense to invest in a component library if you have just a small amount of people work on just one project, or a sole team is working on all the different projects making it easier to manage code duplication or design inconsistencies.\n\n## Considerations before starting\n\nThere are two main alternatives that you need to take into consideration before building a reusable component library, which is (obviously) using or extending an existing component library or sourcing your code in a monorepo. \n\n- **Existing component libraries:** Using an existing component library is an efficient way to create consistently (web) pages and reduce the amount of complexity of your own project, while also taking advantage of best practices of large open-source projects. Popular examples of component libraries are [Ant Design For React](https://ant.design/docs/react/introduce) or [various implementations](https://material.io/develop) for Google's Material Design. These libraries allow you to move quickly without having all the overhead of creating complex components but limit you to the design guidelines of these component libraries.\n\n- **Monorepo:** If you don't want to take advantage of existing libraries or are very keen to apply your own styling to components across multiple applications without having to copy-paste the code, you can host the source code of applications in a monorepo. With the monorepo approach, you can create a shared folder that includes all the components used by your applications. This makes it possible to apply changes with a simple pull request and import these components from every project in that repository.\n\nBesides these two alternatives, you also need to have proper design guidelines set by your designer(s). When the design guidelines are flexible and fluctuating, you could be structuring components incorrectly with the risk of doing a lot of work that will be omitted once the project evolves.\n\n## To summarize\n\nComponent libraries are a great way to reduce the amount of code duplication in your applications, prevent design inconsistencies, and increase collaborations between developers, designers, and different teams. But this comes with increased complexity, slower development cycles, and possible code conflicts between projects. Therefore you should consider if using an existing component library or having a monorepo for your source code is a workable solution. At Vandebron we decided to build our own component library (called [windmolen](https://windmolen.netlify.app/)) and if you'd decide the same, then be sure that your design guidelines are properly structured and mature enough.\n","meta":{"title":"When (Not) To Build A Reusable Component Library","description":"You can find much information on why a reusable component library is a good investment, but most articles don't state the (obvious) disadvantages..","createdAt":"Mon Oct 05 2020 02:00:00 GMT+0200 (GMT+02:00)","coverImage":"images/when-not-to-build-a-reusable-component-library.jpg","imageSource":"https://pixabay.com/users/stevepb-282134/","tags":"React, component library","author":"Roy Derks","slug":"blog/when-not-to-build-a-reusable-component-library","formattedDate":"5 oktober 2020","date":"Mon Oct 05 2020 02:00:00 GMT+0200 (GMT+02:00)"}}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"post":{"content":"\nTwo months ago, I started my journey at Vandebron. One of the projects I first dove into was their efforts to build a [component library](https://windmolen.netlify.app/). Something I was already familiar with from previous companies I worked at. \n\nOn the internet, you can find many articles that describe why a reusable component library is a good investment for your development team(s). Although there's much to say about the advantages of component libraries, most articles don't state the (obvious) disadvantages such projects can have. In this post, I'll point out some of our learnings and why you might not need such a reusable component library.\n\n## About component libraries\n\nOften you find yourself repeating the same lines of code to make, for example, a button or the layout of a page look nice, especially when you're working on multiple projects. Or as a designer, you get frustrated every time the styling for a part of the application is off when a new page or project is created. Many companies have already found multiple solutions to preventing themselves from repeating styling, which is the main reason for design inconsistencies. And therefore component libraries were created.\n\nA component library is a collection of all the styled parts (or components) of a website or multiple websites that make it easier for developers to reuse these parts. Also, designers will know for sure that all components in the component library adhere to their designs, and therefore all projects that use these components will conform. Often these libraries consist of different layers of components, for example, offering atoms, molecules, and organisms when an [Atomic Design](https://bradfrost.com/blog/post/atomic-web-design/) pattern is applied. Following this pattern, developers can use the parts to style their templates and pages consistently.\n\nComponent libraries are becoming more and more popular with the rise of JavaScript libraries and frameworks like React and Vue. These technologies are very suitable for quickly building interactive components that you can use in your application, and can easily be exposed as a library on NPM or Github Packages. At Vandebron, we're building all our web and mobile applications with React and React Native and are using [Storybook](https://storybook.js.org/) to develop our components in a shared library between the engineering and design teams. This can potentially create a lot of advantages for both the developers and designers, as you can read below.\n\n## Why you *might* need a component library\n\nBefore deciding to create a component library for your team or company, you probably want to hear about the advantages such a project can lead to. The main advantages of component libraries are briefly mentioned in the first section above and are often defined as:\n\n- **Reducing code duplication**: With a component library, you can create components that can be shared across multiple websites or applications. This way you no longer have to duplicate styling in different projects. This can seriously decrease the amount of code duplication that you have in your projects, also reducing the number of bugs or design inconsistencies.\n\n- **Preventing design inconsistencies**: By adding all your components and styled parts to the component library you're certain that these will look the same on all the places they're used. Not only will all the components look the same on every page, when designers make a change to one of these components they can be easily updated on all the places they're used.\n\n- **Easier collaborating**: Component libraries make it easier for developers and designers to collaborate on applications and designs, with the component library as the common \"playground\". By using a tool, like Storybook, you can also make this playground visible to non-technical people and show what components are already available to use for new features.\n\nBut these advantages come at a certain price, as I'll explain in the next section.\n\n## Disadvantages of component libraries\n\nBesides the obvious advantages of a component library, it can also have serious disadvantages that are listed below. Whether or not these disadvantages apply to you depends on numerous things that are discussed later on in this article.\n\n- **Increasing complexity**: With all attempts to make code more generic, an increased level of complexity also comes to play. Reusable components should be easy to extend or customize, which requires you to think about the different use cases beforehand or force you to add many different variations to a component. With every new project that starts to use the component library, you get the risk of increasing the complexity of the library even more.\n\n- **Time-consuming**: Every time you want to add a component to your project, you need to create that component in the component library first and import it locally in the project to test it. Therefore you need to be working in multiple projects at the same time, which requires you to set up a more time-consuming workflow. Also, when you want to use this new component from the library, you have to publish a new version of the library to make the component available.\n\n- **Conflicting dependencies**: When you're using different versions of dependencies across your projects and the component library, you're forced to sync those with each other. Imagine having, for example, an older version of React running in one of your projects that doesn't use a recent React API that you want to use in your component library. In this scenario, you either have to update that project or are unable to keep your component library on par with the latest release of your dependency on React. Both solutions have pros and cons, and would rather be avoided.\n\nAs mentioned before, there are reasons why these disadvantages might apply to you that are the team size, the number of teams and projects at the company, development or release lifecycles, and how your source code is organized. It clearly doesn't make sense to invest in a component library if you have just a small amount of people work on just one project, or a sole team is working on all the different projects making it easier to manage code duplication or design inconsistencies.\n\n## Considerations before starting\n\nThere are two main alternatives that you need to take into consideration before building a reusable component library, which is (obviously) using or extending an existing component library or sourcing your code in a monorepo. \n\n- **Existing component libraries:** Using an existing component library is an efficient way to create consistently (web) pages and reduce the amount of complexity of your own project, while also taking advantage of best practices of large open-source projects. Popular examples of component libraries are [Ant Design For React](https://ant.design/docs/react/introduce) or [various implementations](https://material.io/develop) for Google's Material Design. These libraries allow you to move quickly without having all the overhead of creating complex components but limit you to the design guidelines of these component libraries.\n\n- **Monorepo:** If you don't want to take advantage of existing libraries or are very keen to apply your own styling to components across multiple applications without having to copy-paste the code, you can host the source code of applications in a monorepo. With the monorepo approach, you can create a shared folder that includes all the components used by your applications. This makes it possible to apply changes with a simple pull request and import these components from every project in that repository.\n\nBesides these two alternatives, you also need to have proper design guidelines set by your designer(s). When the design guidelines are flexible and fluctuating, you could be structuring components incorrectly with the risk of doing a lot of work that will be omitted once the project evolves.\n\n## To summarize\n\nComponent libraries are a great way to reduce the amount of code duplication in your applications, prevent design inconsistencies, and increase collaborations between developers, designers, and different teams. But this comes with increased complexity, slower development cycles, and possible code conflicts between projects. Therefore you should consider if using an existing component library or having a monorepo for your source code is a workable solution. At Vandebron we decided to build our own component library (called [windmolen](https://windmolen.netlify.app/)) and if you'd decide the same, then be sure that your design guidelines are properly structured and mature enough.\n","meta":{"title":"When (Not) To Build A Reusable Component Library","description":"You can find much information on why a reusable component library is a good investment, but most articles don't state the (obvious) disadvantages..","createdAt":"Mon Oct 05 2020 02:00:00 GMT+0200 (Central European Summer Time)","coverImage":"images/when-not-to-build-a-reusable-component-library.jpg","imageSource":"https://pixabay.com/users/stevepb-282134/","tags":"React, component library","author":"Roy Derks","slug":"blog/when-not-to-build-a-reusable-component-library","formattedDate":"5 oktober 2020","date":"Mon Oct 05 2020 02:00:00 GMT+0200 (Central European Summer Time)"}}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/greentech-hackathon.json b/_next/data/tJlUn5_CjNiSTMoSsoO6j/greentech-hackathon.json similarity index 100% rename from _next/data/unZqyVZ1CsU_nHhJXE4Yb/greentech-hackathon.json rename to _next/data/tJlUn5_CjNiSTMoSsoO6j/greentech-hackathon.json diff --git a/_next/data/tJlUn5_CjNiSTMoSsoO6j/index.json b/_next/data/tJlUn5_CjNiSTMoSsoO6j/index.json new file mode 100644 index 000000000..cabf2f4d7 --- /dev/null +++ b/_next/data/tJlUn5_CjNiSTMoSsoO6j/index.json @@ -0,0 +1 @@ +{"pageProps":{"posts":[{"content":"\n# Grid City: A Hackathon Journey into the Energy Transition by Vandebron\n\nDuring the last couple of hackathons, we set out to gamify one of the most pressing challenges of our time, the transition to green energy.\nA problem our team, VPP [Virtual Power Plant], deals with on a daily basis.\nWhat emerged was an interactive game designed to educate players about the complexities of energy grid management in a fun and manageable way,\nthough debatable if it is fun or well-balanced. It was a hackathon project after all.\n\n\n\nLet’s dive into the vision, mechanics, and what we hope players take away from this experience.\n\n### Vision: Educate Through Play\nOur goal was to create more than just a game. We envisioned a tool that serves as an onboarding experience,\nnot just for our colleagues, but also anyone interested in the energy transition.\n\nTo realize this vision we chose to go with Godot as our game engine of choice.\nAn open-source game engine that is a super fun and fantastic tool that allowed us to quickly prototype and iterate on our ideas and feedback.\n\n### The Core Gameplay Loop: Keeping the Grid Balanced\nIn this game, your primary goal is to keep the energy grid frequency within the \"goldilocks zone\", i.e. not too much power production, not too little.\nThe longer you can maintain this balance, the better!\n\n#### Key Concepts:\n- **Keeping within the goldilocks zone:** energy production must match energy demand. Fall outside the goldilocks zone, and the grid becomes unstable. If it is unstable for too long, then it's game over.\n- **Keeping up with demand:** Houses are automatically built over time, mimicking real-life construction. It’s up to the player to meet this increasing demand by manually adding renewable energy assets, like wind turbines, solar panels, and batteries.\n- **Forecasting:** Players can use weather forecasts to anticipate and plan for energy production challenges. Too much wind? Better disable some wind turbines for the time being.\n- **Curtailment:** Too much energy? Players must decide when to turn off assets to avoid overproduction. This introduces the concept of curtailment and highlights the work often required in grid management, due to not being able to store the excess energy.\n- **The Main Goal:** A 100% Green Energy Grid, 100% of the time.\n\nWhat does success look like in the game? Maintaining the grid with 100% green power for as long as possible, via strategically managing energy production and curtailment to ensure sustainability.\nPlayers experience the dual challenge of meeting growing energy demands and avoiding excess production, a dilemma central to real-world energy grids.\n\n\n\n### Final Thoughts\n\nWhile we did meet most of these goals, we definitely see room for improvement.\nFor instance, the city building aspect of the game does not exactly match what we want to teach the player. A Virtual Power Plant mainly balances the grid through smart curtailment.\nIt doesn't involve building new renewables. So we considered removing the building mechanic from the game, but we were already to deep into development.\n\nTo work around this design issue, we toyed with the idea of having a coal plant in the game, amongst others.\nThe goal was to shut down the coal plant before it fully pollutes the planet.\nAfter shutdown, players face the challenge of balancing the grid reliably using just renewable energy.\nUnfortunately, we ran out of time before we could fine-tune this part of the game.\n\n\n\n*Here's an early prototype of the coal plant that didn't make it in to the game.*\n\nAt some point, though, you have to wrap up the hackathon. So we polished what we had and declared the game \"done\".\nWhether you’re a gamer, an energy enthusiast, or someone entirely new to the topic, we hope this game sparks your interest in the energy transition :)\n\nYou can play the game right from your browser [here](https://djvisser.itch.io/grid-city)!\nIf you want to take a look at the (hackathon-quality) code, check out our [public repo](https://github.com/Vandebron/vandebron_game).","meta":{"title":"Grid City: A Hackathon Journey into the Energy Transition by Vandebron","description":"A journey into the energy transition through the lens of a video game","createdAt":"Mon Jan 27 2025 01:00:00 GMT+0100 (Central European Standard Time)","coverImage":"images/game-start-screen.png","tags":["godot","energy transition","gaming"],"author":"Dick Visser & Tomás Phelan","slug":"blog/vandebron-the-video-game","formattedDate":"27 januari 2025","date":"Mon Jan 27 2025 01:00:00 GMT+0100 (Central European Standard Time)"}},{"content":"\n## The Background\n\nWe at Vandebron have a mission to get the news out about [our good work](https://vandebron.nl/missie), and we understand that [Server Side Rendering (SSR)](https://web.dev/articles/rendering-on-the-web#server-side) can really help with that. Among other things, it provides an easy way for search engines to discover our pages, so you, our (future?!) customer, can find them more easily. That means more people choosing green energy, and ultimately, a cleaner environment! 🎉\n\n## We rolled our own\n\nThe year was 2017, Covid was still a word that sounded more like a bird than anything else... The world was heating up and Vandebron was 4 years into its mission to bring 100% renewable energy throughout all of the Netherlands.\n\nAs far as web technologies are concerned, 4 years was ages ago. It was a time when NextJS was less than a year old, and Remix was still several years from coming out. But we needed a way to deliver that high-quality content to all of you. So, the innovators that we were, we decided to build our own SSR framework. In short, we wanted pizza, but there were no pizza shops in town... So we made our own!\n\nIt's been great but not without issue...\n\n\n \n \n \n \n
\"ugly-window-mock\"\"remix-migration-mocking-a-window\"
\n\n\n\n## A Short Note: Why Server Side Rendering\n\nYou might not be satisfied with the short explanation of why we picked an SSR framework in the first place. This article isn't really about that - if you're interested in more analysis on when and where to choose an SSR framework, check out these excellent articles from Splunk:\n* [The User Experience (UX) Benefits of SSR](https://www.splunk.com/en_us/blog/learn/server-side-rendering-ssr.html)\n* [The SEO Benefits of SSR](https://www.splunk.com/en_us/blog/learn/server-side-rendering-ssr.html)\n\n## Decisions Made the Right Way - A Comparison\n\nNowadays, there are better, industry standard technologies available! I.e. pizza shops have opened nearby!! Let's find a good one. Of course, you don't want to just go to any spot. Especially if there's more than one shop in town - you'd be silly not to check which one is closest, and look at the menu. Which one has better reviews, is that one very angry customer just upset that there wasn't any anchovies in the vegan pizza shop? What were they expecting anyway?\n\"vegan-pizza-shop\"\n\nAt Vandebron we're a React shop, so we limited ourselves to just SSR frameworks supporting React. The choice of one framework over another is of crucial importance, so, as part of our analysis, we built a small part of our [vandebron.nl/blog](https://vandebron.nl/blog) page twice. Two of our engineers then presented these prototypes to our Front End Guild, and this discussion fed heavily into the Architecture Decision Record that we wrote comparing the results.\n\n\\* At Vandebron, Guilds are groups of engineers from disparate teams that are interested in a single domain: i.e. Backend, Frontend, IAM and Auth, etc. \n\nThe Background for the decision record states this:\n\n> _\"Our Frontend currently uses a custom-built, hard to maintain SSR solution, which we'd like to replace with a modern and standard library. Possible candidates are NextJS and Remix. The goal is to investigate which one suits our needs best.\"_\n\nYes, there are other options we could have considered but we wanted to stay with a tried-and-tested framework and one that was compatible with our existing React setup.\n![remix-migration-adr-options-considered.png](../images/remix-migration-adr-options-considered.png)\n\nAs you can see, the comparison between the two frameworks was very similar. In the end we favoured the simple, opinionated direction of Remix over that of the more full-featured but potentially complex setup of NextJS. Even though Remix has a smaller community, we attributed this mostly to the age of the framework and not the quality of the framework itself. Though the Positivity has gone down a bit (as listed in [the 2023 StateOfJS survey](https://2023.stateofjs.com/en-US/libraries/meta-frameworks/),) the decrease has been relatively minor and in line with most-other frameworks (notable exceptions for Astro and SvelteKit which have both seen big upticks in both Usage and Positivity)\n![State of JS Positivity](../images/remix-migration-sojs-framework-positivity.png)\nFinally, we noted that NextJS is tightly coupled with Vercel. At Vandebron we value platform independence and not getting tied to specific hosting providers or platforms. Remix gives us the independence we're looking for by providing a SSR framework without a potential to be tied into other solutions/platforms in the future.\n\nOutcome\n> _\"Most members favoured Remix’s focus on web standards and usage of standard libraries and were put off (a little) by NextJS’s uncertainty in development direction.\"_\n\n## So, How's it Going?\n\nThe migration effort is still underway but already we can report that it's going quite well - developers are excited to work on the new tech stack because it's seen as a developer-friendly platform and one of the two leading frameworks in the industry. In the words of one engineer: \"Dev experience has improved massively, it's fun, it's easy to work with\"\nHere are some of the things we still need to work on:\n- Our Docker image is quite large as it includes all the `node_modules`. We think we can clean this up a bit by using Yarn's Plug'n'Play (PnP) feature which should lead to faster image-build times and faster container startup times.\n- With our custom SSR solution, we use Redux Toolkit (RTK) and RTKQuery on the server... This is of course an anti pattern on the server, since server-side logic should be stateless. The Remix framework does already tries to be smart with it's loaders, so the benefits we might have gotten from RTK aren't needed there.\n- We feel the application we're migrating from is doing too much - it includes our marketing pages like the _Blog_ and _Mission_ pages we've been working on for the initial release, as well as the pages for our our signup and renewal process (become a Vandebron customer [here](https://vandebron.nl)!!!) This is a separate conversation, and ultimately one for the FE Guild, but the existing app's size and purpose is making the migration take longer than it should, and forcing us to put some routing rules in place to make sure the right parts of our old site are getting swapped out for the new.\n- Previously, many of the images and PDFs we used on our website were checked directly into the repo. Part of our migration to Remix made us realize we should be using a CMS for this. We are already integrated with a CMS, we just need to be making better use of it in some cases.\n- We haven't explored the Remix-specific linting rules yet. While we're confident in the existing React and TS lint rules we already have, it seems like configs like [@remix-run/eslint-config](https://www.npmjs.com/package/@remix-run/eslint-config) could be quite handy.\n","meta":{"title":"Choosing Remix as a Server-Side Rendering (SSR) Framework","description":"We had our own custom SSR framework. It was time to move on. Find out why we picked Remix over NextJS as the replacement!","createdAt":"Fri Oct 18 2024 02:00:00 GMT+0200 (Central European Summer Time)","coverImage":"images/remix-migration-remix-vs-nextjs.png","tags":["remix","ssr","typescript","react","nextjs","ADR"],"author":"John Fisher","slug":"blog/choosing-remix-as-an-ssr-framework","formattedDate":"18 oktober 2024","date":"Fri Oct 18 2024 02:00:00 GMT+0200 (Central European Summer Time)"}},{"content":"\n\n## Salesforce + FlowRunner golden age\n\nSince 2015, Vandebron has been using Salesforce. At the time, Salesforce for Vandebron, was like a Swiss Army knife - versatile, multifunctional, and seemingly capable of addressing most of the business requirements. It quickly became the central hub for various operations - it became a workspace for agents, a CTI platform, a platform to send service emails and much more. Over time, Salesforce evolved beyond just a customer relationship management tool for Vandebron. It became a full-fledged platform that managed customer-related processes, such as the Signup process, Renewal process, Meter Reading process, etc. \nTo support this transition, Vandebron developed a custom mechanism known as FlowRunner, which was designed to automate and execute these processes within Salesforce.\nInitially, FlowRunner seemed like the perfect solution. It was tailor-made to handle the increasingly complex workflows that Vandebron needed to manage. While it successfully managed to support Vandebron’s operations for several years, this system was not without its flaws. These issues, which will be discussed in detail later, eventually led to the need for a more robust and scalable solution. But for a time, FlowRunner did its job, enabling Vandebron to leverage Salesforce far beyond its original purpose.\n\n\n## Salesforce + FlowRunner solution problems\n\n\nBroadly, the problems can be divided into two categories: technical and organizational.\n\nTechnical Problems: \n- Async Transactions Daily Limit. 250000 async transactions per 24 hours. For bulk processes, it is often not enough. We need to watch it carefully and adjust settings to avoid disaster.\n- Number of concurrent async jobs. Up to 5 async jobs simultaneously. \n- The FlowRunner mechanism in Salesforce creates lots of data. It uses ~ 25% of our storage. Data is expensive in Salesforce. \n- The Salesforce platform is not equipped for a custom BPM solution.This makes the Vandebron Salesforce codebase too large to be used with Salesforce DX (Salesforce CI/CD product). Furthermore, it forces us to maintain a lot of custom code that is available on the market.\n\nOrganizational Problems:\n- Centralization of Customer-Related Processes: With most customer-related processes embedded in Salesforce, any changes to these processes require intervention from the Salesforce team. This centralization creates a bottleneck, as all modifications, updates, and optimizations must pass through a single team, slowing down the overall pace of innovation and response.\n- Domain Overlap and Knowledge Dilution: The Salesforce team at Vandebron is responsible for managing approximately 50 different processes, each belonging to various business domains. This wide scope of responsibility leads to a dilution of expertise, as the team cannot maintain deep knowledge of every process. The result is a lower overall level of understanding and efficiency, making it difficult to ensure the smooth operation and timely updates of all processes.\n\n\n\n## Point of no return\n\nAt the beginning of 2022, Europe was hit by an unprecedented energy crisis. Gas and electricity prices skyrocketed, fluctuating unpredictably, and placing immense pressure on energy providers like Vandebron to adapt swiftly. In response, Vandebron introduced a solution designed to navigate this volatile market: the Flexible Variable Tariffs proposition.\nFrom a technical standpoint, implementing this new offering required the execution of a relatively complex process - Flow_VariableTariff for approximately 50% of our customer base. However, it soon became clear that the FlowRunner mechanism and Salesforce in general were not sufficient to handle the demands of this new process. The total execution time for Flow_VariableTariff was projected to be enormous, spanning over 20 days, which was far too long for a business that needed to respond rapidly to market changes.\nRecognizing the urgency of the situation, we immediately sought ways to optimize the process. While we succeeded in significantly simplifying Flow_VariableTariff, these improvements alone were insufficient to meet our needs. It was at this critical juncture that we realized Salesforce and the FlowRunner were no longer adequate for Vandebron’s evolving requirements. The limitations of these tools became glaringly apparent, signaling the need for a more powerful and flexible solution to support our operations in the face of such a dynamic and challenging environment.\n\n\n## Why Camunda?\n\nChoosing the right process orchestration tool is a critical decision, especially for a company like Vandebron, where efficient workflow management is essential for operational success. To ensure we made the best choice, we began by establishing a set of criteria that the new tool needed to meet. These criteria were designed to address our current challenges and future-proof our operations. Here are some of the most crucial criteria:\n- Compliance with BPMN 2.0 Standard: We prioritized tools that adhered to the BPMN 2.0 standard. This would make any future migration to another tool less painful, ensuring a smoother transition if needed.\n- CI/CD Integration: The ability to seamlessly integrate the tool with Vandebron's CI/CD pipeline was crucial. This integration would allow us to automate deployments, streamline updates, and maintain a high level of consistency across our development processes.\n- Support for Multiple Programming Languages: Given our diverse technology stack, we needed a tool that allowed us to implement flowstep logic in multiple programming languages, with a particular emphasis on supporting Scala, which is heavily used within our systems.\n- Unit Testing: The tool had to enable us to unit-test individual steps and parts of flows. This capability was essential for ensuring the reliability and accuracy of our processes before they were deployed to production.\n\nOur market analysis of process orchestration tools led us to evaluate five potential solutions:\n- Camunda 8\n- IBM Business Automation Workflow (BAW)\n- Bonita\n- Kogito\n- Flowable\n\n\nEach vendor provided us with a demo and/or a trial version of their product. During this evaluation process, we rigorously tested each tool against our criteria. Although all five options met our hard requirements, it quickly became evident that Camunda is the true leader in the market.\n\nSeveral factors contributed to our decision to choose Camunda:\n\n- SaaS Offering: Camunda's SaaS version provided us with the flexibility and scalability we needed, reducing the burden on our infrastructure and allowing us to focus on process management rather than platform maintenance.\n- Comprehensive Documentation: Camunda's clear and well-organized documentation made it easier for our teams to learn and implement the tool effectively, reducing the learning curve and speeding up the integration process.\n- Out-of-the-Box Connectors: Camunda offers a wide range of connectors right out of the box, enabling quick integration with various systems and services. This saved us time and effort, allowing us to implement new workflows faster.\n- User-Friendly Interface: The tool's intuitive and clean UI made it accessible to both technical and non-technical users, facilitating collaboration across teams and improving overall efficiency.\n- Responsive Support: Camunda's quick and helpful support was another decisive factor. Their team was readily available to assist us with any issues or questions, ensuring a smooth onboarding experience.\n\nIn the end, Camunda stood out as the optimal choice for Vandebron’s process orchestration needs, offering the perfect balance of functionality, usability, and support.\n\n## First steps with Camunda\n\nBefore we could begin migrating our processes from Salesforce to Camunda, it was essential to establish a robust infrastructure that would allow Camunda to seamlessly integrate with the rest of Vandebron’s ecosystem, particularly Salesforce. Since Salesforce would continue to serve as the primary workspace for our agents, we needed to ensure smooth communication and data flow between the two platforms. To achieve this, we developed several key infrastructural applications:\n\n- CamundaGateway: Camunda API (Zeebe API) operates using the gRPC protocol, which is not natively supported by Salesforce. To bridge this gap, we created the CamundaGateway, a proxy application that translates HTTP calls into a format that Zeebe API can understand. This application acts as an intermediary, enabling effective communication between Salesforce and Camunda.\n- CamundaSync: Each Camunda process instance has a corresponding representation in Salesforce. To keep the status of these instances up to date across both platforms, we implemented CamundaSync. This job regularly pulls the status of process instances from Camunda and updates the relevant records in Salesforce, ensuring that agents always have access to the most current information.\n- CamundaJobWorker: Not all process steps can be handled by simple connectors like the RestConnector. Some steps are more complex and require custom logic to be executed. To manage these, we developed the CamundaJobWorker service, which contains handlers for these complex process steps. This service allows us to extend Camunda’s capabilities and handle sophisticated workflow requirements efficiently.\n- BPM app (React): Certain processes require input from users, particularly agents working within Salesforce. To facilitate this, we built the BPM app, which includes a set of forms necessary for running specific processes. This application ensures that agents can interact with and influence the workflow directly from their workspace, maintaining the user experience they are accustomed to.\n\n\n![A schematic overview of the camunda infrastructure](../images/camunda_infrastructure.png \"A schematic overview of the camunda infrastructure\")\n\nAs of September 2024, we have successfully implemented the basic infrastructure needed for Camunda integration, and three customer-related processes have been migrated from Salesforce to Camunda, with several more in progress. \nIt's important to highlight that the migration process involved a comprehensive analysis of the existing process, including the removal of legacy components, identification of common errors, and targeted optimization efforts. As a result, we achieved a substantial reduction in errors. Specifically, the Flow_Renewal process, which previously had a 2% failure rate, now experiences only a 0.62% dropout rate post-migration, reflecting a 69% decrease in errors.\n\n\n## Future plans\n\nBy the end of the year, we aim to migrate up to 10 processes to Camunda, further reducing our reliance on Salesforce for process orchestration. In parallel, we plan to enhance our infrastructure applications—CamundaGateway, CamundaSync, CamundaJobWorker, and the BPM frontend app - to improve their performance, scalability, and ease of use. These enhancements will ensure that our systems remain robust and efficient as we expand our use of Camunda across more of Vandebron's operations.\nMoving forward, We will continue to leverage Camunda's capabilities to automate and optimize more processes, ultimately driving greater efficiencies and innovations across Vandebron.","meta":{"title":"Camunda BPM migration","description":"Migration from Salesforce Flow_Runner to Camunda BPM","createdAt":"Wed Sep 04 2024 02:00:00 GMT+0200 (Central European Summer Time)","coverImage":"images/camunda-rising.png","tags":["salesforce","camunda","bpm","process_orchestration"],"author":"Andrei Karabovich","slug":"blog/salesforce-camunda-bpm-migration","formattedDate":"4 september 2024","date":"Wed Sep 04 2024 02:00:00 GMT+0200 (Central European Summer Time)"}},{"content":"\n# Cassandra, it’s not you, it’s us\n\nI want you to know that you are probably an amazing product that has so much to offer to the world. However, it sadly just isn’t working out for us anymore.\n\nWe've encountered challenges such as escalating costs, inconsistent write and read performances, and setup misalignments that have constrained our growth. Of course, this is not entirely your fault, we set you up to fail with our infrastructure and use cases.\n\nI hope we can part on good terms, with mutual respect and appreciation for the time we shared. \nI wish you all the happiness, success, and fulfilment in the world, and I hope you find a company that complements your life in the way you deserve.\n\nThank you for understanding, and I truly wish you the best.\n\nYours truly, Vandebron\n\n## Our Data Storage Prince Charming\n![data-prince-charming.jpg](../images/data-prince-charming.jpg \"Data Prince\")\n\nA list of some of the qualities we are looking for:\n- Kindness and compassion. \n- High availability.\n- Low Maintenance.\n- Ability to store large volumes of data (currently around 10TB), though not everything has to be queried fast.\n- Capable of ingesting real-time energy usage data (every 15 minutes per customer, possibly higher frequency in the future).\n- Ideally, we can use our current tech stack as much as possible (flyway migrations, roundtrip tests, spark).\n- Ideally, use as few different database technologies as possible.\n- It does not need to be horizontally scalable, due to moving from 1 central data storage to a separate data storage per service.\n\nWith enough work, time and commitment, Cassandra could have fulfilled most of these requirements. However, love is a two-way street, and we didn't put in the time and effort to make it work.\n\n## Speed Dating Round\nSome potential suitors we considered for replacing Cassandra:\n\n#### ScyllaDB\nScyllaDB is very similar to Cassandra. It should have better performance but still have (almost) all the same functionality as Cassandra.\n\n#### PostgreSQL\nPostgreSQL is a relational database. We already use it extensively in our services.\n\n#### Cockroach\nIt is similar to PostgreSQL but with some limitations: [Known Limitations in CockroachDB v23.2](https://www.cockroachlabs.com/docs/stable/known-limitations.html)\n\nIt is horizontally scalable, which is an advantage over PostgreSQL when it comes to high availability and fault tolerance. We are also currently using it in some of our services.\n\n#### Timescale\nTimescale is a PostgreSQL extension that uses the same query layer, but a different storage layer, to have efficient time series-related features.\n\nIt can also distribute data, but this is still in early access and is not recommended.\n\n#### Yugabyte\n\nYugabyte is a PostgreSQL extension to make PostgreSQL into a distributed database.\n\n## Comparisons\n\nTo determine the most suitable match, we did some quick performance tests. One where we inserted 2 million + weather data records as fast as possible via recurring inserts, to see how easy it would be to migrate over to. And another test to determine general query speed.\n\n### Write Speed Results\n![insert-perf-database.jpg](../images/insert-perf-database.jpg \"Insert Graph\")\n\nNote that the test results are not 100% fair, because Timescale and Postgres don’t have to distribute the data over multiple nodes (though Timescale does have 2 replicas), and Cassandra already contained a lot of data (though with some testing timescale didn’t seem to become slower when it already had more data). For Yugabyte and Cockroach, we gave up after 1 hour. Also, the tests were done with the existing setup for Cassandra.\n\n### Query Speed Results\n![query-perf-database.jpg](../images/query-perf-database.jpg \"Query Graph\")\n\nWe also did some tests to query aggregated data from streaming data.\n- For this, we copied over 2.6M rows to each database.\n- For this data we need to aggregate (sum) some values per 15-minute time block).\n- For Cassandra/Scylla, this is done via spark.\n- For timescale use buckets based on timestamps.\n- For Postgres by grouping on floor(extract(epoch from timestamp) / 60 / 15)\n\n## Our Happily Ever After\n\nTimescale emerged as the clear winner here, not just for its performance in the above tests, but also for its seamless integration with our existing PostgreSQL setup. This compatibility allows us to maintain our current libraries and reduce code complexity, making Timescale an ideal choice for our time series data. At the same time, we continue to rely on Postgres for our other needs.\n\nCassandra, you won’t be missed.","meta":{"title":"Cassandra, it’s not you, it’s us","description":"Our Journey to find the perfect data storage solution for us","createdAt":"Fri Feb 16 2024 01:00:00 GMT+0100 (Central European Standard Time)","coverImage":"images/heart-breaking.jpg","tags":["cassandra","timescale","postgresql"],"author":"Tomás Phelan","slug":"blog/cassandra-its-not-you-its-us","formattedDate":"16 februari 2024","date":"Fri Feb 16 2024 01:00:00 GMT+0100 (Central European Standard Time)"}},{"content":"\nThe title of this article could have also been \"*Getting Rid of an Unmanageable Legacy Data Model*\", but after a year-long migration project the current title does more justice to the progress made. \n\n#### Compiled Legacy as a Data Model\n\nOur former data model was a series of parallel custom python jobs all covering every step of the *Extract-Transform-Load* (ETL) process from sources into report. Specific transformation got performed a numerous amount of times in multiple different jobs, daily. This made us prone to bugs, slow on development and maxing out on compute. \n\nThe situation became so pressing that keeping alive simple reporting to the business became a daily burden on the Data Analytics team, limiting resources for advanced analytics and leveraging data sources for competitive insights.\n\nWe concluded the old set-up to be outdated and looked around for current best practices concerning data infrastructure. Trying not to reinvent the wheel and staying away from designing custom solutions that had bitten us in the past, we decided to adopt a combination of *Snowflake*, *dbt* and *Lightdash* to start forming a new data landscape.\n\nThis revamping of the set-up gave us the opportunity to start over, using the power of *dbt* to create a modular data model where you could leverage different stages of data, while creating shared definitions, a single source of truth and documentation.\n\n#### What We Came Up With?\n\nWe went for a pretty classic *dbt* data model design, introducing 5 layers of data: staging, entity, intermediate, mart and api. Each layer serving a specific purpose.\n\n##### Staging\n\nWith all data coming in from different sources, this is where we ensure the data all adheres to the same conventions and formatting. This introduces a nice developer experience for the next layers, by introducing consistency across different sources. It also serves as the go to place for advanced or deep dive analysis that do not get answered by the downstream layers, which could potentially spark data modelling developments.\n\n##### Entity\n\nAfter uniforming the data, we create entities that form the building blocks of the downstream layers and analyses of our business analysts. We built entities along the core aspects of our product, capturing shared definitions in data and bringing together relevant features using the *One-Big-Table* (OBT) principle. We try to refrain from long queries or extensive use of CTE's, resulting in simplistic models. These models serve our business analysts by reducing the complexity of their queries with all joins and filters taken care of, denormalizing the database structure. This has shifted the place where ad-hoc BI requests are fulfilled from the central data team to the domain business teams, applying principles of a data mesh.\n\n##### Intermediate\n\nWith some models rising in complexity and computation, we use the intermediate layer to split this complexity and computation across multiple models. These intermediate models are rarely queried because they serve no reporting or analytical purpose. Think of incremental date spine explosions or highly complex business logic broken down into multiple models.\n\n##### Mart\n\nThis is the main layer where we provide self-service to less technical employees within the organization, creating ready-made tables. We aggregate along date spines and dimensions to create readable models. It is where we leverage *Lightdash* metrics to create dynamic tables to provide business teams with a certain amount of freedom in terms of the granularity and dimensions they want to report on in their dashboarding. The use of entities as building blocks has aligned reporting across domain business teams, creating a single and centralized source of truth and relieving the data team from explaining distinctions. So while the dimensions can be tweaked for specific use cases, the definitions of the metrics are set in code.\n\n##### API\n\nWith some dependencies outside of the data model, we use an API layer on top of our mart to record exposures towards different services and provide views which explicitly contain only the necessary datapoints.\n\n![A schematic overview of the data model structure](/images/schematic_data_layers.jpg \"A schematic overview of the data model structure\")\n\n#### The Process\n\nWe decided to take advantage of the chaos created by the old situation: no real single source of truth gave us the opportunity to create a truth. Investigating business teams' needs, we created data definitions in entities. We kept a pragmatic approach to these definitions, being flexible towards business teams' specific needs but also limiting the allowed complexity or number of exceptions. The new data model should answer everyone's questions, but should also be understood by everyone.\n\nWe forced ourselves to have descriptions for all data from the entity layer onwards, because only defining and describing the entities in code is not enough. We leveraged the embedded business analysts' knowledge to form the descriptions, noting that the best description is the one the user understands (because they wrote it).\n\nWith the ready-made marts in place, we decided to give away most of the dashboarding responsibility to the business teams. The embedded analysts are very apt at defining and designing their relevant insights into dashboards. The central data team only took ownership of company wide dashboards and provided support on the dashboarding where necessary.\n\nAfter the adoption of the new stack, we noticed that the more technical embedded analysts were very interested in learning a new tool and language. So, we started a data model group and onboarded multiple embedded business analysts as data model developers. This has massively increased the speed of development of the data model. Primarily, because of specific business domain knowledge not needed to be transferred to the developers in the central data team first, but the knowledge holders developed models themselves. The central data team took on a different role: providing infrastructural support, improving on efficiency, monitoring costs and creating a vision and strategy for organic but structured growth.\n\n![A schematic overview of the final self-servicing data model product](/images/schematic_data_product.jpg \"A schematic overview of the final self-servicing data model product\")\n\n#### What Did We Learn?\n\nFew key takeaways:\n\n- Some business teams have more requirements in terms of definitions than other teams, so if other teams allow, be pragmatic and just go for the stricter requirements.\n- Enabling self-service analysis means giving away control, take this into account in your data descriptions. They should be clear and concise.\n- Educate users on the designed structure of the data model, explain what layer serves which purpose and what questions can be answered how and where.\n- Create clear communication and support channels for the business to kickstart the adoption, you are not the only one learning a new tool.\n- Data is not only for the data team, so encourage those passionate and enthusiastic analysts to co-create! (Just keep an eye on the project.) ","meta":{"title":"Creating a Self-Service Data Model","description":"How we migrated to a modern data stack to enable self-servicing across the business","createdAt":"Wed Feb 07 2024 01:00:00 GMT+0100 (Central European Standard Time)","coverImage":"images/self_service.jpg","tags":["dbt","snowflake","lightdash","datamodel","self-service"],"author":"Mats Stijlaart","slug":"blog/creating_a_self-service_data_model","formattedDate":"7 februari 2024","date":"Wed Feb 07 2024 01:00:00 GMT+0100 (Central European Standard Time)"}},{"content":"\n\n# Authenticate Snowflake rest api via Keycloak\n\nHere in Vandebron we use Keycloak as our identity and access management (IAM) solution and Snowflake as our data warehousing platform. \nKeycloak is a powerful and extensible solution for managing user identities and access control, making it a popular choice for organizations seeking a comprehensive and open-source IAM platform.\nSnowflake is designed to handle and analyze large volumes of data with speed and efficiency. It is known for its scalability, flexibility, and ease of use in managing and analyzing diverse and massive datasets.\n\n## Accessing Snowflake data via Rest API\n\nThere are several ways to access data in Snowflake one of these are the Snowflake rest api, they are a comprehensive set of REST APIs for managing and interacting with various aspects of the Snowflake Data Cloud, including account management, data loading, querying, and more.\nThese REST APIs allow developers to programmatically perform tasks such as executing SQL queries, managing virtual warehouses, and administering user roles. They are designed to enable automation and integration with other applications and services.\n\n## Why via Rest Api?\n\nThe Snowflake SQL API is a REST API that you can use to access and update data in a Snowflake database. You can use this API to develop custom applications and integrations that can perform most of the queries you need. More info here: [Snowflake rest api](https://docs.snowflake.com/en/developer-guide/sql-api/index)\n\nWe decided to connect our microservices to snowflake via rest api mainly because we consider this mechanism the best way to decouple database processing with backend processing in fact the queries issued via the endpoint are processed inside Snowflake ecosystem asynchronously.\n\nThe service can poll snowflake to monitor the request until it is completed. See [Sql api response](https://docs.snowflake.com/en/developer-guide/sql-api/handling-responses) .\n\nUsing api communication has other very good benefits:\n\n- No additional library dependency\n- No Additional spark connectors\n- Since there is no way to run snowflake on a local machine unit test a snowflake connection would have been very hard ( impossible ). With Rest api communication we can unit test snowflake api client using contract test. ( one way contract test is better than nothing )\n\n## Snowflake Authentication\n\nSnowflake provides a convenient way to authenticate to it using “any” OAuth authentication server. Our authentication server is Keycloak so in the following sections you will learn how to integrate Keycloak with Snowflake.\nResources to this topic can be found here [auth-ext-overview ](https://docs.snowflake.com/en/user-guide/oauth-ext-overview) and here: [oauth-ext-custom](https://docs.snowflake.com/en/user-guide/oauth-ext-custom)\n\n\n## Keycloak side\n\nYou need to configure your client to return in the JWT access token the following claims:\n\n```json\n{\n \"aud\": \"\",\n \"iat\": 1576705500,\n \"exp\": 1576709100,\n \"iss\": \"\",\n \"scope\": [\n \"session:role-any\"\n ]\n}\n```\n\nmost of them are returned by default. Aud claims is the only one you should add\nTo add `aud` claim you can add a new mapper to your client with type Audience see image:\n\n![keycloak_aud.png](../images/keycloak_aud.png \"Keycloak aud mapper\")\n\n**Note**: You need to add a custom audience with the value **equal** to the login_name attribute value in snowflake. The audience value will be used to look up to the right user in snowflake integration\n\nThen you need to add the snowflake scope to your scope list: session:role-any\nFinally you can check that your token is correct:\n\n```json\n{\n .....\n \"iss\": \"https://test.vdbinfra.nl/auth/realms/vandebron\",\n \"scope\": \"session:role-any\",\n \"aud\": \"energy-trading-test\",\n ....\n}\n```\n\nThe `aud` must contain only the snowflake login_name. For instance, a token such as the following will not work (multiple audiences):\"aud\": [ \"batterypack-services-test\", \"account\" ],\n\n## Snowflake side\n\nHow to find keycloak public key: [stackoverflow](https://stackoverflow.com/a/57457227)\nRequired: `ACCOUNTADMIN` rights in Snowflake.\nExample integration command:\n\n```sql\ncreate or replace security integration external_oauth_keycloak_test\ntype = external_oauth\nenabled = true\nexternal_oauth_type = custom\nexternal_oauth_issuer = 'https://test.vdbinfra.nl/auth/realms/vandebron'\nexternal_oauth_rsa_public_key = ''\nexternal_oauth_audience_list = ('energy-trading-test')\nexternal_oauth_scope_mapping_attribute = 'scope'\nexternal_oauth_token_user_mapping_claim = 'aud'\nexternal_oauth_any_role_mode = 'ENABLE'\nexternal_oauth_scope_delimiter = ' '\nexternal_oauth_snowflake_user_mapping_attribute = 'login_name';\n```\n\nNote: the external_oauth_scope_delimiter setting must be enabled separately by Snowflake support.\nNext, you need to set the login name for the user you want associate with the integration:\n\n![snowflake_auth_conf.png](../images/snowflake_auth_conf.png \"Snowflake auth configuration\")\n\n### Example\n\nLet’s authenticate with keycloak as we do normally:\n\n```curl\ncurl --location --request POST 'https://keycloak.test-backend.vdbinfra.nl/auth/realms/vandebron/protocol/openid-connect/token/' \\\n--header 'Content-Type: application/x-www-form-urlencoded' \\\n--data-urlencode 'grant_type=client_credentials' \\\n--data-urlencode 'client_id=energy-trading' \\\n--data-urlencode 'client_secret='\n```\n\nNow you should get the token. Optional: van verify the token directly in snowflake with SQL:\n\n```sql\nSELECT SYSTEM$VERIFY_EXTERNAL_OAUTH_TOKEN( '' )\n```\n\nUse it in the snowflake statement endpoint. For example:\n\n```curl\ncurl --location --request POST 'https://.eu-central-1.snowflakecomputing.com/api/v2/statements?async=true' \\\n--header 'Authorization: Bearer \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n\"statement\": \"select \\\"data\\\" as prediction, to_number(\\\"lats\\\", 10, 4) as lats, to_number(\\\"lons\\\", 10, 4) as lons, \\\"scaledValueOfFirstFixedSurface\\\" as scaled_value_of_first_fixed_surface, to_timestamp_tz( concat(\\\"dataDate\\\", lpad(\\\"dataTime\\\", 4, 0)) || '\\''+0'\\'', '\\''yyyymmddhh24mi+tzh'\\'') as model_datetime, to_timestamp_tz( concat(\\\"validityDate\\\", lpad(\\\"validityTime\\\", 4, 0)) || '\\''+0'\\'', '\\''yyyymmddhh24mi+tzh'\\'') as predicted_datetime, insert_date_snowflake, current_timestamp()::timestamp_tz(9) as insert_date_staging from raw.icon_eu.alhfl_s;\"\n}'\n```\n\nNB: It is important to use the proper snowflake base url. In my case I am using https://.eu-central-1.snowflakecomputing.com/ where is my account identifier which was authorised during configuration phase the snowflake user the token is referring to in the clientId claim.\nYou should get a response such as:\n\n```json\n{\n \"code\": \"333334\",\n \"message\": \"Asynchronous execution in progress. Use provided query id to perform query monitoring and management.\",\n \"statementHandle\": \"01aafc80-3201-abed-0001-4a0e00e52816\",\n \"statementStatusUrl\": \"/api/v2/statements/01aafc80-3201-abed-0001-4a0e00e52816\"\n}\n```\n\nNow you can follow the async operation to the following get endpoint:\n\n```http\nhttps://.eu-central-1.snowflakecomputing.com/api/v2/statements/01aafc80-3201-abed-0001-4a0e00e52816\n```\n\nIt will return 202 if the processing is still ongoing. It will return 200 and the actual result when processing ends.\n\nHappy coding!","meta":{"title":"Authenticate Snowflake via Keycloak","description":"How to use Keycloak to authenticate against Snowflake rest api","createdAt":"Tue Dec 19 2023 01:00:00 GMT+0100 (Central European Standard Time)","coverImage":"images/snowflake_keycloak.jpg","tags":["keycloak","snowflake","rest","oauth","bearer token","authentication","security"],"author":"Rosario Renga","slug":"blog/authenticate-snowflake-rest-api-using-keycloak","formattedDate":"19 december 2023","date":"Tue Dec 19 2023 01:00:00 GMT+0100 (Central European Standard Time)"}},{"content":"\nIn our sustainable journey at Vandebron, we are not only striving to revolutionize the renewable energy sector, but we are also rethinking how we interact with technology ourselves. As a part of this initiative, we have been looking at how to reduce our digital footprint. One of our most recent projects involves transforming our ageing fleet of iMacs into revitalized, lightweight machines. \n\nWe proudly introduce the 'flexMac'.\n\n### Regained speed, sustainability and enhanced security\nOur customer contact department, the core of our operation, was equipped with older iMacs running on slower HDD drives. While replacing these machines with newer models might have been the easier route, it didn't align with our commitment to sustainability. \n\nInstead, we decided to be creative and look for ways to upcycle our older iMacs. Our choice of tool? Google's ChromeOS Flex. As the slogan suggests, [‘don’t bin it, just flex it’](https://www.linkedin.com/feed/update/urn:li:activity:7066377989831233536/) we figured this could very well meet our wishes. By installing this onto our iMacs, we have given birth to our new line of workstations, naming them 'flexMacs'.\n\n[ChromeOS Flex](https://chromeenterprise.google/os/chromeosflex/) is a free, open-source operating system by Google that breathes [new life into older PCs and Macs](https://cloud.google.com/blog/products/chrome-enterprise/chromeos-flex-ready-to-scale-to-pcs-and-macs). It's lightweight, fast, and ideal for the web-centric applications and services our customer contact department uses every day. Once ChromeOS Flex was installed, the transformation was remarkable. The old machines metamorphosed from very slow to production-ready again in a breath, adept at handling all our workflows at the Customer Contact department.\n\nThese workflows at Customer Contact are fully web-based. It enables us multichannel support, integration capabilities, and data-driven insights. These help our support agents to provide personalized and efficient service across various communication channels. By using these technologies and insights, we optimize our customer service strategies, leading (hopefully) to higher customer satisfaction.\n\nAnother important benefit of this transformation was an added layer of security. ChromeOS Flex allows our users to log in using their Google identity, ensuring a personalized and secure workspace for every team member. This means each user experiences a secure, tailored environment, whilst bringing an additional level of security and control to our IT operations.\n\n### The importance of circularity\nBesides the operational benefits, the broader environmental impact of this initiative is important to us. By extending the life of our technology, we contribute directly to reducing e-waste, one of [the fastest-growing waste streams in the EU](https://www.europarl.europa.eu/news/en/headlines/society/20201208STO93325/e-waste-in-the-eu-facts-and-figures-infographic). As a company, Vandebron is not only promoting sustainable innovations but striving to actively embody them. Our 'flexMacs project is a testament to this commitment.\n\nOur 'flexMacs' project demonstrates how we can repurpose and upgrade older hardware, which according to Emerce is a [hot thing to do](https://www.emerce.nl/achtergrond/circulaire-hardware-is-hot-dit-is-waarom). We hope this blogpost inspires you to consider similar sustainability initiatives. By choosing to upgrade rather than replace, we extend the life of existing hardware and contribute to a reduction in e-waste.\n\nStay tuned for more updates from our tech-driven sustainability journey.\n","meta":{"title":"Sustainable Tech-Hardware - Introducing the 'flexMac'","description":"Enhanced security, sustainability, and regained speed at Customer Contact revitalizing our old iMacs.","createdAt":"Mon Jul 03 2023 02:00:00 GMT+0200 (Central European Summer Time)","coverImage":"images/circular.jpeg","tags":"sustainable-tech, flexmac, circularity","author":"Gehdrio Lake & Sietse Bruinsma","slug":"blog/sustainable-tech-hardware","formattedDate":"3 juli 2023","date":"Mon Jul 03 2023 02:00:00 GMT+0200 (Central European Summer Time)"}},{"content":"\n\n### Amazon embraces the mighty monolith\n\n\"image\n\nIn March 2023, Amazon published a [blog post](https://www.primevideotech.com/video-streaming/scaling-up-the-prime-video-audio-video-monitoring-service-and-reducing-costs-by-90)\n, detailing how they had managed to reduce the cost of their audio-video monitoring service by 90%.\nThe _key_ to this reduction was migrating from a distributed, microservice architecture to a _monolith_.\nThe blog post went viral, prompting some software industry celebrities to \n[question](https://world.hey.com/dhh/even-amazon-can-t-make-sense-of-serverless-or-microservices-59625580) the entire concept of microservices.\n\n### What should we learn from this?\n\nSo, does this mean microservices are fundamentally flawed? Should we all migrate back to monoliths?\n_No_ and _definitely no_ I would say. Instead, my takeaways from this article are:\n\n1. **Microservices aren't about scaling for performance.** At least not primarily. Although horizontally scalability for computationally intensive operations _can_ be very useful or even essential in some cases, it tends to be a rare benefit. Very often, performance bottlenecks are IO bound and caused by external systems beyond your control. Nevertheless, there _are_ other compelling reasons to consider microservices: they _force_ you to communicate via contracts, _encourage_ you to organize your functionality around domains, and _allow_ you to scale your organization. Of course, all this comes at considerable costs. There's no [free lunch 👇](#presentation).\n2. Don't underestimate the power of a single CPU in 2023. To judge whether a process is unreasonably slow or not, I tend to think of the fact that already in the 1990s, screens showed 65K pixels at any given time. Back then, multiple arithmetic calculations (additions, subtractions) could be performed for each pixel, fifty times per second. Nowadays, your screen probably displays more than 5 Million pixels at once. So, if the amount of datapoints you are dealing with in the order of millions, you should generally be able to process them in a matter of seconds on a single machine. If you can't, you may be doing something very inefficient.\n3. **Software engineering is hard**. Mistakes are made all the time, everywhere. Even at the big 4 tech companies. Kudos to Amazon 👏 for openly sharing the mistake they made so that we may all learn.\nIn the next section I will share one of our own experiences, not entirely different from the Amazon example.\n\n### The 90% cost reduction case at Vandebron\n\n#### Microservices or just distributed computing?\nConsidering that all the functionality used in the Amazon case belongs to the same _domain_, it arguably does not even serve as \na case against improper use of microservices, but instead a case against misuse *distributed computing*.
\nLet's look into an example of misuse of distributed computing at Vandebron now.\n\n#### Predicting the production of electricity\nFor utility companies, accurately predicting both electricity consumption and production is crucial.\nFailing to do so can result in blackouts or overproduction, both of which are [very costly](https://vandebron.nl/blog/hoe-houdt-onze-technologie-het-energienet-in-balans).\nVandebron is a unique utility company in that the electricity that our customers consume is produced by a [very large\namount](https://vandebron.nl/energiebronnen) of relatively small scale producers, who produce electricity using windmills or solar panels.\nThe large number and the weather dependent nature of these producers make it very hard to predict electricity generation accurately.\n\nTo do this, we use a machine learning model that is trained on historical production data \nand predictions from the national weather [institute](https://www.knmi.nl/). As you can imagine, this is a computationally intensive task, involving large amounts of data.\nFortunately, we have [tooling in place](https://www.vandebron.tech/blog/fueling-the-energy-transition-with-spark-part-1) that\nallows us to distribute computations of a cluster of machines if the task is too large for a single machine to handle.\n\nHowever, here's the catch: the fact that we _can_ distribute computations does not mean that we should. Initially it seemed that\nwe couldn't analyze the weather data quick enough for the estimation of our production to still be a _prediction_\nrather than a _postdiction_. We decided to distribute the computation of the weather data over a cluster of machines.\nThis worked, but it made our software more complex and Jeff Bezos even richer than he already was.\n\nUpon closer inspection, we found an extreme inefficiency in our code. It turned out that we were repeatedly reading the entire weather dataset\ninto memory, for _every_ single \"pixel\". After removing this performance bug, the entire analysis could _easily_ be done\non a single machine. \n\n### What more is there to say? \n\n\nSo if microservices aren't about performance, what _are_ they about? If I had to sum it up in one sentence It would be:\n> _Microservices are a way to scale your organization_\n\nThere is a lot of detail hiding in that sentence, which I can't unpack in the scope of this article. If you're interested\nwhat microservices have meant for us, I would recommend you watch the presentation below.\n\n\n#### Microservices at Vandebron\nAt [Vandebron](https://vandebron.nl/), we jumped onto the \"microservice bandwagon\" circa 2019. This wasn't a decision\nmade on a whim. We had seen a few industry trends come and go, so we first [read up](https://samnewman.io/books/building_microservices_2nd_edition/)\nand did our own analysis. We found that the concept of microservices held promise, but also knew that they would come at a cost.\n\nThese are some of the dangers we identified and what we did to mitigate them.\n\n| **Danger** | **Mitigation** |\n|-------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------|\n| _A stagnating architecture_ | Compile and unit-test time detection of breaking changes |\n| _Complicated and error prone deployments_ | Modular CI/CD [pipelines](https://github.com/Vandebron/mpyl) |\n| _Team siloization_ | A single repository (AKA monorepo) for all microservices and a discussion platform for cross-domain and cross-team concerns |\n| _Duplication of code_ | Shared in house libraries for common functionality |\n\n\n\nThe following presentation to the students of [VU University, Amsterdam](https://vu.nl/) explains how we implemented\nsome of these mitigations and what we learned from them.\n\n[![Presentation about micro services to students of VU Amsterdam](/images/play_presentation.webp)](https://youtu.be/HDs-pCsEzKM)\n","meta":{"title":"So, back to the monolith it is then?","description":"A recent Amazon article explaining how they managed to save costs by merging some of their services has lead some to question the value of microservices. What is our take?","createdAt":"Sat May 20 2023 02:00:00 GMT+0200 (Central European Summer Time)","coverImage":"images/monolith.webp","tags":"dagster, cicd, ci-cd, orchestration, data pipeline, kubernetes, migration, helm, ansible","author":"Sam Theisens","slug":"blog/back-to-the-monolith","formattedDate":"20 mei 2023","date":"Sat May 20 2023 02:00:00 GMT+0200 (Central European Summer Time)"}},{"content":"\nVandebron is a Dutch green-tech energy company on a mission to accelerate the transition to 100% renewable energy, 100% of the time. As part of [our mission and strategy](https://vandebron.nl/100procentgroen), we are constantly innovating and looking for ways to optimize energy operations and reduce negative impacts when it comes to energy production.\n\nOur new mission: [100% renewable energy, 100% of the time](https://youtu.be/_Yf8jk4gZbI)\n\n### The importance of curtailment and flexibility services\n\nOne area where we are currently focusing our efforts is the area of curtailment and flexibility of wind turbines, solar parks, industrial batteries and electric vehicles. [Curtailment](https://vandebron.nl/blog/curtailment-slimmer-omgaan-met-goeie-energie) refers to the practice of reducing the electricity inflow to balance the electricity grid. In other words, it involves adjusting the operation of, for example, a wind turbine in order to match the demand for electricity at any given time.\n\n[This is often necessary](https://vandebron.nl/blog/hoe-houdt-onze-technologie-het-energienet-in-balans) because the output of renewable energy sources can vary significantly due to changes in weather conditions. If the output of these sources exceeds the demand for electricity, it can lead to an excess of electricity on the grid, which can cause stability issues. On the other hand, if the output of wind turbines is too low, it can lead to a deficit of electricity on the grid, which can cause blackouts or other disruptions. To tackle this, we look at our customer’s batteries and electric vehicles offering flexibility capabilities.\n\n### Our journey to finding reliable, secure and energy-efficient hardware and software\n\nTo optimize these curtailment and flexibility efforts, we were in need of a gateway device that we could place at the installations of the producers on our platform. To keep it close to our mission, we preferred an ARM-based CPU for its [energy efficiency](https://www.redhat.com/en/topics/linux/ARM-vs-x86) compared to an x86-based CPU. After all, we don’t want to consume all of the produced energy to power an actively cooled NUC… 😉\n\nWhile gathering our hardware requirements, we concluded there was really only one competitor. Therefore, we partnered up with OnLogic! We chose their [Factor 201 device](https://www.onlogic.com/fr201/), which boasts the ARM-based Raspberry Pi CM4 module packed in a small and beautiful orange industrial chassis. The model also enables a lot of custom configurations. For example, we are able to configure multiple (wireless) networks, add extra SSD storage or optionally mount on DIN rails.\n\n![OnLogic Factor 201](/images/flex-onlogic-factor-201.jpg \"OnLogic Factor 201\")\n\nTo ensure our gateway devices are secure and agile (like us, developers, 😛) we needed them to integrate well into our existing technology landscape based on Kubernetes. After struggling for some time to harden several (lightweight) operating systems and bootstrapping lightweight Kubernetes clusters our eyes fell on a new kid in town: ‘Talos Linux, the Kubernetes Operating system’ built by [Sidero Labs](https://www.siderolabs.com/). Again our predetermined wishlist was covered (even more), and what we got is a minimal OS tailored for Kubernetes, hardened, immutable and ephemeral out-of-the-box. Can you survive even more buzzwords than that? \n\nUntil the present day though, they have fulfilled every promise made on [their website](https://www.talos.dev/). It initially didn’t work on our ARM CM4-based device from OnLogic. But after testing a lot together with their team (thank you!) the [latest release (v1.3.0)](https://www.talos.dev/v1.3/introduction/what-is-new/#raspberry-generic-images) officially supports our ARM devices. Ready for action! Right after the stable release the first batches were shipped and connected to the installations of our producers on the platform.\n\nOverall, Vandebron's use of OnLogic's fabricated gateway devices running Talos Linux demonstrates the potential of IoT computing to drive innovation and sustainability in the renewable energy industry. By leveraging the power of these technologies combined, we are one step closer to achieving our goal of 100% renewable energy, 100% of the time. Care to join our mission? Look for [open positions](https://werkenbij.vandebron.nl/).\n\n","meta":{"title":"How Vandebron helps balancing the Dutch energy grid together with OnLogic & Talos Linux","description":"Our journey to find the best fitting hardware and operating system to use for our flex services","createdAt":"Wed Jan 11 2023 01:00:00 GMT+0100 (Central European Standard Time)","coverImage":"images/flex-wallpaper.webp","tags":"iot, flexibility services, curtailment, onlogic, talos linux, kubernetes, arm64, raspberry pi","author":"Sietse Bruinsma & Tim van Druenen","slug":"blog/balancing-dutch-energy-grid-with-flex-services","formattedDate":"11 januari 2023","date":"Wed Jan 11 2023 01:00:00 GMT+0100 (Central European Standard Time)"}},{"content":"\n### TL;DR\nIf you want to deploy new Dagster user code respositories, you need to modify and redeploy the whole Dagster system (while they are [presented as separate](https://docs.dagster.io/deployment/guides/kubernetes/customizing-your-deployment#separately-deploying-dagster-infrastructure-and-user-code) in the docs). This is undesirable for many reasons, most notably because it slows down a migration or the regular development process. This post presents a way to avoid this and build a fully automated CI/CD-pipeline for (new) user code.\n\nThis article assumes that:\n* you (plan to) host Dagster on Kubernetes and manage its deployment with Helm and Ansible;\n* you want to automate the deployment of new Dagster user code repositories with a CI/CD pipeline automation tool of choice;\n* and you want to be able to (re)deploy the whole Dagster system and user code from scratch.\n\n### Why Dagster?\n\nIn short Dagster is a tool to build and orchestrate complex data applications in Python. For us, in the end, Dagster improved the development cycle for things like simple cron jobs as well as for complex ML pipelines. Testing the flows locally was never so easy, for instance. And with features like [asset materialization](https://docs.dagster.io/concepts/assets/asset-materializations) and [sensors](https://docs.dagster.io/concepts/partitions-schedules-sensors/sensors), we can trigger downstream jobs based on the change of an external state that an upstream job caused, without these jobs having to know of each other's existence.\n\nHowever, deployment of new [user code respositories](https://docs.dagster.io/concepts/repositories-workspaces/repositories) caused us some CI/CD related headaches...\n\n### System and user code are separated\n\nDagster separates the system deployment - the Dagit (UI) web server and the daemons that coordinate the runs - from the user code deployment - the actual data pipeline. In other words: the user code servers run in complete isolation from the system and each other. \n\nThis is a great feature of which the advantages are obvious: user code repositories have their own Python environment, teams can manage these separately, and if a user code server breaks down the system is not impacted. In fact, it even doesn't require a restart when user code is updated!\n\n![Schematic of the Dagster architecture. The user code repositories (green) are separate from the rest of the system (yellow and blue). The right side — irrelevant for now — shows the job runs. Source: https://docs.dagster.io/deployment/overview.](/images/dagster-architecture.png)\n\nIn Helm terms: there are 2 charts, namely the _system_: `dagster/dagster` ([values.yaml](https://github.com/dagster-io/dagster/blob/master/helm/dagster/values.yaml)), and the _user code_: `dagster/dagster-user-deployments` ([values.yaml](https://github.com/dagster-io/dagster/blob/master/helm/dagster/charts/dagster-user-deployments/values.yaml)). Note that you have to set `dagster-user-deployments.enabled: true` in the `dagster/dagster` values-yaml to enable this.\n\n#### Or are they?\n\nThat having said, you might find it peculiar that in the values-yaml of the system deployment, _you need to specify the user code servers_. That looks like this:\n\n```yaml\nworkspace:\n enabled: true\n servers:\n - host: \"k8s-example-user-code-1\"\n port: 3030\n name: \"user-code-example\"\n```\n\n**This means system and user deployments are not actually completely separated!**\n\nThis implies that, if you want to add a _new_ user code repository, not only do you need to:\n\n1. add the repo to the user code's `values.yaml` (via a PR in the Git repo of your company's platform team, probably);\n2. do a helm-upgrade of the corresponding `dagster/dagster-user-deployments` chart;\n\nbut because of the not-so-separation, you still need to:\n\n3. add the user code server to the system's `values.yaml` (via that same PR);\n4. and do a helm-upgrade of the corresponding `dagster/dagster` chart.\n\nFormally this is the process to go through. If you are fine with this, stop reading here. It's the cleanest solution anyway. But it is quite cumbersome, so...\n\nIf you are in a situation in which new repositories can get added multiple times a day - for instance because you are in the middle of a migration to Dagster, or you want a staging environment for every single PR - then read on.\n\n#### Give me more details\n\nHow it works is that [for every new repo Dagster spins up a (gRPC) server to host the user code](https://docs.dagster.io/deployment/guides/kubernetes/deploying-with-helm#user-code-deployment). The separation is clear here. But the Dagster _system_ also needs to know about these user code servers, and it does so through a workspace-yaml file. If you run Dagit locally it relies on a `workspace.yaml` file; on Kubernetes it relies on a [ConfigMap](https://kubernetes.io/docs/concepts/configuration/configmap/) - a Kubernetes object used to store non-confidential data in key-value pairs, e.g. the content of a file - which they named `dagster-workspace-yaml`.\n\nThis workspace-yaml is the connection between the system and the user code. The fact that the charts are designed as such that this workspace-yaml is created and modified through the system deployment rather than the user code deployment is the reason we need to redeploy the system. \n\n**But what if we could modify this workspace-yaml file ourselves? Can we make the system redeployment obsolete? Short answer: we can.**\n\n### Our solution\n\n_Disclaimer: what we present here is a workaround that we'll keep in place until the moment Dagster releases a version in which the Dagster user code deployment is **actually completely separated** from the system deployment. And it works like a charm._\n\n**Remember: the desired situation is that we do not have to edit the values-yaml files (through a PR) and redeploy all of Dagster for every new repo.**\n\nFirst of all, we added an extra ConfigMap in Kubernetes that contains the `values.yaml` for the `dagster/dagster-user-deployments` chart. We named it `dagster-user-deployments-values-yaml`. The fact that this is a ConfigMap is crucial to prevent conflicts (see next section).\n\nWith the extra ConfigMap in place, these are the steps when a repo gets added:\n1. Add the new repo to the `dagster-user-deployments-values-yaml` Configmap.\n2. Helm-upgrade the `dagster/dagster-user-deployments` chart with the content of that ConfigMap.\n3. Add the server to the `dagster-workspace-yaml` ConfigMap.\n4. Do a rolling restart of the `dagster-dagit` and `dagster-daemon` deployment to pull the latest workspace to these services.\n\n**Refresh the workspace in the UI and there it is, your new repo!**\n\nNotes:\n* The steps above are completely automatable through your favorite CI/CD pipeline automation tool.\n* There is no interaction with a (platform team) Git repo.\n* The process, unfortunately, still requires a restart of the system in order to pull the latest workspace-yaml to the system services. The daemon terminates, then restarts, and it might cause a short interruption. Note that this is unavoidable if you add a new repo, no matter how you add it. This could be avoided if a reload of the ConfigMap would be triggered upon a change, [which is possible](https://kubernetes.io/docs/concepts/configuration/configmap/#mounted-configmaps-are-updated-automatically) but not enabled.\n* If you want to make changes to an existing repo (not code changes but server setting changes), you only have to do the first step (and _modify_ instead of _add_).\n\n#### How to prevent conflicts\n\nWith many of your team members adding new Dagster repositories through an automated CI/CD pipeline, you might face the situation that 2 people are adding a new repo at around the same time. \n\nWhen this happens, the `dagster-user-deployments-values-yaml` ConfigMap cannot be uploaded in the first step because Kubernetes demands that you provide the _last-applied-configuration_ when doing an update. If it doesn't match, the upload fails. \n\nThis is perfect as we do not want to overwrite the changes of the conflicting flow. You can optionally build in a retry-mechanism that starts over with pulling the ConfigMap again.\n\n#### How to deploy from scratch\n\nThe above does not yet cover how we are able to deploy the Dagster system _and user code_ completely from scratch. Why do we want this? Well, for instance when somebody accidently deletes the `dagster` namespace for instance. Or hell breaks loose in any other physical or non-physical form. Or when we simply want to bump the Dagster version, actually.\n\nThe key to this is that we version both the `dagster-user-deployments-values-yaml` and `dagster-workspace-yaml` as a final step to the flow described above (we do it on S3, in a versioned bucket). Whenever we redeploy Dagster (with Ansible) we pull the latest versions and use them to compile both the values-yaml files from it. \n\n#### How to clean up old repositories\n\nThe above described automation _adds_ new repos but doesn't take care of old obsolete repos. The steps for removing a repo are the same for adding one. The exact implementation depends on your situation. You might want to automatically remove PR staging environments after closing a PR, for instance.\n\n### Conclusion\n\nDagster is an incredibly powerful tool that enabled us to build complex data pipelines with ease. This posts explains how we **streamlined the CI/CD pipeline for user code respositories**, which enabled us to migrate to Dagster very quickly and saves us lots of time on a daily basis.\n","meta":{"title":"The Why and How of Dagster User Code Deployment Automation","description":"If you frequently deploy new user code repositories in Dagster, you want to automate this process. However, this is not so straightforward as it may seem at first. This post explains what we did at Vandebron.","createdAt":"Fri Jul 08 2022 02:00:00 GMT+0200 (Central European Summer Time)","coverImage":"images/dagster-cicd.png","tags":"dagster, cicd, ci-cd, orchestration, data pipeline, kubernetes, migration, helm, ansible","author":"Pieter Custers","slug":"blog/cicd-dagster-user-code","formattedDate":"8 juli 2022","date":"Fri Jul 08 2022 02:00:00 GMT+0200 (Central European Summer Time)"}},{"content":"\n**A while back, our former technology manager Roy Derks covered the subject of component libraries here on the blog. From a technical perspective, he spoke about when you need one (and when you don’t need one) and what to consider when building one. Since then, obviously a lot has happened at Vandebron. But one of the more interesting things to happen is that design became an integrated part of the digital department, as opposed to previously being attached to marketing. In this new setup, one of the first major projects the design team was involved in was the alignment of our component libraries. And no that’s not a typo, that’s libraries as in the plural form of library. Confusing? I thought so too. In this blog I’ll try to explain further why that was the case, how the work actually helped us bridge the gap between design and development, and dissect the work of unifying those component libraries into one single source of truth and ultimately what’s to become our design system.**\n\n### A bit of a mess\nBefore we get into it, some background as to where we started out might be useful. As previously mentioned, the design team had just become a part of the digital department and one of the first tasks at hand was the creation of a design system. In the design team, we had previously worked with a certain set of brand guidelines, a style guide if you will, which had not necessarily been translated or aligned to the requirements of a digital product or development environment. Development had also created a set of stylesheets and libraries with reusable components which they used to reduce development time. Having it all separately might sound a bit counter-intuitive, but not very surprising if you consider designers and developers not being in the same department, working on a different timeline, different priorities and so forth. However, this only highlighted the importance of designers and developers working together and the need for a proper design system to help prevent creating a fence between the teams causing unnecessary and ineffective work on both sides. The result of this previous “unsynciness”, a rebrand in 2017, and a re-aligned techstack, was the existence of 3 different libraries and subsequently 3 different sources of truth within the development environment. To add to this, we also had separate design guidelines geared more towards brand/marketing purposes in the design team. Now came the rather massive task of unifying these and eventually, rather than having just a library, _having a system_. \n\n### Component library ≠ design system\nNow, there’s a lot of terminology here that might be difficult to grasp if you’re new to the subject. So I thought I’d clarify what we mean when referring to these, how they fit into the context of our situation, and how many of them we had!\n\n- #### Brand guidelines / style guide (design)\n A set of guidelines and examples outlining all the visual elements of a brand such as logos, color, typography, imagery etc. and subsequently in what - - manner they should be applied. It can also be expanded to include more things brand related such as tone of voice, brand values and so forth. Often with brand guidelines, they are created from a marketing perspective and the digital experience(or product) aspect of how the brand should be applied/represented is usually thought about in the second hand, or not included at all. \n\n _Amount: 1_\n \n- #### Design kit/library (design)\n A designer resource file with all the available building blocks that make up the digital design language of a brand and/or the user interface of a product. This is usually only visual(no code) and lives in the design software of the designer's choosing. For us this used to be Sketch, but we recently moved to Figma. Can also include documentation and examples of how the different building blocks should be applied and utilized. \n\n _Amount: 1_\n \n- #### Style sheet (front-end)\n A set of styling properties to be applied when rendering a web page, usually in the format of CSS. This can include things related to the brand guidelines such as font size, colors, etc. but also things related to web layout such as the margins and paddings of different web elements.\n\n _Amount: 1_\n\n- #### Component library (front-end)\n A set of dynamic web components that can be used in a development environment in order to quickly build user interfaces. This helps to ensure consistency, to avoid rebuilding the same component more than once and to avoid changing said component in more places than one, and subsequently help reduce development time. \n\n _Amount: 3_\n \nAll of the above mentioned things, together with rigorous documentation, amount to what’s called a design system. Having it all combined in a structured way is key to getting the most out of such a system. In our case, most of these things were separate and not necessarily connected to each other. But what stands out most of the things above is probably the fact that we, over time, had amounted to 3 different component libraries. I mentioned earlier how that scenario had transpired so I won’t go into too much detail as to how that happened, but if you’re a developer in a small to medium-sized company and I mention “rebrand” and “new techstack” you can probably figure out how. However complex, this also proved to be an excellent opportunity for our developers and for us in the design team. We finally get to unify our component libraries into one, while simultaneously aligning it with our design kit and expanding the guidelines with new and updated documentation. Thus ensuring that designers and developers speak the same language and share the same single source of truth.\n\n### A guild forms\nTo kickstart this process we formed a project group(or ‘guild’) composed of 2 designers and 2 developers, each designer and developer from the two consumer-facing scrum teams. The idea was to let the developers work on the migration and unification of the component libraries in collaboration with us designers in the same project, making it easier to align and to create co-ownership of the product. Our first step was to decide on the structure of our component library, this way the developers could slot all the existing, reworked and new components into the right place in the new library. Easy enough right? Well, here comes our first challenge. We initially wanted to take an atomic approach and build our components from the well known and widely used atomic design principles. We also needed to consider the 3 different “product groups” which the library should apply to, all still utilizing the same style properties. \n\nVandebron has a wide range of products serving different platforms, with the visual language remaining the same but where the user interface might differ. This requires the top elements of the system(such as colors and typography) to be shared across all products, whereas the lower you get the more product-specific an element becomes. This is the reason why we wanted to structure the system according to the principles of Atomic Design first, in order to assign the components to a hierarchical structure.\n\n![Atomic Design](/images/AtomicDesign.jpg \"Atomic Design\")\n\nWith this approach the atoms would work like design tokens and the molecules would be components general enough that they’d be shared across all product groups, this CORE part of the library would essentially be the stylesheet that impacts all visual aspects of the digital brand experience. Only on organism-level do we start to differentiate what product group the component belongs to. So a change to the CORE parts of the library(atoms or molecules) would impact all components in all product groups.\n\nHowever, this approach actually made less sense from a development perspective. Not that it wouldn’t work or that the categorization didn’t make sense, but it would require us rewriting all the already existing components. Components that are actively in use. We deemed this approach a bit too high-risk and high-effort for the time being and started looking into alternatives, while still keeping the atomic structure as a more long-term goal. Another thing our initial idea didn’t take into account was the experience of the future main user of the library, **_the developer!_** Organizing a design system after the brand properties and product groups makes a lot of sense from a designers or a marketeers perspective, and it should probably still be presented outwards that way, but a component library is something else(remember?). So based on our development environment and the way we build our websites and apps our developers suggested a different structure:\n\n![Iteration](/images/Iteration.jpg \"Iteration\")\n\nIn this structure, similar to the previous one, the components are instead categorized and sorted by how they should be applied to the page or application that’s being built. Styles, layouts and inputs are general enough to be applied to all product groups whereas from the surface level the components start becoming more specific in their use case. That way, the components can be separated into specific or even several product groups. In this format the components themselves are not as intertwined as in the atomic structure, albeit still connected by the style element. So while it’s a bit more resistant to overall changes the main idea of having the same style properties applying to everything still works, and it helps us designers to better relate and contextualize what we’re designing from more of a development perspective, thus helping bridge the gap between development and design even further. The main insight we drew from this experience is to not let industry standards and certain trends dictate what you should do. Sure they’re important to keep an eye on, but do it with carefulness and always apply an asterisk to it. Figure out what works best for your specific situation and what’s realistic in the short-term vs. in the long-term. There’s no one-size-fits-all.\n\n### Speaking the same language\nWith the component library migration now underway, we started looking into ways to improve our system from the designers' side of things. As previously mentioned, we had just gone from using Sketch to using Figma and with that came a good opportunity to rebuild, adjust and expand our design kit also. We did that by removing, adding, simplifying and renaming a lot of what was in there since before and with the design kit now adjusted to match the component library we were now also speaking the same language. We can actually now compare this side-by-side with the tools we’re using. In Storybook we have attached the Figma design of every component, simply by activating the feature and pasting the link to its page or artboard in the Figma file. This will refresh in almost real-time if any changes are made so we can easily spot any differences and inconsistencies between what’s live and how the design looks. In Figma, we try to document all our components and give some context as to how it works and should be applied. This is now also directly visible to the developer in the context of the component library. Expanding on our documentation and exposing our digital design guidelines like that has been a great way to create a shared understanding of our designs. Rather than just an image being tossed over a fence, there is now quite literally a direct connection between design and development and therefore also more of a shared ownership.\n\n![Storybook & Figma](/images/StorybookFigma.jpg \"Storybook & Figma\")\n\n### Further defining the process\nAs all the alignment on the design side and the migration neared completion, we started seeing a lot of things that could be improved upon or even added to our component library. When we started logging these things down on our project backlog we quickly realized that the scope of our project had quickly been growing into something beyond what was initially intended, and that rather than giving us focus this guild format was instead at risk of creating an isolated bubble of knowledge surrounding the design system. This prompted us to gauge the opportunity and capacity among our development teams to instead tackle these tasks together, either alongside or within their respective day-to-day tasks. In order to do so we needed the buy-in from key stakeholders such as the product owners from the respective development teams. It’s obviously a big ask to get 1 developer from each team to work on improving a component library, especially when they’ve already given us a quarter on migration and have other important business and/or user needs to tend to. So instead, we looked into how we can embed the improvement and further development of our design system into the developers current processes and primary day-to-day work. We structure this by linking our component library improvement/addition tickets to relevant tickets in their respective sprints. In defining the workflow like this, our 2 designer 2 developer guild in effect rendered unnecessary and instead we opened up the co-ownership and contribution to all developers in all customer-facing development teams and in the process of it preventing isolating knowledge too much. In opening up the process like this, another positive side effect we see is the involvement, engagement and subsequent use of our component library going up. With the product designers now also actively a part of the front-end guild meetings, we have an ever bigger forum and bigger opportunity to build a world class component library and design system while also having more hands on deck to work on maintenance and improvements. We still have a long way to go, but all parts are now even more aligned and the future is looking bright!\n\n### What’s next\nIn the newly formed designer+developer guild, the work of defining requirements and improvements on the design system continues. From the design side we’re also looking to constantly improve on the documentation and the presentation of our system. This is something we imagine we’ll keep on doing continuously and iteratively for as long as it’s needed, if not even forever. After all, “design is never done” and a design system can and should be a living thing constantly evolving along with the products and the brand it serves, and in extension even the promise the brand and it’s products. In our case, that’s to aid in **accelerating the energy transition towards 100% renewable energy**. More on how we exactly do that, and how we always aim to design for impact, in the next blog post. Thanks for reading and stay tuned!\n\n\nPetter Andersson, Product Designer at Vandebron\n\n\n\n_If the type of work mentioned in this blog post sounds interesting to you, [take a look at our job openings here](https://werkenbij.vandebron.nl/l/en/)._ \n","meta":{"title":"The difference between a component library and a design system, and how they can help bridge the gap between design and development","description":"A while back we started a rather extensive project of migrating and unifying our component library, these are some of the learnings we made during the project.","createdAt":"Wed Jul 06 2022 02:00:00 GMT+0200 (Central European Summer Time)","coverImage":"images/WindmolenCover.jpg","imageSource":null,"tags":"product, design, design system, component library","author":"Petter Andersson","slug":"blog/the-difference-between-a-component-library-and-a-design-system","formattedDate":"6 juli 2022","date":"Wed Jul 06 2022 02:00:00 GMT+0200 (Central European Summer Time)"}},{"content":"\n# Signing and verfiying SOAP messages with wss4j and Scala\n\nSOAP is not dead. It is an established, XML-based and mature messaging protocol that comes with built-in security mechanisms, integrity checks, content validation and much more. A lot of enterprises and corporations are using it (sadly) still.\nJust recently, Vandebron had to implement a SOAP client to communicate with an external party. \nThis blog post will explain with code examples how we at Vandebron are signing and verifying SOAP messages for our latest SOAP client implementation. \n\nFor this process, we are using Apache's Web Service Security Library [wss4j](https://ws.apache.org/wss4j/) as it is a proven tool in the WSS context and provides, as a Java library, great interoperability with the programming language Scala.\n\n## Signing SOAP messages\n\nHere we will take a look at the necessary steps to sign a SOAP message like this one:\n```xml\n\n \n \n Hello World\n I am just a test\n \n\n```\nTo look after signing like this:\n```xml\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n 7KfPcTwDYWtLj4ZVWmWmVqX4IGwbBAAmUPigCdXdk4U=\n \n \n \n OBnbBWv8S70xDDn5uG++7cTRFa2Uz3D47oxTHuO163Y3/V7H35M1GHXbKaUDOHsgsfx3SdVmVi++ra06cpwJknzqoIQgDV9Qc0ydzfxljCqupPKBnfONDYJtihEE1jtQ0RP7OLzPVNUpgOgHqbLwJu2pRUA05ool+lxIs924OwPVPKyUryoYwWhwY1ttY4P+WY2L3ZqsH3fgoLCyjlvhDEAhsP9PCxsEzPSq3ECC55Nh7nqMoHPj2uNxonuMlPeYbrlMnwyiqEW8s3Sc+WmfiIOgekRE1AdNhpn3ARlO490nObQtXCU/TxeTfbh98TMbQRZWWyT4HuLS3fF6aeyD/Q==\n \n \n \n \n ox4ajWTdigy9oApTYs97CuCV/4k=\n \n \n \n \n \n \n \n Hello World\n I am just a test\n \n\n```\n\nFor implementing the steps of the blog post you will need:\n- a SOAP service you want to send messages to\n- documentation of that SOAP service that describes:\n - signature algorithm\n - canonicalization method\n - digest algorithm\n - key identifier type\n- a private key with which you will sign your messages\n- a certificate that is the counterpart of the private key\n- (optional) a pool of trusted certificates\n\nOur private and public key pair are available in the PKCS#12-format (.p12 file extension). Check out [this](https://www.ssl.com/how-to/create-a-pfx-p12-certificate-file-using-openssl/) to learn more about this format and how to achieve it.\nThe pool of trusted certificates are in the [PKCS#7 format](https://www.ssl.com/guide/pem-der-crt-and-cer-x-509-encodings-and-conversions/) (.p7b file extension).\n\nFirst we have to setup the necessary dependencies:\n\n```scala\n // in your build.sbt or project/Dependencies.scala\n // enabling signing and signature verification for SOAP messages\n lazy val webServiceSecurity = Seq(\n \"org.apache.wss4j\" % \"wss4j\" % \"2.3.1\" pomOnly (),\n \"org.apache.wss4j\" % \"wss4j-ws-security-dom\" % \"2.3.1\",\n \"org.apache.wss4j\" % \"wss4j-ws-security-common\" % \"2.3.1\"\n )\n\n libraryDependencies ++= webServiceSecurity\n```\n\nNext, we continue with a scala representation of our certificate we are using for signing:\n\n```scala\n import org.apache.wss4j.dom.WSConstants\n \n // algorithm configuration\n object SigningCertificate {\n val CanonicalizationMethodURI: String = \"http://www.w3.org/2001/10/xml-exc-c14n#\"\n val DigestAlgorithmURI: String = DigestMethod.SHA256\n val SignatureAlgorithmURI: String = \"http://www.w3.org/2001/04/xmldsig-more#rsa-sha256\"\n val KeyIdentifierType: Int = WSConstants.SKI_KEY_IDENTIFIER\n }\n\n case class SigningCertificate(keyStore: KeyStore, password: String) {\n require(\n keyStore.aliases().asScala.size == 1,\n s\"Certificate of Keystore needs to have one alias but had ${keyStore.aliases().asScala.size}\"\n )\n val alias: String = keyStore.aliases().nextElement()\n\n override def toString: String = s\"SigningCertificate(alias=$alias)\"\n }\n```\nIn the documentation of the SOAP service that you want to call should stand some information regarding the canonicalization method, signature algorithm, digest algorithm, and the key identifier type. Those are algorithms and information that define the signing process and we explain roughly now.\n\nBefore signing a message it has to be canonicalized. \"Canonicalization is a method for generating a physical representation, the canonical form, of an XML document that accounts for syntactic changes permitted by the XML specification\" (from [here](https://www.di-mgt.com.au/xmldsig-c14n.html)). In our case, the Exclusive XML Canonicalization is used.\n\nThe digest algorithm is used to ensure the integrity of the message during the verification of a signature. The algorithm is used to calculate a hash of the signed message. It should be documented in the SOAP service documentation. Here we will use SHA256 as a hashing algorithm.\n\nThe signature algorithm describes how the message will be signed. It can be defined in the SOAP service documentation but in the worst case you can read this algorithm from the certificate itself by using [`keytool`](https://docs.oracle.com/en/java/javase/12/tools/keytool.html):\n```bash\n$ keytool -list -v -keystore signature.p12\nEnter keystore password: ...\n\n[...] # more information about the certificates\n\nSignature algorithm name: SHA256withRSA # thats what we are after!\n\n[...] # more information about the certificates\n```\nAccording to the keytool inspection we will use SHA256withRSA (http://www.w3.org/2001/04/xmldsig-more#rsa-sha256) for signing.\n\nLast but not least, in our signature, a `` element is included. This element contains information about the public key of the sender (us) and is needed for the signature verification once the message is received (read more [here](https://www.xml.com/pub/a/2001/08/08/xmldsig.html)). Since we have our public key provided we don't need to do much here. The `KeyIdentifierType` describes which form of key identifier is used to present the public key information.\n\nHaving all this information about our certificate in place, we build the mechanism to load in our signing certificate. For this, we create the object `KeyStoreBuilder`.\n\n```scala\nimport java.io.{File, FileInputStream}\n\nobject KeyStoreBuilder {\n\n def loadSigningCertificate(signingCertificate: File, password: String): SigningCertificate = {\n val fis = new FileInputStream(signingCertificate)\n val ks: KeyStore = KeyStore.getInstance(\"PKCS12\")\n ks.load(fis, password.toCharArray)\n SigningCertificate(ks, password)\n } \n}\n```\nBear in mind, that you probably **don't** want to version any sensitive information like private keys and passwords hard-coded or in any environment variables, so a safe mechanism for storing/fetching passwords and certificates (like [Vault](https://www.hashicorp.com/products/vault)) should be in place.\n\nWith the signing certificate in place, we can actually start signing a message. The next code example contains quite some Java boilerplate from wss4j that is required to make the signing mechanism work.\n\nTo restrict the usage of Java classes to a small portion of our code we will firstly implement a conversion method `.toElem` inside of the companion object `SigningService`:\n\n```scala\n import java.io.StringWriter\n import javax.xml.transform.{OutputKeys, TransformerFactory}\n import javax.xml.transform.dom.DOMSource\n import javax.xml.transform.stream.StreamResult\n\n import org.w3c.dom.Document\n\n import scala.xml.Elem\n\n object SigningService {\n implicit class RichDocument(document: Document) {\n private val tf = TransformerFactory.newInstance()\n\n def toElem: Elem =\n val transformer = tf.newTransformer()\n transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, \"yes\");\n val stringWriter = new StringWriter()\n transformer.transform(new DOMSource(document), new StreamResult(stringWriter))\n scala.xml.XML.loadString(stringWriter.getBuffer.toString)\n }\n }\n```\nWith that, we can convert any `Document` SOAP message representation back to the `scala.xml` supported `Elem` format.\n\n```scala\nclass SigningService(signingCertificate: SigningCertificate) {\n\n // importing our conversion method\n import SigningService.RichDocument\n\n /**\n * REQUIRED, otherwise it will throw:\n *\n * org.apache.wss4j.common.ext.WSSecurityException:\n * You must initialize the xml-security library correctly before you use it.\n * Call the static method \"org.apache.xml.security.Init.init();\"\n * to do that before you use any functionality from that library\n */\n org.apache.xml.security.Init.init()\n \n private val documentBuilderFactory = DocumentBuilderFactory.newInstance()\n private val crypto: Merlin = getCrypto\n\n crypto.setKeyStore(signingCertificate.keyStore)\n\n def signElement(elem: Elem): Elem = {\n documentBuilderFactory.setNamespaceAware(true)\n // converting Elem to Document (Scala to Java conversion)\n val doc = documentBuilderFactory.newDocumentBuilder().parse(new InputSource(new StringReader(elem.toString())))\n\n // WSSecHeader wraps around the document we want to sign\n val header = new WSSecHeader(doc)\n header.setMustUnderstand(true)\n header.insertSecurityHeader()\n\n // start building Signature, use the (wrapper) header-instance\n val builder = new WSSecSignature(header)\n builder.setUserInfo(signingCertificate.alias, signingCertificate.password)\n\n // setting algorithms\n builder.setSignatureAlgorithm(SigningCertificate.SignatureAlgorithmURI)\n builder.setSigCanonicalization(SigningCertificate.CanonicalizationMethodURI)\n builder.setDigestAlgo(SigningCertificate.DigestAlgorithmURI)\n builder.setKeyIdentifierType(SigningCertificate.KeyIdentifierType)\n builder.setAddInclusivePrefixes(true)\n\n // signing the document!\n val signedDocument = builder.build(crypto)\n // conversion back to Elem\n signedDocument.toElem\n }\n\n private def getCrypto: Merlin = {\n val properties = new Properties()\n properties.setProperty(\"org.apache.wss4j.crypto.provider\", \"class org.apache.ws.security.components.crypto.Merlin\")\n CryptoFactory.getInstance().asInstanceOf[Merlin]\n }\n}\n```\n\nWss4j is a library that maintains an internal state during a signing process, but to avoid confusion it can be summarized as:\n1. `WSSecHeader` wraps around the document to be signed\n2. the WSSecHeader instance `header` will be used as part of the `WSSecSignature`-Builder\n3. the WSSecSignature instance `builder` gets configured with all necessary information, which algorithms are used for signing, digesting, canonicalization, which key identifier should be included. Those settings an vary from webservice to webservice.\n\nThe actual signing of the document, which is now nested like a matryoshka doll, is happening with the help of an instance of `Crypto`. `Crypto` will contain either a keystore or a truststore or even both. It needs to be specified in the `crypto.properties` file or a runtime which class of Crypto will be used.\n The most common one is [`Merlin`](https://ws.apache.org/wss4j/apidocs/org/apache/wss4j/common/crypto/Merlin.html).\nWe have decided to specify its configuration during runtime, since it is more visible than a properties file. Nevertheless, the `crypto.properties`-file needs to exist in your `resources` folder neverthless otherwise you will get a following `WSSecurityException`:\n```java\n org.apache.wss4j.common.ext.WSSecurityException: No message with ID \"resourceNotFound\" found in resource bundle \"org/apache/xml/security/resource/xmlsecurity\"\n [... rest of stacktrace ...]\n Cause: java.nio.file.NoSuchFileException: crypto.properties\n```\n\nAnd that's it! The `KeyStoreBuilder` helps us to load a `SigningCertificate` and the `SigningService` uses this loaded certificate to sign SOAP messages. \nA receiver of our SOAP message has all the necessary information in our signature to verify that this message has not been tampered with and we are the original sender.\n\nThis verification is something we should also do on our side for incoming messages. So let's take a look at how we can verify the signature of received messages.\n\n## Verification of SOAP messages\n\nVerifying the signature of incoming messages is equally important to ensure that the connection is secure. A verification process will tell you if the message is coming from a trusted source and has not been tampered with.\n\nAs previously mentioned we need our source of truth, a pool of trusted public keys from all parties which will receive our SOAP messages. These build the basis of the trust store.\n\nWe will create a `TrustedCertificates` wrapper class in which we will load in the trust store and add this method to the `KeyStoreBuilder`.\n```scala\ncase class TrustedCertificates(keyStore: KeyStore)\n\nobject KeyStoreBuilder {\n\n def loadTrustedCertificate(certificates: Seq[File]): TrustedCertificates = {\n val ks = KeyStore.getInstance(KeyStore.getDefaultType)\n // we just want the keystore to act as a truststore (only containing trusted certificates), so we initialize it empty\n ks.load(null, null)\n val cf = CertificateFactory.getInstance(\"X.509\")\n certificates.foreach { file =>\n CloseableUtil.using(getClass.getResourceAsStream(file.getPath)) { fis =>\n val certPath = cf.generateCertPath(fis, \"PKCS7\")\n certPath.getCertificates.asScala.toList.foreach { certificate =>\n ks.setCertificateEntry(file.getName, certificate)\n }\n }\n }\n TrustedCertificates(ks)\n }\n}\n```\nThis trust store is under the hood also just a KeyStore, without containing a private key that requires a password, that's why we can initialize the KeyStore with `null`-parameters.\n\nNow, the SigningService needs to be extended with this trusted certificates and a `verifySignatureOf`-method:\n\n```scala\nimport java.io.StringReader\nimport java.util.Properties\nimport javax.xml.parsers.DocumentBuilderFactory\n\nimport org.apache.wss4j.common.crypto.{ CryptoFactory, Merlin }\nimport org.apache.wss4j.dom.engine.WSSecurityEngine\nimport org.xml.sax.InputSource\n\nimport scala.util.{Failure, Success, Try}\nimport scala.xml.Elem\n\nclass SigningService(signingCertificate: SigningCertificate, trustedCertificates: TrustedCertificates) {\n\n private val engine = new WSSecurityEngine()\n private val documentBuilderFactory = DocumentBuilderFactory.newInstance()\n private val crypto: Merlin = getCrypto\n\n crypto.setKeyStore(signingCertificate.keyStore)\n crypto.setTrustStore(trustedCertificates.keyStore)\n\n def verifySignatureOf(elem: Elem): Boolean = {\n documentBuilderFactory.setNamespaceAware(true)\n val doc = documentBuilderFactory.newDocumentBuilder().parse(new InputSource(new StringReader(elem.toString())))\n\n Try(engine.processSecurityHeader(doc, null, null, crypto)) match {\n case Success(_) => true\n case Failure(exception) =>\n // replace with proper logging\n println(\n s\"Unsuccessful signature verification, it is most likely that the certificate used for signing is not in our Truststore: ${exception.getMessage}\")\n false\n }\n }\n\n private def getCrypto: Merlin = {\n val properties = new Properties()\n properties.setProperty(\"org.apache.wss4j.crypto.provider\", \"class org.apache.ws.security.components.crypto.Merlin\")\n CryptoFactory.getInstance().asInstanceOf[Merlin]\n }\n}\n```\n\nAnd with that, we have completed our roundtrip of signing and verifying SOAP messages!\n\nHere are gists, articles, and documentation that inspired and helped us to figure out the signing and verification process for our SOAP client. Feel free to check them out!\n\n* * *\n\n### Sources\n\n[WSSecurityVerifier by Luis Wolff](https://gist.github.com/luiswolff/1d388ec8c1d63cfb58974a6f826bc1be) \n\n[WSSecuritySigner by Luis Wolff](https://gist.github.com/luiswolff/64d15a99fbb5ec4b4e90eec04b09e053)\n\n[Unit Tests from ws-wss4j](https://github.com/apache/ws-wss4j/blob/master/ws-security-dom/src/test/java/org/apache/wss4j/dom/message/SignatureTest.java)\n\n[An Introduction to XML Digital Signatures](https://www.xml.com/pub/a/2001/08/08/xmldsig.html)\n\n[SOAP vs. REST](https://stackify.com/soap-vs-rest/)","meta":{"title":"Signing and verifying SOAP messages with wss4j and Scala","description":"This blogpost will explain with code examples how we at Vandebron are signing and verifying SOAP messages for our latest SOAP client implementation.","createdAt":"Mon Jun 28 2021 02:00:00 GMT+0200 (Central European Summer Time)","coverImage":"images/soap.jpg","imageSource":"https://cdn.pixabay.com/photo/2020/03/15/18/36/wash-4934590_960_720.jpg","tags":"SOAP, xml, scala, wss4j, signature, verification","author":"Katrin Grunert","slug":"blog/how-to-sign-soap-messages","formattedDate":"28 juni 2021","date":"Mon Jun 28 2021 02:00:00 GMT+0200 (Central European Summer Time)"}},{"content":"\nAt the end of March, we organized a public hackathon to create solutions to tackle climate challenges. After having done internal hackathons, we thought it was time to share our technologies with other innovative people and companies. Together with a group of partners, and enthusiastic participants, spend three full days of (remote) hacking with great results.\n\n### Why organize a public hackathon?\n\nClimate change is one of the many pressing challenges our society is currently facing. At [Vandebron](https://vandebron.nl/), we want to continue finding ways to tackle this immense challenge. That’s why we decided to organize a 3-day GreenTech hackathon that ran from March 31st to April 2nd, 2021. We've been organizing internal hackathons for the past four years, to foster innovation within our company and allow our developers to work on something exciting without any constraints. If you want to read more about why we organize internal hackathons, you can find an article by our CTO [here](https://www.vandebron.tech/blog/power-regular-hackathons). \n\nBy organizing a public hackathon, we hoped to attract a bigger audience, possibly even outside our country, The Netherlands, and attract partners to work together with. We succeeded in both, and together with [Hack the Planet](https://hack-the-planet.io/) and [Top Dutch Solar Racing](https://solarracing.nl/), we wanted to find technological solutions to problems in wildlife conservation and renewable energy. For these three days, all participants got the opportunity to work on challenges from our partners, access their technology and knowledge, and got the chance to win unique prizes. Also, we organized a free event with speakers Florian Dirkse ([The Ocean Cleanup](https://theoceancleanup.com/)), Thijs Suijten (Hack the Planet) and Heleen Klinkert ([Nieuw Groen](https://nieuw-groen.nl/)). \n\n### Looking back\n\nThe event started on March 31st, when all hackathon challenges were presented and the participants could select which challenge they wanted to work on. People from all over The Netherlands (and even beyond) signed up for the hackathon, ranging from students from the University of Amsterdam to young professionals looking for a job. The first challenge the participants could subscribe to was from Vandebron itself, where teams got the opportunity to use a selection of our Electronic Vehicle (EV) data. With this data, they could for example make a forecast on the amount of charging sessions we could expect on a typical day. Second, our partner Hack the Planet presented their challenge that was aimed at thinking of innovative solutions for their project [Hack the Poacher](https://www.hackthepoacher.com/). With Hack the Poacher, they install smart camera traps in African wildlife reservations to detect poachers. The teams could use their camera traps and data to create more solutions to map the poachers or use the camera traps for other needs. Finally, the students from Top Dutch Solar Racing presented a challenge to simulate the race they were supposed to join at the end of the year in Australia. Using their weather and traffic data, the teams could simulate the race and predict how much time they would need to complete the race. After selecting a challenge, all teams started the hackathon and participated in sessions to learn more about the challenges to get started.\n\nAll teams continued working on the hackathon challenge on the second day, after a nice warming-up quiz about climate change in the morning. For most teams this second day was when their project started to take shape, and they got a better idea about what they would be presenting on the final day. This second day was also an opportunity for non-technical people to get to know Vandebron and their partners better as we organized inspirational sessions with talks from different speakers in the afternoon. One of the co-founders from The Ocean Cleanup, Florian Dirkse, inspired us with his story behind making a difference in the world. After which, one of our hackathon partners Thijs Suijten, from Hack the Planet, demonstrated how technology can be used for the good. Our third, and final, speaker Heleen Klinkert (Nieuw Groen), showed how we can compensate for our CO2 emissions by storing them in the soil.\n\nOn the final day of the hackathon, all teams had to finalize their projects and create a presentation for the closing ceremony. During this ceremony, all participants and partners looked back at the past three days and shared what they had been working on during the hackathon. For every challenge, one team could win and take home several prizes, sponsored by [Marie-Stella-Maris](https://marie-stella-maris.com/), [EV Experience](https://evexperience.nl/), and [Klimaatroute](https://www.klimaatroute.nl/). The first presentations were for the Vandebron challenge about EV forecasts. This challenge was won by not one but two teams as the jury and audience were so impressed by their solutions. Both teams created not only the forecast based on the sample data provided, but also created interactive dashboards. On the challenge for Hack the Planet, the team that won came up with a unique solution to use the camera traps to detect wild animals on the streets. For countries like India, this is a huge problem, as wild animals get stuck in traffic or walk through rural areas. The final winner of the hackathon was a group of students that simulated the Top Dutch Solar Racing trip through Australia and forecasted they could complete the race within 7 days.\n\n### Thanks everyone\n\nI'd like to thank all the participants, prize/challenge partners, and speakers for their efforts during these days. The GreenTech Hackathon 2021 was a huge success thanks to everyone that has been involved. Keep following the [vandebron.tech](https://vandebron.tech) to be updated on future hackathons and events.\n","meta":{"title":"Looking back at the Vandebron GreenTech Hackathon 2021","description":"At the end of March, we organized a public hackathon to create solutions to tackle climate challenges. After having done internal hackathons, we thought it was time to share our technologies with other innovative people and companies.","createdAt":"Mon Apr 05 2021 02:00:00 GMT+0200 (Central European Summer Time)","coverImage":"images/looking-back-at-vandebron-greentech-hackathon-2021.png","tags":"hackathon, innovation","author":"Roy Derks","slug":"blog/looking-back-at-vandebron-greentech-hackathon-2021","formattedDate":"5 april 2021","date":"Mon Apr 05 2021 02:00:00 GMT+0200 (Central European Summer Time)"}},{"content":"\nAt Vandebron we have been organizing a regular hackathon for the last four years. Every three months we organize a two-day event. At first glance this seems quite an investment. Eight days a year, almost losing two working-weeks of productivity for your teams! \n\nOur company is like any other. Our roadmaps are stuffed, our backlogs are never-ending and pressure for delivering value to our customers is always present. Our ambitions are always higher than what we can handle with the amount of teams and people available. We like to say: ‘the energy transition can’t wait!’, but we sure do have to prioritize our projects very carefully.\n\nHowever this does not stop us from organizing our quarterly hackathons. Most of the time our regular hackathons are light-weight. People within the company know how it works. We try not to waste too much time in ‘organizing’ the event. We get right to it. \n\n#### Reasons why you should be organizing (regular) hackathons:\n- Fun - this reason does not need much explanation. Working on challenging, fun and creative ideas with uncertain outcome in a not-business-as-usual way. It makes you step out of your daily comfort zone and explore new things. \n- Walk the extra mile - Some team-members will have the energy, enthusiasm and commitment to use their spare time to fuel their curiosity and bring new insights to the workplace. These are the same people that you also expect to walk the extra mile if the team- or company objectives are at stake. This is in that same spare time! But in the end, if you value your teams to continuously think about new ideas, insights and work on out-of-the-box ideas, it is not a weird idea to create this environment within the company.\n- Bottled up energy - our people are focused on reaching goals and objectives. Every day, every week and every sprint the focus is clear. This also means that there is not always time for creative or high risk escapades that could hurt the overall team objectives. This might give an unsatisfied feeling to people. If the bottled up energy can not be released, engineers might get frustrated. But maybe even more important, you might be missing opportunities for the company.\n- Cross team collaboration - in an agile way of working the concept of the team is very important. At Vandebron we focus on teams staying together for a long period of time. This makes the relationship between individuals stronger, the knowledge of the product deeper and the team as a whole more effective. However, the company is bigger than your team. There might be different ways of connecting with other people within your company, but a hackathon is an ideal way of linking yourself up with people that you can learn from. It can really bring you new insights as an individual, and it will also be an investment for improved cross-team collaboration going forward.\n- Learning organisation - as mentioned, hackathons give you an excellent opportunity to learn new things. For yourself, but definitely also for the company. In my experience I often see that topics get selected that have high-risk and high-reward kind of characteristics. These topics can be scary to touch, which make you go out of your comfort zone. This is where you learn the most! These high-risk and high-reward projects are also very likely to fail, meaning that the reward is not as high as expected, or the complexity and risks are even greater than anticipated. At these moments the pressure-cooker of a hackathon is very valuable, because it forces the participants to draw conclusions in a short time-frame. The insights gained from these projects can be used to further steer the roadmap. And last but not least, it supports building a culture of being bold enough to try new things, and fail fast. I’ve noticed this is appreciated by a lot of people within the company and the hackathon contributes to a culture of innovation.\n\n#### Our most important learnings over the years\n- Spotlights on - It is good to put teams and their results in the spotlight. Let them take the podium and make sure there is an audience. However don’t make it too much about winning. Ideas that have completely failed are just as important as over-engineered fancy product demos. At Vandebron we like to declare ‘winners’ in different categories: ‘Fun & Original’, ’Impactful’, ‘Exploration & Learning’ and ‘Technical achievement’. \n- Harvest your ideas continuously - during normal work and life you hit those topics that you would like to investigate a bit deeper. But while you stumble upon such a topic you don’t have the time to dive into it. So therefore, write your idea down and publish it in the ‘hackathon-idea-box’ for everyone to see! It might already give you some good conversations during coffee or lunch, and it might already generate you some people that would like to join forces with you during the hackathon. Because rest assured, a new hackathon is always coming up!\n- To-theme-or-not-to-theme - we have experimented with adding a theme to a hackathon. It can help the company to generate ideas and action in a certain area of interest. It also helps to generate more focus within the company on a certain persistent challenge that we feel deserves a solution. Although everyone will be working on different sub-topics the full event will be experienced as more correlated and unified. But be careful not to push normal business-projects disguised as hackathon projects to your teams. This goes against the basic concept of a hackathon. At Vandebron we sometimes pick a theme if we would like to motivate people to think about ideas in a certain direction. But most of the time we keep it open.\n- Participation is optional. - At Vandebron we have autonomous teams with professionals that can manage their own agenda. As a team and as an individual. We put effort in promoting the hackathon by trying to make people enthusiastic about participating. But in the end people make their own decisions. Sometimes the team and company objectives do need to have priority, but the teams are perfectly able to make this judgement call themselves.\n- Magnify impact - show everyone what the impact is they have been making. It is good if people recognize how some projects have become reality and that feedback will be appreciated by the community. It gives people a feeling that the podium of the hackathon is a strong force. And ultimately that is how you also proof the value of organizing a hackathon.\n\nFor our next hackathon we are opening our (virtual) doors also for guests, as we are organizing a GreenTech hackathon with other sustainability minded companies (‘Hack the Planet’ and ‘Top Dutch Solar Racing’). You can find more information and sign up via [this link](https://www.vandebron.tech/greentech-hackathon). It is the first time we do it like this, and we sure will learn another thing or two!\n","meta":{"title":"The power of regular hackathons","description":"At Vandebron we have been organizing a regular hackathon for the last four years. Every three months we organize a two-day event. At first glance this seems quite an investment. Eight days a year, almost losing two working-weeks of productivity for your teams!","createdAt":"Fri Mar 19 2021 01:00:00 GMT+0100 (Central European Standard Time)","coverImage":"images/power-regular-hackathons.png","tags":"hackathon, innovation, scrum","author":"Arno van den Berg","slug":"blog/power-regular-hackathons","formattedDate":"19 maart 2021","date":"Fri Mar 19 2021 01:00:00 GMT+0100 (Central European Standard Time)"}},{"content":"\nIn October 2020 D2IQ [announced](https://d2iq.com/blog/d2iq-takes-the-next-step-forward) that they are moving onwards with their Kubernetes offering. Vandebron has been a D2IQ customer for their DCOS offering, we were just in the middle of a migration of our first workloads to DCOS Enterprise. We have evaluated the D2IQ K8s offering and decided to go for another Kubernetes product. We had a few migrations over the years, we migrated from Azure to AWS, we migrated workloads from normal instances to spot instances and all these migrations were done with nearly any downtime. We plan to reduce the downtime to a couple of minutes this migration and this is a real challenge. The first challenge that we will discuss today: We want to pair our Kubernetes clusters to the DCOS/Mesos clusters, while we move a workload it should be able to connect to its dependencies in the DCOS cluster. We use DCOS for our NoSQL databases like Cassandra, internal data that we want to keep internal. Pairing DCOS and Kubernetes clusters enable us to reduce downtime, enabling us to switch back if we run into issues and move faster because it reduces complexity.\n\n## L4LB\n\nThe internal layer 4 load balancer DCOS provides is used in the majority of our workloads. When our data scientists schedule a spark driver, they connect to the spark dispatcher through the Layer 4 load balancer. Most of the DCOS frameworks use this Layer 4 load balancer as an internal service discovery tool, with Vandebron we use this layer 4 load balancer to communicate between services. In a default DCOS set up this load balancer responds on domain names like: `spark-dispatcher.marathon.l4lb.thisdcos.directory:7077`\n\nWhen we ping the spark dispatcher we get the following:\n\n```bash\nPING spark-dispatcher.marathon.l4lb.thisdcos.directory (11.155.161.35) 56(84) bytes of data.\n64 bytes from 11.155.161.35 (11.155.161.35): icmp_seq=1 ttl=64 time=0.024 ms\n```\n\nAfter some investigation we found out that this IP range is not actually on a network interface, it is a Linux kernel functionality called `IPVS`. With IPVS you can do layer 4 load balancing, you provide the target location and the location you want to respond on.\n\nWhen we search for the IP from the spark dispatcher with ipvsadm, we get 3 results:\n\n```bash\nsudo ipvsadm -L -n |grep --color '11.155.161.35\\|$'\nTCP 11.155.161.35:80 wlc\n -> 10.2.7.146:16827 Masq 1 0 0\nTCP 11.155.161.35:4040 wlc\n -> 10.2.7.146:16826 Masq 1 0 0\nTCP 11.155.161.35:7077 wlc\n -> 10.2.7.146:16825 Masq 1 0 0\n````\n\nAs you can see the IP `11.155.161.35` points towards `10.2.7.146`, even the ports are configured and forwarded. We can add our route with ipvsadm, to understand IPVS a bit better. For example:\n\n```bash\nsudo ipvsadm -A -t 1.2.3.4:80 -s wlc # we add the target server and assign the scheduler\nsudo ipvsadm -a -r 10.2.7.146:16825 -t 1.2.3.4:80 -m # we configure the real server and target server and configure Masquerading\ncurl 1.2.3.4:80\n{\n \"action\" : \"ErrorResponse\",\n \"message\" : \"Missing protocol version. Please submit requests through http://[host]:[port]/v1/submissions/...\",\n \"serverSparkVersion\" : \"2.3.4\"\n}\n```\n\nThis results in that the spark dispatcher now also is available on `1.2.3.4:80`. As mentioned before we wanted to connect our DCOS and Kubernetes clusters, getting hundreds of entries from ipvsadm and manually adding them one by one didn’t sound appealing to us. Especially if you consider that sometimes services fail and run on a different port or different host after recovery, maintaining this by hand would be a nightmare. We therefore decided to build a tool to sync IPVS entries from DCOS to Kubernetes.\n\n## Stack\n\nWithin Vandebron we have our tech stack, we strongly believe it is good to eat your own dog food. When possible and when our use cases are similar we use the same tools as our Developers use. The parts of the stack we will be using are:\n\n- AWS ELB in front of Traefik 1.7\n- DCOS\n- Kubernetes\n\nWithin our platform team, we use Golang as our scripting language. Golang gives us the ability to build binary files with all the required libraries in the binary, we don’t have to install any packages, we do not even need to install Golang on the machine the application will be running on.\n\nIn our DCOS cluster we use Traefik 1.7, this version of Traefik only forwards HTTP requests. We decided to use Traefik to expose a JSON endpoint so we can gather the IPVS information from this location.\n\n## ipvs-server\n\nWithin our DCOS cluster we will expose the IPVS information through a JSON endpoint. We have built a tool for this to expose this information in multiple ways. In the next section, we are going to discuss some of the concepts and choices we made, we won’t deep dive into Go specifics. We have provided the entire code for this project in the examples directory of our GitHub repo:\n\n\nFirst, let’s discuss the library we use: . This library in its essence translates to ipvsadm commands, it helped save us time to implement this ourselves. There are some gotcha’s, such as newlines are not filtered out from the output. We solved this by cleaning up some of the data.\n\nIn the `childChan` function we create a go channel that is responsible for polling `ipvsadm` every 10 seconds and stores the result in a couple of variables we use in our HTTP endpoints. IPVS is a Linux kernel functionality and should be highly performant, we do not want to trigger kernel panics when the server gets overloaded with requests. We expect that every 10 seconds gives us accurate enough results, we can always lower this interval to ensure faster results. We also added in this function the string manipulation to ensure all the newlines were gone in the JSON output. The newline gave issues when we tried to add the IPVS scheduler entries.\n\n```go\nfunc childChan(c chan bool) {\n fmt.Println(\"Starting time based IPVS Admin poll\")\n\n pollInterval := 10\n timerCh := time.Tick(time.Duration(pollInterval) * time.Second)\n // Time based loop to generate Global variable\n for range timerCh {\n select {\n // when shutdown is received we break\n case <-c:\n fmt.Println(\"Received shutdown, stopping timer\")\n break\n default:\n var err error\n listIpvs.Save()\n ipvsString = fmt.Sprintln(listIpvs.Services)\n\n res := &responseObject{\n Services: listIpvs.Services,\n }\n \n ipvsJSONbyte, err := json.Marshal(res)\n if err != nil {\n logToErr.Printf(\"ERROR: -- Marshal JSON -- %v\\n\", err)\n }\n \n ipvsString = string(ipvsJSONbyte)\n ipvsJSON = strings.Replace(ipvsString, `\\n`, ``, -1)\n if debug != false {\n logToOut.Println(\"DEBUG: -- ipvsJSON --\", ipvsJSON)\n }\n }\n }\n}\n```\n\nNext is the index handler, we set our headers correctly and print the result as we would receive through ipvsadm. The index is mainly for our platform engineers to debug and verify the output. Thanks to this overview we found much faster that there was a newline hidden in the scheduler output.\n\n```go\nfunc index() http.Handler {\n // Generating the Index\n return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\n // Only available when debug is on\n if debug != false {\n logToOut.Println(\"DEBUG: -- index --\", ipvsString)\n }\n \n if r.URL.Path != \"/\" {\n http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)\n return\n }\n w.Header().Set(\"Content-Type\", \"text/plain; charset=utf-8\")\n // Site security testers expect this header to be set\n w.Header().Set(\"X-Content-Type-Options\", \"nosniff\")\n w.WriteHeader(http.StatusOK)\n fmt.Fprintln(w, ipvsString)\n })\n}\n```\n\nThe JSON endpoint is what we use in the client communicate with the server. \n\n```go\nfunc jsonz() http.Handler {\n // Generating the Index\n return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\n // Only available when debug is on\n if debug != false {\n logToOut.Println(\"DEBUG: -- jsonz --\", ipvsJSON)\n }\n \n if r.URL.Path != \"/json\" {\n http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)\n return\n }\n w.Header().Set(\"Content-Type\", \"application/json; charset=utf-8\")\n // Site security testers expect this header to be set\n w.Header().Set(\"X-Content-Type-Options\", \"nosniff\")\n w.WriteHeader(http.StatusOK)\n fmt.Fprintln(w, ipvsJSON)\n })\n}\n```\n\nWe ask our Developers often to implement a basic health endpoint, in DCOS we use this to see if a service needs to be restarted. In our application we enable set the statusOK in the index or in the JSON endpoint.\n\n```go\nfunc healthz() http.Handler {\n // Generating the healthz endpoint\n return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n if atomic.LoadInt32(&healthy) == 1 {\n w.WriteHeader(http.StatusNoContent)\n return\n }\n w.WriteHeader(http.StatusServiceUnavailable)\n })\n}\n```\n\nIn our logging and tracing functions we want to register the clients that are connecting, this gives us information where calls are coming from. It helps us debugging if we see weird behaviour.\n\n```go\nfunc tracing(nextRequestID func() string) func(http.Handler) http.Handler {\n // Tracing the http requests so its easier to check if server is reached\n return func(next http.Handler) http.Handler {\n return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n requestID := r.Header.Get(\"X-Request-Id\")\n if requestID == \"\" {\n requestID = nextRequestID()\n }\n ctx := context.WithValue(r.Context(), requestIDKey, requestID)\n w.Header().Set(\"X-Request-Id\", requestID)\n next.ServeHTTP(w, r.WithContext(ctx))\n })\n }\n}\n\nfunc logging(logToOut *log.Logger) func(http.Handler) http.Handler {\n // Creating logging entry tracing the http requests\n return func(next http.Handler) http.Handler {\n return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n defer func() {\n requestID, ok := r.Context().Value(requestIDKey).(string)\n if !ok {\n requestID = \"unknown\"\n }\n logToOut.Println(requestID, r.Method, r.URL.Path, r.RemoteAddr, r.UserAgent())\n }()\n next.ServeHTTP(w, r)\n })\n }\n}\n```\n\nIPVS needs to be executed with root privileges, to ensure this is correct we get the userid and print it when starting the server.\n\n```go\n// getProcessOwner function is to see who is running the process. It needs to be a sudo / root user\nfunc getProcessOwner() string {\n stdout, err := exec.Command(\"ps\", \"-o\", \"user=\", \"-p\", strconv.Itoa(os.Getpid())).Output()\n if err != nil {\n logToErr.Printf(\"ERROR: -- getProcessOwner -- %v\\n\", err)\n os.Exit(1)\n }\n return string(stdout)\n}\n```\n\nWe added the init function to ensure we print results the moment the server starts up, if we would not do this it would take 10 seconds for the go channel to activate\n\n```go\nfunc init() {\n // Placing the Save and val in the init, else we will need to wait for channel to perform its first run\n listIpvs.Save()\n ipvsString = fmt.Sprintln(listIpvs.Services)\n}\n```\n\nIn the main function, we set the configurable flags, such as debugging to show error messages. It proved useful during the creation of this tool to keep track and print output. If we would print the output at every call to our logs, our Elastic cluster would get thousands of logs that add little to no value.\n\nWe configure the listen port in the flags, we can use the portIndex from DCOS to assign a random port on the host to listen on. We also provided to print the version we are running. In our versioning, we use a constant to list the application semver version, we also provide the git-commit hash.\nWhen we begin the server we print the version information, the port we listen on and the user running the process. We then start the server process with the go channel, in setting up the go channel we ensure that when the server stops we try to gracefully stop the server within a 30-second timeframe. Since our ipvsadm timer is 10 seconds it should be able to cleanly shutdown within that period.\n\n### Docker build\n\nIn the repository, we have included a Dockerfile and a script to build the Dockerfile. In this Dockerfile, we pass the git commit hash to the go install. This way we always get the Git Hash from our GitHub repo and we can use this information in our version output.\n\n### DCOS service.json\n\nIn the repository, we have provided the service.json file, since it is opinionated on using Traefik you might need to change it. But in this service.json you see how we set up Traefik, the health check, and port index. Since the Mesos UCR container has fewer abstractions and has fewer limited capabilities. We can run the IPVS server inside a UCR container and get all the output as if we were running this directly as root on the host machine.\n\n## ipvs-client\n\nThe IPVS client is the component we use in the Kubernetes environment. The client connects to the server and gets the IPVS entries from the IPVS server inside our DCOS cluster. It then adds these IPVS entries to each node in the Kubernetes cluster. You, therefore, need to run each client per Kubernetes node.\n\nYou can find the code from the IPVS client in our repository.\n\n```go\nfunc httpGet(remoteURL string) []byte {\n if debug != false {\n _, err := url.ParseRequestURI(remoteURL)\n if err != nil {\n panic(err)\n }\n }\n\n req, err := http.NewRequest(http.MethodGet, remoteURL, nil)\n if err != nil {\n logToErr.Fatalf(\"ERROR: -- new HTTP request -- %v\", err)\n }\n\n ipvsClient := http.Client{\n Timeout: time.Second * 2, // Timeout after 2 seconds\n }\n req.Header.Set(\"User-Agent\", \"go-ipvs-get \\tversion: \"+version+\"\\t Git Commit: \"+gitCommit)\n res, err := ipvsClient.Do(req)\n if err != nil {\n logToErr.Fatalf(\"ERROR: -- ipvsClient -- %v\\n\", err)\n }\n\n if res.Body != nil {\n defer res.Body.Close()\n }\n\n body, readErr := ioutil.ReadAll(res.Body)\n if readErr != nil {\n logToErr.Fatalf(\"ERROR: -- body -- %v\\n\", readErr)\n }\n\n return body\n}\n```\n\nIn the httpGet function we can debug the URL and check if it is valid. Again we set the correct headers and retrieve the JSON body.\n\n```go\nfunc unmarshal(body []byte) []lvs.Service {\n\n res := &responseObject{\n Services: listIpvs.Services,\n }\n\n jsonErr := json.Unmarshal(body, &res)\n if jsonErr != nil {\n logToErr.Fatalf(\"ERROR: -- Unmarshal -- %v \\n\", jsonErr)\n }\n\n if debug != false {\n logToOut.Fatalf(\"DEBUG: -- res -- %v \\n\", res.Services)\n }\n\n r := res.Services\n\n return r\n}\n```\n\nIn the unmarshal function we unmarshal the JSON and turn it in a slice of lvs.Service.\n\n```go\nfunc addServers(remoteAddr string) {\n body := httpGet(remoteAddr)\n jsonData := unmarshal(body)\n\n for i, v := range jsonData {\n if debug != false {\n logToOut.Printf(\"DEBUG: -- range jsonDATA --\\n\")\n logToOut.Printf(\"ipvsCount=%v, value=%v\", i, v)\n }\n\n err := lvs.DefaultIpvs.AddService(v)\n if err != nil {\n logToErr.Printf(\"ERROR: -- AddService -- %v\", err)\n }\n \n i++\n ipvsServerCount = float64(i)\n }\n}\n```\n\nIn the addServers function we add the servers to IPVS.\n\n```go\nfunc clientChan(c chan bool) {\n logToOut.Println(\"Starting time based IPVS Admin add\")\n\n pollInterval := 10\n timerCh := time.Tick(time.Duration(pollInterval) * time.Second)\n // Time based loop to generate Global variable\n for range timerCh {\n select {\n // when shutdown is received we break\n case <-c:\n logToOut.Println(\"Received shutdown, stopping timer\")\n break\n default:\n\n logToOut.Println(\"Clearing & Adding servers...\")\n // Before we add Servers we need to clear the existing list\n lvs.Clear()\n addServers(remoteAddr)\n if debug != false {\n logToOut.Printf(\"IPVS servers added:\\t%v\", ipvsServerCount)\n }\n }\n }\n}\n```\n\nLike we did in the IPVS server we create a go channel to poll every 10 seconds the server endpoint. We perform this to get at a set interval the IPVS entries.\n\nSince we run the IPVS client as a binary directly on the Kubernetes hosts we build the binary with a few parameters we pass to the go build command. The binary we build with this command we host on an internal s3 bucket, we can download this binary with systemd unit files.\n\n```bash\nGOOS=linux\nGOARCH=amd64\nGIT_COMMIT=$(git rev-list -1 HEAD)\n\nexport GOOS\nexport GOARCH\nexport GIT_COMMIT\n\nenv GOOS=${GOOS} GOARCH=${GOARCH} go build -v -ldflags \"-X main.gitCommit=${GIT_COMMIT}\" .\n```\n\nWhen we run the IPVS client we can verify if the IPVS routes are added by running the `ipvsadm -L -n` command.\n\n### Unit files\n\nSince IPVS is part of the Linux kernel it is hard to deploy this in a docker container, the capabilities are more restricted in Kubernetes. We decided to deploy the IPVS client on each host machine through a systemd unit file, the main reason was that we ran into restrictions that slowed us down and this is not a permanent solution. By adding the IPVS client on the machines alone does not make it possible for containers to use the IPVS routes. We needed to add NET_ADMIN capabilities to all containers using the l4lb loadbalancer locations and configure `hostNetworking: true` in the Kubernetes pods.\n\nWe provided a deployment.yml file that runs a Ubuntu docker container with ipvsadm only installed extra. When the pods are deployed in this deployment you can use kubectl exec to get into the pod and run the `ipvsadm -L -n` command.\n\n## Vacancy at Vandebron\n\nWe are looking for a platform engineer in Vandebron. As you can understand this is not a typical scenario we daily run across, but it is part of the workloads that we will support when working on our platform. Within Vandebron we try to use the best technology available, when it is not available we build it. Due to this as platform engineers, we have many interesting challenges and offer engineers to support further than only a strict domain. We support all components of our entire platform, regardless if it is a Linux kernel issue like this, involves setting up and maintaining a NoSQL cluster, or helping the business with something like requesting a certificate.\n\nIf you are interested in learning more about this position, take a look at our Vacancy and get in contact with us.\n\n","meta":{"title":"Migrating from DCOS to Kubernetes, dealing with the l4lb loadbalancer","description":"When you want minimal downtime, you need to build your own tools","createdAt":"Fri Mar 05 2021 01:00:00 GMT+0100 (Central European Standard Time)","coverImage":"images/migrating-dcos-kubernetes-l4lb.jpg","imageSource":"https://pixabay.com/users/praesentator-4372890/","tags":"Kubernetes, k8s, mesos, l4lb, ipvs, ipvsadm","author":"Rogier Dikkes","slug":"blog/migrating-dcos-kubernetes-l4lb","formattedDate":"5 maart 2021","date":"Fri Mar 05 2021 01:00:00 GMT+0100 (Central European Standard Time)"}},{"content":"\nCypress is a game-changer in the automation testing world, the way that Cypress was built and its architecture allows us as testers to cover more scenarios.\n\nCypress is not Selenium; in fact, it is different. And the way to build and design a framework should be different as well.\n\nThe most famous design technique in Selenium is the Page Object Model, and many testers use the same design technique with Cypress. Even that Cypress on their official website [recommended](https://www.cypress.io/blog/2019/01/03/stop-using-page-objects-and-start-using-app-actions/) us not to go with that approach.\n\n## Page Object Model\n\nThe main benefit of using the page object model Is to make the automation framework maintenance-friendly. We can define a specific page's selectors in a separate file and then use these selectors in our test cases.\n\n```js\nclass SignInPage {\n visit() {\n cy.visit(\"/signin\");\n }\n getEmailError() {\n return cy.get(`[data-testid=SignInEmailError]`);\n }\n getPasswordError() {\n return cy.get(`[data-testid=SignInPasswordError]`);\n }\n fillEmail(value) {\n const field = cy.get(`[data-testid=SignInEmailField]`);\n field.clear();\n field.type(value);\n return this;\n }\n fillPassword(value) {\n const field = cy.get(`[data-testid=SignInPasswordField]`);\n field.clear();\n field.type(value);\n return this;\n }\n submit() {\n const button = cy.get(`[data-testid=SignInSubmitButton]`);\n button.click();\n }\n}\nexport default SignInPage;\n```\n\nThe main two downsides using the typical page object model with cypress are:\n\n- Page objects introduce an additional state into the tests, separate from the application’s internal state. This makes understanding the tests and failures harder.\n- Page objects make tests slow because they force the tests to always go through the application user interface.\n\n## Component-Based Architecture\n\nOn the other hand, a React application is component-based, where a specific page will be built from a collection of components. And components in React can be used on different pages too. So if we want to use the Page Object Model, we may define the same locator twice on different pages.\n\nSo having these two facts, At Vandebron, we came up with a new way to design our Cypress Automation framework by creating a separate JavaScript file for every component in our application, inside a folder called `components` within our Cypress project as below:\n\n```js\n// Locators\nexport const getEmailError = () => cy.get(`[data-testid=SignInEmailError]`);\nexport const getPasswordError = () =>\n cy.get(`[data-testid=SignInPasswordError]`);\nexport const emailField = () => cy.get(`[data-testid=SignInEmailField]`);\nexport const passwordField = () => cy.get(`[data-testid=SignInPasswordField]`);\nexport const submitButton = () => cy.get(`[data-testid=SignInSubmitButton]`);\n\n// Actions\nexport const visit = () => cy.visit(\"/signin\");\nexport const performLogin = (email, password) => {\n emailField().clear().type(email);\n passwordField().clear().type(password);\n submitButton().click();\n};\n```\n\nHaving it built this way, we eliminated all the previous problems mentioned earlier; we are not adding any classes, and we are defining objects within our test cases. And the most important part is that we are following the way that Cypress recommends it.\n\nAnd after defining the component locators and actions, we can import them inside our test case and use them as below:\n\n```js\nimport LoginComponent from \"../components/loginComponent\";\nimport Menu from \"../components/Menu\";\n\ndescribe(\"Test Login Page\", () => {\n it(\"should show an error message if the password in wrong\", () => {\n LoginComponent.visit();\n LoginComponent.performLogin(\"email@gmail.com\", \"wrongPassword\");\n LoginComponent.getPasswordError().should(\"be.visible\");\n });\n it(\"should show the logout button if the user logged in succesfully\", () => {\n LoginComponent.visit();\n LoginComponent.performLogin(\"email@gmail.com\", \"correctPassword\");\n Menu.LogoutButton().should(\"be.visible\");\n });\n});\n```\n\nAnd as you can see, our test cases are readable for anyone! And if any locator changes in any of the components, we can easily fix it in one location and from the same file. And lastly, if a component will be used in different places, we can use the same code.\n\nIn the next article, I will talk about how we use Cypress in our manual testing during the sprint and how it saves us tons of time and effort.\n","meta":{"title":"Cypress.io Component Design Technique for React Applications","description":"Cypress is a game-changer in the automation testing world, the way that Cypress was built and its architecture allows us as testers to cover more scenarios.","createdAt":"Fri Feb 05 2021 01:00:00 GMT+0100 (Central European Standard Time)","coverImage":"images/cypress-component-design-technique-for-react-applications.png","tags":"Cypress, Testing, React","author":"Hatem Hatamleh","slug":"blog/cypress-component-design-technique-for-react-applications","formattedDate":"5 februari 2021","date":"Fri Feb 05 2021 01:00:00 GMT+0100 (Central European Standard Time)"}},{"content":"\nIn Vandebron we have been using container clusters to host our services since the foundation of our Big Data team. \nRecently our cluster of choice has declared End-Of-Life development stage, so we decided to take a step forward and get a ticket for the Kubernetes boat.\n\nA change in the OS that is used to run your services and applications can look quite challenging and not everyone is on the same experience level. To make everyone comfortable it is a good choice to give everyone the possibility to play with the new tools and learn what can be done and how: **you need a sandbox.**\n\nOur developers are provided with a Macbook and at the moment of writing there some options you can go for when deciding how to set up your playground:\n\n- **Docker CE Kubernetes**: This is the easiest solution since there is a handy button to run your containers into a Kubernetes environment.\n\n- **Vagrant and Virtualbox**: This solution is the one that can give you more control and you can easily create a cluster the size you want, but you need to be handy with VMs, the hypervisor of choice, and Vagrant. It's the old school way to do it but, while it's a chunk your platform engineers can bite, it can be a steep and frustrating process for people that are not used to handle VMs.\n\n- **Multipass + some bash magic glue**: Since Canonical created this tool for macOS, creating an Ubuntu VM became a breeze and you can have a single, easily manageable VM with its networking up and running in less than a minute, without having to handle disks, distros, and stuff. On top of it, the command line interface is straight forward and it has just the basic commands we will need, so wrapping the entire process into a bash script is a piece of cake.\n\nI have found this super cool in-depth [article](https://jyeee.medium.com/kubernetes-on-your-macos-laptop-with-multipass-k3s-and-rancher-2-4-6e9cbf013f58) from Jason Yee (kudos to you bruh) that guided me through the installation of my first single node Kubernetes cluster.\n\nThe process is not that long but it involves a lot of copy/pasting and, once learned the basics, I didn't want to go under the same process more times, plus it could be interesting for me as a Platform Engineer, but it may be boring and pointless for developers who just want to have a sandbox replica of what they are working on in the remote environment.\nMy automator (aka do-it-once-never-do-it-again) spirit kicked in and I decided to wrap every step in a small command-line tool with only 3 options:\n- **install**\n- **cleanup**\n- **help**\n\n\n### What is happening under the hood\n\nWhat the script does is substantially automating all the steps needed to:\n1. Create a new VM using Multipass (tool released by Canonical)\n2. Fetch the VM IP address and adding it to your local `/etc/hosts` file\n3. Install k3s (a lightweight distribution of Kubernetes) on top of the VM\n4. Install the Kubernetes command-line tools on your laptop\n5. Install Helm (the Kubernetes package manager) on your laptop\n6. Install cert-manager (certificate manager) package on top of your k3s cluster\n7. Install Rancher (a Kubernetes control plane) package on top of your k3s cluster\n\nIf you are looking for a more in-depth breakdown of the single steps you can download and inspect [the script](https://gist.githubusercontent.com/nikotrone/50b1a5f8d137411879eb2467e689bfbe/raw/090b4b4323d96ac28d96bbb346e2e657073722e6/bronernetes) (one of the many advantages of [OpenSource](https://en.wikipedia.org/wiki/Open_source) projects) or checkout and read the original [article](https://jyeee.medium.com/kubernetes-on-your-macos-laptop-with-multipass-k3s-and-rancher-2-4-6e9cbf013f58): it explains line by line what the specific commands are doing.\n\n#### 1. Multipass VM\n[Multipass](https://multipass.run/) is a tool from Canonical (the company developing and maintaining the Ubuntu Linux distribution) that leverages Hyperkit (macOS feature to handle virtualization) to create and handle a Virtual Machine directly on your Mac.\n\n#### 2. Edit /etc/hosts\nOnce we have our VM up and running we need to make it available with an easy url that is also gonna be used to generate the SSL certificate, in our case we picked up `rancher.localdev`.\nIt is important to have a name setup in the beginning since this one will need to match with the certificate so we can use it programmatically.\n\n#### 3. Install K3S\nThis step is pretty straightforward: just fetch a script that is publicly available on the [k3s official website](https://get.k3s.io) and feed it to your bash.\nK3s is a lightweight version of Kubernetes with all the needed dependencies and executable packaged in a convenient installation script. Because of its light nature, it is often used in embedded devices that have a limited amount of resources to offer.\n\n#### 4 & 5. Kubernetes and Helm cli\n**Kubernetes cli** (`kubectl`) is used to talk and interact with your Kubernetes cluster. It can be used to manage multiple clusters according to the content of your KUBECONFIG environment variable. \nThe variable itself contains just a path to where your cluster configuration is stored, so you can switch from a cluster to another by simply pointing to another file that contains the configuration of another cluster.\n\n**Helm** instead is the \"package manager\" of Kubernetes: you can use it to add repositories to specific `charts` which are the blueprint that contains a way to install a specific tool on your cluster.\nBoth of these tools have to be installed and run from your local laptop, either in the case you are managing a local VM or in the case you are interacting with a remote cluster.\n\n#### 6 & 7. cert-manager and Rancher\n\n**Rancher** is the control plane for our cluster: it provides a GUI and an overview of our single node cluster. It offers other goodies like management of multiple clusters, deployed on different locations like AWS Azure and GCP or even on your own hardware, plus certificate deployment and some other handy functionalities.\n\n**cert-manager** is installed via Helm chart and it is the tool used by Rancher to generate and deploy a certificate across the entire cluster.\n\n### How to use it\n\nAll the steps will involve the use of a Terminal window\n#### Installation\nThe first thing you need to do is download [this script](https://gist.github.com/nikotrone/50b1a5f8d137411879eb2467e689bfbe) and save it in a folder on your Mac (let's assume `~/bronernetes`) by executing\n```bash\n mkdir ~/bronernetes\n cd ~/bronernetes\n curl https://gist.githubusercontent.com/nikotrone/50b1a5f8d137411879eb2467e689bfbe/raw/090b4b4323d96ac28d96bbb346e2e657073722e6/bronernetes > bronernetes\n export PATH=$PATH:$(pwd)\n```\n\nNow we have the toolset and you can confirm it works by simply running `bronernetes help`.\n\n#### Spin up Kubernetes\nThe next step is to run the installation process with the command `bronernetes install`\n\n#### Clean up\nWhen you are done or you just want to hard reset your environment you can just type `bronernetes cleanup` and it will take care of cleaning up the VM you just used, leaving you with a pristine machine, as nothing ever happened :)\n\n### Conclusion\n\nHaving a sandbox is very useful to play around with the concepts of a new setup or service and it packs up a huge amount of positive sides. No matter what is the language or the nature of the system you are trying to replicate, it can be challenging and involve a long list of instructions or manual operations and, sometimes, even dedicated hardware. Although with some bash glue, it is possible to automate most of those processes and the investment cost can be enormously beneficial for yourself (less work the next time you do it) and for the other people working with you (they can use the tool, comment and suggest improvements). Most of all, in the case of infrastructure, it helps raise the knowledge of \"what's going on here\" and documents for the ones interested in taking a trip down the rabbit hole.\n","meta":{"title":"How to Spin Up A Kubernetes Cluster On Your Macbook","description":"It is can be useful to create a disposable Kubernetes sandbox to play with when you are exploring a new application and how it could work.","createdAt":"Mon Jan 25 2021 01:00:00 GMT+0100 (Central European Standard Time)","coverImage":"images/spin-up-kubernetes-on-macbook.jpg","imageSource":"https://pixabay.com/it/users/mari_sparrow-13090456/","tags":"Kubernetes, k8s, local","author":"Marco Nicotra","slug":"blog/spin-up-kubernetes-on-macbook","formattedDate":"25 januari 2021","date":"Mon Jan 25 2021 01:00:00 GMT+0100 (Central European Standard Time)"}},{"content":"\nAt Vandebron we're maintaining a component library called [Windmolen](https://windmolen.netlify.app/) (Dutch for \"wind turbine\"). And if you've ever built a component library, you probably dealt with optimizing and converting icons before. With SVGO and SVGR you can do this at scale, without compromising the quality or size of your icons.\n\n## The problem\n\nThe web is full of icons, and often these icons are rendered from SVG files to ensure you can increase (or decrease) the size of the icons depending on the use case. Designers often create these icons from design tools like Adobe Photoshop or Sketch. Although these icons might look pretty, exporting a SVG out of these tools is often difficult as [this article](https://medium.com/sketch-app-sources/the-best-way-to-export-an-svg-from-sketch-dd8c66bb6ef2) explains. Also, added lot of code in the form of metadata is added to the SVG file. Let's have a look at what a typical SVG file exported out of Sketch looks like:\n\n```svg\n\n\n\n \n last\n Created with Sketch.\n \n \n \n \n \n \n\n```\n\nThe SVG file above holds a lot of information about Sketch, such as the `title` of the icon and a `desc`ription. Next to that, there's a lot of elements that could be combined into one element to reduce the file size.\n\n## Optimizing SVGs\n\nWhat's cool about SVG files is that you can optimize and minify them, without affecting what the SVG looks like. This is something you can try out yourself using the website [SVGOMG](https://jakearchibald.github.io/svgomg/), which is powered by the library SVGO that you'll learn more about later.\n\n\nYou can optimize the SVG file above by following these steps:\n\n1. Go to [https://jakearchibald.github.io/svgomg/](https://jakearchibald.github.io/svgomg/)\n2. Click on `Paste markup` an paste the SVG code that you exported from Sketch (a.k.a. the SVG file above)\n3. You will see the icon rendered, now you have to either click at the `Copy as a text` or `Download` button to get the optimized SVG file\n\nWith these simple steps you've optimized the SVG from over 450 bytes, which is already small, to 173 bytes (a decrease of over 62%!). If you'd open this file in the editor of your choice, you can see a lot of the useless (meta)data from the original file has been deleted. Also, the different elements of the SVG are combined in a single `path` that renders the icon:\n\n```svg\n\n\n \n\n```\n\nThis SVG can be even further optimized by checking the \"Prefer viewbox to width/height\" in SVGOMG, but let's save that for later when we use SVGO instead.\n\n## Using SVGO\n\nBy using SVGOMG you've already experienced what power [SVGO](https://github.com/svg/svgo) has, as SVGOMG is described by its creators as *\" SVGO's Missing GUI, aiming to expose the majority if not all the configuration options of SVGO\"*. Instead of using the GUI, you can also use SVGO directly from the command line as a CLI-tool or as a Node.js module. For the sake of this article, we'll be using it solely as CLI.\n\nSVGO can be installed globally on your machine, or locally in your project, from npm by running:\n\n```bash\nnpm i -g svgo\n\n# Yarn equivalent\nyarn add -G svgo\n```\n\nAfter doing this you can run `svgo` from the command line and optimize any SVG file instantly. But, you don't want to do this manually on your machine anytime you're adding a new icon to a project (or component library). Therefore, you can also add SVGO to a project locally and add a script to the `package.json` file to optimize all SVGs in a certain directory.\n\n```json\n// package.json\n{\n // ...\n \"scripts\": {\n // ...\n \"optimize-svg\": \"svgo --config=.svgo.yml -f ./src/assets/icons\"\n }\n}\n```\n\nThe `optimize-svg` script will run SVGO in the directory `src/assets/icons` and optimize all the SVG files based on the settings in `.svgo.yml`. This file is where you can configure the rules for SVGO, as the previously mentioned \"Prefer viewbox to width/height\":\n\n```yaml\n# .svgo.yml\nplugins:\n - removeViewBox: false\n - removeDimensions: true # this deletes width/height and adds it to the viewBox\n - removeDoctype: true\n - removeComments: true\n - removeMetadata: true\n - removeEditorsNSData: true\n - cleanupIDs: true\n - removeRasterImages: true\n - removeUselessDefs: true\n - removeUnknownsAndDefaults: true\n - removeUselessStrokeAndFill: true\n - removeHiddenElems: true\n - removeEmptyText: true\n - removeEmptyAttrs: true\n - removeEmptyContainers: true\n - removeUnusedNS: true\n - removeDesc: true\n - prefixIds: false\n - prefixClassNames: false\n```\n \nFrom the rules above you'll get an idea about all the redundant and useless lines of code that might be present in your SVG files. But luckily, they will all get removed when you run the command `npm run optimize-svg`.\n\n## Converting SVGs with SVGR\n\nYou've now learned how to optimize your SVG files, and are probably wondering how to use these files in a React application. To render an SVG in React, you need to either configure Webpack in a way that it knows how to deal with SVG files or use a library called SVGR. By default, any application created with `create-react-app` can render SVG files as a component, using the following `import` statement:\n\n```jsx\n// MyComponent.jsx\nimport React from 'react';\nimport { ReactComponent as MySVG } from './something.svg';\n\nconst MyComponent = () => {\n return (\n
\n \n
\n );\n}\nexport default MyComponent;\n```\n\nMore information about how this is done can be found in [this article](https://blog.logrocket.com/how-to-use-svgs-in-react/), but let me show you how to solve that with SVGR.\n\nWith [SVGR](https://react-svgr.com/) you can convert SVG files into React Components, either by adding it to Webpack or by using the SVGR CLI or Node.js module. In the same way, as we optimized the SVGs from the command line with SVGO, we can also convert these icons from the command line with SVGR:\n\n```json\n// package.json\n{\n // ...\n \"scripts\": {\n // ...\n \"optimize-svg\": \"svgo --config=.svgo.yml -f ./src/assets/icons\",\n \"convert-svg\": \"svgr -d ./src/components/Icon ./src/assets/icons\"\n }\n}\n```\n\nWhenever you run the command `npm run convert-svg` a JSX file will be created for every SVG file that's present in the directory `src/assets/icons`. These JSX files can be found in the directory `src/components/Icons`, together with an `index.js` file that exports all these components from this directory.\n\nAn example of such a converted SVG file is:\n\n\n```jsx\n// MySVG.jsx\nimport * as React from 'react';\n\nconst MySVG = (props) => (\n \n \n \n);\n\nexport default MySVG;\n```\n\nAnd, as we now have a directory filled with converted SVGs these can be imported into any React component like this:\n\n```jsx\n// MyComponent.jsx\nimport React from 'react';\nimport MySVG from './MySVG.jsx';\n\nconst MyComponent = () => {\n return (\n
\n \n
\n );\n}\nexport default MyComponent;\n```\n\nOften SVGR is used alongside SVGO, so you can even automatically optimize all SVGS that will be converted by SVGR. This is done by adding the flag `--no-svgo true` and point it towards your SVGO configuration file:\n\n```json\n// package.json\n{\n // ...\n \"scripts\": {\n // ...\n \"convert-svg\": \"svgr -d ./src/components/Icon ./src/assets/icons --no-svgo true --svgo-config .svgo.yml\"\n }\n}\n```\n\nBy running the `convert-svg` script you both optimize and convert all the SVG files in `src/assets/icons` to React components based on optimized SVGs.\n\n## Reading further\n\nThe examples in this post are the tip of the metaphorical iceberg on what problems SVGO and SVGR can solve. There are many other features you can enable, such as using them as Node.js modules or enabling TypeScript support. To read further make sure to have a look at the SVGR [playground](https://react-svgr.com/playground/) or [documentation](https://react-svgr.com/docs/getting-started/).\n","meta":{"title":"Optimizing, Converting And Exporting SVG Icons In React","description":"If you've ever build a component library, you probably dealt with optimizing and converting icons before. With SVGO and SVGR you can do this at scale.","createdAt":"Thu Dec 10 2020 01:00:00 GMT+0100 (Central European Standard Time)","coverImage":"images/optimizing-converting-and-exporting-svg-icons-in-react.jpg","tags":"React, component library","author":"Roy Derks","slug":"blog/optimizing-converting-and-exporting-svg-icons-in-react","formattedDate":"10 december 2020","date":"Thu Dec 10 2020 01:00:00 GMT+0100 (Central European Standard Time)"}},{"content":"\nHere at Vandebron, we have several projects which need to compute large amounts of data. To achieve acceptable results, we had to choose a computing tool that should have helped us to build such algorithms.\n\nAs you may have read in other articles our main backend language is Scala so the natural choice to build distributed parallel algorithms was indeed Spark.\n\n## What is Spark\n\nWe will briefly introduce Spark in the next few lines and then we will dive deep into some of its key concepts.\n\nSpark is an ETL distributed tool. ETL are three phases that describe a general procedure for moving data from a source to a destination.\n\n![ETL Diagram](/images/etlprocess.png \"ETL\")\n\n- **_Extract_** is the act of retrieving data from a data source which could be a database or a file system.\n- **_Transform_** is the core part of an algorithm. As you may know, functional programming is all about transformation. Whenever you write a block of code in Scala you go from an initial data structure to a resulting data structure, the same goes with Spark but the data structures you use are specific Spark structures we will describe later.\n- **_Load_** is the final part. Here you need to save (load) the resulting data structure from the transformation phase to a data source. This can either be the same as the extract phase or a different one.\n- **_Distributed_**: Spark is meant to be run in a cluster of nodes. Each node runs its own JVM and every Spark data structure can/should be distributed among all the nodes of the cluster (using serialization) to parallelize the computation.\n\n### Spark data structure: RDD, DataFrame, and Dataset\n\nThe core of Spark is its _distributed resilient dataset (RDD)_.\n\n![Spark API history](/images/sparkapihistory.png \"Spark API history\")\n\nAn **_RDD_** is a collection of elements partitioned across the nodes of the cluster that can be operated on in parallel. _Extracting_ data from a source creates an RDD. Operating on the RDD allows us to _transform_ the data. Writing the RDD _loads_ the data into the end target like a database for example). They are made to be distributed over the cluster to parallelize the computation.\n\nA **_DataFrame_** is an abstraction on top of an RDD. It is the first attempt of Spark (2013) to organize the data inside and RDD with an SQL-like structure. With dataframe, you can actually make a transformation in an SQL fashion. Every element in a dataframe is a Row and you can actually transform a dataframe to another by adding or removing columns.\n\nA **_DataSet_** finally is a further abstraction on top of a dataframe to organize data in an OO fashion (2015). Every element in a dataset is a case class and you can operate transformation in a scala fashion from a case class to another.\n\n## Spark in action\n\nLet’s see now some code samples from our codebase to illustrate in more detail each of the ETL phases.\n\n### Extract\n\nThe extraction phase is the first step in which you gather the data from a datasource.\n\n```scala\nval allConnections = sparkSession\n.read\n.jdbc(connectionString, tableName, props)\n\nval selectedConnections = allConnections\n.select(ColumnNames.head, ColumnNames.tail: _*)\n\nval p4Connections = selectedConnections\n.filter(allConnections(\"HasP4Day activated\").equalTo(1))\n.filter(allConnections(\"HasP4INT activated\").equalTo(1))\n.as[Connection]\n\np4Connections.show()\n```\n\nFor most people the extraction phase is just the first line (the invocation to the read method), they are not wrong because extracting means reading data from a datasource (in this case an SQL server database). I decided to include in this phase also some filtering and projection operations because I think these are not really part of the algorithm, this is still the preparation phase before you actually process the data. We can ultimately say that _preparing the data_ is something in between extraction and transformation therefore it is up to you to decide which phase it belongs to.\n\n### Transform\n\nTransformation phase is the core of the algorithm. Here you actually process your data to reach your final result.\n\n```java scala\nusageDF\n.groupBy('ConnectionId, window('ReadingDate, \"1 day\"))\n.agg(\n sum('Consumption).as(\"Consumption\"),\n sum('OffPeak_consumption).as(\"OffPeak_consumption\"),\n sum('Peak_consumption).as(\"Peak_consumption\"),\n sum('Production).as(\"Production\"),\n sum('OffPeak_production).as(\"OffPeak_production\"),\n sum('Peak_production).as(\"Peak_production\"),\n first('ReadingDate).as(\"ReadingDate\"),\n first('marketsegment).as(\"marketsegment\"),\n collect_set('Source).as(\"Sources\"),\n collect_set('Tag).as(\"Tags\"),\n max('Last_modified).as(\"Last_modified\")\n)\n.withColumn(\n \"Tag\", when(array_contains('Tags, “Interpolated”),\nlit(Tag.Interpolated.toString)).otherwise(lit(“Measured”)))\n.withColumn(\"Source\",\nwhen(size('Sources) > 1,\nlit(Source.Multiple.toString)).otherwise(mkString('Sources)))\n.orderBy('ConnectionId, 'ReadingDate)\n.drop(\"window\", \"sources\", \"tags\")\n```\n\nIn this specific example, we are processing connection usage data by aggregating it daily. In the `usageDF` we have 15 minutes interval usage data, now we want to show to the user the same data but with a different aggregation interval (1 day). So we group the whole data by connection id and window the reading date by 1 day (A window function calculates a return value for every input row of a table based on a group of rows [Introducing Window Functions in Spark SQL - The Databricks Blog](https://databricks.com/blog/2015/07/15/introducing-window-functions-in-spark-sql.html).\n\nOnce the data is grouped we can aggregate it, using the `agg` method which allows us to call the aggregation functions over the dataframe (for example: `sum`, `first`,`max` or `collect_set`). Successively we transform the dataframe to suit our visualization needs, the methods used are self-explanatory and the documentation is very clear. [Getting Started - Spark 3.0.1 Documentation](https://spark.apache.org/docs/latest/sql-getting-started.html)\n\n### Load\n\nThe final phase is the one which `save`, `put`, `show` the transformed data into the target data source.\n\n```java scala\ndataFrame\n.select(columns.head, columns.tail: _*)\n.write\n.cassandraFormat(tableName, keySpace)\n.mode(saveMode)\n.save()\n```\n\nIn this specific case, we will save our dataframe into a Cassandra database. In Spark, methods used to achieve the load phase are called _actions_. It is very important to distinguish Spark actions from the rest because actions are the only ones that trigger Spark to actually perform the whole transformation chain you have defined previously.\n\nIf our transformation phase, as we described above, wasn’t followed by an action (for example `save`) nothing would have happened, the software would have simply terminated without doing anything.\n\n## One concept to rule them all\n\n```java scala\nval rdd1 = sc.parallelize(1 to 10)\nval rdd2 = sc.parallelize(11 to 20)\nval rdd2Count = rdd1.map(\nx => rdd2.values.count() * x //This will NEVER work!!!!\n)\n```\n\n_One does not simply use RDD inside another RDD_. (Same goes for Dataframes or Datasets).\n\nThis is a very simple concept that leads very often to lots of questions because many people just want to use Spark as a normal scala library. But this is not possible due to the inner distributed nature of Spark and its data structures. We have said that an RDD is a resilient distributed dataset, let’s focus on the word _distributed_, it means that the data inside it is spread across the nodes of the cluster. Every node has its own JVM and it is called _Executor_, except for the master node where your program starts which is called _Driver_:\n\n![Spark cluster overview](/images/spark-cluster-overview.png \"Spark cluster overview\")\n\nYour code starts from the Driver and a copy is distributed to all executors, this also means that each executor needs to have the same working environment of the Driver, for Scala it is not a problem since it just needs a JVM to run. (but we will see that if you use _pySpark_ you need to take extra care when you distribute your application.) Every Spark data structure you have defined in your code will also be distributed across the executors and every time you perform a transformation it will be performed to each chunk of data in each executor.\n\nNow let’s go back to our example, a `map` is a transformation on `rdd1` this means that block inside will be executed at the executor level, if we need `rdd2` to perform this block Spark should somehow serialize the whole `rdd2` and send it to each executor. You can understand now that _it is really not possible to serialize the whole RDD since it is by its nature already a distributed data structure_. So what can you do to actually perform such computation we showed in the example? The solution is “simple”: _prepare your data in such a way that it will be contained in one single RDD_. To do so you can take advantage of all the transformation functions Spark has to offer such `map` `join` `union` `reduce` etc.\n\n## Next step…\n\nWe have explained all the main concepts of Spark and we have shown some real snippets of our codebase. In the next article, I would like to show you a real-life problem we have solved in our company using [_pySpark_](https://spark.apache.org/docs/latest/api/python/index.html). I will show you how to customize Spark infrastructure to correctly parallelize the ETL algorithm you have built.\n","meta":{"title":"Fueling the Energy Transition With Spark - Part 1","description":"Our main backend language is Scala, and by using Spark we build distributed parallel algorithms to fuel the Energy Transition. But why is Spark the best choice for that job?","createdAt":"Wed Nov 04 2020 01:00:00 GMT+0100 (Central European Standard Time)","coverImage":"images/fueling-the-energy-transition-with-spark-part-1.jpg","imageSource":"https://www.pexels.com/photo/shallow-focus-photography-of-light-bulbs-2764942","tags":"spark, scala","author":"Rosario Renga","slug":"blog/fueling-the-energy-transition-with-spark-part-1","formattedDate":"4 november 2020","date":"Wed Nov 04 2020 01:00:00 GMT+0100 (Central European Standard Time)"}},{"content":"\nAt Vandebron we organize a two-day long Hackathon every quarter, and a colleague and I took this chance to dig into the wonderful world of GraalVM.\n\nI've first heard of GraalVM around two years ago when Oleg Šelajev toured through Java User Groups in Germany and held talks about GraalVM. [Here](https://www.youtube.com/watch?v=GinNxS3OSi0) is one from 2019 (not Germany, but Spain this time).\n\nGraalVM promises a significant speedup in compile times and as I am working with Scala, which is notoriously known for its long compile times, this seems interesting. Furthermore, GraalVM provides functionality to build native executables. Meaning, an application can be run without a Java Virtual Machine (JVM).\n \nThanks to the Hackathon I finally took the time to get to know GraalVM a bit better. With this blog post, I want to share our findings, experiences, and results, as they might be helpful for you too!\n\n## What is GraalVM?\n\nGraalVM is a high-performance JVM that supports efficient ahead-of-time (AOT) and just-in-time (JIT) compilation, but also allows non-JVM languages (e.g. Ruby, Python, C++) to run on the JVM. The ahead-of-time compilation feature is the base for creating native executable programs, meaning an application can be run independently from the JVM. Seeing the versatile features of GraalVM, it is worth looking a bit under its hood.\n\nActually, GraalVM is defined by three main technologies:\n\n- [Graal compiler](https://www.graalvm.org/reference-manual/jvm/), a high-performance JIT-compiler that can make JVM applications run faster from within the JVM\n- [SubstrateVM](https://www.graalvm.org/reference-manual/native-image/SubstrateVM/), includes the necessary components to run a JVM-app as a native executable ( Garbage Collector, Thread Scheduler, etc.)\n- [Truffle Language Implementation Framework](https://www.graalvm.org/graalvm-as-a-platform/language-implementation-framework/), the basis for the polyglot support from GraalVM\n\nOur motivation for trying out GraalVM was tackling the pain points of Scala, Java projects, and microservices. Shipping microservices written in Scala as Docker containers to your production system comes with the cost that startup can be a bit slow, having JVM and Docker overhead, and that those containers can be fairly large, as the application can only be run with a JVM. See [Building Docker images](#building-docker-images) for more information.\n\nDuring the hackathon, we were most interested in building native images for Scala applications. Hoping to reduce the size of our docker containers and reducing up the startup time.\n\n## Project setup\n\nThe project we worked on during the Hackathon is an API that should be used for applicants to submit their applications at Vandebron in the future. By exposing one endpoint through which a resume and contact information can be submitted.\n\nIt is also a good project to test out GraalVM, nothing too complex but also not as simple as \"Hello World\".\n\nThe full setup can be found [on Github](https://github.com/kgrunert/apply-at-vdb). But I'll summarise the used stack below. The project is built around the following libraries, no particular reason, simply because I like them.\n\n- _cats_ for working with effects, such as IO\n- _http4s_ for running the server\n- _tapir_ for defining the endpoints\n- _circe_ for JSON de/serialisation\n- _pureconfig_ for reading config-files\n- _logback_ for logging\n\nThe project can be run via `sbt run` and with Postman or similar a POST-request can be sent like so:\n\n```json\nPOST localhost:8080/api/v1/apply\n\n{\n\t\"email\": \"my@email.de\",\n\t\"name\": \"My Name\",\n\t\"phoneNumber\": \"+310123456789\",\n\t\"applicationBase64\": \"VGhpcyBjb3VsZCBiZSB5b3VyIGFwcGxpY2F0aW9uIQ==\"\n}\n\nResponse:\n\"*confetti* Thanks for handing in your application, we will get back to you within the next days! *confetti*\"\n```\n\n## Setup GraalVM with sbt\n\nWith this initial project setup in mind, GraalVM needs to be installed locally.\n\nFor the installation of GraalVM the [setup guide](https://www.graalvm.org/docs/getting-started-with-graalvm/#install-graalvm) can be followed.\n\nAfter the installation sbt needs to know that not the regular JDK/JVM is used. This can be done with the `java-home` option on sbt bootup.\nTo make the path to GraalVM a bit more accessible and easy to use it can be exported as an environment variable.\n\n```bash\nexport GRAAL_HOME=/Library/Java/JavaVirtualMachines/graalvm-ce-java8-20.1.0/Contents/Home\nsbt -java-home $GRAALHOME\n```\n\nThe path to GraalVM can vary depending on OS and installation. We followed the basic installation for macOS.\n\nNow sbt using GraalVM can be verified with:\n\n```bash\nsbt -java-home $GRAALHOME\nscala> eval System.getProperty(\"java.home\")\n[info] ans: String = /Library/Java/JavaVirtualMachines/graalvm-ce-java8-20.1.0/Contents/Home/jre\n```\n\nThat means everything running in this sbt instance is getting compiled by GraalVM. Awesome!\n\nThe next step is to become strong and independent and learn how to run without an underlying JVM with the help of building native images.\n\n## Building native images\n\nGraalVM ships with the [GraalVM Updater](https://www.graalvm.org/reference-manual/graalvm-updater/) (`gu`) to install the `native-image` on your machine.\n\n```bash\n$GRAALHOME/bin/gu install native-image\n```\n\n[sbt-native-packager](https://sbt-native-packager.readthedocs.io/en/latest/) provides functionality to build packages efficiently (e.g. building Docker images) and added to that, it also provides support for building native images.\nIn order to build native images with sbt commands this plugin has to be added to the project:\n\n```java scala\n// inside project/plugins.sbt\naddSbtPlugin(\"com.typesafe.sbt\" % \"sbt-native-packager\" % \"1.7.3\")\n```\n\nAnd the `GraalVMNativeImagePlugin` needs to be enabled:\n\n```java scala\n// inside build.sbt\nenablePlugins(GraalVMNativeImagePlugin)\n```\n\nFrom within sbt it should be able to autocomplete and suggest graal-commands, e.g.:\n\n```java scala\nsbt:apply-at-vdb> graalvm\ngraalvm-native-image: graalvmNativeImageOptions\n```\n\nWith that setup, native images are just a stone's throw away!\n\n---\n\n### Disclaimer\n\nThe next three sections are not a write-up but rather the main steps we had to take to make the project work. This includes failing images and troubleshooting.\nI want to keep this in because it might be interesting for others when they have to troubleshoot.\nFor the summary and happy path, you can jump directly to [Roundup](#roundup).\n\n---\n\n### First try building a native image\n\nNext up `graalvm-native-image:packageBin` can be run from within sbt. This might take a while (on our systems it took about a minute)\n\nSome warnings start to pop up:\n\n```\n[error] warning: unknown locality of class Lnl/vandebron/applyatvdb/Main$anon$exportedReader$macro$24$1;, assuming class is not local. To remove the warning report an issue to the library or language author. The issue is caused by Lnl/vandebron/applyatvdb/Main$anon$exportedReader$macro$24$1; which is not following the naming convention.\n\n[error] warning: unknown locality of class Lfs2/internal/Algebra$Done$2$;, assuming class is not local. To remove the warning report an issue to the library or language author. The issue is caused by Lfs2/internal/Algebra$Done$2$; which is not following the naming convention.\n```\n\nThe library-specific warnings can be ignored for now. Ultimately it fails with:\n\n```\nError: com.oracle.graal.pointsto.constraints.UnresolvedElementException:\nDiscovered unresolved type during parsing: org.slf4j.impl.StaticLoggerBinder.\nTo diagnose the issue you can use the --allow-incomplete-classpath option.\nThe missing type is then reported at run time when it is accessed the first time.\n```\nActually a good hint on where to start fine-tuning the GraalVM config:\n\n```java scala\n// inside build.sbt\ngraalVMNativeImageOptions ++= Seq(\n\t\"--allow-incomplete-classpath\",\n)\n```\n\nSome things like a `StaticLoggerBinder` only get resolved at runtime, meaning at build time the classpath needs to be allowed to be incomplete. This option allows resolution errors to be ignored at build time and only pop up during runtime.\n\nDuring the build of a native image, GraalVM tries to resolve those runtime dependencies already at compile-time, as it is part of the Ahead-Of-Time-compilation process. With this flag, GraalVM knows \"hey, don't worry about it now, we cross the bridge when we get there\" (or something like that).\n\n### Adding resource files\n\nA `reload` (or restart) of sbt is needed to activate these new options. And we can try to build the native image up new.\nThis time the build finished successfully and the executable file `target/graalvm-native-image/apply-at-vdb` has been created!\nThis is an executable that can be run without a JVM:\n\n```bash\ntarget/graalvm-native-image/apply-at-vdb\n```\n\nBut what's that? It actually cannot be started...\n\n```bash\ntarget/graalvm-native-image/apply-at-vdb\n\nSLF4J: Failed to load class \"org.slf4j.impl.StaticLoggerBinder\".\nSLF4J: Defaulting to no-operation (NOP) logger implementation\nSLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.\n*** An error occured! ***\nCannot convert configuration to a de.erewl.pricetracker.server.Config. Failures are:\nat the root:\n- Key not found: 'host'.\n- Key not found: 'port'.\n```\n\nThe first three lines relate to the error that occurred during the first build. It simply says that logging hasn't been set up correctly (maybe due to the absence of a `src/main/resources/logback.xml` or some other misconfiguration), triggering the default setting of not logging anything at all.\nThe second error states that a configuration file does not have the right keys or cannot be found at all.\nLooking into `src/main/resources`:\n\n```bash\nls src/main/resources/\napplication.conf logback.xml\n```\n\nand peeking into `application.conf`:\n\n```bash\ncat src/main/resources/application.conf\n\thost = \"localhost\"\n\tport = 8080\n```\n\nHm, so everything is actually in place. But somehow GraalVM can't find those files.\nIt still requires some more GraalVM fine-tuning here.\n\nBy default, GraalVM doesn't include any resource or configuration-files.\nThe option `-H:ResourceConfigurationFiles=path/to/resource-config.json` defines a path to a JSON configuration file. So inside the `resource-config.json` we can include our `application.conf` and our `logback.xml`.\n\nBut writing those config files can be tedious and it is difficult in larger projects to find all necessary classes that need to be included. GraalVM provides some support with writing those files and actually does all the work. In the project's root directory a configs-folder can be created which will contain all necessary config-files.\n\nFor writing the configuration files we will build a normal JAR-file with the help of the `sbt-assembly` plugin. Adding it to the project like so:\n\n```java scala sbt\n // inside project/plugins.sbt\n addSbtPlugin(\"com.eed3si9n\" % \"sbt-assembly\" % \"0.14.6\")\n```\n\nThe JAR-file will be built with `sbt assembly`.\n\nWith that we can now start the application, providing the path to the JAR-file that just has been created:\n\n```bash\nmkdir configs\n$GRAALHOME/bin/java -agentlib:native-image-agent=config-output-dir=./configs -jar target/scala-2.12/apply-at-vdb-assembly-0.1.0-SNAPSHOT.jar\n```\n\nWith the command above the JAR gets to run with GraalVM but adds [dynamic lookups](https://www.graalvm.org/reference-manual/native-image/Configuration/#assisted-configuration-of-native-image-builds) that are being intercepted during runtime and written to the files: `jni-config.json`, `proxy-config.json`, `reflect-config.json` and `resource-config.json`.\n\nThose generated files can be included in the GraalVMNativeImageOptions:\n\n```java scala\n// build.sbt\ngraalVMNativeImageOptions ++= Seq(\n\t\"--allow-incomplete-classpath\",\n\t\"-H:ResourceConfigurationFiles=../../configs/resource-config.json\",\n\t\"-H:ReflectionConfigurationFiles=../../configs/reflect-config.json\",\n\t\"-H:JNIConfigurationFiles=../../configs/jni-config.json\",\n\t\"-H:DynamicProxyConfigurationFiles=../../configs/proxy-config.json\"\n)\n```\n\nThe build with those updated options should succeed and the app can be run once again: \n\n```bash\ntarget/graalvm-native-image/apply-at-vdb\n\nSLF4J: Failed to load class \"org.slf4j.impl.StaticLoggerBinder\".\nSLF4J: Defaulting to no-operation (NOP) logger implementation\nSLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.\n```\n\nStill no logging, sadly. But the server is actually running and responds to POST requests via its exposed endpoint:\n\n```json\nPOST localhost:8080/api/v1/apply\n\n{\n\t\"email\": \"my@email.de\",\n\t\"name\": \"My Name\",\n\t\"phoneNumber\": \"+310123456789\",\n\t\"applicationBase64\": \"VGhpcyBjb3VsZCBiZSB5b3VyIGFwcGxpY2F0aW9uIQ==\"\n}\n\nResponse:\n\"*confetti* Thanks for handing in your application, we will get back to you within the next days! *confetti*\"\n```\n\nThe next and last step will investigate why logging is not picked up by GraalVM.\n\n### Investigating the missing logging\n\nSo first I wanted to have a look if it was an overall issue with logging. I stepped back from using logging-framework and tried the most basic logging with the java-integrated `java.util.Logging`. GraalVM's [docs](https://www.graalvm.org/docs/Native-Image/user/LOGGING) stated that GraalVM supports any logging that depends on that.\n\nBuilding and running the native-image with `java.util.Logging` instead of `logback` succeeded and everything is logged properly.\n\nSo it must be something with the dependencies?\n\nFor further investigation, I added the [sbt-dependency-graph](https://github.com/jrudolph/sbt-dependency-graph) plugin and checked out the dependency-tree with `sbt dependencyBrowserTree`. The library `logback` wasn't included in the dependency tree.\nWhich is odd, since `logback` is clearly present in the project's library-dependencies.\n\n```java scala\n// inside build.sbt\nlibraryDependencies ++= Seq(\n\t...\n\t\"ch.qos.logback\" % \"logback-classic\" % \"1.2.3\" % Runtime,\n\t\"ch.qos.logback\" % \"logback-core\" % \"1.2.3\" % Runtime,\n\t...\n)\n```\n\nHaving a closer look, the appendix `% Runtime` on logback's dependency is present.\n\nNot sure where this was coming from but it is most probably blindly copy-pasted from somewhere when gathering the dependencies for this project.\n\n[sbt reference manual](https://www.scala-sbt.org/1.x/docs/Scopes.html#Scoping+by+the+configuration+axis) states that the appendix `Runtime` defines that this dependency will be only included in the runtime classpath.\n\nSo this explains probably why logging was only working when the server was run from inside sbt.\n\nWith removing this and building the native-image, `logback` appears in the dependency-tree, and logging works when the native image is executed!\n\nThis \"bug\" was interesting as it emphasized what GraalVM can NOT do for you. Dynamic class loading/linking can not be supported by GraalVM as classes and dependencies have to be present during compile time to make a fully functional application. \n\n### Roundup\n\nA successful setup of sbt and GraalVM to build native-images requires to:\n\n- install GraalVM's native-image functionality via it's graal-updater: \n ```bash\n gu install native-image\n ```\n- add sbt-native-packager and sbt-assembly to sbt:\n ```java scala sbt\n // inside project/plugins.sbt\n addSbtPlugin(\"com.typesafe.sbt\" % \"sbt-native-packager\" % \"1.7.3\")\n addSbtPlugin(\"com.eed3si9n\" % \"sbt-assembly\" % \"0.14.6\")\n ```\n- enable the GraalVM-Plugin:\n ```java scala sbt\n // inside build.sbt\n enablePlugins(GraalVMNativeImagePlugin)\n ```\n- create a fat JAR and define which resource and configuration files should be intergated by intercepting look up calls during its execution:\n ```bash\n sbt assembly\n mkdir configs\n $GRAALHOME/bin/java -agentlib:native-image-agent=config-output-dir=./configs -jar target/scala-2.12/apply-at-vdb-assembly-0.1.0-SNAPSHOT.jar\n ```\n- fine-tune GraalVM with the following options and include the files that have been created in the previous step:\n ```java scala\n // build.sbt\n graalVMNativeImageOptions ++= Seq(\n \"--allow-incomplete-classpath\",\n \"-H:ResourceConfigurationFiles=../../configs/resource-config.json\",\n \"-H:ReflectionConfigurationFiles=../../configs/reflect-config.json\",\n \"-H:JNIConfigurationFiles=../../configs/jni-config.json\",\n \"-H:DynamicProxyConfigurationFiles=../../configs/proxy-config.json\"\n )\n ```\n- build the native image with:\n ```bash\n sbt graalvm-native-image:packageBin\n ```\n- run the executable file without the need of java\n ```\n ./target/graalvm-native-image/apply-at-vdb\n ```\n\nEven without benchmarking, you notice that the startup time is way faster than with a traditional JAR-file and the application is up and running almost instantly.\n\nIt is worth noting that the creation of a native image is a quite time-consuming process. For this project, it took between 1 and 2 minutes. This is, of course, something a CI/CD-Server like Jenkins would take care of but it has to be kept in mind. \n\nWith a working native-image, it is time to dockerize.\n\n## Building Docker images\n\nIn this section two Docker containers will be built. One, following the \"normal\"-java way and the other will be using the native-image to build a Docker-container without Java.\n\nBefore getting started with native images, a regular JAR-file and Docker image for comparison can be built.\n\nWith the [sbt-assembly](https://github.com/sbt/sbt-assembly) plugin you can create JAR-files with all of its dependencies (fat JARs).\n`sbt assembly` creates this `target/scala-2.12/apply-at-vdb-assembly-0.1.0-SNAPSHOT.jar` which has a size of around 42MB:\n\n```shell\n sbt assembly \n ls -lh target/scala-2.12/apply-at-vdb-assembly-0.1.0-SNAPSHOT.jar\n\n ... ... 42M target/scala-2.12/apply-at-vdb-assembly-0.1.0-SNAPSHOT.jar\n```\n\nThis application can be run locally via `java -jar target/scala-2.12/apply-at-vdb-assembly-0.1.0-SNAPSHOT.jar` with the prerequisite that Java is installed on that machine.\n\nCreating the Docker image for this JAR-file can be done manually, but luckily `sbt-native-package` supports building regular Docker images out of the box, only the `DockerPlugin` needs to be enabled:\n\n```java scala\n// build.sbt\nenablePlugins(DockerPlugin)\n```\n\n`sbt docker:publishLocal` creates the Docker image `apply-at-vdb`.\n \n```shell\ndocker images | grep apply-at-vdb\n apply-at-vdb \t0.1.0-SNAPSHOT \t\tf488d4c06f28 \t555MB\n```\n\nA whopping 555MB for a tiny app exposing one endpoint which JAR-file was only 42MB. But to run this JAR-file in a container, this container needs to ship with a JVM, and that's where the overhead lies.\n\nWith that Docker image and JAR-file as a reference, we can now look into how the native-image operates together with Docker.\n\nGraalVM does not support cross-building, meaning an application cannot be expected to be built in a MacOS environment and run in a Linux environment. It has to be built and run on the same platform. With the help of Docker, the desired built environment can be provided.\nThe `Dockerfile` looks as follows:\n```docker\nFROM oracle/graalvm-ce AS builder\nWORKDIR /app/vdb\nRUN gu install native-image\nRUN curl https://bintray.com/sbt/rpm/rpm > bintray-sbt-rpm.repo \\\n\t&& mv bintray-sbt-rpm.repo /etc/yum.repos.d/ \\\n\t&& yum install -y sbt\nCOPY . /app/vdb\nWORKDIR /app/vdb\nRUN sbt \"graalvm-native-image:packageBin\"\n\nFROM oraclelinux:7-slim\nCOPY --from=builder /app/vdb/target/graalvm-native-image/apply-at-vdb ./app/\nCMD ./app/apply-at-vdb\n\n```\n\nAnd can be run with:\n```bash\ndocker build -t native-apply-at-vdb .\n```\nThe Dockerfile describes to do the following:\nThe first docker container, as the name implies, is the builder. As a base image the official [GraalVM image](https://hub.docker.com/r/oracle/graalvm-ce) is used. \n\nThis image needs two more things, GraalVM's native-image command, and sbt, and this is what the two follow-up rows are providing. Once that's done, the project is copied into this container and the native image is built from within sbt.\n\nThe next steps bring the native executable into its own docker container.\nAs a base image, we use an Oracle Linux image and from our builder-container, we copy the native executable to this new container. The last step is that the app gets run on container startup.\n\n`docker run -p 8080:8080 -it native-apply-at-vdb` starts the container and shows that everything is working just as before.\n\nBut what about the image size? Let's have a look.\n```\ndocker images | grep apply-at-vdb\n native-apply-at-vdb\t\tlatest 17b559e78645\t\t199MB\n apply-at-vdb\t\t\t0.1.0-SNAPSHOT f488d4c06f28\t\t555MB\n```\nThat is impressive! We created an app that is approx. 2.8 times smaller than our original app.\n\n## Summary\n\nWe learned how to set up a Scala project with GraalVM, what steps have to be taken to build a native image with GraalVM, and let it run inside a Docker container. We also received a good overview of what's possible with GraalVM and what's not.\n\nThe initial start and setup of GraalVM with sbt is pretty easy and straightforward. Getting GraalVM to compile an sbt project is nice and simple. \n\nThis Hackathon showed us that it is difficult and requires a lot of fine-tuning to integrate GraalVM into an existing project or product. At Vandebron we work with a complex stack of technologies including Spark, Kafka, and Akka which made it difficult to port the findings from this small toy service to one of our existing microservices. This made extensive troubleshooting in the Hackathon not possible.\n\nAll in all, GraalVM allows you to give up some Java overhead and create significant smaller Docker images. Sadly, this comes at the cost of giving up dynamic linking and class loading. \nA silver lining is, that inside Scala's ecosystem this rarely a problem. Scala relies heavily on compile-time mechanisms for detecting bugs early and creating type-safe applications (read [here](https://blog.softwaremill.com/small-fast-docker-images-using-graalvms-native-image-99c0bc92e70b) but also see e.g. [Scala's compiler phases](https://typelevel.org/scala/docs/phases.html)).\n\n* * *\n\n## Sources and Reading\n- [Building Serverless Scala Services with GraalVM](https://www.inner-product.com/posts/serverless-scala-services-with-graalvm/) by Noel Welsh\n- [Small & fast Docker images using GraalVM’s native-image](https://blog.softwaremill.com/small-fast-docker-images-using-graalvms-native-image-99c0bc92e70b) by Adam Warski\n- [Run Scala applications with GraalVM and Docker](https://medium.com/rahasak/run-scala-applications-with-graalvm-and-docker-a1e67701e935) by @itseranga\n- [Getting Started with GraalVM and Scala](https://medium.com/graalvm/getting-started-with-graalvm-for-scala-d0a006dec1d1) by Oleg Šelajev\n- [Updates on Class Initialization in GraalVM Native Image Generation](https://medium.com/graalvm/updates-on-class-initialization-in-graalvm-native-image-generation-c61faca461f7) by \nChristian Wimmer\n- [GraalVM's Reference Manuals](https://www.graalvm.org/reference-manual/)\n","meta":{"title":"Building native images and compiling with GraalVM and sbt","description":"At Vandebron we organized a two-day long Hackathon, a colleague and I took the chance to dig into the wonderful world of GraalVM.","createdAt":"Tue Oct 06 2020 02:00:00 GMT+0200 (Central European Summer Time)","coverImage":"images/building-native-images-and-compiling-with-graalvm-and-sbt.jpg","imageSource":"https://pixabay.com/users/lumix2004-3890388/","tags":"graalvm, scala","author":"Katrin Grunert","slug":"blog/building-native-images-and-compiling-with-graalvm-and-sbt","formattedDate":"6 oktober 2020","date":"Tue Oct 06 2020 02:00:00 GMT+0200 (Central European Summer Time)"}},{"content":"\nTwo months ago, I started my journey at Vandebron. One of the projects I first dove into was their efforts to build a [component library](https://windmolen.netlify.app/). Something I was already familiar with from previous companies I worked at. \n\nOn the internet, you can find many articles that describe why a reusable component library is a good investment for your development team(s). Although there's much to say about the advantages of component libraries, most articles don't state the (obvious) disadvantages such projects can have. In this post, I'll point out some of our learnings and why you might not need such a reusable component library.\n\n## About component libraries\n\nOften you find yourself repeating the same lines of code to make, for example, a button or the layout of a page look nice, especially when you're working on multiple projects. Or as a designer, you get frustrated every time the styling for a part of the application is off when a new page or project is created. Many companies have already found multiple solutions to preventing themselves from repeating styling, which is the main reason for design inconsistencies. And therefore component libraries were created.\n\nA component library is a collection of all the styled parts (or components) of a website or multiple websites that make it easier for developers to reuse these parts. Also, designers will know for sure that all components in the component library adhere to their designs, and therefore all projects that use these components will conform. Often these libraries consist of different layers of components, for example, offering atoms, molecules, and organisms when an [Atomic Design](https://bradfrost.com/blog/post/atomic-web-design/) pattern is applied. Following this pattern, developers can use the parts to style their templates and pages consistently.\n\nComponent libraries are becoming more and more popular with the rise of JavaScript libraries and frameworks like React and Vue. These technologies are very suitable for quickly building interactive components that you can use in your application, and can easily be exposed as a library on NPM or Github Packages. At Vandebron, we're building all our web and mobile applications with React and React Native and are using [Storybook](https://storybook.js.org/) to develop our components in a shared library between the engineering and design teams. This can potentially create a lot of advantages for both the developers and designers, as you can read below.\n\n## Why you *might* need a component library\n\nBefore deciding to create a component library for your team or company, you probably want to hear about the advantages such a project can lead to. The main advantages of component libraries are briefly mentioned in the first section above and are often defined as:\n\n- **Reducing code duplication**: With a component library, you can create components that can be shared across multiple websites or applications. This way you no longer have to duplicate styling in different projects. This can seriously decrease the amount of code duplication that you have in your projects, also reducing the number of bugs or design inconsistencies.\n\n- **Preventing design inconsistencies**: By adding all your components and styled parts to the component library you're certain that these will look the same on all the places they're used. Not only will all the components look the same on every page, when designers make a change to one of these components they can be easily updated on all the places they're used.\n\n- **Easier collaborating**: Component libraries make it easier for developers and designers to collaborate on applications and designs, with the component library as the common \"playground\". By using a tool, like Storybook, you can also make this playground visible to non-technical people and show what components are already available to use for new features.\n\nBut these advantages come at a certain price, as I'll explain in the next section.\n\n## Disadvantages of component libraries\n\nBesides the obvious advantages of a component library, it can also have serious disadvantages that are listed below. Whether or not these disadvantages apply to you depends on numerous things that are discussed later on in this article.\n\n- **Increasing complexity**: With all attempts to make code more generic, an increased level of complexity also comes to play. Reusable components should be easy to extend or customize, which requires you to think about the different use cases beforehand or force you to add many different variations to a component. With every new project that starts to use the component library, you get the risk of increasing the complexity of the library even more.\n\n- **Time-consuming**: Every time you want to add a component to your project, you need to create that component in the component library first and import it locally in the project to test it. Therefore you need to be working in multiple projects at the same time, which requires you to set up a more time-consuming workflow. Also, when you want to use this new component from the library, you have to publish a new version of the library to make the component available.\n\n- **Conflicting dependencies**: When you're using different versions of dependencies across your projects and the component library, you're forced to sync those with each other. Imagine having, for example, an older version of React running in one of your projects that doesn't use a recent React API that you want to use in your component library. In this scenario, you either have to update that project or are unable to keep your component library on par with the latest release of your dependency on React. Both solutions have pros and cons, and would rather be avoided.\n\nAs mentioned before, there are reasons why these disadvantages might apply to you that are the team size, the number of teams and projects at the company, development or release lifecycles, and how your source code is organized. It clearly doesn't make sense to invest in a component library if you have just a small amount of people work on just one project, or a sole team is working on all the different projects making it easier to manage code duplication or design inconsistencies.\n\n## Considerations before starting\n\nThere are two main alternatives that you need to take into consideration before building a reusable component library, which is (obviously) using or extending an existing component library or sourcing your code in a monorepo. \n\n- **Existing component libraries:** Using an existing component library is an efficient way to create consistently (web) pages and reduce the amount of complexity of your own project, while also taking advantage of best practices of large open-source projects. Popular examples of component libraries are [Ant Design For React](https://ant.design/docs/react/introduce) or [various implementations](https://material.io/develop) for Google's Material Design. These libraries allow you to move quickly without having all the overhead of creating complex components but limit you to the design guidelines of these component libraries.\n\n- **Monorepo:** If you don't want to take advantage of existing libraries or are very keen to apply your own styling to components across multiple applications without having to copy-paste the code, you can host the source code of applications in a monorepo. With the monorepo approach, you can create a shared folder that includes all the components used by your applications. This makes it possible to apply changes with a simple pull request and import these components from every project in that repository.\n\nBesides these two alternatives, you also need to have proper design guidelines set by your designer(s). When the design guidelines are flexible and fluctuating, you could be structuring components incorrectly with the risk of doing a lot of work that will be omitted once the project evolves.\n\n## To summarize\n\nComponent libraries are a great way to reduce the amount of code duplication in your applications, prevent design inconsistencies, and increase collaborations between developers, designers, and different teams. But this comes with increased complexity, slower development cycles, and possible code conflicts between projects. Therefore you should consider if using an existing component library or having a monorepo for your source code is a workable solution. At Vandebron we decided to build our own component library (called [windmolen](https://windmolen.netlify.app/)) and if you'd decide the same, then be sure that your design guidelines are properly structured and mature enough.\n","meta":{"title":"When (Not) To Build A Reusable Component Library","description":"You can find much information on why a reusable component library is a good investment, but most articles don't state the (obvious) disadvantages..","createdAt":"Mon Oct 05 2020 02:00:00 GMT+0200 (Central European Summer Time)","coverImage":"images/when-not-to-build-a-reusable-component-library.jpg","imageSource":"https://pixabay.com/users/stevepb-282134/","tags":"React, component library","author":"Roy Derks","slug":"blog/when-not-to-build-a-reusable-component-library","formattedDate":"5 oktober 2020","date":"Mon Oct 05 2020 02:00:00 GMT+0200 (Central European Summer Time)"}}]},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/index.json b/_next/data/unZqyVZ1CsU_nHhJXE4Yb/index.json deleted file mode 100644 index 874053dfb..000000000 --- a/_next/data/unZqyVZ1CsU_nHhJXE4Yb/index.json +++ /dev/null @@ -1 +0,0 @@ -{"pageProps":{"posts":[{"content":"\n## The Background\n\nWe at Vandebron have a mission to get the news out about [our good work](https://vandebron.nl/missie), and we understand that [Server Side Rendering (SSR)](https://web.dev/articles/rendering-on-the-web#server-side) can really help with that. Among other things, it provides an easy way for search engines to discover our pages, so you, our (future?!) customer, can find them more easily. That means more people choosing green energy, and ultimately, a cleaner environment! 🎉\n\n## We rolled our own\n\nThe year was 2017, Covid was still a word that sounded more like a bird than anything else... The world was heating up and Vandebron was 4 years into its mission to bring 100% renewable energy throughout all of the Netherlands.\n\nAs far as web technologies are concerned, 4 years was ages ago. It was a time when NextJS was less than a year old, and Remix was still several years from coming out. But we needed a way to deliver that high-quality content to all of you. So, the innovators that we were, we decided to build our own SSR framework. In short, we wanted pizza, but there were no pizza shops in town... So we made our own!\n\nIt's been great but not without issue...\n\n\n \n \n \n \n
\"ugly-window-mock\"\"remix-migration-mocking-a-window\"
\n\n\n\n## A Short Note: Why Server Side Rendering\n\nYou might not be satisfied with the short explanation of why we picked an SSR framework in the first place. This article isn't really about that - if you're interested in more analysis on when and where to choose an SSR framework, check out these excellent articles from Splunk:\n* [The User Experience (UX) Benefits of SSR](https://www.splunk.com/en_us/blog/learn/server-side-rendering-ssr.html)\n* [The SEO Benefits of SSR](https://www.splunk.com/en_us/blog/learn/server-side-rendering-ssr.html)\n\n## Decisions Made the Right Way - A Comparison\n\nNowadays, there are better, industry standard technologies available! I.e. pizza shops have opened nearby!! Let's find a good one. Of course, you don't want to just go to any spot. Especially if there's more than one shop in town - you'd be silly not to check which one is closest, and look at the menu. Which one has better reviews, is that one very angry customer just upset that there wasn't any anchovies in the vegan pizza shop? What were they expecting anyway?\n\"vegan-pizza-shop\"\n\nAt Vandebron we're a React shop, so we limited ourselves to just SSR frameworks supporting React. The choice of one framework over another is of crucial importance, so, as part of our analysis, we built a small part of our [vandebron.nl/blog](https://vandebron.nl/blog) page twice. Two of our engineers then presented these prototypes to our Front End Guild, and this discussion fed heavily into the Architecture Decision Record that we wrote comparing the results.\n\n\\* At Vandebron, Guilds are groups of engineers from disparate teams that are interested in a single domain: i.e. Backend, Frontend, IAM and Auth, etc. \n\nThe Background for the decision record states this:\n\n> _\"Our Frontend currently uses a custom-built, hard to maintain SSR solution, which we'd like to replace with a modern and standard library. Possible candidates are NextJS and Remix. The goal is to investigate which one suits our needs best.\"_\n\nYes, there are other options we could have considered but we wanted to stay with a tried-and-tested framework and one that was compatible with our existing React setup.\n![remix-migration-adr-options-considered.png](../images/remix-migration-adr-options-considered.png)\n\nAs you can see, the comparison between the two frameworks was very similar. In the end we favoured the simple, opinionated direction of Remix over that of the more full-featured but potentially complex setup of NextJS. Even though Remix has a smaller community, we attributed this mostly to the age of the framework and not the quality of the framework itself. Though the Positivity has gone down a bit (as listed in [the 2023 StateOfJS survey](https://2023.stateofjs.com/en-US/libraries/meta-frameworks/),) the decrease has been relatively minor and in line with most-other frameworks (notable exceptions for Astro and SvelteKit which have both seen big upticks in both Usage and Positivity)\n![State of JS Positivity](../images/remix-migration-sojs-framework-positivity.png)\nFinally, we noted that NextJS is tightly coupled with Vercel. At Vandebron we value platform independence and not getting tied to specific hosting providers or platforms. Remix gives us the independence we're looking for by providing a SSR framework without a potential to be tied into other solutions/platforms in the future.\n\nOutcome\n> _\"Most members favoured Remix’s focus on web standards and usage of standard libraries and were put off (a little) by NextJS’s uncertainty in development direction.\"_\n\n## So, How's it Going?\n\nThe migration effort is still underway but already we can report that it's going quite well - developers are excited to work on the new tech stack because it's seen as a developer-friendly platform and one of the two leading frameworks in the industry. In the words of one engineer: \"Dev experience has improved massively, it's fun, it's easy to work with\"\nHere are some of the things we still need to work on:\n- Our Docker image is quite large as it includes all the `node_modules`. We think we can clean this up a bit by using Yarn's Plug'n'Play (PnP) feature which should lead to faster image-build times and faster container startup times.\n- With our custom SSR solution, we use Redux Toolkit (RTK) and RTKQuery on the server... This is of course an anti pattern on the server, since server-side logic should be stateless. The Remix framework does already tries to be smart with it's loaders, so the benefits we might have gotten from RTK aren't needed there.\n- We feel the application we're migrating from is doing too much - it includes our marketing pages like the _Blog_ and _Mission_ pages we've been working on for the initial release, as well as the pages for our our signup and renewal process (become a Vandebron customer [here](https://vandebron.nl)!!!) This is a separate conversation, and ultimately one for the FE Guild, but the existing app's size and purpose is making the migration take longer than it should, and forcing us to put some routing rules in place to make sure the right parts of our old site are getting swapped out for the new.\n- Previously, many of the images and PDFs we used on our website were checked directly into the repo. Part of our migration to Remix made us realize we should be using a CMS for this. We are already integrated with a CMS, we just need to be making better use of it in some cases.\n- We haven't explored the Remix-specific linting rules yet. While we're confident in the existing React and TS lint rules we already have, it seems like configs like [@remix-run/eslint-config](https://www.npmjs.com/package/@remix-run/eslint-config) could be quite handy.\n","meta":{"title":"Choosing Remix as a Server-Side Rendering (SSR) Framework","description":"We had our own custom SSR framework. It was time to move on. Find out why we picked Remix over NextJS as the replacement!","createdAt":"Fri Oct 18 2024 02:00:00 GMT+0200 (GMT+02:00)","coverImage":"images/remix-migration-remix-vs-nextjs.png","tags":["remix","ssr","typescript","react","nextjs","ADR"],"author":"John Fisher","slug":"blog/choosing-remix-as-an-ssr-framework","formattedDate":"18 oktober 2024","date":"Fri Oct 18 2024 02:00:00 GMT+0200 (GMT+02:00)"}},{"content":"\n\n## Salesforce + FlowRunner golden age\n\nSince 2015, Vandebron has been using Salesforce. At the time, Salesforce for Vandebron, was like a Swiss Army knife - versatile, multifunctional, and seemingly capable of addressing most of the business requirements. It quickly became the central hub for various operations - it became a workspace for agents, a CTI platform, a platform to send service emails and much more. Over time, Salesforce evolved beyond just a customer relationship management tool for Vandebron. It became a full-fledged platform that managed customer-related processes, such as the Signup process, Renewal process, Meter Reading process, etc. \nTo support this transition, Vandebron developed a custom mechanism known as FlowRunner, which was designed to automate and execute these processes within Salesforce.\nInitially, FlowRunner seemed like the perfect solution. It was tailor-made to handle the increasingly complex workflows that Vandebron needed to manage. While it successfully managed to support Vandebron’s operations for several years, this system was not without its flaws. These issues, which will be discussed in detail later, eventually led to the need for a more robust and scalable solution. But for a time, FlowRunner did its job, enabling Vandebron to leverage Salesforce far beyond its original purpose.\n\n\n## Salesforce + FlowRunner solution problems\n\n\nBroadly, the problems can be divided into two categories: technical and organizational.\n\nTechnical Problems: \n- Async Transactions Daily Limit. 250000 async transactions per 24 hours. For bulk processes, it is often not enough. We need to watch it carefully and adjust settings to avoid disaster.\n- Number of concurrent async jobs. Up to 5 async jobs simultaneously. \n- The FlowRunner mechanism in Salesforce creates lots of data. It uses ~ 25% of our storage. Data is expensive in Salesforce. \n- The Salesforce platform is not equipped for a custom BPM solution.This makes the Vandebron Salesforce codebase too large to be used with Salesforce DX (Salesforce CI/CD product). Furthermore, it forces us to maintain a lot of custom code that is available on the market.\n\nOrganizational Problems:\n- Centralization of Customer-Related Processes: With most customer-related processes embedded in Salesforce, any changes to these processes require intervention from the Salesforce team. This centralization creates a bottleneck, as all modifications, updates, and optimizations must pass through a single team, slowing down the overall pace of innovation and response.\n- Domain Overlap and Knowledge Dilution: The Salesforce team at Vandebron is responsible for managing approximately 50 different processes, each belonging to various business domains. This wide scope of responsibility leads to a dilution of expertise, as the team cannot maintain deep knowledge of every process. The result is a lower overall level of understanding and efficiency, making it difficult to ensure the smooth operation and timely updates of all processes.\n\n\n\n## Point of no return\n\nAt the beginning of 2022, Europe was hit by an unprecedented energy crisis. Gas and electricity prices skyrocketed, fluctuating unpredictably, and placing immense pressure on energy providers like Vandebron to adapt swiftly. In response, Vandebron introduced a solution designed to navigate this volatile market: the Flexible Variable Tariffs proposition.\nFrom a technical standpoint, implementing this new offering required the execution of a relatively complex process - Flow_VariableTariff for approximately 50% of our customer base. However, it soon became clear that the FlowRunner mechanism and Salesforce in general were not sufficient to handle the demands of this new process. The total execution time for Flow_VariableTariff was projected to be enormous, spanning over 20 days, which was far too long for a business that needed to respond rapidly to market changes.\nRecognizing the urgency of the situation, we immediately sought ways to optimize the process. While we succeeded in significantly simplifying Flow_VariableTariff, these improvements alone were insufficient to meet our needs. It was at this critical juncture that we realized Salesforce and the FlowRunner were no longer adequate for Vandebron’s evolving requirements. The limitations of these tools became glaringly apparent, signaling the need for a more powerful and flexible solution to support our operations in the face of such a dynamic and challenging environment.\n\n\n## Why Camunda?\n\nChoosing the right process orchestration tool is a critical decision, especially for a company like Vandebron, where efficient workflow management is essential for operational success. To ensure we made the best choice, we began by establishing a set of criteria that the new tool needed to meet. These criteria were designed to address our current challenges and future-proof our operations. Here are some of the most crucial criteria:\n- Compliance with BPMN 2.0 Standard: We prioritized tools that adhered to the BPMN 2.0 standard. This would make any future migration to another tool less painful, ensuring a smoother transition if needed.\n- CI/CD Integration: The ability to seamlessly integrate the tool with Vandebron's CI/CD pipeline was crucial. This integration would allow us to automate deployments, streamline updates, and maintain a high level of consistency across our development processes.\n- Support for Multiple Programming Languages: Given our diverse technology stack, we needed a tool that allowed us to implement flowstep logic in multiple programming languages, with a particular emphasis on supporting Scala, which is heavily used within our systems.\n- Unit Testing: The tool had to enable us to unit-test individual steps and parts of flows. This capability was essential for ensuring the reliability and accuracy of our processes before they were deployed to production.\n\nOur market analysis of process orchestration tools led us to evaluate five potential solutions:\n- Camunda 8\n- IBM Business Automation Workflow (BAW)\n- Bonita\n- Kogito\n- Flowable\n\n\nEach vendor provided us with a demo and/or a trial version of their product. During this evaluation process, we rigorously tested each tool against our criteria. Although all five options met our hard requirements, it quickly became evident that Camunda is the true leader in the market.\n\nSeveral factors contributed to our decision to choose Camunda:\n\n- SaaS Offering: Camunda's SaaS version provided us with the flexibility and scalability we needed, reducing the burden on our infrastructure and allowing us to focus on process management rather than platform maintenance.\n- Comprehensive Documentation: Camunda's clear and well-organized documentation made it easier for our teams to learn and implement the tool effectively, reducing the learning curve and speeding up the integration process.\n- Out-of-the-Box Connectors: Camunda offers a wide range of connectors right out of the box, enabling quick integration with various systems and services. This saved us time and effort, allowing us to implement new workflows faster.\n- User-Friendly Interface: The tool's intuitive and clean UI made it accessible to both technical and non-technical users, facilitating collaboration across teams and improving overall efficiency.\n- Responsive Support: Camunda's quick and helpful support was another decisive factor. Their team was readily available to assist us with any issues or questions, ensuring a smooth onboarding experience.\n\nIn the end, Camunda stood out as the optimal choice for Vandebron’s process orchestration needs, offering the perfect balance of functionality, usability, and support.\n\n## First steps with Camunda\n\nBefore we could begin migrating our processes from Salesforce to Camunda, it was essential to establish a robust infrastructure that would allow Camunda to seamlessly integrate with the rest of Vandebron’s ecosystem, particularly Salesforce. Since Salesforce would continue to serve as the primary workspace for our agents, we needed to ensure smooth communication and data flow between the two platforms. To achieve this, we developed several key infrastructural applications:\n\n- CamundaGateway: Camunda API (Zeebe API) operates using the gRPC protocol, which is not natively supported by Salesforce. To bridge this gap, we created the CamundaGateway, a proxy application that translates HTTP calls into a format that Zeebe API can understand. This application acts as an intermediary, enabling effective communication between Salesforce and Camunda.\n- CamundaSync: Each Camunda process instance has a corresponding representation in Salesforce. To keep the status of these instances up to date across both platforms, we implemented CamundaSync. This job regularly pulls the status of process instances from Camunda and updates the relevant records in Salesforce, ensuring that agents always have access to the most current information.\n- CamundaJobWorker: Not all process steps can be handled by simple connectors like the RestConnector. Some steps are more complex and require custom logic to be executed. To manage these, we developed the CamundaJobWorker service, which contains handlers for these complex process steps. This service allows us to extend Camunda’s capabilities and handle sophisticated workflow requirements efficiently.\n- BPM app (React): Certain processes require input from users, particularly agents working within Salesforce. To facilitate this, we built the BPM app, which includes a set of forms necessary for running specific processes. This application ensures that agents can interact with and influence the workflow directly from their workspace, maintaining the user experience they are accustomed to.\n\n\n![A schematic overview of the camunda infrastructure](../images/camunda_infrastructure.png \"A schematic overview of the camunda infrastructure\")\n\nAs of September 2024, we have successfully implemented the basic infrastructure needed for Camunda integration, and three customer-related processes have been migrated from Salesforce to Camunda, with several more in progress. \nIt's important to highlight that the migration process involved a comprehensive analysis of the existing process, including the removal of legacy components, identification of common errors, and targeted optimization efforts. As a result, we achieved a substantial reduction in errors. Specifically, the Flow_Renewal process, which previously had a 2% failure rate, now experiences only a 0.62% dropout rate post-migration, reflecting a 69% decrease in errors.\n\n\n## Future plans\n\nBy the end of the year, we aim to migrate up to 10 processes to Camunda, further reducing our reliance on Salesforce for process orchestration. In parallel, we plan to enhance our infrastructure applications—CamundaGateway, CamundaSync, CamundaJobWorker, and the BPM frontend app - to improve their performance, scalability, and ease of use. These enhancements will ensure that our systems remain robust and efficient as we expand our use of Camunda across more of Vandebron's operations.\nMoving forward, We will continue to leverage Camunda's capabilities to automate and optimize more processes, ultimately driving greater efficiencies and innovations across Vandebron.","meta":{"title":"Camunda BPM migration","description":"Migration from Salesforce Flow_Runner to Camunda BPM","createdAt":"Wed Sep 04 2024 02:00:00 GMT+0200 (GMT+02:00)","coverImage":"images/camunda-rising.png","tags":["salesforce","camunda","bpm","process_orchestration"],"author":"Andrei Karabovich","slug":"blog/salesforce-camunda-bpm-migration","formattedDate":"4 september 2024","date":"Wed Sep 04 2024 02:00:00 GMT+0200 (GMT+02:00)"}},{"content":"\n# Cassandra, it’s not you, it’s us\n\nI want you to know that you are probably an amazing product that has so much to offer to the world. However, it sadly just isn’t working out for us anymore.\n\nWe've encountered challenges such as escalating costs, inconsistent write and read performances, and setup misalignments that have constrained our growth. Of course, this is not entirely your fault, we set you up to fail with our infrastructure and use cases.\n\nI hope we can part on good terms, with mutual respect and appreciation for the time we shared. \nI wish you all the happiness, success, and fulfilment in the world, and I hope you find a company that complements your life in the way you deserve.\n\nThank you for understanding, and I truly wish you the best.\n\nYours truly, Vandebron\n\n## Our Data Storage Prince Charming\n![data-prince-charming.jpg](../images/data-prince-charming.jpg \"Data Prince\")\n\nA list of some of the qualities we are looking for:\n- Kindness and compassion. \n- High availability.\n- Low Maintenance.\n- Ability to store large volumes of data (currently around 10TB), though not everything has to be queried fast.\n- Capable of ingesting real-time energy usage data (every 15 minutes per customer, possibly higher frequency in the future).\n- Ideally, we can use our current tech stack as much as possible (flyway migrations, roundtrip tests, spark).\n- Ideally, use as few different database technologies as possible.\n- It does not need to be horizontally scalable, due to moving from 1 central data storage to a separate data storage per service.\n\nWith enough work, time and commitment, Cassandra could have fulfilled most of these requirements. However, love is a two-way street, and we didn't put in the time and effort to make it work.\n\n## Speed Dating Round\nSome potential suitors we considered for replacing Cassandra:\n\n#### ScyllaDB\nScyllaDB is very similar to Cassandra. It should have better performance but still have (almost) all the same functionality as Cassandra.\n\n#### PostgreSQL\nPostgreSQL is a relational database. We already use it extensively in our services.\n\n#### Cockroach\nIt is similar to PostgreSQL but with some limitations: [Known Limitations in CockroachDB v23.2](https://www.cockroachlabs.com/docs/stable/known-limitations.html)\n\nIt is horizontally scalable, which is an advantage over PostgreSQL when it comes to high availability and fault tolerance. We are also currently using it in some of our services.\n\n#### Timescale\nTimescale is a PostgreSQL extension that uses the same query layer, but a different storage layer, to have efficient time series-related features.\n\nIt can also distribute data, but this is still in early access and is not recommended.\n\n#### Yugabyte\n\nYugabyte is a PostgreSQL extension to make PostgreSQL into a distributed database.\n\n## Comparisons\n\nTo determine the most suitable match, we did some quick performance tests. One where we inserted 2 million + weather data records as fast as possible via recurring inserts, to see how easy it would be to migrate over to. And another test to determine general query speed.\n\n### Write Speed Results\n![insert-perf-database.jpg](../images/insert-perf-database.jpg \"Insert Graph\")\n\nNote that the test results are not 100% fair, because Timescale and Postgres don’t have to distribute the data over multiple nodes (though Timescale does have 2 replicas), and Cassandra already contained a lot of data (though with some testing timescale didn’t seem to become slower when it already had more data). For Yugabyte and Cockroach, we gave up after 1 hour. Also, the tests were done with the existing setup for Cassandra.\n\n### Query Speed Results\n![query-perf-database.jpg](../images/query-perf-database.jpg \"Query Graph\")\n\nWe also did some tests to query aggregated data from streaming data.\n- For this, we copied over 2.6M rows to each database.\n- For this data we need to aggregate (sum) some values per 15-minute time block).\n- For Cassandra/Scylla, this is done via spark.\n- For timescale use buckets based on timestamps.\n- For Postgres by grouping on floor(extract(epoch from timestamp) / 60 / 15)\n\n## Our Happily Ever After\n\nTimescale emerged as the clear winner here, not just for its performance in the above tests, but also for its seamless integration with our existing PostgreSQL setup. This compatibility allows us to maintain our current libraries and reduce code complexity, making Timescale an ideal choice for our time series data. At the same time, we continue to rely on Postgres for our other needs.\n\nCassandra, you won’t be missed.","meta":{"title":"Cassandra, it’s not you, it’s us","description":"Our Journey to find the perfect data storage solution for us","createdAt":"Fri Feb 16 2024 01:00:00 GMT+0100 (GMT+01:00)","coverImage":"images/heart-breaking.jpg","tags":["cassandra","timescale","postgresql"],"author":"Tomás Phelan","slug":"blog/cassandra-its-not-you-its-us","formattedDate":"16 februari 2024","date":"Fri Feb 16 2024 01:00:00 GMT+0100 (GMT+01:00)"}},{"content":"\nThe title of this article could have also been \"*Getting Rid of an Unmanageable Legacy Data Model*\", but after a year-long migration project the current title does more justice to the progress made. \n\n#### Compiled Legacy as a Data Model\n\nOur former data model was a series of parallel custom python jobs all covering every step of the *Extract-Transform-Load* (ETL) process from sources into report. Specific transformation got performed a numerous amount of times in multiple different jobs, daily. This made us prone to bugs, slow on development and maxing out on compute. \n\nThe situation became so pressing that keeping alive simple reporting to the business became a daily burden on the Data Analytics team, limiting resources for advanced analytics and leveraging data sources for competitive insights.\n\nWe concluded the old set-up to be outdated and looked around for current best practices concerning data infrastructure. Trying not to reinvent the wheel and staying away from designing custom solutions that had bitten us in the past, we decided to adopt a combination of *Snowflake*, *dbt* and *Lightdash* to start forming a new data landscape.\n\nThis revamping of the set-up gave us the opportunity to start over, using the power of *dbt* to create a modular data model where you could leverage different stages of data, while creating shared definitions, a single source of truth and documentation.\n\n#### What We Came Up With?\n\nWe went for a pretty classic *dbt* data model design, introducing 5 layers of data: staging, entity, intermediate, mart and api. Each layer serving a specific purpose.\n\n##### Staging\n\nWith all data coming in from different sources, this is where we ensure the data all adheres to the same conventions and formatting. This introduces a nice developer experience for the next layers, by introducing consistency across different sources. It also serves as the go to place for advanced or deep dive analysis that do not get answered by the downstream layers, which could potentially spark data modelling developments.\n\n##### Entity\n\nAfter uniforming the data, we create entities that form the building blocks of the downstream layers and analyses of our business analysts. We built entities along the core aspects of our product, capturing shared definitions in data and bringing together relevant features using the *One-Big-Table* (OBT) principle. We try to refrain from long queries or extensive use of CTE's, resulting in simplistic models. These models serve our business analysts by reducing the complexity of their queries with all joins and filters taken care of, denormalizing the database structure. This has shifted the place where ad-hoc BI requests are fulfilled from the central data team to the domain business teams, applying principles of a data mesh.\n\n##### Intermediate\n\nWith some models rising in complexity and computation, we use the intermediate layer to split this complexity and computation across multiple models. These intermediate models are rarely queried because they serve no reporting or analytical purpose. Think of incremental date spine explosions or highly complex business logic broken down into multiple models.\n\n##### Mart\n\nThis is the main layer where we provide self-service to less technical employees within the organization, creating ready-made tables. We aggregate along date spines and dimensions to create readable models. It is where we leverage *Lightdash* metrics to create dynamic tables to provide business teams with a certain amount of freedom in terms of the granularity and dimensions they want to report on in their dashboarding. The use of entities as building blocks has aligned reporting across domain business teams, creating a single and centralized source of truth and relieving the data team from explaining distinctions. So while the dimensions can be tweaked for specific use cases, the definitions of the metrics are set in code.\n\n##### API\n\nWith some dependencies outside of the data model, we use an API layer on top of our mart to record exposures towards different services and provide views which explicitly contain only the necessary datapoints.\n\n![A schematic overview of the data model structure](/images/schematic_data_layers.jpg \"A schematic overview of the data model structure\")\n\n#### The Process\n\nWe decided to take advantage of the chaos created by the old situation: no real single source of truth gave us the opportunity to create a truth. Investigating business teams' needs, we created data definitions in entities. We kept a pragmatic approach to these definitions, being flexible towards business teams' specific needs but also limiting the allowed complexity or number of exceptions. The new data model should answer everyone's questions, but should also be understood by everyone.\n\nWe forced ourselves to have descriptions for all data from the entity layer onwards, because only defining and describing the entities in code is not enough. We leveraged the embedded business analysts' knowledge to form the descriptions, noting that the best description is the one the user understands (because they wrote it).\n\nWith the ready-made marts in place, we decided to give away most of the dashboarding responsibility to the business teams. The embedded analysts are very apt at defining and designing their relevant insights into dashboards. The central data team only took ownership of company wide dashboards and provided support on the dashboarding where necessary.\n\nAfter the adoption of the new stack, we noticed that the more technical embedded analysts were very interested in learning a new tool and language. So, we started a data model group and onboarded multiple embedded business analysts as data model developers. This has massively increased the speed of development of the data model. Primarily, because of specific business domain knowledge not needed to be transferred to the developers in the central data team first, but the knowledge holders developed models themselves. The central data team took on a different role: providing infrastructural support, improving on efficiency, monitoring costs and creating a vision and strategy for organic but structured growth.\n\n![A schematic overview of the final self-servicing data model product](/images/schematic_data_product.jpg \"A schematic overview of the final self-servicing data model product\")\n\n#### What Did We Learn?\n\nFew key takeaways:\n\n- Some business teams have more requirements in terms of definitions than other teams, so if other teams allow, be pragmatic and just go for the stricter requirements.\n- Enabling self-service analysis means giving away control, take this into account in your data descriptions. They should be clear and concise.\n- Educate users on the designed structure of the data model, explain what layer serves which purpose and what questions can be answered how and where.\n- Create clear communication and support channels for the business to kickstart the adoption, you are not the only one learning a new tool.\n- Data is not only for the data team, so encourage those passionate and enthusiastic analysts to co-create! (Just keep an eye on the project.) ","meta":{"title":"Creating a Self-Service Data Model","description":"How we migrated to a modern data stack to enable self-servicing across the business","createdAt":"Wed Feb 07 2024 01:00:00 GMT+0100 (GMT+01:00)","coverImage":"images/self_service.jpg","tags":["dbt","snowflake","lightdash","datamodel","self-service"],"author":"Mats Stijlaart","slug":"blog/creating_a_self-service_data_model","formattedDate":"7 februari 2024","date":"Wed Feb 07 2024 01:00:00 GMT+0100 (GMT+01:00)"}},{"content":"\n\n# Authenticate Snowflake rest api via Keycloak\n\nHere in Vandebron we use Keycloak as our identity and access management (IAM) solution and Snowflake as our data warehousing platform. \nKeycloak is a powerful and extensible solution for managing user identities and access control, making it a popular choice for organizations seeking a comprehensive and open-source IAM platform.\nSnowflake is designed to handle and analyze large volumes of data with speed and efficiency. It is known for its scalability, flexibility, and ease of use in managing and analyzing diverse and massive datasets.\n\n## Accessing Snowflake data via Rest API\n\nThere are several ways to access data in Snowflake one of these are the Snowflake rest api, they are a comprehensive set of REST APIs for managing and interacting with various aspects of the Snowflake Data Cloud, including account management, data loading, querying, and more.\nThese REST APIs allow developers to programmatically perform tasks such as executing SQL queries, managing virtual warehouses, and administering user roles. They are designed to enable automation and integration with other applications and services.\n\n## Why via Rest Api?\n\nThe Snowflake SQL API is a REST API that you can use to access and update data in a Snowflake database. You can use this API to develop custom applications and integrations that can perform most of the queries you need. More info here: [Snowflake rest api](https://docs.snowflake.com/en/developer-guide/sql-api/index)\n\nWe decided to connect our microservices to snowflake via rest api mainly because we consider this mechanism the best way to decouple database processing with backend processing in fact the queries issued via the endpoint are processed inside Snowflake ecosystem asynchronously.\n\nThe service can poll snowflake to monitor the request until it is completed. See [Sql api response](https://docs.snowflake.com/en/developer-guide/sql-api/handling-responses) .\n\nUsing api communication has other very good benefits:\n\n- No additional library dependency\n- No Additional spark connectors\n- Since there is no way to run snowflake on a local machine unit test a snowflake connection would have been very hard ( impossible ). With Rest api communication we can unit test snowflake api client using contract test. ( one way contract test is better than nothing )\n\n## Snowflake Authentication\n\nSnowflake provides a convenient way to authenticate to it using “any” OAuth authentication server. Our authentication server is Keycloak so in the following sections you will learn how to integrate Keycloak with Snowflake.\nResources to this topic can be found here [auth-ext-overview ](https://docs.snowflake.com/en/user-guide/oauth-ext-overview) and here: [oauth-ext-custom](https://docs.snowflake.com/en/user-guide/oauth-ext-custom)\n\n\n## Keycloak side\n\nYou need to configure your client to return in the JWT access token the following claims:\n\n```json\n{\n \"aud\": \"\",\n \"iat\": 1576705500,\n \"exp\": 1576709100,\n \"iss\": \"\",\n \"scope\": [\n \"session:role-any\"\n ]\n}\n```\n\nmost of them are returned by default. Aud claims is the only one you should add\nTo add `aud` claim you can add a new mapper to your client with type Audience see image:\n\n![keycloak_aud.png](../images/keycloak_aud.png \"Keycloak aud mapper\")\n\n**Note**: You need to add a custom audience with the value **equal** to the login_name attribute value in snowflake. The audience value will be used to look up to the right user in snowflake integration\n\nThen you need to add the snowflake scope to your scope list: session:role-any\nFinally you can check that your token is correct:\n\n```json\n{\n .....\n \"iss\": \"https://test.vdbinfra.nl/auth/realms/vandebron\",\n \"scope\": \"session:role-any\",\n \"aud\": \"energy-trading-test\",\n ....\n}\n```\n\nThe `aud` must contain only the snowflake login_name. For instance, a token such as the following will not work (multiple audiences):\"aud\": [ \"batterypack-services-test\", \"account\" ],\n\n## Snowflake side\n\nHow to find keycloak public key: [stackoverflow](https://stackoverflow.com/a/57457227)\nRequired: `ACCOUNTADMIN` rights in Snowflake.\nExample integration command:\n\n```sql\ncreate or replace security integration external_oauth_keycloak_test\ntype = external_oauth\nenabled = true\nexternal_oauth_type = custom\nexternal_oauth_issuer = 'https://test.vdbinfra.nl/auth/realms/vandebron'\nexternal_oauth_rsa_public_key = ''\nexternal_oauth_audience_list = ('energy-trading-test')\nexternal_oauth_scope_mapping_attribute = 'scope'\nexternal_oauth_token_user_mapping_claim = 'aud'\nexternal_oauth_any_role_mode = 'ENABLE'\nexternal_oauth_scope_delimiter = ' '\nexternal_oauth_snowflake_user_mapping_attribute = 'login_name';\n```\n\nNote: the external_oauth_scope_delimiter setting must be enabled separately by Snowflake support.\nNext, you need to set the login name for the user you want associate with the integration:\n\n![snowflake_auth_conf.png](../images/snowflake_auth_conf.png \"Snowflake auth configuration\")\n\n### Example\n\nLet’s authenticate with keycloak as we do normally:\n\n```curl\ncurl --location --request POST 'https://keycloak.test-backend.vdbinfra.nl/auth/realms/vandebron/protocol/openid-connect/token/' \\\n--header 'Content-Type: application/x-www-form-urlencoded' \\\n--data-urlencode 'grant_type=client_credentials' \\\n--data-urlencode 'client_id=energy-trading' \\\n--data-urlencode 'client_secret='\n```\n\nNow you should get the token. Optional: van verify the token directly in snowflake with SQL:\n\n```sql\nSELECT SYSTEM$VERIFY_EXTERNAL_OAUTH_TOKEN( '' )\n```\n\nUse it in the snowflake statement endpoint. For example:\n\n```curl\ncurl --location --request POST 'https://.eu-central-1.snowflakecomputing.com/api/v2/statements?async=true' \\\n--header 'Authorization: Bearer \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n\"statement\": \"select \\\"data\\\" as prediction, to_number(\\\"lats\\\", 10, 4) as lats, to_number(\\\"lons\\\", 10, 4) as lons, \\\"scaledValueOfFirstFixedSurface\\\" as scaled_value_of_first_fixed_surface, to_timestamp_tz( concat(\\\"dataDate\\\", lpad(\\\"dataTime\\\", 4, 0)) || '\\''+0'\\'', '\\''yyyymmddhh24mi+tzh'\\'') as model_datetime, to_timestamp_tz( concat(\\\"validityDate\\\", lpad(\\\"validityTime\\\", 4, 0)) || '\\''+0'\\'', '\\''yyyymmddhh24mi+tzh'\\'') as predicted_datetime, insert_date_snowflake, current_timestamp()::timestamp_tz(9) as insert_date_staging from raw.icon_eu.alhfl_s;\"\n}'\n```\n\nNB: It is important to use the proper snowflake base url. In my case I am using https://.eu-central-1.snowflakecomputing.com/ where is my account identifier which was authorised during configuration phase the snowflake user the token is referring to in the clientId claim.\nYou should get a response such as:\n\n```json\n{\n \"code\": \"333334\",\n \"message\": \"Asynchronous execution in progress. Use provided query id to perform query monitoring and management.\",\n \"statementHandle\": \"01aafc80-3201-abed-0001-4a0e00e52816\",\n \"statementStatusUrl\": \"/api/v2/statements/01aafc80-3201-abed-0001-4a0e00e52816\"\n}\n```\n\nNow you can follow the async operation to the following get endpoint:\n\n```http\nhttps://.eu-central-1.snowflakecomputing.com/api/v2/statements/01aafc80-3201-abed-0001-4a0e00e52816\n```\n\nIt will return 202 if the processing is still ongoing. It will return 200 and the actual result when processing ends.\n\nHappy coding!","meta":{"title":"Authenticate Snowflake via Keycloak","description":"How to use Keycloak to authenticate against Snowflake rest api","createdAt":"Tue Dec 19 2023 01:00:00 GMT+0100 (GMT+01:00)","coverImage":"images/snowflake_keycloak.jpg","tags":["keycloak","snowflake","rest","oauth","bearer token","authentication","security"],"author":"Rosario Renga","slug":"blog/authenticate-snowflake-rest-api-using-keycloak","formattedDate":"19 december 2023","date":"Tue Dec 19 2023 01:00:00 GMT+0100 (GMT+01:00)"}},{"content":"\nIn our sustainable journey at Vandebron, we are not only striving to revolutionize the renewable energy sector, but we are also rethinking how we interact with technology ourselves. As a part of this initiative, we have been looking at how to reduce our digital footprint. One of our most recent projects involves transforming our ageing fleet of iMacs into revitalized, lightweight machines. \n\nWe proudly introduce the 'flexMac'.\n\n### Regained speed, sustainability and enhanced security\nOur customer contact department, the core of our operation, was equipped with older iMacs running on slower HDD drives. While replacing these machines with newer models might have been the easier route, it didn't align with our commitment to sustainability. \n\nInstead, we decided to be creative and look for ways to upcycle our older iMacs. Our choice of tool? Google's ChromeOS Flex. As the slogan suggests, [‘don’t bin it, just flex it’](https://www.linkedin.com/feed/update/urn:li:activity:7066377989831233536/) we figured this could very well meet our wishes. By installing this onto our iMacs, we have given birth to our new line of workstations, naming them 'flexMacs'.\n\n[ChromeOS Flex](https://chromeenterprise.google/os/chromeosflex/) is a free, open-source operating system by Google that breathes [new life into older PCs and Macs](https://cloud.google.com/blog/products/chrome-enterprise/chromeos-flex-ready-to-scale-to-pcs-and-macs). It's lightweight, fast, and ideal for the web-centric applications and services our customer contact department uses every day. Once ChromeOS Flex was installed, the transformation was remarkable. The old machines metamorphosed from very slow to production-ready again in a breath, adept at handling all our workflows at the Customer Contact department.\n\nThese workflows at Customer Contact are fully web-based. It enables us multichannel support, integration capabilities, and data-driven insights. These help our support agents to provide personalized and efficient service across various communication channels. By using these technologies and insights, we optimize our customer service strategies, leading (hopefully) to higher customer satisfaction.\n\nAnother important benefit of this transformation was an added layer of security. ChromeOS Flex allows our users to log in using their Google identity, ensuring a personalized and secure workspace for every team member. This means each user experiences a secure, tailored environment, whilst bringing an additional level of security and control to our IT operations.\n\n### The importance of circularity\nBesides the operational benefits, the broader environmental impact of this initiative is important to us. By extending the life of our technology, we contribute directly to reducing e-waste, one of [the fastest-growing waste streams in the EU](https://www.europarl.europa.eu/news/en/headlines/society/20201208STO93325/e-waste-in-the-eu-facts-and-figures-infographic). As a company, Vandebron is not only promoting sustainable innovations but striving to actively embody them. Our 'flexMacs project is a testament to this commitment.\n\nOur 'flexMacs' project demonstrates how we can repurpose and upgrade older hardware, which according to Emerce is a [hot thing to do](https://www.emerce.nl/achtergrond/circulaire-hardware-is-hot-dit-is-waarom). We hope this blogpost inspires you to consider similar sustainability initiatives. By choosing to upgrade rather than replace, we extend the life of existing hardware and contribute to a reduction in e-waste.\n\nStay tuned for more updates from our tech-driven sustainability journey.\n","meta":{"title":"Sustainable Tech-Hardware - Introducing the 'flexMac'","description":"Enhanced security, sustainability, and regained speed at Customer Contact revitalizing our old iMacs.","createdAt":"Mon Jul 03 2023 02:00:00 GMT+0200 (GMT+02:00)","coverImage":"images/circular.jpeg","tags":"sustainable-tech, flexmac, circularity","author":"Gehdrio Lake & Sietse Bruinsma","slug":"blog/sustainable-tech-hardware","formattedDate":"3 juli 2023","date":"Mon Jul 03 2023 02:00:00 GMT+0200 (GMT+02:00)"}},{"content":"\n\n### Amazon embraces the mighty monolith\n\n\"image\n\nIn March 2023, Amazon published a [blog post](https://www.primevideotech.com/video-streaming/scaling-up-the-prime-video-audio-video-monitoring-service-and-reducing-costs-by-90)\n, detailing how they had managed to reduce the cost of their audio-video monitoring service by 90%.\nThe _key_ to this reduction was migrating from a distributed, microservice architecture to a _monolith_.\nThe blog post went viral, prompting some software industry celebrities to \n[question](https://world.hey.com/dhh/even-amazon-can-t-make-sense-of-serverless-or-microservices-59625580) the entire concept of microservices.\n\n### What should we learn from this?\n\nSo, does this mean microservices are fundamentally flawed? Should we all migrate back to monoliths?\n_No_ and _definitely no_ I would say. Instead, my takeaways from this article are:\n\n1. **Microservices aren't about scaling for performance.** At least not primarily. Although horizontally scalability for computationally intensive operations _can_ be very useful or even essential in some cases, it tends to be a rare benefit. Very often, performance bottlenecks are IO bound and caused by external systems beyond your control. Nevertheless, there _are_ other compelling reasons to consider microservices: they _force_ you to communicate via contracts, _encourage_ you to organize your functionality around domains, and _allow_ you to scale your organization. Of course, all this comes at considerable costs. There's no [free lunch 👇](#presentation).\n2. Don't underestimate the power of a single CPU in 2023. To judge whether a process is unreasonably slow or not, I tend to think of the fact that already in the 1990s, screens showed 65K pixels at any given time. Back then, multiple arithmetic calculations (additions, subtractions) could be performed for each pixel, fifty times per second. Nowadays, your screen probably displays more than 5 Million pixels at once. So, if the amount of datapoints you are dealing with in the order of millions, you should generally be able to process them in a matter of seconds on a single machine. If you can't, you may be doing something very inefficient.\n3. **Software engineering is hard**. Mistakes are made all the time, everywhere. Even at the big 4 tech companies. Kudos to Amazon 👏 for openly sharing the mistake they made so that we may all learn.\nIn the next section I will share one of our own experiences, not entirely different from the Amazon example.\n\n### The 90% cost reduction case at Vandebron\n\n#### Microservices or just distributed computing?\nConsidering that all the functionality used in the Amazon case belongs to the same _domain_, it arguably does not even serve as \na case against improper use of microservices, but instead a case against misuse *distributed computing*.
\nLet's look into an example of misuse of distributed computing at Vandebron now.\n\n#### Predicting the production of electricity\nFor utility companies, accurately predicting both electricity consumption and production is crucial.\nFailing to do so can result in blackouts or overproduction, both of which are [very costly](https://vandebron.nl/blog/hoe-houdt-onze-technologie-het-energienet-in-balans).\nVandebron is a unique utility company in that the electricity that our customers consume is produced by a [very large\namount](https://vandebron.nl/energiebronnen) of relatively small scale producers, who produce electricity using windmills or solar panels.\nThe large number and the weather dependent nature of these producers make it very hard to predict electricity generation accurately.\n\nTo do this, we use a machine learning model that is trained on historical production data \nand predictions from the national weather [institute](https://www.knmi.nl/). As you can imagine, this is a computationally intensive task, involving large amounts of data.\nFortunately, we have [tooling in place](https://www.vandebron.tech/blog/fueling-the-energy-transition-with-spark-part-1) that\nallows us to distribute computations of a cluster of machines if the task is too large for a single machine to handle.\n\nHowever, here's the catch: the fact that we _can_ distribute computations does not mean that we should. Initially it seemed that\nwe couldn't analyze the weather data quick enough for the estimation of our production to still be a _prediction_\nrather than a _postdiction_. We decided to distribute the computation of the weather data over a cluster of machines.\nThis worked, but it made our software more complex and Jeff Bezos even richer than he already was.\n\nUpon closer inspection, we found an extreme inefficiency in our code. It turned out that we were repeatedly reading the entire weather dataset\ninto memory, for _every_ single \"pixel\". After removing this performance bug, the entire analysis could _easily_ be done\non a single machine. \n\n### What more is there to say? \n\n\nSo if microservices aren't about performance, what _are_ they about? If I had to sum it up in one sentence It would be:\n> _Microservices are a way to scale your organization_\n\nThere is a lot of detail hiding in that sentence, which I can't unpack in the scope of this article. If you're interested\nwhat microservices have meant for us, I would recommend you watch the presentation below.\n\n\n#### Microservices at Vandebron\nAt [Vandebron](https://vandebron.nl/), we jumped onto the \"microservice bandwagon\" circa 2019. This wasn't a decision\nmade on a whim. We had seen a few industry trends come and go, so we first [read up](https://samnewman.io/books/building_microservices_2nd_edition/)\nand did our own analysis. We found that the concept of microservices held promise, but also knew that they would come at a cost.\n\nThese are some of the dangers we identified and what we did to mitigate them.\n\n| **Danger** | **Mitigation** |\n|-------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------|\n| _A stagnating architecture_ | Compile and unit-test time detection of breaking changes |\n| _Complicated and error prone deployments_ | Modular CI/CD [pipelines](https://github.com/Vandebron/mpyl) |\n| _Team siloization_ | A single repository (AKA monorepo) for all microservices and a discussion platform for cross-domain and cross-team concerns |\n| _Duplication of code_ | Shared in house libraries for common functionality |\n\n\n\nThe following presentation to the students of [VU University, Amsterdam](https://vu.nl/) explains how we implemented\nsome of these mitigations and what we learned from them.\n\n[![Presentation about micro services to students of VU Amsterdam](/images/play_presentation.webp)](https://youtu.be/HDs-pCsEzKM)\n","meta":{"title":"So, back to the monolith it is then?","description":"A recent Amazon article explaining how they managed to save costs by merging some of their services has lead some to question the value of microservices. What is our take?","createdAt":"Sat May 20 2023 02:00:00 GMT+0200 (GMT+02:00)","coverImage":"images/monolith.webp","tags":"dagster, cicd, ci-cd, orchestration, data pipeline, kubernetes, migration, helm, ansible","author":"Sam Theisens","slug":"blog/back-to-the-monolith","formattedDate":"20 mei 2023","date":"Sat May 20 2023 02:00:00 GMT+0200 (GMT+02:00)"}},{"content":"\nVandebron is a Dutch green-tech energy company on a mission to accelerate the transition to 100% renewable energy, 100% of the time. As part of [our mission and strategy](https://vandebron.nl/100procentgroen), we are constantly innovating and looking for ways to optimize energy operations and reduce negative impacts when it comes to energy production.\n\nOur new mission: [100% renewable energy, 100% of the time](https://youtu.be/_Yf8jk4gZbI)\n\n### The importance of curtailment and flexibility services\n\nOne area where we are currently focusing our efforts is the area of curtailment and flexibility of wind turbines, solar parks, industrial batteries and electric vehicles. [Curtailment](https://vandebron.nl/blog/curtailment-slimmer-omgaan-met-goeie-energie) refers to the practice of reducing the electricity inflow to balance the electricity grid. In other words, it involves adjusting the operation of, for example, a wind turbine in order to match the demand for electricity at any given time.\n\n[This is often necessary](https://vandebron.nl/blog/hoe-houdt-onze-technologie-het-energienet-in-balans) because the output of renewable energy sources can vary significantly due to changes in weather conditions. If the output of these sources exceeds the demand for electricity, it can lead to an excess of electricity on the grid, which can cause stability issues. On the other hand, if the output of wind turbines is too low, it can lead to a deficit of electricity on the grid, which can cause blackouts or other disruptions. To tackle this, we look at our customer’s batteries and electric vehicles offering flexibility capabilities.\n\n### Our journey to finding reliable, secure and energy-efficient hardware and software\n\nTo optimize these curtailment and flexibility efforts, we were in need of a gateway device that we could place at the installations of the producers on our platform. To keep it close to our mission, we preferred an ARM-based CPU for its [energy efficiency](https://www.redhat.com/en/topics/linux/ARM-vs-x86) compared to an x86-based CPU. After all, we don’t want to consume all of the produced energy to power an actively cooled NUC… 😉\n\nWhile gathering our hardware requirements, we concluded there was really only one competitor. Therefore, we partnered up with OnLogic! We chose their [Factor 201 device](https://www.onlogic.com/fr201/), which boasts the ARM-based Raspberry Pi CM4 module packed in a small and beautiful orange industrial chassis. The model also enables a lot of custom configurations. For example, we are able to configure multiple (wireless) networks, add extra SSD storage or optionally mount on DIN rails.\n\n![OnLogic Factor 201](/images/flex-onlogic-factor-201.jpg \"OnLogic Factor 201\")\n\nTo ensure our gateway devices are secure and agile (like us, developers, 😛) we needed them to integrate well into our existing technology landscape based on Kubernetes. After struggling for some time to harden several (lightweight) operating systems and bootstrapping lightweight Kubernetes clusters our eyes fell on a new kid in town: ‘Talos Linux, the Kubernetes Operating system’ built by [Sidero Labs](https://www.siderolabs.com/). Again our predetermined wishlist was covered (even more), and what we got is a minimal OS tailored for Kubernetes, hardened, immutable and ephemeral out-of-the-box. Can you survive even more buzzwords than that? \n\nUntil the present day though, they have fulfilled every promise made on [their website](https://www.talos.dev/). It initially didn’t work on our ARM CM4-based device from OnLogic. But after testing a lot together with their team (thank you!) the [latest release (v1.3.0)](https://www.talos.dev/v1.3/introduction/what-is-new/#raspberry-generic-images) officially supports our ARM devices. Ready for action! Right after the stable release the first batches were shipped and connected to the installations of our producers on the platform.\n\nOverall, Vandebron's use of OnLogic's fabricated gateway devices running Talos Linux demonstrates the potential of IoT computing to drive innovation and sustainability in the renewable energy industry. By leveraging the power of these technologies combined, we are one step closer to achieving our goal of 100% renewable energy, 100% of the time. Care to join our mission? Look for [open positions](https://werkenbij.vandebron.nl/).\n\n","meta":{"title":"How Vandebron helps balancing the Dutch energy grid together with OnLogic & Talos Linux","description":"Our journey to find the best fitting hardware and operating system to use for our flex services","createdAt":"Wed Jan 11 2023 01:00:00 GMT+0100 (GMT+01:00)","coverImage":"images/flex-wallpaper.webp","tags":"iot, flexibility services, curtailment, onlogic, talos linux, kubernetes, arm64, raspberry pi","author":"Sietse Bruinsma & Tim van Druenen","slug":"blog/balancing-dutch-energy-grid-with-flex-services","formattedDate":"11 januari 2023","date":"Wed Jan 11 2023 01:00:00 GMT+0100 (GMT+01:00)"}},{"content":"\n### TL;DR\nIf you want to deploy new Dagster user code respositories, you need to modify and redeploy the whole Dagster system (while they are [presented as separate](https://docs.dagster.io/deployment/guides/kubernetes/customizing-your-deployment#separately-deploying-dagster-infrastructure-and-user-code) in the docs). This is undesirable for many reasons, most notably because it slows down a migration or the regular development process. This post presents a way to avoid this and build a fully automated CI/CD-pipeline for (new) user code.\n\nThis article assumes that:\n* you (plan to) host Dagster on Kubernetes and manage its deployment with Helm and Ansible;\n* you want to automate the deployment of new Dagster user code repositories with a CI/CD pipeline automation tool of choice;\n* and you want to be able to (re)deploy the whole Dagster system and user code from scratch.\n\n### Why Dagster?\n\nIn short Dagster is a tool to build and orchestrate complex data applications in Python. For us, in the end, Dagster improved the development cycle for things like simple cron jobs as well as for complex ML pipelines. Testing the flows locally was never so easy, for instance. And with features like [asset materialization](https://docs.dagster.io/concepts/assets/asset-materializations) and [sensors](https://docs.dagster.io/concepts/partitions-schedules-sensors/sensors), we can trigger downstream jobs based on the change of an external state that an upstream job caused, without these jobs having to know of each other's existence.\n\nHowever, deployment of new [user code respositories](https://docs.dagster.io/concepts/repositories-workspaces/repositories) caused us some CI/CD related headaches...\n\n### System and user code are separated\n\nDagster separates the system deployment - the Dagit (UI) web server and the daemons that coordinate the runs - from the user code deployment - the actual data pipeline. In other words: the user code servers run in complete isolation from the system and each other. \n\nThis is a great feature of which the advantages are obvious: user code repositories have their own Python environment, teams can manage these separately, and if a user code server breaks down the system is not impacted. In fact, it even doesn't require a restart when user code is updated!\n\n![Schematic of the Dagster architecture. The user code repositories (green) are separate from the rest of the system (yellow and blue). The right side — irrelevant for now — shows the job runs. Source: https://docs.dagster.io/deployment/overview.](/images/dagster-architecture.png)\n\nIn Helm terms: there are 2 charts, namely the _system_: `dagster/dagster` ([values.yaml](https://github.com/dagster-io/dagster/blob/master/helm/dagster/values.yaml)), and the _user code_: `dagster/dagster-user-deployments` ([values.yaml](https://github.com/dagster-io/dagster/blob/master/helm/dagster/charts/dagster-user-deployments/values.yaml)). Note that you have to set `dagster-user-deployments.enabled: true` in the `dagster/dagster` values-yaml to enable this.\n\n#### Or are they?\n\nThat having said, you might find it peculiar that in the values-yaml of the system deployment, _you need to specify the user code servers_. That looks like this:\n\n```yaml\nworkspace:\n enabled: true\n servers:\n - host: \"k8s-example-user-code-1\"\n port: 3030\n name: \"user-code-example\"\n```\n\n**This means system and user deployments are not actually completely separated!**\n\nThis implies that, if you want to add a _new_ user code repository, not only do you need to:\n\n1. add the repo to the user code's `values.yaml` (via a PR in the Git repo of your company's platform team, probably);\n2. do a helm-upgrade of the corresponding `dagster/dagster-user-deployments` chart;\n\nbut because of the not-so-separation, you still need to:\n\n3. add the user code server to the system's `values.yaml` (via that same PR);\n4. and do a helm-upgrade of the corresponding `dagster/dagster` chart.\n\nFormally this is the process to go through. If you are fine with this, stop reading here. It's the cleanest solution anyway. But it is quite cumbersome, so...\n\nIf you are in a situation in which new repositories can get added multiple times a day - for instance because you are in the middle of a migration to Dagster, or you want a staging environment for every single PR - then read on.\n\n#### Give me more details\n\nHow it works is that [for every new repo Dagster spins up a (gRPC) server to host the user code](https://docs.dagster.io/deployment/guides/kubernetes/deploying-with-helm#user-code-deployment). The separation is clear here. But the Dagster _system_ also needs to know about these user code servers, and it does so through a workspace-yaml file. If you run Dagit locally it relies on a `workspace.yaml` file; on Kubernetes it relies on a [ConfigMap](https://kubernetes.io/docs/concepts/configuration/configmap/) - a Kubernetes object used to store non-confidential data in key-value pairs, e.g. the content of a file - which they named `dagster-workspace-yaml`.\n\nThis workspace-yaml is the connection between the system and the user code. The fact that the charts are designed as such that this workspace-yaml is created and modified through the system deployment rather than the user code deployment is the reason we need to redeploy the system. \n\n**But what if we could modify this workspace-yaml file ourselves? Can we make the system redeployment obsolete? Short answer: we can.**\n\n### Our solution\n\n_Disclaimer: what we present here is a workaround that we'll keep in place until the moment Dagster releases a version in which the Dagster user code deployment is **actually completely separated** from the system deployment. And it works like a charm._\n\n**Remember: the desired situation is that we do not have to edit the values-yaml files (through a PR) and redeploy all of Dagster for every new repo.**\n\nFirst of all, we added an extra ConfigMap in Kubernetes that contains the `values.yaml` for the `dagster/dagster-user-deployments` chart. We named it `dagster-user-deployments-values-yaml`. The fact that this is a ConfigMap is crucial to prevent conflicts (see next section).\n\nWith the extra ConfigMap in place, these are the steps when a repo gets added:\n1. Add the new repo to the `dagster-user-deployments-values-yaml` Configmap.\n2. Helm-upgrade the `dagster/dagster-user-deployments` chart with the content of that ConfigMap.\n3. Add the server to the `dagster-workspace-yaml` ConfigMap.\n4. Do a rolling restart of the `dagster-dagit` and `dagster-daemon` deployment to pull the latest workspace to these services.\n\n**Refresh the workspace in the UI and there it is, your new repo!**\n\nNotes:\n* The steps above are completely automatable through your favorite CI/CD pipeline automation tool.\n* There is no interaction with a (platform team) Git repo.\n* The process, unfortunately, still requires a restart of the system in order to pull the latest workspace-yaml to the system services. The daemon terminates, then restarts, and it might cause a short interruption. Note that this is unavoidable if you add a new repo, no matter how you add it. This could be avoided if a reload of the ConfigMap would be triggered upon a change, [which is possible](https://kubernetes.io/docs/concepts/configuration/configmap/#mounted-configmaps-are-updated-automatically) but not enabled.\n* If you want to make changes to an existing repo (not code changes but server setting changes), you only have to do the first step (and _modify_ instead of _add_).\n\n#### How to prevent conflicts\n\nWith many of your team members adding new Dagster repositories through an automated CI/CD pipeline, you might face the situation that 2 people are adding a new repo at around the same time. \n\nWhen this happens, the `dagster-user-deployments-values-yaml` ConfigMap cannot be uploaded in the first step because Kubernetes demands that you provide the _last-applied-configuration_ when doing an update. If it doesn't match, the upload fails. \n\nThis is perfect as we do not want to overwrite the changes of the conflicting flow. You can optionally build in a retry-mechanism that starts over with pulling the ConfigMap again.\n\n#### How to deploy from scratch\n\nThe above does not yet cover how we are able to deploy the Dagster system _and user code_ completely from scratch. Why do we want this? Well, for instance when somebody accidently deletes the `dagster` namespace for instance. Or hell breaks loose in any other physical or non-physical form. Or when we simply want to bump the Dagster version, actually.\n\nThe key to this is that we version both the `dagster-user-deployments-values-yaml` and `dagster-workspace-yaml` as a final step to the flow described above (we do it on S3, in a versioned bucket). Whenever we redeploy Dagster (with Ansible) we pull the latest versions and use them to compile both the values-yaml files from it. \n\n#### How to clean up old repositories\n\nThe above described automation _adds_ new repos but doesn't take care of old obsolete repos. The steps for removing a repo are the same for adding one. The exact implementation depends on your situation. You might want to automatically remove PR staging environments after closing a PR, for instance.\n\n### Conclusion\n\nDagster is an incredibly powerful tool that enabled us to build complex data pipelines with ease. This posts explains how we **streamlined the CI/CD pipeline for user code respositories**, which enabled us to migrate to Dagster very quickly and saves us lots of time on a daily basis.\n","meta":{"title":"The Why and How of Dagster User Code Deployment Automation","description":"If you frequently deploy new user code repositories in Dagster, you want to automate this process. However, this is not so straightforward as it may seem at first. This post explains what we did at Vandebron.","createdAt":"Fri Jul 08 2022 02:00:00 GMT+0200 (GMT+02:00)","coverImage":"images/dagster-cicd.png","tags":"dagster, cicd, ci-cd, orchestration, data pipeline, kubernetes, migration, helm, ansible","author":"Pieter Custers","slug":"blog/cicd-dagster-user-code","formattedDate":"8 juli 2022","date":"Fri Jul 08 2022 02:00:00 GMT+0200 (GMT+02:00)"}},{"content":"\n**A while back, our former technology manager Roy Derks covered the subject of component libraries here on the blog. From a technical perspective, he spoke about when you need one (and when you don’t need one) and what to consider when building one. Since then, obviously a lot has happened at Vandebron. But one of the more interesting things to happen is that design became an integrated part of the digital department, as opposed to previously being attached to marketing. In this new setup, one of the first major projects the design team was involved in was the alignment of our component libraries. And no that’s not a typo, that’s libraries as in the plural form of library. Confusing? I thought so too. In this blog I’ll try to explain further why that was the case, how the work actually helped us bridge the gap between design and development, and dissect the work of unifying those component libraries into one single source of truth and ultimately what’s to become our design system.**\n\n### A bit of a mess\nBefore we get into it, some background as to where we started out might be useful. As previously mentioned, the design team had just become a part of the digital department and one of the first tasks at hand was the creation of a design system. In the design team, we had previously worked with a certain set of brand guidelines, a style guide if you will, which had not necessarily been translated or aligned to the requirements of a digital product or development environment. Development had also created a set of stylesheets and libraries with reusable components which they used to reduce development time. Having it all separately might sound a bit counter-intuitive, but not very surprising if you consider designers and developers not being in the same department, working on a different timeline, different priorities and so forth. However, this only highlighted the importance of designers and developers working together and the need for a proper design system to help prevent creating a fence between the teams causing unnecessary and ineffective work on both sides. The result of this previous “unsynciness”, a rebrand in 2017, and a re-aligned techstack, was the existence of 3 different libraries and subsequently 3 different sources of truth within the development environment. To add to this, we also had separate design guidelines geared more towards brand/marketing purposes in the design team. Now came the rather massive task of unifying these and eventually, rather than having just a library, _having a system_. \n\n### Component library ≠ design system\nNow, there’s a lot of terminology here that might be difficult to grasp if you’re new to the subject. So I thought I’d clarify what we mean when referring to these, how they fit into the context of our situation, and how many of them we had!\n\n- #### Brand guidelines / style guide (design)\n A set of guidelines and examples outlining all the visual elements of a brand such as logos, color, typography, imagery etc. and subsequently in what - - manner they should be applied. It can also be expanded to include more things brand related such as tone of voice, brand values and so forth. Often with brand guidelines, they are created from a marketing perspective and the digital experience(or product) aspect of how the brand should be applied/represented is usually thought about in the second hand, or not included at all. \n\n _Amount: 1_\n \n- #### Design kit/library (design)\n A designer resource file with all the available building blocks that make up the digital design language of a brand and/or the user interface of a product. This is usually only visual(no code) and lives in the design software of the designer's choosing. For us this used to be Sketch, but we recently moved to Figma. Can also include documentation and examples of how the different building blocks should be applied and utilized. \n\n _Amount: 1_\n \n- #### Style sheet (front-end)\n A set of styling properties to be applied when rendering a web page, usually in the format of CSS. This can include things related to the brand guidelines such as font size, colors, etc. but also things related to web layout such as the margins and paddings of different web elements.\n\n _Amount: 1_\n\n- #### Component library (front-end)\n A set of dynamic web components that can be used in a development environment in order to quickly build user interfaces. This helps to ensure consistency, to avoid rebuilding the same component more than once and to avoid changing said component in more places than one, and subsequently help reduce development time. \n\n _Amount: 3_\n \nAll of the above mentioned things, together with rigorous documentation, amount to what’s called a design system. Having it all combined in a structured way is key to getting the most out of such a system. In our case, most of these things were separate and not necessarily connected to each other. But what stands out most of the things above is probably the fact that we, over time, had amounted to 3 different component libraries. I mentioned earlier how that scenario had transpired so I won’t go into too much detail as to how that happened, but if you’re a developer in a small to medium-sized company and I mention “rebrand” and “new techstack” you can probably figure out how. However complex, this also proved to be an excellent opportunity for our developers and for us in the design team. We finally get to unify our component libraries into one, while simultaneously aligning it with our design kit and expanding the guidelines with new and updated documentation. Thus ensuring that designers and developers speak the same language and share the same single source of truth.\n\n### A guild forms\nTo kickstart this process we formed a project group(or ‘guild’) composed of 2 designers and 2 developers, each designer and developer from the two consumer-facing scrum teams. The idea was to let the developers work on the migration and unification of the component libraries in collaboration with us designers in the same project, making it easier to align and to create co-ownership of the product. Our first step was to decide on the structure of our component library, this way the developers could slot all the existing, reworked and new components into the right place in the new library. Easy enough right? Well, here comes our first challenge. We initially wanted to take an atomic approach and build our components from the well known and widely used atomic design principles. We also needed to consider the 3 different “product groups” which the library should apply to, all still utilizing the same style properties. \n\nVandebron has a wide range of products serving different platforms, with the visual language remaining the same but where the user interface might differ. This requires the top elements of the system(such as colors and typography) to be shared across all products, whereas the lower you get the more product-specific an element becomes. This is the reason why we wanted to structure the system according to the principles of Atomic Design first, in order to assign the components to a hierarchical structure.\n\n![Atomic Design](/images/AtomicDesign.jpg \"Atomic Design\")\n\nWith this approach the atoms would work like design tokens and the molecules would be components general enough that they’d be shared across all product groups, this CORE part of the library would essentially be the stylesheet that impacts all visual aspects of the digital brand experience. Only on organism-level do we start to differentiate what product group the component belongs to. So a change to the CORE parts of the library(atoms or molecules) would impact all components in all product groups.\n\nHowever, this approach actually made less sense from a development perspective. Not that it wouldn’t work or that the categorization didn’t make sense, but it would require us rewriting all the already existing components. Components that are actively in use. We deemed this approach a bit too high-risk and high-effort for the time being and started looking into alternatives, while still keeping the atomic structure as a more long-term goal. Another thing our initial idea didn’t take into account was the experience of the future main user of the library, **_the developer!_** Organizing a design system after the brand properties and product groups makes a lot of sense from a designers or a marketeers perspective, and it should probably still be presented outwards that way, but a component library is something else(remember?). So based on our development environment and the way we build our websites and apps our developers suggested a different structure:\n\n![Iteration](/images/Iteration.jpg \"Iteration\")\n\nIn this structure, similar to the previous one, the components are instead categorized and sorted by how they should be applied to the page or application that’s being built. Styles, layouts and inputs are general enough to be applied to all product groups whereas from the surface level the components start becoming more specific in their use case. That way, the components can be separated into specific or even several product groups. In this format the components themselves are not as intertwined as in the atomic structure, albeit still connected by the style element. So while it’s a bit more resistant to overall changes the main idea of having the same style properties applying to everything still works, and it helps us designers to better relate and contextualize what we’re designing from more of a development perspective, thus helping bridge the gap between development and design even further. The main insight we drew from this experience is to not let industry standards and certain trends dictate what you should do. Sure they’re important to keep an eye on, but do it with carefulness and always apply an asterisk to it. Figure out what works best for your specific situation and what’s realistic in the short-term vs. in the long-term. There’s no one-size-fits-all.\n\n### Speaking the same language\nWith the component library migration now underway, we started looking into ways to improve our system from the designers' side of things. As previously mentioned, we had just gone from using Sketch to using Figma and with that came a good opportunity to rebuild, adjust and expand our design kit also. We did that by removing, adding, simplifying and renaming a lot of what was in there since before and with the design kit now adjusted to match the component library we were now also speaking the same language. We can actually now compare this side-by-side with the tools we’re using. In Storybook we have attached the Figma design of every component, simply by activating the feature and pasting the link to its page or artboard in the Figma file. This will refresh in almost real-time if any changes are made so we can easily spot any differences and inconsistencies between what’s live and how the design looks. In Figma, we try to document all our components and give some context as to how it works and should be applied. This is now also directly visible to the developer in the context of the component library. Expanding on our documentation and exposing our digital design guidelines like that has been a great way to create a shared understanding of our designs. Rather than just an image being tossed over a fence, there is now quite literally a direct connection between design and development and therefore also more of a shared ownership.\n\n![Storybook & Figma](/images/StorybookFigma.jpg \"Storybook & Figma\")\n\n### Further defining the process\nAs all the alignment on the design side and the migration neared completion, we started seeing a lot of things that could be improved upon or even added to our component library. When we started logging these things down on our project backlog we quickly realized that the scope of our project had quickly been growing into something beyond what was initially intended, and that rather than giving us focus this guild format was instead at risk of creating an isolated bubble of knowledge surrounding the design system. This prompted us to gauge the opportunity and capacity among our development teams to instead tackle these tasks together, either alongside or within their respective day-to-day tasks. In order to do so we needed the buy-in from key stakeholders such as the product owners from the respective development teams. It’s obviously a big ask to get 1 developer from each team to work on improving a component library, especially when they’ve already given us a quarter on migration and have other important business and/or user needs to tend to. So instead, we looked into how we can embed the improvement and further development of our design system into the developers current processes and primary day-to-day work. We structure this by linking our component library improvement/addition tickets to relevant tickets in their respective sprints. In defining the workflow like this, our 2 designer 2 developer guild in effect rendered unnecessary and instead we opened up the co-ownership and contribution to all developers in all customer-facing development teams and in the process of it preventing isolating knowledge too much. In opening up the process like this, another positive side effect we see is the involvement, engagement and subsequent use of our component library going up. With the product designers now also actively a part of the front-end guild meetings, we have an ever bigger forum and bigger opportunity to build a world class component library and design system while also having more hands on deck to work on maintenance and improvements. We still have a long way to go, but all parts are now even more aligned and the future is looking bright!\n\n### What’s next\nIn the newly formed designer+developer guild, the work of defining requirements and improvements on the design system continues. From the design side we’re also looking to constantly improve on the documentation and the presentation of our system. This is something we imagine we’ll keep on doing continuously and iteratively for as long as it’s needed, if not even forever. After all, “design is never done” and a design system can and should be a living thing constantly evolving along with the products and the brand it serves, and in extension even the promise the brand and it’s products. In our case, that’s to aid in **accelerating the energy transition towards 100% renewable energy**. More on how we exactly do that, and how we always aim to design for impact, in the next blog post. Thanks for reading and stay tuned!\n\n\nPetter Andersson, Product Designer at Vandebron\n\n\n\n_If the type of work mentioned in this blog post sounds interesting to you, [take a look at our job openings here](https://werkenbij.vandebron.nl/l/en/)._ \n","meta":{"title":"The difference between a component library and a design system, and how they can help bridge the gap between design and development","description":"A while back we started a rather extensive project of migrating and unifying our component library, these are some of the learnings we made during the project.","createdAt":"Wed Jul 06 2022 02:00:00 GMT+0200 (GMT+02:00)","coverImage":"images/WindmolenCover.jpg","imageSource":null,"tags":"product, design, design system, component library","author":"Petter Andersson","slug":"blog/the-difference-between-a-component-library-and-a-design-system","formattedDate":"6 juli 2022","date":"Wed Jul 06 2022 02:00:00 GMT+0200 (GMT+02:00)"}},{"content":"\n# Signing and verfiying SOAP messages with wss4j and Scala\n\nSOAP is not dead. It is an established, XML-based and mature messaging protocol that comes with built-in security mechanisms, integrity checks, content validation and much more. A lot of enterprises and corporations are using it (sadly) still.\nJust recently, Vandebron had to implement a SOAP client to communicate with an external party. \nThis blog post will explain with code examples how we at Vandebron are signing and verifying SOAP messages for our latest SOAP client implementation. \n\nFor this process, we are using Apache's Web Service Security Library [wss4j](https://ws.apache.org/wss4j/) as it is a proven tool in the WSS context and provides, as a Java library, great interoperability with the programming language Scala.\n\n## Signing SOAP messages\n\nHere we will take a look at the necessary steps to sign a SOAP message like this one:\n```xml\n\n \n \n Hello World\n I am just a test\n \n\n```\nTo look after signing like this:\n```xml\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n 7KfPcTwDYWtLj4ZVWmWmVqX4IGwbBAAmUPigCdXdk4U=\n \n \n \n OBnbBWv8S70xDDn5uG++7cTRFa2Uz3D47oxTHuO163Y3/V7H35M1GHXbKaUDOHsgsfx3SdVmVi++ra06cpwJknzqoIQgDV9Qc0ydzfxljCqupPKBnfONDYJtihEE1jtQ0RP7OLzPVNUpgOgHqbLwJu2pRUA05ool+lxIs924OwPVPKyUryoYwWhwY1ttY4P+WY2L3ZqsH3fgoLCyjlvhDEAhsP9PCxsEzPSq3ECC55Nh7nqMoHPj2uNxonuMlPeYbrlMnwyiqEW8s3Sc+WmfiIOgekRE1AdNhpn3ARlO490nObQtXCU/TxeTfbh98TMbQRZWWyT4HuLS3fF6aeyD/Q==\n \n \n \n \n ox4ajWTdigy9oApTYs97CuCV/4k=\n \n \n \n \n \n \n \n Hello World\n I am just a test\n \n\n```\n\nFor implementing the steps of the blog post you will need:\n- a SOAP service you want to send messages to\n- documentation of that SOAP service that describes:\n - signature algorithm\n - canonicalization method\n - digest algorithm\n - key identifier type\n- a private key with which you will sign your messages\n- a certificate that is the counterpart of the private key\n- (optional) a pool of trusted certificates\n\nOur private and public key pair are available in the PKCS#12-format (.p12 file extension). Check out [this](https://www.ssl.com/how-to/create-a-pfx-p12-certificate-file-using-openssl/) to learn more about this format and how to achieve it.\nThe pool of trusted certificates are in the [PKCS#7 format](https://www.ssl.com/guide/pem-der-crt-and-cer-x-509-encodings-and-conversions/) (.p7b file extension).\n\nFirst we have to setup the necessary dependencies:\n\n```scala\n // in your build.sbt or project/Dependencies.scala\n // enabling signing and signature verification for SOAP messages\n lazy val webServiceSecurity = Seq(\n \"org.apache.wss4j\" % \"wss4j\" % \"2.3.1\" pomOnly (),\n \"org.apache.wss4j\" % \"wss4j-ws-security-dom\" % \"2.3.1\",\n \"org.apache.wss4j\" % \"wss4j-ws-security-common\" % \"2.3.1\"\n )\n\n libraryDependencies ++= webServiceSecurity\n```\n\nNext, we continue with a scala representation of our certificate we are using for signing:\n\n```scala\n import org.apache.wss4j.dom.WSConstants\n \n // algorithm configuration\n object SigningCertificate {\n val CanonicalizationMethodURI: String = \"http://www.w3.org/2001/10/xml-exc-c14n#\"\n val DigestAlgorithmURI: String = DigestMethod.SHA256\n val SignatureAlgorithmURI: String = \"http://www.w3.org/2001/04/xmldsig-more#rsa-sha256\"\n val KeyIdentifierType: Int = WSConstants.SKI_KEY_IDENTIFIER\n }\n\n case class SigningCertificate(keyStore: KeyStore, password: String) {\n require(\n keyStore.aliases().asScala.size == 1,\n s\"Certificate of Keystore needs to have one alias but had ${keyStore.aliases().asScala.size}\"\n )\n val alias: String = keyStore.aliases().nextElement()\n\n override def toString: String = s\"SigningCertificate(alias=$alias)\"\n }\n```\nIn the documentation of the SOAP service that you want to call should stand some information regarding the canonicalization method, signature algorithm, digest algorithm, and the key identifier type. Those are algorithms and information that define the signing process and we explain roughly now.\n\nBefore signing a message it has to be canonicalized. \"Canonicalization is a method for generating a physical representation, the canonical form, of an XML document that accounts for syntactic changes permitted by the XML specification\" (from [here](https://www.di-mgt.com.au/xmldsig-c14n.html)). In our case, the Exclusive XML Canonicalization is used.\n\nThe digest algorithm is used to ensure the integrity of the message during the verification of a signature. The algorithm is used to calculate a hash of the signed message. It should be documented in the SOAP service documentation. Here we will use SHA256 as a hashing algorithm.\n\nThe signature algorithm describes how the message will be signed. It can be defined in the SOAP service documentation but in the worst case you can read this algorithm from the certificate itself by using [`keytool`](https://docs.oracle.com/en/java/javase/12/tools/keytool.html):\n```bash\n$ keytool -list -v -keystore signature.p12\nEnter keystore password: ...\n\n[...] # more information about the certificates\n\nSignature algorithm name: SHA256withRSA # thats what we are after!\n\n[...] # more information about the certificates\n```\nAccording to the keytool inspection we will use SHA256withRSA (http://www.w3.org/2001/04/xmldsig-more#rsa-sha256) for signing.\n\nLast but not least, in our signature, a `` element is included. This element contains information about the public key of the sender (us) and is needed for the signature verification once the message is received (read more [here](https://www.xml.com/pub/a/2001/08/08/xmldsig.html)). Since we have our public key provided we don't need to do much here. The `KeyIdentifierType` describes which form of key identifier is used to present the public key information.\n\nHaving all this information about our certificate in place, we build the mechanism to load in our signing certificate. For this, we create the object `KeyStoreBuilder`.\n\n```scala\nimport java.io.{File, FileInputStream}\n\nobject KeyStoreBuilder {\n\n def loadSigningCertificate(signingCertificate: File, password: String): SigningCertificate = {\n val fis = new FileInputStream(signingCertificate)\n val ks: KeyStore = KeyStore.getInstance(\"PKCS12\")\n ks.load(fis, password.toCharArray)\n SigningCertificate(ks, password)\n } \n}\n```\nBear in mind, that you probably **don't** want to version any sensitive information like private keys and passwords hard-coded or in any environment variables, so a safe mechanism for storing/fetching passwords and certificates (like [Vault](https://www.hashicorp.com/products/vault)) should be in place.\n\nWith the signing certificate in place, we can actually start signing a message. The next code example contains quite some Java boilerplate from wss4j that is required to make the signing mechanism work.\n\nTo restrict the usage of Java classes to a small portion of our code we will firstly implement a conversion method `.toElem` inside of the companion object `SigningService`:\n\n```scala\n import java.io.StringWriter\n import javax.xml.transform.{OutputKeys, TransformerFactory}\n import javax.xml.transform.dom.DOMSource\n import javax.xml.transform.stream.StreamResult\n\n import org.w3c.dom.Document\n\n import scala.xml.Elem\n\n object SigningService {\n implicit class RichDocument(document: Document) {\n private val tf = TransformerFactory.newInstance()\n\n def toElem: Elem =\n val transformer = tf.newTransformer()\n transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, \"yes\");\n val stringWriter = new StringWriter()\n transformer.transform(new DOMSource(document), new StreamResult(stringWriter))\n scala.xml.XML.loadString(stringWriter.getBuffer.toString)\n }\n }\n```\nWith that, we can convert any `Document` SOAP message representation back to the `scala.xml` supported `Elem` format.\n\n```scala\nclass SigningService(signingCertificate: SigningCertificate) {\n\n // importing our conversion method\n import SigningService.RichDocument\n\n /**\n * REQUIRED, otherwise it will throw:\n *\n * org.apache.wss4j.common.ext.WSSecurityException:\n * You must initialize the xml-security library correctly before you use it.\n * Call the static method \"org.apache.xml.security.Init.init();\"\n * to do that before you use any functionality from that library\n */\n org.apache.xml.security.Init.init()\n \n private val documentBuilderFactory = DocumentBuilderFactory.newInstance()\n private val crypto: Merlin = getCrypto\n\n crypto.setKeyStore(signingCertificate.keyStore)\n\n def signElement(elem: Elem): Elem = {\n documentBuilderFactory.setNamespaceAware(true)\n // converting Elem to Document (Scala to Java conversion)\n val doc = documentBuilderFactory.newDocumentBuilder().parse(new InputSource(new StringReader(elem.toString())))\n\n // WSSecHeader wraps around the document we want to sign\n val header = new WSSecHeader(doc)\n header.setMustUnderstand(true)\n header.insertSecurityHeader()\n\n // start building Signature, use the (wrapper) header-instance\n val builder = new WSSecSignature(header)\n builder.setUserInfo(signingCertificate.alias, signingCertificate.password)\n\n // setting algorithms\n builder.setSignatureAlgorithm(SigningCertificate.SignatureAlgorithmURI)\n builder.setSigCanonicalization(SigningCertificate.CanonicalizationMethodURI)\n builder.setDigestAlgo(SigningCertificate.DigestAlgorithmURI)\n builder.setKeyIdentifierType(SigningCertificate.KeyIdentifierType)\n builder.setAddInclusivePrefixes(true)\n\n // signing the document!\n val signedDocument = builder.build(crypto)\n // conversion back to Elem\n signedDocument.toElem\n }\n\n private def getCrypto: Merlin = {\n val properties = new Properties()\n properties.setProperty(\"org.apache.wss4j.crypto.provider\", \"class org.apache.ws.security.components.crypto.Merlin\")\n CryptoFactory.getInstance().asInstanceOf[Merlin]\n }\n}\n```\n\nWss4j is a library that maintains an internal state during a signing process, but to avoid confusion it can be summarized as:\n1. `WSSecHeader` wraps around the document to be signed\n2. the WSSecHeader instance `header` will be used as part of the `WSSecSignature`-Builder\n3. the WSSecSignature instance `builder` gets configured with all necessary information, which algorithms are used for signing, digesting, canonicalization, which key identifier should be included. Those settings an vary from webservice to webservice.\n\nThe actual signing of the document, which is now nested like a matryoshka doll, is happening with the help of an instance of `Crypto`. `Crypto` will contain either a keystore or a truststore or even both. It needs to be specified in the `crypto.properties` file or a runtime which class of Crypto will be used.\n The most common one is [`Merlin`](https://ws.apache.org/wss4j/apidocs/org/apache/wss4j/common/crypto/Merlin.html).\nWe have decided to specify its configuration during runtime, since it is more visible than a properties file. Nevertheless, the `crypto.properties`-file needs to exist in your `resources` folder neverthless otherwise you will get a following `WSSecurityException`:\n```java\n org.apache.wss4j.common.ext.WSSecurityException: No message with ID \"resourceNotFound\" found in resource bundle \"org/apache/xml/security/resource/xmlsecurity\"\n [... rest of stacktrace ...]\n Cause: java.nio.file.NoSuchFileException: crypto.properties\n```\n\nAnd that's it! The `KeyStoreBuilder` helps us to load a `SigningCertificate` and the `SigningService` uses this loaded certificate to sign SOAP messages. \nA receiver of our SOAP message has all the necessary information in our signature to verify that this message has not been tampered with and we are the original sender.\n\nThis verification is something we should also do on our side for incoming messages. So let's take a look at how we can verify the signature of received messages.\n\n## Verification of SOAP messages\n\nVerifying the signature of incoming messages is equally important to ensure that the connection is secure. A verification process will tell you if the message is coming from a trusted source and has not been tampered with.\n\nAs previously mentioned we need our source of truth, a pool of trusted public keys from all parties which will receive our SOAP messages. These build the basis of the trust store.\n\nWe will create a `TrustedCertificates` wrapper class in which we will load in the trust store and add this method to the `KeyStoreBuilder`.\n```scala\ncase class TrustedCertificates(keyStore: KeyStore)\n\nobject KeyStoreBuilder {\n\n def loadTrustedCertificate(certificates: Seq[File]): TrustedCertificates = {\n val ks = KeyStore.getInstance(KeyStore.getDefaultType)\n // we just want the keystore to act as a truststore (only containing trusted certificates), so we initialize it empty\n ks.load(null, null)\n val cf = CertificateFactory.getInstance(\"X.509\")\n certificates.foreach { file =>\n CloseableUtil.using(getClass.getResourceAsStream(file.getPath)) { fis =>\n val certPath = cf.generateCertPath(fis, \"PKCS7\")\n certPath.getCertificates.asScala.toList.foreach { certificate =>\n ks.setCertificateEntry(file.getName, certificate)\n }\n }\n }\n TrustedCertificates(ks)\n }\n}\n```\nThis trust store is under the hood also just a KeyStore, without containing a private key that requires a password, that's why we can initialize the KeyStore with `null`-parameters.\n\nNow, the SigningService needs to be extended with this trusted certificates and a `verifySignatureOf`-method:\n\n```scala\nimport java.io.StringReader\nimport java.util.Properties\nimport javax.xml.parsers.DocumentBuilderFactory\n\nimport org.apache.wss4j.common.crypto.{ CryptoFactory, Merlin }\nimport org.apache.wss4j.dom.engine.WSSecurityEngine\nimport org.xml.sax.InputSource\n\nimport scala.util.{Failure, Success, Try}\nimport scala.xml.Elem\n\nclass SigningService(signingCertificate: SigningCertificate, trustedCertificates: TrustedCertificates) {\n\n private val engine = new WSSecurityEngine()\n private val documentBuilderFactory = DocumentBuilderFactory.newInstance()\n private val crypto: Merlin = getCrypto\n\n crypto.setKeyStore(signingCertificate.keyStore)\n crypto.setTrustStore(trustedCertificates.keyStore)\n\n def verifySignatureOf(elem: Elem): Boolean = {\n documentBuilderFactory.setNamespaceAware(true)\n val doc = documentBuilderFactory.newDocumentBuilder().parse(new InputSource(new StringReader(elem.toString())))\n\n Try(engine.processSecurityHeader(doc, null, null, crypto)) match {\n case Success(_) => true\n case Failure(exception) =>\n // replace with proper logging\n println(\n s\"Unsuccessful signature verification, it is most likely that the certificate used for signing is not in our Truststore: ${exception.getMessage}\")\n false\n }\n }\n\n private def getCrypto: Merlin = {\n val properties = new Properties()\n properties.setProperty(\"org.apache.wss4j.crypto.provider\", \"class org.apache.ws.security.components.crypto.Merlin\")\n CryptoFactory.getInstance().asInstanceOf[Merlin]\n }\n}\n```\n\nAnd with that, we have completed our roundtrip of signing and verifying SOAP messages!\n\nHere are gists, articles, and documentation that inspired and helped us to figure out the signing and verification process for our SOAP client. Feel free to check them out!\n\n* * *\n\n### Sources\n\n[WSSecurityVerifier by Luis Wolff](https://gist.github.com/luiswolff/1d388ec8c1d63cfb58974a6f826bc1be) \n\n[WSSecuritySigner by Luis Wolff](https://gist.github.com/luiswolff/64d15a99fbb5ec4b4e90eec04b09e053)\n\n[Unit Tests from ws-wss4j](https://github.com/apache/ws-wss4j/blob/master/ws-security-dom/src/test/java/org/apache/wss4j/dom/message/SignatureTest.java)\n\n[An Introduction to XML Digital Signatures](https://www.xml.com/pub/a/2001/08/08/xmldsig.html)\n\n[SOAP vs. REST](https://stackify.com/soap-vs-rest/)","meta":{"title":"Signing and verifying SOAP messages with wss4j and Scala","description":"This blogpost will explain with code examples how we at Vandebron are signing and verifying SOAP messages for our latest SOAP client implementation.","createdAt":"Mon Jun 28 2021 02:00:00 GMT+0200 (GMT+02:00)","coverImage":"images/soap.jpg","imageSource":"https://cdn.pixabay.com/photo/2020/03/15/18/36/wash-4934590_960_720.jpg","tags":"SOAP, xml, scala, wss4j, signature, verification","author":"Katrin Grunert","slug":"blog/how-to-sign-soap-messages","formattedDate":"28 juni 2021","date":"Mon Jun 28 2021 02:00:00 GMT+0200 (GMT+02:00)"}},{"content":"\nAt the end of March, we organized a public hackathon to create solutions to tackle climate challenges. After having done internal hackathons, we thought it was time to share our technologies with other innovative people and companies. Together with a group of partners, and enthusiastic participants, spend three full days of (remote) hacking with great results.\n\n### Why organize a public hackathon?\n\nClimate change is one of the many pressing challenges our society is currently facing. At [Vandebron](https://vandebron.nl/), we want to continue finding ways to tackle this immense challenge. That’s why we decided to organize a 3-day GreenTech hackathon that ran from March 31st to April 2nd, 2021. We've been organizing internal hackathons for the past four years, to foster innovation within our company and allow our developers to work on something exciting without any constraints. If you want to read more about why we organize internal hackathons, you can find an article by our CTO [here](https://www.vandebron.tech/blog/power-regular-hackathons). \n\nBy organizing a public hackathon, we hoped to attract a bigger audience, possibly even outside our country, The Netherlands, and attract partners to work together with. We succeeded in both, and together with [Hack the Planet](https://hack-the-planet.io/) and [Top Dutch Solar Racing](https://solarracing.nl/), we wanted to find technological solutions to problems in wildlife conservation and renewable energy. For these three days, all participants got the opportunity to work on challenges from our partners, access their technology and knowledge, and got the chance to win unique prizes. Also, we organized a free event with speakers Florian Dirkse ([The Ocean Cleanup](https://theoceancleanup.com/)), Thijs Suijten (Hack the Planet) and Heleen Klinkert ([Nieuw Groen](https://nieuw-groen.nl/)). \n\n### Looking back\n\nThe event started on March 31st, when all hackathon challenges were presented and the participants could select which challenge they wanted to work on. People from all over The Netherlands (and even beyond) signed up for the hackathon, ranging from students from the University of Amsterdam to young professionals looking for a job. The first challenge the participants could subscribe to was from Vandebron itself, where teams got the opportunity to use a selection of our Electronic Vehicle (EV) data. With this data, they could for example make a forecast on the amount of charging sessions we could expect on a typical day. Second, our partner Hack the Planet presented their challenge that was aimed at thinking of innovative solutions for their project [Hack the Poacher](https://www.hackthepoacher.com/). With Hack the Poacher, they install smart camera traps in African wildlife reservations to detect poachers. The teams could use their camera traps and data to create more solutions to map the poachers or use the camera traps for other needs. Finally, the students from Top Dutch Solar Racing presented a challenge to simulate the race they were supposed to join at the end of the year in Australia. Using their weather and traffic data, the teams could simulate the race and predict how much time they would need to complete the race. After selecting a challenge, all teams started the hackathon and participated in sessions to learn more about the challenges to get started.\n\nAll teams continued working on the hackathon challenge on the second day, after a nice warming-up quiz about climate change in the morning. For most teams this second day was when their project started to take shape, and they got a better idea about what they would be presenting on the final day. This second day was also an opportunity for non-technical people to get to know Vandebron and their partners better as we organized inspirational sessions with talks from different speakers in the afternoon. One of the co-founders from The Ocean Cleanup, Florian Dirkse, inspired us with his story behind making a difference in the world. After which, one of our hackathon partners Thijs Suijten, from Hack the Planet, demonstrated how technology can be used for the good. Our third, and final, speaker Heleen Klinkert (Nieuw Groen), showed how we can compensate for our CO2 emissions by storing them in the soil.\n\nOn the final day of the hackathon, all teams had to finalize their projects and create a presentation for the closing ceremony. During this ceremony, all participants and partners looked back at the past three days and shared what they had been working on during the hackathon. For every challenge, one team could win and take home several prizes, sponsored by [Marie-Stella-Maris](https://marie-stella-maris.com/), [EV Experience](https://evexperience.nl/), and [Klimaatroute](https://www.klimaatroute.nl/). The first presentations were for the Vandebron challenge about EV forecasts. This challenge was won by not one but two teams as the jury and audience were so impressed by their solutions. Both teams created not only the forecast based on the sample data provided, but also created interactive dashboards. On the challenge for Hack the Planet, the team that won came up with a unique solution to use the camera traps to detect wild animals on the streets. For countries like India, this is a huge problem, as wild animals get stuck in traffic or walk through rural areas. The final winner of the hackathon was a group of students that simulated the Top Dutch Solar Racing trip through Australia and forecasted they could complete the race within 7 days.\n\n### Thanks everyone\n\nI'd like to thank all the participants, prize/challenge partners, and speakers for their efforts during these days. The GreenTech Hackathon 2021 was a huge success thanks to everyone that has been involved. Keep following the [vandebron.tech](https://vandebron.tech) to be updated on future hackathons and events.\n","meta":{"title":"Looking back at the Vandebron GreenTech Hackathon 2021","description":"At the end of March, we organized a public hackathon to create solutions to tackle climate challenges. After having done internal hackathons, we thought it was time to share our technologies with other innovative people and companies.","createdAt":"Mon Apr 05 2021 02:00:00 GMT+0200 (GMT+02:00)","coverImage":"images/looking-back-at-vandebron-greentech-hackathon-2021.png","tags":"hackathon, innovation","author":"Roy Derks","slug":"blog/looking-back-at-vandebron-greentech-hackathon-2021","formattedDate":"5 april 2021","date":"Mon Apr 05 2021 02:00:00 GMT+0200 (GMT+02:00)"}},{"content":"\nAt Vandebron we have been organizing a regular hackathon for the last four years. Every three months we organize a two-day event. At first glance this seems quite an investment. Eight days a year, almost losing two working-weeks of productivity for your teams! \n\nOur company is like any other. Our roadmaps are stuffed, our backlogs are never-ending and pressure for delivering value to our customers is always present. Our ambitions are always higher than what we can handle with the amount of teams and people available. We like to say: ‘the energy transition can’t wait!’, but we sure do have to prioritize our projects very carefully.\n\nHowever this does not stop us from organizing our quarterly hackathons. Most of the time our regular hackathons are light-weight. People within the company know how it works. We try not to waste too much time in ‘organizing’ the event. We get right to it. \n\n#### Reasons why you should be organizing (regular) hackathons:\n- Fun - this reason does not need much explanation. Working on challenging, fun and creative ideas with uncertain outcome in a not-business-as-usual way. It makes you step out of your daily comfort zone and explore new things. \n- Walk the extra mile - Some team-members will have the energy, enthusiasm and commitment to use their spare time to fuel their curiosity and bring new insights to the workplace. These are the same people that you also expect to walk the extra mile if the team- or company objectives are at stake. This is in that same spare time! But in the end, if you value your teams to continuously think about new ideas, insights and work on out-of-the-box ideas, it is not a weird idea to create this environment within the company.\n- Bottled up energy - our people are focused on reaching goals and objectives. Every day, every week and every sprint the focus is clear. This also means that there is not always time for creative or high risk escapades that could hurt the overall team objectives. This might give an unsatisfied feeling to people. If the bottled up energy can not be released, engineers might get frustrated. But maybe even more important, you might be missing opportunities for the company.\n- Cross team collaboration - in an agile way of working the concept of the team is very important. At Vandebron we focus on teams staying together for a long period of time. This makes the relationship between individuals stronger, the knowledge of the product deeper and the team as a whole more effective. However, the company is bigger than your team. There might be different ways of connecting with other people within your company, but a hackathon is an ideal way of linking yourself up with people that you can learn from. It can really bring you new insights as an individual, and it will also be an investment for improved cross-team collaboration going forward.\n- Learning organisation - as mentioned, hackathons give you an excellent opportunity to learn new things. For yourself, but definitely also for the company. In my experience I often see that topics get selected that have high-risk and high-reward kind of characteristics. These topics can be scary to touch, which make you go out of your comfort zone. This is where you learn the most! These high-risk and high-reward projects are also very likely to fail, meaning that the reward is not as high as expected, or the complexity and risks are even greater than anticipated. At these moments the pressure-cooker of a hackathon is very valuable, because it forces the participants to draw conclusions in a short time-frame. The insights gained from these projects can be used to further steer the roadmap. And last but not least, it supports building a culture of being bold enough to try new things, and fail fast. I’ve noticed this is appreciated by a lot of people within the company and the hackathon contributes to a culture of innovation.\n\n#### Our most important learnings over the years\n- Spotlights on - It is good to put teams and their results in the spotlight. Let them take the podium and make sure there is an audience. However don’t make it too much about winning. Ideas that have completely failed are just as important as over-engineered fancy product demos. At Vandebron we like to declare ‘winners’ in different categories: ‘Fun & Original’, ’Impactful’, ‘Exploration & Learning’ and ‘Technical achievement’. \n- Harvest your ideas continuously - during normal work and life you hit those topics that you would like to investigate a bit deeper. But while you stumble upon such a topic you don’t have the time to dive into it. So therefore, write your idea down and publish it in the ‘hackathon-idea-box’ for everyone to see! It might already give you some good conversations during coffee or lunch, and it might already generate you some people that would like to join forces with you during the hackathon. Because rest assured, a new hackathon is always coming up!\n- To-theme-or-not-to-theme - we have experimented with adding a theme to a hackathon. It can help the company to generate ideas and action in a certain area of interest. It also helps to generate more focus within the company on a certain persistent challenge that we feel deserves a solution. Although everyone will be working on different sub-topics the full event will be experienced as more correlated and unified. But be careful not to push normal business-projects disguised as hackathon projects to your teams. This goes against the basic concept of a hackathon. At Vandebron we sometimes pick a theme if we would like to motivate people to think about ideas in a certain direction. But most of the time we keep it open.\n- Participation is optional. - At Vandebron we have autonomous teams with professionals that can manage their own agenda. As a team and as an individual. We put effort in promoting the hackathon by trying to make people enthusiastic about participating. But in the end people make their own decisions. Sometimes the team and company objectives do need to have priority, but the teams are perfectly able to make this judgement call themselves.\n- Magnify impact - show everyone what the impact is they have been making. It is good if people recognize how some projects have become reality and that feedback will be appreciated by the community. It gives people a feeling that the podium of the hackathon is a strong force. And ultimately that is how you also proof the value of organizing a hackathon.\n\nFor our next hackathon we are opening our (virtual) doors also for guests, as we are organizing a GreenTech hackathon with other sustainability minded companies (‘Hack the Planet’ and ‘Top Dutch Solar Racing’). You can find more information and sign up via [this link](https://www.vandebron.tech/greentech-hackathon). It is the first time we do it like this, and we sure will learn another thing or two!\n","meta":{"title":"The power of regular hackathons","description":"At Vandebron we have been organizing a regular hackathon for the last four years. Every three months we organize a two-day event. At first glance this seems quite an investment. Eight days a year, almost losing two working-weeks of productivity for your teams!","createdAt":"Fri Mar 19 2021 01:00:00 GMT+0100 (GMT+01:00)","coverImage":"images/power-regular-hackathons.png","tags":"hackathon, innovation, scrum","author":"Arno van den Berg","slug":"blog/power-regular-hackathons","formattedDate":"19 maart 2021","date":"Fri Mar 19 2021 01:00:00 GMT+0100 (GMT+01:00)"}},{"content":"\nIn October 2020 D2IQ [announced](https://d2iq.com/blog/d2iq-takes-the-next-step-forward) that they are moving onwards with their Kubernetes offering. Vandebron has been a D2IQ customer for their DCOS offering, we were just in the middle of a migration of our first workloads to DCOS Enterprise. We have evaluated the D2IQ K8s offering and decided to go for another Kubernetes product. We had a few migrations over the years, we migrated from Azure to AWS, we migrated workloads from normal instances to spot instances and all these migrations were done with nearly any downtime. We plan to reduce the downtime to a couple of minutes this migration and this is a real challenge. The first challenge that we will discuss today: We want to pair our Kubernetes clusters to the DCOS/Mesos clusters, while we move a workload it should be able to connect to its dependencies in the DCOS cluster. We use DCOS for our NoSQL databases like Cassandra, internal data that we want to keep internal. Pairing DCOS and Kubernetes clusters enable us to reduce downtime, enabling us to switch back if we run into issues and move faster because it reduces complexity.\n\n## L4LB\n\nThe internal layer 4 load balancer DCOS provides is used in the majority of our workloads. When our data scientists schedule a spark driver, they connect to the spark dispatcher through the Layer 4 load balancer. Most of the DCOS frameworks use this Layer 4 load balancer as an internal service discovery tool, with Vandebron we use this layer 4 load balancer to communicate between services. In a default DCOS set up this load balancer responds on domain names like: `spark-dispatcher.marathon.l4lb.thisdcos.directory:7077`\n\nWhen we ping the spark dispatcher we get the following:\n\n```bash\nPING spark-dispatcher.marathon.l4lb.thisdcos.directory (11.155.161.35) 56(84) bytes of data.\n64 bytes from 11.155.161.35 (11.155.161.35): icmp_seq=1 ttl=64 time=0.024 ms\n```\n\nAfter some investigation we found out that this IP range is not actually on a network interface, it is a Linux kernel functionality called `IPVS`. With IPVS you can do layer 4 load balancing, you provide the target location and the location you want to respond on.\n\nWhen we search for the IP from the spark dispatcher with ipvsadm, we get 3 results:\n\n```bash\nsudo ipvsadm -L -n |grep --color '11.155.161.35\\|$'\nTCP 11.155.161.35:80 wlc\n -> 10.2.7.146:16827 Masq 1 0 0\nTCP 11.155.161.35:4040 wlc\n -> 10.2.7.146:16826 Masq 1 0 0\nTCP 11.155.161.35:7077 wlc\n -> 10.2.7.146:16825 Masq 1 0 0\n````\n\nAs you can see the IP `11.155.161.35` points towards `10.2.7.146`, even the ports are configured and forwarded. We can add our route with ipvsadm, to understand IPVS a bit better. For example:\n\n```bash\nsudo ipvsadm -A -t 1.2.3.4:80 -s wlc # we add the target server and assign the scheduler\nsudo ipvsadm -a -r 10.2.7.146:16825 -t 1.2.3.4:80 -m # we configure the real server and target server and configure Masquerading\ncurl 1.2.3.4:80\n{\n \"action\" : \"ErrorResponse\",\n \"message\" : \"Missing protocol version. Please submit requests through http://[host]:[port]/v1/submissions/...\",\n \"serverSparkVersion\" : \"2.3.4\"\n}\n```\n\nThis results in that the spark dispatcher now also is available on `1.2.3.4:80`. As mentioned before we wanted to connect our DCOS and Kubernetes clusters, getting hundreds of entries from ipvsadm and manually adding them one by one didn’t sound appealing to us. Especially if you consider that sometimes services fail and run on a different port or different host after recovery, maintaining this by hand would be a nightmare. We therefore decided to build a tool to sync IPVS entries from DCOS to Kubernetes.\n\n## Stack\n\nWithin Vandebron we have our tech stack, we strongly believe it is good to eat your own dog food. When possible and when our use cases are similar we use the same tools as our Developers use. The parts of the stack we will be using are:\n\n- AWS ELB in front of Traefik 1.7\n- DCOS\n- Kubernetes\n\nWithin our platform team, we use Golang as our scripting language. Golang gives us the ability to build binary files with all the required libraries in the binary, we don’t have to install any packages, we do not even need to install Golang on the machine the application will be running on.\n\nIn our DCOS cluster we use Traefik 1.7, this version of Traefik only forwards HTTP requests. We decided to use Traefik to expose a JSON endpoint so we can gather the IPVS information from this location.\n\n## ipvs-server\n\nWithin our DCOS cluster we will expose the IPVS information through a JSON endpoint. We have built a tool for this to expose this information in multiple ways. In the next section, we are going to discuss some of the concepts and choices we made, we won’t deep dive into Go specifics. We have provided the entire code for this project in the examples directory of our GitHub repo:\n\n\nFirst, let’s discuss the library we use: . This library in its essence translates to ipvsadm commands, it helped save us time to implement this ourselves. There are some gotcha’s, such as newlines are not filtered out from the output. We solved this by cleaning up some of the data.\n\nIn the `childChan` function we create a go channel that is responsible for polling `ipvsadm` every 10 seconds and stores the result in a couple of variables we use in our HTTP endpoints. IPVS is a Linux kernel functionality and should be highly performant, we do not want to trigger kernel panics when the server gets overloaded with requests. We expect that every 10 seconds gives us accurate enough results, we can always lower this interval to ensure faster results. We also added in this function the string manipulation to ensure all the newlines were gone in the JSON output. The newline gave issues when we tried to add the IPVS scheduler entries.\n\n```go\nfunc childChan(c chan bool) {\n fmt.Println(\"Starting time based IPVS Admin poll\")\n\n pollInterval := 10\n timerCh := time.Tick(time.Duration(pollInterval) * time.Second)\n // Time based loop to generate Global variable\n for range timerCh {\n select {\n // when shutdown is received we break\n case <-c:\n fmt.Println(\"Received shutdown, stopping timer\")\n break\n default:\n var err error\n listIpvs.Save()\n ipvsString = fmt.Sprintln(listIpvs.Services)\n\n res := &responseObject{\n Services: listIpvs.Services,\n }\n \n ipvsJSONbyte, err := json.Marshal(res)\n if err != nil {\n logToErr.Printf(\"ERROR: -- Marshal JSON -- %v\\n\", err)\n }\n \n ipvsString = string(ipvsJSONbyte)\n ipvsJSON = strings.Replace(ipvsString, `\\n`, ``, -1)\n if debug != false {\n logToOut.Println(\"DEBUG: -- ipvsJSON --\", ipvsJSON)\n }\n }\n }\n}\n```\n\nNext is the index handler, we set our headers correctly and print the result as we would receive through ipvsadm. The index is mainly for our platform engineers to debug and verify the output. Thanks to this overview we found much faster that there was a newline hidden in the scheduler output.\n\n```go\nfunc index() http.Handler {\n // Generating the Index\n return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\n // Only available when debug is on\n if debug != false {\n logToOut.Println(\"DEBUG: -- index --\", ipvsString)\n }\n \n if r.URL.Path != \"/\" {\n http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)\n return\n }\n w.Header().Set(\"Content-Type\", \"text/plain; charset=utf-8\")\n // Site security testers expect this header to be set\n w.Header().Set(\"X-Content-Type-Options\", \"nosniff\")\n w.WriteHeader(http.StatusOK)\n fmt.Fprintln(w, ipvsString)\n })\n}\n```\n\nThe JSON endpoint is what we use in the client communicate with the server. \n\n```go\nfunc jsonz() http.Handler {\n // Generating the Index\n return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\n // Only available when debug is on\n if debug != false {\n logToOut.Println(\"DEBUG: -- jsonz --\", ipvsJSON)\n }\n \n if r.URL.Path != \"/json\" {\n http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)\n return\n }\n w.Header().Set(\"Content-Type\", \"application/json; charset=utf-8\")\n // Site security testers expect this header to be set\n w.Header().Set(\"X-Content-Type-Options\", \"nosniff\")\n w.WriteHeader(http.StatusOK)\n fmt.Fprintln(w, ipvsJSON)\n })\n}\n```\n\nWe ask our Developers often to implement a basic health endpoint, in DCOS we use this to see if a service needs to be restarted. In our application we enable set the statusOK in the index or in the JSON endpoint.\n\n```go\nfunc healthz() http.Handler {\n // Generating the healthz endpoint\n return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n if atomic.LoadInt32(&healthy) == 1 {\n w.WriteHeader(http.StatusNoContent)\n return\n }\n w.WriteHeader(http.StatusServiceUnavailable)\n })\n}\n```\n\nIn our logging and tracing functions we want to register the clients that are connecting, this gives us information where calls are coming from. It helps us debugging if we see weird behaviour.\n\n```go\nfunc tracing(nextRequestID func() string) func(http.Handler) http.Handler {\n // Tracing the http requests so its easier to check if server is reached\n return func(next http.Handler) http.Handler {\n return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n requestID := r.Header.Get(\"X-Request-Id\")\n if requestID == \"\" {\n requestID = nextRequestID()\n }\n ctx := context.WithValue(r.Context(), requestIDKey, requestID)\n w.Header().Set(\"X-Request-Id\", requestID)\n next.ServeHTTP(w, r.WithContext(ctx))\n })\n }\n}\n\nfunc logging(logToOut *log.Logger) func(http.Handler) http.Handler {\n // Creating logging entry tracing the http requests\n return func(next http.Handler) http.Handler {\n return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n defer func() {\n requestID, ok := r.Context().Value(requestIDKey).(string)\n if !ok {\n requestID = \"unknown\"\n }\n logToOut.Println(requestID, r.Method, r.URL.Path, r.RemoteAddr, r.UserAgent())\n }()\n next.ServeHTTP(w, r)\n })\n }\n}\n```\n\nIPVS needs to be executed with root privileges, to ensure this is correct we get the userid and print it when starting the server.\n\n```go\n// getProcessOwner function is to see who is running the process. It needs to be a sudo / root user\nfunc getProcessOwner() string {\n stdout, err := exec.Command(\"ps\", \"-o\", \"user=\", \"-p\", strconv.Itoa(os.Getpid())).Output()\n if err != nil {\n logToErr.Printf(\"ERROR: -- getProcessOwner -- %v\\n\", err)\n os.Exit(1)\n }\n return string(stdout)\n}\n```\n\nWe added the init function to ensure we print results the moment the server starts up, if we would not do this it would take 10 seconds for the go channel to activate\n\n```go\nfunc init() {\n // Placing the Save and val in the init, else we will need to wait for channel to perform its first run\n listIpvs.Save()\n ipvsString = fmt.Sprintln(listIpvs.Services)\n}\n```\n\nIn the main function, we set the configurable flags, such as debugging to show error messages. It proved useful during the creation of this tool to keep track and print output. If we would print the output at every call to our logs, our Elastic cluster would get thousands of logs that add little to no value.\n\nWe configure the listen port in the flags, we can use the portIndex from DCOS to assign a random port on the host to listen on. We also provided to print the version we are running. In our versioning, we use a constant to list the application semver version, we also provide the git-commit hash.\nWhen we begin the server we print the version information, the port we listen on and the user running the process. We then start the server process with the go channel, in setting up the go channel we ensure that when the server stops we try to gracefully stop the server within a 30-second timeframe. Since our ipvsadm timer is 10 seconds it should be able to cleanly shutdown within that period.\n\n### Docker build\n\nIn the repository, we have included a Dockerfile and a script to build the Dockerfile. In this Dockerfile, we pass the git commit hash to the go install. This way we always get the Git Hash from our GitHub repo and we can use this information in our version output.\n\n### DCOS service.json\n\nIn the repository, we have provided the service.json file, since it is opinionated on using Traefik you might need to change it. But in this service.json you see how we set up Traefik, the health check, and port index. Since the Mesos UCR container has fewer abstractions and has fewer limited capabilities. We can run the IPVS server inside a UCR container and get all the output as if we were running this directly as root on the host machine.\n\n## ipvs-client\n\nThe IPVS client is the component we use in the Kubernetes environment. The client connects to the server and gets the IPVS entries from the IPVS server inside our DCOS cluster. It then adds these IPVS entries to each node in the Kubernetes cluster. You, therefore, need to run each client per Kubernetes node.\n\nYou can find the code from the IPVS client in our repository.\n\n```go\nfunc httpGet(remoteURL string) []byte {\n if debug != false {\n _, err := url.ParseRequestURI(remoteURL)\n if err != nil {\n panic(err)\n }\n }\n\n req, err := http.NewRequest(http.MethodGet, remoteURL, nil)\n if err != nil {\n logToErr.Fatalf(\"ERROR: -- new HTTP request -- %v\", err)\n }\n\n ipvsClient := http.Client{\n Timeout: time.Second * 2, // Timeout after 2 seconds\n }\n req.Header.Set(\"User-Agent\", \"go-ipvs-get \\tversion: \"+version+\"\\t Git Commit: \"+gitCommit)\n res, err := ipvsClient.Do(req)\n if err != nil {\n logToErr.Fatalf(\"ERROR: -- ipvsClient -- %v\\n\", err)\n }\n\n if res.Body != nil {\n defer res.Body.Close()\n }\n\n body, readErr := ioutil.ReadAll(res.Body)\n if readErr != nil {\n logToErr.Fatalf(\"ERROR: -- body -- %v\\n\", readErr)\n }\n\n return body\n}\n```\n\nIn the httpGet function we can debug the URL and check if it is valid. Again we set the correct headers and retrieve the JSON body.\n\n```go\nfunc unmarshal(body []byte) []lvs.Service {\n\n res := &responseObject{\n Services: listIpvs.Services,\n }\n\n jsonErr := json.Unmarshal(body, &res)\n if jsonErr != nil {\n logToErr.Fatalf(\"ERROR: -- Unmarshal -- %v \\n\", jsonErr)\n }\n\n if debug != false {\n logToOut.Fatalf(\"DEBUG: -- res -- %v \\n\", res.Services)\n }\n\n r := res.Services\n\n return r\n}\n```\n\nIn the unmarshal function we unmarshal the JSON and turn it in a slice of lvs.Service.\n\n```go\nfunc addServers(remoteAddr string) {\n body := httpGet(remoteAddr)\n jsonData := unmarshal(body)\n\n for i, v := range jsonData {\n if debug != false {\n logToOut.Printf(\"DEBUG: -- range jsonDATA --\\n\")\n logToOut.Printf(\"ipvsCount=%v, value=%v\", i, v)\n }\n\n err := lvs.DefaultIpvs.AddService(v)\n if err != nil {\n logToErr.Printf(\"ERROR: -- AddService -- %v\", err)\n }\n \n i++\n ipvsServerCount = float64(i)\n }\n}\n```\n\nIn the addServers function we add the servers to IPVS.\n\n```go\nfunc clientChan(c chan bool) {\n logToOut.Println(\"Starting time based IPVS Admin add\")\n\n pollInterval := 10\n timerCh := time.Tick(time.Duration(pollInterval) * time.Second)\n // Time based loop to generate Global variable\n for range timerCh {\n select {\n // when shutdown is received we break\n case <-c:\n logToOut.Println(\"Received shutdown, stopping timer\")\n break\n default:\n\n logToOut.Println(\"Clearing & Adding servers...\")\n // Before we add Servers we need to clear the existing list\n lvs.Clear()\n addServers(remoteAddr)\n if debug != false {\n logToOut.Printf(\"IPVS servers added:\\t%v\", ipvsServerCount)\n }\n }\n }\n}\n```\n\nLike we did in the IPVS server we create a go channel to poll every 10 seconds the server endpoint. We perform this to get at a set interval the IPVS entries.\n\nSince we run the IPVS client as a binary directly on the Kubernetes hosts we build the binary with a few parameters we pass to the go build command. The binary we build with this command we host on an internal s3 bucket, we can download this binary with systemd unit files.\n\n```bash\nGOOS=linux\nGOARCH=amd64\nGIT_COMMIT=$(git rev-list -1 HEAD)\n\nexport GOOS\nexport GOARCH\nexport GIT_COMMIT\n\nenv GOOS=${GOOS} GOARCH=${GOARCH} go build -v -ldflags \"-X main.gitCommit=${GIT_COMMIT}\" .\n```\n\nWhen we run the IPVS client we can verify if the IPVS routes are added by running the `ipvsadm -L -n` command.\n\n### Unit files\n\nSince IPVS is part of the Linux kernel it is hard to deploy this in a docker container, the capabilities are more restricted in Kubernetes. We decided to deploy the IPVS client on each host machine through a systemd unit file, the main reason was that we ran into restrictions that slowed us down and this is not a permanent solution. By adding the IPVS client on the machines alone does not make it possible for containers to use the IPVS routes. We needed to add NET_ADMIN capabilities to all containers using the l4lb loadbalancer locations and configure `hostNetworking: true` in the Kubernetes pods.\n\nWe provided a deployment.yml file that runs a Ubuntu docker container with ipvsadm only installed extra. When the pods are deployed in this deployment you can use kubectl exec to get into the pod and run the `ipvsadm -L -n` command.\n\n## Vacancy at Vandebron\n\nWe are looking for a platform engineer in Vandebron. As you can understand this is not a typical scenario we daily run across, but it is part of the workloads that we will support when working on our platform. Within Vandebron we try to use the best technology available, when it is not available we build it. Due to this as platform engineers, we have many interesting challenges and offer engineers to support further than only a strict domain. We support all components of our entire platform, regardless if it is a Linux kernel issue like this, involves setting up and maintaining a NoSQL cluster, or helping the business with something like requesting a certificate.\n\nIf you are interested in learning more about this position, take a look at our Vacancy and get in contact with us.\n\n","meta":{"title":"Migrating from DCOS to Kubernetes, dealing with the l4lb loadbalancer","description":"When you want minimal downtime, you need to build your own tools","createdAt":"Fri Mar 05 2021 01:00:00 GMT+0100 (GMT+01:00)","coverImage":"images/migrating-dcos-kubernetes-l4lb.jpg","imageSource":"https://pixabay.com/users/praesentator-4372890/","tags":"Kubernetes, k8s, mesos, l4lb, ipvs, ipvsadm","author":"Rogier Dikkes","slug":"blog/migrating-dcos-kubernetes-l4lb","formattedDate":"5 maart 2021","date":"Fri Mar 05 2021 01:00:00 GMT+0100 (GMT+01:00)"}},{"content":"\nCypress is a game-changer in the automation testing world, the way that Cypress was built and its architecture allows us as testers to cover more scenarios.\n\nCypress is not Selenium; in fact, it is different. And the way to build and design a framework should be different as well.\n\nThe most famous design technique in Selenium is the Page Object Model, and many testers use the same design technique with Cypress. Even that Cypress on their official website [recommended](https://www.cypress.io/blog/2019/01/03/stop-using-page-objects-and-start-using-app-actions/) us not to go with that approach.\n\n## Page Object Model\n\nThe main benefit of using the page object model Is to make the automation framework maintenance-friendly. We can define a specific page's selectors in a separate file and then use these selectors in our test cases.\n\n```js\nclass SignInPage {\n visit() {\n cy.visit(\"/signin\");\n }\n getEmailError() {\n return cy.get(`[data-testid=SignInEmailError]`);\n }\n getPasswordError() {\n return cy.get(`[data-testid=SignInPasswordError]`);\n }\n fillEmail(value) {\n const field = cy.get(`[data-testid=SignInEmailField]`);\n field.clear();\n field.type(value);\n return this;\n }\n fillPassword(value) {\n const field = cy.get(`[data-testid=SignInPasswordField]`);\n field.clear();\n field.type(value);\n return this;\n }\n submit() {\n const button = cy.get(`[data-testid=SignInSubmitButton]`);\n button.click();\n }\n}\nexport default SignInPage;\n```\n\nThe main two downsides using the typical page object model with cypress are:\n\n- Page objects introduce an additional state into the tests, separate from the application’s internal state. This makes understanding the tests and failures harder.\n- Page objects make tests slow because they force the tests to always go through the application user interface.\n\n## Component-Based Architecture\n\nOn the other hand, a React application is component-based, where a specific page will be built from a collection of components. And components in React can be used on different pages too. So if we want to use the Page Object Model, we may define the same locator twice on different pages.\n\nSo having these two facts, At Vandebron, we came up with a new way to design our Cypress Automation framework by creating a separate JavaScript file for every component in our application, inside a folder called `components` within our Cypress project as below:\n\n```js\n// Locators\nexport const getEmailError = () => cy.get(`[data-testid=SignInEmailError]`);\nexport const getPasswordError = () =>\n cy.get(`[data-testid=SignInPasswordError]`);\nexport const emailField = () => cy.get(`[data-testid=SignInEmailField]`);\nexport const passwordField = () => cy.get(`[data-testid=SignInPasswordField]`);\nexport const submitButton = () => cy.get(`[data-testid=SignInSubmitButton]`);\n\n// Actions\nexport const visit = () => cy.visit(\"/signin\");\nexport const performLogin = (email, password) => {\n emailField().clear().type(email);\n passwordField().clear().type(password);\n submitButton().click();\n};\n```\n\nHaving it built this way, we eliminated all the previous problems mentioned earlier; we are not adding any classes, and we are defining objects within our test cases. And the most important part is that we are following the way that Cypress recommends it.\n\nAnd after defining the component locators and actions, we can import them inside our test case and use them as below:\n\n```js\nimport LoginComponent from \"../components/loginComponent\";\nimport Menu from \"../components/Menu\";\n\ndescribe(\"Test Login Page\", () => {\n it(\"should show an error message if the password in wrong\", () => {\n LoginComponent.visit();\n LoginComponent.performLogin(\"email@gmail.com\", \"wrongPassword\");\n LoginComponent.getPasswordError().should(\"be.visible\");\n });\n it(\"should show the logout button if the user logged in succesfully\", () => {\n LoginComponent.visit();\n LoginComponent.performLogin(\"email@gmail.com\", \"correctPassword\");\n Menu.LogoutButton().should(\"be.visible\");\n });\n});\n```\n\nAnd as you can see, our test cases are readable for anyone! And if any locator changes in any of the components, we can easily fix it in one location and from the same file. And lastly, if a component will be used in different places, we can use the same code.\n\nIn the next article, I will talk about how we use Cypress in our manual testing during the sprint and how it saves us tons of time and effort.\n","meta":{"title":"Cypress.io Component Design Technique for React Applications","description":"Cypress is a game-changer in the automation testing world, the way that Cypress was built and its architecture allows us as testers to cover more scenarios.","createdAt":"Fri Feb 05 2021 01:00:00 GMT+0100 (GMT+01:00)","coverImage":"images/cypress-component-design-technique-for-react-applications.png","tags":"Cypress, Testing, React","author":"Hatem Hatamleh","slug":"blog/cypress-component-design-technique-for-react-applications","formattedDate":"5 februari 2021","date":"Fri Feb 05 2021 01:00:00 GMT+0100 (GMT+01:00)"}},{"content":"\nIn Vandebron we have been using container clusters to host our services since the foundation of our Big Data team. \nRecently our cluster of choice has declared End-Of-Life development stage, so we decided to take a step forward and get a ticket for the Kubernetes boat.\n\nA change in the OS that is used to run your services and applications can look quite challenging and not everyone is on the same experience level. To make everyone comfortable it is a good choice to give everyone the possibility to play with the new tools and learn what can be done and how: **you need a sandbox.**\n\nOur developers are provided with a Macbook and at the moment of writing there some options you can go for when deciding how to set up your playground:\n\n- **Docker CE Kubernetes**: This is the easiest solution since there is a handy button to run your containers into a Kubernetes environment.\n\n- **Vagrant and Virtualbox**: This solution is the one that can give you more control and you can easily create a cluster the size you want, but you need to be handy with VMs, the hypervisor of choice, and Vagrant. It's the old school way to do it but, while it's a chunk your platform engineers can bite, it can be a steep and frustrating process for people that are not used to handle VMs.\n\n- **Multipass + some bash magic glue**: Since Canonical created this tool for macOS, creating an Ubuntu VM became a breeze and you can have a single, easily manageable VM with its networking up and running in less than a minute, without having to handle disks, distros, and stuff. On top of it, the command line interface is straight forward and it has just the basic commands we will need, so wrapping the entire process into a bash script is a piece of cake.\n\nI have found this super cool in-depth [article](https://jyeee.medium.com/kubernetes-on-your-macos-laptop-with-multipass-k3s-and-rancher-2-4-6e9cbf013f58) from Jason Yee (kudos to you bruh) that guided me through the installation of my first single node Kubernetes cluster.\n\nThe process is not that long but it involves a lot of copy/pasting and, once learned the basics, I didn't want to go under the same process more times, plus it could be interesting for me as a Platform Engineer, but it may be boring and pointless for developers who just want to have a sandbox replica of what they are working on in the remote environment.\nMy automator (aka do-it-once-never-do-it-again) spirit kicked in and I decided to wrap every step in a small command-line tool with only 3 options:\n- **install**\n- **cleanup**\n- **help**\n\n\n### What is happening under the hood\n\nWhat the script does is substantially automating all the steps needed to:\n1. Create a new VM using Multipass (tool released by Canonical)\n2. Fetch the VM IP address and adding it to your local `/etc/hosts` file\n3. Install k3s (a lightweight distribution of Kubernetes) on top of the VM\n4. Install the Kubernetes command-line tools on your laptop\n5. Install Helm (the Kubernetes package manager) on your laptop\n6. Install cert-manager (certificate manager) package on top of your k3s cluster\n7. Install Rancher (a Kubernetes control plane) package on top of your k3s cluster\n\nIf you are looking for a more in-depth breakdown of the single steps you can download and inspect [the script](https://gist.githubusercontent.com/nikotrone/50b1a5f8d137411879eb2467e689bfbe/raw/090b4b4323d96ac28d96bbb346e2e657073722e6/bronernetes) (one of the many advantages of [OpenSource](https://en.wikipedia.org/wiki/Open_source) projects) or checkout and read the original [article](https://jyeee.medium.com/kubernetes-on-your-macos-laptop-with-multipass-k3s-and-rancher-2-4-6e9cbf013f58): it explains line by line what the specific commands are doing.\n\n#### 1. Multipass VM\n[Multipass](https://multipass.run/) is a tool from Canonical (the company developing and maintaining the Ubuntu Linux distribution) that leverages Hyperkit (macOS feature to handle virtualization) to create and handle a Virtual Machine directly on your Mac.\n\n#### 2. Edit /etc/hosts\nOnce we have our VM up and running we need to make it available with an easy url that is also gonna be used to generate the SSL certificate, in our case we picked up `rancher.localdev`.\nIt is important to have a name setup in the beginning since this one will need to match with the certificate so we can use it programmatically.\n\n#### 3. Install K3S\nThis step is pretty straightforward: just fetch a script that is publicly available on the [k3s official website](https://get.k3s.io) and feed it to your bash.\nK3s is a lightweight version of Kubernetes with all the needed dependencies and executable packaged in a convenient installation script. Because of its light nature, it is often used in embedded devices that have a limited amount of resources to offer.\n\n#### 4 & 5. Kubernetes and Helm cli\n**Kubernetes cli** (`kubectl`) is used to talk and interact with your Kubernetes cluster. It can be used to manage multiple clusters according to the content of your KUBECONFIG environment variable. \nThe variable itself contains just a path to where your cluster configuration is stored, so you can switch from a cluster to another by simply pointing to another file that contains the configuration of another cluster.\n\n**Helm** instead is the \"package manager\" of Kubernetes: you can use it to add repositories to specific `charts` which are the blueprint that contains a way to install a specific tool on your cluster.\nBoth of these tools have to be installed and run from your local laptop, either in the case you are managing a local VM or in the case you are interacting with a remote cluster.\n\n#### 6 & 7. cert-manager and Rancher\n\n**Rancher** is the control plane for our cluster: it provides a GUI and an overview of our single node cluster. It offers other goodies like management of multiple clusters, deployed on different locations like AWS Azure and GCP or even on your own hardware, plus certificate deployment and some other handy functionalities.\n\n**cert-manager** is installed via Helm chart and it is the tool used by Rancher to generate and deploy a certificate across the entire cluster.\n\n### How to use it\n\nAll the steps will involve the use of a Terminal window\n#### Installation\nThe first thing you need to do is download [this script](https://gist.github.com/nikotrone/50b1a5f8d137411879eb2467e689bfbe) and save it in a folder on your Mac (let's assume `~/bronernetes`) by executing\n```bash\n mkdir ~/bronernetes\n cd ~/bronernetes\n curl https://gist.githubusercontent.com/nikotrone/50b1a5f8d137411879eb2467e689bfbe/raw/090b4b4323d96ac28d96bbb346e2e657073722e6/bronernetes > bronernetes\n export PATH=$PATH:$(pwd)\n```\n\nNow we have the toolset and you can confirm it works by simply running `bronernetes help`.\n\n#### Spin up Kubernetes\nThe next step is to run the installation process with the command `bronernetes install`\n\n#### Clean up\nWhen you are done or you just want to hard reset your environment you can just type `bronernetes cleanup` and it will take care of cleaning up the VM you just used, leaving you with a pristine machine, as nothing ever happened :)\n\n### Conclusion\n\nHaving a sandbox is very useful to play around with the concepts of a new setup or service and it packs up a huge amount of positive sides. No matter what is the language or the nature of the system you are trying to replicate, it can be challenging and involve a long list of instructions or manual operations and, sometimes, even dedicated hardware. Although with some bash glue, it is possible to automate most of those processes and the investment cost can be enormously beneficial for yourself (less work the next time you do it) and for the other people working with you (they can use the tool, comment and suggest improvements). Most of all, in the case of infrastructure, it helps raise the knowledge of \"what's going on here\" and documents for the ones interested in taking a trip down the rabbit hole.\n","meta":{"title":"How to Spin Up A Kubernetes Cluster On Your Macbook","description":"It is can be useful to create a disposable Kubernetes sandbox to play with when you are exploring a new application and how it could work.","createdAt":"Mon Jan 25 2021 01:00:00 GMT+0100 (GMT+01:00)","coverImage":"images/spin-up-kubernetes-on-macbook.jpg","imageSource":"https://pixabay.com/it/users/mari_sparrow-13090456/","tags":"Kubernetes, k8s, local","author":"Marco Nicotra","slug":"blog/spin-up-kubernetes-on-macbook","formattedDate":"25 januari 2021","date":"Mon Jan 25 2021 01:00:00 GMT+0100 (GMT+01:00)"}},{"content":"\nAt Vandebron we're maintaining a component library called [Windmolen](https://windmolen.netlify.app/) (Dutch for \"wind turbine\"). And if you've ever built a component library, you probably dealt with optimizing and converting icons before. With SVGO and SVGR you can do this at scale, without compromising the quality or size of your icons.\n\n## The problem\n\nThe web is full of icons, and often these icons are rendered from SVG files to ensure you can increase (or decrease) the size of the icons depending on the use case. Designers often create these icons from design tools like Adobe Photoshop or Sketch. Although these icons might look pretty, exporting a SVG out of these tools is often difficult as [this article](https://medium.com/sketch-app-sources/the-best-way-to-export-an-svg-from-sketch-dd8c66bb6ef2) explains. Also, added lot of code in the form of metadata is added to the SVG file. Let's have a look at what a typical SVG file exported out of Sketch looks like:\n\n```svg\n\n\n\n \n last\n Created with Sketch.\n \n \n \n \n \n \n\n```\n\nThe SVG file above holds a lot of information about Sketch, such as the `title` of the icon and a `desc`ription. Next to that, there's a lot of elements that could be combined into one element to reduce the file size.\n\n## Optimizing SVGs\n\nWhat's cool about SVG files is that you can optimize and minify them, without affecting what the SVG looks like. This is something you can try out yourself using the website [SVGOMG](https://jakearchibald.github.io/svgomg/), which is powered by the library SVGO that you'll learn more about later.\n\n\nYou can optimize the SVG file above by following these steps:\n\n1. Go to [https://jakearchibald.github.io/svgomg/](https://jakearchibald.github.io/svgomg/)\n2. Click on `Paste markup` an paste the SVG code that you exported from Sketch (a.k.a. the SVG file above)\n3. You will see the icon rendered, now you have to either click at the `Copy as a text` or `Download` button to get the optimized SVG file\n\nWith these simple steps you've optimized the SVG from over 450 bytes, which is already small, to 173 bytes (a decrease of over 62%!). If you'd open this file in the editor of your choice, you can see a lot of the useless (meta)data from the original file has been deleted. Also, the different elements of the SVG are combined in a single `path` that renders the icon:\n\n```svg\n\n\n \n\n```\n\nThis SVG can be even further optimized by checking the \"Prefer viewbox to width/height\" in SVGOMG, but let's save that for later when we use SVGO instead.\n\n## Using SVGO\n\nBy using SVGOMG you've already experienced what power [SVGO](https://github.com/svg/svgo) has, as SVGOMG is described by its creators as *\" SVGO's Missing GUI, aiming to expose the majority if not all the configuration options of SVGO\"*. Instead of using the GUI, you can also use SVGO directly from the command line as a CLI-tool or as a Node.js module. For the sake of this article, we'll be using it solely as CLI.\n\nSVGO can be installed globally on your machine, or locally in your project, from npm by running:\n\n```bash\nnpm i -g svgo\n\n# Yarn equivalent\nyarn add -G svgo\n```\n\nAfter doing this you can run `svgo` from the command line and optimize any SVG file instantly. But, you don't want to do this manually on your machine anytime you're adding a new icon to a project (or component library). Therefore, you can also add SVGO to a project locally and add a script to the `package.json` file to optimize all SVGs in a certain directory.\n\n```json\n// package.json\n{\n // ...\n \"scripts\": {\n // ...\n \"optimize-svg\": \"svgo --config=.svgo.yml -f ./src/assets/icons\"\n }\n}\n```\n\nThe `optimize-svg` script will run SVGO in the directory `src/assets/icons` and optimize all the SVG files based on the settings in `.svgo.yml`. This file is where you can configure the rules for SVGO, as the previously mentioned \"Prefer viewbox to width/height\":\n\n```yaml\n# .svgo.yml\nplugins:\n - removeViewBox: false\n - removeDimensions: true # this deletes width/height and adds it to the viewBox\n - removeDoctype: true\n - removeComments: true\n - removeMetadata: true\n - removeEditorsNSData: true\n - cleanupIDs: true\n - removeRasterImages: true\n - removeUselessDefs: true\n - removeUnknownsAndDefaults: true\n - removeUselessStrokeAndFill: true\n - removeHiddenElems: true\n - removeEmptyText: true\n - removeEmptyAttrs: true\n - removeEmptyContainers: true\n - removeUnusedNS: true\n - removeDesc: true\n - prefixIds: false\n - prefixClassNames: false\n```\n \nFrom the rules above you'll get an idea about all the redundant and useless lines of code that might be present in your SVG files. But luckily, they will all get removed when you run the command `npm run optimize-svg`.\n\n## Converting SVGs with SVGR\n\nYou've now learned how to optimize your SVG files, and are probably wondering how to use these files in a React application. To render an SVG in React, you need to either configure Webpack in a way that it knows how to deal with SVG files or use a library called SVGR. By default, any application created with `create-react-app` can render SVG files as a component, using the following `import` statement:\n\n```jsx\n// MyComponent.jsx\nimport React from 'react';\nimport { ReactComponent as MySVG } from './something.svg';\n\nconst MyComponent = () => {\n return (\n
\n \n
\n );\n}\nexport default MyComponent;\n```\n\nMore information about how this is done can be found in [this article](https://blog.logrocket.com/how-to-use-svgs-in-react/), but let me show you how to solve that with SVGR.\n\nWith [SVGR](https://react-svgr.com/) you can convert SVG files into React Components, either by adding it to Webpack or by using the SVGR CLI or Node.js module. In the same way, as we optimized the SVGs from the command line with SVGO, we can also convert these icons from the command line with SVGR:\n\n```json\n// package.json\n{\n // ...\n \"scripts\": {\n // ...\n \"optimize-svg\": \"svgo --config=.svgo.yml -f ./src/assets/icons\",\n \"convert-svg\": \"svgr -d ./src/components/Icon ./src/assets/icons\"\n }\n}\n```\n\nWhenever you run the command `npm run convert-svg` a JSX file will be created for every SVG file that's present in the directory `src/assets/icons`. These JSX files can be found in the directory `src/components/Icons`, together with an `index.js` file that exports all these components from this directory.\n\nAn example of such a converted SVG file is:\n\n\n```jsx\n// MySVG.jsx\nimport * as React from 'react';\n\nconst MySVG = (props) => (\n \n \n \n);\n\nexport default MySVG;\n```\n\nAnd, as we now have a directory filled with converted SVGs these can be imported into any React component like this:\n\n```jsx\n// MyComponent.jsx\nimport React from 'react';\nimport MySVG from './MySVG.jsx';\n\nconst MyComponent = () => {\n return (\n
\n \n
\n );\n}\nexport default MyComponent;\n```\n\nOften SVGR is used alongside SVGO, so you can even automatically optimize all SVGS that will be converted by SVGR. This is done by adding the flag `--no-svgo true` and point it towards your SVGO configuration file:\n\n```json\n// package.json\n{\n // ...\n \"scripts\": {\n // ...\n \"convert-svg\": \"svgr -d ./src/components/Icon ./src/assets/icons --no-svgo true --svgo-config .svgo.yml\"\n }\n}\n```\n\nBy running the `convert-svg` script you both optimize and convert all the SVG files in `src/assets/icons` to React components based on optimized SVGs.\n\n## Reading further\n\nThe examples in this post are the tip of the metaphorical iceberg on what problems SVGO and SVGR can solve. There are many other features you can enable, such as using them as Node.js modules or enabling TypeScript support. To read further make sure to have a look at the SVGR [playground](https://react-svgr.com/playground/) or [documentation](https://react-svgr.com/docs/getting-started/).\n","meta":{"title":"Optimizing, Converting And Exporting SVG Icons In React","description":"If you've ever build a component library, you probably dealt with optimizing and converting icons before. With SVGO and SVGR you can do this at scale.","createdAt":"Thu Dec 10 2020 01:00:00 GMT+0100 (GMT+01:00)","coverImage":"images/optimizing-converting-and-exporting-svg-icons-in-react.jpg","tags":"React, component library","author":"Roy Derks","slug":"blog/optimizing-converting-and-exporting-svg-icons-in-react","formattedDate":"10 december 2020","date":"Thu Dec 10 2020 01:00:00 GMT+0100 (GMT+01:00)"}},{"content":"\nHere at Vandebron, we have several projects which need to compute large amounts of data. To achieve acceptable results, we had to choose a computing tool that should have helped us to build such algorithms.\n\nAs you may have read in other articles our main backend language is Scala so the natural choice to build distributed parallel algorithms was indeed Spark.\n\n## What is Spark\n\nWe will briefly introduce Spark in the next few lines and then we will dive deep into some of its key concepts.\n\nSpark is an ETL distributed tool. ETL are three phases that describe a general procedure for moving data from a source to a destination.\n\n![ETL Diagram](/images/etlprocess.png \"ETL\")\n\n- **_Extract_** is the act of retrieving data from a data source which could be a database or a file system.\n- **_Transform_** is the core part of an algorithm. As you may know, functional programming is all about transformation. Whenever you write a block of code in Scala you go from an initial data structure to a resulting data structure, the same goes with Spark but the data structures you use are specific Spark structures we will describe later.\n- **_Load_** is the final part. Here you need to save (load) the resulting data structure from the transformation phase to a data source. This can either be the same as the extract phase or a different one.\n- **_Distributed_**: Spark is meant to be run in a cluster of nodes. Each node runs its own JVM and every Spark data structure can/should be distributed among all the nodes of the cluster (using serialization) to parallelize the computation.\n\n### Spark data structure: RDD, DataFrame, and Dataset\n\nThe core of Spark is its _distributed resilient dataset (RDD)_.\n\n![Spark API history](/images/sparkapihistory.png \"Spark API history\")\n\nAn **_RDD_** is a collection of elements partitioned across the nodes of the cluster that can be operated on in parallel. _Extracting_ data from a source creates an RDD. Operating on the RDD allows us to _transform_ the data. Writing the RDD _loads_ the data into the end target like a database for example). They are made to be distributed over the cluster to parallelize the computation.\n\nA **_DataFrame_** is an abstraction on top of an RDD. It is the first attempt of Spark (2013) to organize the data inside and RDD with an SQL-like structure. With dataframe, you can actually make a transformation in an SQL fashion. Every element in a dataframe is a Row and you can actually transform a dataframe to another by adding or removing columns.\n\nA **_DataSet_** finally is a further abstraction on top of a dataframe to organize data in an OO fashion (2015). Every element in a dataset is a case class and you can operate transformation in a scala fashion from a case class to another.\n\n## Spark in action\n\nLet’s see now some code samples from our codebase to illustrate in more detail each of the ETL phases.\n\n### Extract\n\nThe extraction phase is the first step in which you gather the data from a datasource.\n\n```scala\nval allConnections = sparkSession\n.read\n.jdbc(connectionString, tableName, props)\n\nval selectedConnections = allConnections\n.select(ColumnNames.head, ColumnNames.tail: _*)\n\nval p4Connections = selectedConnections\n.filter(allConnections(\"HasP4Day activated\").equalTo(1))\n.filter(allConnections(\"HasP4INT activated\").equalTo(1))\n.as[Connection]\n\np4Connections.show()\n```\n\nFor most people the extraction phase is just the first line (the invocation to the read method), they are not wrong because extracting means reading data from a datasource (in this case an SQL server database). I decided to include in this phase also some filtering and projection operations because I think these are not really part of the algorithm, this is still the preparation phase before you actually process the data. We can ultimately say that _preparing the data_ is something in between extraction and transformation therefore it is up to you to decide which phase it belongs to.\n\n### Transform\n\nTransformation phase is the core of the algorithm. Here you actually process your data to reach your final result.\n\n```java scala\nusageDF\n.groupBy('ConnectionId, window('ReadingDate, \"1 day\"))\n.agg(\n sum('Consumption).as(\"Consumption\"),\n sum('OffPeak_consumption).as(\"OffPeak_consumption\"),\n sum('Peak_consumption).as(\"Peak_consumption\"),\n sum('Production).as(\"Production\"),\n sum('OffPeak_production).as(\"OffPeak_production\"),\n sum('Peak_production).as(\"Peak_production\"),\n first('ReadingDate).as(\"ReadingDate\"),\n first('marketsegment).as(\"marketsegment\"),\n collect_set('Source).as(\"Sources\"),\n collect_set('Tag).as(\"Tags\"),\n max('Last_modified).as(\"Last_modified\")\n)\n.withColumn(\n \"Tag\", when(array_contains('Tags, “Interpolated”),\nlit(Tag.Interpolated.toString)).otherwise(lit(“Measured”)))\n.withColumn(\"Source\",\nwhen(size('Sources) > 1,\nlit(Source.Multiple.toString)).otherwise(mkString('Sources)))\n.orderBy('ConnectionId, 'ReadingDate)\n.drop(\"window\", \"sources\", \"tags\")\n```\n\nIn this specific example, we are processing connection usage data by aggregating it daily. In the `usageDF` we have 15 minutes interval usage data, now we want to show to the user the same data but with a different aggregation interval (1 day). So we group the whole data by connection id and window the reading date by 1 day (A window function calculates a return value for every input row of a table based on a group of rows [Introducing Window Functions in Spark SQL - The Databricks Blog](https://databricks.com/blog/2015/07/15/introducing-window-functions-in-spark-sql.html).\n\nOnce the data is grouped we can aggregate it, using the `agg` method which allows us to call the aggregation functions over the dataframe (for example: `sum`, `first`,`max` or `collect_set`). Successively we transform the dataframe to suit our visualization needs, the methods used are self-explanatory and the documentation is very clear. [Getting Started - Spark 3.0.1 Documentation](https://spark.apache.org/docs/latest/sql-getting-started.html)\n\n### Load\n\nThe final phase is the one which `save`, `put`, `show` the transformed data into the target data source.\n\n```java scala\ndataFrame\n.select(columns.head, columns.tail: _*)\n.write\n.cassandraFormat(tableName, keySpace)\n.mode(saveMode)\n.save()\n```\n\nIn this specific case, we will save our dataframe into a Cassandra database. In Spark, methods used to achieve the load phase are called _actions_. It is very important to distinguish Spark actions from the rest because actions are the only ones that trigger Spark to actually perform the whole transformation chain you have defined previously.\n\nIf our transformation phase, as we described above, wasn’t followed by an action (for example `save`) nothing would have happened, the software would have simply terminated without doing anything.\n\n## One concept to rule them all\n\n```java scala\nval rdd1 = sc.parallelize(1 to 10)\nval rdd2 = sc.parallelize(11 to 20)\nval rdd2Count = rdd1.map(\nx => rdd2.values.count() * x //This will NEVER work!!!!\n)\n```\n\n_One does not simply use RDD inside another RDD_. (Same goes for Dataframes or Datasets).\n\nThis is a very simple concept that leads very often to lots of questions because many people just want to use Spark as a normal scala library. But this is not possible due to the inner distributed nature of Spark and its data structures. We have said that an RDD is a resilient distributed dataset, let’s focus on the word _distributed_, it means that the data inside it is spread across the nodes of the cluster. Every node has its own JVM and it is called _Executor_, except for the master node where your program starts which is called _Driver_:\n\n![Spark cluster overview](/images/spark-cluster-overview.png \"Spark cluster overview\")\n\nYour code starts from the Driver and a copy is distributed to all executors, this also means that each executor needs to have the same working environment of the Driver, for Scala it is not a problem since it just needs a JVM to run. (but we will see that if you use _pySpark_ you need to take extra care when you distribute your application.) Every Spark data structure you have defined in your code will also be distributed across the executors and every time you perform a transformation it will be performed to each chunk of data in each executor.\n\nNow let’s go back to our example, a `map` is a transformation on `rdd1` this means that block inside will be executed at the executor level, if we need `rdd2` to perform this block Spark should somehow serialize the whole `rdd2` and send it to each executor. You can understand now that _it is really not possible to serialize the whole RDD since it is by its nature already a distributed data structure_. So what can you do to actually perform such computation we showed in the example? The solution is “simple”: _prepare your data in such a way that it will be contained in one single RDD_. To do so you can take advantage of all the transformation functions Spark has to offer such `map` `join` `union` `reduce` etc.\n\n## Next step…\n\nWe have explained all the main concepts of Spark and we have shown some real snippets of our codebase. In the next article, I would like to show you a real-life problem we have solved in our company using [_pySpark_](https://spark.apache.org/docs/latest/api/python/index.html). I will show you how to customize Spark infrastructure to correctly parallelize the ETL algorithm you have built.\n","meta":{"title":"Fueling the Energy Transition With Spark - Part 1","description":"Our main backend language is Scala, and by using Spark we build distributed parallel algorithms to fuel the Energy Transition. But why is Spark the best choice for that job?","createdAt":"Wed Nov 04 2020 01:00:00 GMT+0100 (GMT+01:00)","coverImage":"images/fueling-the-energy-transition-with-spark-part-1.jpg","imageSource":"https://www.pexels.com/photo/shallow-focus-photography-of-light-bulbs-2764942","tags":"spark, scala","author":"Rosario Renga","slug":"blog/fueling-the-energy-transition-with-spark-part-1","formattedDate":"4 november 2020","date":"Wed Nov 04 2020 01:00:00 GMT+0100 (GMT+01:00)"}},{"content":"\nAt Vandebron we organize a two-day long Hackathon every quarter, and a colleague and I took this chance to dig into the wonderful world of GraalVM.\n\nI've first heard of GraalVM around two years ago when Oleg Šelajev toured through Java User Groups in Germany and held talks about GraalVM. [Here](https://www.youtube.com/watch?v=GinNxS3OSi0) is one from 2019 (not Germany, but Spain this time).\n\nGraalVM promises a significant speedup in compile times and as I am working with Scala, which is notoriously known for its long compile times, this seems interesting. Furthermore, GraalVM provides functionality to build native executables. Meaning, an application can be run without a Java Virtual Machine (JVM).\n \nThanks to the Hackathon I finally took the time to get to know GraalVM a bit better. With this blog post, I want to share our findings, experiences, and results, as they might be helpful for you too!\n\n## What is GraalVM?\n\nGraalVM is a high-performance JVM that supports efficient ahead-of-time (AOT) and just-in-time (JIT) compilation, but also allows non-JVM languages (e.g. Ruby, Python, C++) to run on the JVM. The ahead-of-time compilation feature is the base for creating native executable programs, meaning an application can be run independently from the JVM. Seeing the versatile features of GraalVM, it is worth looking a bit under its hood.\n\nActually, GraalVM is defined by three main technologies:\n\n- [Graal compiler](https://www.graalvm.org/reference-manual/jvm/), a high-performance JIT-compiler that can make JVM applications run faster from within the JVM\n- [SubstrateVM](https://www.graalvm.org/reference-manual/native-image/SubstrateVM/), includes the necessary components to run a JVM-app as a native executable ( Garbage Collector, Thread Scheduler, etc.)\n- [Truffle Language Implementation Framework](https://www.graalvm.org/graalvm-as-a-platform/language-implementation-framework/), the basis for the polyglot support from GraalVM\n\nOur motivation for trying out GraalVM was tackling the pain points of Scala, Java projects, and microservices. Shipping microservices written in Scala as Docker containers to your production system comes with the cost that startup can be a bit slow, having JVM and Docker overhead, and that those containers can be fairly large, as the application can only be run with a JVM. See [Building Docker images](#building-docker-images) for more information.\n\nDuring the hackathon, we were most interested in building native images for Scala applications. Hoping to reduce the size of our docker containers and reducing up the startup time.\n\n## Project setup\n\nThe project we worked on during the Hackathon is an API that should be used for applicants to submit their applications at Vandebron in the future. By exposing one endpoint through which a resume and contact information can be submitted.\n\nIt is also a good project to test out GraalVM, nothing too complex but also not as simple as \"Hello World\".\n\nThe full setup can be found [on Github](https://github.com/kgrunert/apply-at-vdb). But I'll summarise the used stack below. The project is built around the following libraries, no particular reason, simply because I like them.\n\n- _cats_ for working with effects, such as IO\n- _http4s_ for running the server\n- _tapir_ for defining the endpoints\n- _circe_ for JSON de/serialisation\n- _pureconfig_ for reading config-files\n- _logback_ for logging\n\nThe project can be run via `sbt run` and with Postman or similar a POST-request can be sent like so:\n\n```json\nPOST localhost:8080/api/v1/apply\n\n{\n\t\"email\": \"my@email.de\",\n\t\"name\": \"My Name\",\n\t\"phoneNumber\": \"+310123456789\",\n\t\"applicationBase64\": \"VGhpcyBjb3VsZCBiZSB5b3VyIGFwcGxpY2F0aW9uIQ==\"\n}\n\nResponse:\n\"*confetti* Thanks for handing in your application, we will get back to you within the next days! *confetti*\"\n```\n\n## Setup GraalVM with sbt\n\nWith this initial project setup in mind, GraalVM needs to be installed locally.\n\nFor the installation of GraalVM the [setup guide](https://www.graalvm.org/docs/getting-started-with-graalvm/#install-graalvm) can be followed.\n\nAfter the installation sbt needs to know that not the regular JDK/JVM is used. This can be done with the `java-home` option on sbt bootup.\nTo make the path to GraalVM a bit more accessible and easy to use it can be exported as an environment variable.\n\n```bash\nexport GRAAL_HOME=/Library/Java/JavaVirtualMachines/graalvm-ce-java8-20.1.0/Contents/Home\nsbt -java-home $GRAALHOME\n```\n\nThe path to GraalVM can vary depending on OS and installation. We followed the basic installation for macOS.\n\nNow sbt using GraalVM can be verified with:\n\n```bash\nsbt -java-home $GRAALHOME\nscala> eval System.getProperty(\"java.home\")\n[info] ans: String = /Library/Java/JavaVirtualMachines/graalvm-ce-java8-20.1.0/Contents/Home/jre\n```\n\nThat means everything running in this sbt instance is getting compiled by GraalVM. Awesome!\n\nThe next step is to become strong and independent and learn how to run without an underlying JVM with the help of building native images.\n\n## Building native images\n\nGraalVM ships with the [GraalVM Updater](https://www.graalvm.org/reference-manual/graalvm-updater/) (`gu`) to install the `native-image` on your machine.\n\n```bash\n$GRAALHOME/bin/gu install native-image\n```\n\n[sbt-native-packager](https://sbt-native-packager.readthedocs.io/en/latest/) provides functionality to build packages efficiently (e.g. building Docker images) and added to that, it also provides support for building native images.\nIn order to build native images with sbt commands this plugin has to be added to the project:\n\n```java scala\n// inside project/plugins.sbt\naddSbtPlugin(\"com.typesafe.sbt\" % \"sbt-native-packager\" % \"1.7.3\")\n```\n\nAnd the `GraalVMNativeImagePlugin` needs to be enabled:\n\n```java scala\n// inside build.sbt\nenablePlugins(GraalVMNativeImagePlugin)\n```\n\nFrom within sbt it should be able to autocomplete and suggest graal-commands, e.g.:\n\n```java scala\nsbt:apply-at-vdb> graalvm\ngraalvm-native-image: graalvmNativeImageOptions\n```\n\nWith that setup, native images are just a stone's throw away!\n\n---\n\n### Disclaimer\n\nThe next three sections are not a write-up but rather the main steps we had to take to make the project work. This includes failing images and troubleshooting.\nI want to keep this in because it might be interesting for others when they have to troubleshoot.\nFor the summary and happy path, you can jump directly to [Roundup](#roundup).\n\n---\n\n### First try building a native image\n\nNext up `graalvm-native-image:packageBin` can be run from within sbt. This might take a while (on our systems it took about a minute)\n\nSome warnings start to pop up:\n\n```\n[error] warning: unknown locality of class Lnl/vandebron/applyatvdb/Main$anon$exportedReader$macro$24$1;, assuming class is not local. To remove the warning report an issue to the library or language author. The issue is caused by Lnl/vandebron/applyatvdb/Main$anon$exportedReader$macro$24$1; which is not following the naming convention.\n\n[error] warning: unknown locality of class Lfs2/internal/Algebra$Done$2$;, assuming class is not local. To remove the warning report an issue to the library or language author. The issue is caused by Lfs2/internal/Algebra$Done$2$; which is not following the naming convention.\n```\n\nThe library-specific warnings can be ignored for now. Ultimately it fails with:\n\n```\nError: com.oracle.graal.pointsto.constraints.UnresolvedElementException:\nDiscovered unresolved type during parsing: org.slf4j.impl.StaticLoggerBinder.\nTo diagnose the issue you can use the --allow-incomplete-classpath option.\nThe missing type is then reported at run time when it is accessed the first time.\n```\nActually a good hint on where to start fine-tuning the GraalVM config:\n\n```java scala\n// inside build.sbt\ngraalVMNativeImageOptions ++= Seq(\n\t\"--allow-incomplete-classpath\",\n)\n```\n\nSome things like a `StaticLoggerBinder` only get resolved at runtime, meaning at build time the classpath needs to be allowed to be incomplete. This option allows resolution errors to be ignored at build time and only pop up during runtime.\n\nDuring the build of a native image, GraalVM tries to resolve those runtime dependencies already at compile-time, as it is part of the Ahead-Of-Time-compilation process. With this flag, GraalVM knows \"hey, don't worry about it now, we cross the bridge when we get there\" (or something like that).\n\n### Adding resource files\n\nA `reload` (or restart) of sbt is needed to activate these new options. And we can try to build the native image up new.\nThis time the build finished successfully and the executable file `target/graalvm-native-image/apply-at-vdb` has been created!\nThis is an executable that can be run without a JVM:\n\n```bash\ntarget/graalvm-native-image/apply-at-vdb\n```\n\nBut what's that? It actually cannot be started...\n\n```bash\ntarget/graalvm-native-image/apply-at-vdb\n\nSLF4J: Failed to load class \"org.slf4j.impl.StaticLoggerBinder\".\nSLF4J: Defaulting to no-operation (NOP) logger implementation\nSLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.\n*** An error occured! ***\nCannot convert configuration to a de.erewl.pricetracker.server.Config. Failures are:\nat the root:\n- Key not found: 'host'.\n- Key not found: 'port'.\n```\n\nThe first three lines relate to the error that occurred during the first build. It simply says that logging hasn't been set up correctly (maybe due to the absence of a `src/main/resources/logback.xml` or some other misconfiguration), triggering the default setting of not logging anything at all.\nThe second error states that a configuration file does not have the right keys or cannot be found at all.\nLooking into `src/main/resources`:\n\n```bash\nls src/main/resources/\napplication.conf logback.xml\n```\n\nand peeking into `application.conf`:\n\n```bash\ncat src/main/resources/application.conf\n\thost = \"localhost\"\n\tport = 8080\n```\n\nHm, so everything is actually in place. But somehow GraalVM can't find those files.\nIt still requires some more GraalVM fine-tuning here.\n\nBy default, GraalVM doesn't include any resource or configuration-files.\nThe option `-H:ResourceConfigurationFiles=path/to/resource-config.json` defines a path to a JSON configuration file. So inside the `resource-config.json` we can include our `application.conf` and our `logback.xml`.\n\nBut writing those config files can be tedious and it is difficult in larger projects to find all necessary classes that need to be included. GraalVM provides some support with writing those files and actually does all the work. In the project's root directory a configs-folder can be created which will contain all necessary config-files.\n\nFor writing the configuration files we will build a normal JAR-file with the help of the `sbt-assembly` plugin. Adding it to the project like so:\n\n```java scala sbt\n // inside project/plugins.sbt\n addSbtPlugin(\"com.eed3si9n\" % \"sbt-assembly\" % \"0.14.6\")\n```\n\nThe JAR-file will be built with `sbt assembly`.\n\nWith that we can now start the application, providing the path to the JAR-file that just has been created:\n\n```bash\nmkdir configs\n$GRAALHOME/bin/java -agentlib:native-image-agent=config-output-dir=./configs -jar target/scala-2.12/apply-at-vdb-assembly-0.1.0-SNAPSHOT.jar\n```\n\nWith the command above the JAR gets to run with GraalVM but adds [dynamic lookups](https://www.graalvm.org/reference-manual/native-image/Configuration/#assisted-configuration-of-native-image-builds) that are being intercepted during runtime and written to the files: `jni-config.json`, `proxy-config.json`, `reflect-config.json` and `resource-config.json`.\n\nThose generated files can be included in the GraalVMNativeImageOptions:\n\n```java scala\n// build.sbt\ngraalVMNativeImageOptions ++= Seq(\n\t\"--allow-incomplete-classpath\",\n\t\"-H:ResourceConfigurationFiles=../../configs/resource-config.json\",\n\t\"-H:ReflectionConfigurationFiles=../../configs/reflect-config.json\",\n\t\"-H:JNIConfigurationFiles=../../configs/jni-config.json\",\n\t\"-H:DynamicProxyConfigurationFiles=../../configs/proxy-config.json\"\n)\n```\n\nThe build with those updated options should succeed and the app can be run once again: \n\n```bash\ntarget/graalvm-native-image/apply-at-vdb\n\nSLF4J: Failed to load class \"org.slf4j.impl.StaticLoggerBinder\".\nSLF4J: Defaulting to no-operation (NOP) logger implementation\nSLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.\n```\n\nStill no logging, sadly. But the server is actually running and responds to POST requests via its exposed endpoint:\n\n```json\nPOST localhost:8080/api/v1/apply\n\n{\n\t\"email\": \"my@email.de\",\n\t\"name\": \"My Name\",\n\t\"phoneNumber\": \"+310123456789\",\n\t\"applicationBase64\": \"VGhpcyBjb3VsZCBiZSB5b3VyIGFwcGxpY2F0aW9uIQ==\"\n}\n\nResponse:\n\"*confetti* Thanks for handing in your application, we will get back to you within the next days! *confetti*\"\n```\n\nThe next and last step will investigate why logging is not picked up by GraalVM.\n\n### Investigating the missing logging\n\nSo first I wanted to have a look if it was an overall issue with logging. I stepped back from using logging-framework and tried the most basic logging with the java-integrated `java.util.Logging`. GraalVM's [docs](https://www.graalvm.org/docs/Native-Image/user/LOGGING) stated that GraalVM supports any logging that depends on that.\n\nBuilding and running the native-image with `java.util.Logging` instead of `logback` succeeded and everything is logged properly.\n\nSo it must be something with the dependencies?\n\nFor further investigation, I added the [sbt-dependency-graph](https://github.com/jrudolph/sbt-dependency-graph) plugin and checked out the dependency-tree with `sbt dependencyBrowserTree`. The library `logback` wasn't included in the dependency tree.\nWhich is odd, since `logback` is clearly present in the project's library-dependencies.\n\n```java scala\n// inside build.sbt\nlibraryDependencies ++= Seq(\n\t...\n\t\"ch.qos.logback\" % \"logback-classic\" % \"1.2.3\" % Runtime,\n\t\"ch.qos.logback\" % \"logback-core\" % \"1.2.3\" % Runtime,\n\t...\n)\n```\n\nHaving a closer look, the appendix `% Runtime` on logback's dependency is present.\n\nNot sure where this was coming from but it is most probably blindly copy-pasted from somewhere when gathering the dependencies for this project.\n\n[sbt reference manual](https://www.scala-sbt.org/1.x/docs/Scopes.html#Scoping+by+the+configuration+axis) states that the appendix `Runtime` defines that this dependency will be only included in the runtime classpath.\n\nSo this explains probably why logging was only working when the server was run from inside sbt.\n\nWith removing this and building the native-image, `logback` appears in the dependency-tree, and logging works when the native image is executed!\n\nThis \"bug\" was interesting as it emphasized what GraalVM can NOT do for you. Dynamic class loading/linking can not be supported by GraalVM as classes and dependencies have to be present during compile time to make a fully functional application. \n\n### Roundup\n\nA successful setup of sbt and GraalVM to build native-images requires to:\n\n- install GraalVM's native-image functionality via it's graal-updater: \n ```bash\n gu install native-image\n ```\n- add sbt-native-packager and sbt-assembly to sbt:\n ```java scala sbt\n // inside project/plugins.sbt\n addSbtPlugin(\"com.typesafe.sbt\" % \"sbt-native-packager\" % \"1.7.3\")\n addSbtPlugin(\"com.eed3si9n\" % \"sbt-assembly\" % \"0.14.6\")\n ```\n- enable the GraalVM-Plugin:\n ```java scala sbt\n // inside build.sbt\n enablePlugins(GraalVMNativeImagePlugin)\n ```\n- create a fat JAR and define which resource and configuration files should be intergated by intercepting look up calls during its execution:\n ```bash\n sbt assembly\n mkdir configs\n $GRAALHOME/bin/java -agentlib:native-image-agent=config-output-dir=./configs -jar target/scala-2.12/apply-at-vdb-assembly-0.1.0-SNAPSHOT.jar\n ```\n- fine-tune GraalVM with the following options and include the files that have been created in the previous step:\n ```java scala\n // build.sbt\n graalVMNativeImageOptions ++= Seq(\n \"--allow-incomplete-classpath\",\n \"-H:ResourceConfigurationFiles=../../configs/resource-config.json\",\n \"-H:ReflectionConfigurationFiles=../../configs/reflect-config.json\",\n \"-H:JNIConfigurationFiles=../../configs/jni-config.json\",\n \"-H:DynamicProxyConfigurationFiles=../../configs/proxy-config.json\"\n )\n ```\n- build the native image with:\n ```bash\n sbt graalvm-native-image:packageBin\n ```\n- run the executable file without the need of java\n ```\n ./target/graalvm-native-image/apply-at-vdb\n ```\n\nEven without benchmarking, you notice that the startup time is way faster than with a traditional JAR-file and the application is up and running almost instantly.\n\nIt is worth noting that the creation of a native image is a quite time-consuming process. For this project, it took between 1 and 2 minutes. This is, of course, something a CI/CD-Server like Jenkins would take care of but it has to be kept in mind. \n\nWith a working native-image, it is time to dockerize.\n\n## Building Docker images\n\nIn this section two Docker containers will be built. One, following the \"normal\"-java way and the other will be using the native-image to build a Docker-container without Java.\n\nBefore getting started with native images, a regular JAR-file and Docker image for comparison can be built.\n\nWith the [sbt-assembly](https://github.com/sbt/sbt-assembly) plugin you can create JAR-files with all of its dependencies (fat JARs).\n`sbt assembly` creates this `target/scala-2.12/apply-at-vdb-assembly-0.1.0-SNAPSHOT.jar` which has a size of around 42MB:\n\n```shell\n sbt assembly \n ls -lh target/scala-2.12/apply-at-vdb-assembly-0.1.0-SNAPSHOT.jar\n\n ... ... 42M target/scala-2.12/apply-at-vdb-assembly-0.1.0-SNAPSHOT.jar\n```\n\nThis application can be run locally via `java -jar target/scala-2.12/apply-at-vdb-assembly-0.1.0-SNAPSHOT.jar` with the prerequisite that Java is installed on that machine.\n\nCreating the Docker image for this JAR-file can be done manually, but luckily `sbt-native-package` supports building regular Docker images out of the box, only the `DockerPlugin` needs to be enabled:\n\n```java scala\n// build.sbt\nenablePlugins(DockerPlugin)\n```\n\n`sbt docker:publishLocal` creates the Docker image `apply-at-vdb`.\n \n```shell\ndocker images | grep apply-at-vdb\n apply-at-vdb \t0.1.0-SNAPSHOT \t\tf488d4c06f28 \t555MB\n```\n\nA whopping 555MB for a tiny app exposing one endpoint which JAR-file was only 42MB. But to run this JAR-file in a container, this container needs to ship with a JVM, and that's where the overhead lies.\n\nWith that Docker image and JAR-file as a reference, we can now look into how the native-image operates together with Docker.\n\nGraalVM does not support cross-building, meaning an application cannot be expected to be built in a MacOS environment and run in a Linux environment. It has to be built and run on the same platform. With the help of Docker, the desired built environment can be provided.\nThe `Dockerfile` looks as follows:\n```docker\nFROM oracle/graalvm-ce AS builder\nWORKDIR /app/vdb\nRUN gu install native-image\nRUN curl https://bintray.com/sbt/rpm/rpm > bintray-sbt-rpm.repo \\\n\t&& mv bintray-sbt-rpm.repo /etc/yum.repos.d/ \\\n\t&& yum install -y sbt\nCOPY . /app/vdb\nWORKDIR /app/vdb\nRUN sbt \"graalvm-native-image:packageBin\"\n\nFROM oraclelinux:7-slim\nCOPY --from=builder /app/vdb/target/graalvm-native-image/apply-at-vdb ./app/\nCMD ./app/apply-at-vdb\n\n```\n\nAnd can be run with:\n```bash\ndocker build -t native-apply-at-vdb .\n```\nThe Dockerfile describes to do the following:\nThe first docker container, as the name implies, is the builder. As a base image the official [GraalVM image](https://hub.docker.com/r/oracle/graalvm-ce) is used. \n\nThis image needs two more things, GraalVM's native-image command, and sbt, and this is what the two follow-up rows are providing. Once that's done, the project is copied into this container and the native image is built from within sbt.\n\nThe next steps bring the native executable into its own docker container.\nAs a base image, we use an Oracle Linux image and from our builder-container, we copy the native executable to this new container. The last step is that the app gets run on container startup.\n\n`docker run -p 8080:8080 -it native-apply-at-vdb` starts the container and shows that everything is working just as before.\n\nBut what about the image size? Let's have a look.\n```\ndocker images | grep apply-at-vdb\n native-apply-at-vdb\t\tlatest 17b559e78645\t\t199MB\n apply-at-vdb\t\t\t0.1.0-SNAPSHOT f488d4c06f28\t\t555MB\n```\nThat is impressive! We created an app that is approx. 2.8 times smaller than our original app.\n\n## Summary\n\nWe learned how to set up a Scala project with GraalVM, what steps have to be taken to build a native image with GraalVM, and let it run inside a Docker container. We also received a good overview of what's possible with GraalVM and what's not.\n\nThe initial start and setup of GraalVM with sbt is pretty easy and straightforward. Getting GraalVM to compile an sbt project is nice and simple. \n\nThis Hackathon showed us that it is difficult and requires a lot of fine-tuning to integrate GraalVM into an existing project or product. At Vandebron we work with a complex stack of technologies including Spark, Kafka, and Akka which made it difficult to port the findings from this small toy service to one of our existing microservices. This made extensive troubleshooting in the Hackathon not possible.\n\nAll in all, GraalVM allows you to give up some Java overhead and create significant smaller Docker images. Sadly, this comes at the cost of giving up dynamic linking and class loading. \nA silver lining is, that inside Scala's ecosystem this rarely a problem. Scala relies heavily on compile-time mechanisms for detecting bugs early and creating type-safe applications (read [here](https://blog.softwaremill.com/small-fast-docker-images-using-graalvms-native-image-99c0bc92e70b) but also see e.g. [Scala's compiler phases](https://typelevel.org/scala/docs/phases.html)).\n\n* * *\n\n## Sources and Reading\n- [Building Serverless Scala Services with GraalVM](https://www.inner-product.com/posts/serverless-scala-services-with-graalvm/) by Noel Welsh\n- [Small & fast Docker images using GraalVM’s native-image](https://blog.softwaremill.com/small-fast-docker-images-using-graalvms-native-image-99c0bc92e70b) by Adam Warski\n- [Run Scala applications with GraalVM and Docker](https://medium.com/rahasak/run-scala-applications-with-graalvm-and-docker-a1e67701e935) by @itseranga\n- [Getting Started with GraalVM and Scala](https://medium.com/graalvm/getting-started-with-graalvm-for-scala-d0a006dec1d1) by Oleg Šelajev\n- [Updates on Class Initialization in GraalVM Native Image Generation](https://medium.com/graalvm/updates-on-class-initialization-in-graalvm-native-image-generation-c61faca461f7) by \nChristian Wimmer\n- [GraalVM's Reference Manuals](https://www.graalvm.org/reference-manual/)\n","meta":{"title":"Building native images and compiling with GraalVM and sbt","description":"At Vandebron we organized a two-day long Hackathon, a colleague and I took the chance to dig into the wonderful world of GraalVM.","createdAt":"Tue Oct 06 2020 02:00:00 GMT+0200 (GMT+02:00)","coverImage":"images/building-native-images-and-compiling-with-graalvm-and-sbt.jpg","imageSource":"https://pixabay.com/users/lumix2004-3890388/","tags":"graalvm, scala","author":"Katrin Grunert","slug":"blog/building-native-images-and-compiling-with-graalvm-and-sbt","formattedDate":"6 oktober 2020","date":"Tue Oct 06 2020 02:00:00 GMT+0200 (GMT+02:00)"}},{"content":"\nTwo months ago, I started my journey at Vandebron. One of the projects I first dove into was their efforts to build a [component library](https://windmolen.netlify.app/). Something I was already familiar with from previous companies I worked at. \n\nOn the internet, you can find many articles that describe why a reusable component library is a good investment for your development team(s). Although there's much to say about the advantages of component libraries, most articles don't state the (obvious) disadvantages such projects can have. In this post, I'll point out some of our learnings and why you might not need such a reusable component library.\n\n## About component libraries\n\nOften you find yourself repeating the same lines of code to make, for example, a button or the layout of a page look nice, especially when you're working on multiple projects. Or as a designer, you get frustrated every time the styling for a part of the application is off when a new page or project is created. Many companies have already found multiple solutions to preventing themselves from repeating styling, which is the main reason for design inconsistencies. And therefore component libraries were created.\n\nA component library is a collection of all the styled parts (or components) of a website or multiple websites that make it easier for developers to reuse these parts. Also, designers will know for sure that all components in the component library adhere to their designs, and therefore all projects that use these components will conform. Often these libraries consist of different layers of components, for example, offering atoms, molecules, and organisms when an [Atomic Design](https://bradfrost.com/blog/post/atomic-web-design/) pattern is applied. Following this pattern, developers can use the parts to style their templates and pages consistently.\n\nComponent libraries are becoming more and more popular with the rise of JavaScript libraries and frameworks like React and Vue. These technologies are very suitable for quickly building interactive components that you can use in your application, and can easily be exposed as a library on NPM or Github Packages. At Vandebron, we're building all our web and mobile applications with React and React Native and are using [Storybook](https://storybook.js.org/) to develop our components in a shared library between the engineering and design teams. This can potentially create a lot of advantages for both the developers and designers, as you can read below.\n\n## Why you *might* need a component library\n\nBefore deciding to create a component library for your team or company, you probably want to hear about the advantages such a project can lead to. The main advantages of component libraries are briefly mentioned in the first section above and are often defined as:\n\n- **Reducing code duplication**: With a component library, you can create components that can be shared across multiple websites or applications. This way you no longer have to duplicate styling in different projects. This can seriously decrease the amount of code duplication that you have in your projects, also reducing the number of bugs or design inconsistencies.\n\n- **Preventing design inconsistencies**: By adding all your components and styled parts to the component library you're certain that these will look the same on all the places they're used. Not only will all the components look the same on every page, when designers make a change to one of these components they can be easily updated on all the places they're used.\n\n- **Easier collaborating**: Component libraries make it easier for developers and designers to collaborate on applications and designs, with the component library as the common \"playground\". By using a tool, like Storybook, you can also make this playground visible to non-technical people and show what components are already available to use for new features.\n\nBut these advantages come at a certain price, as I'll explain in the next section.\n\n## Disadvantages of component libraries\n\nBesides the obvious advantages of a component library, it can also have serious disadvantages that are listed below. Whether or not these disadvantages apply to you depends on numerous things that are discussed later on in this article.\n\n- **Increasing complexity**: With all attempts to make code more generic, an increased level of complexity also comes to play. Reusable components should be easy to extend or customize, which requires you to think about the different use cases beforehand or force you to add many different variations to a component. With every new project that starts to use the component library, you get the risk of increasing the complexity of the library even more.\n\n- **Time-consuming**: Every time you want to add a component to your project, you need to create that component in the component library first and import it locally in the project to test it. Therefore you need to be working in multiple projects at the same time, which requires you to set up a more time-consuming workflow. Also, when you want to use this new component from the library, you have to publish a new version of the library to make the component available.\n\n- **Conflicting dependencies**: When you're using different versions of dependencies across your projects and the component library, you're forced to sync those with each other. Imagine having, for example, an older version of React running in one of your projects that doesn't use a recent React API that you want to use in your component library. In this scenario, you either have to update that project or are unable to keep your component library on par with the latest release of your dependency on React. Both solutions have pros and cons, and would rather be avoided.\n\nAs mentioned before, there are reasons why these disadvantages might apply to you that are the team size, the number of teams and projects at the company, development or release lifecycles, and how your source code is organized. It clearly doesn't make sense to invest in a component library if you have just a small amount of people work on just one project, or a sole team is working on all the different projects making it easier to manage code duplication or design inconsistencies.\n\n## Considerations before starting\n\nThere are two main alternatives that you need to take into consideration before building a reusable component library, which is (obviously) using or extending an existing component library or sourcing your code in a monorepo. \n\n- **Existing component libraries:** Using an existing component library is an efficient way to create consistently (web) pages and reduce the amount of complexity of your own project, while also taking advantage of best practices of large open-source projects. Popular examples of component libraries are [Ant Design For React](https://ant.design/docs/react/introduce) or [various implementations](https://material.io/develop) for Google's Material Design. These libraries allow you to move quickly without having all the overhead of creating complex components but limit you to the design guidelines of these component libraries.\n\n- **Monorepo:** If you don't want to take advantage of existing libraries or are very keen to apply your own styling to components across multiple applications without having to copy-paste the code, you can host the source code of applications in a monorepo. With the monorepo approach, you can create a shared folder that includes all the components used by your applications. This makes it possible to apply changes with a simple pull request and import these components from every project in that repository.\n\nBesides these two alternatives, you also need to have proper design guidelines set by your designer(s). When the design guidelines are flexible and fluctuating, you could be structuring components incorrectly with the risk of doing a lot of work that will be omitted once the project evolves.\n\n## To summarize\n\nComponent libraries are a great way to reduce the amount of code duplication in your applications, prevent design inconsistencies, and increase collaborations between developers, designers, and different teams. But this comes with increased complexity, slower development cycles, and possible code conflicts between projects. Therefore you should consider if using an existing component library or having a monorepo for your source code is a workable solution. At Vandebron we decided to build our own component library (called [windmolen](https://windmolen.netlify.app/)) and if you'd decide the same, then be sure that your design guidelines are properly structured and mature enough.\n","meta":{"title":"When (Not) To Build A Reusable Component Library","description":"You can find much information on why a reusable component library is a good investment, but most articles don't state the (obvious) disadvantages..","createdAt":"Mon Oct 05 2020 02:00:00 GMT+0200 (GMT+02:00)","coverImage":"images/when-not-to-build-a-reusable-component-library.jpg","imageSource":"https://pixabay.com/users/stevepb-282134/","tags":"React, component library","author":"Roy Derks","slug":"blog/when-not-to-build-a-reusable-component-library","formattedDate":"5 oktober 2020","date":"Mon Oct 05 2020 02:00:00 GMT+0200 (GMT+02:00)"}}]},"__N_SSG":true} \ No newline at end of file diff --git a/_next/static/-LimmhHsKbTxygRed_0wy/_buildManifest.js b/_next/static/-LimmhHsKbTxygRed_0wy/_buildManifest.js deleted file mode 100644 index 72773e69f..000000000 --- a/_next/static/-LimmhHsKbTxygRed_0wy/_buildManifest.js +++ /dev/null @@ -1 +0,0 @@ -self.__BUILD_MANIFEST = (function(a){return {__rewrites:{beforeFiles:[],afterFiles:[],fallback:[]},"/":["static\u002Fchunks\u002Fpages\u002Findex-fa81e77dbb0d11046a38.js"],"/_error":["static\u002Fchunks\u002Fpages\u002F_error-3471ef3eb12e3a96abde.js"],"/about":[a,"static\u002Fchunks\u002Fpages\u002Fabout-2cf6cb0673d6904a8e88.js"],"/blog/[slug]":[a,"static\u002Fchunks\u002Fpages\u002Fblog\u002F[slug]-6c2a00ee68a7834d14b7.js"],"/greentech-hackathon":["static\u002Fcss\u002F7335de542e4b4f02a25b.css","static\u002Fchunks\u002Fd637bb0c.ddce25b62cf34b951439.js",a,"static\u002Fchunks\u002Fpages\u002Fgreentech-hackathon-ef29b96ebf02f7e2a98f.js"],sortedPages:["\u002F","\u002F_app","\u002F_error","\u002Fabout","\u002Fblog\u002F[slug]","\u002Fgreentech-hackathon"]}}("static\u002Fchunks\u002F1c49f5f00355f650bee3d37484f094be037a30fa.115f45d16b3b96a50c2c.js"));self.__BUILD_MANIFEST_CB && self.__BUILD_MANIFEST_CB() \ No newline at end of file diff --git a/_next/static/1TFRr9A8q9Q2n4OK0NMDy/_buildManifest.js b/_next/static/1TFRr9A8q9Q2n4OK0NMDy/_buildManifest.js deleted file mode 100644 index 72773e69f..000000000 --- a/_next/static/1TFRr9A8q9Q2n4OK0NMDy/_buildManifest.js +++ /dev/null @@ -1 +0,0 @@ -self.__BUILD_MANIFEST = (function(a){return {__rewrites:{beforeFiles:[],afterFiles:[],fallback:[]},"/":["static\u002Fchunks\u002Fpages\u002Findex-fa81e77dbb0d11046a38.js"],"/_error":["static\u002Fchunks\u002Fpages\u002F_error-3471ef3eb12e3a96abde.js"],"/about":[a,"static\u002Fchunks\u002Fpages\u002Fabout-2cf6cb0673d6904a8e88.js"],"/blog/[slug]":[a,"static\u002Fchunks\u002Fpages\u002Fblog\u002F[slug]-6c2a00ee68a7834d14b7.js"],"/greentech-hackathon":["static\u002Fcss\u002F7335de542e4b4f02a25b.css","static\u002Fchunks\u002Fd637bb0c.ddce25b62cf34b951439.js",a,"static\u002Fchunks\u002Fpages\u002Fgreentech-hackathon-ef29b96ebf02f7e2a98f.js"],sortedPages:["\u002F","\u002F_app","\u002F_error","\u002Fabout","\u002Fblog\u002F[slug]","\u002Fgreentech-hackathon"]}}("static\u002Fchunks\u002F1c49f5f00355f650bee3d37484f094be037a30fa.115f45d16b3b96a50c2c.js"));self.__BUILD_MANIFEST_CB && self.__BUILD_MANIFEST_CB() \ No newline at end of file diff --git a/_next/static/1TFRr9A8q9Q2n4OK0NMDy/_ssgManifest.js b/_next/static/1TFRr9A8q9Q2n4OK0NMDy/_ssgManifest.js deleted file mode 100644 index 5ed81266f..000000000 --- a/_next/static/1TFRr9A8q9Q2n4OK0NMDy/_ssgManifest.js +++ /dev/null @@ -1 +0,0 @@ -self.__SSG_MANIFEST=new Set(["\u002F","\u002Fgreentech-hackathon","\u002Fblog\u002F[slug]"]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB() \ No newline at end of file diff --git a/_next/static/TIxnTDD1P5bh4DRPZnWlC/_buildManifest.js b/_next/static/TIxnTDD1P5bh4DRPZnWlC/_buildManifest.js deleted file mode 100644 index 72773e69f..000000000 --- a/_next/static/TIxnTDD1P5bh4DRPZnWlC/_buildManifest.js +++ /dev/null @@ -1 +0,0 @@ -self.__BUILD_MANIFEST = (function(a){return {__rewrites:{beforeFiles:[],afterFiles:[],fallback:[]},"/":["static\u002Fchunks\u002Fpages\u002Findex-fa81e77dbb0d11046a38.js"],"/_error":["static\u002Fchunks\u002Fpages\u002F_error-3471ef3eb12e3a96abde.js"],"/about":[a,"static\u002Fchunks\u002Fpages\u002Fabout-2cf6cb0673d6904a8e88.js"],"/blog/[slug]":[a,"static\u002Fchunks\u002Fpages\u002Fblog\u002F[slug]-6c2a00ee68a7834d14b7.js"],"/greentech-hackathon":["static\u002Fcss\u002F7335de542e4b4f02a25b.css","static\u002Fchunks\u002Fd637bb0c.ddce25b62cf34b951439.js",a,"static\u002Fchunks\u002Fpages\u002Fgreentech-hackathon-ef29b96ebf02f7e2a98f.js"],sortedPages:["\u002F","\u002F_app","\u002F_error","\u002Fabout","\u002Fblog\u002F[slug]","\u002Fgreentech-hackathon"]}}("static\u002Fchunks\u002F1c49f5f00355f650bee3d37484f094be037a30fa.115f45d16b3b96a50c2c.js"));self.__BUILD_MANIFEST_CB && self.__BUILD_MANIFEST_CB() \ No newline at end of file diff --git a/_next/static/TIxnTDD1P5bh4DRPZnWlC/_ssgManifest.js b/_next/static/TIxnTDD1P5bh4DRPZnWlC/_ssgManifest.js deleted file mode 100644 index 5ed81266f..000000000 --- a/_next/static/TIxnTDD1P5bh4DRPZnWlC/_ssgManifest.js +++ /dev/null @@ -1 +0,0 @@ -self.__SSG_MANIFEST=new Set(["\u002F","\u002Fgreentech-hackathon","\u002Fblog\u002F[slug]"]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB() \ No newline at end of file diff --git a/_next/static/YSiKTHwVCFAQiqJVqauz-/_buildManifest.js b/_next/static/YSiKTHwVCFAQiqJVqauz-/_buildManifest.js deleted file mode 100644 index 72773e69f..000000000 --- a/_next/static/YSiKTHwVCFAQiqJVqauz-/_buildManifest.js +++ /dev/null @@ -1 +0,0 @@ -self.__BUILD_MANIFEST = (function(a){return {__rewrites:{beforeFiles:[],afterFiles:[],fallback:[]},"/":["static\u002Fchunks\u002Fpages\u002Findex-fa81e77dbb0d11046a38.js"],"/_error":["static\u002Fchunks\u002Fpages\u002F_error-3471ef3eb12e3a96abde.js"],"/about":[a,"static\u002Fchunks\u002Fpages\u002Fabout-2cf6cb0673d6904a8e88.js"],"/blog/[slug]":[a,"static\u002Fchunks\u002Fpages\u002Fblog\u002F[slug]-6c2a00ee68a7834d14b7.js"],"/greentech-hackathon":["static\u002Fcss\u002F7335de542e4b4f02a25b.css","static\u002Fchunks\u002Fd637bb0c.ddce25b62cf34b951439.js",a,"static\u002Fchunks\u002Fpages\u002Fgreentech-hackathon-ef29b96ebf02f7e2a98f.js"],sortedPages:["\u002F","\u002F_app","\u002F_error","\u002Fabout","\u002Fblog\u002F[slug]","\u002Fgreentech-hackathon"]}}("static\u002Fchunks\u002F1c49f5f00355f650bee3d37484f094be037a30fa.115f45d16b3b96a50c2c.js"));self.__BUILD_MANIFEST_CB && self.__BUILD_MANIFEST_CB() \ No newline at end of file diff --git a/_next/static/YSiKTHwVCFAQiqJVqauz-/_ssgManifest.js b/_next/static/YSiKTHwVCFAQiqJVqauz-/_ssgManifest.js deleted file mode 100644 index 5ed81266f..000000000 --- a/_next/static/YSiKTHwVCFAQiqJVqauz-/_ssgManifest.js +++ /dev/null @@ -1 +0,0 @@ -self.__SSG_MANIFEST=new Set(["\u002F","\u002Fgreentech-hackathon","\u002Fblog\u002F[slug]"]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB() \ No newline at end of file diff --git a/_next/static/chunks/0.js b/_next/static/chunks/0.js deleted file mode 100644 index c813187ae..000000000 --- a/_next/static/chunks/0.js +++ /dev/null @@ -1,15 +0,0 @@ -(window["webpackJsonp_N_E"] = window["webpackJsonp_N_E"] || []).push([[0],{ - -/***/ "./node_modules/next/dist/client/dev/noop.js": -/*!***************************************************!*\ - !*** ./node_modules/next/dist/client/dev/noop.js ***! - \***************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("/* WEBPACK VAR INJECTION */(function(module) {\n\n;\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n var currentExports = module.__proto__.exports;\n var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports on update so we can compare the boundary\n // signatures.\n module.hot.dispose(function (data) {\n data.prevExports = currentExports;\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevExports !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevExports !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ \"./node_modules/next/dist/compiled/webpack/module.js\")(module)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvY2xpZW50L2Rldi9ub29wLmpzLmpzIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/next/dist/client/dev/noop.js\n"); - -/***/ }) - -}]); \ No newline at end of file diff --git a/_next/static/chunks/1c49f5f00355f650bee3d37484f094be037a30fa.115f45d16b3b96a50c2c.js b/_next/static/chunks/1c49f5f00355f650bee3d37484f094be037a30fa.115f45d16b3b96a50c2c.js deleted file mode 100644 index 68ef5616b..000000000 --- a/_next/static/chunks/1c49f5f00355f650bee3d37484f094be037a30fa.115f45d16b3b96a50c2c.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp_N_E=window.webpackJsonp_N_E||[]).push([[4],{"++Eq":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#1d262f",color:"#57718e"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#1d262f",color:"#57718e",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#004a9e"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#004a9e"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#004a9e"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#004a9e"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#004a9e"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#004a9e"},'code[class*="language-"]::selection':{textShadow:"none",background:"#004a9e"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#004a9e"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#4a5f78"},prolog:{color:"#4a5f78"},doctype:{color:"#4a5f78"},cdata:{color:"#4a5f78"},punctuation:{color:"#4a5f78"},namespace:{Opacity:".7"},tag:{color:"#0aa370"},operator:{color:"#0aa370"},number:{color:"#0aa370"},property:{color:"#57718e"},function:{color:"#57718e"},"tag-id":{color:"#ebf4ff"},selector:{color:"#ebf4ff"},"atrule-id":{color:"#ebf4ff"},"code.language-javascript":{color:"#7eb6f6"},"attr-name":{color:"#7eb6f6"},"code.language-css":{color:"#47ebb4"},"code.language-scss":{color:"#47ebb4"},boolean:{color:"#47ebb4"},string:{color:"#47ebb4"},entity:{color:"#47ebb4",cursor:"help"},url:{color:"#47ebb4"},".language-css .token.string":{color:"#47ebb4"},".language-scss .token.string":{color:"#47ebb4"},".style .token.string":{color:"#47ebb4"},"attr-value":{color:"#47ebb4"},keyword:{color:"#47ebb4"},control:{color:"#47ebb4"},directive:{color:"#47ebb4"},unit:{color:"#47ebb4"},statement:{color:"#47ebb4"},regex:{color:"#47ebb4"},atrule:{color:"#47ebb4"},placeholder:{color:"#47ebb4"},variable:{color:"#47ebb4"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #ebf4ff",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#7eb6f6"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid #34659d",OutlineOffset:".4em"},".line-numbers .line-numbers-rows":{borderRightColor:"#1f2932"},".line-numbers-rows > span:before":{color:"#2c3847"},".line-highlight":{background:"linear-gradient(to right, rgba(10, 163, 112, 0.2) 70%, rgba(10, 163, 112, 0))"}}},"+OJB":function(e,t,n){"use strict";t.cwd=function(){return"/"}},"+Pz5":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=n("NOby"),r=n("T0BQ"),i=l("text"),a=l("string"),s={resolveAll:c()};function l(e){return{tokenize:function(t){var n=this,o=this.parser.constructs[e],r=t.attempt(o,i,a);return i;function i(e){return l(e)?r(e):a(e)}function a(e){if(null!==e)return t.enter("data"),t.consume(e),s;t.consume(e)}function s(e){return l(e)?(t.exit("data"),r(e)):(t.consume(e),s)}function l(e){var t=o[e],r=-1;if(null===e)return!0;if(t)for(;++r0&&void 0!==arguments[0]?arguments[0]:{},t=e.ampFirst,n=void 0!==t&&t,o=e.hybrid,r=void 0!==o&&o,i=e.hasQuery,a=void 0!==i&&i;return n||r&&a}},"/BR8":function(e,t,n){"use strict";e.exports=function(e,t){var n=e.footnoteOrder,r=String(t.identifier);-1===n.indexOf(r)&&n.push(r);return e(t.position,"sup",{id:"fnref-"+r},[e(t,"a",{href:"#fn-"+r,className:["footnote-ref"]},[o("text",t.label||r)])])};var o=n("vUGn")},"/Fgc":function(e,t,n){"use strict";e.exports=function(e,t){return e(t,"del",o(e,t))};var o=n("WFsM")},"/apb":function(e,t,n){"use strict";var o=n("E/Jm"),r={name:"codeText",tokenize:function(e,t,n){var r,i,a=0;return function(t){return e.enter("codeText"),e.enter("codeTextSequence"),s(t)};function s(t){return 96===t?(e.consume(t),a++,s):(e.exit("codeTextSequence"),l(t))}function l(t){return null===t?n(t):96===t?(i=e.enter("codeTextSequence"),r=0,u(t)):32===t?(e.enter("space"),e.consume(t),e.exit("space"),l):o(t)?(e.enter("lineEnding"),e.consume(t),e.exit("lineEnding"),l):(e.enter("codeTextData"),c(t))}function c(t){return null===t||32===t||96===t||o(t)?(e.exit("codeTextData"),l(t)):(e.consume(t),c)}function u(n){return 96===n?(e.consume(n),r++,u):r===a?(e.exit("codeTextSequence"),e.exit("codeText"),t(n)):(i.type="codeTextData",c(n))}},resolve:function(e){var t,n,o=e.length-4,r=3;if(("lineEnding"===e[r][1].type||"space"===e[r][1].type)&&("lineEnding"===e[o][1].type||"space"===e[o][1].type))for(t=r;++t code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#6a51e6"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#6a51e6"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#6a51e6"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#6a51e6"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#6a51e6"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#6a51e6"},'code[class*="language-"]::selection':{textShadow:"none",background:"#6a51e6"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#6a51e6"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#6c6783"},prolog:{color:"#6c6783"},doctype:{color:"#6c6783"},cdata:{color:"#6c6783"},punctuation:{color:"#6c6783"},namespace:{Opacity:".7"},tag:{color:"#e09142"},operator:{color:"#e09142"},number:{color:"#e09142"},property:{color:"#9a86fd"},function:{color:"#9a86fd"},"tag-id":{color:"#eeebff"},selector:{color:"#eeebff"},"atrule-id":{color:"#eeebff"},"code.language-javascript":{color:"#c4b9fe"},"attr-name":{color:"#c4b9fe"},"code.language-css":{color:"#ffcc99"},"code.language-scss":{color:"#ffcc99"},boolean:{color:"#ffcc99"},string:{color:"#ffcc99"},entity:{color:"#ffcc99",cursor:"help"},url:{color:"#ffcc99"},".language-css .token.string":{color:"#ffcc99"},".language-scss .token.string":{color:"#ffcc99"},".style .token.string":{color:"#ffcc99"},"attr-value":{color:"#ffcc99"},keyword:{color:"#ffcc99"},control:{color:"#ffcc99"},directive:{color:"#ffcc99"},unit:{color:"#ffcc99"},statement:{color:"#ffcc99"},regex:{color:"#ffcc99"},atrule:{color:"#ffcc99"},placeholder:{color:"#ffcc99"},variable:{color:"#ffcc99"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #eeebff",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#c4b9fe"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid #8a75f5",OutlineOffset:".4em"},".line-numbers .line-numbers-rows":{borderRightColor:"#2c2937"},".line-numbers-rows > span:before":{color:"#3c3949"},".line-highlight":{background:"linear-gradient(to right, rgba(224, 145, 66, 0.2) 70%, rgba(224, 145, 66, 0))"}}},"0RbX":function(e,t,n){"use strict";var o=n("0h9/"),r=n("Yoeg"),i=n("L8sx"),a=n("+Pz5"),s=n("oJEb"),l=n("5pEW"),c=n("pe0m"),u=n("RrMp");e.exports=function(e){var t={defined:[],constructs:s([u].concat(c((e||{}).extensions))),content:n(o),document:n(r),flow:n(i),string:n(a.string),text:n(a.text)};return t;function n(e){return function(n){return l(t,e,n)}}}},"0So9":function(e,t,n){var o=n("hq1P"),r=n("Ny5O"),i=n("9SNS"),a=n("E/Jm"),s=n("BjXi"),l=n("uDje"),c={tokenize:function(e,t,n){return function(t){return e.consume(t),o};function o(t){return 87===t||t-32===87?(e.consume(t),r):n(t)}function r(t){return 87===t||t-32===87?(e.consume(t),i):n(t)}function i(t){return 46===t?(e.consume(t),s):n(t)}function s(e){return null===e||a(e)?n(e):t(e)}},partial:!0},u={tokenize:function(e,t,n){var o,r;return a;function a(t){return 38===t?e.check(f,u,c)(t):46===t||95===t?e.check(p,u,c)(t):i(t)||l(t)||45!==t&&s(t)?u(t):(e.consume(t),a)}function c(t){return 46===t?(r=o,o=void 0,e.consume(t),a):(95===t&&(o=!0),e.consume(t),a)}function u(e){return r||o?n(e):t(e)}},partial:!0},d={tokenize:function(e,t){var n=0;return o;function o(a){return 38===a?e.check(f,t,r)(a):(40===a&&n++,41===a?e.check(p,i,r)(a):A(a)?t(a):b(a)?e.check(p,t,r)(a):(e.consume(a),o))}function r(t){return e.consume(t),o}function i(e){return--n<0?t(e):r(e)}},partial:!0},p={tokenize:function(e,t,n){return function(t){return e.consume(t),o};function o(r){return b(r)?(e.consume(r),o):A(r)?t(r):n(r)}},partial:!0},f={tokenize:function(e,t,n){return function(t){return e.consume(t),r};function r(t){return o(t)?(e.consume(t),r):59===t?(e.consume(t),i):n(t)}function i(e){return A(e)?t(e):n(e)}},partial:!0},h={tokenize:function(e,t,n){var o=this;return function(t){if(87!==t&&t-32!==87||!y(o.previous)||C(o.events))return n(t);return e.enter("literalAutolink"),e.enter("literalAutolinkWww"),e.check(c,e.attempt(u,e.attempt(d,r),n),n)(t)};function r(n){return e.exit("literalAutolinkWww"),e.exit("literalAutolink"),t(n)}},previous:y},m={tokenize:function(e,t,n){var o=this;return function(t){if(72!==t&&t-32!==72||!_(o.previous)||C(o.events))return n(t);return e.enter("literalAutolink"),e.enter("literalAutolinkHttp"),e.consume(t),r};function r(t){return 84===t||t-32===84?(e.consume(t),a):n(t)}function a(t){return 84===t||t-32===84?(e.consume(t),c):n(t)}function c(t){return 80===t||t-32===80?(e.consume(t),p):n(t)}function p(t){return 83===t||t-32===83?(e.consume(t),f):f(t)}function f(t){return 58===t?(e.consume(t),h):n(t)}function h(t){return 47===t?(e.consume(t),m):n(t)}function m(t){return 47===t?(e.consume(t),g):n(t)}function g(t){return i(t)||l(t)||s(t)?n(t):e.attempt(u,e.attempt(d,T),n)(t)}function T(n){return e.exit("literalAutolinkHttp"),e.exit("literalAutolink"),t(n)}},previous:_},g={tokenize:function(e,t,n){var o,i=this;return function(t){if(!k(t)||!S(i.previous)||C(i.events))return n(t);return e.enter("literalAutolink"),e.enter("literalAutolinkEmail"),a(t)};function a(t){return k(t)?(e.consume(t),a):64===t?(e.consume(t),s):n(t)}function s(t){return 46===t?e.check(p,d,l)(t):45===t||95===t?e.check(p,n,c)(t):r(t)?(e.consume(t),s):d(t)}function l(t){return e.consume(t),o=!0,s}function c(t){return e.consume(t),u}function u(t){return 46===t?e.check(p,n,l)(t):s(t)}function d(r){return o?(e.exit("literalAutolinkEmail"),e.exit("literalAutolink"),t(r)):n(r)}},previous:S},T={};t.text=T;for(var E=48;E<123;)T[E]=g,58===++E?E=65:91===E&&(E=97);function b(e){return 33===e||34===e||39===e||41===e||42===e||44===e||46===e||58===e||59===e||60===e||63===e||95===e||126===e}function A(e){return null===e||e<0||32===e||60===e}function k(e){return 43===e||45===e||46===e||95===e||r(e)}function y(e){return null===e||e<0||32===e||40===e||42===e||95===e||126===e}function _(e){return null===e||!o(e)}function S(e){return 47!==e&&_(e)}function C(e){for(var t=e.length;t--;)if(("labelLink"===e[t][1].type||"labelImage"===e[t][1].type)&&!e[t][1]._balanced)return!0}T[43]=g,T[45]=g,T[46]=g,T[95]=g,T[72]=[g,m],T[104]=[g,m],T[87]=[g,h],T[119]=[g,h]},"0aKP":function(e,t,n){"use strict";var o=[].splice;e.exports=o},"0h9/":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=n("E/Jm"),r=n("yRGd"),i=function(e){var t,n=e.attempt(this.parser.constructs.contentInitial,(function(t){if(null===t)return void e.consume(t);return e.enter("lineEnding"),e.consume(t),e.exit("lineEnding"),r(e,n,"linePrefix")}),(function(t){return e.enter("paragraph"),i(t)}));return n;function i(n){var o=e.enter("chunkText",{contentType:"text",previous:t});return t&&(t.next=o),t=o,a(n)}function a(t){return null===t?(e.exit("chunkText"),e.exit("paragraph"),void e.consume(t)):o(t)?(e.consume(t),e.exit("chunkText"),i):(e.consume(t),a)}};t.tokenize=i},"0mGV":function(e,t,n){"use strict";var o=n("E/Jm"),r=n("2N74"),i=n("yRGd");e.exports=function(e,t){var n;return function a(s){if(o(s))return e.enter("lineEnding"),e.consume(s),e.exit("lineEnding"),n=!0,a;if(r(s))return i(e,a,n?"linePrefix":"lineSuffix")(s);return t(s)}}},"1CLp":function(e,t,n){"use strict";const o=n("UwWT"),r=o.TAG_NAMES,i=o.NAMESPACES;function a(e){switch(e.length){case 1:return e===r.P;case 2:return e===r.RB||e===r.RP||e===r.RT||e===r.DD||e===r.DT||e===r.LI;case 3:return e===r.RTC;case 6:return e===r.OPTION;case 8:return e===r.OPTGROUP}return!1}function s(e){switch(e.length){case 1:return e===r.P;case 2:return e===r.RB||e===r.RP||e===r.RT||e===r.DD||e===r.DT||e===r.LI||e===r.TD||e===r.TH||e===r.TR;case 3:return e===r.RTC;case 5:return e===r.TBODY||e===r.TFOOT||e===r.THEAD;case 6:return e===r.OPTION;case 7:return e===r.CAPTION;case 8:return e===r.OPTGROUP||e===r.COLGROUP}return!1}function l(e,t){switch(e.length){case 2:if(e===r.TD||e===r.TH)return t===i.HTML;if(e===r.MI||e===r.MO||e===r.MN||e===r.MS)return t===i.MATHML;break;case 4:if(e===r.HTML)return t===i.HTML;if(e===r.DESC)return t===i.SVG;break;case 5:if(e===r.TABLE)return t===i.HTML;if(e===r.MTEXT)return t===i.MATHML;if(e===r.TITLE)return t===i.SVG;break;case 6:return(e===r.APPLET||e===r.OBJECT)&&t===i.HTML;case 7:return(e===r.CAPTION||e===r.MARQUEE)&&t===i.HTML;case 8:return e===r.TEMPLATE&&t===i.HTML;case 13:return e===r.FOREIGN_OBJECT&&t===i.SVG;case 14:return e===r.ANNOTATION_XML&&t===i.MATHML}return!1}e.exports=class{constructor(e,t){this.stackTop=-1,this.items=[],this.current=e,this.currentTagName=null,this.currentTmplContent=null,this.tmplCount=0,this.treeAdapter=t}_indexOf(e){let t=-1;for(let n=this.stackTop;n>=0;n--)if(this.items[n]===e){t=n;break}return t}_isInTemplate(){return this.currentTagName===r.TEMPLATE&&this.treeAdapter.getNamespaceURI(this.current)===i.HTML}_updateCurrentElement(){this.current=this.items[this.stackTop],this.currentTagName=this.current&&this.treeAdapter.getTagName(this.current),this.currentTmplContent=this._isInTemplate()?this.treeAdapter.getTemplateContent(this.current):null}push(e){this.items[++this.stackTop]=e,this._updateCurrentElement(),this._isInTemplate()&&this.tmplCount++}pop(){this.stackTop--,this.tmplCount>0&&this._isInTemplate()&&this.tmplCount--,this._updateCurrentElement()}replace(e,t){const n=this._indexOf(e);this.items[n]=t,n===this.stackTop&&this._updateCurrentElement()}insertAfter(e,t){const n=this._indexOf(e)+1;this.items.splice(n,0,t),n===++this.stackTop&&this._updateCurrentElement()}popUntilTagNamePopped(e){for(;this.stackTop>-1;){const t=this.currentTagName,n=this.treeAdapter.getNamespaceURI(this.current);if(this.pop(),t===e&&n===i.HTML)break}}popUntilElementPopped(e){for(;this.stackTop>-1;){const t=this.current;if(this.pop(),t===e)break}}popUntilNumberedHeaderPopped(){for(;this.stackTop>-1;){const e=this.currentTagName,t=this.treeAdapter.getNamespaceURI(this.current);if(this.pop(),e===r.H1||e===r.H2||e===r.H3||e===r.H4||e===r.H5||e===r.H6&&t===i.HTML)break}}popUntilTableCellPopped(){for(;this.stackTop>-1;){const e=this.currentTagName,t=this.treeAdapter.getNamespaceURI(this.current);if(this.pop(),e===r.TD||e===r.TH&&t===i.HTML)break}}popAllUpToHtmlElement(){this.stackTop=0,this._updateCurrentElement()}clearBackToTableContext(){for(;this.currentTagName!==r.TABLE&&this.currentTagName!==r.TEMPLATE&&this.currentTagName!==r.HTML||this.treeAdapter.getNamespaceURI(this.current)!==i.HTML;)this.pop()}clearBackToTableBodyContext(){for(;this.currentTagName!==r.TBODY&&this.currentTagName!==r.TFOOT&&this.currentTagName!==r.THEAD&&this.currentTagName!==r.TEMPLATE&&this.currentTagName!==r.HTML||this.treeAdapter.getNamespaceURI(this.current)!==i.HTML;)this.pop()}clearBackToTableRowContext(){for(;this.currentTagName!==r.TR&&this.currentTagName!==r.TEMPLATE&&this.currentTagName!==r.HTML||this.treeAdapter.getNamespaceURI(this.current)!==i.HTML;)this.pop()}remove(e){for(let t=this.stackTop;t>=0;t--)if(this.items[t]===e){this.items.splice(t,1),this.stackTop--,this._updateCurrentElement();break}}tryPeekProperlyNestedBodyElement(){const e=this.items[1];return e&&this.treeAdapter.getTagName(e)===r.BODY?e:null}contains(e){return this._indexOf(e)>-1}getCommonAncestor(e){let t=this._indexOf(e);return--t>=0?this.items[t]:null}isRootHtmlElementCurrent(){return 0===this.stackTop&&this.currentTagName===r.HTML}hasInScope(e){for(let t=this.stackTop;t>=0;t--){const n=this.treeAdapter.getTagName(this.items[t]),o=this.treeAdapter.getNamespaceURI(this.items[t]);if(n===e&&o===i.HTML)return!0;if(l(n,o))return!1}return!0}hasNumberedHeaderInScope(){for(let e=this.stackTop;e>=0;e--){const t=this.treeAdapter.getTagName(this.items[e]),n=this.treeAdapter.getNamespaceURI(this.items[e]);if((t===r.H1||t===r.H2||t===r.H3||t===r.H4||t===r.H5||t===r.H6)&&n===i.HTML)return!0;if(l(t,n))return!1}return!0}hasInListItemScope(e){for(let t=this.stackTop;t>=0;t--){const n=this.treeAdapter.getTagName(this.items[t]),o=this.treeAdapter.getNamespaceURI(this.items[t]);if(n===e&&o===i.HTML)return!0;if((n===r.UL||n===r.OL)&&o===i.HTML||l(n,o))return!1}return!0}hasInButtonScope(e){for(let t=this.stackTop;t>=0;t--){const n=this.treeAdapter.getTagName(this.items[t]),o=this.treeAdapter.getNamespaceURI(this.items[t]);if(n===e&&o===i.HTML)return!0;if(n===r.BUTTON&&o===i.HTML||l(n,o))return!1}return!0}hasInTableScope(e){for(let t=this.stackTop;t>=0;t--){const n=this.treeAdapter.getTagName(this.items[t]);if(this.treeAdapter.getNamespaceURI(this.items[t])===i.HTML){if(n===e)return!0;if(n===r.TABLE||n===r.TEMPLATE||n===r.HTML)return!1}}return!0}hasTableBodyContextInTableScope(){for(let e=this.stackTop;e>=0;e--){const t=this.treeAdapter.getTagName(this.items[e]);if(this.treeAdapter.getNamespaceURI(this.items[e])===i.HTML){if(t===r.TBODY||t===r.THEAD||t===r.TFOOT)return!0;if(t===r.TABLE||t===r.HTML)return!1}}return!0}hasInSelectScope(e){for(let t=this.stackTop;t>=0;t--){const n=this.treeAdapter.getTagName(this.items[t]);if(this.treeAdapter.getNamespaceURI(this.items[t])===i.HTML){if(n===e)return!0;if(n!==r.OPTION&&n!==r.OPTGROUP)return!1}}return!0}generateImpliedEndTags(){for(;a(this.currentTagName);)this.pop()}generateImpliedEndTagsThoroughly(){for(;s(this.currentTagName);)this.pop()}generateImpliedEndTagsWithExclusion(e){for(;a(this.currentTagName)&&this.currentTagName!==e;)this.pop()}}},"1VtT":function(e,t,n){"use strict";var o=n("Gdbo"),r=n("k1+7"),i=n("6dBs"),a=n("bwJB"),s=n("xkQk"),l=n("Esvb");e.exports=function e(){var t,n=[],r=s(),E={},b=-1;return A.data=function(e,n){if("string"===typeof e)return 2===arguments.length?(m("data",t),E[e]=n,A):u.call(E,e)&&E[e]||null;if(e)return m("data",t),E=e,A;return E},A.freeze=k,A.attachers=n,A.use=function(e){var o;if(m("use",t),null===e||void 0===e);else if("function"===typeof e)u.apply(null,arguments);else{if("object"!==typeof e)throw new Error("Expected usable value, not `"+e+"`");"length"in e?l(e):r(e)}o&&(E.settings=i(E.settings||{},o));return A;function r(e){l(e.plugins),e.settings&&(o=i(o||{},e.settings))}function s(e){if("function"===typeof e)u(e);else{if("object"!==typeof e)throw new Error("Expected usable value, not `"+e+"`");"length"in e?u.apply(null,e):r(e)}}function l(e){var t=-1;if(null===e||void 0===e);else{if("object"!==typeof e||!("length"in e))throw new Error("Expected a list of plugins, not `"+e+"`");for(;++t-1&&(n[0]=n[0].slice(r)),a>0&&n.push(e[i].slice(0,a))),n}},"2N74":function(e,t,n){"use strict";e.exports=function(e){return-2===e||-1===e||32===e}},"2l2D":function(e,t,n){"use strict";e.exports={controlCharacterInInputStream:"control-character-in-input-stream",noncharacterInInputStream:"noncharacter-in-input-stream",surrogateInInputStream:"surrogate-in-input-stream",nonVoidHtmlElementStartTagWithTrailingSolidus:"non-void-html-element-start-tag-with-trailing-solidus",endTagWithAttributes:"end-tag-with-attributes",endTagWithTrailingSolidus:"end-tag-with-trailing-solidus",unexpectedSolidusInTag:"unexpected-solidus-in-tag",unexpectedNullCharacter:"unexpected-null-character",unexpectedQuestionMarkInsteadOfTagName:"unexpected-question-mark-instead-of-tag-name",invalidFirstCharacterOfTagName:"invalid-first-character-of-tag-name",unexpectedEqualsSignBeforeAttributeName:"unexpected-equals-sign-before-attribute-name",missingEndTagName:"missing-end-tag-name",unexpectedCharacterInAttributeName:"unexpected-character-in-attribute-name",unknownNamedCharacterReference:"unknown-named-character-reference",missingSemicolonAfterCharacterReference:"missing-semicolon-after-character-reference",unexpectedCharacterAfterDoctypeSystemIdentifier:"unexpected-character-after-doctype-system-identifier",unexpectedCharacterInUnquotedAttributeValue:"unexpected-character-in-unquoted-attribute-value",eofBeforeTagName:"eof-before-tag-name",eofInTag:"eof-in-tag",missingAttributeValue:"missing-attribute-value",missingWhitespaceBetweenAttributes:"missing-whitespace-between-attributes",missingWhitespaceAfterDoctypePublicKeyword:"missing-whitespace-after-doctype-public-keyword",missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers:"missing-whitespace-between-doctype-public-and-system-identifiers",missingWhitespaceAfterDoctypeSystemKeyword:"missing-whitespace-after-doctype-system-keyword",missingQuoteBeforeDoctypePublicIdentifier:"missing-quote-before-doctype-public-identifier",missingQuoteBeforeDoctypeSystemIdentifier:"missing-quote-before-doctype-system-identifier",missingDoctypePublicIdentifier:"missing-doctype-public-identifier",missingDoctypeSystemIdentifier:"missing-doctype-system-identifier",abruptDoctypePublicIdentifier:"abrupt-doctype-public-identifier",abruptDoctypeSystemIdentifier:"abrupt-doctype-system-identifier",cdataInHtmlContent:"cdata-in-html-content",incorrectlyOpenedComment:"incorrectly-opened-comment",eofInScriptHtmlCommentLikeText:"eof-in-script-html-comment-like-text",eofInDoctype:"eof-in-doctype",nestedComment:"nested-comment",abruptClosingOfEmptyComment:"abrupt-closing-of-empty-comment",eofInComment:"eof-in-comment",incorrectlyClosedComment:"incorrectly-closed-comment",eofInCdata:"eof-in-cdata",absenceOfDigitsInNumericCharacterReference:"absence-of-digits-in-numeric-character-reference",nullCharacterReference:"null-character-reference",surrogateCharacterReference:"surrogate-character-reference",characterReferenceOutsideUnicodeRange:"character-reference-outside-unicode-range",controlCharacterReference:"control-character-reference",noncharacterCharacterReference:"noncharacter-character-reference",missingWhitespaceBeforeDoctypeName:"missing-whitespace-before-doctype-name",missingDoctypeName:"missing-doctype-name",invalidCharacterSequenceAfterDoctypeName:"invalid-character-sequence-after-doctype-name",duplicateAttribute:"duplicate-attribute",nonConformingDoctype:"non-conforming-doctype",missingDoctype:"missing-doctype",misplacedDoctype:"misplaced-doctype",endTagWithoutMatchingOpenElement:"end-tag-without-matching-open-element",closingOfElementWithOpenChildElements:"closing-of-element-with-open-child-elements",disallowedContentInNoscriptInHead:"disallowed-content-in-noscript-in-head",openElementsLeftAfterEof:"open-elements-left-after-eof",abandonedHeadElementChild:"abandoned-head-element-child",misplacedStartTagForHeadElement:"misplaced-start-tag-for-head-element",nestedNoscriptInHead:"nested-noscript-in-head",eofInElementThatCanContainOnlyText:"eof-in-element-that-can-contain-only-text"}},"2uWR":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",color:"#c3cee3",background:"#263238",fontFamily:"Roboto Mono, monospace",fontSize:"1em",lineHeight:"1.5em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",color:"#c3cee3",background:"#263238",fontFamily:"Roboto Mono, monospace",fontSize:"1em",lineHeight:"1.5em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",overflow:"auto",position:"relative",margin:"0.5em 0",padding:"1.25em 1em"},'code[class*="language-"]::-moz-selection':{background:"#363636"},'pre[class*="language-"]::-moz-selection':{background:"#363636"},'code[class*="language-"] ::-moz-selection':{background:"#363636"},'pre[class*="language-"] ::-moz-selection':{background:"#363636"},'code[class*="language-"]::selection':{background:"#363636"},'pre[class*="language-"]::selection':{background:"#363636"},'code[class*="language-"] ::selection':{background:"#363636"},'pre[class*="language-"] ::selection':{background:"#363636"},':not(pre) > code[class*="language-"]':{whiteSpace:"normal",borderRadius:"0.2em",padding:"0.1em"},".language-css > code":{color:"#fd9170"},".language-sass > code":{color:"#fd9170"},".language-scss > code":{color:"#fd9170"},'[class*="language-"] .namespace':{Opacity:"0.7"},atrule:{color:"#c792ea"},"attr-name":{color:"#ffcb6b"},"attr-value":{color:"#c3e88d"},attribute:{color:"#c3e88d"},boolean:{color:"#c792ea"},builtin:{color:"#ffcb6b"},cdata:{color:"#80cbc4"},char:{color:"#80cbc4"},class:{color:"#ffcb6b"},"class-name":{color:"#f2ff00"},color:{color:"#f2ff00"},comment:{color:"#546e7a"},constant:{color:"#c792ea"},deleted:{color:"#f07178"},doctype:{color:"#546e7a"},entity:{color:"#f07178"},function:{color:"#c792ea"},hexcode:{color:"#f2ff00"},id:{color:"#c792ea",fontWeight:"bold"},important:{color:"#c792ea",fontWeight:"bold"},inserted:{color:"#80cbc4"},keyword:{color:"#c792ea",fontStyle:"italic"},number:{color:"#fd9170"},operator:{color:"#89ddff"},prolog:{color:"#546e7a"},property:{color:"#80cbc4"},"pseudo-class":{color:"#c3e88d"},"pseudo-element":{color:"#c3e88d"},punctuation:{color:"#89ddff"},regex:{color:"#f2ff00"},selector:{color:"#f07178"},string:{color:"#c3e88d"},symbol:{color:"#c792ea"},tag:{color:"#f07178"},unit:{color:"#f07178"},url:{color:"#fd9170"},variable:{color:"#f07178"}}},"321L":function(e,t,n){e.exports=n("0So9")},"33Zt":function(e,t,n){"use strict";var o=n("E/Jm"),r=n("2N74"),i=n("yRGd"),a={name:"thematicBreak",tokenize:function(e,t,n){var a,s=0;return function(t){return e.enter("thematicBreak"),a=t,l(t)};function l(u){return u===a?(e.enter("thematicBreakSequence"),c(u)):r(u)?i(e,l,"whitespace")(u):s<3||null!==u&&!o(u)?n(u):(e.exit("thematicBreak"),t(u))}function c(t){return t===a?(e.consume(t),s++,c):(e.exit("thematicBreakSequence"),l(t))}}};e.exports=a},"38Ti":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{color:"#fff",textShadow:"0 1px 1px #000",fontFamily:'Menlo, Monaco, "Courier New", monospace',direction:"ltr",textAlign:"left",wordSpacing:"normal",whiteSpace:"pre",wordWrap:"normal",lineHeight:"1.4",background:"none",border:"0",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#fff",textShadow:"0 1px 1px #000",fontFamily:'Menlo, Monaco, "Courier New", monospace',direction:"ltr",textAlign:"left",wordSpacing:"normal",whiteSpace:"pre",wordWrap:"normal",lineHeight:"1.4",background:"#222",border:"0",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"15px",margin:"1em 0",overflow:"auto",MozBorderRadius:"8px",WebkitBorderRadius:"8px",borderRadius:"8px"},'pre[class*="language-"] code':{float:"left",padding:"0 15px 0 0"},':not(pre) > code[class*="language-"]':{background:"#222",padding:"5px 10px",lineHeight:"1",MozBorderRadius:"3px",WebkitBorderRadius:"3px",borderRadius:"3px"},comment:{color:"#797979"},prolog:{color:"#797979"},doctype:{color:"#797979"},cdata:{color:"#797979"},selector:{color:"#fff"},operator:{color:"#fff"},punctuation:{color:"#fff"},namespace:{Opacity:".7"},tag:{color:"#ffd893"},boolean:{color:"#ffd893"},atrule:{color:"#B0C975"},"attr-value":{color:"#B0C975"},hex:{color:"#B0C975"},string:{color:"#B0C975"},property:{color:"#c27628"},entity:{color:"#c27628",cursor:"help"},url:{color:"#c27628"},"attr-name":{color:"#c27628"},keyword:{color:"#c27628"},regex:{color:"#9B71C6"},function:{color:"#e5a638"},constant:{color:"#e5a638"},variable:{color:"#fdfba8"},number:{color:"#8799B0"},important:{color:"#E45734"},deliminator:{color:"#E45734"},"pre[data-line]":{position:"relative",padding:"1em 0 1em 3em"},".line-highlight":{position:"absolute",left:"0",right:"0",marginTop:"1em",background:"rgba(255, 255, 255, .2)",pointerEvents:"none",lineHeight:"inherit",whiteSpace:"pre"},".line-highlight:before":{content:"attr(data-start)",position:"absolute",top:".3em",left:".6em",minWidth:"1em",padding:"0 .5em",backgroundColor:"rgba(255, 255, 255, .3)",color:"#fff",font:"bold 65%/1.5 sans-serif",textAlign:"center",MozBorderRadius:"8px",WebkitBorderRadius:"8px",borderRadius:"8px",textShadow:"none"},".line-highlight[data-end]:after":{content:"attr(data-end)",position:"absolute",top:"auto",left:".6em",minWidth:"1em",padding:"0 .5em",backgroundColor:"rgba(255, 255, 255, .3)",color:"#fff",font:"bold 65%/1.5 sans-serif",textAlign:"center",MozBorderRadius:"8px",WebkitBorderRadius:"8px",borderRadius:"8px",textShadow:"none",bottom:".4em"},".line-numbers-rows":{margin:"0"},".line-numbers-rows span":{paddingRight:"10px",borderRight:"3px #d9d336 solid"}}},"3HEo":function(e,t,n){"use strict";var o=n("ZkSf");e.exports=function(e,t){return function(e){return t;function t(t){var n=t&&i(t);return n&&r.call(e,n)?e[n]:null}}(function(e){var t={};if(!e||!e.type)throw new Error("mdast-util-definitions expected node");return o(e,"definition",n),t;function n(e){var n=i(e.identifier);r.call(t,n)||(t[n]=e)}}(e))};var r={}.hasOwnProperty;function i(e){return e.toUpperCase()}},"3iNw":function(e,t,n){"use strict";var o=n("hq1P"),r=n("Ny5O"),i=n("E/Jm"),a=n("Q3zd"),s=n("2N74"),l=n("yRGd"),c={name:"htmlText",tokenize:function(e,t,n){var c,u,d,p,f=this;return function(t){return e.enter("htmlText"),e.enter("htmlTextData"),e.consume(t),h};function h(t){return 33===t?(e.consume(t),m):47===t?(e.consume(t),O):63===t?(e.consume(t),x):o(t)?(e.consume(t),w):n(t)}function m(t){return 45===t?(e.consume(t),g):91===t?(e.consume(t),u="CDATA[",d=0,k):o(t)?(e.consume(t),C):n(t)}function g(t){return 45===t?(e.consume(t),T):n(t)}function T(t){return null===t||62===t?n(t):45===t?(e.consume(t),E):b(t)}function E(e){return null===e||62===e?n(e):b(e)}function b(t){return null===t?n(t):45===t?(e.consume(t),A):i(t)?(p=b,B(t)):(e.consume(t),b)}function A(t){return 45===t?(e.consume(t),U):b(t)}function k(t){return t===u.charCodeAt(d++)?(e.consume(t),d===u.length?y:k):n(t)}function y(t){return null===t?n(t):93===t?(e.consume(t),_):i(t)?(p=y,B(t)):(e.consume(t),y)}function _(t){return 93===t?(e.consume(t),S):y(t)}function S(t){return 62===t?U(t):93===t?(e.consume(t),S):y(t)}function C(t){return null===t||62===t?U(t):i(t)?(p=C,B(t)):(e.consume(t),C)}function x(t){return null===t?n(t):63===t?(e.consume(t),v):i(t)?(p=x,B(t)):(e.consume(t),x)}function v(e){return 62===e?U(e):x(e)}function O(t){return o(t)?(e.consume(t),N):n(t)}function N(t){return 45===t||r(t)?(e.consume(t),N):M(t)}function M(t){return i(t)?(p=M,B(t)):s(t)?(e.consume(t),M):U(t)}function w(t){return 45===t||r(t)?(e.consume(t),w):47===t||62===t||a(t)?R(t):n(t)}function R(t){return 47===t?(e.consume(t),U):58===t||95===t||o(t)?(e.consume(t),I):i(t)?(p=R,B(t)):s(t)?(e.consume(t),R):U(t)}function I(t){return 45===t||46===t||58===t||95===t||r(t)?(e.consume(t),I):L(t)}function L(t){return 61===t?(e.consume(t),P):i(t)?(p=L,B(t)):s(t)?(e.consume(t),L):R(t)}function P(t){return null===t||60===t||61===t||62===t||96===t?n(t):34===t||39===t?(e.consume(t),c=t,H):i(t)?(p=P,B(t)):s(t)?(e.consume(t),P):(e.consume(t),c=void 0,F)}function H(t){return t===c?(e.consume(t),D):null===t?n(t):i(t)?(p=H,B(t)):(e.consume(t),H)}function D(e){return 62===e||47===e||a(e)?R(e):n(e)}function F(t){return null===t||34===t||39===t||60===t||61===t||96===t?n(t):62===t||a(t)?R(t):(e.consume(t),F)}function B(t){return e.exit("htmlTextData"),e.enter("lineEnding"),e.consume(t),e.exit("lineEnding"),l(e,z,"linePrefix",f.parser.constructs.disable.null.indexOf("codeIndented")>-1?void 0:4)}function z(t){return e.enter("htmlTextData"),p(t)}function U(o){return 62===o?(e.consume(o),e.exit("htmlTextData"),e.exit("htmlText"),t):n(o)}}};e.exports=c},"4+h/":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#faf8f5",color:"#728fcb"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#faf8f5",color:"#728fcb",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#faf8f5"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#faf8f5"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#faf8f5"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#faf8f5"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#faf8f5"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#faf8f5"},'code[class*="language-"]::selection':{textShadow:"none",background:"#faf8f5"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#faf8f5"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#b6ad9a"},prolog:{color:"#b6ad9a"},doctype:{color:"#b6ad9a"},cdata:{color:"#b6ad9a"},punctuation:{color:"#b6ad9a"},namespace:{Opacity:".7"},tag:{color:"#063289"},operator:{color:"#063289"},number:{color:"#063289"},property:{color:"#b29762"},function:{color:"#b29762"},"tag-id":{color:"#2d2006"},selector:{color:"#2d2006"},"atrule-id":{color:"#2d2006"},"code.language-javascript":{color:"#896724"},"attr-name":{color:"#896724"},"code.language-css":{color:"#728fcb"},"code.language-scss":{color:"#728fcb"},boolean:{color:"#728fcb"},string:{color:"#728fcb"},entity:{color:"#728fcb",cursor:"help"},url:{color:"#728fcb"},".language-css .token.string":{color:"#728fcb"},".language-scss .token.string":{color:"#728fcb"},".style .token.string":{color:"#728fcb"},"attr-value":{color:"#728fcb"},keyword:{color:"#728fcb"},control:{color:"#728fcb"},directive:{color:"#728fcb"},unit:{color:"#728fcb"},statement:{color:"#728fcb"},regex:{color:"#728fcb"},atrule:{color:"#728fcb"},placeholder:{color:"#93abdc"},variable:{color:"#93abdc"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #2d2006",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#896724"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid #896724",OutlineOffset:".4em"},".line-numbers .line-numbers-rows":{borderRightColor:"#ece8de"},".line-numbers-rows > span:before":{color:"#cdc4b1"},".line-highlight":{background:"linear-gradient(to right, rgba(45, 32, 6, 0.2) 70%, rgba(45, 32, 6, 0))"}}},"42yH":function(e,t,n){"use strict";var o=n("WtKE"),r=n("Ny5O"),i=n("ljYj"),a=n("QB/b");function s(e){return e&&"object"===typeof e&&"default"in e?e:{default:e}}var l=s(o),c={name:"characterReference",tokenize:function(e,t,n){var o,s,c=this,u=0;return function(t){return e.enter("characterReference"),e.enter("characterReferenceMarker"),e.consume(t),e.exit("characterReferenceMarker"),d};function d(t){return 35===t?(e.enter("characterReferenceMarkerNumeric"),e.consume(t),e.exit("characterReferenceMarkerNumeric"),p):(e.enter("characterReferenceValue"),o=31,s=r,f(t))}function p(t){return 88===t||120===t?(e.enter("characterReferenceMarkerHexadecimal"),e.consume(t),e.exit("characterReferenceMarkerHexadecimal"),e.enter("characterReferenceValue"),o=6,s=a,f):(e.enter("characterReferenceValue"),o=7,s=i,f(t))}function f(i){var a;return 59===i&&u?(a=e.exit("characterReferenceValue"),s!==r||l.default(c.sliceSerialize(a))?(e.enter("characterReferenceMarker"),e.consume(i),e.exit("characterReferenceMarker"),e.exit("characterReference"),t):n(i)):s(i)&&u++P&&(P=d);++up)&&(L[u]=f)),R.push(h);M[O]=R,w[O]=I}var H;if(u=-1,d=P,"object"===typeof S&&"length"in S)for(;++uL[u]&&(L[u]=f),I[u]=f),R[u]=h;M.splice(1,0,R),w.splice(1,0,I),O=-1,N=M.length,m=[];for(;++O=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var i=n("q1tI"),a=n.n(i),s=n("6x+I"),l=n.n(s),c=n("jaOS"),u=n("o0o1"),d=n.n(u),p=n("yXPU"),f=n.n(p),h=n("pVnL"),m=n.n(h),g=n("lwsE"),T=n.n(g),E=n("W8MJ"),b=n.n(E),A=n("a1gu"),k=n.n(A),y=n("Nsbk"),_=n.n(y),S=n("7W2i"),C=n.n(S),x=n("lSNA"),v=n.n(x),O=n("QILm"),N=n.n(O),M=n("MVZn"),w=n.n(M);function R(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0;return e.reduce((function(e,t){return w()({},e,n[t])}),t)}function I(e){return e.join(" ")}function L(e){var t=e.node,n=e.stylesheet,o=e.style,r=void 0===o?{}:o,i=e.useInlineStyles,s=e.key,l=t.properties,c=t.type,u=t.tagName,d=t.value;if("text"===c)return d;if(u){var p=function(e,t){var n=0;return function(o){return n+=1,o.map((function(o,r){return L({node:o,stylesheet:e,useInlineStyles:t,key:"code-segment-".concat(n,"-").concat(r)})}))}}(n,i),f=i&&l.className&&l.className.filter((function(e){return!n[e]})),h=f&&f.length?f:void 0,g=i?w()({},l,{className:h&&I(h)},{style:R(l.className,Object.assign({},l.style,r),n)}):w()({},l,{className:I(l.className)}),T=p(t.children);return a.a.createElement(u,m()({key:s},g),T)}}var P=/\n/g;function H(e){var t=e.codeString,n=e.codeStyle,o=e.containerStyle,r=void 0===o?{float:"left",paddingRight:"10px"}:o,i=e.numberStyle,s=void 0===i?{}:i,l=e.startingLineNumber;return a.a.createElement("code",{style:Object.assign({},n,r)},function(e){var t=e.lines,n=e.startingLineNumber,o=e.style;return t.map((function(e,t){var r=t+n;return a.a.createElement("span",{key:"line-".concat(t),className:"react-syntax-highlighter-line-number",style:"function"===typeof o?o(r):o},"".concat(r,"\n"))}))}({lines:t.replace(/\n$/,"").split("\n"),style:s,startingLineNumber:l}))}function D(e){var t=e.toString().length;return"".concat(t,"em")}function F(e,t){return{type:"element",tagName:"span",properties:{key:"line-number--".concat(e),className:["comment","linenumber","react-syntax-highlighter-line-number"],style:t},children:[{type:"text",value:e}]}}function B(e,t,n){var o={display:"inline-block",minWidth:D(n),paddingRight:"1em",textAlign:"right",userSelect:"none"},r="function"===typeof e?e(t):e;return w()({},o,r)}function z(e){var t=e.children,n=e.lineNumber,o=e.lineNumberStyle,r=e.largestLineNumber,i=e.showInlineLineNumbers,a=e.lineProps,s=void 0===a?{}:a,l=e.className,c=void 0===l?[]:l,u="function"===typeof s?s(n):s;if(u.className=c,n&&i){var d=B(o,n,r);t.unshift(F(n,d))}return{type:"element",tagName:"span",properties:u,children:t}}function U(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],o=0;o2&&void 0!==arguments[2]?arguments[2]:[];return z({children:e,lineNumber:t,lineNumberStyle:s,largestLineNumber:a,showInlineLineNumbers:r,lineProps:n,className:o})}function h(e,t){if(t&&r){var n=B(s,t,a);e.unshift(F(t,n))}return e}function m(e,n){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];return t||o.length>0?f(e,n,o):h(e,n)}for(var g=function(){var e=c[p],t=e.children[0].value;if(t.match(P)){var n=t.split("\n");n.forEach((function(t,r){var a=o&&u.length+i,s={type:"text",value:"".concat(t,"\n")};if(0===r){var l=m(c.slice(d+1,p).concat(z({children:[s],className:e.properties.className})),a);u.push(l)}else if(r===n.length-1){if(c[p+1]&&c[p+1].children&&c[p+1].children[0]){var f=z({children:[{type:"text",value:"".concat(t)}],className:e.properties.className});c.splice(p+1,0,f)}else{var h=m([s],a,e.properties.className);u.push(h)}}else{var g=m([s],a,e.properties.className);u.push(g)}})),d=p}p++};p-1?void 0:4)(r)}}},exit:function(e){e.exit(this.containerState.type)}},d={tokenize:function(e,t,n){var o=this;return s(e,(function(e){return r(e)||!i(o.events,"listItemPrefixWhitespace")?n(e):t(e)}),"listItemPrefixWhitespace",o.parser.constructs.disable.null.indexOf("codeIndented")>-1?void 0:5)},partial:!0},p={tokenize:function(e,t,n){var o=this;return s(e,(function(e){return i(o.events,"listItemIndent")===o.containerState.size?t(e):n(e)}),"listItemIndent",o.containerState.size+1)},partial:!0};e.exports=u},"5fIB":function(e,t,n){var o=n("7eYB");e.exports=function(e){if(Array.isArray(e))return o(e)}},"5pEW":function(e,t,n){"use strict";var o=n("NOby"),r=n("E/Jm"),i=n("HtLg"),a=n("Vx/6"),s=n("pe0m"),l=n("Ig3s"),c=n("FE4A"),u=n("T0BQ"),d=n("20u5");e.exports=function(e,t,n){var p=n?u(n):{line:1,column:1,offset:0},f={},h=[],m=[],g=[],T={consume:function(e){r(e)?(p.line++,p.column=1,p.offset+=-3===e?2:1,v()):-1!==e&&(p.column++,p.offset++);p._bufferIndex<0?p._index++:(p._bufferIndex++,p._bufferIndex===m[p._index].length&&(p._bufferIndex=-1,p._index++));E.previous=e},enter:function(e,t){var n=t||{};return n.type=e,n.start=k(),E.events.push(["enter",n,E]),g.push(n),n},exit:function(e){var t=g.pop();return t.end=k(),E.events.push(["exit",t,E]),t},attempt:C((function(e,t){x(e,t.from)})),check:C(S),interrupt:C(S,{interrupt:!0}),lazy:C(S,{lazy:!0})},E={previous:null,events:[],parser:e,sliceStream:A,sliceSerialize:function(e){return c(A(e))},now:k,defineSkip:function(e){f[e.line]=e.column,v()},write:function(e){if(m=i(m,e),y(),null!==m[m.length-1])return[];return x(t,0),E.events=l(h,E.events,E),E.events}},b=t.tokenize.call(E,T);return t.resolveAll&&h.push(t),p._index=0,p._bufferIndex=-1,E;function A(e){return d(m,e)}function k(){return u(p)}function y(){for(var e,t;p._index-1)return m();return e.tokenize.call(t?o({},E,t):E,T,h,m)(n)}}function h(t){return e(c,u),r}function m(e){return u.restore(),++lcode':{position:"relative",borderLeft:"10px solid #358ccb",boxShadow:"-1px 0px 0px 0px #358ccb, 0px 0px 0px 1px #dfdfdf",backgroundColor:"#fdfdfd",backgroundImage:"linear-gradient(transparent 50%, rgba(69, 142, 209, 0.04) 50%)",backgroundSize:"3em 3em",backgroundOrigin:"content-box",backgroundAttachment:"local"},':not(pre) > code[class*="language-"]':{backgroundColor:"#fdfdfd",WebkitBoxSizing:"border-box",MozBoxSizing:"border-box",boxSizing:"border-box",marginBottom:"1em",position:"relative",padding:".2em",borderRadius:"0.3em",color:"#c92c2c",border:"1px solid rgba(0, 0, 0, 0.1)",display:"inline",whiteSpace:"normal"},'pre[class*="language-"]:before':{content:"''",zIndex:"-2",display:"block",position:"absolute",bottom:"0.75em",left:"0.18em",width:"40%",height:"20%",maxHeight:"13em",boxShadow:"0px 13px 8px #979797",WebkitTransform:"rotate(-2deg)",MozTransform:"rotate(-2deg)",msTransform:"rotate(-2deg)",OTransform:"rotate(-2deg)",transform:"rotate(-2deg)"},'pre[class*="language-"]:after':{content:"''",zIndex:"-2",display:"block",position:"absolute",bottom:"0.75em",left:"auto",width:"40%",height:"20%",maxHeight:"13em",boxShadow:"0px 13px 8px #979797",WebkitTransform:"rotate(2deg)",MozTransform:"rotate(2deg)",msTransform:"rotate(2deg)",OTransform:"rotate(2deg)",transform:"rotate(2deg)",right:"0.75em"},comment:{color:"#7D8B99"},"block-comment":{color:"#7D8B99"},prolog:{color:"#7D8B99"},doctype:{color:"#7D8B99"},cdata:{color:"#7D8B99"},punctuation:{color:"#5F6364"},property:{color:"#c92c2c"},tag:{color:"#c92c2c"},boolean:{color:"#c92c2c"},number:{color:"#c92c2c"},"function-name":{color:"#c92c2c"},constant:{color:"#c92c2c"},symbol:{color:"#c92c2c"},deleted:{color:"#c92c2c"},selector:{color:"#2f9c0a"},"attr-name":{color:"#2f9c0a"},string:{color:"#2f9c0a"},char:{color:"#2f9c0a"},function:{color:"#2f9c0a"},builtin:{color:"#2f9c0a"},inserted:{color:"#2f9c0a"},operator:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},entity:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)",cursor:"help"},url:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},variable:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},atrule:{color:"#1990b8"},"attr-value":{color:"#1990b8"},keyword:{color:"#1990b8"},"class-name":{color:"#1990b8"},regex:{color:"#e90"},important:{color:"#e90",fontWeight:"normal"},".language-css .token.string":{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},".style .token.string":{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},namespace:{Opacity:".7"},'pre[class*="language-"].line-numbers.line-numbers':{paddingLeft:"0"},'pre[class*="language-"].line-numbers.line-numbers code':{paddingLeft:"3.8em"},'pre[class*="language-"].line-numbers.line-numbers .line-numbers-rows':{left:"0"},'pre[class*="language-"][data-line]':{paddingTop:"0",paddingBottom:"0",paddingLeft:"0"},"pre[data-line] code":{position:"relative",paddingLeft:"4em"},"pre .line-highlight":{marginTop:"0"}}},"6MAg":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{color:"black",background:"none",textShadow:"0 1px white",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"black",background:"#f5f2f0",textShadow:"0 1px white",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#b3d4fc"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#b3d4fc"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#b3d4fc"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#b3d4fc"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#b3d4fc"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#b3d4fc"},'code[class*="language-"]::selection':{textShadow:"none",background:"#b3d4fc"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#b3d4fc"},':not(pre) > code[class*="language-"]':{background:"#f5f2f0",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"slategray"},prolog:{color:"slategray"},doctype:{color:"slategray"},cdata:{color:"slategray"},punctuation:{color:"#999"},namespace:{Opacity:".7"},property:{color:"#905"},tag:{color:"#905"},boolean:{color:"#905"},number:{color:"#905"},constant:{color:"#905"},symbol:{color:"#905"},deleted:{color:"#905"},selector:{color:"#690"},"attr-name":{color:"#690"},string:{color:"#690"},char:{color:"#690"},builtin:{color:"#690"},inserted:{color:"#690"},operator:{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},entity:{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)",cursor:"help"},url:{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},".language-css .token.string":{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},".style .token.string":{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},atrule:{color:"#07a"},"attr-value":{color:"#07a"},keyword:{color:"#07a"},function:{color:"#DD4A68"},"class-name":{color:"#DD4A68"},regex:{color:"#e90"},important:{color:"#e90",fontWeight:"bold"},variable:{color:"#e90"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}}},"6dBs":function(e,t,n){"use strict";var o=Object.prototype.hasOwnProperty,r=Object.prototype.toString,i=Object.defineProperty,a=Object.getOwnPropertyDescriptor,s=function(e){return"function"===typeof Array.isArray?Array.isArray(e):"[object Array]"===r.call(e)},l=function(e){if(!e||"[object Object]"!==r.call(e))return!1;var t,n=o.call(e,"constructor"),i=e.constructor&&e.constructor.prototype&&o.call(e.constructor.prototype,"isPrototypeOf");if(e.constructor&&!n&&!i)return!1;for(t in e);return"undefined"===typeof t||o.call(e,t)},c=function(e,t){i&&"__proto__"===t.name?i(e,t.name,{enumerable:!0,configurable:!0,value:t.newValue,writable:!0}):e[t.name]=t.newValue},u=function(e,t){if("__proto__"===t){if(!o.call(e,t))return;if(a)return a(e,t).value}return e[t]};e.exports=function e(){var t,n,o,r,i,a,d=arguments[0],p=1,f=arguments.length,h=!1;for("boolean"===typeof d&&(h=d,d=arguments[1]||{},p=2),(null==d||"object"!==typeof d&&"function"!==typeof d)&&(d={});p for more info)`),delete h[o]}const t=i().use(a).use(e.remarkPlugins||e.plugins||[]).use(s,{allowDangerousHtml:!0}).use(e.rehypePlugins||[]).use(u,e);let n;"string"===typeof e.children?n=r(e.children):(void 0!==e.children&&null!==e.children&&console.warn(`[react-markdown] Warning: please pass a string as \`children\` (not: \`${e.children}\`)`),n=r());const l=t.runSync(t.parse(n),n);if("root"!==l.type)throw new TypeError("Expected a `root` node");let d=o.createElement(o.Fragment,{},p({options:e,schema:c,listDepth:0},l));return e.className&&(d=o.createElement("div",{className:e.className},d)),d}m.defaultProps={transformLinkUri:d},m.propTypes={children:l.string,className:l.string,allowElement:l.func,allowedElements:l.arrayOf(l.string),disallowedElements:l.arrayOf(l.string),unwrapDisallowed:l.bool,remarkPlugins:l.arrayOf(l.oneOfType([l.object,l.func,l.arrayOf(l.oneOfType([l.object,l.func]))])),rehypePlugins:l.arrayOf(l.oneOfType([l.object,l.func,l.arrayOf(l.oneOfType([l.object,l.func]))])),sourcePos:l.bool,rawSourcePos:l.bool,skipHtml:l.bool,includeElementIndex:l.bool,transformLinkUri:l.oneOfType([l.func,l.bool]),linkTarget:l.oneOfType([l.func,l.string]),transformImageUri:l.func,components:l.object},m.uriTransformer=d},"7+hk":function(e,t,n){"use strict";var o=n("z2ZG"),r=n("du5t"),i=n("eAD1"),a=n("dXJL"),s=n("bHgY"),l=n("RXC2");e.exports=o([i,r,a,s,l])},"7J+x":function(e,t){e.exports=function(e){var t,n;e._compiled||(t=e.before?"(?:"+e.before+")":"",n=e.after?"(?:"+e.after+")":"",e.atBreak&&(t="[\\r\\n][\\t ]*"+t),e._compiled=new RegExp((t?"("+t+")":"")+(/[|\\{}()[\]^$+*?.-]/.test(e.character)?"\\":"")+e.character+(n||""),"g"));return e._compiled}},"7W2i":function(e,t,n){var o=n("SksO");e.exports=function(e,t){if("function"!==typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&o(e,t)},e.exports.__esModule=!0,e.exports.default=e.exports},"7enW":function(e,t,n){"use strict";var o={name:"labelStartImage",tokenize:function(e,t,n){var o=this;return function(t){return e.enter("labelImage"),e.enter("labelImageMarker"),e.consume(t),e.exit("labelImageMarker"),r};function r(t){return 91===t?(e.enter("labelMarker"),e.consume(t),e.exit("labelMarker"),e.exit("labelImage"),i):n(t)}function i(e){return 94===e&&"_hiddenFootnoteSupport"in o.parser.constructs?n(e):t(e)}},resolveAll:n("OaLn").resolveAll};e.exports=o},"7nPM":function(e,t,n){"use strict";e.exports=function(e){var t=String(e),n=[],o=/\r?\n|\r/g;for(;o.exec(t);)n.push(o.lastIndex);return n.push(t.length+1),{toPoint:r,toPosition:r,toOffset:function(e){var t,o=e&&e.line,r=e&&e.column;isNaN(o)||isNaN(r)||!(o-1 in n)||(t=(n[o-2]||0)+r-1||0);return t>-1&&t-1&&ee)return{line:t+1,column:e-(n[t-1]||0)+1,offset:e};return{}}}},"8Kt/":function(e,t,n){"use strict";var o=n("oI91");function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}t.__esModule=!0,t.defaultHead=p,t.default=void 0;var i,a=function(e){if(e&&e.__esModule)return e;if(null===e||"object"!==typeof e&&"function"!==typeof e)return{default:e};var t=d();if(t&&t.has(e))return t.get(e);var n={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var r in e)if(Object.prototype.hasOwnProperty.call(e,r)){var i=o?Object.getOwnPropertyDescriptor(e,r):null;i&&(i.get||i.set)?Object.defineProperty(n,r,i):n[r]=e[r]}n.default=e,t&&t.set(e,n);return n}(n("q1tI")),s=(i=n("Xuae"))&&i.__esModule?i:{default:i},l=n("lwAK"),c=n("FYa8"),u=n("/0+H");function d(){if("function"!==typeof WeakMap)return null;var e=new WeakMap;return d=function(){return e},e}function p(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=[a.default.createElement("meta",{charSet:"utf-8"})];return e||t.push(a.default.createElement("meta",{name:"viewport",content:"width=device-width"})),t}function f(e,t){return"string"===typeof t||"number"===typeof t?e:t.type===a.default.Fragment?e.concat(a.default.Children.toArray(t.props.children).reduce((function(e,t){return"string"===typeof t||"number"===typeof t?e:e.concat(t)}),[])):e.concat(t)}var h=["name","httpEquiv","charSet","itemProp"];function m(e,t){return e.reduce((function(e,t){var n=a.default.Children.toArray(t.props.children);return e.concat(n)}),[]).reduce(f,[]).reverse().concat(p(t.inAmpMode)).filter(function(){var e=new Set,t=new Set,n=new Set,o={};return function(r){var i=!0,a=!1;if(r.key&&"number"!==typeof r.key&&r.key.indexOf("$")>0){a=!0;var s=r.key.slice(r.key.indexOf("$")+1);e.has(s)?i=!1:e.add(s)}switch(r.type){case"title":case"base":t.has(r.type)?i=!1:t.add(r.type);break;case"meta":for(var l=0,c=h.length;l code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#435643"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#435643"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#435643"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#435643"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#435643"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#435643"},'code[class*="language-"]::selection':{textShadow:"none",background:"#435643"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#435643"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#535f53"},prolog:{color:"#535f53"},doctype:{color:"#535f53"},cdata:{color:"#535f53"},punctuation:{color:"#535f53"},namespace:{Opacity:".7"},tag:{color:"#a2b34d"},operator:{color:"#a2b34d"},number:{color:"#a2b34d"},property:{color:"#687d68"},function:{color:"#687d68"},"tag-id":{color:"#f0fff0"},selector:{color:"#f0fff0"},"atrule-id":{color:"#f0fff0"},"code.language-javascript":{color:"#b3d6b3"},"attr-name":{color:"#b3d6b3"},"code.language-css":{color:"#e5fb79"},"code.language-scss":{color:"#e5fb79"},boolean:{color:"#e5fb79"},string:{color:"#e5fb79"},entity:{color:"#e5fb79",cursor:"help"},url:{color:"#e5fb79"},".language-css .token.string":{color:"#e5fb79"},".language-scss .token.string":{color:"#e5fb79"},".style .token.string":{color:"#e5fb79"},"attr-value":{color:"#e5fb79"},keyword:{color:"#e5fb79"},control:{color:"#e5fb79"},directive:{color:"#e5fb79"},unit:{color:"#e5fb79"},statement:{color:"#e5fb79"},regex:{color:"#e5fb79"},atrule:{color:"#e5fb79"},placeholder:{color:"#e5fb79"},variable:{color:"#e5fb79"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #f0fff0",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#b3d6b3"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid #5c705c",OutlineOffset:".4em"},".line-numbers .line-numbers-rows":{borderRightColor:"#2c302c"},".line-numbers-rows > span:before":{color:"#3b423b"},".line-highlight":{background:"linear-gradient(to right, rgba(162, 179, 77, 0.2) 70%, rgba(162, 179, 77, 0))"}}},"9SNS":function(e,t,n){"use strict";e.exports=function(e){return e<32||127===e}},"9kwo":function(e,t,n){"use strict";const o=n("HwUZ");e.exports=class extends o{constructor(e,t){super(e),this.posTracker=null,this.onParseError=t.onParseError}_setErrorLocation(e){e.startLine=e.endLine=this.posTracker.line,e.startCol=e.endCol=this.posTracker.col,e.startOffset=e.endOffset=this.posTracker.offset}_reportError(e){const t={code:e,startLine:-1,startCol:-1,startOffset:-1,endLine:-1,endCol:-1,endOffset:-1};this._setErrorLocation(t),this.onParseError(t)}_getOverriddenMethods(e){return{_err(t){e._reportError(t)}}}}},"9ppO":function(e,t,n){"use strict";var o=n("E/Jm"),r=n("yRGd");e.exports=function(e,t,n,i,a,s){var l;return function(t){return e.enter(i),e.enter(a),e.consume(t),e.exit(a),l=40===t?41:t,c};function c(n){return n===l?(e.enter(a),e.consume(n),e.exit(a),e.exit(i),t):(e.enter(s),u(n))}function u(t){return t===l?(e.exit(s),c(l)):null===t?n(t):o(t)?(e.enter("lineEnding"),e.consume(t),e.exit("lineEnding"),r(e,u,"linePrefix")):(e.enter("chunkString",{contentType:"string"}),d(t))}function d(t){return t===l||null===t||o(t)?(e.exit("chunkString"),u(t)):(e.consume(t),92===t?p:d)}function p(t){return t===l||92===t?(e.consume(t),d):d(t)}}},A0ZL:function(e,t,n){"use strict";class o{constructor(e){this.length=0,this.entries=[],this.treeAdapter=e,this.bookmark=null}_getNoahArkConditionCandidates(e){const t=[];if(this.length>=3){const n=this.treeAdapter.getAttrList(e).length,r=this.treeAdapter.getTagName(e),i=this.treeAdapter.getNamespaceURI(e);for(let e=this.length-1;e>=0;e--){const a=this.entries[e];if(a.type===o.MARKER_ENTRY)break;const s=a.element,l=this.treeAdapter.getAttrList(s);this.treeAdapter.getTagName(s)===r&&this.treeAdapter.getNamespaceURI(s)===i&&l.length===n&&t.push({idx:e,attrs:l})}}return t.length<3?[]:t}_ensureNoahArkCondition(e){const t=this._getNoahArkConditionCandidates(e);let n=t.length;if(n){const o=this.treeAdapter.getAttrList(e),r=o.length,i=Object.create(null);for(let e=0;e=2;e--)this.entries.splice(t[e].idx,1),this.length--}}insertMarker(){this.entries.push({type:o.MARKER_ENTRY}),this.length++}pushElement(e,t){this._ensureNoahArkCondition(e),this.entries.push({type:o.ELEMENT_ENTRY,element:e,token:t}),this.length++}insertElementAfterBookmark(e,t){let n=this.length-1;for(;n>=0&&this.entries[n]!==this.bookmark;n--);this.entries.splice(n+1,0,{type:o.ELEMENT_ENTRY,element:e,token:t}),this.length++}removeEntry(e){for(let t=this.length-1;t>=0;t--)if(this.entries[t]===e){this.entries.splice(t,1),this.length--;break}}clearToLastMarker(){for(;this.length;){const e=this.entries.pop();if(this.length--,e.type===o.MARKER_ENTRY)break}}getElementEntryInScopeWithTagName(e){for(let t=this.length-1;t>=0;t--){const n=this.entries[t];if(n.type===o.MARKER_ENTRY)return null;if(this.treeAdapter.getTagName(n.element)===e)return n}return null}getElementEntry(e){for(let t=this.length-1;t>=0;t--){const n=this.entries[t];if(n.type===o.ELEMENT_ENTRY&&n.element===e)return n}return null}}o.MARKER_ENTRY="MARKER_ENTRY",o.ELEMENT_ENTRY="ELEMENT_ENTRY",e.exports=o},ADT3:function(e,t,n){"use strict";e.exports=function(e,t,n,o){var r,i;"string"===typeof t||t&&"function"===typeof t.exec?i=[[t,n]]:(i=t,o=n);return s(e,r=o||{},function e(t){var n=t[0];return o;function o(o,i){var l,c,u,d,p=n[0],f=n[1],h=[],m=0,g=i.children.indexOf(o);for(p.lastIndex=0,c=p.exec(o.value);c&&(l=c.index,!1!==(d=f.apply(null,[].concat(c,{index:c.index,input:c.input})))&&(m!==l&&h.push({type:"text",value:o.value.slice(m,l)}),"string"===typeof d&&d.length>0&&(d={type:"text",value:d}),d&&(h=[].concat(h,d)),m=l+c[0].length),p.global);)c=p.exec(o.value);if(void 0===l?(h=[o],g--):(m1)for(u=e(t.slice(1)),l=-1;++lString(e))).join("")),!A&&s.rawSourcePos&&(u.sourcePosition=t.position),!A&&s.includeElementIndex&&(u.index=m(a,t),u.siblingCount=m(a)),A||(u.node=t),T.length>0?o.createElement(b,u,T):o.createElement(b,u)}function m(e,t){let n=-1,o=0;for(;++n(Object.keys(t).forEach((n=>{e[n]=t[n]})),e)),Object.create(null))}},B5Lt:function(e,t,n){e.exports=function(e,t){var n,r=e.children||[],i=[],a=-1;for(;++a code[class*="language-"]':{backgroundColor:"transparent !important",backgroundImage:"linear-gradient(to bottom, #2a2139 75%, #34294f)",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"#8e8e8e"},"block-comment":{color:"#8e8e8e"},prolog:{color:"#8e8e8e"},doctype:{color:"#8e8e8e"},cdata:{color:"#8e8e8e"},punctuation:{color:"#ccc"},tag:{color:"#e2777a"},"attr-name":{color:"#e2777a"},namespace:{color:"#e2777a"},number:{color:"#e2777a"},unit:{color:"#e2777a"},hexcode:{color:"#e2777a"},deleted:{color:"#e2777a"},property:{color:"#72f1b8",textShadow:"0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475"},selector:{color:"#72f1b8",textShadow:"0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475"},"function-name":{color:"#6196cc"},boolean:{color:"#fdfdfd",textShadow:"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975"},"selector .token.id":{color:"#fdfdfd",textShadow:"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975"},function:{color:"#fdfdfd",textShadow:"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975"},"class-name":{color:"#fff5f6",textShadow:"0 0 2px #000, 0 0 10px #fc1f2c75, 0 0 5px #fc1f2c75, 0 0 25px #fc1f2c75"},constant:{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"},symbol:{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"},important:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575",fontWeight:"bold"},atrule:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"},keyword:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"},"selector .token.class":{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"},builtin:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"},string:{color:"#f87c32"},char:{color:"#f87c32"},"attr-value":{color:"#f87c32"},regex:{color:"#f87c32"},variable:{color:"#f87c32"},operator:{color:"#67cdcc"},entity:{color:"#67cdcc",cursor:"help"},url:{color:"#67cdcc"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},inserted:{color:"green"}}},BfbN:function(e,t,n){"use strict";var o=a("start"),r=a("end");function i(e){return{start:o(e),end:r(e)}}function a(e){return t.displayName=e,t;function t(t){var n=t&&t.position&&t.position[e]||{};return{line:n.line||null,column:n.column||null,offset:isNaN(n.offset)?null:n.offset}}}e.exports=i,i.start=o,i.end=r},Bh6z:function(e,t,n){"use strict";e.exports=function(e){return e.replace(/[\t\n\r ]+/g," ").replace(/^ | $/g,"").toLowerCase().toUpperCase()}},BjXi:function(e,t,n){"use strict";var o=n("M8+4"),r=n("rm/B")(o);e.exports=r},C7Ve:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{color:"#393A34",fontFamily:'"Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",fontSize:".9em",lineHeight:"1.2em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#393A34",fontFamily:'"Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",fontSize:".9em",lineHeight:"1.2em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",border:"1px solid #dddddd",backgroundColor:"white"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{background:"#C1DEF1"},'pre[class*="language-"] ::-moz-selection':{background:"#C1DEF1"},'code[class*="language-"]::-moz-selection':{background:"#C1DEF1"},'code[class*="language-"] ::-moz-selection':{background:"#C1DEF1"},'pre[class*="language-"]::selection':{background:"#C1DEF1"},'pre[class*="language-"] ::selection':{background:"#C1DEF1"},'code[class*="language-"]::selection':{background:"#C1DEF1"},'code[class*="language-"] ::selection':{background:"#C1DEF1"},':not(pre) > code[class*="language-"]':{padding:".2em",paddingTop:"1px",paddingBottom:"1px",background:"#f8f8f8",border:"1px solid #dddddd"},comment:{color:"#008000",fontStyle:"italic"},prolog:{color:"#008000",fontStyle:"italic"},doctype:{color:"#008000",fontStyle:"italic"},cdata:{color:"#008000",fontStyle:"italic"},namespace:{Opacity:".7"},string:{color:"#A31515"},punctuation:{color:"#393A34"},operator:{color:"#393A34"},url:{color:"#36acaa"},symbol:{color:"#36acaa"},number:{color:"#36acaa"},boolean:{color:"#36acaa"},variable:{color:"#36acaa"},constant:{color:"#36acaa"},inserted:{color:"#36acaa"},atrule:{color:"#0000ff"},keyword:{color:"#0000ff"},"attr-value":{color:"#0000ff"},".language-autohotkey .token.selector":{color:"#0000ff"},".language-json .token.boolean":{color:"#0000ff"},".language-json .token.number":{color:"#0000ff"},'code[class*="language-css"]':{color:"#0000ff"},function:{color:"#393A34"},deleted:{color:"#9a050f"},".language-autohotkey .token.tag":{color:"#9a050f"},selector:{color:"#800000"},".language-autohotkey .token.keyword":{color:"#00009f"},important:{fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},"class-name":{color:"#2B91AF"},".language-json .token.property":{color:"#2B91AF"},tag:{color:"#800000"},"attr-name":{color:"#ff0000"},property:{color:"#ff0000"},regex:{color:"#ff0000"},entity:{color:"#ff0000"},"directive.tag .tag":{background:"#ffff00",color:"#393A34"},".line-numbers .line-numbers-rows":{borderRightColor:"#a5a5a5"},".line-numbers-rows > span:before":{color:"#2B91AF"},".line-highlight":{background:"linear-gradient(to right, rgba(193, 222, 241, 0.2) 70%, rgba(221, 222, 241, 0))"}}},CC3I:function(e,t,n){var o=n("Lc7W");e.exports=function(e,t){var n,r=null;if(!e||"string"!==typeof e)return r;for(var i,a,s=o(e),l="function"===typeof t,c=0,u=s.length;ci&&"whitespace"===e[r][1].type&&(r-=2);"atxHeadingSequence"===e[r][1].type&&(i===r-1||r-4>i&&"whitespace"===e[r-2][1].type)&&(r-=i+1===r?2:4);r>i&&(n={type:"atxHeadingText",start:e[i][1].start,end:e[r][1].end},o={type:"chunkText",start:e[i][1].start,end:e[r][1].end,contentType:"text"},a(e,i,r-i+1,[["enter",n,t],["enter",o,t],["exit",o,t],["exit",n,t]]));return e}};e.exports=l},Cjod:function(e,t,n){"use strict";var o=n("7+hk"),r=n("IEZ+"),i=n("F6fn"),a=n("Ho5A"),s=n("TTG4"),l=n("vfP8"),c=n("CC3I"),u=n("qrWY"),d=n("Zasy"),p=d("root"),f=d("element"),h=d("text");function m(e,t,n){var o,i,a=n.schema,s=a,l=t.tagName,c={},d=[],p=-1;for(o in"html"===a.space&&"svg"===l.toLowerCase()&&(s=r,n.schema=s),t.properties)g(c,o,t.properties[o],n,l);if(n.vdom&&("html"===s.space?l=l.toUpperCase():c.namespace=u[s.space]),n.prefix&&(n.key++,c.key=n.prefix+n.key),t.children)for(;++p0&&n.push(o("text","\n"));return n};var o=n("vUGn")},"E/Jm":function(e,t,n){"use strict";e.exports=function(e){return e<-2}},EBzq:function(e,t,n){"use strict";var o=[].slice;e.exports=function(e,t){var n;return function(){var t,a=o.call(arguments,0),s=e.length>a.length;s&&a.push(r);try{t=e.apply(null,a)}catch(l){if(s&&n)throw l;return r(l)}s||(t&&"function"===typeof t.then?t.then(i,r):t instanceof Error?r(t):i(t))};function r(){n||(n=!0,t.apply(null,arguments))}function i(e){r(null,e)}}},EIjK:function(e,t,n){"use strict";var o=String.fromCharCode;e.exports=o},"EfL/":function(e,t,n){const o=n("ZkSf");e.exports=function(e){if(e.allowedElements&&e.disallowedElements)throw new TypeError("Only one of `allowedElements` and `disallowedElements` should be defined");if(e.allowedElements||e.disallowedElements||e.allowElement)return e=>{o(e,"element",t)};function t(t,n,o){const r=t,i=o;let a;if(e.allowedElements?a=!e.allowedElements.includes(r.tagName):e.disallowedElements&&(a=e.disallowedElements.includes(r.tagName)),!a&&e.allowElement&&"number"===typeof n&&(a=!e.allowElement(r,n,i)),a&&"number"===typeof n)return e.unwrapDisallowed&&r.children?i.children.splice(n,1,...r.children):i.children.splice(n,1),n}}},Esvb:function(e,t,n){"use strict";e.exports=n("PPHF")},F2il:function(e,t,n){"use strict";e.exports=function(e,t){var n,o=String(e),r=0;if("string"!==typeof t)throw new Error("Expected character");n=o.indexOf(t);for(;-1!==n;)r++,n=o.indexOf(t,n+t.length);return r}},F6fn:function(e,t,n){"use strict";var o=n("bAF5"),r=n("qTn3"),i=n("Ut8p"),a="data";e.exports=function(e,t){var n=o(t),p=t,f=i;if(n in e.normal)return e.property[e.normal[n]];n.length>4&&n.slice(0,4)===a&&s.test(t)&&("-"===t.charAt(4)?p=function(e){var t=e.slice(5).replace(l,d);return a+t.charAt(0).toUpperCase()+t.slice(1)}(t):t=function(e){var t=e.slice(4);if(l.test(t))return e;"-"!==(t=t.replace(c,u)).charAt(0)&&(t="-"+t);return a+t}(t),f=r);return new f(p,t)};var s=/^data[-\w.:]+$/i,l=/-[a-z]/g,c=/[A-Z]/g;function u(e){return"-"+e.toLowerCase()}function d(e){return e.charAt(1).toUpperCase()}},FE4A:function(e,t,n){"use strict";var o=n("EIjK");e.exports=function(e){for(var t,n,r,i=-1,a=[];++i code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{background:"#b3d4fc"},'pre[class*="language-"] ::-moz-selection':{background:"#b3d4fc"},'code[class*="language-"]::-moz-selection':{background:"#b3d4fc"},'code[class*="language-"] ::-moz-selection':{background:"#b3d4fc"},'pre[class*="language-"]::selection':{background:"#b3d4fc"},'pre[class*="language-"] ::selection':{background:"#b3d4fc"},'code[class*="language-"]::selection':{background:"#b3d4fc"},'code[class*="language-"] ::selection':{background:"#b3d4fc"},':not(pre) > code[class*="language-"]':{padding:".2em",paddingTop:"1px",paddingBottom:"1px",background:"#f8f8f8",border:"1px solid #dddddd"},comment:{color:"#999988",fontStyle:"italic"},prolog:{color:"#999988",fontStyle:"italic"},doctype:{color:"#999988",fontStyle:"italic"},cdata:{color:"#999988",fontStyle:"italic"},namespace:{Opacity:".7"},string:{color:"#e3116c"},"attr-value":{color:"#e3116c"},punctuation:{color:"#393A34"},operator:{color:"#393A34"},entity:{color:"#36acaa"},url:{color:"#36acaa"},symbol:{color:"#36acaa"},number:{color:"#36acaa"},boolean:{color:"#36acaa"},variable:{color:"#36acaa"},constant:{color:"#36acaa"},property:{color:"#36acaa"},regex:{color:"#36acaa"},inserted:{color:"#36acaa"},atrule:{color:"#00a4db"},keyword:{color:"#00a4db"},"attr-name":{color:"#00a4db"},".language-autohotkey .token.selector":{color:"#00a4db"},function:{color:"#9a050f",fontWeight:"bold"},deleted:{color:"#9a050f"},".language-autohotkey .token.tag":{color:"#9a050f"},tag:{color:"#00009f"},selector:{color:"#00009f"},".language-autohotkey .token.keyword":{color:"#00009f"},important:{fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}}},Gdbo:function(e,t,n){"use strict";e.exports=function(e){if(e)throw e}},GjEx:function(e,t,n){"use strict";e.exports=function(e,t){var n,r=t.value?t.value+"\n":"",i=t.lang&&t.lang.match(/^[^ \t]+(?=[ \t]|$)/),a={};i&&(a.className=["language-"+i]);n=e(t,"code",a,[o("text",r)]),t.meta&&(n.data={meta:t.meta});return e(t.position,"pre",[n])};var o=n("vUGn")},H0fq:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"black",color:"white",boxShadow:"-.3em 0 0 .3em black, .3em 0 0 .3em black"},'pre[class*="language-"]':{fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:".4em .8em",margin:".5em 0",overflow:"auto",background:'url(\'data:image/svg+xml;charset=utf-8,%0D%0A%0D%0A%0D%0A<%2Fsvg>\')',backgroundSize:"1em 1em"},':not(pre) > code[class*="language-"]':{padding:".2em",borderRadius:".3em",boxShadow:"none",whiteSpace:"normal"},comment:{color:"#aaa"},prolog:{color:"#aaa"},doctype:{color:"#aaa"},cdata:{color:"#aaa"},punctuation:{color:"#999"},namespace:{Opacity:".7"},property:{color:"#0cf"},tag:{color:"#0cf"},boolean:{color:"#0cf"},number:{color:"#0cf"},constant:{color:"#0cf"},symbol:{color:"#0cf"},selector:{color:"yellow"},"attr-name":{color:"yellow"},string:{color:"yellow"},char:{color:"yellow"},builtin:{color:"yellow"},operator:{color:"yellowgreen"},entity:{color:"yellowgreen",cursor:"help"},url:{color:"yellowgreen"},".language-css .token.string":{color:"yellowgreen"},variable:{color:"yellowgreen"},inserted:{color:"yellowgreen"},atrule:{color:"deeppink"},"attr-value":{color:"deeppink"},keyword:{color:"deeppink"},regex:{color:"orange"},important:{color:"orange",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},deleted:{color:"red"},"pre.diff-highlight.diff-highlight > code .token.deleted:not(.prefix)":{backgroundColor:"rgba(255, 0, 0, .3)",display:"inline"},"pre > code.diff-highlight.diff-highlight .token.deleted:not(.prefix)":{backgroundColor:"rgba(255, 0, 0, .3)",display:"inline"},"pre.diff-highlight.diff-highlight > code .token.inserted:not(.prefix)":{backgroundColor:"rgba(0, 255, 128, .3)",display:"inline"},"pre > code.diff-highlight.diff-highlight .token.inserted:not(.prefix)":{backgroundColor:"rgba(0, 255, 128, .3)",display:"inline"}}},HALo:function(e,t,n){"use strict";function o(){return(o=Object.assign||function(e){for(var t=1;t code[class*="language-"]':{fontSize:"1em"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#797379"},prolog:{color:"#797379"},doctype:{color:"#797379"},cdata:{color:"#797379"},punctuation:{color:"#b9b5b8"},".namespace":{Opacity:".7"},null:{color:"#fd8b19"},operator:{color:"#fd8b19"},boolean:{color:"#fd8b19"},number:{color:"#fd8b19"},property:{color:"#fdcc59"},tag:{color:"#1290bf"},string:{color:"#149b93"},selector:{color:"#c85e7c"},"attr-name":{color:"#fd8b19"},entity:{color:"#149b93",cursor:"help"},url:{color:"#149b93"},".language-css .token.string":{color:"#149b93"},".style .token.string":{color:"#149b93"},"attr-value":{color:"#8fc13e"},keyword:{color:"#8fc13e"},control:{color:"#8fc13e"},directive:{color:"#8fc13e"},unit:{color:"#8fc13e"},statement:{color:"#149b93"},regex:{color:"#149b93"},atrule:{color:"#149b93"},placeholder:{color:"#1290bf"},variable:{color:"#1290bf"},important:{color:"#dd464c",fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid red",OutlineOffset:".4em"}}},Ho5A:function(e){e.exports=JSON.parse('{"classId":"classID","dataType":"datatype","itemId":"itemID","strokeDashArray":"strokeDasharray","strokeDashOffset":"strokeDashoffset","strokeLineCap":"strokeLinecap","strokeLineJoin":"strokeLinejoin","strokeMiterLimit":"strokeMiterlimit","typeOf":"typeof","xLinkActuate":"xlinkActuate","xLinkArcRole":"xlinkArcrole","xLinkHref":"xlinkHref","xLinkRole":"xlinkRole","xLinkShow":"xlinkShow","xLinkTitle":"xlinkTitle","xLinkType":"xlinkType","xmlnsXLink":"xmlnsXlink"}')},HtLg:function(e,t,n){"use strict";var o=n("Vx/6");e.exports=function(e,t){return e.length?(o(e,e.length,0,t),e):t}},HwUZ:function(e,t,n){"use strict";class o{constructor(e){const t={},n=this._getOverriddenMethods(this,t);for(const o of Object.keys(n))"function"===typeof n[o]&&(t[o]=e[o],e[o]=n[o])}_getOverriddenMethods(){throw new Error("Not implemented")}}o.install=function(e,t,n){e.__mixins||(e.__mixins=[]);for(let r=0;r-1?(d=1,T.interrupt?t(o):P(o)):c.indexOf(h.toLowerCase())>-1?(d=6,47===o?(e.consume(o),S):T.interrupt?t(o):P(o)):(d=7,T.interrupt?n(o):p?x(o):C(o)):45===o||r(o)?(e.consume(o),h+=l(o),_):n(o)}function S(o){return 62===o?(e.consume(o),T.interrupt?t:P):n(o)}function C(t){return s(t)?(e.consume(t),C):I(t)}function x(t){return 47===t?(e.consume(t),I):58===t||95===t||o(t)?(e.consume(t),v):s(t)?(e.consume(t),x):I(t)}function v(t){return 45===t||46===t||58===t||95===t||r(t)?(e.consume(t),v):O(t)}function O(t){return 61===t?(e.consume(t),N):s(t)?(e.consume(t),O):x(t)}function N(t){return null===t||60===t||61===t||62===t||96===t?n(t):34===t||39===t?(e.consume(t),g=t,M):s(t)?(e.consume(t),N):(g=void 0,w(t))}function M(t){return t===g?(e.consume(t),R):null===t||i(t)?n(t):(e.consume(t),M)}function w(t){return null===t||34===t||39===t||60===t||61===t||62===t||96===t||a(t)?O(t):(e.consume(t),w)}function R(e){return 47===e||62===e||s(e)?x(e):n(e)}function I(t){return 62===t?(e.consume(t),L):n(t)}function L(t){return s(t)?(e.consume(t),L):null===t||i(t)?P(t):n(t)}function P(t){return 45===t&&2===d?(e.consume(t),F):60===t&&1===d?(e.consume(t),B):62===t&&4===d?(e.consume(t),W):63===t&&3===d?(e.consume(t),G):93===t&&5===d?(e.consume(t),U):!i(t)||6!==d&&7!==d?null===t||i(t)?H(t):(e.consume(t),P):e.check(f,W,H)(t)}function H(t){return e.exit("htmlFlowData"),D(t)}function D(t){return null===t?K(t):i(t)?(e.enter("lineEnding"),e.consume(t),e.exit("lineEnding"),D):(e.enter("htmlFlowData"),P(t))}function F(t){return 45===t?(e.consume(t),G):P(t)}function B(t){return 47===t?(e.consume(t),h="",z):P(t)}function z(t){return 62===t&&u.indexOf(h.toLowerCase())>-1?(e.consume(t),W):o(t)&&h.length<8?(e.consume(t),h+=l(t),z):P(t)}function U(t){return 93===t?(e.consume(t),G):P(t)}function G(t){return 62===t?(e.consume(t),W):P(t)}function W(t){return null===t||i(t)?(e.exit("htmlFlowData"),K(t)):(e.consume(t),W)}function K(n){return e.exit("htmlFlow"),t(n)}},resolveTo:function(e){var t=e.length;for(;t--&&("enter"!==e[t][0]||"htmlFlow"!==e[t][1].type););t>1&&"linePrefix"===e[t-2][1].type&&(e[t][1].start=e[t-2][1].start,e[t+1][1].start=e[t-2][1].start,e.splice(t-2,2));return e},concrete:!0},f={tokenize:function(e,t,n){return function(o){return e.exit("htmlFlowData"),e.enter("lineEndingBlank"),e.consume(o),e.exit("lineEndingBlank"),e.attempt(d,t,n)}},partial:!0};e.exports=p},L8sx:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=n("rCOv"),r=n("yRGd"),i=n("VLot"),a=function(e){var t=this,n=e.attempt(i,(function(o){if(null===o)return void e.consume(o);return e.enter("lineEndingBlank"),e.consume(o),e.exit("lineEndingBlank"),t.currentConstruct=void 0,n}),e.attempt(this.parser.constructs.flowInitial,a,r(e,e.attempt(this.parser.constructs.flow,a,e.attempt(o,a)),"linePrefix")));return n;function a(o){if(null!==o)return e.enter("lineEnding"),e.consume(o),e.exit("lineEnding"),t.currentConstruct=void 0,n;e.consume(o)}};t.tokenize=a},LLHA:function(e,t,n){"use strict";e.exports=n("wJMj")},Lc7W:function(e,t){var n=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g,o=/\n/g,r=/^\s*/,i=/^(\*?[-#/*\\\w]+(\[[0-9a-z_-]+\])?)\s*/,a=/^:\s*/,s=/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};])+)/,l=/^[;\s]*/,c=/^\s+|\s+$/g,u="";function d(e){return e?e.replace(c,u):u}e.exports=function(e,t){if("string"!==typeof e)throw new TypeError("First argument must be a string");if(!e)return[];t=t||{};var c=1,p=1;function f(e){var t=e.match(o);t&&(c+=t.length);var n=e.lastIndexOf("\n");p=~n?e.length-n:p+e.length}function h(){var e={line:c,column:p};return function(t){return t.position=new m(e),b(),t}}function m(e){this.start=e,this.end={line:c,column:p},this.source=t.source}m.prototype.content=e;var g=[];function T(n){var o=new Error(t.source+":"+c+":"+p+": "+n);if(o.reason=n,o.filename=t.source,o.line=c,o.column=p,o.source=e,!t.silent)throw o;g.push(o)}function E(t){var n=t.exec(e);if(n){var o=n[0];return f(o),e=e.slice(o.length),n}}function b(){E(r)}function A(e){var t;for(e=e||[];t=k();)!1!==t&&e.push(t);return e}function k(){var t=h();if("/"==e.charAt(0)&&"*"==e.charAt(1)){for(var n=2;u!=e.charAt(n)&&("*"!=e.charAt(n)||"/"!=e.charAt(n+1));)++n;if(n+=2,u===e.charAt(n-1))return T("End of comment missing");var o=e.slice(2,n-2);return p+=2,f(o),e=e.slice(n),p+=2,t({type:"comment",comment:o})}}function y(){var e=h(),t=E(i);if(t){if(k(),!E(a))return T("property missing ':'");var o=E(s),r=e({type:"declaration",property:d(t[0].replace(n,u)),value:o?d(o[0].replace(n,u)):u});return E(l),r}}return b(),function(){var e,t=[];for(A(t);e=y();)!1!==e&&(t.push(e),A(t));return t}()}},"M3+Y":function(e,t,n){"use strict";e.exports=function(e,t){var n=t.value.replace(/\r?\n|\r/g," ");return e(t,"code",[o("text",n)])};var o=n("vUGn")},"M8+4":function(e,t,n){"use strict";e.exports=/[!-\/:-@\[-`\{-~\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4F\u2E52\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]/},MVZn:function(e,t,n){var o=n("lSNA");e.exports=function(e){for(var t=1;t code[class*="language-"]':{background:"#1d1f21",padding:".1em",borderRadius:".3em"},comment:{color:"#7C7C7C"},prolog:{color:"#7C7C7C"},doctype:{color:"#7C7C7C"},cdata:{color:"#7C7C7C"},punctuation:{color:"#c5c8c6"},".namespace":{Opacity:".7"},property:{color:"#96CBFE"},keyword:{color:"#96CBFE"},tag:{color:"#96CBFE"},"class-name":{color:"#FFFFB6",textDecoration:"underline"},boolean:{color:"#99CC99"},constant:{color:"#99CC99"},symbol:{color:"#f92672"},deleted:{color:"#f92672"},number:{color:"#FF73FD"},selector:{color:"#A8FF60"},"attr-name":{color:"#A8FF60"},string:{color:"#A8FF60"},char:{color:"#A8FF60"},builtin:{color:"#A8FF60"},inserted:{color:"#A8FF60"},variable:{color:"#C6C5FE"},operator:{color:"#EDEDED"},entity:{color:"#FFFFB6",cursor:"help"},url:{color:"#96CBFE"},".language-css .token.string":{color:"#87C38A"},".style .token.string":{color:"#87C38A"},atrule:{color:"#F9EE98"},"attr-value":{color:"#F9EE98"},function:{color:"#DAD085"},regex:{color:"#E9C062"},important:{color:"#fd971f",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}}},NNOl:function(e,t,n){"use strict";var o=n("E/Jm"),r=n("Vx/6"),i=n("O+c1"),a=n("yRGd"),s={name:"codeIndented",tokenize:function(e,t,n){return e.attempt(l,r,n);function r(n){return null===n?t(n):o(n)?e.attempt(l,r,t)(n):(e.enter("codeFlowValue"),i(n))}function i(t){return null===t||o(t)?(e.exit("codeFlowValue"),r(t)):(e.consume(t),i)}},resolve:function(e,t){var n={type:"codeIndented",start:e[0][1].start,end:e[e.length-1][1].end};return r(e,0,0,[["enter",n,t]]),r(e,e.length,0,[["exit",n,t]]),e}},l={tokenize:function(e,t,n){var r=this;return a(e,(function s(l){if(o(l))return e.enter("lineEnding"),e.consume(l),e.exit("lineEnding"),a(e,s,"linePrefix",5);return i(r.events,"linePrefix")<4?n(l):t(l)}),"linePrefix",5)},partial:!0};e.exports=s},NOby:function(e,t,n){"use strict";var o=Object.assign;e.exports=o},Ne21:function(e,t,n){"use strict";const o=n("9kwo"),r=n("srZV"),i=n("HwUZ");e.exports=class extends o{constructor(e,t){super(e,t);const n=i.install(e.preprocessor,r,t);this.posTracker=n.posTracker}}},NfWH:function(e,t){e.exports=function(e){var t=e.options.listItemIndent||"tab";if(1===t||"1"===t)return"one";if("tab"!==t&&"one"!==t&&"mixed"!==t)throw new Error("Cannot serialize items with `"+t+"` for `options.listItemIndent`, expected `tab`, `one`, or `mixed`");return t}},Nsbk:function(e,t){function n(t){return e.exports=n=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},e.exports.__esModule=!0,e.exports.default=e.exports,n(t)}e.exports=n,e.exports.__esModule=!0,e.exports.default=e.exports},Ny5O:function(e,t,n){"use strict";var o=n("rm/B")(/[\dA-Za-z]/);e.exports=o},"O+c1":function(e,t,n){"use strict";var o=n("jeK3");e.exports=function(e,t){var n=e[e.length-1];return n&&n[1].type===t?o(n[2].sliceStream(n[1])):0}},OaLn:function(e,t,n){"use strict";var o=n("Q3zd"),r=n("HtLg"),i=n("Vx/6"),a=n("Bh6z"),s=n("Ig3s"),l=n("T0BQ"),c=n("haLp"),u=n("kViG"),d=n("9ppO"),p=n("0mGV"),f={name:"labelEnd",tokenize:function(e,t,n){var o,r,i=this,s=i.events.length;for(;s--;)if(("labelImage"===i.events[s][1].type||"labelLink"===i.events[s][1].type)&&!i.events[s][1]._balanced){o=i.events[s][1];break}return function(t){if(!o)return n(t);return o._inactive?c(t):(r=i.parser.defined.indexOf(a(i.sliceSerialize({start:o.end,end:i.now()})))>-1,e.enter("labelEnd"),e.enter("labelMarker"),e.consume(t),e.exit("labelMarker"),e.exit("labelEnd"),l)};function l(n){return 40===n?e.attempt(h,t,r?t:c)(n):91===n?e.attempt(m,t,r?e.attempt(g,t,c):c)(n):r?t(n):c(n)}function c(e){return o._balanced=!0,n(e)}},resolveTo:function(e,t){var n,o,a,c,u,d,p,f=e.length,h=0;for(;f--;)if(c=e[f][1],u){if("link"===c.type||"labelLink"===c.type&&c._inactive)break;"enter"===e[f][0]&&"labelLink"===c.type&&(c._inactive=!0)}else if(d){if("enter"===e[f][0]&&("labelImage"===c.type||"labelLink"===c.type)&&!c._balanced&&(u=f,"labelLink"!==c.type)){h=2;break}}else"labelEnd"===c.type&&(d=f);return n={type:"labelLink"===e[u][1].type?"link":"image",start:l(e[u][1].start),end:l(e[e.length-1][1].end)},o={type:"label",start:l(e[u][1].start),end:l(e[d][1].end)},a={type:"labelText",start:l(e[u+h+2][1].end),end:l(e[d-2][1].start)},p=r(p=[["enter",n,t],["enter",o,t]],e.slice(u+1,u+h+3)),p=r(p,[["enter",a,t]]),p=r(p,s(t.parser.constructs.insideSpan.null,e.slice(u+h+4,d-3),t)),p=r(p,[["exit",a,t],e[d-2],e[d-1],["exit",o,t]]),p=r(p,e.slice(d+1)),p=r(p,[["exit",n,t]]),i(e,u,e.length,p),e},resolveAll:function(e){var t,n=-1;for(;++n code[class*="language-"]':{background:"hsl(30, 20%, 25%)",padding:".15em .2em .05em",borderRadius:".3em",border:".13em solid hsl(30, 20%, 40%)",boxShadow:"1px 1px .3em -.1em black inset",whiteSpace:"normal"},comment:{color:"hsl(30, 20%, 50%)"},prolog:{color:"hsl(30, 20%, 50%)"},doctype:{color:"hsl(30, 20%, 50%)"},cdata:{color:"hsl(30, 20%, 50%)"},punctuation:{Opacity:".7"},namespace:{Opacity:".7"},property:{color:"hsl(350, 40%, 70%)"},tag:{color:"hsl(350, 40%, 70%)"},boolean:{color:"hsl(350, 40%, 70%)"},number:{color:"hsl(350, 40%, 70%)"},constant:{color:"hsl(350, 40%, 70%)"},symbol:{color:"hsl(350, 40%, 70%)"},selector:{color:"hsl(75, 70%, 60%)"},"attr-name":{color:"hsl(75, 70%, 60%)"},string:{color:"hsl(75, 70%, 60%)"},char:{color:"hsl(75, 70%, 60%)"},builtin:{color:"hsl(75, 70%, 60%)"},inserted:{color:"hsl(75, 70%, 60%)"},operator:{color:"hsl(40, 90%, 60%)"},entity:{color:"hsl(40, 90%, 60%)",cursor:"help"},url:{color:"hsl(40, 90%, 60%)"},".language-css .token.string":{color:"hsl(40, 90%, 60%)"},".style .token.string":{color:"hsl(40, 90%, 60%)"},variable:{color:"hsl(40, 90%, 60%)"},atrule:{color:"hsl(350, 40%, 70%)"},"attr-value":{color:"hsl(350, 40%, 70%)"},keyword:{color:"hsl(350, 40%, 70%)"},regex:{color:"#e90"},important:{color:"#e90",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},deleted:{color:"red"}}},PGbq:function(e){e.exports=JSON.parse('["area","base","basefont","bgsound","br","col","command","embed","frame","hr","image","img","input","isindex","keygen","link","menuitem","meta","nextid","param","source","track","wbr"]')},PPHF:function(e,t,n){"use strict";var o=n("aCXt"),r=n("tgGP");e.exports=r,r.prototype.message=function(e,t,n){var r=new o(e,t,n);this.path&&(r.name=this.path+":"+r.name,r.file=this.path);return r.fatal=!1,this.messages.push(r),r},r.prototype.info=function(){var e=this.message.apply(this,arguments);return e.fatal=null,e},r.prototype.fail=function(){var e=this.message.apply(this,arguments);throw e.fatal=!0,e}},PSll:function(e,t,n){"use strict";var o=n("E/Jm"),r=n("Q3zd"),i=n("O+c1"),a=n("yRGd"),s={name:"codeFenced",tokenize:function(e,t,n){var s,l=this,c={tokenize:function(e,t,n){var r=0;return a(e,i,"linePrefix",this.parser.constructs.disable.null.indexOf("codeIndented")>-1?void 0:4);function i(t){return e.enter("codeFencedFence"),e.enter("codeFencedFenceSequence"),l(t)}function l(t){return t===s?(e.consume(t),r++,l):r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i},e.exports.__esModule=!0,e.exports.default=e.exports},R5yl:function(e,t,n){"use strict";e.exports=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","section","source","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"]},REpm:function(e,t){const n=["http","https","mailto","tel"];e.exports=function(e){const t=(e||"").trim(),o=t.charAt(0);if("#"===o||"/"===o)return t;const r=t.indexOf(":");if(-1===r)return t;let i=-1;for(;++ii)return t;if(i=t.indexOf("#"),-1!==i&&r>i)return t;return"javascript:void(0)"}},RXC2:function(e,t,n){"use strict";var o=n("FWC9"),r=n("DUvi"),i=n("y3WP"),a=o.boolean,s=o.overloadedBoolean,l=o.booleanish,c=o.number,u=o.spaceSeparated,d=o.commaSeparated;e.exports=r({space:"html",attributes:{acceptcharset:"accept-charset",classname:"class",htmlfor:"for",httpequiv:"http-equiv"},transform:i,mustUseProperty:["checked","multiple","muted","selected"],properties:{abbr:null,accept:d,acceptCharset:u,accessKey:u,action:null,allow:null,allowFullScreen:a,allowPaymentRequest:a,allowUserMedia:a,alt:null,as:null,async:a,autoCapitalize:null,autoComplete:u,autoFocus:a,autoPlay:a,capture:a,charSet:null,checked:a,cite:null,className:u,cols:c,colSpan:null,content:null,contentEditable:l,controls:a,controlsList:u,coords:c|d,crossOrigin:null,data:null,dateTime:null,decoding:null,default:a,defer:a,dir:null,dirName:null,disabled:a,download:s,draggable:l,encType:null,enterKeyHint:null,form:null,formAction:null,formEncType:null,formMethod:null,formNoValidate:a,formTarget:null,headers:u,height:c,hidden:a,high:c,href:null,hrefLang:null,htmlFor:u,httpEquiv:u,id:null,imageSizes:null,imageSrcSet:d,inputMode:null,integrity:null,is:null,isMap:a,itemId:null,itemProp:u,itemRef:u,itemScope:a,itemType:u,kind:null,label:null,lang:null,language:null,list:null,loading:null,loop:a,low:c,manifest:null,max:null,maxLength:c,media:null,method:null,min:null,minLength:c,multiple:a,muted:a,name:null,nonce:null,noModule:a,noValidate:a,onAbort:null,onAfterPrint:null,onAuxClick:null,onBeforePrint:null,onBeforeUnload:null,onBlur:null,onCancel:null,onCanPlay:null,onCanPlayThrough:null,onChange:null,onClick:null,onClose:null,onContextMenu:null,onCopy:null,onCueChange:null,onCut:null,onDblClick:null,onDrag:null,onDragEnd:null,onDragEnter:null,onDragExit:null,onDragLeave:null,onDragOver:null,onDragStart:null,onDrop:null,onDurationChange:null,onEmptied:null,onEnded:null,onError:null,onFocus:null,onFormData:null,onHashChange:null,onInput:null,onInvalid:null,onKeyDown:null,onKeyPress:null,onKeyUp:null,onLanguageChange:null,onLoad:null,onLoadedData:null,onLoadedMetadata:null,onLoadEnd:null,onLoadStart:null,onMessage:null,onMessageError:null,onMouseDown:null,onMouseEnter:null,onMouseLeave:null,onMouseMove:null,onMouseOut:null,onMouseOver:null,onMouseUp:null,onOffline:null,onOnline:null,onPageHide:null,onPageShow:null,onPaste:null,onPause:null,onPlay:null,onPlaying:null,onPopState:null,onProgress:null,onRateChange:null,onRejectionHandled:null,onReset:null,onResize:null,onScroll:null,onSecurityPolicyViolation:null,onSeeked:null,onSeeking:null,onSelect:null,onSlotChange:null,onStalled:null,onStorage:null,onSubmit:null,onSuspend:null,onTimeUpdate:null,onToggle:null,onUnhandledRejection:null,onUnload:null,onVolumeChange:null,onWaiting:null,onWheel:null,open:a,optimum:c,pattern:null,ping:u,placeholder:null,playsInline:a,poster:null,preload:null,readOnly:a,referrerPolicy:null,rel:u,required:a,reversed:a,rows:c,rowSpan:c,sandbox:u,scope:null,scoped:a,seamless:a,selected:a,shape:null,size:c,sizes:null,slot:null,span:c,spellCheck:l,src:null,srcDoc:null,srcLang:null,srcSet:d,start:c,step:null,style:null,tabIndex:c,target:null,title:null,translate:null,type:null,typeMustMatch:a,useMap:null,value:l,width:c,wrap:null,align:null,aLink:null,archive:u,axis:null,background:null,bgColor:null,border:c,borderColor:null,bottomMargin:c,cellPadding:null,cellSpacing:null,char:null,charOff:null,classId:null,clear:null,code:null,codeBase:null,codeType:null,color:null,compact:a,declare:a,event:null,face:null,frame:null,frameBorder:null,hSpace:c,leftMargin:c,link:null,longDesc:null,lowSrc:null,marginHeight:c,marginWidth:c,noResize:a,noHref:a,noShade:a,noWrap:a,object:null,profile:null,prompt:null,rev:null,rightMargin:c,rules:null,scheme:null,scrolling:l,standby:null,summary:null,text:null,topMargin:c,valueType:null,version:null,vAlign:null,vLink:null,vSpace:c,allowTransparency:null,autoCorrect:null,autoSave:null,disablePictureInPicture:a,disableRemotePlayback:a,prefix:null,property:null,results:c,security:null,unselectable:null}})},RjOF:function(e,t,n){"use strict";var o,r="";e.exports=function(e,t){if("string"!==typeof e)throw new TypeError("expected a string");if(1===t)return e;if(2===t)return e+e;var n=e.length*t;if(o!==e||"undefined"===typeof o)o=e,r="";else if(r.length>=n)return r.substr(0,n);for(;n>r.length&&t>1;)1&t&&(r+=e),t>>=1,e+=e;return r=(r+=e).substr(0,n)}},RrMp:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=n("+Pz5"),r=n("dAEq"),i=n("Atxm"),a=n("kQY0"),s=n("Ue0c"),l=n("42yH"),c=n("PSll"),u=n("NNOl"),d=n("/apb"),p=n("HxRD"),f=n("gyVW"),h=n("CUvb"),m=n("KynH"),g=n("3iNw"),T=n("OaLn"),E=n("7enW"),b=n("Ie4K"),A=n("escJ"),k=n("5bit"),y=n("Iv+h"),_=n("33Zt"),S={42:k,43:k,45:k,48:k,49:k,50:k,51:k,52:k,53:k,54:k,55:k,56:k,57:k,62:a},C={91:p},x={"-2":u,"-1":u,32:u},v={35:h,42:_,45:[y,_],60:m,61:y,95:_,96:c,126:c},O={38:l,92:s},N={"-5":A,"-4":A,"-3":A,33:E,38:l,42:r,60:[i,g],91:b,92:[f,s],93:T,95:r,96:d},M={null:[r,o.resolver]};t.contentInitial=C,t.disable={null:[]},t.document=S,t.flow=v,t.flowInitial=x,t.insideSpan=M,t.string=O,t.text=N},Ry5F:function(e,t,n){"use strict";e.exports=function(e,t){var n,a,s,l,c,u=t.children,d=u.length,p=t.align||[],f=p.length,h=[];for(;d--;){for(a=u[d].children,l=0===d?"th":"td",n=f||a.length,s=[];n--;)c=a[n],s[n]=e(c,l,{align:p[n]},c?i(e,c):[]);h[d]=e(u[d],"tr",r(s,!0))}return e(t,"table",r([e(h[0].position,"thead",r([h[0]],!0))].concat(h[1]?e({start:o.start(h[1]),end:o.end(h[h.length-1])},"tbody",r(h.slice(1),!0)):[]),!0))};var o=n("BfbN"),r=n("Dvol"),i=n("WFsM")},ScQ6:function(e,t,n){e.exports=function(e,t,n){var l,c,u,d=r(n),p=i(n);t&&t.ordered&&(d=(t.start>-1?t.start:1)+(!1===n.options.incrementListMarker?0:t.children.indexOf(e))+".");l=d.length+1,("tab"===p||"mixed"===p&&(t&&t.spread||e.spread))&&(l=4*Math.ceil(l/4));return u=n.enter("listItem"),c=s(a(e,n),(function(e,t,n){if(t)return(n?"":o(" ",l))+e;return(n?d:d+o(" ",l-d.length))+e})),u(),c};var o=n("RjOF"),r=n("/cIb"),i=n("NfWH"),a=n("B5Lt"),s=n("deF/")},T0BQ:function(e,t,n){"use strict";var o=n("NOby");e.exports=function(e){return o({},e)}},T0f4:function(e,t){function n(t){return e.exports=n=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},n(t)}e.exports=n},TDhK:function(e,t,n){"use strict";var o={}.hasOwnProperty;e.exports=o},THrT:function(e,t,n){e.exports=n("qOO9")},TTG4:function(e,t,n){"use strict";t.parse=function(e){var t=String(e||"").trim();return""===t?[]:t.split(o)},t.stringify=function(e){return e.join(" ").trim()};var o=/[ \t\n\r\f]+/g},Tauu:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{color:"#a9b7c6",fontFamily:"Consolas, Monaco, 'Andale Mono', monospace",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#a9b7c6",fontFamily:"Consolas, Monaco, 'Andale Mono', monospace",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",background:"#2b2b2b"},'pre[class*="language-"]::-moz-selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'pre[class*="language-"] ::-moz-selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'code[class*="language-"]::-moz-selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'code[class*="language-"] ::-moz-selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'pre[class*="language-"]::selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'pre[class*="language-"] ::selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'code[class*="language-"]::selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'code[class*="language-"] ::selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},':not(pre) > code[class*="language-"]':{background:"#2b2b2b",padding:".1em",borderRadius:".3em"},comment:{color:"#808080"},prolog:{color:"#808080"},cdata:{color:"#808080"},delimiter:{color:"#cc7832"},boolean:{color:"#cc7832"},keyword:{color:"#cc7832"},selector:{color:"#cc7832"},important:{color:"#cc7832"},atrule:{color:"#cc7832"},operator:{color:"#a9b7c6"},punctuation:{color:"#a9b7c6"},"attr-name":{color:"#a9b7c6"},tag:{color:"#e8bf6a"},"tag .punctuation":{color:"#e8bf6a"},doctype:{color:"#e8bf6a"},builtin:{color:"#e8bf6a"},entity:{color:"#6897bb"},number:{color:"#6897bb"},symbol:{color:"#6897bb"},property:{color:"#9876aa"},constant:{color:"#9876aa"},variable:{color:"#9876aa"},string:{color:"#6a8759"},char:{color:"#6a8759"},"attr-value":{color:"#a5c261"},"attr-value .punctuation":{color:"#a5c261"},"attr-value .punctuation:first-child":{color:"#a9b7c6"},url:{color:"#287bde",textDecoration:"underline"},function:{color:"#ffc66d"},regex:{background:"#364135"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},inserted:{background:"#294436"},deleted:{background:"#484a4a"},"code.language-css .token.property":{color:"#a9b7c6"},"code.language-css .token.property + .token.punctuation":{color:"#a9b7c6"},"code.language-css .token.id":{color:"#ffc66d"},"code.language-css .token.selector > .token.class":{color:"#ffc66d"},"code.language-css .token.selector > .token.attribute":{color:"#ffc66d"},"code.language-css .token.selector > .token.pseudo-class":{color:"#ffc66d"},"code.language-css .token.selector > .token.pseudo-element":{color:"#ffc66d"}}},TqRt:function(e,t){e.exports=function(e){return e&&e.__esModule?e:{default:e}},e.exports.__esModule=!0,e.exports.default=e.exports},U6jy:function(e,t){e.exports=function(){for(var e={},t=0;t0;t--)e.onItemPop(this.items[t]);t.popAllUpToHtmlElement.call(this)},remove(n){e.onItemPop(this.current),t.remove.call(this,n)}}}}},Ue0c:function(e,t,n){"use strict";var o=n("qF1g"),r={name:"characterEscape",tokenize:function(e,t,n){return function(t){return e.enter("characterEscape"),e.enter("escapeMarker"),e.consume(t),e.exit("escapeMarker"),r};function r(r){return o(r)?(e.enter("characterEscapeValue"),e.consume(r),e.exit("characterEscapeValue"),e.exit("characterEscape"),t):n(r)}}};e.exports=r},UhtW:function(e,t){e.exports=function e(t,n){var o,r=-1;if(n.extensions)for(;++ra?0:a+t:t>a?a:t,n=n>0?n:0,r.length<1e4)(i=Array.from(r)).unshift(t,n),o.apply(e,i);else for(n&&o.apply(e,[t,n]);s code[class*="language-"]':{background:"#272822",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"#8292a2"},prolog:{color:"#8292a2"},doctype:{color:"#8292a2"},cdata:{color:"#8292a2"},punctuation:{color:"#f8f8f2"},namespace:{Opacity:".7"},property:{color:"#f92672"},tag:{color:"#f92672"},constant:{color:"#f92672"},symbol:{color:"#f92672"},deleted:{color:"#f92672"},boolean:{color:"#ae81ff"},number:{color:"#ae81ff"},selector:{color:"#a6e22e"},"attr-name":{color:"#a6e22e"},string:{color:"#a6e22e"},char:{color:"#a6e22e"},builtin:{color:"#a6e22e"},inserted:{color:"#a6e22e"},operator:{color:"#f8f8f2"},entity:{color:"#f8f8f2",cursor:"help"},url:{color:"#f8f8f2"},".language-css .token.string":{color:"#f8f8f2"},".style .token.string":{color:"#f8f8f2"},variable:{color:"#f8f8f2"},atrule:{color:"#e6db74"},"attr-value":{color:"#e6db74"},function:{color:"#e6db74"},"class-name":{color:"#e6db74"},keyword:{color:"#66d9ef"},regex:{color:"#fd971f"},important:{color:"#fd971f",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}}},WniP:function(e,t,n){"use strict";e.exports=function(e,t){var n,i,a,s=t.referenceType,l="]";"collapsed"===s?l+="[]":"full"===s&&(l+="["+(t.label||t.identifier)+"]");if("imageReference"===t.type)return o("text","!["+t.alt+l);n=r(e,t),(i=n[0])&&"text"===i.type?i.value="["+i.value:n.unshift(o("text","["));(a=n[n.length-1])&&"text"===a.type?a.value+=l:n.push(o("text",l));return n};var o=n("vUGn"),r=n("WFsM")},WtKE:function(e,t,n){"use strict";var o;e.exports=function(e){var t,n="&"+e+";";if((o=o||document.createElement("i")).innerHTML=n,59===(t=o.textContent).charCodeAt(t.length-1)&&"semi"!==e)return!1;return t!==n&&t}},Xuae:function(e,t,n){"use strict";var o=n("mPvQ"),r=n("/GRZ"),i=n("i2R6"),a=(n("qXWd"),n("48fX")),s=n("tCBg"),l=n("T0f4");function c(e){var t=function(){if("undefined"===typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"===typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,o=l(e);if(t){var r=l(this).constructor;n=Reflect.construct(o,arguments,r)}else n=o.apply(this,arguments);return s(this,n)}}t.__esModule=!0,t.default=void 0;var u=n("q1tI"),d=function(e){a(n,e);var t=c(n);function n(e){var i;return r(this,n),(i=t.call(this,e))._hasHeadManager=void 0,i.emitChange=function(){i._hasHeadManager&&i.props.headManager.updateHead(i.props.reduceComponentsToState(o(i.props.headManager.mountedInstances),i.props))},i._hasHeadManager=i.props.headManager&&i.props.headManager.mountedInstances,i}return i(n,[{key:"componentDidMount",value:function(){this._hasHeadManager&&this.props.headManager.mountedInstances.add(this),this.emitChange()}},{key:"componentDidUpdate",value:function(){this.emitChange()}},{key:"componentWillUnmount",value:function(){this._hasHeadManager&&this.props.headManager.mountedInstances.delete(this),this.emitChange()}},{key:"render",value:function(){return null}}]),n}(u.Component);t.default=d},"Y+Mq":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#24242e",color:"#767693"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#24242e",color:"#767693",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#5151e6"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#5151e6"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#5151e6"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#5151e6"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#5151e6"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#5151e6"},'code[class*="language-"]::selection':{textShadow:"none",background:"#5151e6"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#5151e6"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#5b5b76"},prolog:{color:"#5b5b76"},doctype:{color:"#5b5b76"},cdata:{color:"#5b5b76"},punctuation:{color:"#5b5b76"},namespace:{Opacity:".7"},tag:{color:"#dd672c"},operator:{color:"#dd672c"},number:{color:"#dd672c"},property:{color:"#767693"},function:{color:"#767693"},"tag-id":{color:"#ebebff"},selector:{color:"#ebebff"},"atrule-id":{color:"#ebebff"},"code.language-javascript":{color:"#aaaaca"},"attr-name":{color:"#aaaaca"},"code.language-css":{color:"#fe8c52"},"code.language-scss":{color:"#fe8c52"},boolean:{color:"#fe8c52"},string:{color:"#fe8c52"},entity:{color:"#fe8c52",cursor:"help"},url:{color:"#fe8c52"},".language-css .token.string":{color:"#fe8c52"},".language-scss .token.string":{color:"#fe8c52"},".style .token.string":{color:"#fe8c52"},"attr-value":{color:"#fe8c52"},keyword:{color:"#fe8c52"},control:{color:"#fe8c52"},directive:{color:"#fe8c52"},unit:{color:"#fe8c52"},statement:{color:"#fe8c52"},regex:{color:"#fe8c52"},atrule:{color:"#fe8c52"},placeholder:{color:"#fe8c52"},variable:{color:"#fe8c52"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #ebebff",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#aaaaca"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid #7676f4",OutlineOffset:".4em"},".line-numbers .line-numbers-rows":{borderRightColor:"#262631"},".line-numbers-rows > span:before":{color:"#393949"},".line-highlight":{background:"linear-gradient(to right, rgba(221, 103, 44, 0.2) 70%, rgba(221, 103, 44, 0))"}}},"Y/Y8":function(e,t,n){"use strict";const o=n("HwUZ"),r=n("zpDW"),i=n("lb9w"),a=n("UTAp"),s=n("UwWT").TAG_NAMES;e.exports=class extends o{constructor(e){super(e),this.parser=e,this.treeAdapter=this.parser.treeAdapter,this.posTracker=null,this.lastStartTagToken=null,this.lastFosterParentingLocation=null,this.currentToken=null}_setStartLocation(e){let t=null;this.lastStartTagToken&&(t=Object.assign({},this.lastStartTagToken.location),t.startTag=this.lastStartTagToken.location),this.treeAdapter.setNodeSourceCodeLocation(e,t)}_setEndLocation(e,t){if(this.treeAdapter.getNodeSourceCodeLocation(e)&&t.location){const n=t.location,o=this.treeAdapter.getTagName(e),i={};t.type===r.END_TAG_TOKEN&&o===t.tagName?(i.endTag=Object.assign({},n),i.endLine=n.endLine,i.endCol=n.endCol,i.endOffset=n.endOffset):(i.endLine=n.startLine,i.endCol=n.startCol,i.endOffset=n.startOffset),this.treeAdapter.updateNodeSourceCodeLocation(e,i)}}_getOverriddenMethods(e,t){return{_bootstrap(n,r){t._bootstrap.call(this,n,r),e.lastStartTagToken=null,e.lastFosterParentingLocation=null,e.currentToken=null;const s=o.install(this.tokenizer,i);e.posTracker=s.posTracker,o.install(this.openElements,a,{onItemPop:function(t){e._setEndLocation(t,e.currentToken)}})},_runParsingLoop(n){t._runParsingLoop.call(this,n);for(let t=this.openElements.stackTop;t>=0;t--)e._setEndLocation(this.openElements.items[t],e.currentToken)},_processTokenInForeignContent(n){e.currentToken=n,t._processTokenInForeignContent.call(this,n)},_processToken(n){e.currentToken=n,t._processToken.call(this,n);if(n.type===r.END_TAG_TOKEN&&(n.tagName===s.HTML||n.tagName===s.BODY&&this.openElements.hasInScope(s.BODY)))for(let t=this.openElements.stackTop;t>=0;t--){const o=this.openElements.items[t];if(this.treeAdapter.getTagName(o)===n.tagName){e._setEndLocation(o,n);break}}},_setDocumentType(e){t._setDocumentType.call(this,e);const n=this.treeAdapter.getChildNodes(this.document),o=n.length;for(let t=0;tt;)a.containerState=c[i][1],c[i][0].exit.call(a,e);c.length=t}},s={tokenize:function(e,t,n){return r(e,e.attempt(this.parser.constructs.document,t,n),"linePrefix",this.parser.constructs.disable.null.indexOf("codeIndented")>-1?void 0:4)}},l={tokenize:function(e,t,n){return r(e,e.lazy(this.parser.constructs.flow,t,n),"linePrefix",this.parser.constructs.disable.null.indexOf("codeIndented")>-1?void 0:4)}};t.tokenize=a},YpxX:function(e,t,n){"use strict";const o=n("pRQB"),r=n("2l2D"),i=o.CODE_POINTS;e.exports=class{constructor(){this.html=null,this.pos=-1,this.lastGapPos=-1,this.lastCharPos=-1,this.gapStack=[],this.skipNextNewLine=!1,this.lastChunkWritten=!1,this.endOfChunkHit=!1,this.bufferWaterline=65536}_err(){}_addGap(){this.gapStack.push(this.lastGapPos),this.lastGapPos=this.pos}_processSurrogate(e){if(this.pos!==this.lastCharPos){const t=this.html.charCodeAt(this.pos+1);if(o.isSurrogatePair(t))return this.pos++,this._addGap(),o.getSurrogatePairCodePoint(e,t)}else if(!this.lastChunkWritten)return this.endOfChunkHit=!0,i.EOF;return this._err(r.surrogateInInputStream),e}dropParsedChunk(){this.pos>this.bufferWaterline&&(this.lastCharPos-=this.pos,this.html=this.html.substring(this.pos),this.pos=0,this.lastGapPos=-1,this.gapStack=[])}write(e,t){this.html?this.html+=e:this.html=e,this.lastCharPos=this.html.length-1,this.endOfChunkHit=!1,this.lastChunkWritten=t}insertHtmlAtCurrentPos(e){this.html=this.html.substring(0,this.pos+1)+e+this.html.substring(this.pos+1,this.html.length),this.lastCharPos=this.html.length-1,this.endOfChunkHit=!1}advance(){if(this.pos++,this.pos>this.lastCharPos)return this.endOfChunkHit=!this.lastChunkWritten,i.EOF;let e=this.html.charCodeAt(this.pos);if(this.skipNextNewLine&&e===i.LINE_FEED)return this.skipNextNewLine=!1,this._addGap(),this.advance();if(e===i.CARRIAGE_RETURN)return this.skipNextNewLine=!0,i.LINE_FEED;this.skipNextNewLine=!1,o.isSurrogate(e)&&(e=this._processSurrogate(e));return e>31&&e<127||e===i.LINE_FEED||e===i.CARRIAGE_RETURN||e>159&&e<64976||this._checkForProblematicCharacters(e),e}_checkForProblematicCharacters(e){o.isControlCodePoint(e)?this._err(r.controlCharacterInInputStream):o.isUndefinedCodePoint(e)&&this._err(r.noncharacterInInputStream)}retreat(){this.pos===this.lastGapPos&&(this.lastGapPos=this.gapStack.pop(),this.pos--),this.pos--}}},Z0IX:function(e,t,n){"use strict";var o=n("EIjK");e.exports=function(e,t){var n=parseInt(e,t);return n<9||11===n||n>13&&n<32||n>126&&n<160||n>55295&&n<57344||n>64975&&n<65008||65535===(65535&n)||65534===(65535&n)||n>1114111?"\ufffd":o(n)}},ZOei:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{color:"#f8f8f2",background:"none",fontFamily:"\"Fira Code\", Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#f8f8f2",background:"#2E3440",fontFamily:"\"Fira Code\", Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",borderRadius:"0.3em"},':not(pre) > code[class*="language-"]':{background:"#2E3440",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"#636f88"},prolog:{color:"#636f88"},doctype:{color:"#636f88"},cdata:{color:"#636f88"},punctuation:{color:"#81A1C1"},".namespace":{Opacity:".7"},property:{color:"#81A1C1"},tag:{color:"#81A1C1"},constant:{color:"#81A1C1"},symbol:{color:"#81A1C1"},deleted:{color:"#81A1C1"},number:{color:"#B48EAD"},boolean:{color:"#81A1C1"},selector:{color:"#A3BE8C"},"attr-name":{color:"#A3BE8C"},string:{color:"#A3BE8C"},char:{color:"#A3BE8C"},builtin:{color:"#A3BE8C"},inserted:{color:"#A3BE8C"},operator:{color:"#81A1C1"},entity:{color:"#81A1C1",cursor:"help"},url:{color:"#81A1C1"},".language-css .token.string":{color:"#81A1C1"},".style .token.string":{color:"#81A1C1"},variable:{color:"#81A1C1"},atrule:{color:"#88C0D0"},"attr-value":{color:"#88C0D0"},function:{color:"#88C0D0"},"class-name":{color:"#88C0D0"},keyword:{color:"#81A1C1"},regex:{color:"#EBCB8B"},important:{color:"#EBCB8B",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}}},"ZTJ+":function(e,t,n){"use strict";function o(){return null}e.exports={blockquote:n("iX4R"),break:n("aRXn"),code:n("GjEx"),delete:n("/Fgc"),emphasis:n("ktEA"),footnoteReference:n("/BR8"),footnote:n("nbFU"),heading:n("lQDV"),html:n("fFcG"),imageReference:n("rRyo"),image:n("I3zf"),inlineCode:n("M3+Y"),linkReference:n("W+EG"),link:n("/ulP"),listItem:n("bS0g"),list:n("pI64"),paragraph:n("1rba"),root:n("N+Fa"),strong:n("CndC"),table:n("Ry5F"),text:n("KvLk"),thematicBreak:n("WV47"),toml:o,yaml:o,definition:o,footnoteDefinition:o}},Zasy:function(e,t,n){"use strict";function o(e){if(null==e)return r;if("string"===typeof e)return function(e){return t;function t(t){return Boolean(t&&t.type===e)}}(e);if("object"===typeof e)return"length"in e?function(e){var t=[],n=-1;for(;++n code[class*="language-"]':{whiteSpace:"normal",borderRadius:"0.2em",padding:"0.1em"},".language-css > code":{color:"#f76d47"},".language-sass > code":{color:"#f76d47"},".language-scss > code":{color:"#f76d47"},'[class*="language-"] .namespace':{Opacity:"0.7"},atrule:{color:"#7c4dff"},"attr-name":{color:"#39adb5"},"attr-value":{color:"#f6a434"},attribute:{color:"#f6a434"},boolean:{color:"#7c4dff"},builtin:{color:"#39adb5"},cdata:{color:"#39adb5"},char:{color:"#39adb5"},class:{color:"#39adb5"},"class-name":{color:"#6182b8"},comment:{color:"#aabfc9"},constant:{color:"#7c4dff"},deleted:{color:"#e53935"},doctype:{color:"#aabfc9"},entity:{color:"#e53935"},function:{color:"#7c4dff"},hexcode:{color:"#f76d47"},id:{color:"#7c4dff",fontWeight:"bold"},important:{color:"#7c4dff",fontWeight:"bold"},inserted:{color:"#39adb5"},keyword:{color:"#7c4dff"},number:{color:"#f76d47"},operator:{color:"#39adb5"},prolog:{color:"#aabfc9"},property:{color:"#39adb5"},"pseudo-class":{color:"#f6a434"},"pseudo-element":{color:"#f6a434"},punctuation:{color:"#39adb5"},regex:{color:"#6182b8"},selector:{color:"#e53935"},string:{color:"#f6a434"},symbol:{color:"#7c4dff"},tag:{color:"#e53935"},unit:{color:"#f76d47"},url:{color:"#e53935"},variable:{color:"#e53935"}}},b9um:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{MozTabSize:"2",OTabSize:"2",tabSize:"2",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",whiteSpace:"pre-wrap",wordWrap:"normal",fontFamily:'Menlo, Monaco, "Courier New", monospace',fontSize:"14px",color:"#76d9e6",textShadow:"none"},'pre[class*="language-"]':{MozTabSize:"2",OTabSize:"2",tabSize:"2",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",whiteSpace:"pre-wrap",wordWrap:"normal",fontFamily:'Menlo, Monaco, "Courier New", monospace',fontSize:"14px",color:"#76d9e6",textShadow:"none",background:"#2a2a2a",padding:"15px",borderRadius:"4px",border:"1px solid #e1e1e8",overflow:"auto",position:"relative"},'pre > code[class*="language-"]':{fontSize:"1em"},':not(pre) > code[class*="language-"]':{background:"#2a2a2a",padding:"0.15em 0.2em 0.05em",borderRadius:".3em",border:"0.13em solid #7a6652",boxShadow:"1px 1px 0.3em -0.1em #000 inset"},'pre[class*="language-"] code':{whiteSpace:"pre",display:"block"},namespace:{Opacity:".7"},comment:{color:"#6f705e"},prolog:{color:"#6f705e"},doctype:{color:"#6f705e"},cdata:{color:"#6f705e"},operator:{color:"#a77afe"},boolean:{color:"#a77afe"},number:{color:"#a77afe"},"attr-name":{color:"#e6d06c"},string:{color:"#e6d06c"},entity:{color:"#e6d06c",cursor:"help"},url:{color:"#e6d06c"},".language-css .token.string":{color:"#e6d06c"},".style .token.string":{color:"#e6d06c"},selector:{color:"#a6e22d"},inserted:{color:"#a6e22d"},atrule:{color:"#ef3b7d"},"attr-value":{color:"#ef3b7d"},keyword:{color:"#ef3b7d"},important:{color:"#ef3b7d",fontWeight:"bold"},deleted:{color:"#ef3b7d"},regex:{color:"#76d9e6"},statement:{color:"#76d9e6",fontWeight:"bold"},placeholder:{color:"#fff"},variable:{color:"#fff"},bold:{fontWeight:"bold"},punctuation:{color:"#bebec5"},italic:{fontStyle:"italic"},"code.language-markup":{color:"#f9f9f9"},"code.language-markup .token.tag":{color:"#ef3b7d"},"code.language-markup .token.attr-name":{color:"#a6e22d"},"code.language-markup .token.attr-value":{color:"#e6d06c"},"code.language-markup .token.style":{color:"#76d9e6"},"code.language-markup .token.script":{color:"#76d9e6"},"code.language-markup .token.script .token.keyword":{color:"#76d9e6"},'pre[class*="language-"][data-line]':{position:"relative",padding:"1em 0 1em 3em"},"pre[data-line] .line-highlight":{position:"absolute",left:"0",right:"0",padding:"0",marginTop:"1em",background:"rgba(255, 255, 255, 0.08)",pointerEvents:"none",lineHeight:"inherit",whiteSpace:"pre"},"pre[data-line] .line-highlight:before":{content:"attr(data-start)",position:"absolute",top:".4em",left:".6em",minWidth:"1em",padding:"0.2em 0.5em",backgroundColor:"rgba(255, 255, 255, 0.4)",color:"black",font:"bold 65%/1 sans-serif",height:"1em",lineHeight:"1em",textAlign:"center",borderRadius:"999px",textShadow:"none",boxShadow:"0 1px 1px rgba(255, 255, 255, 0.7)"},"pre[data-line] .line-highlight[data-end]:after":{content:"attr(data-end)",position:"absolute",top:"auto",left:".6em",minWidth:"1em",padding:"0.2em 0.5em",backgroundColor:"rgba(255, 255, 255, 0.4)",color:"black",font:"bold 65%/1 sans-serif",height:"1em",lineHeight:"1em",textAlign:"center",borderRadius:"999px",textShadow:"none",boxShadow:"0 1px 1px rgba(255, 255, 255, 0.7)",bottom:".4em"}}},bAF5:function(e,t,n){"use strict";e.exports=function(e){return e.toLowerCase()}},bFEn:function(e,t,n){"use strict";var o=n("7+hk"),r=n("rS7C")(o,"div");r.displayName="html",e.exports=r},bHgY:function(e,t,n){"use strict";var o=n("FWC9"),r=n("DUvi"),i=o.booleanish,a=o.number,s=o.spaceSeparated;e.exports=r({transform:function(e,t){return"role"===t?t:"aria-"+t.slice(4).toLowerCase()},properties:{ariaActiveDescendant:null,ariaAtomic:i,ariaAutoComplete:null,ariaBusy:i,ariaChecked:i,ariaColCount:a,ariaColIndex:a,ariaColSpan:a,ariaControls:s,ariaCurrent:null,ariaDescribedBy:s,ariaDetails:null,ariaDisabled:i,ariaDropEffect:s,ariaErrorMessage:null,ariaExpanded:i,ariaFlowTo:s,ariaGrabbed:i,ariaHasPopup:null,ariaHidden:i,ariaInvalid:null,ariaKeyShortcuts:null,ariaLabel:null,ariaLabelledBy:s,ariaLevel:a,ariaLive:null,ariaModal:i,ariaMultiLine:i,ariaMultiSelectable:i,ariaOrientation:null,ariaOwns:s,ariaPlaceholder:null,ariaPosInSet:a,ariaPressed:i,ariaReadOnly:i,ariaRelevant:null,ariaRequired:i,ariaRoleDescription:s,ariaRowCount:a,ariaRowIndex:a,ariaRowSpan:a,ariaSelected:i,ariaSetSize:a,ariaSort:null,ariaValueMax:a,ariaValueMin:a,ariaValueNow:a,ariaValueText:null,role:null}})},bS0g:function(e,t,n){"use strict";e.exports=function(e,t,n){var a,s,l,c=r(e,t),u=c[0],d=n?function(e){var t=e.spread,n=e.children,o=n.length,r=-1;for(;!t&&++r0&&u.children.unshift(o("text"," ")),u.children.unshift(e(null,"input",{type:"checkbox",checked:t.checked,disabled:!0})),p.className=["task-list-item"]);a=c.length,s=-1;for(;++s1:t}},bWFg:function(e,t,n){"use strict";e.exports=e=>{if("string"!==typeof e)throw new TypeError("Expected a string");return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}},bwJB:function(e,t,n){"use strict";e.exports=e=>{if("[object Object]"!==Object.prototype.toString.call(e))return!1;const t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}},c2c2:function(e,t,n){"use strict";var o=n("TqRt");Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"coy",{enumerable:!0,get:function(){return r.default}}),Object.defineProperty(t,"dark",{enumerable:!0,get:function(){return i.default}}),Object.defineProperty(t,"funky",{enumerable:!0,get:function(){return a.default}}),Object.defineProperty(t,"okaidia",{enumerable:!0,get:function(){return s.default}}),Object.defineProperty(t,"solarizedlight",{enumerable:!0,get:function(){return l.default}}),Object.defineProperty(t,"tomorrow",{enumerable:!0,get:function(){return c.default}}),Object.defineProperty(t,"twilight",{enumerable:!0,get:function(){return u.default}}),Object.defineProperty(t,"prism",{enumerable:!0,get:function(){return d.default}}),Object.defineProperty(t,"a11yDark",{enumerable:!0,get:function(){return p.default}}),Object.defineProperty(t,"atomDark",{enumerable:!0,get:function(){return f.default}}),Object.defineProperty(t,"base16AteliersulphurpoolLight",{enumerable:!0,get:function(){return h.default}}),Object.defineProperty(t,"cb",{enumerable:!0,get:function(){return m.default}}),Object.defineProperty(t,"darcula",{enumerable:!0,get:function(){return g.default}}),Object.defineProperty(t,"dracula",{enumerable:!0,get:function(){return T.default}}),Object.defineProperty(t,"duotoneDark",{enumerable:!0,get:function(){return E.default}}),Object.defineProperty(t,"duotoneEarth",{enumerable:!0,get:function(){return b.default}}),Object.defineProperty(t,"duotoneForest",{enumerable:!0,get:function(){return A.default}}),Object.defineProperty(t,"duotoneLight",{enumerable:!0,get:function(){return k.default}}),Object.defineProperty(t,"duotoneSea",{enumerable:!0,get:function(){return y.default}}),Object.defineProperty(t,"duotoneSpace",{enumerable:!0,get:function(){return _.default}}),Object.defineProperty(t,"ghcolors",{enumerable:!0,get:function(){return S.default}}),Object.defineProperty(t,"hopscotch",{enumerable:!0,get:function(){return C.default}}),Object.defineProperty(t,"materialDark",{enumerable:!0,get:function(){return x.default}}),Object.defineProperty(t,"materialLight",{enumerable:!0,get:function(){return v.default}}),Object.defineProperty(t,"materialOceanic",{enumerable:!0,get:function(){return O.default}}),Object.defineProperty(t,"nord",{enumerable:!0,get:function(){return N.default}}),Object.defineProperty(t,"pojoaque",{enumerable:!0,get:function(){return M.default}}),Object.defineProperty(t,"shadesOfPurple",{enumerable:!0,get:function(){return w.default}}),Object.defineProperty(t,"synthwave84",{enumerable:!0,get:function(){return R.default}}),Object.defineProperty(t,"vs",{enumerable:!0,get:function(){return I.default}}),Object.defineProperty(t,"vscDarkPlus",{enumerable:!0,get:function(){return L.default}}),Object.defineProperty(t,"xonokai",{enumerable:!0,get:function(){return P.default}});var r=o(n("61xa")),i=o(n("PCRY")),a=o(n("H0fq")),s=o(n("WVFU")),l=o(n("fL8H")),c=o(n("wGQB")),u=o(n("iy38")),d=o(n("6MAg")),p=o(n("yix/")),f=o(n("N4m7")),h=o(n("mAwW")),m=o(n("38Ti")),g=o(n("Tauu")),T=o(n("slJw")),E=o(n("007m")),b=o(n("kWEd")),A=o(n("9891")),k=o(n("4+h/")),y=o(n("++Eq")),_=o(n("Y+Mq")),S=o(n("GVPn")),C=o(n("HbD6")),x=o(n("vjtj")),v=o(n("auM2")),O=o(n("2uWR")),N=o(n("ZOei")),M=o(n("fe/W")),w=o(n("otMa")),R=o(n("BYRM")),I=o(n("C7Ve")),L=o(n("u0PD")),P=o(n("b9um"))},c6jy:function(e,t){e.exports=function(e){return null!=e&&null!=e.constructor&&"function"===typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}},cRLj:function(e,t,n){"use strict";e.exports=new Uint16Array([4,52,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,106,303,412,810,1432,1701,1796,1987,2114,2360,2420,2484,3170,3251,4140,4393,4575,4610,5106,5512,5728,6117,6274,6315,6345,6427,6516,7002,7910,8733,9323,9870,10170,10631,10893,11318,11386,11467,12773,13092,14474,14922,15448,15542,16419,17666,18166,18611,19004,19095,19298,19397,4,16,69,77,97,98,99,102,103,108,109,110,111,112,114,115,116,117,140,150,158,169,176,194,199,210,216,222,226,242,256,266,283,294,108,105,103,5,198,1,59,148,1,198,80,5,38,1,59,156,1,38,99,117,116,101,5,193,1,59,167,1,193,114,101,118,101,59,1,258,4,2,105,121,182,191,114,99,5,194,1,59,189,1,194,59,1,1040,114,59,3,55349,56580,114,97,118,101,5,192,1,59,208,1,192,112,104,97,59,1,913,97,99,114,59,1,256,100,59,1,10835,4,2,103,112,232,237,111,110,59,1,260,102,59,3,55349,56632,112,108,121,70,117,110,99,116,105,111,110,59,1,8289,105,110,103,5,197,1,59,264,1,197,4,2,99,115,272,277,114,59,3,55349,56476,105,103,110,59,1,8788,105,108,100,101,5,195,1,59,292,1,195,109,108,5,196,1,59,301,1,196,4,8,97,99,101,102,111,114,115,117,321,350,354,383,388,394,400,405,4,2,99,114,327,336,107,115,108,97,115,104,59,1,8726,4,2,118,119,342,345,59,1,10983,101,100,59,1,8966,121,59,1,1041,4,3,99,114,116,362,369,379,97,117,115,101,59,1,8757,110,111,117,108,108,105,115,59,1,8492,97,59,1,914,114,59,3,55349,56581,112,102,59,3,55349,56633,101,118,101,59,1,728,99,114,59,1,8492,109,112,101,113,59,1,8782,4,14,72,79,97,99,100,101,102,104,105,108,111,114,115,117,442,447,456,504,542,547,569,573,577,616,678,784,790,796,99,121,59,1,1063,80,89,5,169,1,59,454,1,169,4,3,99,112,121,464,470,497,117,116,101,59,1,262,4,2,59,105,476,478,1,8914,116,97,108,68,105,102,102,101,114,101,110,116,105,97,108,68,59,1,8517,108,101,121,115,59,1,8493,4,4,97,101,105,111,514,520,530,535,114,111,110,59,1,268,100,105,108,5,199,1,59,528,1,199,114,99,59,1,264,110,105,110,116,59,1,8752,111,116,59,1,266,4,2,100,110,553,560,105,108,108,97,59,1,184,116,101,114,68,111,116,59,1,183,114,59,1,8493,105,59,1,935,114,99,108,101,4,4,68,77,80,84,591,596,603,609,111,116,59,1,8857,105,110,117,115,59,1,8854,108,117,115,59,1,8853,105,109,101,115,59,1,8855,111,4,2,99,115,623,646,107,119,105,115,101,67,111,110,116,111,117,114,73,110,116,101,103,114,97,108,59,1,8754,101,67,117,114,108,121,4,2,68,81,658,671,111,117,98,108,101,81,117,111,116,101,59,1,8221,117,111,116,101,59,1,8217,4,4,108,110,112,117,688,701,736,753,111,110,4,2,59,101,696,698,1,8759,59,1,10868,4,3,103,105,116,709,717,722,114,117,101,110,116,59,1,8801,110,116,59,1,8751,111,117,114,73,110,116,101,103,114,97,108,59,1,8750,4,2,102,114,742,745,59,1,8450,111,100,117,99,116,59,1,8720,110,116,101,114,67,108,111,99,107,119,105,115,101,67,111,110,116,111,117,114,73,110,116,101,103,114,97,108,59,1,8755,111,115,115,59,1,10799,99,114,59,3,55349,56478,112,4,2,59,67,803,805,1,8915,97,112,59,1,8781,4,11,68,74,83,90,97,99,101,102,105,111,115,834,850,855,860,865,888,903,916,921,1011,1415,4,2,59,111,840,842,1,8517,116,114,97,104,100,59,1,10513,99,121,59,1,1026,99,121,59,1,1029,99,121,59,1,1039,4,3,103,114,115,873,879,883,103,101,114,59,1,8225,114,59,1,8609,104,118,59,1,10980,4,2,97,121,894,900,114,111,110,59,1,270,59,1,1044,108,4,2,59,116,910,912,1,8711,97,59,1,916,114,59,3,55349,56583,4,2,97,102,927,998,4,2,99,109,933,992,114,105,116,105,99,97,108,4,4,65,68,71,84,950,957,978,985,99,117,116,101,59,1,180,111,4,2,116,117,964,967,59,1,729,98,108,101,65,99,117,116,101,59,1,733,114,97,118,101,59,1,96,105,108,100,101,59,1,732,111,110,100,59,1,8900,102,101,114,101,110,116,105,97,108,68,59,1,8518,4,4,112,116,117,119,1021,1026,1048,1249,102,59,3,55349,56635,4,3,59,68,69,1034,1036,1041,1,168,111,116,59,1,8412,113,117,97,108,59,1,8784,98,108,101,4,6,67,68,76,82,85,86,1065,1082,1101,1189,1211,1236,111,110,116,111,117,114,73,110,116,101,103,114,97,108,59,1,8751,111,4,2,116,119,1089,1092,59,1,168,110,65,114,114,111,119,59,1,8659,4,2,101,111,1107,1141,102,116,4,3,65,82,84,1117,1124,1136,114,114,111,119,59,1,8656,105,103,104,116,65,114,114,111,119,59,1,8660,101,101,59,1,10980,110,103,4,2,76,82,1149,1177,101,102,116,4,2,65,82,1158,1165,114,114,111,119,59,1,10232,105,103,104,116,65,114,114,111,119,59,1,10234,105,103,104,116,65,114,114,111,119,59,1,10233,105,103,104,116,4,2,65,84,1199,1206,114,114,111,119,59,1,8658,101,101,59,1,8872,112,4,2,65,68,1218,1225,114,114,111,119,59,1,8657,111,119,110,65,114,114,111,119,59,1,8661,101,114,116,105,99,97,108,66,97,114,59,1,8741,110,4,6,65,66,76,82,84,97,1264,1292,1299,1352,1391,1408,114,114,111,119,4,3,59,66,85,1276,1278,1283,1,8595,97,114,59,1,10515,112,65,114,114,111,119,59,1,8693,114,101,118,101,59,1,785,101,102,116,4,3,82,84,86,1310,1323,1334,105,103,104,116,86,101,99,116,111,114,59,1,10576,101,101,86,101,99,116,111,114,59,1,10590,101,99,116,111,114,4,2,59,66,1345,1347,1,8637,97,114,59,1,10582,105,103,104,116,4,2,84,86,1362,1373,101,101,86,101,99,116,111,114,59,1,10591,101,99,116,111,114,4,2,59,66,1384,1386,1,8641,97,114,59,1,10583,101,101,4,2,59,65,1399,1401,1,8868,114,114,111,119,59,1,8615,114,114,111,119,59,1,8659,4,2,99,116,1421,1426,114,59,3,55349,56479,114,111,107,59,1,272,4,16,78,84,97,99,100,102,103,108,109,111,112,113,115,116,117,120,1466,1470,1478,1489,1515,1520,1525,1536,1544,1593,1609,1617,1650,1664,1668,1677,71,59,1,330,72,5,208,1,59,1476,1,208,99,117,116,101,5,201,1,59,1487,1,201,4,3,97,105,121,1497,1503,1512,114,111,110,59,1,282,114,99,5,202,1,59,1510,1,202,59,1,1069,111,116,59,1,278,114,59,3,55349,56584,114,97,118,101,5,200,1,59,1534,1,200,101,109,101,110,116,59,1,8712,4,2,97,112,1550,1555,99,114,59,1,274,116,121,4,2,83,86,1563,1576,109,97,108,108,83,113,117,97,114,101,59,1,9723,101,114,121,83,109,97,108,108,83,113,117,97,114,101,59,1,9643,4,2,103,112,1599,1604,111,110,59,1,280,102,59,3,55349,56636,115,105,108,111,110,59,1,917,117,4,2,97,105,1624,1640,108,4,2,59,84,1631,1633,1,10869,105,108,100,101,59,1,8770,108,105,98,114,105,117,109,59,1,8652,4,2,99,105,1656,1660,114,59,1,8496,109,59,1,10867,97,59,1,919,109,108,5,203,1,59,1675,1,203,4,2,105,112,1683,1689,115,116,115,59,1,8707,111,110,101,110,116,105,97,108,69,59,1,8519,4,5,99,102,105,111,115,1713,1717,1722,1762,1791,121,59,1,1060,114,59,3,55349,56585,108,108,101,100,4,2,83,86,1732,1745,109,97,108,108,83,113,117,97,114,101,59,1,9724,101,114,121,83,109,97,108,108,83,113,117,97,114,101,59,1,9642,4,3,112,114,117,1770,1775,1781,102,59,3,55349,56637,65,108,108,59,1,8704,114,105,101,114,116,114,102,59,1,8497,99,114,59,1,8497,4,12,74,84,97,98,99,100,102,103,111,114,115,116,1822,1827,1834,1848,1855,1877,1882,1887,1890,1896,1978,1984,99,121,59,1,1027,5,62,1,59,1832,1,62,109,109,97,4,2,59,100,1843,1845,1,915,59,1,988,114,101,118,101,59,1,286,4,3,101,105,121,1863,1869,1874,100,105,108,59,1,290,114,99,59,1,284,59,1,1043,111,116,59,1,288,114,59,3,55349,56586,59,1,8921,112,102,59,3,55349,56638,101,97,116,101,114,4,6,69,70,71,76,83,84,1915,1933,1944,1953,1959,1971,113,117,97,108,4,2,59,76,1925,1927,1,8805,101,115,115,59,1,8923,117,108,108,69,113,117,97,108,59,1,8807,114,101,97,116,101,114,59,1,10914,101,115,115,59,1,8823,108,97,110,116,69,113,117,97,108,59,1,10878,105,108,100,101,59,1,8819,99,114,59,3,55349,56482,59,1,8811,4,8,65,97,99,102,105,111,115,117,2005,2012,2026,2032,2036,2049,2073,2089,82,68,99,121,59,1,1066,4,2,99,116,2018,2023,101,107,59,1,711,59,1,94,105,114,99,59,1,292,114,59,1,8460,108,98,101,114,116,83,112,97,99,101,59,1,8459,4,2,112,114,2055,2059,102,59,1,8461,105,122,111,110,116,97,108,76,105,110,101,59,1,9472,4,2,99,116,2079,2083,114,59,1,8459,114,111,107,59,1,294,109,112,4,2,68,69,2097,2107,111,119,110,72,117,109,112,59,1,8782,113,117,97,108,59,1,8783,4,14,69,74,79,97,99,100,102,103,109,110,111,115,116,117,2144,2149,2155,2160,2171,2189,2194,2198,2209,2245,2307,2329,2334,2341,99,121,59,1,1045,108,105,103,59,1,306,99,121,59,1,1025,99,117,116,101,5,205,1,59,2169,1,205,4,2,105,121,2177,2186,114,99,5,206,1,59,2184,1,206,59,1,1048,111,116,59,1,304,114,59,1,8465,114,97,118,101,5,204,1,59,2207,1,204,4,3,59,97,112,2217,2219,2238,1,8465,4,2,99,103,2225,2229,114,59,1,298,105,110,97,114,121,73,59,1,8520,108,105,101,115,59,1,8658,4,2,116,118,2251,2281,4,2,59,101,2257,2259,1,8748,4,2,103,114,2265,2271,114,97,108,59,1,8747,115,101,99,116,105,111,110,59,1,8898,105,115,105,98,108,101,4,2,67,84,2293,2300,111,109,109,97,59,1,8291,105,109,101,115,59,1,8290,4,3,103,112,116,2315,2320,2325,111,110,59,1,302,102,59,3,55349,56640,97,59,1,921,99,114,59,1,8464,105,108,100,101,59,1,296,4,2,107,109,2347,2352,99,121,59,1,1030,108,5,207,1,59,2358,1,207,4,5,99,102,111,115,117,2372,2386,2391,2397,2414,4,2,105,121,2378,2383,114,99,59,1,308,59,1,1049,114,59,3,55349,56589,112,102,59,3,55349,56641,4,2,99,101,2403,2408,114,59,3,55349,56485,114,99,121,59,1,1032,107,99,121,59,1,1028,4,7,72,74,97,99,102,111,115,2436,2441,2446,2452,2467,2472,2478,99,121,59,1,1061,99,121,59,1,1036,112,112,97,59,1,922,4,2,101,121,2458,2464,100,105,108,59,1,310,59,1,1050,114,59,3,55349,56590,112,102,59,3,55349,56642,99,114,59,3,55349,56486,4,11,74,84,97,99,101,102,108,109,111,115,116,2508,2513,2520,2562,2585,2981,2986,3004,3011,3146,3167,99,121,59,1,1033,5,60,1,59,2518,1,60,4,5,99,109,110,112,114,2532,2538,2544,2548,2558,117,116,101,59,1,313,98,100,97,59,1,923,103,59,1,10218,108,97,99,101,116,114,102,59,1,8466,114,59,1,8606,4,3,97,101,121,2570,2576,2582,114,111,110,59,1,317,100,105,108,59,1,315,59,1,1051,4,2,102,115,2591,2907,116,4,10,65,67,68,70,82,84,85,86,97,114,2614,2663,2672,2728,2735,2760,2820,2870,2888,2895,4,2,110,114,2620,2633,103,108,101,66,114,97,99,107,101,116,59,1,10216,114,111,119,4,3,59,66,82,2644,2646,2651,1,8592,97,114,59,1,8676,105,103,104,116,65,114,114,111,119,59,1,8646,101,105,108,105,110,103,59,1,8968,111,4,2,117,119,2679,2692,98,108,101,66,114,97,99,107,101,116,59,1,10214,110,4,2,84,86,2699,2710,101,101,86,101,99,116,111,114,59,1,10593,101,99,116,111,114,4,2,59,66,2721,2723,1,8643,97,114,59,1,10585,108,111,111,114,59,1,8970,105,103,104,116,4,2,65,86,2745,2752,114,114,111,119,59,1,8596,101,99,116,111,114,59,1,10574,4,2,101,114,2766,2792,101,4,3,59,65,86,2775,2777,2784,1,8867,114,114,111,119,59,1,8612,101,99,116,111,114,59,1,10586,105,97,110,103,108,101,4,3,59,66,69,2806,2808,2813,1,8882,97,114,59,1,10703,113,117,97,108,59,1,8884,112,4,3,68,84,86,2829,2841,2852,111,119,110,86,101,99,116,111,114,59,1,10577,101,101,86,101,99,116,111,114,59,1,10592,101,99,116,111,114,4,2,59,66,2863,2865,1,8639,97,114,59,1,10584,101,99,116,111,114,4,2,59,66,2881,2883,1,8636,97,114,59,1,10578,114,114,111,119,59,1,8656,105,103,104,116,97,114,114,111,119,59,1,8660,115,4,6,69,70,71,76,83,84,2922,2936,2947,2956,2962,2974,113,117,97,108,71,114,101,97,116,101,114,59,1,8922,117,108,108,69,113,117,97,108,59,1,8806,114,101,97,116,101,114,59,1,8822,101,115,115,59,1,10913,108,97,110,116,69,113,117,97,108,59,1,10877,105,108,100,101,59,1,8818,114,59,3,55349,56591,4,2,59,101,2992,2994,1,8920,102,116,97,114,114,111,119,59,1,8666,105,100,111,116,59,1,319,4,3,110,112,119,3019,3110,3115,103,4,4,76,82,108,114,3030,3058,3070,3098,101,102,116,4,2,65,82,3039,3046,114,114,111,119,59,1,10229,105,103,104,116,65,114,114,111,119,59,1,10231,105,103,104,116,65,114,114,111,119,59,1,10230,101,102,116,4,2,97,114,3079,3086,114,114,111,119,59,1,10232,105,103,104,116,97,114,114,111,119,59,1,10234,105,103,104,116,97,114,114,111,119,59,1,10233,102,59,3,55349,56643,101,114,4,2,76,82,3123,3134,101,102,116,65,114,114,111,119,59,1,8601,105,103,104,116,65,114,114,111,119,59,1,8600,4,3,99,104,116,3154,3158,3161,114,59,1,8466,59,1,8624,114,111,107,59,1,321,59,1,8810,4,8,97,99,101,102,105,111,115,117,3188,3192,3196,3222,3227,3237,3243,3248,112,59,1,10501,121,59,1,1052,4,2,100,108,3202,3213,105,117,109,83,112,97,99,101,59,1,8287,108,105,110,116,114,102,59,1,8499,114,59,3,55349,56592,110,117,115,80,108,117,115,59,1,8723,112,102,59,3,55349,56644,99,114,59,1,8499,59,1,924,4,9,74,97,99,101,102,111,115,116,117,3271,3276,3283,3306,3422,3427,4120,4126,4137,99,121,59,1,1034,99,117,116,101,59,1,323,4,3,97,101,121,3291,3297,3303,114,111,110,59,1,327,100,105,108,59,1,325,59,1,1053,4,3,103,115,119,3314,3380,3415,97,116,105,118,101,4,3,77,84,86,3327,3340,3365,101,100,105,117,109,83,112,97,99,101,59,1,8203,104,105,4,2,99,110,3348,3357,107,83,112,97,99,101,59,1,8203,83,112,97,99,101,59,1,8203,101,114,121,84,104,105,110,83,112,97,99,101,59,1,8203,116,101,100,4,2,71,76,3389,3405,114,101,97,116,101,114,71,114,101,97,116,101,114,59,1,8811,101,115,115,76,101,115,115,59,1,8810,76,105,110,101,59,1,10,114,59,3,55349,56593,4,4,66,110,112,116,3437,3444,3460,3464,114,101,97,107,59,1,8288,66,114,101,97,107,105,110,103,83,112,97,99,101,59,1,160,102,59,1,8469,4,13,59,67,68,69,71,72,76,78,80,82,83,84,86,3492,3494,3517,3536,3578,3657,3685,3784,3823,3860,3915,4066,4107,1,10988,4,2,111,117,3500,3510,110,103,114,117,101,110,116,59,1,8802,112,67,97,112,59,1,8813,111,117,98,108,101,86,101,114,116,105,99,97,108,66,97,114,59,1,8742,4,3,108,113,120,3544,3552,3571,101,109,101,110,116,59,1,8713,117,97,108,4,2,59,84,3561,3563,1,8800,105,108,100,101,59,3,8770,824,105,115,116,115,59,1,8708,114,101,97,116,101,114,4,7,59,69,70,71,76,83,84,3600,3602,3609,3621,3631,3637,3650,1,8815,113,117,97,108,59,1,8817,117,108,108,69,113,117,97,108,59,3,8807,824,114,101,97,116,101,114,59,3,8811,824,101,115,115,59,1,8825,108,97,110,116,69,113,117,97,108,59,3,10878,824,105,108,100,101,59,1,8821,117,109,112,4,2,68,69,3666,3677,111,119,110,72,117,109,112,59,3,8782,824,113,117,97,108,59,3,8783,824,101,4,2,102,115,3692,3724,116,84,114,105,97,110,103,108,101,4,3,59,66,69,3709,3711,3717,1,8938,97,114,59,3,10703,824,113,117,97,108,59,1,8940,115,4,6,59,69,71,76,83,84,3739,3741,3748,3757,3764,3777,1,8814,113,117,97,108,59,1,8816,114,101,97,116,101,114,59,1,8824,101,115,115,59,3,8810,824,108,97,110,116,69,113,117,97,108,59,3,10877,824,105,108,100,101,59,1,8820,101,115,116,101,100,4,2,71,76,3795,3812,114,101,97,116,101,114,71,114,101,97,116,101,114,59,3,10914,824,101,115,115,76,101,115,115,59,3,10913,824,114,101,99,101,100,101,115,4,3,59,69,83,3838,3840,3848,1,8832,113,117,97,108,59,3,10927,824,108,97,110,116,69,113,117,97,108,59,1,8928,4,2,101,105,3866,3881,118,101,114,115,101,69,108,101,109,101,110,116,59,1,8716,103,104,116,84,114,105,97,110,103,108,101,4,3,59,66,69,3900,3902,3908,1,8939,97,114,59,3,10704,824,113,117,97,108,59,1,8941,4,2,113,117,3921,3973,117,97,114,101,83,117,4,2,98,112,3933,3952,115,101,116,4,2,59,69,3942,3945,3,8847,824,113,117,97,108,59,1,8930,101,114,115,101,116,4,2,59,69,3963,3966,3,8848,824,113,117,97,108,59,1,8931,4,3,98,99,112,3981,4e3,4045,115,101,116,4,2,59,69,3990,3993,3,8834,8402,113,117,97,108,59,1,8840,99,101,101,100,115,4,4,59,69,83,84,4015,4017,4025,4037,1,8833,113,117,97,108,59,3,10928,824,108,97,110,116,69,113,117,97,108,59,1,8929,105,108,100,101,59,3,8831,824,101,114,115,101,116,4,2,59,69,4056,4059,3,8835,8402,113,117,97,108,59,1,8841,105,108,100,101,4,4,59,69,70,84,4080,4082,4089,4100,1,8769,113,117,97,108,59,1,8772,117,108,108,69,113,117,97,108,59,1,8775,105,108,100,101,59,1,8777,101,114,116,105,99,97,108,66,97,114,59,1,8740,99,114,59,3,55349,56489,105,108,100,101,5,209,1,59,4135,1,209,59,1,925,4,14,69,97,99,100,102,103,109,111,112,114,115,116,117,118,4170,4176,4187,4205,4212,4217,4228,4253,4259,4292,4295,4316,4337,4346,108,105,103,59,1,338,99,117,116,101,5,211,1,59,4185,1,211,4,2,105,121,4193,4202,114,99,5,212,1,59,4200,1,212,59,1,1054,98,108,97,99,59,1,336,114,59,3,55349,56594,114,97,118,101,5,210,1,59,4226,1,210,4,3,97,101,105,4236,4241,4246,99,114,59,1,332,103,97,59,1,937,99,114,111,110,59,1,927,112,102,59,3,55349,56646,101,110,67,117,114,108,121,4,2,68,81,4272,4285,111,117,98,108,101,81,117,111,116,101,59,1,8220,117,111,116,101,59,1,8216,59,1,10836,4,2,99,108,4301,4306,114,59,3,55349,56490,97,115,104,5,216,1,59,4314,1,216,105,4,2,108,109,4323,4332,100,101,5,213,1,59,4330,1,213,101,115,59,1,10807,109,108,5,214,1,59,4344,1,214,101,114,4,2,66,80,4354,4380,4,2,97,114,4360,4364,114,59,1,8254,97,99,4,2,101,107,4372,4375,59,1,9182,101,116,59,1,9140,97,114,101,110,116,104,101,115,105,115,59,1,9180,4,9,97,99,102,104,105,108,111,114,115,4413,4422,4426,4431,4435,4438,4448,4471,4561,114,116,105,97,108,68,59,1,8706,121,59,1,1055,114,59,3,55349,56595,105,59,1,934,59,1,928,117,115,77,105,110,117,115,59,1,177,4,2,105,112,4454,4467,110,99,97,114,101,112,108,97,110,101,59,1,8460,102,59,1,8473,4,4,59,101,105,111,4481,4483,4526,4531,1,10939,99,101,100,101,115,4,4,59,69,83,84,4498,4500,4507,4519,1,8826,113,117,97,108,59,1,10927,108,97,110,116,69,113,117,97,108,59,1,8828,105,108,100,101,59,1,8830,109,101,59,1,8243,4,2,100,112,4537,4543,117,99,116,59,1,8719,111,114,116,105,111,110,4,2,59,97,4555,4557,1,8759,108,59,1,8733,4,2,99,105,4567,4572,114,59,3,55349,56491,59,1,936,4,4,85,102,111,115,4585,4594,4599,4604,79,84,5,34,1,59,4592,1,34,114,59,3,55349,56596,112,102,59,1,8474,99,114,59,3,55349,56492,4,12,66,69,97,99,101,102,104,105,111,114,115,117,4636,4642,4650,4681,4704,4763,4767,4771,5047,5069,5081,5094,97,114,114,59,1,10512,71,5,174,1,59,4648,1,174,4,3,99,110,114,4658,4664,4668,117,116,101,59,1,340,103,59,1,10219,114,4,2,59,116,4675,4677,1,8608,108,59,1,10518,4,3,97,101,121,4689,4695,4701,114,111,110,59,1,344,100,105,108,59,1,342,59,1,1056,4,2,59,118,4710,4712,1,8476,101,114,115,101,4,2,69,85,4722,4748,4,2,108,113,4728,4736,101,109,101,110,116,59,1,8715,117,105,108,105,98,114,105,117,109,59,1,8651,112,69,113,117,105,108,105,98,114,105,117,109,59,1,10607,114,59,1,8476,111,59,1,929,103,104,116,4,8,65,67,68,70,84,85,86,97,4792,4840,4849,4905,4912,4972,5022,5040,4,2,110,114,4798,4811,103,108,101,66,114,97,99,107,101,116,59,1,10217,114,111,119,4,3,59,66,76,4822,4824,4829,1,8594,97,114,59,1,8677,101,102,116,65,114,114,111,119,59,1,8644,101,105,108,105,110,103,59,1,8969,111,4,2,117,119,4856,4869,98,108,101,66,114,97,99,107,101,116,59,1,10215,110,4,2,84,86,4876,4887,101,101,86,101,99,116,111,114,59,1,10589,101,99,116,111,114,4,2,59,66,4898,4900,1,8642,97,114,59,1,10581,108,111,111,114,59,1,8971,4,2,101,114,4918,4944,101,4,3,59,65,86,4927,4929,4936,1,8866,114,114,111,119,59,1,8614,101,99,116,111,114,59,1,10587,105,97,110,103,108,101,4,3,59,66,69,4958,4960,4965,1,8883,97,114,59,1,10704,113,117,97,108,59,1,8885,112,4,3,68,84,86,4981,4993,5004,111,119,110,86,101,99,116,111,114,59,1,10575,101,101,86,101,99,116,111,114,59,1,10588,101,99,116,111,114,4,2,59,66,5015,5017,1,8638,97,114,59,1,10580,101,99,116,111,114,4,2,59,66,5033,5035,1,8640,97,114,59,1,10579,114,114,111,119,59,1,8658,4,2,112,117,5053,5057,102,59,1,8477,110,100,73,109,112,108,105,101,115,59,1,10608,105,103,104,116,97,114,114,111,119,59,1,8667,4,2,99,104,5087,5091,114,59,1,8475,59,1,8625,108,101,68,101,108,97,121,101,100,59,1,10740,4,13,72,79,97,99,102,104,105,109,111,113,115,116,117,5134,5150,5157,5164,5198,5203,5259,5265,5277,5283,5374,5380,5385,4,2,67,99,5140,5146,72,99,121,59,1,1065,121,59,1,1064,70,84,99,121,59,1,1068,99,117,116,101,59,1,346,4,5,59,97,101,105,121,5176,5178,5184,5190,5195,1,10940,114,111,110,59,1,352,100,105,108,59,1,350,114,99,59,1,348,59,1,1057,114,59,3,55349,56598,111,114,116,4,4,68,76,82,85,5216,5227,5238,5250,111,119,110,65,114,114,111,119,59,1,8595,101,102,116,65,114,114,111,119,59,1,8592,105,103,104,116,65,114,114,111,119,59,1,8594,112,65,114,114,111,119,59,1,8593,103,109,97,59,1,931,97,108,108,67,105,114,99,108,101,59,1,8728,112,102,59,3,55349,56650,4,2,114,117,5289,5293,116,59,1,8730,97,114,101,4,4,59,73,83,85,5306,5308,5322,5367,1,9633,110,116,101,114,115,101,99,116,105,111,110,59,1,8851,117,4,2,98,112,5329,5347,115,101,116,4,2,59,69,5338,5340,1,8847,113,117,97,108,59,1,8849,101,114,115,101,116,4,2,59,69,5358,5360,1,8848,113,117,97,108,59,1,8850,110,105,111,110,59,1,8852,99,114,59,3,55349,56494,97,114,59,1,8902,4,4,98,99,109,112,5395,5420,5475,5478,4,2,59,115,5401,5403,1,8912,101,116,4,2,59,69,5411,5413,1,8912,113,117,97,108,59,1,8838,4,2,99,104,5426,5468,101,101,100,115,4,4,59,69,83,84,5440,5442,5449,5461,1,8827,113,117,97,108,59,1,10928,108,97,110,116,69,113,117,97,108,59,1,8829,105,108,100,101,59,1,8831,84,104,97,116,59,1,8715,59,1,8721,4,3,59,101,115,5486,5488,5507,1,8913,114,115,101,116,4,2,59,69,5498,5500,1,8835,113,117,97,108,59,1,8839,101,116,59,1,8913,4,11,72,82,83,97,99,102,104,105,111,114,115,5536,5546,5552,5567,5579,5602,5607,5655,5695,5701,5711,79,82,78,5,222,1,59,5544,1,222,65,68,69,59,1,8482,4,2,72,99,5558,5563,99,121,59,1,1035,121,59,1,1062,4,2,98,117,5573,5576,59,1,9,59,1,932,4,3,97,101,121,5587,5593,5599,114,111,110,59,1,356,100,105,108,59,1,354,59,1,1058,114,59,3,55349,56599,4,2,101,105,5613,5631,4,2,114,116,5619,5627,101,102,111,114,101,59,1,8756,97,59,1,920,4,2,99,110,5637,5647,107,83,112,97,99,101,59,3,8287,8202,83,112,97,99,101,59,1,8201,108,100,101,4,4,59,69,70,84,5668,5670,5677,5688,1,8764,113,117,97,108,59,1,8771,117,108,108,69,113,117,97,108,59,1,8773,105,108,100,101,59,1,8776,112,102,59,3,55349,56651,105,112,108,101,68,111,116,59,1,8411,4,2,99,116,5717,5722,114,59,3,55349,56495,114,111,107,59,1,358,4,14,97,98,99,100,102,103,109,110,111,112,114,115,116,117,5758,5789,5805,5823,5830,5835,5846,5852,5921,5937,6089,6095,6101,6108,4,2,99,114,5764,5774,117,116,101,5,218,1,59,5772,1,218,114,4,2,59,111,5781,5783,1,8607,99,105,114,59,1,10569,114,4,2,99,101,5796,5800,121,59,1,1038,118,101,59,1,364,4,2,105,121,5811,5820,114,99,5,219,1,59,5818,1,219,59,1,1059,98,108,97,99,59,1,368,114,59,3,55349,56600,114,97,118,101,5,217,1,59,5844,1,217,97,99,114,59,1,362,4,2,100,105,5858,5905,101,114,4,2,66,80,5866,5892,4,2,97,114,5872,5876,114,59,1,95,97,99,4,2,101,107,5884,5887,59,1,9183,101,116,59,1,9141,97,114,101,110,116,104,101,115,105,115,59,1,9181,111,110,4,2,59,80,5913,5915,1,8899,108,117,115,59,1,8846,4,2,103,112,5927,5932,111,110,59,1,370,102,59,3,55349,56652,4,8,65,68,69,84,97,100,112,115,5955,5985,5996,6009,6026,6033,6044,6075,114,114,111,119,4,3,59,66,68,5967,5969,5974,1,8593,97,114,59,1,10514,111,119,110,65,114,114,111,119,59,1,8645,111,119,110,65,114,114,111,119,59,1,8597,113,117,105,108,105,98,114,105,117,109,59,1,10606,101,101,4,2,59,65,6017,6019,1,8869,114,114,111,119,59,1,8613,114,114,111,119,59,1,8657,111,119,110,97,114,114,111,119,59,1,8661,101,114,4,2,76,82,6052,6063,101,102,116,65,114,114,111,119,59,1,8598,105,103,104,116,65,114,114,111,119,59,1,8599,105,4,2,59,108,6082,6084,1,978,111,110,59,1,933,105,110,103,59,1,366,99,114,59,3,55349,56496,105,108,100,101,59,1,360,109,108,5,220,1,59,6115,1,220,4,9,68,98,99,100,101,102,111,115,118,6137,6143,6148,6152,6166,6250,6255,6261,6267,97,115,104,59,1,8875,97,114,59,1,10987,121,59,1,1042,97,115,104,4,2,59,108,6161,6163,1,8873,59,1,10982,4,2,101,114,6172,6175,59,1,8897,4,3,98,116,121,6183,6188,6238,97,114,59,1,8214,4,2,59,105,6194,6196,1,8214,99,97,108,4,4,66,76,83,84,6209,6214,6220,6231,97,114,59,1,8739,105,110,101,59,1,124,101,112,97,114,97,116,111,114,59,1,10072,105,108,100,101,59,1,8768,84,104,105,110,83,112,97,99,101,59,1,8202,114,59,3,55349,56601,112,102,59,3,55349,56653,99,114,59,3,55349,56497,100,97,115,104,59,1,8874,4,5,99,101,102,111,115,6286,6292,6298,6303,6309,105,114,99,59,1,372,100,103,101,59,1,8896,114,59,3,55349,56602,112,102,59,3,55349,56654,99,114,59,3,55349,56498,4,4,102,105,111,115,6325,6330,6333,6339,114,59,3,55349,56603,59,1,926,112,102,59,3,55349,56655,99,114,59,3,55349,56499,4,9,65,73,85,97,99,102,111,115,117,6365,6370,6375,6380,6391,6405,6410,6416,6422,99,121,59,1,1071,99,121,59,1,1031,99,121,59,1,1070,99,117,116,101,5,221,1,59,6389,1,221,4,2,105,121,6397,6402,114,99,59,1,374,59,1,1067,114,59,3,55349,56604,112,102,59,3,55349,56656,99,114,59,3,55349,56500,109,108,59,1,376,4,8,72,97,99,100,101,102,111,115,6445,6450,6457,6472,6477,6501,6505,6510,99,121,59,1,1046,99,117,116,101,59,1,377,4,2,97,121,6463,6469,114,111,110,59,1,381,59,1,1047,111,116,59,1,379,4,2,114,116,6483,6497,111,87,105,100,116,104,83,112,97,99,101,59,1,8203,97,59,1,918,114,59,1,8488,112,102,59,1,8484,99,114,59,3,55349,56501,4,16,97,98,99,101,102,103,108,109,110,111,112,114,115,116,117,119,6550,6561,6568,6612,6622,6634,6645,6672,6699,6854,6870,6923,6933,6963,6974,6983,99,117,116,101,5,225,1,59,6559,1,225,114,101,118,101,59,1,259,4,6,59,69,100,105,117,121,6582,6584,6588,6591,6600,6609,1,8766,59,3,8766,819,59,1,8767,114,99,5,226,1,59,6598,1,226,116,101,5,180,1,59,6607,1,180,59,1,1072,108,105,103,5,230,1,59,6620,1,230,4,2,59,114,6628,6630,1,8289,59,3,55349,56606,114,97,118,101,5,224,1,59,6643,1,224,4,2,101,112,6651,6667,4,2,102,112,6657,6663,115,121,109,59,1,8501,104,59,1,8501,104,97,59,1,945,4,2,97,112,6678,6692,4,2,99,108,6684,6688,114,59,1,257,103,59,1,10815,5,38,1,59,6697,1,38,4,2,100,103,6705,6737,4,5,59,97,100,115,118,6717,6719,6724,6727,6734,1,8743,110,100,59,1,10837,59,1,10844,108,111,112,101,59,1,10840,59,1,10842,4,7,59,101,108,109,114,115,122,6753,6755,6758,6762,6814,6835,6848,1,8736,59,1,10660,101,59,1,8736,115,100,4,2,59,97,6770,6772,1,8737,4,8,97,98,99,100,101,102,103,104,6790,6793,6796,6799,6802,6805,6808,6811,59,1,10664,59,1,10665,59,1,10666,59,1,10667,59,1,10668,59,1,10669,59,1,10670,59,1,10671,116,4,2,59,118,6821,6823,1,8735,98,4,2,59,100,6830,6832,1,8894,59,1,10653,4,2,112,116,6841,6845,104,59,1,8738,59,1,197,97,114,114,59,1,9084,4,2,103,112,6860,6865,111,110,59,1,261,102,59,3,55349,56658,4,7,59,69,97,101,105,111,112,6886,6888,6891,6897,6900,6904,6908,1,8776,59,1,10864,99,105,114,59,1,10863,59,1,8778,100,59,1,8779,115,59,1,39,114,111,120,4,2,59,101,6917,6919,1,8776,113,59,1,8778,105,110,103,5,229,1,59,6931,1,229,4,3,99,116,121,6941,6946,6949,114,59,3,55349,56502,59,1,42,109,112,4,2,59,101,6957,6959,1,8776,113,59,1,8781,105,108,100,101,5,227,1,59,6972,1,227,109,108,5,228,1,59,6981,1,228,4,2,99,105,6989,6997,111,110,105,110,116,59,1,8755,110,116,59,1,10769,4,16,78,97,98,99,100,101,102,105,107,108,110,111,112,114,115,117,7036,7041,7119,7135,7149,7155,7219,7224,7347,7354,7463,7489,7786,7793,7814,7866,111,116,59,1,10989,4,2,99,114,7047,7094,107,4,4,99,101,112,115,7058,7064,7073,7080,111,110,103,59,1,8780,112,115,105,108,111,110,59,1,1014,114,105,109,101,59,1,8245,105,109,4,2,59,101,7088,7090,1,8765,113,59,1,8909,4,2,118,119,7100,7105,101,101,59,1,8893,101,100,4,2,59,103,7113,7115,1,8965,101,59,1,8965,114,107,4,2,59,116,7127,7129,1,9141,98,114,107,59,1,9142,4,2,111,121,7141,7146,110,103,59,1,8780,59,1,1073,113,117,111,59,1,8222,4,5,99,109,112,114,116,7167,7181,7188,7193,7199,97,117,115,4,2,59,101,7176,7178,1,8757,59,1,8757,112,116,121,118,59,1,10672,115,105,59,1,1014,110,111,117,59,1,8492,4,3,97,104,119,7207,7210,7213,59,1,946,59,1,8502,101,101,110,59,1,8812,114,59,3,55349,56607,103,4,7,99,111,115,116,117,118,119,7241,7262,7288,7305,7328,7335,7340,4,3,97,105,117,7249,7253,7258,112,59,1,8898,114,99,59,1,9711,112,59,1,8899,4,3,100,112,116,7270,7275,7281,111,116,59,1,10752,108,117,115,59,1,10753,105,109,101,115,59,1,10754,4,2,113,116,7294,7300,99,117,112,59,1,10758,97,114,59,1,9733,114,105,97,110,103,108,101,4,2,100,117,7318,7324,111,119,110,59,1,9661,112,59,1,9651,112,108,117,115,59,1,10756,101,101,59,1,8897,101,100,103,101,59,1,8896,97,114,111,119,59,1,10509,4,3,97,107,111,7362,7436,7458,4,2,99,110,7368,7432,107,4,3,108,115,116,7377,7386,7394,111,122,101,110,103,101,59,1,10731,113,117,97,114,101,59,1,9642,114,105,97,110,103,108,101,4,4,59,100,108,114,7411,7413,7419,7425,1,9652,111,119,110,59,1,9662,101,102,116,59,1,9666,105,103,104,116,59,1,9656,107,59,1,9251,4,2,49,51,7442,7454,4,2,50,52,7448,7451,59,1,9618,59,1,9617,52,59,1,9619,99,107,59,1,9608,4,2,101,111,7469,7485,4,2,59,113,7475,7478,3,61,8421,117,105,118,59,3,8801,8421,116,59,1,8976,4,4,112,116,119,120,7499,7504,7517,7523,102,59,3,55349,56659,4,2,59,116,7510,7512,1,8869,111,109,59,1,8869,116,105,101,59,1,8904,4,12,68,72,85,86,98,100,104,109,112,116,117,118,7549,7571,7597,7619,7655,7660,7682,7708,7715,7721,7728,7750,4,4,76,82,108,114,7559,7562,7565,7568,59,1,9559,59,1,9556,59,1,9558,59,1,9555,4,5,59,68,85,100,117,7583,7585,7588,7591,7594,1,9552,59,1,9574,59,1,9577,59,1,9572,59,1,9575,4,4,76,82,108,114,7607,7610,7613,7616,59,1,9565,59,1,9562,59,1,9564,59,1,9561,4,7,59,72,76,82,104,108,114,7635,7637,7640,7643,7646,7649,7652,1,9553,59,1,9580,59,1,9571,59,1,9568,59,1,9579,59,1,9570,59,1,9567,111,120,59,1,10697,4,4,76,82,108,114,7670,7673,7676,7679,59,1,9557,59,1,9554,59,1,9488,59,1,9484,4,5,59,68,85,100,117,7694,7696,7699,7702,7705,1,9472,59,1,9573,59,1,9576,59,1,9516,59,1,9524,105,110,117,115,59,1,8863,108,117,115,59,1,8862,105,109,101,115,59,1,8864,4,4,76,82,108,114,7738,7741,7744,7747,59,1,9563,59,1,9560,59,1,9496,59,1,9492,4,7,59,72,76,82,104,108,114,7766,7768,7771,7774,7777,7780,7783,1,9474,59,1,9578,59,1,9569,59,1,9566,59,1,9532,59,1,9508,59,1,9500,114,105,109,101,59,1,8245,4,2,101,118,7799,7804,118,101,59,1,728,98,97,114,5,166,1,59,7812,1,166,4,4,99,101,105,111,7824,7829,7834,7846,114,59,3,55349,56503,109,105,59,1,8271,109,4,2,59,101,7841,7843,1,8765,59,1,8909,108,4,3,59,98,104,7855,7857,7860,1,92,59,1,10693,115,117,98,59,1,10184,4,2,108,109,7872,7885,108,4,2,59,101,7879,7881,1,8226,116,59,1,8226,112,4,3,59,69,101,7894,7896,7899,1,8782,59,1,10926,4,2,59,113,7905,7907,1,8783,59,1,8783,4,15,97,99,100,101,102,104,105,108,111,114,115,116,117,119,121,7942,8021,8075,8080,8121,8126,8157,8279,8295,8430,8446,8485,8491,8707,8726,4,3,99,112,114,7950,7956,8007,117,116,101,59,1,263,4,6,59,97,98,99,100,115,7970,7972,7977,7984,7998,8003,1,8745,110,100,59,1,10820,114,99,117,112,59,1,10825,4,2,97,117,7990,7994,112,59,1,10827,112,59,1,10823,111,116,59,1,10816,59,3,8745,65024,4,2,101,111,8013,8017,116,59,1,8257,110,59,1,711,4,4,97,101,105,117,8031,8046,8056,8061,4,2,112,114,8037,8041,115,59,1,10829,111,110,59,1,269,100,105,108,5,231,1,59,8054,1,231,114,99,59,1,265,112,115,4,2,59,115,8069,8071,1,10828,109,59,1,10832,111,116,59,1,267,4,3,100,109,110,8088,8097,8104,105,108,5,184,1,59,8095,1,184,112,116,121,118,59,1,10674,116,5,162,2,59,101,8112,8114,1,162,114,100,111,116,59,1,183,114,59,3,55349,56608,4,3,99,101,105,8134,8138,8154,121,59,1,1095,99,107,4,2,59,109,8146,8148,1,10003,97,114,107,59,1,10003,59,1,967,114,4,7,59,69,99,101,102,109,115,8174,8176,8179,8258,8261,8268,8273,1,9675,59,1,10691,4,3,59,101,108,8187,8189,8193,1,710,113,59,1,8791,101,4,2,97,100,8200,8223,114,114,111,119,4,2,108,114,8210,8216,101,102,116,59,1,8634,105,103,104,116,59,1,8635,4,5,82,83,97,99,100,8235,8238,8241,8246,8252,59,1,174,59,1,9416,115,116,59,1,8859,105,114,99,59,1,8858,97,115,104,59,1,8861,59,1,8791,110,105,110,116,59,1,10768,105,100,59,1,10991,99,105,114,59,1,10690,117,98,115,4,2,59,117,8288,8290,1,9827,105,116,59,1,9827,4,4,108,109,110,112,8305,8326,8376,8400,111,110,4,2,59,101,8313,8315,1,58,4,2,59,113,8321,8323,1,8788,59,1,8788,4,2,109,112,8332,8344,97,4,2,59,116,8339,8341,1,44,59,1,64,4,3,59,102,108,8352,8354,8358,1,8705,110,59,1,8728,101,4,2,109,120,8365,8371,101,110,116,59,1,8705,101,115,59,1,8450,4,2,103,105,8382,8395,4,2,59,100,8388,8390,1,8773,111,116,59,1,10861,110,116,59,1,8750,4,3,102,114,121,8408,8412,8417,59,3,55349,56660,111,100,59,1,8720,5,169,2,59,115,8424,8426,1,169,114,59,1,8471,4,2,97,111,8436,8441,114,114,59,1,8629,115,115,59,1,10007,4,2,99,117,8452,8457,114,59,3,55349,56504,4,2,98,112,8463,8474,4,2,59,101,8469,8471,1,10959,59,1,10961,4,2,59,101,8480,8482,1,10960,59,1,10962,100,111,116,59,1,8943,4,7,100,101,108,112,114,118,119,8507,8522,8536,8550,8600,8697,8702,97,114,114,4,2,108,114,8516,8519,59,1,10552,59,1,10549,4,2,112,115,8528,8532,114,59,1,8926,99,59,1,8927,97,114,114,4,2,59,112,8545,8547,1,8630,59,1,10557,4,6,59,98,99,100,111,115,8564,8566,8573,8587,8592,8596,1,8746,114,99,97,112,59,1,10824,4,2,97,117,8579,8583,112,59,1,10822,112,59,1,10826,111,116,59,1,8845,114,59,1,10821,59,3,8746,65024,4,4,97,108,114,118,8610,8623,8663,8672,114,114,4,2,59,109,8618,8620,1,8631,59,1,10556,121,4,3,101,118,119,8632,8651,8656,113,4,2,112,115,8639,8645,114,101,99,59,1,8926,117,99,99,59,1,8927,101,101,59,1,8910,101,100,103,101,59,1,8911,101,110,5,164,1,59,8670,1,164,101,97,114,114,111,119,4,2,108,114,8684,8690,101,102,116,59,1,8630,105,103,104,116,59,1,8631,101,101,59,1,8910,101,100,59,1,8911,4,2,99,105,8713,8721,111,110,105,110,116,59,1,8754,110,116,59,1,8753,108,99,116,121,59,1,9005,4,19,65,72,97,98,99,100,101,102,104,105,106,108,111,114,115,116,117,119,122,8773,8778,8783,8821,8839,8854,8887,8914,8930,8944,9036,9041,9058,9197,9227,9258,9281,9297,9305,114,114,59,1,8659,97,114,59,1,10597,4,4,103,108,114,115,8793,8799,8805,8809,103,101,114,59,1,8224,101,116,104,59,1,8504,114,59,1,8595,104,4,2,59,118,8816,8818,1,8208,59,1,8867,4,2,107,108,8827,8834,97,114,111,119,59,1,10511,97,99,59,1,733,4,2,97,121,8845,8851,114,111,110,59,1,271,59,1,1076,4,3,59,97,111,8862,8864,8880,1,8518,4,2,103,114,8870,8876,103,101,114,59,1,8225,114,59,1,8650,116,115,101,113,59,1,10871,4,3,103,108,109,8895,8902,8907,5,176,1,59,8900,1,176,116,97,59,1,948,112,116,121,118,59,1,10673,4,2,105,114,8920,8926,115,104,116,59,1,10623,59,3,55349,56609,97,114,4,2,108,114,8938,8941,59,1,8643,59,1,8642,4,5,97,101,103,115,118,8956,8986,8989,8996,9001,109,4,3,59,111,115,8965,8967,8983,1,8900,110,100,4,2,59,115,8975,8977,1,8900,117,105,116,59,1,9830,59,1,9830,59,1,168,97,109,109,97,59,1,989,105,110,59,1,8946,4,3,59,105,111,9009,9011,9031,1,247,100,101,5,247,2,59,111,9020,9022,1,247,110,116,105,109,101,115,59,1,8903,110,120,59,1,8903,99,121,59,1,1106,99,4,2,111,114,9048,9053,114,110,59,1,8990,111,112,59,1,8973,4,5,108,112,116,117,119,9070,9076,9081,9130,9144,108,97,114,59,1,36,102,59,3,55349,56661,4,5,59,101,109,112,115,9093,9095,9109,9116,9122,1,729,113,4,2,59,100,9102,9104,1,8784,111,116,59,1,8785,105,110,117,115,59,1,8760,108,117,115,59,1,8724,113,117,97,114,101,59,1,8865,98,108,101,98,97,114,119,101,100,103,101,59,1,8966,110,4,3,97,100,104,9153,9160,9172,114,114,111,119,59,1,8595,111,119,110,97,114,114,111,119,115,59,1,8650,97,114,112,111,111,110,4,2,108,114,9184,9190,101,102,116,59,1,8643,105,103,104,116,59,1,8642,4,2,98,99,9203,9211,107,97,114,111,119,59,1,10512,4,2,111,114,9217,9222,114,110,59,1,8991,111,112,59,1,8972,4,3,99,111,116,9235,9248,9252,4,2,114,121,9241,9245,59,3,55349,56505,59,1,1109,108,59,1,10742,114,111,107,59,1,273,4,2,100,114,9264,9269,111,116,59,1,8945,105,4,2,59,102,9276,9278,1,9663,59,1,9662,4,2,97,104,9287,9292,114,114,59,1,8693,97,114,59,1,10607,97,110,103,108,101,59,1,10662,4,2,99,105,9311,9315,121,59,1,1119,103,114,97,114,114,59,1,10239,4,18,68,97,99,100,101,102,103,108,109,110,111,112,113,114,115,116,117,120,9361,9376,9398,9439,9444,9447,9462,9495,9531,9585,9598,9614,9659,9755,9771,9792,9808,9826,4,2,68,111,9367,9372,111,116,59,1,10871,116,59,1,8785,4,2,99,115,9382,9392,117,116,101,5,233,1,59,9390,1,233,116,101,114,59,1,10862,4,4,97,105,111,121,9408,9414,9430,9436,114,111,110,59,1,283,114,4,2,59,99,9421,9423,1,8790,5,234,1,59,9428,1,234,108,111,110,59,1,8789,59,1,1101,111,116,59,1,279,59,1,8519,4,2,68,114,9453,9458,111,116,59,1,8786,59,3,55349,56610,4,3,59,114,115,9470,9472,9482,1,10906,97,118,101,5,232,1,59,9480,1,232,4,2,59,100,9488,9490,1,10902,111,116,59,1,10904,4,4,59,105,108,115,9505,9507,9515,9518,1,10905,110,116,101,114,115,59,1,9191,59,1,8467,4,2,59,100,9524,9526,1,10901,111,116,59,1,10903,4,3,97,112,115,9539,9544,9564,99,114,59,1,275,116,121,4,3,59,115,118,9554,9556,9561,1,8709,101,116,59,1,8709,59,1,8709,112,4,2,49,59,9571,9583,4,2,51,52,9577,9580,59,1,8196,59,1,8197,1,8195,4,2,103,115,9591,9594,59,1,331,112,59,1,8194,4,2,103,112,9604,9609,111,110,59,1,281,102,59,3,55349,56662,4,3,97,108,115,9622,9635,9640,114,4,2,59,115,9629,9631,1,8917,108,59,1,10723,117,115,59,1,10865,105,4,3,59,108,118,9649,9651,9656,1,949,111,110,59,1,949,59,1,1013,4,4,99,115,117,118,9669,9686,9716,9747,4,2,105,111,9675,9680,114,99,59,1,8790,108,111,110,59,1,8789,4,2,105,108,9692,9696,109,59,1,8770,97,110,116,4,2,103,108,9705,9710,116,114,59,1,10902,101,115,115,59,1,10901,4,3,97,101,105,9724,9729,9734,108,115,59,1,61,115,116,59,1,8799,118,4,2,59,68,9741,9743,1,8801,68,59,1,10872,112,97,114,115,108,59,1,10725,4,2,68,97,9761,9766,111,116,59,1,8787,114,114,59,1,10609,4,3,99,100,105,9779,9783,9788,114,59,1,8495,111,116,59,1,8784,109,59,1,8770,4,2,97,104,9798,9801,59,1,951,5,240,1,59,9806,1,240,4,2,109,114,9814,9822,108,5,235,1,59,9820,1,235,111,59,1,8364,4,3,99,105,112,9834,9838,9843,108,59,1,33,115,116,59,1,8707,4,2,101,111,9849,9859,99,116,97,116,105,111,110,59,1,8496,110,101,110,116,105,97,108,101,59,1,8519,4,12,97,99,101,102,105,106,108,110,111,112,114,115,9896,9910,9914,9921,9954,9960,9967,9989,9994,10027,10036,10164,108,108,105,110,103,100,111,116,115,101,113,59,1,8786,121,59,1,1092,109,97,108,101,59,1,9792,4,3,105,108,114,9929,9935,9950,108,105,103,59,1,64259,4,2,105,108,9941,9945,103,59,1,64256,105,103,59,1,64260,59,3,55349,56611,108,105,103,59,1,64257,108,105,103,59,3,102,106,4,3,97,108,116,9975,9979,9984,116,59,1,9837,105,103,59,1,64258,110,115,59,1,9649,111,102,59,1,402,4,2,112,114,1e4,10005,102,59,3,55349,56663,4,2,97,107,10011,10016,108,108,59,1,8704,4,2,59,118,10022,10024,1,8916,59,1,10969,97,114,116,105,110,116,59,1,10765,4,2,97,111,10042,10159,4,2,99,115,10048,10155,4,6,49,50,51,52,53,55,10062,10102,10114,10135,10139,10151,4,6,50,51,52,53,54,56,10076,10083,10086,10093,10096,10099,5,189,1,59,10081,1,189,59,1,8531,5,188,1,59,10091,1,188,59,1,8533,59,1,8537,59,1,8539,4,2,51,53,10108,10111,59,1,8532,59,1,8534,4,3,52,53,56,10122,10129,10132,5,190,1,59,10127,1,190,59,1,8535,59,1,8540,53,59,1,8536,4,2,54,56,10145,10148,59,1,8538,59,1,8541,56,59,1,8542,108,59,1,8260,119,110,59,1,8994,99,114,59,3,55349,56507,4,17,69,97,98,99,100,101,102,103,105,106,108,110,111,114,115,116,118,10206,10217,10247,10254,10268,10273,10358,10363,10374,10380,10385,10406,10458,10464,10470,10497,10610,4,2,59,108,10212,10214,1,8807,59,1,10892,4,3,99,109,112,10225,10231,10244,117,116,101,59,1,501,109,97,4,2,59,100,10239,10241,1,947,59,1,989,59,1,10886,114,101,118,101,59,1,287,4,2,105,121,10260,10265,114,99,59,1,285,59,1,1075,111,116,59,1,289,4,4,59,108,113,115,10283,10285,10288,10308,1,8805,59,1,8923,4,3,59,113,115,10296,10298,10301,1,8805,59,1,8807,108,97,110,116,59,1,10878,4,4,59,99,100,108,10318,10320,10324,10345,1,10878,99,59,1,10921,111,116,4,2,59,111,10332,10334,1,10880,4,2,59,108,10340,10342,1,10882,59,1,10884,4,2,59,101,10351,10354,3,8923,65024,115,59,1,10900,114,59,3,55349,56612,4,2,59,103,10369,10371,1,8811,59,1,8921,109,101,108,59,1,8503,99,121,59,1,1107,4,4,59,69,97,106,10395,10397,10400,10403,1,8823,59,1,10898,59,1,10917,59,1,10916,4,4,69,97,101,115,10416,10419,10434,10453,59,1,8809,112,4,2,59,112,10426,10428,1,10890,114,111,120,59,1,10890,4,2,59,113,10440,10442,1,10888,4,2,59,113,10448,10450,1,10888,59,1,8809,105,109,59,1,8935,112,102,59,3,55349,56664,97,118,101,59,1,96,4,2,99,105,10476,10480,114,59,1,8458,109,4,3,59,101,108,10489,10491,10494,1,8819,59,1,10894,59,1,10896,5,62,6,59,99,100,108,113,114,10512,10514,10527,10532,10538,10545,1,62,4,2,99,105,10520,10523,59,1,10919,114,59,1,10874,111,116,59,1,8919,80,97,114,59,1,10645,117,101,115,116,59,1,10876,4,5,97,100,101,108,115,10557,10574,10579,10599,10605,4,2,112,114,10563,10570,112,114,111,120,59,1,10886,114,59,1,10616,111,116,59,1,8919,113,4,2,108,113,10586,10592,101,115,115,59,1,8923,108,101,115,115,59,1,10892,101,115,115,59,1,8823,105,109,59,1,8819,4,2,101,110,10616,10626,114,116,110,101,113,113,59,3,8809,65024,69,59,3,8809,65024,4,10,65,97,98,99,101,102,107,111,115,121,10653,10658,10713,10718,10724,10760,10765,10786,10850,10875,114,114,59,1,8660,4,4,105,108,109,114,10668,10674,10678,10684,114,115,112,59,1,8202,102,59,1,189,105,108,116,59,1,8459,4,2,100,114,10690,10695,99,121,59,1,1098,4,3,59,99,119,10703,10705,10710,1,8596,105,114,59,1,10568,59,1,8621,97,114,59,1,8463,105,114,99,59,1,293,4,3,97,108,114,10732,10748,10754,114,116,115,4,2,59,117,10741,10743,1,9829,105,116,59,1,9829,108,105,112,59,1,8230,99,111,110,59,1,8889,114,59,3,55349,56613,115,4,2,101,119,10772,10779,97,114,111,119,59,1,10533,97,114,111,119,59,1,10534,4,5,97,109,111,112,114,10798,10803,10809,10839,10844,114,114,59,1,8703,116,104,116,59,1,8763,107,4,2,108,114,10816,10827,101,102,116,97,114,114,111,119,59,1,8617,105,103,104,116,97,114,114,111,119,59,1,8618,102,59,3,55349,56665,98,97,114,59,1,8213,4,3,99,108,116,10858,10863,10869,114,59,3,55349,56509,97,115,104,59,1,8463,114,111,107,59,1,295,4,2,98,112,10881,10887,117,108,108,59,1,8259,104,101,110,59,1,8208,4,15,97,99,101,102,103,105,106,109,110,111,112,113,115,116,117,10925,10936,10958,10977,10990,11001,11039,11045,11101,11192,11220,11226,11237,11285,11299,99,117,116,101,5,237,1,59,10934,1,237,4,3,59,105,121,10944,10946,10955,1,8291,114,99,5,238,1,59,10953,1,238,59,1,1080,4,2,99,120,10964,10968,121,59,1,1077,99,108,5,161,1,59,10975,1,161,4,2,102,114,10983,10986,59,1,8660,59,3,55349,56614,114,97,118,101,5,236,1,59,10999,1,236,4,4,59,105,110,111,11011,11013,11028,11034,1,8520,4,2,105,110,11019,11024,110,116,59,1,10764,116,59,1,8749,102,105,110,59,1,10716,116,97,59,1,8489,108,105,103,59,1,307,4,3,97,111,112,11053,11092,11096,4,3,99,103,116,11061,11065,11088,114,59,1,299,4,3,101,108,112,11073,11076,11082,59,1,8465,105,110,101,59,1,8464,97,114,116,59,1,8465,104,59,1,305,102,59,1,8887,101,100,59,1,437,4,5,59,99,102,111,116,11113,11115,11121,11136,11142,1,8712,97,114,101,59,1,8453,105,110,4,2,59,116,11129,11131,1,8734,105,101,59,1,10717,100,111,116,59,1,305,4,5,59,99,101,108,112,11154,11156,11161,11179,11186,1,8747,97,108,59,1,8890,4,2,103,114,11167,11173,101,114,115,59,1,8484,99,97,108,59,1,8890,97,114,104,107,59,1,10775,114,111,100,59,1,10812,4,4,99,103,112,116,11202,11206,11211,11216,121,59,1,1105,111,110,59,1,303,102,59,3,55349,56666,97,59,1,953,114,111,100,59,1,10812,117,101,115,116,5,191,1,59,11235,1,191,4,2,99,105,11243,11248,114,59,3,55349,56510,110,4,5,59,69,100,115,118,11261,11263,11266,11271,11282,1,8712,59,1,8953,111,116,59,1,8949,4,2,59,118,11277,11279,1,8948,59,1,8947,59,1,8712,4,2,59,105,11291,11293,1,8290,108,100,101,59,1,297,4,2,107,109,11305,11310,99,121,59,1,1110,108,5,239,1,59,11316,1,239,4,6,99,102,109,111,115,117,11332,11346,11351,11357,11363,11380,4,2,105,121,11338,11343,114,99,59,1,309,59,1,1081,114,59,3,55349,56615,97,116,104,59,1,567,112,102,59,3,55349,56667,4,2,99,101,11369,11374,114,59,3,55349,56511,114,99,121,59,1,1112,107,99,121,59,1,1108,4,8,97,99,102,103,104,106,111,115,11404,11418,11433,11438,11445,11450,11455,11461,112,112,97,4,2,59,118,11413,11415,1,954,59,1,1008,4,2,101,121,11424,11430,100,105,108,59,1,311,59,1,1082,114,59,3,55349,56616,114,101,101,110,59,1,312,99,121,59,1,1093,99,121,59,1,1116,112,102,59,3,55349,56668,99,114,59,3,55349,56512,4,23,65,66,69,72,97,98,99,100,101,102,103,104,106,108,109,110,111,112,114,115,116,117,118,11515,11538,11544,11555,11560,11721,11780,11818,11868,12136,12160,12171,12203,12208,12246,12275,12327,12509,12523,12569,12641,12732,12752,4,3,97,114,116,11523,11528,11532,114,114,59,1,8666,114,59,1,8656,97,105,108,59,1,10523,97,114,114,59,1,10510,4,2,59,103,11550,11552,1,8806,59,1,10891,97,114,59,1,10594,4,9,99,101,103,109,110,112,113,114,116,11580,11586,11594,11600,11606,11624,11627,11636,11694,117,116,101,59,1,314,109,112,116,121,118,59,1,10676,114,97,110,59,1,8466,98,100,97,59,1,955,103,4,3,59,100,108,11615,11617,11620,1,10216,59,1,10641,101,59,1,10216,59,1,10885,117,111,5,171,1,59,11634,1,171,114,4,8,59,98,102,104,108,112,115,116,11655,11657,11669,11673,11677,11681,11685,11690,1,8592,4,2,59,102,11663,11665,1,8676,115,59,1,10527,115,59,1,10525,107,59,1,8617,112,59,1,8619,108,59,1,10553,105,109,59,1,10611,108,59,1,8610,4,3,59,97,101,11702,11704,11709,1,10923,105,108,59,1,10521,4,2,59,115,11715,11717,1,10925,59,3,10925,65024,4,3,97,98,114,11729,11734,11739,114,114,59,1,10508,114,107,59,1,10098,4,2,97,107,11745,11758,99,4,2,101,107,11752,11755,59,1,123,59,1,91,4,2,101,115,11764,11767,59,1,10635,108,4,2,100,117,11774,11777,59,1,10639,59,1,10637,4,4,97,101,117,121,11790,11796,11811,11815,114,111,110,59,1,318,4,2,100,105,11802,11807,105,108,59,1,316,108,59,1,8968,98,59,1,123,59,1,1083,4,4,99,113,114,115,11828,11832,11845,11864,97,59,1,10550,117,111,4,2,59,114,11840,11842,1,8220,59,1,8222,4,2,100,117,11851,11857,104,97,114,59,1,10599,115,104,97,114,59,1,10571,104,59,1,8626,4,5,59,102,103,113,115,11880,11882,12008,12011,12031,1,8804,116,4,5,97,104,108,114,116,11895,11913,11935,11947,11996,114,114,111,119,4,2,59,116,11905,11907,1,8592,97,105,108,59,1,8610,97,114,112,111,111,110,4,2,100,117,11925,11931,111,119,110,59,1,8637,112,59,1,8636,101,102,116,97,114,114,111,119,115,59,1,8647,105,103,104,116,4,3,97,104,115,11959,11974,11984,114,114,111,119,4,2,59,115,11969,11971,1,8596,59,1,8646,97,114,112,111,111,110,115,59,1,8651,113,117,105,103,97,114,114,111,119,59,1,8621,104,114,101,101,116,105,109,101,115,59,1,8907,59,1,8922,4,3,59,113,115,12019,12021,12024,1,8804,59,1,8806,108,97,110,116,59,1,10877,4,5,59,99,100,103,115,12043,12045,12049,12070,12083,1,10877,99,59,1,10920,111,116,4,2,59,111,12057,12059,1,10879,4,2,59,114,12065,12067,1,10881,59,1,10883,4,2,59,101,12076,12079,3,8922,65024,115,59,1,10899,4,5,97,100,101,103,115,12095,12103,12108,12126,12131,112,112,114,111,120,59,1,10885,111,116,59,1,8918,113,4,2,103,113,12115,12120,116,114,59,1,8922,103,116,114,59,1,10891,116,114,59,1,8822,105,109,59,1,8818,4,3,105,108,114,12144,12150,12156,115,104,116,59,1,10620,111,111,114,59,1,8970,59,3,55349,56617,4,2,59,69,12166,12168,1,8822,59,1,10897,4,2,97,98,12177,12198,114,4,2,100,117,12184,12187,59,1,8637,4,2,59,108,12193,12195,1,8636,59,1,10602,108,107,59,1,9604,99,121,59,1,1113,4,5,59,97,99,104,116,12220,12222,12227,12235,12241,1,8810,114,114,59,1,8647,111,114,110,101,114,59,1,8990,97,114,100,59,1,10603,114,105,59,1,9722,4,2,105,111,12252,12258,100,111,116,59,1,320,117,115,116,4,2,59,97,12267,12269,1,9136,99,104,101,59,1,9136,4,4,69,97,101,115,12285,12288,12303,12322,59,1,8808,112,4,2,59,112,12295,12297,1,10889,114,111,120,59,1,10889,4,2,59,113,12309,12311,1,10887,4,2,59,113,12317,12319,1,10887,59,1,8808,105,109,59,1,8934,4,8,97,98,110,111,112,116,119,122,12345,12359,12364,12421,12446,12467,12474,12490,4,2,110,114,12351,12355,103,59,1,10220,114,59,1,8701,114,107,59,1,10214,103,4,3,108,109,114,12373,12401,12409,101,102,116,4,2,97,114,12382,12389,114,114,111,119,59,1,10229,105,103,104,116,97,114,114,111,119,59,1,10231,97,112,115,116,111,59,1,10236,105,103,104,116,97,114,114,111,119,59,1,10230,112,97,114,114,111,119,4,2,108,114,12433,12439,101,102,116,59,1,8619,105,103,104,116,59,1,8620,4,3,97,102,108,12454,12458,12462,114,59,1,10629,59,3,55349,56669,117,115,59,1,10797,105,109,101,115,59,1,10804,4,2,97,98,12480,12485,115,116,59,1,8727,97,114,59,1,95,4,3,59,101,102,12498,12500,12506,1,9674,110,103,101,59,1,9674,59,1,10731,97,114,4,2,59,108,12517,12519,1,40,116,59,1,10643,4,5,97,99,104,109,116,12535,12540,12548,12561,12564,114,114,59,1,8646,111,114,110,101,114,59,1,8991,97,114,4,2,59,100,12556,12558,1,8651,59,1,10605,59,1,8206,114,105,59,1,8895,4,6,97,99,104,105,113,116,12583,12589,12594,12597,12614,12635,113,117,111,59,1,8249,114,59,3,55349,56513,59,1,8624,109,4,3,59,101,103,12606,12608,12611,1,8818,59,1,10893,59,1,10895,4,2,98,117,12620,12623,59,1,91,111,4,2,59,114,12630,12632,1,8216,59,1,8218,114,111,107,59,1,322,5,60,8,59,99,100,104,105,108,113,114,12660,12662,12675,12680,12686,12692,12698,12705,1,60,4,2,99,105,12668,12671,59,1,10918,114,59,1,10873,111,116,59,1,8918,114,101,101,59,1,8907,109,101,115,59,1,8905,97,114,114,59,1,10614,117,101,115,116,59,1,10875,4,2,80,105,12711,12716,97,114,59,1,10646,4,3,59,101,102,12724,12726,12729,1,9667,59,1,8884,59,1,9666,114,4,2,100,117,12739,12746,115,104,97,114,59,1,10570,104,97,114,59,1,10598,4,2,101,110,12758,12768,114,116,110,101,113,113,59,3,8808,65024,69,59,3,8808,65024,4,14,68,97,99,100,101,102,104,105,108,110,111,112,115,117,12803,12809,12893,12908,12914,12928,12933,12937,13011,13025,13032,13049,13052,13069,68,111,116,59,1,8762,4,4,99,108,112,114,12819,12827,12849,12887,114,5,175,1,59,12825,1,175,4,2,101,116,12833,12836,59,1,9794,4,2,59,101,12842,12844,1,10016,115,101,59,1,10016,4,2,59,115,12855,12857,1,8614,116,111,4,4,59,100,108,117,12869,12871,12877,12883,1,8614,111,119,110,59,1,8615,101,102,116,59,1,8612,112,59,1,8613,107,101,114,59,1,9646,4,2,111,121,12899,12905,109,109,97,59,1,10793,59,1,1084,97,115,104,59,1,8212,97,115,117,114,101,100,97,110,103,108,101,59,1,8737,114,59,3,55349,56618,111,59,1,8487,4,3,99,100,110,12945,12954,12985,114,111,5,181,1,59,12952,1,181,4,4,59,97,99,100,12964,12966,12971,12976,1,8739,115,116,59,1,42,105,114,59,1,10992,111,116,5,183,1,59,12983,1,183,117,115,4,3,59,98,100,12995,12997,13e3,1,8722,59,1,8863,4,2,59,117,13006,13008,1,8760,59,1,10794,4,2,99,100,13017,13021,112,59,1,10971,114,59,1,8230,112,108,117,115,59,1,8723,4,2,100,112,13038,13044,101,108,115,59,1,8871,102,59,3,55349,56670,59,1,8723,4,2,99,116,13058,13063,114,59,3,55349,56514,112,111,115,59,1,8766,4,3,59,108,109,13077,13079,13087,1,956,116,105,109,97,112,59,1,8888,97,112,59,1,8888,4,24,71,76,82,86,97,98,99,100,101,102,103,104,105,106,108,109,111,112,114,115,116,117,118,119,13142,13165,13217,13229,13247,13330,13359,13414,13420,13508,13513,13579,13602,13626,13631,13762,13767,13855,13936,13995,14214,14285,14312,14432,4,2,103,116,13148,13152,59,3,8921,824,4,2,59,118,13158,13161,3,8811,8402,59,3,8811,824,4,3,101,108,116,13173,13200,13204,102,116,4,2,97,114,13181,13188,114,114,111,119,59,1,8653,105,103,104,116,97,114,114,111,119,59,1,8654,59,3,8920,824,4,2,59,118,13210,13213,3,8810,8402,59,3,8810,824,105,103,104,116,97,114,114,111,119,59,1,8655,4,2,68,100,13235,13241,97,115,104,59,1,8879,97,115,104,59,1,8878,4,5,98,99,110,112,116,13259,13264,13270,13275,13308,108,97,59,1,8711,117,116,101,59,1,324,103,59,3,8736,8402,4,5,59,69,105,111,112,13287,13289,13293,13298,13302,1,8777,59,3,10864,824,100,59,3,8779,824,115,59,1,329,114,111,120,59,1,8777,117,114,4,2,59,97,13316,13318,1,9838,108,4,2,59,115,13325,13327,1,9838,59,1,8469,4,2,115,117,13336,13344,112,5,160,1,59,13342,1,160,109,112,4,2,59,101,13352,13355,3,8782,824,59,3,8783,824,4,5,97,101,111,117,121,13371,13385,13391,13407,13411,4,2,112,114,13377,13380,59,1,10819,111,110,59,1,328,100,105,108,59,1,326,110,103,4,2,59,100,13399,13401,1,8775,111,116,59,3,10861,824,112,59,1,10818,59,1,1085,97,115,104,59,1,8211,4,7,59,65,97,100,113,115,120,13436,13438,13443,13466,13472,13478,13494,1,8800,114,114,59,1,8663,114,4,2,104,114,13450,13454,107,59,1,10532,4,2,59,111,13460,13462,1,8599,119,59,1,8599,111,116,59,3,8784,824,117,105,118,59,1,8802,4,2,101,105,13484,13489,97,114,59,1,10536,109,59,3,8770,824,105,115,116,4,2,59,115,13503,13505,1,8708,59,1,8708,114,59,3,55349,56619,4,4,69,101,115,116,13523,13527,13563,13568,59,3,8807,824,4,3,59,113,115,13535,13537,13559,1,8817,4,3,59,113,115,13545,13547,13551,1,8817,59,3,8807,824,108,97,110,116,59,3,10878,824,59,3,10878,824,105,109,59,1,8821,4,2,59,114,13574,13576,1,8815,59,1,8815,4,3,65,97,112,13587,13592,13597,114,114,59,1,8654,114,114,59,1,8622,97,114,59,1,10994,4,3,59,115,118,13610,13612,13623,1,8715,4,2,59,100,13618,13620,1,8956,59,1,8954,59,1,8715,99,121,59,1,1114,4,7,65,69,97,100,101,115,116,13647,13652,13656,13661,13665,13737,13742,114,114,59,1,8653,59,3,8806,824,114,114,59,1,8602,114,59,1,8229,4,4,59,102,113,115,13675,13677,13703,13725,1,8816,116,4,2,97,114,13684,13691,114,114,111,119,59,1,8602,105,103,104,116,97,114,114,111,119,59,1,8622,4,3,59,113,115,13711,13713,13717,1,8816,59,3,8806,824,108,97,110,116,59,3,10877,824,4,2,59,115,13731,13734,3,10877,824,59,1,8814,105,109,59,1,8820,4,2,59,114,13748,13750,1,8814,105,4,2,59,101,13757,13759,1,8938,59,1,8940,105,100,59,1,8740,4,2,112,116,13773,13778,102,59,3,55349,56671,5,172,3,59,105,110,13787,13789,13829,1,172,110,4,4,59,69,100,118,13800,13802,13806,13812,1,8713,59,3,8953,824,111,116,59,3,8949,824,4,3,97,98,99,13820,13823,13826,59,1,8713,59,1,8951,59,1,8950,105,4,2,59,118,13836,13838,1,8716,4,3,97,98,99,13846,13849,13852,59,1,8716,59,1,8958,59,1,8957,4,3,97,111,114,13863,13892,13899,114,4,4,59,97,115,116,13874,13876,13883,13888,1,8742,108,108,101,108,59,1,8742,108,59,3,11005,8421,59,3,8706,824,108,105,110,116,59,1,10772,4,3,59,99,101,13907,13909,13914,1,8832,117,101,59,1,8928,4,2,59,99,13920,13923,3,10927,824,4,2,59,101,13929,13931,1,8832,113,59,3,10927,824,4,4,65,97,105,116,13946,13951,13971,13982,114,114,59,1,8655,114,114,4,3,59,99,119,13961,13963,13967,1,8603,59,3,10547,824,59,3,8605,824,103,104,116,97,114,114,111,119,59,1,8603,114,105,4,2,59,101,13990,13992,1,8939,59,1,8941,4,7,99,104,105,109,112,113,117,14011,14036,14060,14080,14085,14090,14106,4,4,59,99,101,114,14021,14023,14028,14032,1,8833,117,101,59,1,8929,59,3,10928,824,59,3,55349,56515,111,114,116,4,2,109,112,14045,14050,105,100,59,1,8740,97,114,97,108,108,101,108,59,1,8742,109,4,2,59,101,14067,14069,1,8769,4,2,59,113,14075,14077,1,8772,59,1,8772,105,100,59,1,8740,97,114,59,1,8742,115,117,4,2,98,112,14098,14102,101,59,1,8930,101,59,1,8931,4,3,98,99,112,14114,14157,14171,4,4,59,69,101,115,14124,14126,14130,14133,1,8836,59,3,10949,824,59,1,8840,101,116,4,2,59,101,14141,14144,3,8834,8402,113,4,2,59,113,14151,14153,1,8840,59,3,10949,824,99,4,2,59,101,14164,14166,1,8833,113,59,3,10928,824,4,4,59,69,101,115,14181,14183,14187,14190,1,8837,59,3,10950,824,59,1,8841,101,116,4,2,59,101,14198,14201,3,8835,8402,113,4,2,59,113,14208,14210,1,8841,59,3,10950,824,4,4,103,105,108,114,14224,14228,14238,14242,108,59,1,8825,108,100,101,5,241,1,59,14236,1,241,103,59,1,8824,105,97,110,103,108,101,4,2,108,114,14254,14269,101,102,116,4,2,59,101,14263,14265,1,8938,113,59,1,8940,105,103,104,116,4,2,59,101,14279,14281,1,8939,113,59,1,8941,4,2,59,109,14291,14293,1,957,4,3,59,101,115,14301,14303,14308,1,35,114,111,59,1,8470,112,59,1,8199,4,9,68,72,97,100,103,105,108,114,115,14332,14338,14344,14349,14355,14369,14376,14408,14426,97,115,104,59,1,8877,97,114,114,59,1,10500,112,59,3,8781,8402,97,115,104,59,1,8876,4,2,101,116,14361,14365,59,3,8805,8402,59,3,62,8402,110,102,105,110,59,1,10718,4,3,65,101,116,14384,14389,14393,114,114,59,1,10498,59,3,8804,8402,4,2,59,114,14399,14402,3,60,8402,105,101,59,3,8884,8402,4,2,65,116,14414,14419,114,114,59,1,10499,114,105,101,59,3,8885,8402,105,109,59,3,8764,8402,4,3,65,97,110,14440,14445,14468,114,114,59,1,8662,114,4,2,104,114,14452,14456,107,59,1,10531,4,2,59,111,14462,14464,1,8598,119,59,1,8598,101,97,114,59,1,10535,4,18,83,97,99,100,101,102,103,104,105,108,109,111,112,114,115,116,117,118,14512,14515,14535,14560,14597,14603,14618,14643,14657,14662,14701,14741,14747,14769,14851,14877,14907,14916,59,1,9416,4,2,99,115,14521,14531,117,116,101,5,243,1,59,14529,1,243,116,59,1,8859,4,2,105,121,14541,14557,114,4,2,59,99,14548,14550,1,8858,5,244,1,59,14555,1,244,59,1,1086,4,5,97,98,105,111,115,14572,14577,14583,14587,14591,115,104,59,1,8861,108,97,99,59,1,337,118,59,1,10808,116,59,1,8857,111,108,100,59,1,10684,108,105,103,59,1,339,4,2,99,114,14609,14614,105,114,59,1,10687,59,3,55349,56620,4,3,111,114,116,14626,14630,14640,110,59,1,731,97,118,101,5,242,1,59,14638,1,242,59,1,10689,4,2,98,109,14649,14654,97,114,59,1,10677,59,1,937,110,116,59,1,8750,4,4,97,99,105,116,14672,14677,14693,14698,114,114,59,1,8634,4,2,105,114,14683,14687,114,59,1,10686,111,115,115,59,1,10683,110,101,59,1,8254,59,1,10688,4,3,97,101,105,14709,14714,14719,99,114,59,1,333,103,97,59,1,969,4,3,99,100,110,14727,14733,14736,114,111,110,59,1,959,59,1,10678,117,115,59,1,8854,112,102,59,3,55349,56672,4,3,97,101,108,14755,14759,14764,114,59,1,10679,114,112,59,1,10681,117,115,59,1,8853,4,7,59,97,100,105,111,115,118,14785,14787,14792,14831,14837,14841,14848,1,8744,114,114,59,1,8635,4,4,59,101,102,109,14802,14804,14817,14824,1,10845,114,4,2,59,111,14811,14813,1,8500,102,59,1,8500,5,170,1,59,14822,1,170,5,186,1,59,14829,1,186,103,111,102,59,1,8886,114,59,1,10838,108,111,112,101,59,1,10839,59,1,10843,4,3,99,108,111,14859,14863,14873,114,59,1,8500,97,115,104,5,248,1,59,14871,1,248,108,59,1,8856,105,4,2,108,109,14884,14893,100,101,5,245,1,59,14891,1,245,101,115,4,2,59,97,14901,14903,1,8855,115,59,1,10806,109,108,5,246,1,59,14914,1,246,98,97,114,59,1,9021,4,12,97,99,101,102,104,105,108,109,111,114,115,117,14948,14992,14996,15033,15038,15068,15090,15189,15192,15222,15427,15441,114,4,4,59,97,115,116,14959,14961,14976,14989,1,8741,5,182,2,59,108,14968,14970,1,182,108,101,108,59,1,8741,4,2,105,108,14982,14986,109,59,1,10995,59,1,11005,59,1,8706,121,59,1,1087,114,4,5,99,105,109,112,116,15009,15014,15019,15024,15027,110,116,59,1,37,111,100,59,1,46,105,108,59,1,8240,59,1,8869,101,110,107,59,1,8241,114,59,3,55349,56621,4,3,105,109,111,15046,15057,15063,4,2,59,118,15052,15054,1,966,59,1,981,109,97,116,59,1,8499,110,101,59,1,9742,4,3,59,116,118,15076,15078,15087,1,960,99,104,102,111,114,107,59,1,8916,59,1,982,4,2,97,117,15096,15119,110,4,2,99,107,15103,15115,107,4,2,59,104,15110,15112,1,8463,59,1,8462,118,59,1,8463,115,4,9,59,97,98,99,100,101,109,115,116,15140,15142,15148,15151,15156,15168,15171,15179,15184,1,43,99,105,114,59,1,10787,59,1,8862,105,114,59,1,10786,4,2,111,117,15162,15165,59,1,8724,59,1,10789,59,1,10866,110,5,177,1,59,15177,1,177,105,109,59,1,10790,119,111,59,1,10791,59,1,177,4,3,105,112,117,15200,15208,15213,110,116,105,110,116,59,1,10773,102,59,3,55349,56673,110,100,5,163,1,59,15220,1,163,4,10,59,69,97,99,101,105,110,111,115,117,15244,15246,15249,15253,15258,15334,15347,15367,15416,15421,1,8826,59,1,10931,112,59,1,10935,117,101,59,1,8828,4,2,59,99,15264,15266,1,10927,4,6,59,97,99,101,110,115,15280,15282,15290,15299,15303,15329,1,8826,112,112,114,111,120,59,1,10935,117,114,108,121,101,113,59,1,8828,113,59,1,10927,4,3,97,101,115,15311,15319,15324,112,112,114,111,120,59,1,10937,113,113,59,1,10933,105,109,59,1,8936,105,109,59,1,8830,109,101,4,2,59,115,15342,15344,1,8242,59,1,8473,4,3,69,97,115,15355,15358,15362,59,1,10933,112,59,1,10937,105,109,59,1,8936,4,3,100,102,112,15375,15378,15404,59,1,8719,4,3,97,108,115,15386,15392,15398,108,97,114,59,1,9006,105,110,101,59,1,8978,117,114,102,59,1,8979,4,2,59,116,15410,15412,1,8733,111,59,1,8733,105,109,59,1,8830,114,101,108,59,1,8880,4,2,99,105,15433,15438,114,59,3,55349,56517,59,1,968,110,99,115,112,59,1,8200,4,6,102,105,111,112,115,117,15462,15467,15472,15478,15485,15491,114,59,3,55349,56622,110,116,59,1,10764,112,102,59,3,55349,56674,114,105,109,101,59,1,8279,99,114,59,3,55349,56518,4,3,97,101,111,15499,15520,15534,116,4,2,101,105,15506,15515,114,110,105,111,110,115,59,1,8461,110,116,59,1,10774,115,116,4,2,59,101,15528,15530,1,63,113,59,1,8799,116,5,34,1,59,15540,1,34,4,21,65,66,72,97,98,99,100,101,102,104,105,108,109,110,111,112,114,115,116,117,120,15586,15609,15615,15620,15796,15855,15893,15931,15977,16001,16039,16183,16204,16222,16228,16285,16312,16318,16363,16408,16416,4,3,97,114,116,15594,15599,15603,114,114,59,1,8667,114,59,1,8658,97,105,108,59,1,10524,97,114,114,59,1,10511,97,114,59,1,10596,4,7,99,100,101,110,113,114,116,15636,15651,15656,15664,15687,15696,15770,4,2,101,117,15642,15646,59,3,8765,817,116,101,59,1,341,105,99,59,1,8730,109,112,116,121,118,59,1,10675,103,4,4,59,100,101,108,15675,15677,15680,15683,1,10217,59,1,10642,59,1,10661,101,59,1,10217,117,111,5,187,1,59,15694,1,187,114,4,11,59,97,98,99,102,104,108,112,115,116,119,15721,15723,15727,15739,15742,15746,15750,15754,15758,15763,15767,1,8594,112,59,1,10613,4,2,59,102,15733,15735,1,8677,115,59,1,10528,59,1,10547,115,59,1,10526,107,59,1,8618,112,59,1,8620,108,59,1,10565,105,109,59,1,10612,108,59,1,8611,59,1,8605,4,2,97,105,15776,15781,105,108,59,1,10522,111,4,2,59,110,15788,15790,1,8758,97,108,115,59,1,8474,4,3,97,98,114,15804,15809,15814,114,114,59,1,10509,114,107,59,1,10099,4,2,97,107,15820,15833,99,4,2,101,107,15827,15830,59,1,125,59,1,93,4,2,101,115,15839,15842,59,1,10636,108,4,2,100,117,15849,15852,59,1,10638,59,1,10640,4,4,97,101,117,121,15865,15871,15886,15890,114,111,110,59,1,345,4,2,100,105,15877,15882,105,108,59,1,343,108,59,1,8969,98,59,1,125,59,1,1088,4,4,99,108,113,115,15903,15907,15914,15927,97,59,1,10551,100,104,97,114,59,1,10601,117,111,4,2,59,114,15922,15924,1,8221,59,1,8221,104,59,1,8627,4,3,97,99,103,15939,15966,15970,108,4,4,59,105,112,115,15950,15952,15957,15963,1,8476,110,101,59,1,8475,97,114,116,59,1,8476,59,1,8477,116,59,1,9645,5,174,1,59,15975,1,174,4,3,105,108,114,15985,15991,15997,115,104,116,59,1,10621,111,111,114,59,1,8971,59,3,55349,56623,4,2,97,111,16007,16028,114,4,2,100,117,16014,16017,59,1,8641,4,2,59,108,16023,16025,1,8640,59,1,10604,4,2,59,118,16034,16036,1,961,59,1,1009,4,3,103,110,115,16047,16167,16171,104,116,4,6,97,104,108,114,115,116,16063,16081,16103,16130,16143,16155,114,114,111,119,4,2,59,116,16073,16075,1,8594,97,105,108,59,1,8611,97,114,112,111,111,110,4,2,100,117,16093,16099,111,119,110,59,1,8641,112,59,1,8640,101,102,116,4,2,97,104,16112,16120,114,114,111,119,115,59,1,8644,97,114,112,111,111,110,115,59,1,8652,105,103,104,116,97,114,114,111,119,115,59,1,8649,113,117,105,103,97,114,114,111,119,59,1,8605,104,114,101,101,116,105,109,101,115,59,1,8908,103,59,1,730,105,110,103,100,111,116,115,101,113,59,1,8787,4,3,97,104,109,16191,16196,16201,114,114,59,1,8644,97,114,59,1,8652,59,1,8207,111,117,115,116,4,2,59,97,16214,16216,1,9137,99,104,101,59,1,9137,109,105,100,59,1,10990,4,4,97,98,112,116,16238,16252,16257,16278,4,2,110,114,16244,16248,103,59,1,10221,114,59,1,8702,114,107,59,1,10215,4,3,97,102,108,16265,16269,16273,114,59,1,10630,59,3,55349,56675,117,115,59,1,10798,105,109,101,115,59,1,10805,4,2,97,112,16291,16304,114,4,2,59,103,16298,16300,1,41,116,59,1,10644,111,108,105,110,116,59,1,10770,97,114,114,59,1,8649,4,4,97,99,104,113,16328,16334,16339,16342,113,117,111,59,1,8250,114,59,3,55349,56519,59,1,8625,4,2,98,117,16348,16351,59,1,93,111,4,2,59,114,16358,16360,1,8217,59,1,8217,4,3,104,105,114,16371,16377,16383,114,101,101,59,1,8908,109,101,115,59,1,8906,105,4,4,59,101,102,108,16394,16396,16399,16402,1,9657,59,1,8885,59,1,9656,116,114,105,59,1,10702,108,117,104,97,114,59,1,10600,59,1,8478,4,19,97,98,99,100,101,102,104,105,108,109,111,112,113,114,115,116,117,119,122,16459,16466,16472,16572,16590,16672,16687,16746,16844,16850,16924,16963,16988,17115,17121,17154,17206,17614,17656,99,117,116,101,59,1,347,113,117,111,59,1,8218,4,10,59,69,97,99,101,105,110,112,115,121,16494,16496,16499,16513,16518,16531,16536,16556,16564,16569,1,8827,59,1,10932,4,2,112,114,16505,16508,59,1,10936,111,110,59,1,353,117,101,59,1,8829,4,2,59,100,16524,16526,1,10928,105,108,59,1,351,114,99,59,1,349,4,3,69,97,115,16544,16547,16551,59,1,10934,112,59,1,10938,105,109,59,1,8937,111,108,105,110,116,59,1,10771,105,109,59,1,8831,59,1,1089,111,116,4,3,59,98,101,16582,16584,16587,1,8901,59,1,8865,59,1,10854,4,7,65,97,99,109,115,116,120,16606,16611,16634,16642,16646,16652,16668,114,114,59,1,8664,114,4,2,104,114,16618,16622,107,59,1,10533,4,2,59,111,16628,16630,1,8600,119,59,1,8600,116,5,167,1,59,16640,1,167,105,59,1,59,119,97,114,59,1,10537,109,4,2,105,110,16659,16665,110,117,115,59,1,8726,59,1,8726,116,59,1,10038,114,4,2,59,111,16679,16682,3,55349,56624,119,110,59,1,8994,4,4,97,99,111,121,16697,16702,16716,16739,114,112,59,1,9839,4,2,104,121,16708,16713,99,121,59,1,1097,59,1,1096,114,116,4,2,109,112,16724,16729,105,100,59,1,8739,97,114,97,108,108,101,108,59,1,8741,5,173,1,59,16744,1,173,4,2,103,109,16752,16770,109,97,4,3,59,102,118,16762,16764,16767,1,963,59,1,962,59,1,962,4,8,59,100,101,103,108,110,112,114,16788,16790,16795,16806,16817,16828,16832,16838,1,8764,111,116,59,1,10858,4,2,59,113,16801,16803,1,8771,59,1,8771,4,2,59,69,16812,16814,1,10910,59,1,10912,4,2,59,69,16823,16825,1,10909,59,1,10911,101,59,1,8774,108,117,115,59,1,10788,97,114,114,59,1,10610,97,114,114,59,1,8592,4,4,97,101,105,116,16860,16883,16891,16904,4,2,108,115,16866,16878,108,115,101,116,109,105,110,117,115,59,1,8726,104,112,59,1,10803,112,97,114,115,108,59,1,10724,4,2,100,108,16897,16900,59,1,8739,101,59,1,8995,4,2,59,101,16910,16912,1,10922,4,2,59,115,16918,16920,1,10924,59,3,10924,65024,4,3,102,108,112,16932,16938,16958,116,99,121,59,1,1100,4,2,59,98,16944,16946,1,47,4,2,59,97,16952,16954,1,10692,114,59,1,9023,102,59,3,55349,56676,97,4,2,100,114,16970,16985,101,115,4,2,59,117,16978,16980,1,9824,105,116,59,1,9824,59,1,8741,4,3,99,115,117,16996,17028,17089,4,2,97,117,17002,17015,112,4,2,59,115,17009,17011,1,8851,59,3,8851,65024,112,4,2,59,115,17022,17024,1,8852,59,3,8852,65024,117,4,2,98,112,17035,17062,4,3,59,101,115,17043,17045,17048,1,8847,59,1,8849,101,116,4,2,59,101,17056,17058,1,8847,113,59,1,8849,4,3,59,101,115,17070,17072,17075,1,8848,59,1,8850,101,116,4,2,59,101,17083,17085,1,8848,113,59,1,8850,4,3,59,97,102,17097,17099,17112,1,9633,114,4,2,101,102,17106,17109,59,1,9633,59,1,9642,59,1,9642,97,114,114,59,1,8594,4,4,99,101,109,116,17131,17136,17142,17148,114,59,3,55349,56520,116,109,110,59,1,8726,105,108,101,59,1,8995,97,114,102,59,1,8902,4,2,97,114,17160,17172,114,4,2,59,102,17167,17169,1,9734,59,1,9733,4,2,97,110,17178,17202,105,103,104,116,4,2,101,112,17188,17197,112,115,105,108,111,110,59,1,1013,104,105,59,1,981,115,59,1,175,4,5,98,99,109,110,112,17218,17351,17420,17423,17427,4,9,59,69,100,101,109,110,112,114,115,17238,17240,17243,17248,17261,17267,17279,17285,17291,1,8834,59,1,10949,111,116,59,1,10941,4,2,59,100,17254,17256,1,8838,111,116,59,1,10947,117,108,116,59,1,10945,4,2,69,101,17273,17276,59,1,10955,59,1,8842,108,117,115,59,1,10943,97,114,114,59,1,10617,4,3,101,105,117,17299,17335,17339,116,4,3,59,101,110,17308,17310,17322,1,8834,113,4,2,59,113,17317,17319,1,8838,59,1,10949,101,113,4,2,59,113,17330,17332,1,8842,59,1,10955,109,59,1,10951,4,2,98,112,17345,17348,59,1,10965,59,1,10963,99,4,6,59,97,99,101,110,115,17366,17368,17376,17385,17389,17415,1,8827,112,112,114,111,120,59,1,10936,117,114,108,121,101,113,59,1,8829,113,59,1,10928,4,3,97,101,115,17397,17405,17410,112,112,114,111,120,59,1,10938,113,113,59,1,10934,105,109,59,1,8937,105,109,59,1,8831,59,1,8721,103,59,1,9834,4,13,49,50,51,59,69,100,101,104,108,109,110,112,115,17455,17462,17469,17476,17478,17481,17496,17509,17524,17530,17536,17548,17554,5,185,1,59,17460,1,185,5,178,1,59,17467,1,178,5,179,1,59,17474,1,179,1,8835,59,1,10950,4,2,111,115,17487,17491,116,59,1,10942,117,98,59,1,10968,4,2,59,100,17502,17504,1,8839,111,116,59,1,10948,115,4,2,111,117,17516,17520,108,59,1,10185,98,59,1,10967,97,114,114,59,1,10619,117,108,116,59,1,10946,4,2,69,101,17542,17545,59,1,10956,59,1,8843,108,117,115,59,1,10944,4,3,101,105,117,17562,17598,17602,116,4,3,59,101,110,17571,17573,17585,1,8835,113,4,2,59,113,17580,17582,1,8839,59,1,10950,101,113,4,2,59,113,17593,17595,1,8843,59,1,10956,109,59,1,10952,4,2,98,112,17608,17611,59,1,10964,59,1,10966,4,3,65,97,110,17622,17627,17650,114,114,59,1,8665,114,4,2,104,114,17634,17638,107,59,1,10534,4,2,59,111,17644,17646,1,8601,119,59,1,8601,119,97,114,59,1,10538,108,105,103,5,223,1,59,17664,1,223,4,13,97,98,99,100,101,102,104,105,111,112,114,115,119,17694,17709,17714,17737,17742,17749,17754,17860,17905,17957,17964,18090,18122,4,2,114,117,17700,17706,103,101,116,59,1,8982,59,1,964,114,107,59,1,9140,4,3,97,101,121,17722,17728,17734,114,111,110,59,1,357,100,105,108,59,1,355,59,1,1090,111,116,59,1,8411,108,114,101,99,59,1,8981,114,59,3,55349,56625,4,4,101,105,107,111,17764,17805,17836,17851,4,2,114,116,17770,17786,101,4,2,52,102,17777,17780,59,1,8756,111,114,101,59,1,8756,97,4,3,59,115,118,17795,17797,17802,1,952,121,109,59,1,977,59,1,977,4,2,99,110,17811,17831,107,4,2,97,115,17818,17826,112,112,114,111,120,59,1,8776,105,109,59,1,8764,115,112,59,1,8201,4,2,97,115,17842,17846,112,59,1,8776,105,109,59,1,8764,114,110,5,254,1,59,17858,1,254,4,3,108,109,110,17868,17873,17901,100,101,59,1,732,101,115,5,215,3,59,98,100,17884,17886,17898,1,215,4,2,59,97,17892,17894,1,8864,114,59,1,10801,59,1,10800,116,59,1,8749,4,3,101,112,115,17913,17917,17953,97,59,1,10536,4,4,59,98,99,102,17927,17929,17934,17939,1,8868,111,116,59,1,9014,105,114,59,1,10993,4,2,59,111,17945,17948,3,55349,56677,114,107,59,1,10970,97,59,1,10537,114,105,109,101,59,1,8244,4,3,97,105,112,17972,17977,18082,100,101,59,1,8482,4,7,97,100,101,109,112,115,116,17993,18051,18056,18059,18066,18072,18076,110,103,108,101,4,5,59,100,108,113,114,18009,18011,18017,18032,18035,1,9653,111,119,110,59,1,9663,101,102,116,4,2,59,101,18026,18028,1,9667,113,59,1,8884,59,1,8796,105,103,104,116,4,2,59,101,18045,18047,1,9657,113,59,1,8885,111,116,59,1,9708,59,1,8796,105,110,117,115,59,1,10810,108,117,115,59,1,10809,98,59,1,10701,105,109,101,59,1,10811,101,122,105,117,109,59,1,9186,4,3,99,104,116,18098,18111,18116,4,2,114,121,18104,18108,59,3,55349,56521,59,1,1094,99,121,59,1,1115,114,111,107,59,1,359,4,2,105,111,18128,18133,120,116,59,1,8812,104,101,97,100,4,2,108,114,18143,18154,101,102,116,97,114,114,111,119,59,1,8606,105,103,104,116,97,114,114,111,119,59,1,8608,4,18,65,72,97,98,99,100,102,103,104,108,109,111,112,114,115,116,117,119,18204,18209,18214,18234,18250,18268,18292,18308,18319,18343,18379,18397,18413,18504,18547,18553,18584,18603,114,114,59,1,8657,97,114,59,1,10595,4,2,99,114,18220,18230,117,116,101,5,250,1,59,18228,1,250,114,59,1,8593,114,4,2,99,101,18241,18245,121,59,1,1118,118,101,59,1,365,4,2,105,121,18256,18265,114,99,5,251,1,59,18263,1,251,59,1,1091,4,3,97,98,104,18276,18281,18287,114,114,59,1,8645,108,97,99,59,1,369,97,114,59,1,10606,4,2,105,114,18298,18304,115,104,116,59,1,10622,59,3,55349,56626,114,97,118,101,5,249,1,59,18317,1,249,4,2,97,98,18325,18338,114,4,2,108,114,18332,18335,59,1,8639,59,1,8638,108,107,59,1,9600,4,2,99,116,18349,18374,4,2,111,114,18355,18369,114,110,4,2,59,101,18363,18365,1,8988,114,59,1,8988,111,112,59,1,8975,114,105,59,1,9720,4,2,97,108,18385,18390,99,114,59,1,363,5,168,1,59,18395,1,168,4,2,103,112,18403,18408,111,110,59,1,371,102,59,3,55349,56678,4,6,97,100,104,108,115,117,18427,18434,18445,18470,18475,18494,114,114,111,119,59,1,8593,111,119,110,97,114,114,111,119,59,1,8597,97,114,112,111,111,110,4,2,108,114,18457,18463,101,102,116,59,1,8639,105,103,104,116,59,1,8638,117,115,59,1,8846,105,4,3,59,104,108,18484,18486,18489,1,965,59,1,978,111,110,59,1,965,112,97,114,114,111,119,115,59,1,8648,4,3,99,105,116,18512,18537,18542,4,2,111,114,18518,18532,114,110,4,2,59,101,18526,18528,1,8989,114,59,1,8989,111,112,59,1,8974,110,103,59,1,367,114,105,59,1,9721,99,114,59,3,55349,56522,4,3,100,105,114,18561,18566,18572,111,116,59,1,8944,108,100,101,59,1,361,105,4,2,59,102,18579,18581,1,9653,59,1,9652,4,2,97,109,18590,18595,114,114,59,1,8648,108,5,252,1,59,18601,1,252,97,110,103,108,101,59,1,10663,4,15,65,66,68,97,99,100,101,102,108,110,111,112,114,115,122,18643,18648,18661,18667,18847,18851,18857,18904,18909,18915,18931,18937,18943,18949,18996,114,114,59,1,8661,97,114,4,2,59,118,18656,18658,1,10984,59,1,10985,97,115,104,59,1,8872,4,2,110,114,18673,18679,103,114,116,59,1,10652,4,7,101,107,110,112,114,115,116,18695,18704,18711,18720,18742,18754,18810,112,115,105,108,111,110,59,1,1013,97,112,112,97,59,1,1008,111,116,104,105,110,103,59,1,8709,4,3,104,105,114,18728,18732,18735,105,59,1,981,59,1,982,111,112,116,111,59,1,8733,4,2,59,104,18748,18750,1,8597,111,59,1,1009,4,2,105,117,18760,18766,103,109,97,59,1,962,4,2,98,112,18772,18791,115,101,116,110,101,113,4,2,59,113,18784,18787,3,8842,65024,59,3,10955,65024,115,101,116,110,101,113,4,2,59,113,18803,18806,3,8843,65024,59,3,10956,65024,4,2,104,114,18816,18822,101,116,97,59,1,977,105,97,110,103,108,101,4,2,108,114,18834,18840,101,102,116,59,1,8882,105,103,104,116,59,1,8883,121,59,1,1074,97,115,104,59,1,8866,4,3,101,108,114,18865,18884,18890,4,3,59,98,101,18873,18875,18880,1,8744,97,114,59,1,8891,113,59,1,8794,108,105,112,59,1,8942,4,2,98,116,18896,18901,97,114,59,1,124,59,1,124,114,59,3,55349,56627,116,114,105,59,1,8882,115,117,4,2,98,112,18923,18927,59,3,8834,8402,59,3,8835,8402,112,102,59,3,55349,56679,114,111,112,59,1,8733,116,114,105,59,1,8883,4,2,99,117,18955,18960,114,59,3,55349,56523,4,2,98,112,18966,18981,110,4,2,69,101,18973,18977,59,3,10955,65024,59,3,8842,65024,110,4,2,69,101,18988,18992,59,3,10956,65024,59,3,8843,65024,105,103,122,97,103,59,1,10650,4,7,99,101,102,111,112,114,115,19020,19026,19061,19066,19072,19075,19089,105,114,99,59,1,373,4,2,100,105,19032,19055,4,2,98,103,19038,19043,97,114,59,1,10847,101,4,2,59,113,19050,19052,1,8743,59,1,8793,101,114,112,59,1,8472,114,59,3,55349,56628,112,102,59,3,55349,56680,59,1,8472,4,2,59,101,19081,19083,1,8768,97,116,104,59,1,8768,99,114,59,3,55349,56524,4,14,99,100,102,104,105,108,109,110,111,114,115,117,118,119,19125,19146,19152,19157,19173,19176,19192,19197,19202,19236,19252,19269,19286,19291,4,3,97,105,117,19133,19137,19142,112,59,1,8898,114,99,59,1,9711,112,59,1,8899,116,114,105,59,1,9661,114,59,3,55349,56629,4,2,65,97,19163,19168,114,114,59,1,10234,114,114,59,1,10231,59,1,958,4,2,65,97,19182,19187,114,114,59,1,10232,114,114,59,1,10229,97,112,59,1,10236,105,115,59,1,8955,4,3,100,112,116,19210,19215,19230,111,116,59,1,10752,4,2,102,108,19221,19225,59,3,55349,56681,117,115,59,1,10753,105,109,101,59,1,10754,4,2,65,97,19242,19247,114,114,59,1,10233,114,114,59,1,10230,4,2,99,113,19258,19263,114,59,3,55349,56525,99,117,112,59,1,10758,4,2,112,116,19275,19281,108,117,115,59,1,10756,114,105,59,1,9651,101,101,59,1,8897,101,100,103,101,59,1,8896,4,8,97,99,101,102,105,111,115,117,19316,19335,19349,19357,19362,19367,19373,19379,99,4,2,117,121,19323,19332,116,101,5,253,1,59,19330,1,253,59,1,1103,4,2,105,121,19341,19346,114,99,59,1,375,59,1,1099,110,5,165,1,59,19355,1,165,114,59,3,55349,56630,99,121,59,1,1111,112,102,59,3,55349,56682,99,114,59,3,55349,56526,4,2,99,109,19385,19389,121,59,1,1102,108,5,255,1,59,19395,1,255,4,10,97,99,100,101,102,104,105,111,115,119,19419,19426,19441,19446,19462,19467,19472,19480,19486,19492,99,117,116,101,59,1,378,4,2,97,121,19432,19438,114,111,110,59,1,382,59,1,1079,111,116,59,1,380,4,2,101,116,19452,19458,116,114,102,59,1,8488,97,59,1,950,114,59,3,55349,56631,99,121,59,1,1078,103,114,97,114,114,59,1,8669,112,102,59,3,55349,56683,99,114,59,3,55349,56527,4,2,106,110,19498,19501,59,1,8205,106,59,1,8204])},dAEq:function(e,t,n){"use strict";var o=n("HtLg"),r=n("Vx/6"),i=n("fuKP"),a=n("/+k/"),s=n("Ig3s"),l=n("T0BQ"),c={name:"attention",tokenize:function(e,t){var n,o=i(this.previous);return function(t){return e.enter("attentionSequence"),n=t,r(t)};function r(a){var s,l,c,u;return a===n?(e.consume(a),r):(s=e.exit("attentionSequence"),c=!(l=i(a))||2===l&&o,u=!o||2===o&&l,s._open=42===n?c:c&&(o||!u),s._close=42===n?u:u&&(l||!c),t(a))}},resolveAll:function(e,t){var n,i,c,u,d,p,f,h,m=-1;for(;++m1&&e[m][1].end.offset-e[m][1].start.offset>1?2:1,u={type:p>1?"strongSequence":"emphasisSequence",start:a(l(e[n][1].end),-p),end:l(e[n][1].end)},d={type:p>1?"strongSequence":"emphasisSequence",start:l(e[m][1].start),end:a(l(e[m][1].start),p)},c={type:p>1?"strongText":"emphasisText",start:l(e[n][1].end),end:l(e[m][1].start)},i={type:p>1?"strong":"emphasis",start:l(u.start),end:l(d.end)},e[n][1].end=l(u.start),e[m][1].start=l(d.end),f=[],e[n][1].end.offset-e[n][1].start.offset&&(f=o(f,[["enter",e[n][1],t],["exit",e[n][1],t]])),f=o(f,[["enter",i,t],["enter",u,t],["exit",u,t],["enter",c,t]]),f=o(f,s(t.parser.constructs.insideSpan.null,e.slice(n+1,m),t)),f=o(f,[["exit",c,t],["enter",d,t],["exit",d,t],["exit",i,t]]),e[m][1].end.offset-e[m][1].start.offset?(h=2,f=o(f,[["enter",e[m][1],t],["exit",e[m][1],t]])):h=0,r(e,n-1,m-n+3,f),m=n+f.length-h-2;break}m=-1;for(;++m?\]}]+$/.exec(e);if(i)for(e=e.slice(0,i.index),t=(i=i[0]).indexOf(")"),n=o(e,"("),r=o(e,")");-1!==t&&n>r;)e+=i.slice(0,t+1),t=(i=i.slice(t+1)).indexOf(")"),r++;return[e,i]}(n+r))[0]&&(s={type:"link",title:null,url:l+t+a[0],children:[{type:"text",value:t+a[0]}]},a[1]&&(s=[s,{type:"text",value:a[1]}]),s)))}function c(e,t,n,o){return!(!u(o,!0)||/[_-]$/.test(n))&&{type:"link",title:null,url:"mailto:"+t+"@"+n,children:[{type:"text",value:t+"@"+n}]}}function u(e,t){var n=e.input.charCodeAt(e.index-1);return(n!==n||a(n)||i(n))&&(!t||47!==n)}t.transforms=[function(e){r(e,[[/(https?:\/\/|www(?=\.))([-.\w]+)([^ \t\r\n]*)/i,l],[/([-.\w+]+)@([-\w]+(?:\.[-\w]+)+)/,c]],{ignore:["link","linkReference"]})}],t.enter={literalAutolink:function(e){this.enter({type:"link",title:null,url:"",children:[]},e)},literalAutolinkEmail:s,literalAutolinkHttp:s,literalAutolinkWww:s},t.exit={literalAutolink:function(e){this.exit(e)},literalAutolinkEmail:function(e){this.config.exit.autolinkEmail.call(this,e)},literalAutolinkHttp:function(e){this.config.exit.autolinkProtocol.call(this,e)},literalAutolinkWww:function(e){this.config.exit.data.call(this,e),this.stack[this.stack.length-1].url="http://"+this.sliceSerialize(e)}}},ecSx:function(e,t,n){"use strict";var o=n("ek1N");e.exports=function(e,t){e&&!e.process&&(t=e,e=null);return e?function(e,t){return n;function n(n,r,i){function a(e){i(e)}e.run(o(n,t),r,a)}}(e,t):function(e){return t;function t(t){return o(t,e)}}(t)}},ek1N:function(e,t,n){"use strict";e.exports=n("FYh5")},escJ:function(e,t,n){"use strict";var o=n("yRGd"),r={name:"lineEnding",tokenize:function(e,t){return function(n){return e.enter("lineEnding"),e.consume(n),e.exit("lineEnding"),o(e,t,"linePrefix")}}};e.exports=r},f8fV:function(e,t,n){e.exports=function(e){var t=(e||{}).singleTilde,n={tokenize:function(e,n,r){var i=this.previous,a=this.events,s=0;return l;function l(t){return 126!==t||126===i&&"characterEscape"!==a[a.length-1][1].type?r(t):(e.enter("strikethroughSequenceTemporary"),c(t))}function c(a){var l,u,d=o(i);return 126===a?s>1?r(a):(e.consume(a),s++,c):s<2&&!t?r(a):(l=e.exit("strikethroughSequenceTemporary"),u=o(a),l._open=!u||2===u&&d,l._close=!d||2===d&&u,n(a))}},resolveAll:function(e,t){var n,o,s,l,c=-1;for(;++c-1)return o.QUIRKS;let e=null===t?a:i;if(d(n,e))return o.QUIRKS;if(e=null===t?l:c,d(n,e))return o.LIMITED_QUIRKS}return o.NO_QUIRKS},t.serializeContent=function(e,t,n){let o="!DOCTYPE ";return e&&(o+=e),t?o+=" PUBLIC "+u(t):n&&(o+=" SYSTEM"),null!==n&&(o+=" "+u(n)),o}},fFcG:function(e,t,n){"use strict";e.exports=function(e,t){return e.dangerous?e.augment(t,o("raw",t.value)):null};var o=n("vUGn")},fL8H:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{color:"#657b83",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#657b83",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",borderRadius:"0.3em",backgroundColor:"#fdf6e3"},'pre[class*="language-"]::-moz-selection':{background:"#073642"},'pre[class*="language-"] ::-moz-selection':{background:"#073642"},'code[class*="language-"]::-moz-selection':{background:"#073642"},'code[class*="language-"] ::-moz-selection':{background:"#073642"},'pre[class*="language-"]::selection':{background:"#073642"},'pre[class*="language-"] ::selection':{background:"#073642"},'code[class*="language-"]::selection':{background:"#073642"},'code[class*="language-"] ::selection':{background:"#073642"},':not(pre) > code[class*="language-"]':{backgroundColor:"#fdf6e3",padding:".1em",borderRadius:".3em"},comment:{color:"#93a1a1"},prolog:{color:"#93a1a1"},doctype:{color:"#93a1a1"},cdata:{color:"#93a1a1"},punctuation:{color:"#586e75"},namespace:{Opacity:".7"},property:{color:"#268bd2"},tag:{color:"#268bd2"},boolean:{color:"#268bd2"},number:{color:"#268bd2"},constant:{color:"#268bd2"},symbol:{color:"#268bd2"},deleted:{color:"#268bd2"},selector:{color:"#2aa198"},"attr-name":{color:"#2aa198"},string:{color:"#2aa198"},char:{color:"#2aa198"},builtin:{color:"#2aa198"},url:{color:"#2aa198"},inserted:{color:"#2aa198"},entity:{color:"#657b83",background:"#eee8d5",cursor:"help"},atrule:{color:"#859900"},"attr-value":{color:"#859900"},keyword:{color:"#859900"},function:{color:"#b58900"},"class-name":{color:"#b58900"},regex:{color:"#cb4b16"},important:{color:"#cb4b16",fontWeight:"bold"},variable:{color:"#cb4b16"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}}},fUUT:function(e,t,n){"use strict";e.exports=function(e){var t=this;this.Parser=function(n){return o(n,Object.assign({},t.data("settings"),e,{extensions:t.data("micromarkExtensions")||[],mdastExtensions:t.data("fromMarkdownExtensions")||[]}))}};var o=n("LLHA")},"fe/W":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",whiteSpace:"pre-wrap",wordBreak:"break-all",wordWrap:"break-word",fontFamily:'Menlo, Monaco, "Courier New", monospace',fontSize:"15px",lineHeight:"1.5",color:"#dccf8f",textShadow:"0"},'pre[class*="language-"]':{MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",whiteSpace:"pre-wrap",wordBreak:"break-all",wordWrap:"break-word",fontFamily:'Menlo, Monaco, "Courier New", monospace',fontSize:"15px",lineHeight:"1.5",color:"#DCCF8F",textShadow:"0",borderRadius:"5px",border:"1px solid #000",background:"#181914 url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAMAAA/+4ADkFkb2JlAGTAAAAAAf/bAIQACQYGBgcGCQcHCQ0IBwgNDwsJCQsPEQ4ODw4OERENDg4ODg0RERQUFhQUERoaHBwaGiYmJiYmKysrKysrKysrKwEJCAgJCgkMCgoMDwwODA8TDg4ODhMVDg4PDg4VGhMRERERExoXGhYWFhoXHR0aGh0dJCQjJCQrKysrKysrKysr/8AAEQgAjACMAwEiAAIRAQMRAf/EAF4AAQEBAAAAAAAAAAAAAAAAAAABBwEBAQAAAAAAAAAAAAAAAAAAAAIQAAEDAwIHAQEAAAAAAAAAAADwAREhYaExkUFRcYGxwdHh8REBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AyGFEjHaBS2fDDs2zkhKmBKktb7km+ZwwCnXPkLVmCTMItj6AXFxRS465/BTnkAJvkLkJe+7AKKoi2AtRS2zuAWsCb5GOlBN8gKfmuGHZ8MFqIth3ALmFoFwbwKWyAlTAp17uKqBvgBD8sM4fTjhvAhkzhaRkBMKBrfs7jGPIpzy7gFrAqnC0C0gB0EWwBDW2cBVQwm+QtPpa3wBO3sVvszCnLAhkzgL5/RLf13cLQd8/AGlu0Cb5HTx9KuAEieGJEdcehS3eRTp2ATdt3CpIm+QtZwAhROXFeb7swp/ahaM3kBE/jSIUBc/AWrgBN8uNFAl+b7sAXFxFn2YLUU5Ns7gFX8C4ib+hN8gFWXwK3bZglxEJm+gKdciLPsFV/TClsgJUwKJ5FVA7tvIFrfZhVfGJDcsCKaYgAqv6YRbE+RWOWBtu7+AL3yRalXLyKqAIIfk+zARbDgFyEsncYwJvlgFRW+GEWntIi2P0BooyFxcNr8Ep3+ANLbMO+QyhvbiqdgC0kVvgUUiLYgBS2QtPbiVI1/sgOmG9uO+Y8DW+7jS2zAOnj6O2BndwuIAUtkdRN8gFoK3wwXMQyZwHVbClsuNLd4E3yAUR6FVDBR+BafQGt93LVMxJTv8ABts4CVLhcfYWsCb5kC9/BHdU8CLYFY5bMAd+eX9MGthhpbA1vu4B7+RKkaW2Yq4AQtVBBFsAJU/AuIXBhN8gGWnstefhiZyWvLAEnbYS1uzSFP6Jvn4Baxx70JKkQojLib5AVTey1jjgkKJGO0AKWyOm7N7cSpgSpAdPH0Tfd/gp1z5C1ZgKqN9J2wFxcUUuAFLZAm+QC0Fb4YUVRFsAOvj4KW2dwtYE3yAWk/wS/PLMKfmuGHZ8MAXF/Ja32Yi5haAKWz4Ydm2cSpgU693Atb7km+Zwwh+WGcPpxw3gAkzCLY+iYUDW/Z3Adc/gpzyFrAqnALkJe+7DoItgAtRS2zuKqGE3yAx0oJvkdvYrfZmALURbDuL5/RLf13cAuDeBS2RpbtAm+QFVA3wR+3fUtFHoBDJnC0jIXH0HWsgMY8inPLuOkd9chp4z20ALQLSA8cI9jYAIa2zjzjBd8gRafS1vgiUho/kAKcsCGTOGWvoOpkAtB3z8Hm8x2Ff5ADp4+lXAlIvcmwH/2Q==') repeat left top",padding:"12px",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},':not(pre) > code[class*="language-"]':{borderRadius:"5px",border:"1px solid #000",color:"#DCCF8F",background:"#181914 url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAMAAA/+4ADkFkb2JlAGTAAAAAAf/bAIQACQYGBgcGCQcHCQ0IBwgNDwsJCQsPEQ4ODw4OERENDg4ODg0RERQUFhQUERoaHBwaGiYmJiYmKysrKysrKysrKwEJCAgJCgkMCgoMDwwODA8TDg4ODhMVDg4PDg4VGhMRERERExoXGhYWFhoXHR0aGh0dJCQjJCQrKysrKysrKysr/8AAEQgAjACMAwEiAAIRAQMRAf/EAF4AAQEBAAAAAAAAAAAAAAAAAAABBwEBAQAAAAAAAAAAAAAAAAAAAAIQAAEDAwIHAQEAAAAAAAAAAADwAREhYaExkUFRcYGxwdHh8REBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AyGFEjHaBS2fDDs2zkhKmBKktb7km+ZwwCnXPkLVmCTMItj6AXFxRS465/BTnkAJvkLkJe+7AKKoi2AtRS2zuAWsCb5GOlBN8gKfmuGHZ8MFqIth3ALmFoFwbwKWyAlTAp17uKqBvgBD8sM4fTjhvAhkzhaRkBMKBrfs7jGPIpzy7gFrAqnC0C0gB0EWwBDW2cBVQwm+QtPpa3wBO3sVvszCnLAhkzgL5/RLf13cLQd8/AGlu0Cb5HTx9KuAEieGJEdcehS3eRTp2ATdt3CpIm+QtZwAhROXFeb7swp/ahaM3kBE/jSIUBc/AWrgBN8uNFAl+b7sAXFxFn2YLUU5Ns7gFX8C4ib+hN8gFWXwK3bZglxEJm+gKdciLPsFV/TClsgJUwKJ5FVA7tvIFrfZhVfGJDcsCKaYgAqv6YRbE+RWOWBtu7+AL3yRalXLyKqAIIfk+zARbDgFyEsncYwJvlgFRW+GEWntIi2P0BooyFxcNr8Ep3+ANLbMO+QyhvbiqdgC0kVvgUUiLYgBS2QtPbiVI1/sgOmG9uO+Y8DW+7jS2zAOnj6O2BndwuIAUtkdRN8gFoK3wwXMQyZwHVbClsuNLd4E3yAUR6FVDBR+BafQGt93LVMxJTv8ABts4CVLhcfYWsCb5kC9/BHdU8CLYFY5bMAd+eX9MGthhpbA1vu4B7+RKkaW2Yq4AQtVBBFsAJU/AuIXBhN8gGWnstefhiZyWvLAEnbYS1uzSFP6Jvn4Baxx70JKkQojLib5AVTey1jjgkKJGO0AKWyOm7N7cSpgSpAdPH0Tfd/gp1z5C1ZgKqN9J2wFxcUUuAFLZAm+QC0Fb4YUVRFsAOvj4KW2dwtYE3yAWk/wS/PLMKfmuGHZ8MAXF/Ja32Yi5haAKWz4Ydm2cSpgU693Atb7km+Zwwh+WGcPpxw3gAkzCLY+iYUDW/Z3Adc/gpzyFrAqnALkJe+7DoItgAtRS2zuKqGE3yAx0oJvkdvYrfZmALURbDuL5/RLf13cAuDeBS2RpbtAm+QFVA3wR+3fUtFHoBDJnC0jIXH0HWsgMY8inPLuOkd9chp4z20ALQLSA8cI9jYAIa2zjzjBd8gRafS1vgiUho/kAKcsCGTOGWvoOpkAtB3z8Hm8x2Ff5ADp4+lXAlIvcmwH/2Q==') repeat left top",padding:"2px 6px"},namespace:{Opacity:".7"},comment:{color:"#586e75",fontStyle:"italic"},prolog:{color:"#586e75",fontStyle:"italic"},doctype:{color:"#586e75",fontStyle:"italic"},cdata:{color:"#586e75",fontStyle:"italic"},number:{color:"#b89859"},string:{color:"#468966"},char:{color:"#468966"},builtin:{color:"#468966"},inserted:{color:"#468966"},"attr-name":{color:"#b89859"},operator:{color:"#dccf8f"},entity:{color:"#dccf8f",cursor:"help"},url:{color:"#dccf8f"},".language-css .token.string":{color:"#dccf8f"},".style .token.string":{color:"#dccf8f"},selector:{color:"#859900"},regex:{color:"#859900"},atrule:{color:"#cb4b16"},keyword:{color:"#cb4b16"},"attr-value":{color:"#468966"},function:{color:"#b58900"},variable:{color:"#b58900"},placeholder:{color:"#b58900"},property:{color:"#b89859"},tag:{color:"#ffb03b"},boolean:{color:"#b89859"},constant:{color:"#b89859"},symbol:{color:"#b89859"},important:{color:"#dc322f"},statement:{color:"#dc322f"},deleted:{color:"#dc322f"},punctuation:{color:"#dccf8f"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}}},fsL8:function(e,t,n){var o=n("cDf5").default;function r(){"use strict";e.exports=r=function(){return t},e.exports.__esModule=!0,e.exports.default=e.exports;var t={},n=Object.prototype,i=n.hasOwnProperty,a=Object.defineProperty||function(e,t,n){e[t]=n.value},s="function"==typeof Symbol?Symbol:{},l=s.iterator||"@@iterator",c=s.asyncIterator||"@@asyncIterator",u=s.toStringTag||"@@toStringTag";function d(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{d({},"")}catch(w){d=function(e,t,n){return e[t]=n}}function p(e,t,n,o){var r=t&&t.prototype instanceof m?t:m,i=Object.create(r.prototype),s=new O(o||[]);return a(i,"_invoke",{value:S(e,n,s)}),i}function f(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(w){return{type:"throw",arg:w}}}t.wrap=p;var h={};function m(){}function g(){}function T(){}var E={};d(E,l,(function(){return this}));var b=Object.getPrototypeOf,A=b&&b(b(N([])));A&&A!==n&&i.call(A,l)&&(E=A);var k=T.prototype=m.prototype=Object.create(E);function y(e){["next","throw","return"].forEach((function(t){d(e,t,(function(e){return this._invoke(t,e)}))}))}function _(e,t){function n(r,a,s,l){var c=f(e[r],e,a);if("throw"!==c.type){var u=c.arg,d=u.value;return d&&"object"==o(d)&&i.call(d,"__await")?t.resolve(d.__await).then((function(e){n("next",e,s,l)}),(function(e){n("throw",e,s,l)})):t.resolve(d).then((function(e){u.value=e,s(u)}),(function(e){return n("throw",e,s,l)}))}l(c.arg)}var r;a(this,"_invoke",{value:function(e,o){function i(){return new t((function(t,r){n(e,o,t,r)}))}return r=r?r.then(i,i):i()}})}function S(e,t,n){var o="suspendedStart";return function(r,i){if("executing"===o)throw new Error("Generator is already running");if("completed"===o){if("throw"===r)throw i;return M()}for(n.method=r,n.arg=i;;){var a=n.delegate;if(a){var s=C(a,n);if(s){if(s===h)continue;return s}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===o)throw o="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);o="executing";var l=f(e,t,n);if("normal"===l.type){if(o=n.done?"completed":"suspendedYield",l.arg===h)continue;return{value:l.arg,done:n.done}}"throw"===l.type&&(o="completed",n.method="throw",n.arg=l.arg)}}}function C(e,t){var n=t.method,o=e.iterator[n];if(void 0===o)return t.delegate=null,"throw"===n&&e.iterator.return&&(t.method="return",t.arg=void 0,C(e,t),"throw"===t.method)||"return"!==n&&(t.method="throw",t.arg=new TypeError("The iterator does not provide a '"+n+"' method")),h;var r=f(o,e.iterator,t.arg);if("throw"===r.type)return t.method="throw",t.arg=r.arg,t.delegate=null,h;var i=r.arg;return i?i.done?(t[e.resultName]=i.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=void 0),t.delegate=null,h):i:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,h)}function x(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function v(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function O(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(x,this),this.reset(!0)}function N(e){if(e){var t=e[l];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var n=-1,o=function t(){for(;++n=0;--o){var r=this.tryEntries[o],a=r.completion;if("root"===r.tryLoc)return n("end");if(r.tryLoc<=this.prev){var s=i.call(r,"catchLoc"),l=i.call(r,"finallyLoc");if(s&&l){if(this.prev=0;--n){var o=this.tryEntries[n];if(o.tryLoc<=this.prev&&i.call(o,"finallyLoc")&&this.prev=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),v(n),h}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var o=n.completion;if("throw"===o.type){var r=o.arg;v(n)}return r}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:N(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=void 0),h}},t}e.exports=r,e.exports.__esModule=!0,e.exports.default=e.exports},fuKP:function(e,t,n){"use strict";var o=n("Q3zd"),r=n("BjXi"),i=n("uDje");e.exports=function(e){return null===e||o(e)||i(e)?1:r(e)?2:void 0}},g4pe:function(e,t,n){e.exports=n("8Kt/")},gsvO:function(e,t,n){e.exports=r,r.peek=function(){return"`"};var o=n("7J+x");function r(e,t,n){for(var r,i,a,s,l=e.value||"",c="`",u=-1;new RegExp("(^|[^`])"+c+"([^`]|$)").test(l);)c+="`";for(/[^ \r\n]/.test(l)&&(/[ \r\n`]/.test(l.charAt(0))||/[ \r\n`]/.test(l.charAt(l.length-1)))&&(l=" "+l+" ");++up?n(i):(e.consume(i),T):41===i?f--?(e.consume(i),T):(e.exit("chunkString"),e.exit(u),e.exit(c),e.exit(a),t(i)):null===i||r(i)?f?n(i):(e.exit("chunkString"),e.exit(u),e.exit(c),e.exit(a),t(i)):o(i)?n(i):(e.consume(i),92===i?E:T)}function E(t){return 40===t||41===t||92===t?(e.consume(t),T):T(t)}}},hq1P:function(e,t,n){"use strict";var o=n("rm/B")(/[A-Za-z]/);e.exports=o},iX4R:function(e,t,n){"use strict";e.exports=function(e,t){return e(t,"blockquote",o(r(e,t),!0))};var o=n("Dvol"),r=n("WFsM")},iy38:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{color:"white",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",textShadow:"0 -.1em .2em black",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"white",background:"hsl(0, 0%, 8%)",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",textShadow:"0 -.1em .2em black",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",borderRadius:".5em",border:".3em solid hsl(0, 0%, 33%)",boxShadow:"1px 1px .5em black inset",margin:".5em 0",overflow:"auto",padding:"1em"},':not(pre) > code[class*="language-"]':{background:"hsl(0, 0%, 8%)",borderRadius:".3em",border:".13em solid hsl(0, 0%, 33%)",boxShadow:"1px 1px .3em -.1em black inset",padding:".15em .2em .05em",whiteSpace:"normal"},'pre[class*="language-"]::-moz-selection':{background:"hsla(0, 0%, 93%, 0.15)",textShadow:"none"},'pre[class*="language-"]::selection':{background:"hsla(0, 0%, 93%, 0.15)",textShadow:"none"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"hsla(0, 0%, 93%, 0.15)"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"hsla(0, 0%, 93%, 0.15)"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"hsla(0, 0%, 93%, 0.15)"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"hsla(0, 0%, 93%, 0.15)"},'code[class*="language-"]::selection':{textShadow:"none",background:"hsla(0, 0%, 93%, 0.15)"},'code[class*="language-"] ::selection':{textShadow:"none",background:"hsla(0, 0%, 93%, 0.15)"},comment:{color:"hsl(0, 0%, 47%)"},prolog:{color:"hsl(0, 0%, 47%)"},doctype:{color:"hsl(0, 0%, 47%)"},cdata:{color:"hsl(0, 0%, 47%)"},punctuation:{Opacity:".7"},namespace:{Opacity:".7"},tag:{color:"hsl(14, 58%, 55%)"},boolean:{color:"hsl(14, 58%, 55%)"},number:{color:"hsl(14, 58%, 55%)"},deleted:{color:"hsl(14, 58%, 55%)"},keyword:{color:"hsl(53, 89%, 79%)"},property:{color:"hsl(53, 89%, 79%)"},selector:{color:"hsl(53, 89%, 79%)"},constant:{color:"hsl(53, 89%, 79%)"},symbol:{color:"hsl(53, 89%, 79%)"},builtin:{color:"hsl(53, 89%, 79%)"},"attr-name":{color:"hsl(76, 21%, 52%)"},"attr-value":{color:"hsl(76, 21%, 52%)"},string:{color:"hsl(76, 21%, 52%)"},char:{color:"hsl(76, 21%, 52%)"},operator:{color:"hsl(76, 21%, 52%)"},entity:{color:"hsl(76, 21%, 52%)",cursor:"help"},url:{color:"hsl(76, 21%, 52%)"},".language-css .token.string":{color:"hsl(76, 21%, 52%)"},".style .token.string":{color:"hsl(76, 21%, 52%)"},variable:{color:"hsl(76, 21%, 52%)"},inserted:{color:"hsl(76, 21%, 52%)"},atrule:{color:"hsl(218, 22%, 55%)"},regex:{color:"hsl(42, 75%, 65%)"},important:{color:"hsl(42, 75%, 65%)",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},"pre[data-line]":{padding:"1em 0 1em 3em",position:"relative"},".language-markup .token.tag":{color:"hsl(33, 33%, 52%)"},".language-markup .token.attr-name":{color:"hsl(33, 33%, 52%)"},".language-markup .token.punctuation":{color:"hsl(33, 33%, 52%)"},"":{position:"relative",zIndex:"1"},".line-highlight":{background:"linear-gradient(to right, hsla(0, 0%, 33%, .1) 70%, hsla(0, 0%, 33%, 0))",borderBottom:"1px dashed hsl(0, 0%, 33%)",borderTop:"1px dashed hsl(0, 0%, 33%)",left:"0",lineHeight:"inherit",marginTop:"0.75em",padding:"inherit 0",pointerEvents:"none",position:"absolute",right:"0",whiteSpace:"pre",zIndex:"0"},".line-highlight:before":{backgroundColor:"hsl(215, 15%, 59%)",borderRadius:"999px",boxShadow:"0 1px white",color:"hsl(24, 20%, 95%)",content:"attr(data-start)",font:"bold 65%/1.5 sans-serif",left:".6em",minWidth:"1em",padding:"0 .5em",position:"absolute",textAlign:"center",textShadow:"none",top:".4em",verticalAlign:".3em"},".line-highlight[data-end]:after":{backgroundColor:"hsl(215, 15%, 59%)",borderRadius:"999px",boxShadow:"0 1px white",color:"hsl(24, 20%, 95%)",content:"attr(data-end)",font:"bold 65%/1.5 sans-serif",left:".6em",minWidth:"1em",padding:"0 .5em",position:"absolute",textAlign:"center",textShadow:"none",top:"auto",verticalAlign:".3em",bottom:".4em"}}},jO3g:function(e,t,n){"use strict";e.exports=function(e,t,n){var o,r=t&&t.type;if(!r)throw new Error("Expected node, got `"+t+"`");o=i.call(e.handlers,r)?e.handlers[r]:e.passThrough&&e.passThrough.indexOf(r)>-1?s:e.unknownHandler;return("function"===typeof o?o:a)(e,t,n)};var o=n("vUGn"),r=n("WFsM"),i={}.hasOwnProperty;function a(e,t){return function(e){var t=e.data||{};if(i.call(t,"hName")||i.call(t,"hProperties")||i.call(t,"hChildren"))return!1;return"value"in e}(t)?e.augment(t,o("text",t.value)):e(t,"div",r(e,t))}function s(e,t){var n;return t.children?((n=Object.assign({},t)).children=r(e,t),n):t}},jeK3:function(e,t,n){"use strict";e.exports=function(e){for(var t=-1,n=0;++t-1?void 0:4)}},exit:function(e){e.exit("blockQuote")}};e.exports=i},kViG:function(e,t,n){"use strict";var o=n("E/Jm"),r=n("2N74");e.exports=function(e,t,n,i,a,s){var l,c=this,u=0;return function(t){return e.enter(i),e.enter(a),e.consume(t),e.exit(a),e.enter(s),d};function d(r){return null===r||91===r||93===r&&!l||94===r&&!u&&"_hiddenFootnoteSupport"in c.parser.constructs||u>999?n(r):93===r?(e.exit(s),e.enter(a),e.consume(r),e.exit(a),e.exit(i),t):o(r)?(e.enter("lineEnding"),e.consume(r),e.exit("lineEnding"),d):(e.enter("chunkString",{contentType:"string"}),p(r))}function p(t){return null===t||91===t||93===t||o(t)||u++>999?(e.exit("chunkString"),d(t)):(e.consume(t),l=l||!r(t),92===t?f:p)}function f(t){return 91===t||92===t||93===t?(e.consume(t),u++,p):p(t)}}},kWEd:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#322d29",color:"#88786d"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#322d29",color:"#88786d",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#6f5849"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#6f5849"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#6f5849"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#6f5849"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#6f5849"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#6f5849"},'code[class*="language-"]::selection':{textShadow:"none",background:"#6f5849"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#6f5849"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#6a5f58"},prolog:{color:"#6a5f58"},doctype:{color:"#6a5f58"},cdata:{color:"#6a5f58"},punctuation:{color:"#6a5f58"},namespace:{Opacity:".7"},tag:{color:"#bfa05a"},operator:{color:"#bfa05a"},number:{color:"#bfa05a"},property:{color:"#88786d"},function:{color:"#88786d"},"tag-id":{color:"#fff3eb"},selector:{color:"#fff3eb"},"atrule-id":{color:"#fff3eb"},"code.language-javascript":{color:"#a48774"},"attr-name":{color:"#a48774"},"code.language-css":{color:"#fcc440"},"code.language-scss":{color:"#fcc440"},boolean:{color:"#fcc440"},string:{color:"#fcc440"},entity:{color:"#fcc440",cursor:"help"},url:{color:"#fcc440"},".language-css .token.string":{color:"#fcc440"},".language-scss .token.string":{color:"#fcc440"},".style .token.string":{color:"#fcc440"},"attr-value":{color:"#fcc440"},keyword:{color:"#fcc440"},control:{color:"#fcc440"},directive:{color:"#fcc440"},unit:{color:"#fcc440"},statement:{color:"#fcc440"},regex:{color:"#fcc440"},atrule:{color:"#fcc440"},placeholder:{color:"#fcc440"},variable:{color:"#fcc440"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #fff3eb",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#a48774"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid #816d5f",OutlineOffset:".4em"},".line-numbers .line-numbers-rows":{borderRightColor:"#35302b"},".line-numbers-rows > span:before":{color:"#46403d"},".line-highlight":{background:"linear-gradient(to right, rgba(191, 160, 90, 0.2) 70%, rgba(191, 160, 90, 0))"}}},ki31:function(e,t){t.canContainEols=["delete"],t.enter={strikethrough:function(e){this.enter({type:"delete",children:[]},e)}},t.exit={strikethrough:function(e){this.exit(e)}}},ktEA:function(e,t,n){"use strict";e.exports=function(e,t){return e(t,"em",o(e,t))};var o=n("WFsM")},lQDV:function(e,t,n){"use strict";e.exports=function(e,t){return e(t,"h"+t.depth,o(e,t))};var o=n("WFsM")},lVxK:function(e,t,n){"use strict";const o=n("zpDW"),r=n("UwWT"),i=r.TAG_NAMES,a=r.NAMESPACES,s=r.ATTRS,l="text/html",c="application/xhtml+xml",u={attributename:"attributeName",attributetype:"attributeType",basefrequency:"baseFrequency",baseprofile:"baseProfile",calcmode:"calcMode",clippathunits:"clipPathUnits",diffuseconstant:"diffuseConstant",edgemode:"edgeMode",filterunits:"filterUnits",glyphref:"glyphRef",gradienttransform:"gradientTransform",gradientunits:"gradientUnits",kernelmatrix:"kernelMatrix",kernelunitlength:"kernelUnitLength",keypoints:"keyPoints",keysplines:"keySplines",keytimes:"keyTimes",lengthadjust:"lengthAdjust",limitingconeangle:"limitingConeAngle",markerheight:"markerHeight",markerunits:"markerUnits",markerwidth:"markerWidth",maskcontentunits:"maskContentUnits",maskunits:"maskUnits",numoctaves:"numOctaves",pathlength:"pathLength",patterncontentunits:"patternContentUnits",patterntransform:"patternTransform",patternunits:"patternUnits",pointsatx:"pointsAtX",pointsaty:"pointsAtY",pointsatz:"pointsAtZ",preservealpha:"preserveAlpha",preserveaspectratio:"preserveAspectRatio",primitiveunits:"primitiveUnits",refx:"refX",refy:"refY",repeatcount:"repeatCount",repeatdur:"repeatDur",requiredextensions:"requiredExtensions",requiredfeatures:"requiredFeatures",specularconstant:"specularConstant",specularexponent:"specularExponent",spreadmethod:"spreadMethod",startoffset:"startOffset",stddeviation:"stdDeviation",stitchtiles:"stitchTiles",surfacescale:"surfaceScale",systemlanguage:"systemLanguage",tablevalues:"tableValues",targetx:"targetX",targety:"targetY",textlength:"textLength",viewbox:"viewBox",viewtarget:"viewTarget",xchannelselector:"xChannelSelector",ychannelselector:"yChannelSelector",zoomandpan:"zoomAndPan"},d={"xlink:actuate":{prefix:"xlink",name:"actuate",namespace:a.XLINK},"xlink:arcrole":{prefix:"xlink",name:"arcrole",namespace:a.XLINK},"xlink:href":{prefix:"xlink",name:"href",namespace:a.XLINK},"xlink:role":{prefix:"xlink",name:"role",namespace:a.XLINK},"xlink:show":{prefix:"xlink",name:"show",namespace:a.XLINK},"xlink:title":{prefix:"xlink",name:"title",namespace:a.XLINK},"xlink:type":{prefix:"xlink",name:"type",namespace:a.XLINK},"xml:base":{prefix:"xml",name:"base",namespace:a.XML},"xml:lang":{prefix:"xml",name:"lang",namespace:a.XML},"xml:space":{prefix:"xml",name:"space",namespace:a.XML},xmlns:{prefix:"",name:"xmlns",namespace:a.XMLNS},"xmlns:xlink":{prefix:"xmlns",name:"xlink",namespace:a.XMLNS}},p=t.SVG_TAG_NAMES_ADJUSTMENT_MAP={altglyph:"altGlyph",altglyphdef:"altGlyphDef",altglyphitem:"altGlyphItem",animatecolor:"animateColor",animatemotion:"animateMotion",animatetransform:"animateTransform",clippath:"clipPath",feblend:"feBlend",fecolormatrix:"feColorMatrix",fecomponenttransfer:"feComponentTransfer",fecomposite:"feComposite",feconvolvematrix:"feConvolveMatrix",fediffuselighting:"feDiffuseLighting",fedisplacementmap:"feDisplacementMap",fedistantlight:"feDistantLight",feflood:"feFlood",fefunca:"feFuncA",fefuncb:"feFuncB",fefuncg:"feFuncG",fefuncr:"feFuncR",fegaussianblur:"feGaussianBlur",feimage:"feImage",femerge:"feMerge",femergenode:"feMergeNode",femorphology:"feMorphology",feoffset:"feOffset",fepointlight:"fePointLight",fespecularlighting:"feSpecularLighting",fespotlight:"feSpotLight",fetile:"feTile",feturbulence:"feTurbulence",foreignobject:"foreignObject",glyphref:"glyphRef",lineargradient:"linearGradient",radialgradient:"radialGradient",textpath:"textPath"},f={[i.B]:!0,[i.BIG]:!0,[i.BLOCKQUOTE]:!0,[i.BODY]:!0,[i.BR]:!0,[i.CENTER]:!0,[i.CODE]:!0,[i.DD]:!0,[i.DIV]:!0,[i.DL]:!0,[i.DT]:!0,[i.EM]:!0,[i.EMBED]:!0,[i.H1]:!0,[i.H2]:!0,[i.H3]:!0,[i.H4]:!0,[i.H5]:!0,[i.H6]:!0,[i.HEAD]:!0,[i.HR]:!0,[i.I]:!0,[i.IMG]:!0,[i.LI]:!0,[i.LISTING]:!0,[i.MENU]:!0,[i.META]:!0,[i.NOBR]:!0,[i.OL]:!0,[i.P]:!0,[i.PRE]:!0,[i.RUBY]:!0,[i.S]:!0,[i.SMALL]:!0,[i.SPAN]:!0,[i.STRONG]:!0,[i.STRIKE]:!0,[i.SUB]:!0,[i.SUP]:!0,[i.TABLE]:!0,[i.TT]:!0,[i.U]:!0,[i.UL]:!0,[i.VAR]:!0};t.causesExit=function(e){const t=e.tagName;return!!(t===i.FONT&&(null!==o.getTokenAttr(e,s.COLOR)||null!==o.getTokenAttr(e,s.SIZE)||null!==o.getTokenAttr(e,s.FACE)))||f[t]},t.adjustTokenMathMLAttrs=function(e){for(let t=0;t{const i=r.MODE[o];n[i]=function(n){e.ctLoc=e._getCurrentLocation(),t[i].call(this,n)}})),n}}},ljYj:function(e,t,n){"use strict";var o=n("rm/B")(/\d/);e.exports=o},lwAK:function(e,t,n){"use strict";var o;t.__esModule=!0,t.AmpStateContext=void 0;var r=((o=n("q1tI"))&&o.__esModule?o:{default:o}).default.createContext({});t.AmpStateContext=r},lwsE:function(e,t){e.exports=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},e.exports.__esModule=!0,e.exports.default=e.exports},mAwW:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#f5f7ff",color:"#5e6687"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#f5f7ff",color:"#5e6687",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#dfe2f1"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#dfe2f1"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#dfe2f1"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#dfe2f1"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#dfe2f1"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#dfe2f1"},'code[class*="language-"]::selection':{textShadow:"none",background:"#dfe2f1"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#dfe2f1"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#898ea4"},prolog:{color:"#898ea4"},doctype:{color:"#898ea4"},cdata:{color:"#898ea4"},punctuation:{color:"#5e6687"},namespace:{Opacity:".7"},operator:{color:"#c76b29"},boolean:{color:"#c76b29"},number:{color:"#c76b29"},property:{color:"#c08b30"},tag:{color:"#3d8fd1"},string:{color:"#22a2c9"},selector:{color:"#6679cc"},"attr-name":{color:"#c76b29"},entity:{color:"#22a2c9",cursor:"help"},url:{color:"#22a2c9"},".language-css .token.string":{color:"#22a2c9"},".style .token.string":{color:"#22a2c9"},"attr-value":{color:"#ac9739"},keyword:{color:"#ac9739"},control:{color:"#ac9739"},directive:{color:"#ac9739"},unit:{color:"#ac9739"},statement:{color:"#22a2c9"},regex:{color:"#22a2c9"},atrule:{color:"#22a2c9"},placeholder:{color:"#3d8fd1"},variable:{color:"#3d8fd1"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #202746",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#c94922"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:"0.4em solid #c94922",OutlineOffset:".4em"},".line-numbers .line-numbers-rows":{borderRightColor:"#dfe2f1"},".line-numbers-rows > span:before":{color:"#979db4"},".line-highlight":{background:"linear-gradient(to right, rgba(107, 115, 148, 0.2) 70%, rgba(107, 115, 148, 0))"}}},mPvQ:function(e,t,n){var o=n("5fIB"),r=n("rlHP"),i=n("KckH"),a=n("kG2m");e.exports=function(e){return o(e)||r(e)||i(e)||a()}},nbFU:function(e,t,n){"use strict";e.exports=function(e,t){var n=e.footnoteById,r=e.footnoteOrder,i=1;for(;i in n;)i++;return i=String(i),r.push(i),n[i]={type:"footnoteDefinition",identifier:i,children:[{type:"paragraph",children:t.children}],position:t.position},o(e,{type:"footnoteReference",identifier:i,position:t.position})};var o=n("/BR8")},niEq:function(e,t,n){"use strict";const o=n("9kwo"),r=n("Ne21"),i=n("lb9w"),a=n("HwUZ");e.exports=class extends o{constructor(e,t){super(e,t),this.opts=t,this.ctLoc=null,this.locBeforeToken=!1}_setErrorLocation(e){this.ctLoc&&(e.startLine=this.ctLoc.startLine,e.startCol=this.ctLoc.startCol,e.startOffset=this.ctLoc.startOffset,e.endLine=this.locBeforeToken?this.ctLoc.startLine:this.ctLoc.endLine,e.endCol=this.locBeforeToken?this.ctLoc.startCol:this.ctLoc.endCol,e.endOffset=this.locBeforeToken?this.ctLoc.startOffset:this.ctLoc.endOffset)}_getOverriddenMethods(e,t){return{_bootstrap(n,o){t._bootstrap.call(this,n,o),a.install(this.tokenizer,r,e.opts),a.install(this.tokenizer,i)},_processInputToken(n){e.ctLoc=n.location,t._processInputToken.call(this,n)},_err(t,n){e.locBeforeToken=n&&n.beforeToken,e._reportError(t)}}}}},o0o1:function(e,t,n){var o=n("fsL8")();e.exports=o;try{regeneratorRuntime=o}catch(r){"object"===typeof globalThis?globalThis.regeneratorRuntime=o:Function("r","regeneratorRuntime = r")(o)}},o8bm:function(e,t,n){"use strict";var o=/[\0\t\n\r]/g;e.exports=function(){var e,t=!0,n=1,r="";return function(i,a,s){var l,c,u,d,p,f=[];i=r+i.toString(a),u=0,r="",t&&(65279===i.charCodeAt(0)&&u++,t=void 0);for(;u code[class*='language-']":{background:"#1e1e3f",padding:"0.1em",borderRadius:"0.3em"},"":{fontWeight:"400"},comment:{color:"#b362ff"},prolog:{color:"#b362ff"},cdata:{color:"#b362ff"},delimiter:{color:"#ff9d00"},keyword:{color:"#ff9d00"},selector:{color:"#ff9d00"},important:{color:"#ff9d00"},atrule:{color:"#ff9d00"},operator:{color:"rgb(255, 180, 84)",background:"none"},"attr-name":{color:"rgb(255, 180, 84)"},punctuation:{color:"#ffffff"},boolean:{color:"rgb(255, 98, 140)"},tag:{color:"rgb(255, 157, 0)"},"tag .punctuation":{color:"rgb(255, 157, 0)"},doctype:{color:"rgb(255, 157, 0)"},builtin:{color:"rgb(255, 157, 0)"},entity:{color:"#6897bb",background:"none"},symbol:{color:"#6897bb"},number:{color:"#ff628c"},property:{color:"#ff628c"},constant:{color:"#ff628c"},variable:{color:"#ff628c"},string:{color:"#a5ff90"},char:{color:"#a5ff90"},"attr-value":{color:"#a5c261"},"attr-value .punctuation":{color:"#a5c261"},"attr-value .punctuation:first-child":{color:"#a9b7c6"},url:{color:"#287bde",textDecoration:"underline",background:"none"},function:{color:"rgb(250, 208, 0)"},regex:{background:"#364135"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},inserted:{background:"#00ff00"},deleted:{background:"#ff000d"},"code.language-css .token.property":{color:"#a9b7c6"},"code.language-css .token.property + .token.punctuation":{color:"#a9b7c6"},"code.language-css .token.id":{color:"#ffc66d"},"code.language-css .token.selector > .token.class":{color:"#ffc66d"},"code.language-css .token.selector > .token.attribute":{color:"#ffc66d"},"code.language-css .token.selector > .token.pseudo-class":{color:"#ffc66d"},"code.language-css .token.selector > .token.pseudo-element":{color:"#ffc66d"},"class-name":{color:"#fb94ff"},".language-css .token.string":{background:"none"},".style .token.string":{background:"none"},"pre .line-highlight":{marginTop:"36px",background:"linear-gradient(to right, rgba(179, 98, 255, 0.17), transparent)"},"pre .line-highlight.line-highlight":{marginTop:"36px",background:"linear-gradient(to right, rgba(179, 98, 255, 0.17), transparent)"},"pre > code.line-highlight":{marginTop:"36px",background:"linear-gradient(to right, rgba(179, 98, 255, 0.17), transparent)"},"pre .line-highlight:before":{content:"''"},"pre > code.line-highlight:before":{content:"''"},"pre .line-highlight[data-end]:after":{content:"''"},"pre > code.line-highlight[data-end]:after":{content:"''"}}},pI64:function(e,t,n){"use strict";e.exports=function(e,t){var n,i,a={},s=t.ordered?"ol":"ul",l=-1;"number"===typeof t.start&&1!==t.start&&(a.start=t.start);n=r(e,t),i=n.length;for(;++l=55296&&e<=57343},t.isSurrogatePair=function(e){return e>=56320&&e<=57343},t.getSurrogatePairCodePoint=function(e,t){return 1024*(e-55296)+9216+t},t.isControlCodePoint=function(e){return 32!==e&&10!==e&&13!==e&&9!==e&&12!==e&&e>=1&&e<=31||e>=127&&e<=159},t.isUndefinedCodePoint=function(e){return e>=64976&&e<=65007||o.indexOf(e)>-1}},pe0m:function(e,t,n){"use strict";e.exports=function(e){return null===e||void 0===e?[]:"length"in e?e:[e]}},penn:function(e,t,n){e.exports=n("YK6v")},qD0n:function(e,t){function n(e){this.stack[this.stack.length-2].checked="taskListCheckValueChecked"===e.type}t.exit={taskListCheckValueChecked:n,taskListCheckValueUnchecked:n,paragraph:function(e){var t,n=this.stack[this.stack.length-2],o=this.stack[this.stack.length-1],r=n.children,i=o.children[0],a=-1;if(n&&"listItem"===n.type&&"boolean"===typeof n.checked&&i&&"text"===i.type){for(;++a-1||r(i.events,"linePrefix")<4?e.interrupt(i.parser.constructs.flow,n,t)(a):t(a)}},partial:!0};e.exports=s},rRyo:function(e,t,n){"use strict";e.exports=function(e,t){var n,i=e.definition(t.identifier);if(!i)return r(e,t);n={src:o(i.url||""),alt:t.alt},null!==i.title&&void 0!==i.title&&(n.title=i.title);return e(t,"img",n)};var o=n("xGQ6"),r=n("WniP")},rS7C:function(e,t,n){"use strict";var o=n("F6fn"),r=n("bAF5"),i=n("r3IV"),a=n("TTG4").parse,s=n("vfP8").parse;e.exports=function(e,t,n){var r=n?function(e){var t,n=e.length,o=-1,r={};for(;++o code[class*="language-"]':{background:"#282a36",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"#6272a4"},prolog:{color:"#6272a4"},doctype:{color:"#6272a4"},cdata:{color:"#6272a4"},punctuation:{color:"#f8f8f2"},".namespace":{Opacity:".7"},property:{color:"#ff79c6"},tag:{color:"#ff79c6"},constant:{color:"#ff79c6"},symbol:{color:"#ff79c6"},deleted:{color:"#ff79c6"},boolean:{color:"#bd93f9"},number:{color:"#bd93f9"},selector:{color:"#50fa7b"},"attr-name":{color:"#50fa7b"},string:{color:"#50fa7b"},char:{color:"#50fa7b"},builtin:{color:"#50fa7b"},inserted:{color:"#50fa7b"},operator:{color:"#f8f8f2"},entity:{color:"#f8f8f2",cursor:"help"},url:{color:"#f8f8f2"},".language-css .token.string":{color:"#f8f8f2"},".style .token.string":{color:"#f8f8f2"},variable:{color:"#f8f8f2"},atrule:{color:"#f1fa8c"},"attr-value":{color:"#f1fa8c"},function:{color:"#f1fa8c"},"class-name":{color:"#f1fa8c"},keyword:{color:"#8be9fd"},regex:{color:"#ffb86c"},important:{color:"#ffb86c",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}}},srZV:function(e,t,n){"use strict";const o=n("9kwo"),r=n("CGnT"),i=n("HwUZ");e.exports=class extends o{constructor(e,t){super(e,t),this.posTracker=i.install(e,r),this.lastErrOffset=-1}_reportError(e){this.lastErrOffset!==this.posTracker.offset&&(this.lastErrOffset=this.posTracker.offset,super._reportError(e))}}},tCBg:function(e,t,n){var o=n("C+bE"),r=n("qXWd");e.exports=function(e,t){return!t||"object"!==o(t)&&"function"!==typeof t?r(e):t}},tgGP:function(e,t,n){"use strict";var o=n("ueQ+"),r=n("+OJB"),i=n("c6jy");e.exports=l;var a={}.hasOwnProperty,s=["history","path","basename","stem","extname","dirname"];function l(e){var t,n;if(e){if("string"===typeof e||i(e))e={contents:e};else if("message"in e&&"messages"in e)return e}else e={};if(!(this instanceof l))return new l(e);for(this.data={},this.messages=[],this.history=[],this.cwd=r.cwd(),n=-1;++n-1)throw new Error("`"+t+"` cannot be a path: did not expect `"+o.sep+"`")}function u(e,t){if(!e)throw new Error("`"+t+"` cannot be empty")}function d(e,t){if(!e)throw new Error("Setting `"+t+"` requires `path` to be set too")}l.prototype.toString=function(e){return(this.contents||"").toString(e)},Object.defineProperty(l.prototype,"path",{get:function(){return this.history[this.history.length-1]},set:function(e){u(e,"path"),this.path!==e&&this.history.push(e)}}),Object.defineProperty(l.prototype,"dirname",{get:function(){return"string"===typeof this.path?o.dirname(this.path):void 0},set:function(e){d(this.path,"dirname"),this.path=o.join(e||"",this.basename)}}),Object.defineProperty(l.prototype,"basename",{get:function(){return"string"===typeof this.path?o.basename(this.path):void 0},set:function(e){u(e,"basename"),c(e,"basename"),this.path=o.join(this.dirname||"",e)}}),Object.defineProperty(l.prototype,"extname",{get:function(){return"string"===typeof this.path?o.extname(this.path):void 0},set:function(e){if(c(e,"extname"),d(this.path,"extname"),e){if(46!==e.charCodeAt(0))throw new Error("`extname` must start with `.`");if(e.indexOf(".",1)>-1)throw new Error("`extname` cannot contain multiple dots")}this.path=o.join(this.dirname,this.stem+(e||""))}}),Object.defineProperty(l.prototype,"stem",{get:function(){return"string"===typeof this.path?o.basename(this.path,this.extname):void 0},set:function(e){u(e,"stem"),c(e,"stem"),this.path=o.join(this.dirname||"",e+(this.extname||""))}})},u0PD:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'pre[class*="language-"]':{color:"#d4d4d4",fontSize:"13px",textShadow:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",background:"#1e1e1e"},'code[class*="language-"]':{color:"#d4d4d4",fontSize:"13px",textShadow:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#b3d4fc"},'code[class*="language-"]::selection':{textShadow:"none",background:"#b3d4fc"},':not(pre) > code[class*="language-"]':{padding:".1em .3em",borderRadius:".3em",color:"#db4c69",background:"#f9f2f4"},".namespace":{Opacity:".7"},comment:{color:"#6a9955"},prolog:{color:"#6a9955"},doctype:{color:"#6a9955"},cdata:{color:"#6a9955"},punctuation:{color:"#d4d4d4"},property:{color:"#9cdcfe"},tag:{color:"#569cd6"},boolean:{color:"#569cd6"},number:{color:"#b5cea8"},constant:{color:"#9CDCFE"},symbol:{color:"#b5cea8"},deleted:{color:"#b5cea8"},selector:{color:"#d7ba7d"},"attr-name":{color:"#9cdcfe"},string:{color:"#ce9178"},char:{color:"#ce9178"},builtin:{color:"#ce9178"},inserted:{color:"#ce9178"},operator:{color:"#d4d4d4",background:"#1e1e1e"},entity:{color:"#4ec9b0",background:"#1e1e1e",cursor:"unset"},url:{color:"#d4d4d4",background:"#1e1e1e"},".language-css .token.string":{color:"#d4d4d4",background:"#1e1e1e"},".style .token.string":{color:"#d4d4d4",background:"#1e1e1e"},atrule:{color:"#c586c0"},"attr-value":{color:"#ce9178"},keyword:{color:"#c586c0"},function:{color:"#dcdcaa"},regex:{color:"#d16969"},important:{color:"#d16969",fontWeight:"bold"},variable:{color:"#d16969"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},"class-name":{color:"#4EC9B0"},parameter:{color:"#9CDCFE"},interpolation:{color:"#9CDCFE"},"punctuation.interpolation-punctuation":{color:"#569cd6"},namespace:{color:"#4ec9b0"},'pre[class*="language-javascript"]':{color:"#4ec9b0"},'code[class*="language-javascript"]':{color:"#4ec9b0"},'pre[class*="language-css"]':{color:"#CE9178"},'code[class*="language-css"]':{color:"#CE9178"},'pre[class*="language-html"]':{color:"#d4d4d4"},'code[class*="language-html"]':{color:"#d4d4d4"},".language-html .token.punctuation":{color:"#808080"},"pre[data-line]":{position:"relative"},'pre[class*="language-"] > code[class*="language-"]':{position:"relative",zIndex:"1"},".line-highlight":{position:"absolute",left:"0",right:"0",padding:"inherit 0",marginTop:"1em",background:"#f7ebc6",boxShadow:"inset 5px 0 0 #f7d87c",zIndex:"0",pointerEvents:"none",lineHeight:"inherit",whiteSpace:"pre"}}},uDje:function(e,t,n){"use strict";var o=n("rm/B")(/\s/);e.exports=o},uGmZ:function(e,t,n){e.exports=n("CGL2")},"ueQ+":function(e,t,n){"use strict";function o(e){var t,n;return r(e),t=47===e.charCodeAt(0),(n=function(e,t){var n,o,r="",i=0,a=-1,s=0,l=-1;for(;++l<=e.length;){if(l2){if((o=r.lastIndexOf("/"))!==r.length-1){o<0?(r="",i=0):i=(r=r.slice(0,o)).length-1-r.lastIndexOf("/"),a=l,s=0;continue}}else if(r.length){r="",i=0,a=l,s=0;continue}t&&(r=r.length?r+"/..":"..",i=2)}else r.length?r+="/"+e.slice(a+1,l):r=e.slice(a+1,l),i=l-a-1;a=l,s=0}else 46===n&&s>-1?s++:s=-1}return r}(e,!t)).length||t||(n="."),n.length&&47===e.charCodeAt(e.length-1)&&(n+="/"),t?"/"+n:n}function r(e){if("string"!==typeof e)throw new TypeError("Path must be a string. Received "+JSON.stringify(e))}t.basename=function(e,t){var n,o,i,a,s=0,l=-1;if(void 0!==t&&"string"!==typeof t)throw new TypeError('"ext" argument must be a string');if(r(e),n=e.length,void 0===t||!t.length||t.length>e.length){for(;n--;)if(47===e.charCodeAt(n)){if(i){s=n+1;break}}else l<0&&(i=!0,l=n+1);return l<0?"":e.slice(s,l)}if(t===e)return"";o=-1,a=t.length-1;for(;n--;)if(47===e.charCodeAt(n)){if(i){s=n+1;break}}else o<0&&(i=!0,o=n+1),a>-1&&(e.charCodeAt(n)===t.charCodeAt(a--)?a<0&&(l=n):(a=-1,l=o));s===l?l=o:l<0&&(l=e.length);return e.slice(s,l)},t.dirname=function(e){var t,n,o;if(r(e),!e.length)return".";t=-1,o=e.length;for(;--o;)if(47===e.charCodeAt(o)){if(n){t=o;break}}else n||(n=!0);return t<0?47===e.charCodeAt(0)?"/":".":1===t&&47===e.charCodeAt(0)?"//":e.slice(0,t)},t.extname=function(e){var t,n,o,i=-1,a=0,s=-1,l=0;r(e),o=e.length;for(;o--;)if(47!==(n=e.charCodeAt(o)))s<0&&(t=!0,s=o+1),46===n?i<0?i=o:1!==l&&(l=1):i>-1&&(l=-1);else if(t){a=o+1;break}if(i<0||s<0||0===l||1===l&&i===s-1&&i===a+1)return"";return e.slice(i,s)},t.join=function(){var e,t=-1;for(;++t0&&("\r"===c||"\n"===c)&&"html"===i.type&&(s[s.length-1]=s[s.length-1].replace(/(\r?\n|\r)$/," "),c=" "),s.push(t.handle(i,e,t,{before:c,after:o})),c=s[s.length-1].slice(-1);return s.join("")}},uzq8:function(e,t,n){"use strict";e.exports=l;var o=n("Zasy"),r=n("AJTF"),i=!0,a="skip",s=!1;function l(e,t,n,l){var c,u;"function"===typeof t&&"function"!==typeof n&&(l=n,n=t,t=null),u=o(t),c=l?-1:1,function e(o,d,p){var f,h="object"===typeof o&&null!==o?o:{};"string"===typeof h.type&&(f="string"===typeof h.tagName?h.tagName:"string"===typeof h.name?h.name:void 0,m.displayName="node ("+r(h.type+(f?"<"+f+">":""))+")");return m;function m(){var r,f,h=p.concat(o),m=[];if((!t||u(o,d,p[p.length-1]||null))&&(m=function(e){if(null!==e&&"object"===typeof e&&"length"in e)return e;if("number"===typeof e)return[i,e];return[e]}(n(o,p)))[0]===s)return m;if(o.children&&m[0]!==a)for(f=(l?o.children.length:-1)+c;f>-1&&f code[class*="language-"]':{whiteSpace:"normal",borderRadius:"0.2em",padding:"0.1em"},".language-css > code":{color:"#fd9170"},".language-sass > code":{color:"#fd9170"},".language-scss > code":{color:"#fd9170"},'[class*="language-"] .namespace':{Opacity:"0.7"},atrule:{color:"#c792ea"},"attr-name":{color:"#ffcb6b"},"attr-value":{color:"#a5e844"},attribute:{color:"#a5e844"},boolean:{color:"#c792ea"},builtin:{color:"#ffcb6b"},cdata:{color:"#80cbc4"},char:{color:"#80cbc4"},class:{color:"#ffcb6b"},"class-name":{color:"#f2ff00"},comment:{color:"#616161"},constant:{color:"#c792ea"},deleted:{color:"#ff6666"},doctype:{color:"#616161"},entity:{color:"#ff6666"},function:{color:"#c792ea"},hexcode:{color:"#f2ff00"},id:{color:"#c792ea",fontWeight:"bold"},important:{color:"#c792ea",fontWeight:"bold"},inserted:{color:"#80cbc4"},keyword:{color:"#c792ea"},number:{color:"#fd9170"},operator:{color:"#89ddff"},prolog:{color:"#616161"},property:{color:"#80cbc4"},"pseudo-class":{color:"#a5e844"},"pseudo-element":{color:"#a5e844"},punctuation:{color:"#89ddff"},regex:{color:"#f2ff00"},selector:{color:"#ff6666"},string:{color:"#a5e844"},symbol:{color:"#c792ea"},tag:{color:"#ff6666"},unit:{color:"#fd9170"},url:{color:"#ff6666"},variable:{color:"#ff6666"}}},wGQB:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{color:"#ccc",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#ccc",background:"#2d2d2d",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto"},':not(pre) > code[class*="language-"]':{background:"#2d2d2d",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"#999"},"block-comment":{color:"#999"},prolog:{color:"#999"},doctype:{color:"#999"},cdata:{color:"#999"},punctuation:{color:"#ccc"},tag:{color:"#e2777a"},"attr-name":{color:"#e2777a"},namespace:{color:"#e2777a"},deleted:{color:"#e2777a"},"function-name":{color:"#6196cc"},boolean:{color:"#f08d49"},number:{color:"#f08d49"},function:{color:"#f08d49"},property:{color:"#f8c555"},"class-name":{color:"#f8c555"},constant:{color:"#f8c555"},symbol:{color:"#f8c555"},selector:{color:"#cc99cd"},important:{color:"#cc99cd",fontWeight:"bold"},atrule:{color:"#cc99cd"},keyword:{color:"#cc99cd"},builtin:{color:"#cc99cd"},string:{color:"#7ec699"},char:{color:"#7ec699"},"attr-value":{color:"#7ec699"},regex:{color:"#7ec699"},variable:{color:"#7ec699"},operator:{color:"#67cdcc"},entity:{color:"#67cdcc",cursor:"help"},url:{color:"#67cdcc"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},inserted:{color:"green"}}},wH4i:function(e,t,n){"use strict";var o,r=n("penn"),i=n("jv5L"),a=n("ywEd");e.exports=function(e){var t=this.data();!o&&(this.Parser&&this.Parser.prototype&&this.Parser.prototype.blockTokenizers||this.Compiler&&this.Compiler.prototype&&this.Compiler.prototype.visitors)&&(o=!0,console.warn("[remark-gfm] Warning: please upgrade to remark 13 to use this plugin"));function n(e,n){t[e]?t[e].push(n):t[e]=[n]}n("micromarkExtensions",r(e)),n("fromMarkdownExtensions",i),n("toMarkdownExtensions",a(e))}},wJMj:function(e,t,n){"use strict";e.exports=function(e,t,n){"string"!==typeof t&&(n=t,t=void 0);return function(e){var t=e||{},n=function(e,t){var n=-1;for(;++n-1&&(D.call(this,e),F.call(this,e))}function z(){h("atHardBreak",!0)}function U(){var e=this.resume();this.stack[this.stack.length-1].value=e}function G(){var e=this.resume();this.stack[this.stack.length-1].value=e}function W(){var e=this.resume();this.stack[this.stack.length-1].value=e}function K(){var e=this.stack[this.stack.length-1];m("inReference")?(e.type+="Reference",e.referenceType=m("referenceType")||"shortcut",delete e.url,delete e.title):(delete e.identifier,delete e.label,delete e.referenceType),h("referenceType")}function j(){var e=this.stack[this.stack.length-1];m("inReference")?(e.type+="Reference",e.referenceType=m("referenceType")||"shortcut",delete e.url,delete e.title):(delete e.identifier,delete e.label,delete e.referenceType),h("referenceType")}function Y(e){this.stack[this.stack.length-2].identifier=a(this.sliceSerialize(e)).toLowerCase()}function Q(){var e=this.stack[this.stack.length-1],t=this.resume();this.stack[this.stack.length-1].label=t,h("inReference",!0),"link"===this.stack[this.stack.length-1].type?this.stack[this.stack.length-1].children=e.children:this.stack[this.stack.length-1].alt=t}function V(){var e=this.resume();this.stack[this.stack.length-1].url=e}function q(){var e=this.resume();this.stack[this.stack.length-1].title=e}function X(){h("inReference")}function J(){h("referenceType","collapsed")}function Z(e){var t=this.resume();this.stack[this.stack.length-1].label=t,this.stack[this.stack.length-1].identifier=a(this.sliceSerialize(e)).toLowerCase(),h("referenceType","full")}function $(e){h("characterReferenceType",e.type)}function ee(e){var t,n,o=this.sliceSerialize(e),r=m("characterReferenceType");r?(t=s(o,"characterReferenceMarkerNumeric"===r?10:16),h("characterReferenceType")):t=d(o),(n=this.stack.pop()).value+=t,n.position.end=g(e.end)}function te(e){F.call(this,e),this.stack[this.stack.length-1].url=this.sliceSerialize(e)}function ne(e){F.call(this,e),this.stack[this.stack.length-1].url="mailto:"+this.sliceSerialize(e)}function oe(){return{type:"blockquote",children:[]}}function re(){return{type:"code",lang:null,meta:null,value:""}}function ie(){return{type:"inlineCode",value:""}}function ae(){return{type:"definition",identifier:"",label:null,title:null,url:""}}function se(){return{type:"emphasis",children:[]}}function le(){return{type:"heading",depth:void 0,children:[]}}function ce(){return{type:"break"}}function ue(){return{type:"html",value:""}}function de(){return{type:"image",title:null,url:"",alt:null}}function pe(){return{type:"link",title:null,url:"",children:[]}}function fe(e){return{type:"list",ordered:"listOrdered"===e.type,start:null,spread:e._spread,children:[]}}function he(e){return{type:"listItem",spread:e._spread,checked:null,children:[]}}function me(){return{type:"paragraph",children:[]}}function ge(){return{type:"strong",children:[]}}function Te(){return{type:"text",value:""}}function Ee(){return{type:"thematicBreak"}}}(n)(u(l(n).document().write(c()(e,t,!0))))};var o=n("IW26"),r=n("NOby"),i=n("TDhK"),a=n("Bh6z"),s=n("Z0IX"),l=n("0RbX"),c=n("o8bm"),u=n("1mpw"),d=n("WtKE"),p=n("/qNp");function f(e,t){var n,o;for(n in t)o=i.call(e,n)?e[n]:e[n]={},"canContainEols"===n||"transforms"===n?e[n]=[].concat(o,t[n]):Object.assign(o,t[n])}},wYf1:function(e,t,n){var o=n("uzhd"),r=n("gsvO"),i=n("55fs");e.exports=function(e){var t=e||{},n=t.tableCellPadding,a=t.tablePipeAlign,s=t.stringLength,l=n?" ":"|";return{unsafe:[{character:"\r",inConstruct:"tableCell"},{character:"\n",inConstruct:"tableCell"},{atBreak:!0,character:"|",after:"[\t :-]"},{character:"|",inConstruct:"tableCell"},{atBreak:!0,character:":",after:"-"},{atBreak:!0,character:"-",after:"[:|-]"}],handlers:{table:function(e,t,n){return u(function(e,t){var n=e.children,o=-1,r=n.length,i=[],a=t.enter("table");for(;++o=55296&&s<=57343){if(s>=55296&&s<=56319&&i+1=56320&&l<=57343){u+=encodeURIComponent(e[i]+e[i+1]),i++;continue}u+="%EF%BF%BD"}else u+=encodeURIComponent(e[i]);return u}r.defaultChars=";/?:@&=+$,-_.!~*'()#",r.componentChars="-_.!~*'()",e.exports=r},xkQk:function(e,t,n){"use strict";var o=n("EBzq");e.exports=i,i.wrap=o;var r=[].slice;function i(){var e=[],t={run:function(){var t=-1,n=r.call(arguments,0,-1),i=arguments[arguments.length-1];if("function"!==typeof i)throw new Error("Expected function as last argument, not "+i);function a(s){var l=e[++t],c=r.call(arguments,0),u=c.slice(1),d=n.length,p=-1;if(s)i(s);else{for(;++p code[class*="language-"]':{background:"#2b2b2b",padding:"0.1em",borderRadius:"0.3em",whiteSpace:"normal"},comment:{color:"#d4d0ab"},prolog:{color:"#d4d0ab"},doctype:{color:"#d4d0ab"},cdata:{color:"#d4d0ab"},punctuation:{color:"#fefefe"},property:{color:"#ffa07a"},tag:{color:"#ffa07a"},constant:{color:"#ffa07a"},symbol:{color:"#ffa07a"},deleted:{color:"#ffa07a"},boolean:{color:"#00e0e0"},number:{color:"#00e0e0"},selector:{color:"#abe338"},"attr-name":{color:"#abe338"},string:{color:"#abe338"},char:{color:"#abe338"},builtin:{color:"#abe338"},inserted:{color:"#abe338"},operator:{color:"#00e0e0"},entity:{color:"#00e0e0",cursor:"help"},url:{color:"#00e0e0"},".language-css .token.string":{color:"#00e0e0"},".style .token.string":{color:"#00e0e0"},variable:{color:"#00e0e0"},atrule:{color:"#ffd700"},"attr-value":{color:"#ffd700"},function:{color:"#ffd700"},keyword:{color:"#00e0e0"},regex:{color:"#ffd700"},important:{color:"#ffd700",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}}},ywEd:function(e,t,n){var o=n("oDdY"),r=n("K/gC"),i=n("wYf1"),a=n("vSfO"),s=n("UhtW");e.exports=function(e){var t=s({handlers:{},join:[],unsafe:[],options:{}},{extensions:[o,r,i(e),a]});return Object.assign(t.options,{handlers:t.handlers,join:t.join,unsafe:t.unsafe})}},z2ZG:function(e,t,n){"use strict";var o=n("U6jy"),r=n("dKIx");e.exports=function(e){var t,n,i=e.length,a=[],s=[],l=-1;for(;++l=0;o--){const r=e.openElements.items[o];if(r===t.element)break;e._isSpecialElement(r)&&(n=r)}return n||(e.openElements.popUntilElementPopped(t.element),e.activeFormattingElements.removeEntry(t)),n}function q(e,t,n){let o=t,r=e.openElements.getCommonAncestor(t);for(let i=0,a=r;a!==n;i++,a=r){r=e.openElements.getCommonAncestor(a);const n=e.activeFormattingElements.getElementEntry(a),s=n&&i>=3;!n||s?(s&&e.activeFormattingElements.removeEntry(n),e.openElements.remove(a)):(a=X(e,n),o===t&&(e.activeFormattingElements.bookmark=n),e.treeAdapter.detachNode(o),e.treeAdapter.appendChild(a,o),o=a)}return o}function X(e,t){const n=e.treeAdapter.getNamespaceURI(t.element),o=e.treeAdapter.createElement(t.token.tagName,n,t.token.attrs);return e.openElements.replace(t.element,o),t.element=o,o}function J(e,t,n){if(e._isElementCausesFosterParenting(t))e._fosterParentElement(n);else{const o=e.treeAdapter.getTagName(t),r=e.treeAdapter.getNamespaceURI(t);o===g.TEMPLATE&&r===T.HTML&&(t=e.treeAdapter.getTemplateContent(t)),e.treeAdapter.appendChild(t,n)}}function Z(e,t,n){const o=e.treeAdapter.getNamespaceURI(n.element),r=n.token,i=e.treeAdapter.createElement(r.tagName,o,r.attrs);e._adoptNodes(t,i),e.treeAdapter.appendChild(t,i),e.activeFormattingElements.insertElementAfterBookmark(i,n.token),e.activeFormattingElements.removeEntry(n),e.openElements.remove(n.element),e.openElements.insertAfter(t,i)}function $(e,t){let n;for(let o=0;o<8&&(n=Q(e,t),n);o++){const t=V(e,n);if(!t)break;e.activeFormattingElements.bookmark=n;const o=q(e,t,n.element),r=e.openElements.getCommonAncestor(n.element);e.treeAdapter.detachNode(o),J(e,r,o),Z(e,t,n)}}function ee(){}function te(e){e._err(f.misplacedDoctype)}function ne(e,t){e._appendCommentNode(t,e.openElements.currentTmplContent||e.openElements.current)}function oe(e,t){e._appendCommentNode(t,e.document)}function re(e,t){e._insertCharacters(t)}function ie(e){e.stopped=!0}function ae(e,t){e._err(f.missingDoctype,{beforeToken:!0}),e.treeAdapter.setDocumentMode(e.document,m.DOCUMENT_MODE.QUIRKS),e.insertionMode=y,e._processToken(t)}function se(e,t){e._insertFakeRootElement(),e.insertionMode=_,e._processToken(t)}function le(e,t){e._insertFakeElement(g.HEAD),e.headElement=e.openElements.current,e.insertionMode=S,e._processToken(t)}function ce(e,t){const n=t.tagName;n===g.HTML?xe(e,t):n===g.BASE||n===g.BASEFONT||n===g.BGSOUND||n===g.LINK||n===g.META?(e._appendElement(t,T.HTML),t.ackSelfClosing=!0):n===g.TITLE?e._switchToTextParsing(t,o.MODE.RCDATA):n===g.NOSCRIPT?e.options.scriptingEnabled?e._switchToTextParsing(t,o.MODE.RAWTEXT):(e._insertElement(t,T.HTML),e.insertionMode=C):n===g.NOFRAMES||n===g.STYLE?e._switchToTextParsing(t,o.MODE.RAWTEXT):n===g.SCRIPT?e._switchToTextParsing(t,o.MODE.SCRIPT_DATA):n===g.TEMPLATE?(e._insertTemplate(t,T.HTML),e.activeFormattingElements.insertMarker(),e.framesetOk=!1,e.insertionMode=F,e._pushTmplInsertionMode(F)):n===g.HEAD?e._err(f.misplacedStartTagForHeadElement):de(e,t)}function ue(e,t){const n=t.tagName;n===g.HEAD?(e.openElements.pop(),e.insertionMode=x):n===g.BODY||n===g.BR||n===g.HTML?de(e,t):n===g.TEMPLATE&&e.openElements.tmplCount>0?(e.openElements.generateImpliedEndTagsThoroughly(),e.openElements.currentTagName!==g.TEMPLATE&&e._err(f.closingOfElementWithOpenChildElements),e.openElements.popUntilTagNamePopped(g.TEMPLATE),e.activeFormattingElements.clearToLastMarker(),e._popTmplInsertionMode(),e._resetInsertionMode()):e._err(f.endTagWithoutMatchingOpenElement)}function de(e,t){e.openElements.pop(),e.insertionMode=x,e._processToken(t)}function pe(e,t){const n=t.type===o.EOF_TOKEN?f.openElementsLeftAfterEof:f.disallowedContentInNoscriptInHead;e._err(n),e.openElements.pop(),e.insertionMode=S,e._processToken(t)}function fe(e,t){e._insertFakeElement(g.BODY),e.insertionMode=v,e._processToken(t)}function he(e,t){e._reconstructActiveFormattingElements(),e._insertCharacters(t)}function me(e,t){e._reconstructActiveFormattingElements(),e._insertCharacters(t),e.framesetOk=!1}function ge(e,t){e.openElements.hasInButtonScope(g.P)&&e._closePElement(),e._insertElement(t,T.HTML)}function Te(e,t){e.openElements.hasInButtonScope(g.P)&&e._closePElement(),e._insertElement(t,T.HTML),e.skipNextNewLine=!0,e.framesetOk=!1}function Ee(e,t){e._reconstructActiveFormattingElements(),e._insertElement(t,T.HTML),e.activeFormattingElements.pushElement(e.openElements.current,t)}function be(e,t){e._reconstructActiveFormattingElements(),e._insertElement(t,T.HTML),e.activeFormattingElements.insertMarker(),e.framesetOk=!1}function Ae(e,t){e._reconstructActiveFormattingElements(),e._appendElement(t,T.HTML),e.framesetOk=!1,t.ackSelfClosing=!0}function ke(e,t){e._appendElement(t,T.HTML),t.ackSelfClosing=!0}function ye(e,t){e._switchToTextParsing(t,o.MODE.RAWTEXT)}function _e(e,t){e.openElements.currentTagName===g.OPTION&&e.openElements.pop(),e._reconstructActiveFormattingElements(),e._insertElement(t,T.HTML)}function Se(e,t){e.openElements.hasInScope(g.RUBY)&&e.openElements.generateImpliedEndTags(),e._insertElement(t,T.HTML)}function Ce(e,t){e._reconstructActiveFormattingElements(),e._insertElement(t,T.HTML)}function xe(e,t){const n=t.tagName;switch(n.length){case 1:n===g.I||n===g.S||n===g.B||n===g.U?Ee(e,t):n===g.P?ge(e,t):n===g.A?function(e,t){const n=e.activeFormattingElements.getElementEntryInScopeWithTagName(g.A);n&&($(e,t),e.openElements.remove(n.element),e.activeFormattingElements.removeEntry(n)),e._reconstructActiveFormattingElements(),e._insertElement(t,T.HTML),e.activeFormattingElements.pushElement(e.openElements.current,t)}(e,t):Ce(e,t);break;case 2:n===g.DL||n===g.OL||n===g.UL?ge(e,t):n===g.H1||n===g.H2||n===g.H3||n===g.H4||n===g.H5||n===g.H6?function(e,t){e.openElements.hasInButtonScope(g.P)&&e._closePElement();const n=e.openElements.currentTagName;n!==g.H1&&n!==g.H2&&n!==g.H3&&n!==g.H4&&n!==g.H5&&n!==g.H6||e.openElements.pop(),e._insertElement(t,T.HTML)}(e,t):n===g.LI||n===g.DD||n===g.DT?function(e,t){e.framesetOk=!1;const n=t.tagName;for(let o=e.openElements.stackTop;o>=0;o--){const t=e.openElements.items[o],r=e.treeAdapter.getTagName(t);let i=null;if(n===g.LI&&r===g.LI?i=g.LI:n!==g.DD&&n!==g.DT||r!==g.DD&&r!==g.DT||(i=r),i){e.openElements.generateImpliedEndTagsWithExclusion(i),e.openElements.popUntilTagNamePopped(i);break}if(r!==g.ADDRESS&&r!==g.DIV&&r!==g.P&&e._isSpecialElement(t))break}e.openElements.hasInButtonScope(g.P)&&e._closePElement(),e._insertElement(t,T.HTML)}(e,t):n===g.EM||n===g.TT?Ee(e,t):n===g.BR?Ae(e,t):n===g.HR?function(e,t){e.openElements.hasInButtonScope(g.P)&&e._closePElement(),e._appendElement(t,T.HTML),e.framesetOk=!1,t.ackSelfClosing=!0}(e,t):n===g.RB?Se(e,t):n===g.RT||n===g.RP?function(e,t){e.openElements.hasInScope(g.RUBY)&&e.openElements.generateImpliedEndTagsWithExclusion(g.RTC),e._insertElement(t,T.HTML)}(e,t):n!==g.TH&&n!==g.TD&&n!==g.TR&&Ce(e,t);break;case 3:n===g.DIV||n===g.DIR||n===g.NAV?ge(e,t):n===g.PRE?Te(e,t):n===g.BIG?Ee(e,t):n===g.IMG||n===g.WBR?Ae(e,t):n===g.XMP?function(e,t){e.openElements.hasInButtonScope(g.P)&&e._closePElement(),e._reconstructActiveFormattingElements(),e.framesetOk=!1,e._switchToTextParsing(t,o.MODE.RAWTEXT)}(e,t):n===g.SVG?function(e,t){e._reconstructActiveFormattingElements(),p.adjustTokenSVGAttrs(t),p.adjustTokenXMLAttrs(t),t.selfClosing?e._appendElement(t,T.SVG):e._insertElement(t,T.SVG),t.ackSelfClosing=!0}(e,t):n===g.RTC?Se(e,t):n!==g.COL&&Ce(e,t);break;case 4:n===g.HTML?function(e,t){0===e.openElements.tmplCount&&e.treeAdapter.adoptAttributes(e.openElements.items[0],t.attrs)}(e,t):n===g.BASE||n===g.LINK||n===g.META?ce(e,t):n===g.BODY?function(e,t){const n=e.openElements.tryPeekProperlyNestedBodyElement();n&&0===e.openElements.tmplCount&&(e.framesetOk=!1,e.treeAdapter.adoptAttributes(n,t.attrs))}(e,t):n===g.MAIN||n===g.MENU?ge(e,t):n===g.FORM?function(e,t){const n=e.openElements.tmplCount>0;e.formElement&&!n||(e.openElements.hasInButtonScope(g.P)&&e._closePElement(),e._insertElement(t,T.HTML),n||(e.formElement=e.openElements.current))}(e,t):n===g.CODE||n===g.FONT?Ee(e,t):n===g.NOBR?function(e,t){e._reconstructActiveFormattingElements(),e.openElements.hasInScope(g.NOBR)&&($(e,t),e._reconstructActiveFormattingElements()),e._insertElement(t,T.HTML),e.activeFormattingElements.pushElement(e.openElements.current,t)}(e,t):n===g.AREA?Ae(e,t):n===g.MATH?function(e,t){e._reconstructActiveFormattingElements(),p.adjustTokenMathMLAttrs(t),p.adjustTokenXMLAttrs(t),t.selfClosing?e._appendElement(t,T.MATHML):e._insertElement(t,T.MATHML),t.ackSelfClosing=!0}(e,t):n===g.MENU?function(e,t){e.openElements.hasInButtonScope(g.P)&&e._closePElement(),e._insertElement(t,T.HTML)}(e,t):n!==g.HEAD&&Ce(e,t);break;case 5:n===g.STYLE||n===g.TITLE?ce(e,t):n===g.ASIDE?ge(e,t):n===g.SMALL?Ee(e,t):n===g.TABLE?function(e,t){e.treeAdapter.getDocumentMode(e.document)!==m.DOCUMENT_MODE.QUIRKS&&e.openElements.hasInButtonScope(g.P)&&e._closePElement(),e._insertElement(t,T.HTML),e.framesetOk=!1,e.insertionMode=N}(e,t):n===g.EMBED?Ae(e,t):n===g.INPUT?function(e,t){e._reconstructActiveFormattingElements(),e._appendElement(t,T.HTML);const n=o.getTokenAttr(t,E.TYPE);n&&n.toLowerCase()===A||(e.framesetOk=!1),t.ackSelfClosing=!0}(e,t):n===g.PARAM||n===g.TRACK?ke(e,t):n===g.IMAGE?function(e,t){t.tagName=g.IMG,Ae(e,t)}(e,t):n!==g.FRAME&&n!==g.TBODY&&n!==g.TFOOT&&n!==g.THEAD&&Ce(e,t);break;case 6:n===g.SCRIPT?ce(e,t):n===g.CENTER||n===g.FIGURE||n===g.FOOTER||n===g.HEADER||n===g.HGROUP||n===g.DIALOG?ge(e,t):n===g.BUTTON?function(e,t){e.openElements.hasInScope(g.BUTTON)&&(e.openElements.generateImpliedEndTags(),e.openElements.popUntilTagNamePopped(g.BUTTON)),e._reconstructActiveFormattingElements(),e._insertElement(t,T.HTML),e.framesetOk=!1}(e,t):n===g.STRIKE||n===g.STRONG?Ee(e,t):n===g.APPLET||n===g.OBJECT?be(e,t):n===g.KEYGEN?Ae(e,t):n===g.SOURCE?ke(e,t):n===g.IFRAME?function(e,t){e.framesetOk=!1,e._switchToTextParsing(t,o.MODE.RAWTEXT)}(e,t):n===g.SELECT?function(e,t){e._reconstructActiveFormattingElements(),e._insertElement(t,T.HTML),e.framesetOk=!1,e.insertionMode===N||e.insertionMode===w||e.insertionMode===I||e.insertionMode===L||e.insertionMode===P?e.insertionMode=D:e.insertionMode=H}(e,t):n===g.OPTION?_e(e,t):Ce(e,t);break;case 7:n===g.BGSOUND?ce(e,t):n===g.DETAILS||n===g.ADDRESS||n===g.ARTICLE||n===g.SECTION||n===g.SUMMARY?ge(e,t):n===g.LISTING?Te(e,t):n===g.MARQUEE?be(e,t):n===g.NOEMBED?ye(e,t):n!==g.CAPTION&&Ce(e,t);break;case 8:n===g.BASEFONT?ce(e,t):n===g.FRAMESET?function(e,t){const n=e.openElements.tryPeekProperlyNestedBodyElement();e.framesetOk&&n&&(e.treeAdapter.detachNode(n),e.openElements.popAllUpToHtmlElement(),e._insertElement(t,T.HTML),e.insertionMode=z)}(e,t):n===g.FIELDSET?ge(e,t):n===g.TEXTAREA?function(e,t){e._insertElement(t,T.HTML),e.skipNextNewLine=!0,e.tokenizer.state=o.MODE.RCDATA,e.originalInsertionMode=e.insertionMode,e.framesetOk=!1,e.insertionMode=O}(e,t):n===g.TEMPLATE?ce(e,t):n===g.NOSCRIPT?e.options.scriptingEnabled?ye(e,t):Ce(e,t):n===g.OPTGROUP?_e(e,t):n!==g.COLGROUP&&Ce(e,t);break;case 9:n===g.PLAINTEXT?function(e,t){e.openElements.hasInButtonScope(g.P)&&e._closePElement(),e._insertElement(t,T.HTML),e.tokenizer.state=o.MODE.PLAINTEXT}(e,t):Ce(e,t);break;case 10:n===g.BLOCKQUOTE||n===g.FIGCAPTION?ge(e,t):Ce(e,t);break;default:Ce(e,t)}}function ve(e,t){const n=t.tagName;e.openElements.hasInScope(n)&&(e.openElements.generateImpliedEndTags(),e.openElements.popUntilTagNamePopped(n))}function Oe(e,t){const n=t.tagName;e.openElements.hasInScope(n)&&(e.openElements.generateImpliedEndTags(),e.openElements.popUntilTagNamePopped(n),e.activeFormattingElements.clearToLastMarker())}function Ne(e,t){const n=t.tagName;for(let o=e.openElements.stackTop;o>0;o--){const t=e.openElements.items[o];if(e.treeAdapter.getTagName(t)===n){e.openElements.generateImpliedEndTagsWithExclusion(n),e.openElements.popUntilElementPopped(t);break}if(e._isSpecialElement(t))break}}function Me(e,t){const n=t.tagName;switch(n.length){case 1:n===g.A||n===g.B||n===g.I||n===g.S||n===g.U?$(e,t):n===g.P?function(e){e.openElements.hasInButtonScope(g.P)||e._insertFakeElement(g.P),e._closePElement()}(e):Ne(e,t);break;case 2:n===g.DL||n===g.UL||n===g.OL?ve(e,t):n===g.LI?function(e){e.openElements.hasInListItemScope(g.LI)&&(e.openElements.generateImpliedEndTagsWithExclusion(g.LI),e.openElements.popUntilTagNamePopped(g.LI))}(e):n===g.DD||n===g.DT?function(e,t){const n=t.tagName;e.openElements.hasInScope(n)&&(e.openElements.generateImpliedEndTagsWithExclusion(n),e.openElements.popUntilTagNamePopped(n))}(e,t):n===g.H1||n===g.H2||n===g.H3||n===g.H4||n===g.H5||n===g.H6?function(e){e.openElements.hasNumberedHeaderInScope()&&(e.openElements.generateImpliedEndTags(),e.openElements.popUntilNumberedHeaderPopped())}(e):n===g.BR?function(e){e._reconstructActiveFormattingElements(),e._insertFakeElement(g.BR),e.openElements.pop(),e.framesetOk=!1}(e):n===g.EM||n===g.TT?$(e,t):Ne(e,t);break;case 3:n===g.BIG?$(e,t):n===g.DIR||n===g.DIV||n===g.NAV||n===g.PRE?ve(e,t):Ne(e,t);break;case 4:n===g.BODY?function(e){e.openElements.hasInScope(g.BODY)&&(e.insertionMode=B)}(e):n===g.HTML?function(e,t){e.openElements.hasInScope(g.BODY)&&(e.insertionMode=B,e._processToken(t))}(e,t):n===g.FORM?function(e){const t=e.openElements.tmplCount>0,n=e.formElement;t||(e.formElement=null),(n||t)&&e.openElements.hasInScope(g.FORM)&&(e.openElements.generateImpliedEndTags(),t?e.openElements.popUntilTagNamePopped(g.FORM):e.openElements.remove(n))}(e):n===g.CODE||n===g.FONT||n===g.NOBR?$(e,t):n===g.MAIN||n===g.MENU?ve(e,t):Ne(e,t);break;case 5:n===g.ASIDE?ve(e,t):n===g.SMALL?$(e,t):Ne(e,t);break;case 6:n===g.CENTER||n===g.FIGURE||n===g.FOOTER||n===g.HEADER||n===g.HGROUP||n===g.DIALOG?ve(e,t):n===g.APPLET||n===g.OBJECT?Oe(e,t):n===g.STRIKE||n===g.STRONG?$(e,t):Ne(e,t);break;case 7:n===g.ADDRESS||n===g.ARTICLE||n===g.DETAILS||n===g.SECTION||n===g.SUMMARY||n===g.LISTING?ve(e,t):n===g.MARQUEE?Oe(e,t):Ne(e,t);break;case 8:n===g.FIELDSET?ve(e,t):n===g.TEMPLATE?ue(e,t):Ne(e,t);break;case 10:n===g.BLOCKQUOTE||n===g.FIGCAPTION?ve(e,t):Ne(e,t);break;default:Ne(e,t)}}function we(e,t){e.tmplInsertionModeStackTop>-1?ze(e,t):e.stopped=!0}function Re(e,t){const n=e.openElements.currentTagName;n===g.TABLE||n===g.TBODY||n===g.TFOOT||n===g.THEAD||n===g.TR?(e.pendingCharacterTokens=[],e.hasNonWhitespacePendingCharacterToken=!1,e.originalInsertionMode=e.insertionMode,e.insertionMode=M,e._processToken(t)):Pe(e,t)}function Ie(e,t){const n=t.tagName;switch(n.length){case 2:n===g.TD||n===g.TH||n===g.TR?function(e,t){e.openElements.clearBackToTableContext(),e._insertFakeElement(g.TBODY),e.insertionMode=I,e._processToken(t)}(e,t):Pe(e,t);break;case 3:n===g.COL?function(e,t){e.openElements.clearBackToTableContext(),e._insertFakeElement(g.COLGROUP),e.insertionMode=R,e._processToken(t)}(e,t):Pe(e,t);break;case 4:n===g.FORM?function(e,t){e.formElement||0!==e.openElements.tmplCount||(e._insertElement(t,T.HTML),e.formElement=e.openElements.current,e.openElements.pop())}(e,t):Pe(e,t);break;case 5:n===g.TABLE?function(e,t){e.openElements.hasInTableScope(g.TABLE)&&(e.openElements.popUntilTagNamePopped(g.TABLE),e._resetInsertionMode(),e._processToken(t))}(e,t):n===g.STYLE?ce(e,t):n===g.TBODY||n===g.TFOOT||n===g.THEAD?function(e,t){e.openElements.clearBackToTableContext(),e._insertElement(t,T.HTML),e.insertionMode=I}(e,t):n===g.INPUT?function(e,t){const n=o.getTokenAttr(t,E.TYPE);n&&n.toLowerCase()===A?e._appendElement(t,T.HTML):Pe(e,t),t.ackSelfClosing=!0}(e,t):Pe(e,t);break;case 6:n===g.SCRIPT?ce(e,t):Pe(e,t);break;case 7:n===g.CAPTION?function(e,t){e.openElements.clearBackToTableContext(),e.activeFormattingElements.insertMarker(),e._insertElement(t,T.HTML),e.insertionMode=w}(e,t):Pe(e,t);break;case 8:n===g.COLGROUP?function(e,t){e.openElements.clearBackToTableContext(),e._insertElement(t,T.HTML),e.insertionMode=R}(e,t):n===g.TEMPLATE?ce(e,t):Pe(e,t);break;default:Pe(e,t)}}function Le(e,t){const n=t.tagName;n===g.TABLE?e.openElements.hasInTableScope(g.TABLE)&&(e.openElements.popUntilTagNamePopped(g.TABLE),e._resetInsertionMode()):n===g.TEMPLATE?ue(e,t):n!==g.BODY&&n!==g.CAPTION&&n!==g.COL&&n!==g.COLGROUP&&n!==g.HTML&&n!==g.TBODY&&n!==g.TD&&n!==g.TFOOT&&n!==g.TH&&n!==g.THEAD&&n!==g.TR&&Pe(e,t)}function Pe(e,t){const n=e.fosterParentingEnabled;e.fosterParentingEnabled=!0,e._processTokenInBodyMode(t),e.fosterParentingEnabled=n}function He(e,t){let n=0;if(e.hasNonWhitespacePendingCharacterToken)for(;n0?(e.openElements.popUntilTagNamePopped(g.TEMPLATE),e.activeFormattingElements.clearToLastMarker(),e._popTmplInsertionMode(),e._resetInsertionMode(),e._processToken(t)):e.stopped=!0}function Ue(e,t){e.insertionMode=v,e._processToken(t)}function Ge(e,t){e.insertionMode=v,e._processToken(t)}e.exports=class{constructor(e){this.options=u(b,e),this.treeAdapter=this.options.treeAdapter,this.pendingScript=null,this.options.sourceCodeLocationInfo&&l.install(this,a),this.options.onParseError&&l.install(this,s,{onParseError:this.options.onParseError})}parse(e){const t=this.treeAdapter.createDocument();return this._bootstrap(t,null),this.tokenizer.write(e,!0),this._runParsingLoop(null),t}parseFragment(e,t){t||(t=this.treeAdapter.createElement(g.TEMPLATE,T.HTML,[]));const n=this.treeAdapter.createElement("documentmock",T.HTML,[]);this._bootstrap(n,t),this.treeAdapter.getTagName(t)===g.TEMPLATE&&this._pushTmplInsertionMode(F),this._initTokenizerForFragmentParsing(),this._insertFakeRootElement(),this._resetInsertionMode(),this._findFormInFragmentContext(),this.tokenizer.write(e,!0),this._runParsingLoop(null);const o=this.treeAdapter.getFirstChild(n),r=this.treeAdapter.createDocumentFragment();return this._adoptNodes(o,r),r}_bootstrap(e,t){this.tokenizer=new o(this.options),this.stopped=!1,this.insertionMode=k,this.originalInsertionMode="",this.document=e,this.fragmentContext=t,this.headElement=null,this.formElement=null,this.openElements=new r(this.document,this.treeAdapter),this.activeFormattingElements=new i(this.treeAdapter),this.tmplInsertionModeStack=[],this.tmplInsertionModeStackTop=-1,this.currentTmplInsertionMode=null,this.pendingCharacterTokens=[],this.hasNonWhitespacePendingCharacterToken=!1,this.framesetOk=!0,this.skipNextNewLine=!1,this.fosterParentingEnabled=!1}_err(){}_runParsingLoop(e){for(;!this.stopped;){this._setupTokenizerCDATAMode();const t=this.tokenizer.getNextToken();if(t.type===o.HIBERNATION_TOKEN)break;if(this.skipNextNewLine&&(this.skipNextNewLine=!1,t.type===o.WHITESPACE_CHARACTER_TOKEN&&"\n"===t.chars[0])){if(1===t.chars.length)continue;t.chars=t.chars.substr(1)}if(this._processInputToken(t),e&&this.pendingScript)break}}runParsingLoopForCurrentChunk(e,t){if(this._runParsingLoop(t),t&&this.pendingScript){const e=this.pendingScript;return this.pendingScript=null,void t(e)}e&&e()}_setupTokenizerCDATAMode(){const e=this._getAdjustedCurrentElement();this.tokenizer.allowCDATA=e&&e!==this.document&&this.treeAdapter.getNamespaceURI(e)!==T.HTML&&!this._isIntegrationPoint(e)}_switchToTextParsing(e,t){this._insertElement(e,T.HTML),this.tokenizer.state=t,this.originalInsertionMode=this.insertionMode,this.insertionMode=O}switchToPlaintextParsing(){this.insertionMode=O,this.originalInsertionMode=v,this.tokenizer.state=o.MODE.PLAINTEXT}_getAdjustedCurrentElement(){return 0===this.openElements.stackTop&&this.fragmentContext?this.fragmentContext:this.openElements.current}_findFormInFragmentContext(){let e=this.fragmentContext;do{if(this.treeAdapter.getTagName(e)===g.FORM){this.formElement=e;break}e=this.treeAdapter.getParentNode(e)}while(e)}_initTokenizerForFragmentParsing(){if(this.treeAdapter.getNamespaceURI(this.fragmentContext)===T.HTML){const e=this.treeAdapter.getTagName(this.fragmentContext);e===g.TITLE||e===g.TEXTAREA?this.tokenizer.state=o.MODE.RCDATA:e===g.STYLE||e===g.XMP||e===g.IFRAME||e===g.NOEMBED||e===g.NOFRAMES||e===g.NOSCRIPT?this.tokenizer.state=o.MODE.RAWTEXT:e===g.SCRIPT?this.tokenizer.state=o.MODE.SCRIPT_DATA:e===g.PLAINTEXT&&(this.tokenizer.state=o.MODE.PLAINTEXT)}}_setDocumentType(e){const t=e.name||"",n=e.publicId||"",o=e.systemId||"";this.treeAdapter.setDocumentType(this.document,t,n,o)}_attachElementToTree(e){if(this._shouldFosterParentOnInsertion())this._fosterParentElement(e);else{const t=this.openElements.currentTmplContent||this.openElements.current;this.treeAdapter.appendChild(t,e)}}_appendElement(e,t){const n=this.treeAdapter.createElement(e.tagName,t,e.attrs);this._attachElementToTree(n)}_insertElement(e,t){const n=this.treeAdapter.createElement(e.tagName,t,e.attrs);this._attachElementToTree(n),this.openElements.push(n)}_insertFakeElement(e){const t=this.treeAdapter.createElement(e,T.HTML,[]);this._attachElementToTree(t),this.openElements.push(t)}_insertTemplate(e){const t=this.treeAdapter.createElement(e.tagName,T.HTML,e.attrs),n=this.treeAdapter.createDocumentFragment();this.treeAdapter.setTemplateContent(t,n),this._attachElementToTree(t),this.openElements.push(t)}_insertFakeRootElement(){const e=this.treeAdapter.createElement(g.HTML,T.HTML,[]);this.treeAdapter.appendChild(this.openElements.current,e),this.openElements.push(e)}_appendCommentNode(e,t){const n=this.treeAdapter.createCommentNode(e.data);this.treeAdapter.appendChild(t,n)}_insertCharacters(e){if(this._shouldFosterParentOnInsertion())this._fosterParentText(e.chars);else{const t=this.openElements.currentTmplContent||this.openElements.current;this.treeAdapter.insertText(t,e.chars)}}_adoptNodes(e,t){for(let n=this.treeAdapter.getFirstChild(e);n;n=this.treeAdapter.getFirstChild(e))this.treeAdapter.detachNode(n),this.treeAdapter.appendChild(t,n)}_shouldProcessTokenInForeignContent(e){const t=this._getAdjustedCurrentElement();if(!t||t===this.document)return!1;const n=this.treeAdapter.getNamespaceURI(t);if(n===T.HTML)return!1;if(this.treeAdapter.getTagName(t)===g.ANNOTATION_XML&&n===T.MATHML&&e.type===o.START_TAG_TOKEN&&e.tagName===g.SVG)return!1;const r=e.type===o.CHARACTER_TOKEN||e.type===o.NULL_CHARACTER_TOKEN||e.type===o.WHITESPACE_CHARACTER_TOKEN;return(!(e.type===o.START_TAG_TOKEN&&e.tagName!==g.MGLYPH&&e.tagName!==g.MALIGNMARK)&&!r||!this._isIntegrationPoint(t,T.MATHML))&&((e.type!==o.START_TAG_TOKEN&&!r||!this._isIntegrationPoint(t,T.HTML))&&e.type!==o.EOF_TOKEN)}_processToken(e){Y[this.insertionMode][e.type](this,e)}_processTokenInBodyMode(e){Y.IN_BODY_MODE[e.type](this,e)}_processTokenInForeignContent(e){e.type===o.CHARACTER_TOKEN?function(e,t){e._insertCharacters(t),e.framesetOk=!1}(this,e):e.type===o.NULL_CHARACTER_TOKEN?function(e,t){t.chars=h.REPLACEMENT_CHARACTER,e._insertCharacters(t)}(this,e):e.type===o.WHITESPACE_CHARACTER_TOKEN?re(this,e):e.type===o.COMMENT_TOKEN?ne(this,e):e.type===o.START_TAG_TOKEN?function(e,t){if(p.causesExit(t)&&!e.fragmentContext){for(;e.treeAdapter.getNamespaceURI(e.openElements.current)!==T.HTML&&!e._isIntegrationPoint(e.openElements.current);)e.openElements.pop();e._processToken(t)}else{const n=e._getAdjustedCurrentElement(),o=e.treeAdapter.getNamespaceURI(n);o===T.MATHML?p.adjustTokenMathMLAttrs(t):o===T.SVG&&(p.adjustTokenSVGTagName(t),p.adjustTokenSVGAttrs(t)),p.adjustTokenXMLAttrs(t),t.selfClosing?e._appendElement(t,o):e._insertElement(t,o),t.ackSelfClosing=!0}}(this,e):e.type===o.END_TAG_TOKEN&&function(e,t){for(let n=e.openElements.stackTop;n>0;n--){const o=e.openElements.items[n];if(e.treeAdapter.getNamespaceURI(o)===T.HTML){e._processToken(t);break}if(e.treeAdapter.getTagName(o).toLowerCase()===t.tagName){e.openElements.popUntilElementPopped(o);break}}}(this,e)}_processInputToken(e){this._shouldProcessTokenInForeignContent(e)?this._processTokenInForeignContent(e):this._processToken(e),e.type===o.START_TAG_TOKEN&&e.selfClosing&&!e.ackSelfClosing&&this._err(f.nonVoidHtmlElementStartTagWithTrailingSolidus)}_isIntegrationPoint(e,t){const n=this.treeAdapter.getTagName(e),o=this.treeAdapter.getNamespaceURI(e),r=this.treeAdapter.getAttrList(e);return p.isIntegrationPoint(n,o,r,t)}_reconstructActiveFormattingElements(){const e=this.activeFormattingElements.length;if(e){let t=e,n=null;do{if(t--,n=this.activeFormattingElements.entries[t],n.type===i.MARKER_ENTRY||this.openElements.contains(n.element)){t++;break}}while(t>0);for(let o=t;o=0;e--){let n=this.openElements.items[e];0===e&&(t=!0,this.fragmentContext&&(n=this.fragmentContext));const o=this.treeAdapter.getTagName(n),r=K[o];if(r){this.insertionMode=r;break}if(!(t||o!==g.TD&&o!==g.TH)){this.insertionMode=P;break}if(!t&&o===g.HEAD){this.insertionMode=S;break}if(o===g.SELECT){this._resetInsertionModeForSelect(e);break}if(o===g.TEMPLATE){this.insertionMode=this.currentTmplInsertionMode;break}if(o===g.HTML){this.insertionMode=this.headElement?x:_;break}if(t){this.insertionMode=v;break}}}_resetInsertionModeForSelect(e){if(e>0)for(let t=e-1;t>0;t--){const e=this.openElements.items[t],n=this.treeAdapter.getTagName(e);if(n===g.TEMPLATE)break;if(n===g.TABLE)return void(this.insertionMode=D)}this.insertionMode=H}_pushTmplInsertionMode(e){this.tmplInsertionModeStack.push(e),this.tmplInsertionModeStackTop++,this.currentTmplInsertionMode=e}_popTmplInsertionMode(){this.tmplInsertionModeStack.pop(),this.tmplInsertionModeStackTop--,this.currentTmplInsertionMode=this.tmplInsertionModeStack[this.tmplInsertionModeStackTop]}_isElementCausesFosterParenting(e){const t=this.treeAdapter.getTagName(e);return t===g.TABLE||t===g.TBODY||t===g.TFOOT||t===g.THEAD||t===g.TR}_shouldFosterParentOnInsertion(){return this.fosterParentingEnabled&&this._isElementCausesFosterParenting(this.openElements.current)}_findFosterParentingLocation(){const e={parent:null,beforeElement:null};for(let t=this.openElements.stackTop;t>=0;t--){const n=this.openElements.items[t],o=this.treeAdapter.getTagName(n),r=this.treeAdapter.getNamespaceURI(n);if(o===g.TEMPLATE&&r===T.HTML){e.parent=this.treeAdapter.getTemplateContent(n);break}if(o===g.TABLE){e.parent=this.treeAdapter.getParentNode(n),e.parent?e.beforeElement=n:e.parent=this.openElements.items[t-1];break}}return e.parent||(e.parent=this.openElements.items[0]),e}_fosterParentElement(e){const t=this._findFosterParentingLocation();t.beforeElement?this.treeAdapter.insertBefore(t.parent,e,t.beforeElement):this.treeAdapter.appendChild(t.parent,e)}_fosterParentText(e){const t=this._findFosterParentingLocation();t.beforeElement?this.treeAdapter.insertTextBefore(t.parent,e,t.beforeElement):this.treeAdapter.insertText(t.parent,e)}_isSpecialElement(e){const t=this.treeAdapter.getTagName(e),n=this.treeAdapter.getNamespaceURI(e);return m.SPECIAL_ELEMENTS[n][t]}}},zktx:function(e,t,n){"use strict";var o=n("FWC9"),r=n("DUvi"),i=n("vGni"),a=o.boolean,s=o.number,l=o.spaceSeparated,c=o.commaSeparated,u=o.commaOrSpaceSeparated;e.exports=r({space:"svg",attributes:{accentHeight:"accent-height",alignmentBaseline:"alignment-baseline",arabicForm:"arabic-form",baselineShift:"baseline-shift",capHeight:"cap-height",className:"class",clipPath:"clip-path",clipRule:"clip-rule",colorInterpolation:"color-interpolation",colorInterpolationFilters:"color-interpolation-filters",colorProfile:"color-profile",colorRendering:"color-rendering",crossOrigin:"crossorigin",dataType:"datatype",dominantBaseline:"dominant-baseline",enableBackground:"enable-background",fillOpacity:"fill-opacity",fillRule:"fill-rule",floodColor:"flood-color",floodOpacity:"flood-opacity",fontFamily:"font-family",fontSize:"font-size",fontSizeAdjust:"font-size-adjust",fontStretch:"font-stretch",fontStyle:"font-style",fontVariant:"font-variant",fontWeight:"font-weight",glyphName:"glyph-name",glyphOrientationHorizontal:"glyph-orientation-horizontal",glyphOrientationVertical:"glyph-orientation-vertical",hrefLang:"hreflang",horizAdvX:"horiz-adv-x",horizOriginX:"horiz-origin-x",horizOriginY:"horiz-origin-y",imageRendering:"image-rendering",letterSpacing:"letter-spacing",lightingColor:"lighting-color",markerEnd:"marker-end",markerMid:"marker-mid",markerStart:"marker-start",navDown:"nav-down",navDownLeft:"nav-down-left",navDownRight:"nav-down-right",navLeft:"nav-left",navNext:"nav-next",navPrev:"nav-prev",navRight:"nav-right",navUp:"nav-up",navUpLeft:"nav-up-left",navUpRight:"nav-up-right",onAbort:"onabort",onActivate:"onactivate",onAfterPrint:"onafterprint",onBeforePrint:"onbeforeprint",onBegin:"onbegin",onCancel:"oncancel",onCanPlay:"oncanplay",onCanPlayThrough:"oncanplaythrough",onChange:"onchange",onClick:"onclick",onClose:"onclose",onCopy:"oncopy",onCueChange:"oncuechange",onCut:"oncut",onDblClick:"ondblclick",onDrag:"ondrag",onDragEnd:"ondragend",onDragEnter:"ondragenter",onDragExit:"ondragexit",onDragLeave:"ondragleave",onDragOver:"ondragover",onDragStart:"ondragstart",onDrop:"ondrop",onDurationChange:"ondurationchange",onEmptied:"onemptied",onEnd:"onend",onEnded:"onended",onError:"onerror",onFocus:"onfocus",onFocusIn:"onfocusin",onFocusOut:"onfocusout",onHashChange:"onhashchange",onInput:"oninput",onInvalid:"oninvalid",onKeyDown:"onkeydown",onKeyPress:"onkeypress",onKeyUp:"onkeyup",onLoad:"onload",onLoadedData:"onloadeddata",onLoadedMetadata:"onloadedmetadata",onLoadStart:"onloadstart",onMessage:"onmessage",onMouseDown:"onmousedown",onMouseEnter:"onmouseenter",onMouseLeave:"onmouseleave",onMouseMove:"onmousemove",onMouseOut:"onmouseout",onMouseOver:"onmouseover",onMouseUp:"onmouseup",onMouseWheel:"onmousewheel",onOffline:"onoffline",onOnline:"ononline",onPageHide:"onpagehide",onPageShow:"onpageshow",onPaste:"onpaste",onPause:"onpause",onPlay:"onplay",onPlaying:"onplaying",onPopState:"onpopstate",onProgress:"onprogress",onRateChange:"onratechange",onRepeat:"onrepeat",onReset:"onreset",onResize:"onresize",onScroll:"onscroll",onSeeked:"onseeked",onSeeking:"onseeking",onSelect:"onselect",onShow:"onshow",onStalled:"onstalled",onStorage:"onstorage",onSubmit:"onsubmit",onSuspend:"onsuspend",onTimeUpdate:"ontimeupdate",onToggle:"ontoggle",onUnload:"onunload",onVolumeChange:"onvolumechange",onWaiting:"onwaiting",onZoom:"onzoom",overlinePosition:"overline-position",overlineThickness:"overline-thickness",paintOrder:"paint-order",panose1:"panose-1",pointerEvents:"pointer-events",referrerPolicy:"referrerpolicy",renderingIntent:"rendering-intent",shapeRendering:"shape-rendering",stopColor:"stop-color",stopOpacity:"stop-opacity",strikethroughPosition:"strikethrough-position",strikethroughThickness:"strikethrough-thickness",strokeDashArray:"stroke-dasharray",strokeDashOffset:"stroke-dashoffset",strokeLineCap:"stroke-linecap",strokeLineJoin:"stroke-linejoin",strokeMiterLimit:"stroke-miterlimit",strokeOpacity:"stroke-opacity",strokeWidth:"stroke-width",tabIndex:"tabindex",textAnchor:"text-anchor",textDecoration:"text-decoration",textRendering:"text-rendering",typeOf:"typeof",underlinePosition:"underline-position",underlineThickness:"underline-thickness",unicodeBidi:"unicode-bidi",unicodeRange:"unicode-range",unitsPerEm:"units-per-em",vAlphabetic:"v-alphabetic",vHanging:"v-hanging",vIdeographic:"v-ideographic",vMathematical:"v-mathematical",vectorEffect:"vector-effect",vertAdvY:"vert-adv-y",vertOriginX:"vert-origin-x",vertOriginY:"vert-origin-y",wordSpacing:"word-spacing",writingMode:"writing-mode",xHeight:"x-height",playbackOrder:"playbackorder",timelineBegin:"timelinebegin"},transform:i,properties:{about:u,accentHeight:s,accumulate:null,additive:null,alignmentBaseline:null,alphabetic:s,amplitude:s,arabicForm:null,ascent:s,attributeName:null,attributeType:null,azimuth:s,bandwidth:null,baselineShift:null,baseFrequency:null,baseProfile:null,bbox:null,begin:null,bias:s,by:null,calcMode:null,capHeight:s,className:l,clip:null,clipPath:null,clipPathUnits:null,clipRule:null,color:null,colorInterpolation:null,colorInterpolationFilters:null,colorProfile:null,colorRendering:null,content:null,contentScriptType:null,contentStyleType:null,crossOrigin:null,cursor:null,cx:null,cy:null,d:null,dataType:null,defaultAction:null,descent:s,diffuseConstant:s,direction:null,display:null,dur:null,divisor:s,dominantBaseline:null,download:a,dx:null,dy:null,edgeMode:null,editable:null,elevation:s,enableBackground:null,end:null,event:null,exponent:s,externalResourcesRequired:null,fill:null,fillOpacity:s,fillRule:null,filter:null,filterRes:null,filterUnits:null,floodColor:null,floodOpacity:null,focusable:null,focusHighlight:null,fontFamily:null,fontSize:null,fontSizeAdjust:null,fontStretch:null,fontStyle:null,fontVariant:null,fontWeight:null,format:null,fr:null,from:null,fx:null,fy:null,g1:c,g2:c,glyphName:c,glyphOrientationHorizontal:null,glyphOrientationVertical:null,glyphRef:null,gradientTransform:null,gradientUnits:null,handler:null,hanging:s,hatchContentUnits:null,hatchUnits:null,height:null,href:null,hrefLang:null,horizAdvX:s,horizOriginX:s,horizOriginY:s,id:null,ideographic:s,imageRendering:null,initialVisibility:null,in:null,in2:null,intercept:s,k:s,k1:s,k2:s,k3:s,k4:s,kernelMatrix:u,kernelUnitLength:null,keyPoints:null,keySplines:null,keyTimes:null,kerning:null,lang:null,lengthAdjust:null,letterSpacing:null,lightingColor:null,limitingConeAngle:s,local:null,markerEnd:null,markerMid:null,markerStart:null,markerHeight:null,markerUnits:null,markerWidth:null,mask:null,maskContentUnits:null,maskUnits:null,mathematical:null,max:null,media:null,mediaCharacterEncoding:null,mediaContentEncodings:null,mediaSize:s,mediaTime:null,method:null,min:null,mode:null,name:null,navDown:null,navDownLeft:null,navDownRight:null,navLeft:null,navNext:null,navPrev:null,navRight:null,navUp:null,navUpLeft:null,navUpRight:null,numOctaves:null,observer:null,offset:null,onAbort:null,onActivate:null,onAfterPrint:null,onBeforePrint:null,onBegin:null,onCancel:null,onCanPlay:null,onCanPlayThrough:null,onChange:null,onClick:null,onClose:null,onCopy:null,onCueChange:null,onCut:null,onDblClick:null,onDrag:null,onDragEnd:null,onDragEnter:null,onDragExit:null,onDragLeave:null,onDragOver:null,onDragStart:null,onDrop:null,onDurationChange:null,onEmptied:null,onEnd:null,onEnded:null,onError:null,onFocus:null,onFocusIn:null,onFocusOut:null,onHashChange:null,onInput:null,onInvalid:null,onKeyDown:null,onKeyPress:null,onKeyUp:null,onLoad:null,onLoadedData:null,onLoadedMetadata:null,onLoadStart:null,onMessage:null,onMouseDown:null,onMouseEnter:null,onMouseLeave:null,onMouseMove:null,onMouseOut:null,onMouseOver:null,onMouseUp:null,onMouseWheel:null,onOffline:null,onOnline:null,onPageHide:null,onPageShow:null,onPaste:null,onPause:null,onPlay:null,onPlaying:null,onPopState:null,onProgress:null,onRateChange:null,onRepeat:null,onReset:null,onResize:null,onScroll:null,onSeeked:null,onSeeking:null,onSelect:null,onShow:null,onStalled:null,onStorage:null,onSubmit:null,onSuspend:null,onTimeUpdate:null,onToggle:null,onUnload:null,onVolumeChange:null,onWaiting:null,onZoom:null,opacity:null,operator:null,order:null,orient:null,orientation:null,origin:null,overflow:null,overlay:null,overlinePosition:s,overlineThickness:s,paintOrder:null,panose1:null,path:null,pathLength:s,patternContentUnits:null,patternTransform:null,patternUnits:null,phase:null,ping:l,pitch:null,playbackOrder:null,pointerEvents:null,points:null,pointsAtX:s,pointsAtY:s,pointsAtZ:s,preserveAlpha:null,preserveAspectRatio:null,primitiveUnits:null,propagate:null,property:u,r:null,radius:null,referrerPolicy:null,refX:null,refY:null,rel:u,rev:u,renderingIntent:null,repeatCount:null,repeatDur:null,requiredExtensions:u,requiredFeatures:u,requiredFonts:u,requiredFormats:u,resource:null,restart:null,result:null,rotate:null,rx:null,ry:null,scale:null,seed:null,shapeRendering:null,side:null,slope:null,snapshotTime:null,specularConstant:s,specularExponent:s,spreadMethod:null,spacing:null,startOffset:null,stdDeviation:null,stemh:null,stemv:null,stitchTiles:null,stopColor:null,stopOpacity:null,strikethroughPosition:s,strikethroughThickness:s,string:null,stroke:null,strokeDashArray:u,strokeDashOffset:null,strokeLineCap:null,strokeLineJoin:null,strokeMiterLimit:s,strokeOpacity:s,strokeWidth:null,style:null,surfaceScale:s,syncBehavior:null,syncBehaviorDefault:null,syncMaster:null,syncTolerance:null,syncToleranceDefault:null,systemLanguage:u,tabIndex:s,tableValues:null,target:null,targetX:s,targetY:s,textAnchor:null,textDecoration:null,textRendering:null,textLength:null,timelineBegin:null,title:null,transformBehavior:null,type:null,typeOf:u,to:null,transform:null,u1:null,u2:null,underlinePosition:s,underlineThickness:s,unicode:null,unicodeBidi:null,unicodeRange:null,unitsPerEm:s,values:null,vAlphabetic:s,vMathematical:s,vectorEffect:null,vHanging:s,vIdeographic:s,version:null,vertAdvY:s,vertOriginX:s,vertOriginY:s,viewBox:null,viewTarget:null,visibility:null,width:null,widths:null,wordSpacing:null,writingMode:null,x:null,x1:null,x2:null,xChannelSelector:null,xHeight:s,y:null,y1:null,y2:null,yChannelSelector:null,z:null,zoomAndPan:null}})},zpDW:function(e,t,n){"use strict";const o=n("YpxX"),r=n("pRQB"),i=n("cRLj"),a=n("2l2D"),s=r.CODE_POINTS,l=r.CODE_POINT_SEQUENCES,c={128:8364,130:8218,131:402,132:8222,133:8230,134:8224,135:8225,136:710,137:8240,138:352,139:8249,140:338,142:381,145:8216,146:8217,147:8220,148:8221,149:8226,150:8211,151:8212,152:732,153:8482,154:353,155:8250,156:339,158:382,159:376},u="DATA_STATE",d="RCDATA_STATE",p="RAWTEXT_STATE",f="SCRIPT_DATA_STATE",h="PLAINTEXT_STATE",m="TAG_OPEN_STATE",g="END_TAG_OPEN_STATE",T="TAG_NAME_STATE",E="RCDATA_LESS_THAN_SIGN_STATE",b="RCDATA_END_TAG_OPEN_STATE",A="RCDATA_END_TAG_NAME_STATE",k="RAWTEXT_LESS_THAN_SIGN_STATE",y="RAWTEXT_END_TAG_OPEN_STATE",_="RAWTEXT_END_TAG_NAME_STATE",S="SCRIPT_DATA_LESS_THAN_SIGN_STATE",C="SCRIPT_DATA_END_TAG_OPEN_STATE",x="SCRIPT_DATA_END_TAG_NAME_STATE",v="SCRIPT_DATA_ESCAPE_START_STATE",O="SCRIPT_DATA_ESCAPE_START_DASH_STATE",N="SCRIPT_DATA_ESCAPED_STATE",M="SCRIPT_DATA_ESCAPED_DASH_STATE",w="SCRIPT_DATA_ESCAPED_DASH_DASH_STATE",R="SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE",I="SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE",L="SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE",P="SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE",H="SCRIPT_DATA_DOUBLE_ESCAPED_STATE",D="SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE",F="SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE",B="SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE",z="SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE",U="BEFORE_ATTRIBUTE_NAME_STATE",G="ATTRIBUTE_NAME_STATE",W="AFTER_ATTRIBUTE_NAME_STATE",K="BEFORE_ATTRIBUTE_VALUE_STATE",j="ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE",Y="ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE",Q="ATTRIBUTE_VALUE_UNQUOTED_STATE",V="AFTER_ATTRIBUTE_VALUE_QUOTED_STATE",q="SELF_CLOSING_START_TAG_STATE",X="BOGUS_COMMENT_STATE",J="MARKUP_DECLARATION_OPEN_STATE",Z="COMMENT_START_STATE",$="COMMENT_START_DASH_STATE",ee="COMMENT_STATE",te="COMMENT_LESS_THAN_SIGN_STATE",ne="COMMENT_LESS_THAN_SIGN_BANG_STATE",oe="COMMENT_LESS_THAN_SIGN_BANG_DASH_STATE",re="COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH_STATE",ie="COMMENT_END_DASH_STATE",ae="COMMENT_END_STATE",se="COMMENT_END_BANG_STATE",le="DOCTYPE_STATE",ce="BEFORE_DOCTYPE_NAME_STATE",ue="DOCTYPE_NAME_STATE",de="AFTER_DOCTYPE_NAME_STATE",pe="AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE",fe="BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE",he="DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE",me="DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE",ge="AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE",Te="BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE",Ee="AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE",be="BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE",Ae="DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE",ke="DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE",ye="AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE",_e="BOGUS_DOCTYPE_STATE",Se="CDATA_SECTION_STATE",Ce="CDATA_SECTION_BRACKET_STATE",xe="CDATA_SECTION_END_STATE",ve="CHARACTER_REFERENCE_STATE",Oe="NAMED_CHARACTER_REFERENCE_STATE",Ne="AMBIGUOS_AMPERSAND_STATE",Me="NUMERIC_CHARACTER_REFERENCE_STATE",we="HEXADEMICAL_CHARACTER_REFERENCE_START_STATE",Re="DECIMAL_CHARACTER_REFERENCE_START_STATE",Ie="HEXADEMICAL_CHARACTER_REFERENCE_STATE",Le="DECIMAL_CHARACTER_REFERENCE_STATE",Pe="NUMERIC_CHARACTER_REFERENCE_END_STATE";function He(e){return e===s.SPACE||e===s.LINE_FEED||e===s.TABULATION||e===s.FORM_FEED}function De(e){return e>=s.DIGIT_0&&e<=s.DIGIT_9}function Fe(e){return e>=s.LATIN_CAPITAL_A&&e<=s.LATIN_CAPITAL_Z}function Be(e){return e>=s.LATIN_SMALL_A&&e<=s.LATIN_SMALL_Z}function ze(e){return Be(e)||Fe(e)}function Ue(e){return ze(e)||De(e)}function Ge(e){return e>=s.LATIN_CAPITAL_A&&e<=s.LATIN_CAPITAL_F}function We(e){return e>=s.LATIN_SMALL_A&&e<=s.LATIN_SMALL_F}function Ke(e){return e+32}function je(e){return e<=65535?String.fromCharCode(e):(e-=65536,String.fromCharCode(e>>>10&1023|55296)+String.fromCharCode(56320|1023&e))}function Ye(e){return String.fromCharCode(Ke(e))}function Qe(e,t){const n=i[++e];let o=++e,r=o+n-1;for(;o<=r;){const e=o+r>>>1,a=i[e];if(at))return i[e+n];r=e-1}}return-1}class Ve{constructor(){this.preprocessor=new o,this.tokenQueue=[],this.allowCDATA=!1,this.state=u,this.returnState="",this.charRefCode=-1,this.tempBuff=[],this.lastStartTagName="",this.consumedAfterSnapshot=-1,this.active=!1,this.currentCharacterToken=null,this.currentToken=null,this.currentAttr=null}_err(){}_errOnNextCodePoint(e){this._consume(),this._err(e),this._unconsume()}getNextToken(){for(;!this.tokenQueue.length&&this.active;){this.consumedAfterSnapshot=0;const e=this._consume();this._ensureHibernation()||this[this.state](e)}return this.tokenQueue.shift()}write(e,t){this.active=!0,this.preprocessor.write(e,t)}insertHtmlAtCurrentPos(e){this.active=!0,this.preprocessor.insertHtmlAtCurrentPos(e)}_ensureHibernation(){if(this.preprocessor.endOfChunkHit){for(;this.consumedAfterSnapshot>0;this.consumedAfterSnapshot--)this.preprocessor.retreat();return this.active=!1,this.tokenQueue.push({type:Ve.HIBERNATION_TOKEN}),!0}return!1}_consume(){return this.consumedAfterSnapshot++,this.preprocessor.advance()}_unconsume(){this.consumedAfterSnapshot--,this.preprocessor.retreat()}_reconsumeInState(e){this.state=e,this._unconsume()}_consumeSequenceIfMatch(e,t,n){let o=0,r=!0;const i=e.length;let a,l=0,c=t;for(;l0&&(c=this._consume(),o++),c===s.EOF){r=!1;break}if(a=e[l],c!==a&&(n||c!==Ke(a))){r=!1;break}}if(!r)for(;o--;)this._unconsume();return r}_isTempBufferEqualToScriptString(){if(this.tempBuff.length!==l.SCRIPT_STRING.length)return!1;for(let e=0;e0&&this._err(a.endTagWithAttributes),e.selfClosing&&this._err(a.endTagWithTrailingSolidus)),this.tokenQueue.push(e)}_emitCurrentCharacterToken(){this.currentCharacterToken&&(this.tokenQueue.push(this.currentCharacterToken),this.currentCharacterToken=null)}_emitEOFToken(){this._createEOFToken(),this._emitCurrentToken()}_appendCharToCurrentCharacterToken(e,t){this.currentCharacterToken&&this.currentCharacterToken.type!==e&&this._emitCurrentCharacterToken(),this.currentCharacterToken?this.currentCharacterToken.chars+=t:this._createCharacterToken(e,t)}_emitCodePoint(e){let t=Ve.CHARACTER_TOKEN;He(e)?t=Ve.WHITESPACE_CHARACTER_TOKEN:e===s.NULL&&(t=Ve.NULL_CHARACTER_TOKEN),this._appendCharToCurrentCharacterToken(t,je(e))}_emitSeveralCodePoints(e){for(let t=0;t-1;){const e=i[o],r=e<7;r&&1&e&&(t=2&e?[i[++o],i[++o]]:[i[++o]],n=0);const a=this._consume();if(this.tempBuff.push(a),n++,a===s.EOF)break;o=r?4&e?Qe(o,a):-1:a===e?++o:-1}for(;n--;)this.tempBuff.pop(),this._unconsume();return t}_isCharacterReferenceInAttribute(){return this.returnState===j||this.returnState===Y||this.returnState===Q}_isCharacterReferenceAttributeQuirk(e){if(!e&&this._isCharacterReferenceInAttribute()){const e=this._consume();return this._unconsume(),e===s.EQUALS_SIGN||Ue(e)}return!1}_flushCodePointsConsumedAsCharacterReference(){if(this._isCharacterReferenceInAttribute())for(let e=0;e")):e===s.NULL?(this._err(a.unexpectedNullCharacter),this.state=N,this._emitChars(r.REPLACEMENT_CHARACTER)):e===s.EOF?(this._err(a.eofInScriptHtmlCommentLikeText),this._emitEOFToken()):(this.state=N,this._emitCodePoint(e))}[R](e){e===s.SOLIDUS?(this.tempBuff=[],this.state=I):ze(e)?(this.tempBuff=[],this._emitChars("<"),this._reconsumeInState(P)):(this._emitChars("<"),this._reconsumeInState(N))}[I](e){ze(e)?(this._createEndTagToken(),this._reconsumeInState(L)):(this._emitChars("")):e===s.NULL?(this._err(a.unexpectedNullCharacter),this.state=H,this._emitChars(r.REPLACEMENT_CHARACTER)):e===s.EOF?(this._err(a.eofInScriptHtmlCommentLikeText),this._emitEOFToken()):(this.state=H,this._emitCodePoint(e))}[B](e){e===s.SOLIDUS?(this.tempBuff=[],this.state=z,this._emitChars("/")):this._reconsumeInState(H)}[z](e){He(e)||e===s.SOLIDUS||e===s.GREATER_THAN_SIGN?(this.state=this._isTempBufferEqualToScriptString()?N:H,this._emitCodePoint(e)):Fe(e)?(this.tempBuff.push(Ke(e)),this._emitCodePoint(e)):Be(e)?(this.tempBuff.push(e),this._emitCodePoint(e)):this._reconsumeInState(H)}[U](e){He(e)||(e===s.SOLIDUS||e===s.GREATER_THAN_SIGN||e===s.EOF?this._reconsumeInState(W):e===s.EQUALS_SIGN?(this._err(a.unexpectedEqualsSignBeforeAttributeName),this._createAttr("="),this.state=G):(this._createAttr(""),this._reconsumeInState(G)))}[G](e){He(e)||e===s.SOLIDUS||e===s.GREATER_THAN_SIGN||e===s.EOF?(this._leaveAttrName(W),this._unconsume()):e===s.EQUALS_SIGN?this._leaveAttrName(K):Fe(e)?this.currentAttr.name+=Ye(e):e===s.QUOTATION_MARK||e===s.APOSTROPHE||e===s.LESS_THAN_SIGN?(this._err(a.unexpectedCharacterInAttributeName),this.currentAttr.name+=je(e)):e===s.NULL?(this._err(a.unexpectedNullCharacter),this.currentAttr.name+=r.REPLACEMENT_CHARACTER):this.currentAttr.name+=je(e)}[W](e){He(e)||(e===s.SOLIDUS?this.state=q:e===s.EQUALS_SIGN?this.state=K:e===s.GREATER_THAN_SIGN?(this.state=u,this._emitCurrentToken()):e===s.EOF?(this._err(a.eofInTag),this._emitEOFToken()):(this._createAttr(""),this._reconsumeInState(G)))}[K](e){He(e)||(e===s.QUOTATION_MARK?this.state=j:e===s.APOSTROPHE?this.state=Y:e===s.GREATER_THAN_SIGN?(this._err(a.missingAttributeValue),this.state=u,this._emitCurrentToken()):this._reconsumeInState(Q))}[j](e){e===s.QUOTATION_MARK?this.state=V:e===s.AMPERSAND?(this.returnState=j,this.state=ve):e===s.NULL?(this._err(a.unexpectedNullCharacter),this.currentAttr.value+=r.REPLACEMENT_CHARACTER):e===s.EOF?(this._err(a.eofInTag),this._emitEOFToken()):this.currentAttr.value+=je(e)}[Y](e){e===s.APOSTROPHE?this.state=V:e===s.AMPERSAND?(this.returnState=Y,this.state=ve):e===s.NULL?(this._err(a.unexpectedNullCharacter),this.currentAttr.value+=r.REPLACEMENT_CHARACTER):e===s.EOF?(this._err(a.eofInTag),this._emitEOFToken()):this.currentAttr.value+=je(e)}[Q](e){He(e)?this._leaveAttrValue(U):e===s.AMPERSAND?(this.returnState=Q,this.state=ve):e===s.GREATER_THAN_SIGN?(this._leaveAttrValue(u),this._emitCurrentToken()):e===s.NULL?(this._err(a.unexpectedNullCharacter),this.currentAttr.value+=r.REPLACEMENT_CHARACTER):e===s.QUOTATION_MARK||e===s.APOSTROPHE||e===s.LESS_THAN_SIGN||e===s.EQUALS_SIGN||e===s.GRAVE_ACCENT?(this._err(a.unexpectedCharacterInUnquotedAttributeValue),this.currentAttr.value+=je(e)):e===s.EOF?(this._err(a.eofInTag),this._emitEOFToken()):this.currentAttr.value+=je(e)}[V](e){He(e)?this._leaveAttrValue(U):e===s.SOLIDUS?this._leaveAttrValue(q):e===s.GREATER_THAN_SIGN?(this._leaveAttrValue(u),this._emitCurrentToken()):e===s.EOF?(this._err(a.eofInTag),this._emitEOFToken()):(this._err(a.missingWhitespaceBetweenAttributes),this._reconsumeInState(U))}[q](e){e===s.GREATER_THAN_SIGN?(this.currentToken.selfClosing=!0,this.state=u,this._emitCurrentToken()):e===s.EOF?(this._err(a.eofInTag),this._emitEOFToken()):(this._err(a.unexpectedSolidusInTag),this._reconsumeInState(U))}[X](e){e===s.GREATER_THAN_SIGN?(this.state=u,this._emitCurrentToken()):e===s.EOF?(this._emitCurrentToken(),this._emitEOFToken()):e===s.NULL?(this._err(a.unexpectedNullCharacter),this.currentToken.data+=r.REPLACEMENT_CHARACTER):this.currentToken.data+=je(e)}[J](e){this._consumeSequenceIfMatch(l.DASH_DASH_STRING,e,!0)?(this._createCommentToken(),this.state=Z):this._consumeSequenceIfMatch(l.DOCTYPE_STRING,e,!1)?this.state=le:this._consumeSequenceIfMatch(l.CDATA_START_STRING,e,!0)?this.allowCDATA?this.state=Se:(this._err(a.cdataInHtmlContent),this._createCommentToken(),this.currentToken.data="[CDATA[",this.state=X):this._ensureHibernation()||(this._err(a.incorrectlyOpenedComment),this._createCommentToken(),this._reconsumeInState(X))}[Z](e){e===s.HYPHEN_MINUS?this.state=$:e===s.GREATER_THAN_SIGN?(this._err(a.abruptClosingOfEmptyComment),this.state=u,this._emitCurrentToken()):this._reconsumeInState(ee)}[$](e){e===s.HYPHEN_MINUS?this.state=ae:e===s.GREATER_THAN_SIGN?(this._err(a.abruptClosingOfEmptyComment),this.state=u,this._emitCurrentToken()):e===s.EOF?(this._err(a.eofInComment),this._emitCurrentToken(),this._emitEOFToken()):(this.currentToken.data+="-",this._reconsumeInState(ee))}[ee](e){e===s.HYPHEN_MINUS?this.state=ie:e===s.LESS_THAN_SIGN?(this.currentToken.data+="<",this.state=te):e===s.NULL?(this._err(a.unexpectedNullCharacter),this.currentToken.data+=r.REPLACEMENT_CHARACTER):e===s.EOF?(this._err(a.eofInComment),this._emitCurrentToken(),this._emitEOFToken()):this.currentToken.data+=je(e)}[te](e){e===s.EXCLAMATION_MARK?(this.currentToken.data+="!",this.state=ne):e===s.LESS_THAN_SIGN?this.currentToken.data+="!":this._reconsumeInState(ee)}[ne](e){e===s.HYPHEN_MINUS?this.state=oe:this._reconsumeInState(ee)}[oe](e){e===s.HYPHEN_MINUS?this.state=re:this._reconsumeInState(ie)}[re](e){e!==s.GREATER_THAN_SIGN&&e!==s.EOF&&this._err(a.nestedComment),this._reconsumeInState(ae)}[ie](e){e===s.HYPHEN_MINUS?this.state=ae:e===s.EOF?(this._err(a.eofInComment),this._emitCurrentToken(),this._emitEOFToken()):(this.currentToken.data+="-",this._reconsumeInState(ee))}[ae](e){e===s.GREATER_THAN_SIGN?(this.state=u,this._emitCurrentToken()):e===s.EXCLAMATION_MARK?this.state=se:e===s.HYPHEN_MINUS?this.currentToken.data+="-":e===s.EOF?(this._err(a.eofInComment),this._emitCurrentToken(),this._emitEOFToken()):(this.currentToken.data+="--",this._reconsumeInState(ee))}[se](e){e===s.HYPHEN_MINUS?(this.currentToken.data+="--!",this.state=ie):e===s.GREATER_THAN_SIGN?(this._err(a.incorrectlyClosedComment),this.state=u,this._emitCurrentToken()):e===s.EOF?(this._err(a.eofInComment),this._emitCurrentToken(),this._emitEOFToken()):(this.currentToken.data+="--!",this._reconsumeInState(ee))}[le](e){He(e)?this.state=ce:e===s.GREATER_THAN_SIGN?this._reconsumeInState(ce):e===s.EOF?(this._err(a.eofInDoctype),this._createDoctypeToken(null),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):(this._err(a.missingWhitespaceBeforeDoctypeName),this._reconsumeInState(ce))}[ce](e){He(e)||(Fe(e)?(this._createDoctypeToken(Ye(e)),this.state=ue):e===s.NULL?(this._err(a.unexpectedNullCharacter),this._createDoctypeToken(r.REPLACEMENT_CHARACTER),this.state=ue):e===s.GREATER_THAN_SIGN?(this._err(a.missingDoctypeName),this._createDoctypeToken(null),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this.state=u):e===s.EOF?(this._err(a.eofInDoctype),this._createDoctypeToken(null),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):(this._createDoctypeToken(je(e)),this.state=ue))}[ue](e){He(e)?this.state=de:e===s.GREATER_THAN_SIGN?(this.state=u,this._emitCurrentToken()):Fe(e)?this.currentToken.name+=Ye(e):e===s.NULL?(this._err(a.unexpectedNullCharacter),this.currentToken.name+=r.REPLACEMENT_CHARACTER):e===s.EOF?(this._err(a.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):this.currentToken.name+=je(e)}[de](e){He(e)||(e===s.GREATER_THAN_SIGN?(this.state=u,this._emitCurrentToken()):e===s.EOF?(this._err(a.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):this._consumeSequenceIfMatch(l.PUBLIC_STRING,e,!1)?this.state=pe:this._consumeSequenceIfMatch(l.SYSTEM_STRING,e,!1)?this.state=Ee:this._ensureHibernation()||(this._err(a.invalidCharacterSequenceAfterDoctypeName),this.currentToken.forceQuirks=!0,this._reconsumeInState(_e)))}[pe](e){He(e)?this.state=fe:e===s.QUOTATION_MARK?(this._err(a.missingWhitespaceAfterDoctypePublicKeyword),this.currentToken.publicId="",this.state=he):e===s.APOSTROPHE?(this._err(a.missingWhitespaceAfterDoctypePublicKeyword),this.currentToken.publicId="",this.state=me):e===s.GREATER_THAN_SIGN?(this._err(a.missingDoctypePublicIdentifier),this.currentToken.forceQuirks=!0,this.state=u,this._emitCurrentToken()):e===s.EOF?(this._err(a.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):(this._err(a.missingQuoteBeforeDoctypePublicIdentifier),this.currentToken.forceQuirks=!0,this._reconsumeInState(_e))}[fe](e){He(e)||(e===s.QUOTATION_MARK?(this.currentToken.publicId="",this.state=he):e===s.APOSTROPHE?(this.currentToken.publicId="",this.state=me):e===s.GREATER_THAN_SIGN?(this._err(a.missingDoctypePublicIdentifier),this.currentToken.forceQuirks=!0,this.state=u,this._emitCurrentToken()):e===s.EOF?(this._err(a.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):(this._err(a.missingQuoteBeforeDoctypePublicIdentifier),this.currentToken.forceQuirks=!0,this._reconsumeInState(_e)))}[he](e){e===s.QUOTATION_MARK?this.state=ge:e===s.NULL?(this._err(a.unexpectedNullCharacter),this.currentToken.publicId+=r.REPLACEMENT_CHARACTER):e===s.GREATER_THAN_SIGN?(this._err(a.abruptDoctypePublicIdentifier),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this.state=u):e===s.EOF?(this._err(a.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):this.currentToken.publicId+=je(e)}[me](e){e===s.APOSTROPHE?this.state=ge:e===s.NULL?(this._err(a.unexpectedNullCharacter),this.currentToken.publicId+=r.REPLACEMENT_CHARACTER):e===s.GREATER_THAN_SIGN?(this._err(a.abruptDoctypePublicIdentifier),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this.state=u):e===s.EOF?(this._err(a.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):this.currentToken.publicId+=je(e)}[ge](e){He(e)?this.state=Te:e===s.GREATER_THAN_SIGN?(this.state=u,this._emitCurrentToken()):e===s.QUOTATION_MARK?(this._err(a.missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers),this.currentToken.systemId="",this.state=Ae):e===s.APOSTROPHE?(this._err(a.missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers),this.currentToken.systemId="",this.state=ke):e===s.EOF?(this._err(a.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):(this._err(a.missingQuoteBeforeDoctypeSystemIdentifier),this.currentToken.forceQuirks=!0,this._reconsumeInState(_e))}[Te](e){He(e)||(e===s.GREATER_THAN_SIGN?(this._emitCurrentToken(),this.state=u):e===s.QUOTATION_MARK?(this.currentToken.systemId="",this.state=Ae):e===s.APOSTROPHE?(this.currentToken.systemId="",this.state=ke):e===s.EOF?(this._err(a.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):(this._err(a.missingQuoteBeforeDoctypeSystemIdentifier),this.currentToken.forceQuirks=!0,this._reconsumeInState(_e)))}[Ee](e){He(e)?this.state=be:e===s.QUOTATION_MARK?(this._err(a.missingWhitespaceAfterDoctypeSystemKeyword),this.currentToken.systemId="",this.state=Ae):e===s.APOSTROPHE?(this._err(a.missingWhitespaceAfterDoctypeSystemKeyword),this.currentToken.systemId="",this.state=ke):e===s.GREATER_THAN_SIGN?(this._err(a.missingDoctypeSystemIdentifier),this.currentToken.forceQuirks=!0,this.state=u,this._emitCurrentToken()):e===s.EOF?(this._err(a.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):(this._err(a.missingQuoteBeforeDoctypeSystemIdentifier),this.currentToken.forceQuirks=!0,this._reconsumeInState(_e))}[be](e){He(e)||(e===s.QUOTATION_MARK?(this.currentToken.systemId="",this.state=Ae):e===s.APOSTROPHE?(this.currentToken.systemId="",this.state=ke):e===s.GREATER_THAN_SIGN?(this._err(a.missingDoctypeSystemIdentifier),this.currentToken.forceQuirks=!0,this.state=u,this._emitCurrentToken()):e===s.EOF?(this._err(a.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):(this._err(a.missingQuoteBeforeDoctypeSystemIdentifier),this.currentToken.forceQuirks=!0,this._reconsumeInState(_e)))}[Ae](e){e===s.QUOTATION_MARK?this.state=ye:e===s.NULL?(this._err(a.unexpectedNullCharacter),this.currentToken.systemId+=r.REPLACEMENT_CHARACTER):e===s.GREATER_THAN_SIGN?(this._err(a.abruptDoctypeSystemIdentifier),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this.state=u):e===s.EOF?(this._err(a.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):this.currentToken.systemId+=je(e)}[ke](e){e===s.APOSTROPHE?this.state=ye:e===s.NULL?(this._err(a.unexpectedNullCharacter),this.currentToken.systemId+=r.REPLACEMENT_CHARACTER):e===s.GREATER_THAN_SIGN?(this._err(a.abruptDoctypeSystemIdentifier),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this.state=u):e===s.EOF?(this._err(a.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):this.currentToken.systemId+=je(e)}[ye](e){He(e)||(e===s.GREATER_THAN_SIGN?(this._emitCurrentToken(),this.state=u):e===s.EOF?(this._err(a.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):(this._err(a.unexpectedCharacterAfterDoctypeSystemIdentifier),this._reconsumeInState(_e)))}[_e](e){e===s.GREATER_THAN_SIGN?(this._emitCurrentToken(),this.state=u):e===s.NULL?this._err(a.unexpectedNullCharacter):e===s.EOF&&(this._emitCurrentToken(),this._emitEOFToken())}[Se](e){e===s.RIGHT_SQUARE_BRACKET?this.state=Ce:e===s.EOF?(this._err(a.eofInCdata),this._emitEOFToken()):this._emitCodePoint(e)}[Ce](e){e===s.RIGHT_SQUARE_BRACKET?this.state=xe:(this._emitChars("]"),this._reconsumeInState(Se))}[xe](e){e===s.GREATER_THAN_SIGN?this.state=u:e===s.RIGHT_SQUARE_BRACKET?this._emitChars("]"):(this._emitChars("]]"),this._reconsumeInState(Se))}[ve](e){this.tempBuff=[s.AMPERSAND],e===s.NUMBER_SIGN?(this.tempBuff.push(e),this.state=Me):Ue(e)?this._reconsumeInState(Oe):(this._flushCodePointsConsumedAsCharacterReference(),this._reconsumeInState(this.returnState))}[Oe](e){const t=this._matchNamedCharacterReference(e);if(this._ensureHibernation())this.tempBuff=[s.AMPERSAND];else if(t){const e=this.tempBuff[this.tempBuff.length-1]===s.SEMICOLON;this._isCharacterReferenceAttributeQuirk(e)||(e||this._errOnNextCodePoint(a.missingSemicolonAfterCharacterReference),this.tempBuff=t),this._flushCodePointsConsumedAsCharacterReference(),this.state=this.returnState}else this._flushCodePointsConsumedAsCharacterReference(),this.state=Ne}[Ne](e){Ue(e)?this._isCharacterReferenceInAttribute()?this.currentAttr.value+=je(e):this._emitCodePoint(e):(e===s.SEMICOLON&&this._err(a.unknownNamedCharacterReference),this._reconsumeInState(this.returnState))}[Me](e){this.charRefCode=0,e===s.LATIN_SMALL_X||e===s.LATIN_CAPITAL_X?(this.tempBuff.push(e),this.state=we):this._reconsumeInState(Re)}[we](e){!function(e){return De(e)||Ge(e)||We(e)}(e)?(this._err(a.absenceOfDigitsInNumericCharacterReference),this._flushCodePointsConsumedAsCharacterReference(),this._reconsumeInState(this.returnState)):this._reconsumeInState(Ie)}[Re](e){De(e)?this._reconsumeInState(Le):(this._err(a.absenceOfDigitsInNumericCharacterReference),this._flushCodePointsConsumedAsCharacterReference(),this._reconsumeInState(this.returnState))}[Ie](e){Ge(e)?this.charRefCode=16*this.charRefCode+e-55:We(e)?this.charRefCode=16*this.charRefCode+e-87:De(e)?this.charRefCode=16*this.charRefCode+e-48:e===s.SEMICOLON?this.state=Pe:(this._err(a.missingSemicolonAfterCharacterReference),this._reconsumeInState(Pe))}[Le](e){De(e)?this.charRefCode=10*this.charRefCode+e-48:e===s.SEMICOLON?this.state=Pe:(this._err(a.missingSemicolonAfterCharacterReference),this._reconsumeInState(Pe))}[Pe](){if(this.charRefCode===s.NULL)this._err(a.nullCharacterReference),this.charRefCode=s.REPLACEMENT_CHARACTER;else if(this.charRefCode>1114111)this._err(a.characterReferenceOutsideUnicodeRange),this.charRefCode=s.REPLACEMENT_CHARACTER;else if(r.isSurrogate(this.charRefCode))this._err(a.surrogateCharacterReference),this.charRefCode=s.REPLACEMENT_CHARACTER;else if(r.isUndefinedCodePoint(this.charRefCode))this._err(a.noncharacterCharacterReference);else if(r.isControlCodePoint(this.charRefCode)||this.charRefCode===s.CARRIAGE_RETURN){this._err(a.controlCharacterReference);const e=c[this.charRefCode];e&&(this.charRefCode=e)}this.tempBuff=[this.charRefCode],this._flushCodePointsConsumedAsCharacterReference(),this._reconsumeInState(this.returnState)}}Ve.CHARACTER_TOKEN="CHARACTER_TOKEN",Ve.NULL_CHARACTER_TOKEN="NULL_CHARACTER_TOKEN",Ve.WHITESPACE_CHARACTER_TOKEN="WHITESPACE_CHARACTER_TOKEN",Ve.START_TAG_TOKEN="START_TAG_TOKEN",Ve.END_TAG_TOKEN="END_TAG_TOKEN",Ve.COMMENT_TOKEN="COMMENT_TOKEN",Ve.DOCTYPE_TOKEN="DOCTYPE_TOKEN",Ve.EOF_TOKEN="EOF_TOKEN",Ve.HIBERNATION_TOKEN="HIBERNATION_TOKEN",Ve.MODE={DATA:u,RCDATA:d,RAWTEXT:p,SCRIPT_DATA:f,PLAINTEXT:h},Ve.getTokenAttr=function(e,t){for(let n=e.attrs.length-1;n>=0;n--)if(e.attrs[n].name===t)return e.attrs[n].value;return null},e.exports=Ve}}]); \ No newline at end of file diff --git a/_next/static/chunks/1c49f5f00355f650bee3d37484f094be037a30fa.b5ddd9821397b7ba5670.js b/_next/static/chunks/1c49f5f00355f650bee3d37484f094be037a30fa.b5ddd9821397b7ba5670.js new file mode 100644 index 000000000..267ad8018 --- /dev/null +++ b/_next/static/chunks/1c49f5f00355f650bee3d37484f094be037a30fa.b5ddd9821397b7ba5670.js @@ -0,0 +1 @@ +(window.webpackJsonp_N_E=window.webpackJsonp_N_E||[]).push([[5],{"++Eq":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#1d262f",color:"#57718e"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#1d262f",color:"#57718e",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#004a9e"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#004a9e"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#004a9e"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#004a9e"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#004a9e"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#004a9e"},'code[class*="language-"]::selection':{textShadow:"none",background:"#004a9e"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#004a9e"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#4a5f78"},prolog:{color:"#4a5f78"},doctype:{color:"#4a5f78"},cdata:{color:"#4a5f78"},punctuation:{color:"#4a5f78"},namespace:{Opacity:".7"},tag:{color:"#0aa370"},operator:{color:"#0aa370"},number:{color:"#0aa370"},property:{color:"#57718e"},function:{color:"#57718e"},"tag-id":{color:"#ebf4ff"},selector:{color:"#ebf4ff"},"atrule-id":{color:"#ebf4ff"},"code.language-javascript":{color:"#7eb6f6"},"attr-name":{color:"#7eb6f6"},"code.language-css":{color:"#47ebb4"},"code.language-scss":{color:"#47ebb4"},boolean:{color:"#47ebb4"},string:{color:"#47ebb4"},entity:{color:"#47ebb4",cursor:"help"},url:{color:"#47ebb4"},".language-css .token.string":{color:"#47ebb4"},".language-scss .token.string":{color:"#47ebb4"},".style .token.string":{color:"#47ebb4"},"attr-value":{color:"#47ebb4"},keyword:{color:"#47ebb4"},control:{color:"#47ebb4"},directive:{color:"#47ebb4"},unit:{color:"#47ebb4"},statement:{color:"#47ebb4"},regex:{color:"#47ebb4"},atrule:{color:"#47ebb4"},placeholder:{color:"#47ebb4"},variable:{color:"#47ebb4"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #ebf4ff",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#7eb6f6"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid #34659d",OutlineOffset:".4em"},".line-numbers .line-numbers-rows":{borderRightColor:"#1f2932"},".line-numbers-rows > span:before":{color:"#2c3847"},".line-highlight":{background:"linear-gradient(to right, rgba(10, 163, 112, 0.2) 70%, rgba(10, 163, 112, 0))"}}},"+OJB":function(e,t,n){"use strict";t.cwd=function(){return"/"}},"+Pz5":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=n("NOby"),r=n("T0BQ"),a=l("text"),i=l("string"),s={resolveAll:c()};function l(e){return{tokenize:function(t){var n=this,o=this.parser.constructs[e],r=t.attempt(o,a,i);return a;function a(e){return l(e)?r(e):i(e)}function i(e){if(null!==e)return t.enter("data"),t.consume(e),s;t.consume(e)}function s(e){return l(e)?(t.exit("data"),r(e)):(t.consume(e),s)}function l(e){var t=o[e],r=-1;if(null===e)return!0;if(t)for(;++r0&&void 0!==arguments[0]?arguments[0]:{},t=e.ampFirst,n=void 0!==t&&t,o=e.hybrid,r=void 0!==o&&o,a=e.hasQuery,i=void 0!==a&&a;return n||r&&i}},"/BR8":function(e,t,n){"use strict";e.exports=function(e,t){var n=e.footnoteOrder,r=String(t.identifier);-1===n.indexOf(r)&&n.push(r);return e(t.position,"sup",{id:"fnref-"+r},[e(t,"a",{href:"#fn-"+r,className:["footnote-ref"]},[o("text",t.label||r)])])};var o=n("vUGn")},"/Fgc":function(e,t,n){"use strict";e.exports=function(e,t){return e(t,"del",o(e,t))};var o=n("WFsM")},"/apb":function(e,t,n){"use strict";var o=n("E/Jm"),r={name:"codeText",tokenize:function(e,t,n){var r,a,i=0;return function(t){return e.enter("codeText"),e.enter("codeTextSequence"),s(t)};function s(t){return 96===t?(e.consume(t),i++,s):(e.exit("codeTextSequence"),l(t))}function l(t){return null===t?n(t):96===t?(a=e.enter("codeTextSequence"),r=0,u(t)):32===t?(e.enter("space"),e.consume(t),e.exit("space"),l):o(t)?(e.enter("lineEnding"),e.consume(t),e.exit("lineEnding"),l):(e.enter("codeTextData"),c(t))}function c(t){return null===t||32===t||96===t||o(t)?(e.exit("codeTextData"),l(t)):(e.consume(t),c)}function u(n){return 96===n?(e.consume(n),r++,u):r===i?(e.exit("codeTextSequence"),e.exit("codeText"),t(n)):(a.type="codeTextData",c(n))}},resolve:function(e){var t,n,o=e.length-4,r=3;if(("lineEnding"===e[r][1].type||"space"===e[r][1].type)&&("lineEnding"===e[o][1].type||"space"===e[o][1].type))for(t=r;++t code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#6a51e6"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#6a51e6"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#6a51e6"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#6a51e6"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#6a51e6"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#6a51e6"},'code[class*="language-"]::selection':{textShadow:"none",background:"#6a51e6"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#6a51e6"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#6c6783"},prolog:{color:"#6c6783"},doctype:{color:"#6c6783"},cdata:{color:"#6c6783"},punctuation:{color:"#6c6783"},namespace:{Opacity:".7"},tag:{color:"#e09142"},operator:{color:"#e09142"},number:{color:"#e09142"},property:{color:"#9a86fd"},function:{color:"#9a86fd"},"tag-id":{color:"#eeebff"},selector:{color:"#eeebff"},"atrule-id":{color:"#eeebff"},"code.language-javascript":{color:"#c4b9fe"},"attr-name":{color:"#c4b9fe"},"code.language-css":{color:"#ffcc99"},"code.language-scss":{color:"#ffcc99"},boolean:{color:"#ffcc99"},string:{color:"#ffcc99"},entity:{color:"#ffcc99",cursor:"help"},url:{color:"#ffcc99"},".language-css .token.string":{color:"#ffcc99"},".language-scss .token.string":{color:"#ffcc99"},".style .token.string":{color:"#ffcc99"},"attr-value":{color:"#ffcc99"},keyword:{color:"#ffcc99"},control:{color:"#ffcc99"},directive:{color:"#ffcc99"},unit:{color:"#ffcc99"},statement:{color:"#ffcc99"},regex:{color:"#ffcc99"},atrule:{color:"#ffcc99"},placeholder:{color:"#ffcc99"},variable:{color:"#ffcc99"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #eeebff",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#c4b9fe"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid #8a75f5",OutlineOffset:".4em"},".line-numbers .line-numbers-rows":{borderRightColor:"#2c2937"},".line-numbers-rows > span:before":{color:"#3c3949"},".line-highlight":{background:"linear-gradient(to right, rgba(224, 145, 66, 0.2) 70%, rgba(224, 145, 66, 0))"}}},"0RbX":function(e,t,n){"use strict";var o=n("0h9/"),r=n("Yoeg"),a=n("L8sx"),i=n("+Pz5"),s=n("oJEb"),l=n("5pEW"),c=n("pe0m"),u=n("RrMp");e.exports=function(e){var t={defined:[],constructs:s([u].concat(c((e||{}).extensions))),content:n(o),document:n(r),flow:n(a),string:n(i.string),text:n(i.text)};return t;function n(e){return function(n){return l(t,e,n)}}}},"0So9":function(e,t,n){var o=n("hq1P"),r=n("Ny5O"),a=n("9SNS"),i=n("E/Jm"),s=n("BjXi"),l=n("uDje"),c={tokenize:function(e,t,n){return function(t){return e.consume(t),o};function o(t){return 87===t||t-32===87?(e.consume(t),r):n(t)}function r(t){return 87===t||t-32===87?(e.consume(t),a):n(t)}function a(t){return 46===t?(e.consume(t),s):n(t)}function s(e){return null===e||i(e)?n(e):t(e)}},partial:!0},u={tokenize:function(e,t,n){var o,r;return i;function i(t){return 38===t?e.check(f,u,c)(t):46===t||95===t?e.check(p,u,c)(t):a(t)||l(t)||45!==t&&s(t)?u(t):(e.consume(t),i)}function c(t){return 46===t?(r=o,o=void 0,e.consume(t),i):(95===t&&(o=!0),e.consume(t),i)}function u(e){return r||o?n(e):t(e)}},partial:!0},d={tokenize:function(e,t){var n=0;return o;function o(i){return 38===i?e.check(f,t,r)(i):(40===i&&n++,41===i?e.check(p,a,r)(i):A(i)?t(i):b(i)?e.check(p,t,r)(i):(e.consume(i),o))}function r(t){return e.consume(t),o}function a(e){return--n<0?t(e):r(e)}},partial:!0},p={tokenize:function(e,t,n){return function(t){return e.consume(t),o};function o(r){return b(r)?(e.consume(r),o):A(r)?t(r):n(r)}},partial:!0},f={tokenize:function(e,t,n){return function(t){return e.consume(t),r};function r(t){return o(t)?(e.consume(t),r):59===t?(e.consume(t),a):n(t)}function a(e){return A(e)?t(e):n(e)}},partial:!0},h={tokenize:function(e,t,n){var o=this;return function(t){if(87!==t&&t-32!==87||!y(o.previous)||C(o.events))return n(t);return e.enter("literalAutolink"),e.enter("literalAutolinkWww"),e.check(c,e.attempt(u,e.attempt(d,r),n),n)(t)};function r(n){return e.exit("literalAutolinkWww"),e.exit("literalAutolink"),t(n)}},previous:y},m={tokenize:function(e,t,n){var o=this;return function(t){if(72!==t&&t-32!==72||!S(o.previous)||C(o.events))return n(t);return e.enter("literalAutolink"),e.enter("literalAutolinkHttp"),e.consume(t),r};function r(t){return 84===t||t-32===84?(e.consume(t),i):n(t)}function i(t){return 84===t||t-32===84?(e.consume(t),c):n(t)}function c(t){return 80===t||t-32===80?(e.consume(t),p):n(t)}function p(t){return 83===t||t-32===83?(e.consume(t),f):f(t)}function f(t){return 58===t?(e.consume(t),h):n(t)}function h(t){return 47===t?(e.consume(t),m):n(t)}function m(t){return 47===t?(e.consume(t),g):n(t)}function g(t){return a(t)||l(t)||s(t)?n(t):e.attempt(u,e.attempt(d,T),n)(t)}function T(n){return e.exit("literalAutolinkHttp"),e.exit("literalAutolink"),t(n)}},previous:S},g={tokenize:function(e,t,n){var o,a=this;return function(t){if(!k(t)||!_(a.previous)||C(a.events))return n(t);return e.enter("literalAutolink"),e.enter("literalAutolinkEmail"),i(t)};function i(t){return k(t)?(e.consume(t),i):64===t?(e.consume(t),s):n(t)}function s(t){return 46===t?e.check(p,d,l)(t):45===t||95===t?e.check(p,n,c)(t):r(t)?(e.consume(t),s):d(t)}function l(t){return e.consume(t),o=!0,s}function c(t){return e.consume(t),u}function u(t){return 46===t?e.check(p,n,l)(t):s(t)}function d(r){return o?(e.exit("literalAutolinkEmail"),e.exit("literalAutolink"),t(r)):n(r)}},previous:_},T={};t.text=T;for(var E=48;E<123;)T[E]=g,58===++E?E=65:91===E&&(E=97);function b(e){return 33===e||34===e||39===e||41===e||42===e||44===e||46===e||58===e||59===e||60===e||63===e||95===e||126===e}function A(e){return null===e||e<0||32===e||60===e}function k(e){return 43===e||45===e||46===e||95===e||r(e)}function y(e){return null===e||e<0||32===e||40===e||42===e||95===e||126===e}function S(e){return null===e||!o(e)}function _(e){return 47!==e&&S(e)}function C(e){for(var t=e.length;t--;)if(("labelLink"===e[t][1].type||"labelImage"===e[t][1].type)&&!e[t][1]._balanced)return!0}T[43]=g,T[45]=g,T[46]=g,T[95]=g,T[72]=[g,m],T[104]=[g,m],T[87]=[g,h],T[119]=[g,h]},"0aKP":function(e,t,n){"use strict";var o=[].splice;e.exports=o},"0h9/":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=n("E/Jm"),r=n("yRGd"),a=function(e){var t,n=e.attempt(this.parser.constructs.contentInitial,(function(t){if(null===t)return void e.consume(t);return e.enter("lineEnding"),e.consume(t),e.exit("lineEnding"),r(e,n,"linePrefix")}),(function(t){return e.enter("paragraph"),a(t)}));return n;function a(n){var o=e.enter("chunkText",{contentType:"text",previous:t});return t&&(t.next=o),t=o,i(n)}function i(t){return null===t?(e.exit("chunkText"),e.exit("paragraph"),void e.consume(t)):o(t)?(e.consume(t),e.exit("chunkText"),a):(e.consume(t),i)}};t.tokenize=a},"0mGV":function(e,t,n){"use strict";var o=n("E/Jm"),r=n("2N74"),a=n("yRGd");e.exports=function(e,t){var n;return function i(s){if(o(s))return e.enter("lineEnding"),e.consume(s),e.exit("lineEnding"),n=!0,i;if(r(s))return a(e,i,n?"linePrefix":"lineSuffix")(s);return t(s)}}},"1CLp":function(e,t,n){"use strict";const o=n("UwWT"),r=o.TAG_NAMES,a=o.NAMESPACES;function i(e){switch(e.length){case 1:return e===r.P;case 2:return e===r.RB||e===r.RP||e===r.RT||e===r.DD||e===r.DT||e===r.LI;case 3:return e===r.RTC;case 6:return e===r.OPTION;case 8:return e===r.OPTGROUP}return!1}function s(e){switch(e.length){case 1:return e===r.P;case 2:return e===r.RB||e===r.RP||e===r.RT||e===r.DD||e===r.DT||e===r.LI||e===r.TD||e===r.TH||e===r.TR;case 3:return e===r.RTC;case 5:return e===r.TBODY||e===r.TFOOT||e===r.THEAD;case 6:return e===r.OPTION;case 7:return e===r.CAPTION;case 8:return e===r.OPTGROUP||e===r.COLGROUP}return!1}function l(e,t){switch(e.length){case 2:if(e===r.TD||e===r.TH)return t===a.HTML;if(e===r.MI||e===r.MO||e===r.MN||e===r.MS)return t===a.MATHML;break;case 4:if(e===r.HTML)return t===a.HTML;if(e===r.DESC)return t===a.SVG;break;case 5:if(e===r.TABLE)return t===a.HTML;if(e===r.MTEXT)return t===a.MATHML;if(e===r.TITLE)return t===a.SVG;break;case 6:return(e===r.APPLET||e===r.OBJECT)&&t===a.HTML;case 7:return(e===r.CAPTION||e===r.MARQUEE)&&t===a.HTML;case 8:return e===r.TEMPLATE&&t===a.HTML;case 13:return e===r.FOREIGN_OBJECT&&t===a.SVG;case 14:return e===r.ANNOTATION_XML&&t===a.MATHML}return!1}e.exports=class{constructor(e,t){this.stackTop=-1,this.items=[],this.current=e,this.currentTagName=null,this.currentTmplContent=null,this.tmplCount=0,this.treeAdapter=t}_indexOf(e){let t=-1;for(let n=this.stackTop;n>=0;n--)if(this.items[n]===e){t=n;break}return t}_isInTemplate(){return this.currentTagName===r.TEMPLATE&&this.treeAdapter.getNamespaceURI(this.current)===a.HTML}_updateCurrentElement(){this.current=this.items[this.stackTop],this.currentTagName=this.current&&this.treeAdapter.getTagName(this.current),this.currentTmplContent=this._isInTemplate()?this.treeAdapter.getTemplateContent(this.current):null}push(e){this.items[++this.stackTop]=e,this._updateCurrentElement(),this._isInTemplate()&&this.tmplCount++}pop(){this.stackTop--,this.tmplCount>0&&this._isInTemplate()&&this.tmplCount--,this._updateCurrentElement()}replace(e,t){const n=this._indexOf(e);this.items[n]=t,n===this.stackTop&&this._updateCurrentElement()}insertAfter(e,t){const n=this._indexOf(e)+1;this.items.splice(n,0,t),n===++this.stackTop&&this._updateCurrentElement()}popUntilTagNamePopped(e){for(;this.stackTop>-1;){const t=this.currentTagName,n=this.treeAdapter.getNamespaceURI(this.current);if(this.pop(),t===e&&n===a.HTML)break}}popUntilElementPopped(e){for(;this.stackTop>-1;){const t=this.current;if(this.pop(),t===e)break}}popUntilNumberedHeaderPopped(){for(;this.stackTop>-1;){const e=this.currentTagName,t=this.treeAdapter.getNamespaceURI(this.current);if(this.pop(),e===r.H1||e===r.H2||e===r.H3||e===r.H4||e===r.H5||e===r.H6&&t===a.HTML)break}}popUntilTableCellPopped(){for(;this.stackTop>-1;){const e=this.currentTagName,t=this.treeAdapter.getNamespaceURI(this.current);if(this.pop(),e===r.TD||e===r.TH&&t===a.HTML)break}}popAllUpToHtmlElement(){this.stackTop=0,this._updateCurrentElement()}clearBackToTableContext(){for(;this.currentTagName!==r.TABLE&&this.currentTagName!==r.TEMPLATE&&this.currentTagName!==r.HTML||this.treeAdapter.getNamespaceURI(this.current)!==a.HTML;)this.pop()}clearBackToTableBodyContext(){for(;this.currentTagName!==r.TBODY&&this.currentTagName!==r.TFOOT&&this.currentTagName!==r.THEAD&&this.currentTagName!==r.TEMPLATE&&this.currentTagName!==r.HTML||this.treeAdapter.getNamespaceURI(this.current)!==a.HTML;)this.pop()}clearBackToTableRowContext(){for(;this.currentTagName!==r.TR&&this.currentTagName!==r.TEMPLATE&&this.currentTagName!==r.HTML||this.treeAdapter.getNamespaceURI(this.current)!==a.HTML;)this.pop()}remove(e){for(let t=this.stackTop;t>=0;t--)if(this.items[t]===e){this.items.splice(t,1),this.stackTop--,this._updateCurrentElement();break}}tryPeekProperlyNestedBodyElement(){const e=this.items[1];return e&&this.treeAdapter.getTagName(e)===r.BODY?e:null}contains(e){return this._indexOf(e)>-1}getCommonAncestor(e){let t=this._indexOf(e);return--t>=0?this.items[t]:null}isRootHtmlElementCurrent(){return 0===this.stackTop&&this.currentTagName===r.HTML}hasInScope(e){for(let t=this.stackTop;t>=0;t--){const n=this.treeAdapter.getTagName(this.items[t]),o=this.treeAdapter.getNamespaceURI(this.items[t]);if(n===e&&o===a.HTML)return!0;if(l(n,o))return!1}return!0}hasNumberedHeaderInScope(){for(let e=this.stackTop;e>=0;e--){const t=this.treeAdapter.getTagName(this.items[e]),n=this.treeAdapter.getNamespaceURI(this.items[e]);if((t===r.H1||t===r.H2||t===r.H3||t===r.H4||t===r.H5||t===r.H6)&&n===a.HTML)return!0;if(l(t,n))return!1}return!0}hasInListItemScope(e){for(let t=this.stackTop;t>=0;t--){const n=this.treeAdapter.getTagName(this.items[t]),o=this.treeAdapter.getNamespaceURI(this.items[t]);if(n===e&&o===a.HTML)return!0;if((n===r.UL||n===r.OL)&&o===a.HTML||l(n,o))return!1}return!0}hasInButtonScope(e){for(let t=this.stackTop;t>=0;t--){const n=this.treeAdapter.getTagName(this.items[t]),o=this.treeAdapter.getNamespaceURI(this.items[t]);if(n===e&&o===a.HTML)return!0;if(n===r.BUTTON&&o===a.HTML||l(n,o))return!1}return!0}hasInTableScope(e){for(let t=this.stackTop;t>=0;t--){const n=this.treeAdapter.getTagName(this.items[t]);if(this.treeAdapter.getNamespaceURI(this.items[t])===a.HTML){if(n===e)return!0;if(n===r.TABLE||n===r.TEMPLATE||n===r.HTML)return!1}}return!0}hasTableBodyContextInTableScope(){for(let e=this.stackTop;e>=0;e--){const t=this.treeAdapter.getTagName(this.items[e]);if(this.treeAdapter.getNamespaceURI(this.items[e])===a.HTML){if(t===r.TBODY||t===r.THEAD||t===r.TFOOT)return!0;if(t===r.TABLE||t===r.HTML)return!1}}return!0}hasInSelectScope(e){for(let t=this.stackTop;t>=0;t--){const n=this.treeAdapter.getTagName(this.items[t]);if(this.treeAdapter.getNamespaceURI(this.items[t])===a.HTML){if(n===e)return!0;if(n!==r.OPTION&&n!==r.OPTGROUP)return!1}}return!0}generateImpliedEndTags(){for(;i(this.currentTagName);)this.pop()}generateImpliedEndTagsThoroughly(){for(;s(this.currentTagName);)this.pop()}generateImpliedEndTagsWithExclusion(e){for(;i(this.currentTagName)&&this.currentTagName!==e;)this.pop()}}},"1VtT":function(e,t,n){"use strict";var o=n("Gdbo"),r=n("BEtg"),a=n("6dBs"),i=n("bwJB"),s=n("xkQk"),l=n("Esvb");e.exports=function e(){var t,n=[],r=s(),E={},b=-1;return A.data=function(e,n){if("string"===typeof e)return 2===arguments.length?(m("data",t),E[e]=n,A):u.call(E,e)&&E[e]||null;if(e)return m("data",t),E=e,A;return E},A.freeze=k,A.attachers=n,A.use=function(e){var o;if(m("use",t),null===e||void 0===e);else if("function"===typeof e)u.apply(null,arguments);else{if("object"!==typeof e)throw new Error("Expected usable value, not `"+e+"`");"length"in e?l(e):r(e)}o&&(E.settings=a(E.settings||{},o));return A;function r(e){l(e.plugins),e.settings&&(o=a(o||{},e.settings))}function s(e){if("function"===typeof e)u(e);else{if("object"!==typeof e)throw new Error("Expected usable value, not `"+e+"`");"length"in e?u.apply(null,e):r(e)}}function l(e){var t=-1;if(null===e||void 0===e);else{if("object"!==typeof e||!("length"in e))throw new Error("Expected a list of plugins, not `"+e+"`");for(;++t-1&&(n[0]=n[0].slice(r)),i>0&&n.push(e[a].slice(0,i))),n}},"2N74":function(e,t,n){"use strict";e.exports=function(e){return-2===e||-1===e||32===e}},"2l2D":function(e,t,n){"use strict";e.exports={controlCharacterInInputStream:"control-character-in-input-stream",noncharacterInInputStream:"noncharacter-in-input-stream",surrogateInInputStream:"surrogate-in-input-stream",nonVoidHtmlElementStartTagWithTrailingSolidus:"non-void-html-element-start-tag-with-trailing-solidus",endTagWithAttributes:"end-tag-with-attributes",endTagWithTrailingSolidus:"end-tag-with-trailing-solidus",unexpectedSolidusInTag:"unexpected-solidus-in-tag",unexpectedNullCharacter:"unexpected-null-character",unexpectedQuestionMarkInsteadOfTagName:"unexpected-question-mark-instead-of-tag-name",invalidFirstCharacterOfTagName:"invalid-first-character-of-tag-name",unexpectedEqualsSignBeforeAttributeName:"unexpected-equals-sign-before-attribute-name",missingEndTagName:"missing-end-tag-name",unexpectedCharacterInAttributeName:"unexpected-character-in-attribute-name",unknownNamedCharacterReference:"unknown-named-character-reference",missingSemicolonAfterCharacterReference:"missing-semicolon-after-character-reference",unexpectedCharacterAfterDoctypeSystemIdentifier:"unexpected-character-after-doctype-system-identifier",unexpectedCharacterInUnquotedAttributeValue:"unexpected-character-in-unquoted-attribute-value",eofBeforeTagName:"eof-before-tag-name",eofInTag:"eof-in-tag",missingAttributeValue:"missing-attribute-value",missingWhitespaceBetweenAttributes:"missing-whitespace-between-attributes",missingWhitespaceAfterDoctypePublicKeyword:"missing-whitespace-after-doctype-public-keyword",missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers:"missing-whitespace-between-doctype-public-and-system-identifiers",missingWhitespaceAfterDoctypeSystemKeyword:"missing-whitespace-after-doctype-system-keyword",missingQuoteBeforeDoctypePublicIdentifier:"missing-quote-before-doctype-public-identifier",missingQuoteBeforeDoctypeSystemIdentifier:"missing-quote-before-doctype-system-identifier",missingDoctypePublicIdentifier:"missing-doctype-public-identifier",missingDoctypeSystemIdentifier:"missing-doctype-system-identifier",abruptDoctypePublicIdentifier:"abrupt-doctype-public-identifier",abruptDoctypeSystemIdentifier:"abrupt-doctype-system-identifier",cdataInHtmlContent:"cdata-in-html-content",incorrectlyOpenedComment:"incorrectly-opened-comment",eofInScriptHtmlCommentLikeText:"eof-in-script-html-comment-like-text",eofInDoctype:"eof-in-doctype",nestedComment:"nested-comment",abruptClosingOfEmptyComment:"abrupt-closing-of-empty-comment",eofInComment:"eof-in-comment",incorrectlyClosedComment:"incorrectly-closed-comment",eofInCdata:"eof-in-cdata",absenceOfDigitsInNumericCharacterReference:"absence-of-digits-in-numeric-character-reference",nullCharacterReference:"null-character-reference",surrogateCharacterReference:"surrogate-character-reference",characterReferenceOutsideUnicodeRange:"character-reference-outside-unicode-range",controlCharacterReference:"control-character-reference",noncharacterCharacterReference:"noncharacter-character-reference",missingWhitespaceBeforeDoctypeName:"missing-whitespace-before-doctype-name",missingDoctypeName:"missing-doctype-name",invalidCharacterSequenceAfterDoctypeName:"invalid-character-sequence-after-doctype-name",duplicateAttribute:"duplicate-attribute",nonConformingDoctype:"non-conforming-doctype",missingDoctype:"missing-doctype",misplacedDoctype:"misplaced-doctype",endTagWithoutMatchingOpenElement:"end-tag-without-matching-open-element",closingOfElementWithOpenChildElements:"closing-of-element-with-open-child-elements",disallowedContentInNoscriptInHead:"disallowed-content-in-noscript-in-head",openElementsLeftAfterEof:"open-elements-left-after-eof",abandonedHeadElementChild:"abandoned-head-element-child",misplacedStartTagForHeadElement:"misplaced-start-tag-for-head-element",nestedNoscriptInHead:"nested-noscript-in-head",eofInElementThatCanContainOnlyText:"eof-in-element-that-can-contain-only-text"}},"2uWR":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",color:"#c3cee3",background:"#263238",fontFamily:"Roboto Mono, monospace",fontSize:"1em",lineHeight:"1.5em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",color:"#c3cee3",background:"#263238",fontFamily:"Roboto Mono, monospace",fontSize:"1em",lineHeight:"1.5em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",overflow:"auto",position:"relative",margin:"0.5em 0",padding:"1.25em 1em"},'code[class*="language-"]::-moz-selection':{background:"#363636"},'pre[class*="language-"]::-moz-selection':{background:"#363636"},'code[class*="language-"] ::-moz-selection':{background:"#363636"},'pre[class*="language-"] ::-moz-selection':{background:"#363636"},'code[class*="language-"]::selection':{background:"#363636"},'pre[class*="language-"]::selection':{background:"#363636"},'code[class*="language-"] ::selection':{background:"#363636"},'pre[class*="language-"] ::selection':{background:"#363636"},':not(pre) > code[class*="language-"]':{whiteSpace:"normal",borderRadius:"0.2em",padding:"0.1em"},".language-css > code":{color:"#fd9170"},".language-sass > code":{color:"#fd9170"},".language-scss > code":{color:"#fd9170"},'[class*="language-"] .namespace':{Opacity:"0.7"},atrule:{color:"#c792ea"},"attr-name":{color:"#ffcb6b"},"attr-value":{color:"#c3e88d"},attribute:{color:"#c3e88d"},boolean:{color:"#c792ea"},builtin:{color:"#ffcb6b"},cdata:{color:"#80cbc4"},char:{color:"#80cbc4"},class:{color:"#ffcb6b"},"class-name":{color:"#f2ff00"},color:{color:"#f2ff00"},comment:{color:"#546e7a"},constant:{color:"#c792ea"},deleted:{color:"#f07178"},doctype:{color:"#546e7a"},entity:{color:"#f07178"},function:{color:"#c792ea"},hexcode:{color:"#f2ff00"},id:{color:"#c792ea",fontWeight:"bold"},important:{color:"#c792ea",fontWeight:"bold"},inserted:{color:"#80cbc4"},keyword:{color:"#c792ea",fontStyle:"italic"},number:{color:"#fd9170"},operator:{color:"#89ddff"},prolog:{color:"#546e7a"},property:{color:"#80cbc4"},"pseudo-class":{color:"#c3e88d"},"pseudo-element":{color:"#c3e88d"},punctuation:{color:"#89ddff"},regex:{color:"#f2ff00"},selector:{color:"#f07178"},string:{color:"#c3e88d"},symbol:{color:"#c792ea"},tag:{color:"#f07178"},unit:{color:"#f07178"},url:{color:"#fd9170"},variable:{color:"#f07178"}}},"321L":function(e,t,n){e.exports=n("0So9")},"33Zt":function(e,t,n){"use strict";var o=n("E/Jm"),r=n("2N74"),a=n("yRGd"),i={name:"thematicBreak",tokenize:function(e,t,n){var i,s=0;return function(t){return e.enter("thematicBreak"),i=t,l(t)};function l(u){return u===i?(e.enter("thematicBreakSequence"),c(u)):r(u)?a(e,l,"whitespace")(u):s<3||null!==u&&!o(u)?n(u):(e.exit("thematicBreak"),t(u))}function c(t){return t===i?(e.consume(t),s++,c):(e.exit("thematicBreakSequence"),l(t))}}};e.exports=i},"38Ti":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{color:"#fff",textShadow:"0 1px 1px #000",fontFamily:'Menlo, Monaco, "Courier New", monospace',direction:"ltr",textAlign:"left",wordSpacing:"normal",whiteSpace:"pre",wordWrap:"normal",lineHeight:"1.4",background:"none",border:"0",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#fff",textShadow:"0 1px 1px #000",fontFamily:'Menlo, Monaco, "Courier New", monospace',direction:"ltr",textAlign:"left",wordSpacing:"normal",whiteSpace:"pre",wordWrap:"normal",lineHeight:"1.4",background:"#222",border:"0",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"15px",margin:"1em 0",overflow:"auto",MozBorderRadius:"8px",WebkitBorderRadius:"8px",borderRadius:"8px"},'pre[class*="language-"] code':{float:"left",padding:"0 15px 0 0"},':not(pre) > code[class*="language-"]':{background:"#222",padding:"5px 10px",lineHeight:"1",MozBorderRadius:"3px",WebkitBorderRadius:"3px",borderRadius:"3px"},comment:{color:"#797979"},prolog:{color:"#797979"},doctype:{color:"#797979"},cdata:{color:"#797979"},selector:{color:"#fff"},operator:{color:"#fff"},punctuation:{color:"#fff"},namespace:{Opacity:".7"},tag:{color:"#ffd893"},boolean:{color:"#ffd893"},atrule:{color:"#B0C975"},"attr-value":{color:"#B0C975"},hex:{color:"#B0C975"},string:{color:"#B0C975"},property:{color:"#c27628"},entity:{color:"#c27628",cursor:"help"},url:{color:"#c27628"},"attr-name":{color:"#c27628"},keyword:{color:"#c27628"},regex:{color:"#9B71C6"},function:{color:"#e5a638"},constant:{color:"#e5a638"},variable:{color:"#fdfba8"},number:{color:"#8799B0"},important:{color:"#E45734"},deliminator:{color:"#E45734"},"pre[data-line]":{position:"relative",padding:"1em 0 1em 3em"},".line-highlight":{position:"absolute",left:"0",right:"0",marginTop:"1em",background:"rgba(255, 255, 255, .2)",pointerEvents:"none",lineHeight:"inherit",whiteSpace:"pre"},".line-highlight:before":{content:"attr(data-start)",position:"absolute",top:".3em",left:".6em",minWidth:"1em",padding:"0 .5em",backgroundColor:"rgba(255, 255, 255, .3)",color:"#fff",font:"bold 65%/1.5 sans-serif",textAlign:"center",MozBorderRadius:"8px",WebkitBorderRadius:"8px",borderRadius:"8px",textShadow:"none"},".line-highlight[data-end]:after":{content:"attr(data-end)",position:"absolute",top:"auto",left:".6em",minWidth:"1em",padding:"0 .5em",backgroundColor:"rgba(255, 255, 255, .3)",color:"#fff",font:"bold 65%/1.5 sans-serif",textAlign:"center",MozBorderRadius:"8px",WebkitBorderRadius:"8px",borderRadius:"8px",textShadow:"none",bottom:".4em"},".line-numbers-rows":{margin:"0"},".line-numbers-rows span":{paddingRight:"10px",borderRight:"3px #d9d336 solid"}}},"3HEo":function(e,t,n){"use strict";var o=n("ZkSf");e.exports=function(e,t){return function(e){return t;function t(t){var n=t&&a(t);return n&&r.call(e,n)?e[n]:null}}(function(e){var t={};if(!e||!e.type)throw new Error("mdast-util-definitions expected node");return o(e,"definition",n),t;function n(e){var n=a(e.identifier);r.call(t,n)||(t[n]=e)}}(e))};var r={}.hasOwnProperty;function a(e){return e.toUpperCase()}},"3iNw":function(e,t,n){"use strict";var o=n("hq1P"),r=n("Ny5O"),a=n("E/Jm"),i=n("Q3zd"),s=n("2N74"),l=n("yRGd"),c={name:"htmlText",tokenize:function(e,t,n){var c,u,d,p,f=this;return function(t){return e.enter("htmlText"),e.enter("htmlTextData"),e.consume(t),h};function h(t){return 33===t?(e.consume(t),m):47===t?(e.consume(t),N):63===t?(e.consume(t),x):o(t)?(e.consume(t),R):n(t)}function m(t){return 45===t?(e.consume(t),g):91===t?(e.consume(t),u="CDATA[",d=0,k):o(t)?(e.consume(t),C):n(t)}function g(t){return 45===t?(e.consume(t),T):n(t)}function T(t){return null===t||62===t?n(t):45===t?(e.consume(t),E):b(t)}function E(e){return null===e||62===e?n(e):b(e)}function b(t){return null===t?n(t):45===t?(e.consume(t),A):a(t)?(p=b,B(t)):(e.consume(t),b)}function A(t){return 45===t?(e.consume(t),U):b(t)}function k(t){return t===u.charCodeAt(d++)?(e.consume(t),d===u.length?y:k):n(t)}function y(t){return null===t?n(t):93===t?(e.consume(t),S):a(t)?(p=y,B(t)):(e.consume(t),y)}function S(t){return 93===t?(e.consume(t),_):y(t)}function _(t){return 62===t?U(t):93===t?(e.consume(t),_):y(t)}function C(t){return null===t||62===t?U(t):a(t)?(p=C,B(t)):(e.consume(t),C)}function x(t){return null===t?n(t):63===t?(e.consume(t),O):a(t)?(p=x,B(t)):(e.consume(t),x)}function O(e){return 62===e?U(e):x(e)}function N(t){return o(t)?(e.consume(t),v):n(t)}function v(t){return 45===t||r(t)?(e.consume(t),v):M(t)}function M(t){return a(t)?(p=M,B(t)):s(t)?(e.consume(t),M):U(t)}function R(t){return 45===t||r(t)?(e.consume(t),R):47===t||62===t||i(t)?w(t):n(t)}function w(t){return 47===t?(e.consume(t),U):58===t||95===t||o(t)?(e.consume(t),I):a(t)?(p=w,B(t)):s(t)?(e.consume(t),w):U(t)}function I(t){return 45===t||46===t||58===t||95===t||r(t)?(e.consume(t),I):L(t)}function L(t){return 61===t?(e.consume(t),P):a(t)?(p=L,B(t)):s(t)?(e.consume(t),L):w(t)}function P(t){return null===t||60===t||61===t||62===t||96===t?n(t):34===t||39===t?(e.consume(t),c=t,H):a(t)?(p=P,B(t)):s(t)?(e.consume(t),P):(e.consume(t),c=void 0,F)}function H(t){return t===c?(e.consume(t),D):null===t?n(t):a(t)?(p=H,B(t)):(e.consume(t),H)}function D(e){return 62===e||47===e||i(e)?w(e):n(e)}function F(t){return null===t||34===t||39===t||60===t||61===t||96===t?n(t):62===t||i(t)?w(t):(e.consume(t),F)}function B(t){return e.exit("htmlTextData"),e.enter("lineEnding"),e.consume(t),e.exit("lineEnding"),l(e,z,"linePrefix",f.parser.constructs.disable.null.indexOf("codeIndented")>-1?void 0:4)}function z(t){return e.enter("htmlTextData"),p(t)}function U(o){return 62===o?(e.consume(o),e.exit("htmlTextData"),e.exit("htmlText"),t):n(o)}}};e.exports=c},"4+h/":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#faf8f5",color:"#728fcb"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#faf8f5",color:"#728fcb",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#faf8f5"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#faf8f5"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#faf8f5"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#faf8f5"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#faf8f5"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#faf8f5"},'code[class*="language-"]::selection':{textShadow:"none",background:"#faf8f5"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#faf8f5"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#b6ad9a"},prolog:{color:"#b6ad9a"},doctype:{color:"#b6ad9a"},cdata:{color:"#b6ad9a"},punctuation:{color:"#b6ad9a"},namespace:{Opacity:".7"},tag:{color:"#063289"},operator:{color:"#063289"},number:{color:"#063289"},property:{color:"#b29762"},function:{color:"#b29762"},"tag-id":{color:"#2d2006"},selector:{color:"#2d2006"},"atrule-id":{color:"#2d2006"},"code.language-javascript":{color:"#896724"},"attr-name":{color:"#896724"},"code.language-css":{color:"#728fcb"},"code.language-scss":{color:"#728fcb"},boolean:{color:"#728fcb"},string:{color:"#728fcb"},entity:{color:"#728fcb",cursor:"help"},url:{color:"#728fcb"},".language-css .token.string":{color:"#728fcb"},".language-scss .token.string":{color:"#728fcb"},".style .token.string":{color:"#728fcb"},"attr-value":{color:"#728fcb"},keyword:{color:"#728fcb"},control:{color:"#728fcb"},directive:{color:"#728fcb"},unit:{color:"#728fcb"},statement:{color:"#728fcb"},regex:{color:"#728fcb"},atrule:{color:"#728fcb"},placeholder:{color:"#93abdc"},variable:{color:"#93abdc"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #2d2006",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#896724"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid #896724",OutlineOffset:".4em"},".line-numbers .line-numbers-rows":{borderRightColor:"#ece8de"},".line-numbers-rows > span:before":{color:"#cdc4b1"},".line-highlight":{background:"linear-gradient(to right, rgba(45, 32, 6, 0.2) 70%, rgba(45, 32, 6, 0))"}}},"42yH":function(e,t,n){"use strict";var o=n("WtKE"),r=n("Ny5O"),a=n("ljYj"),i=n("QB/b");function s(e){return e&&"object"===typeof e&&"default"in e?e:{default:e}}var l=s(o),c={name:"characterReference",tokenize:function(e,t,n){var o,s,c=this,u=0;return function(t){return e.enter("characterReference"),e.enter("characterReferenceMarker"),e.consume(t),e.exit("characterReferenceMarker"),d};function d(t){return 35===t?(e.enter("characterReferenceMarkerNumeric"),e.consume(t),e.exit("characterReferenceMarkerNumeric"),p):(e.enter("characterReferenceValue"),o=31,s=r,f(t))}function p(t){return 88===t||120===t?(e.enter("characterReferenceMarkerHexadecimal"),e.consume(t),e.exit("characterReferenceMarkerHexadecimal"),e.enter("characterReferenceValue"),o=6,s=i,f):(e.enter("characterReferenceValue"),o=7,s=a,f(t))}function f(a){var i;return 59===a&&u?(i=e.exit("characterReferenceValue"),s!==r||l.default(c.sliceSerialize(i))?(e.enter("characterReferenceMarker"),e.consume(a),e.exit("characterReferenceMarker"),e.exit("characterReference"),t):n(a)):s(a)&&u++P&&(P=d);++up)&&(L[u]=f)),w.push(h);M[N]=w,R[N]=I}var H;if(u=-1,d=P,"object"===typeof _&&"length"in _)for(;++uL[u]&&(L[u]=f),I[u]=f),w[u]=h;M.splice(1,0,w),R.splice(1,0,I),N=-1,v=M.length,m=[];for(;++N=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=n("q1tI"),s=n.n(i),l=n("6x+I"),c=n.n(l),u=n("jaOS"),d=n("o0o1"),p=n.n(d),f=n("yXPU"),h=n.n(f),m=n("pVnL"),g=n.n(m),T=n("lwsE"),E=n.n(T),b=n("W8MJ"),A=n.n(b),k=n("a1gu"),y=n.n(k),S=n("Nsbk"),_=n.n(S),C=n("7W2i"),x=n.n(C),O=n("lSNA"),N=n.n(O),v=n("QILm"),M=n.n(v),R=n("MVZn"),w=n.n(R);function I(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0;return e.reduce((function(e,t){return w()({},e,n[t])}),t)}function L(e){return e.join(" ")}function P(e){var t=e.node,n=e.stylesheet,o=e.style,r=void 0===o?{}:o,a=e.useInlineStyles,i=e.key,l=t.properties,c=t.type,u=t.tagName,d=t.value;if("text"===c)return d;if(u){var p=function(e,t){var n=0;return function(o){return n+=1,o.map((function(o,r){return P({node:o,stylesheet:e,useInlineStyles:t,key:"code-segment-".concat(n,"-").concat(r)})}))}}(n,a),f=a&&l.className&&l.className.filter((function(e){return!n[e]})),h=f&&f.length?f:void 0,m=a?w()({},l,{className:h&&L(h)},{style:I(l.className,Object.assign({},l.style,r),n)}):w()({},l,{className:L(l.className)}),T=p(t.children);return s.a.createElement(u,g()({key:i},m),T)}}var H=/\n/g;function D(e){var t=e.codeString,n=e.codeStyle,o=e.containerStyle,r=void 0===o?{float:"left",paddingRight:"10px"}:o,a=e.numberStyle,i=void 0===a?{}:a,l=e.startingLineNumber;return s.a.createElement("code",{style:Object.assign({},n,r)},function(e){var t=e.lines,n=e.startingLineNumber,o=e.style;return t.map((function(e,t){var r=t+n;return s.a.createElement("span",{key:"line-".concat(t),className:"react-syntax-highlighter-line-number",style:"function"===typeof o?o(r):o},"".concat(r,"\n"))}))}({lines:t.replace(/\n$/,"").split("\n"),style:i,startingLineNumber:l}))}function F(e){var t=e.toString().length;return"".concat(t,"em")}function B(e,t){return{type:"element",tagName:"span",properties:{key:"line-number--".concat(e),className:["comment","linenumber","react-syntax-highlighter-line-number"],style:t},children:[{type:"text",value:e}]}}function z(e,t,n){var o={display:"inline-block",minWidth:F(n),paddingRight:"1em",textAlign:"right",userSelect:"none"},r="function"===typeof e?e(t):e;return w()({},o,r)}function U(e){var t=e.children,n=e.lineNumber,o=e.lineNumberStyle,r=e.largestLineNumber,a=e.showInlineLineNumbers,i=e.lineProps,s=void 0===i?{}:i,l=e.className,c=void 0===l?[]:l,u="function"===typeof s?s(n):s;if(u.className=c,n&&a){var d=z(o,n,r);t.unshift(B(n,d))}return{type:"element",tagName:"span",properties:u,children:t}}function G(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],o=0;o2&&void 0!==arguments[2]?arguments[2]:[];return U({children:e,lineNumber:t,lineNumberStyle:s,largestLineNumber:i,showInlineLineNumbers:r,lineProps:n,className:o})}function h(e,t){if(t&&r){var n=z(s,t,i);e.unshift(B(t,n))}return e}function m(e,n){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];return t||o.length>0?f(e,n,o):h(e,n)}for(var g=function(){var e=c[p],t=e.children[0].value;if(t.match(H)){var n=t.split("\n");n.forEach((function(t,r){var i=o&&u.length+a,s={type:"text",value:"".concat(t,"\n")};if(0===r){var l=m(c.slice(d+1,p).concat(U({children:[s],className:e.properties.className})),i);u.push(l)}else if(r===n.length-1){if(c[p+1]&&c[p+1].children&&c[p+1].children[0]){var f=U({children:[{type:"text",value:"".concat(t)}],className:e.properties.className});c.splice(p+1,0,f)}else{var h=m([s],i,e.properties.className);u.push(h)}}else{var g=m([s],i,e.properties.className);u.push(g)}})),d=p}p++};p-1?void 0:4)(r)}}},exit:function(e){e.exit(this.containerState.type)}},d={tokenize:function(e,t,n){var o=this;return s(e,(function(e){return r(e)||!a(o.events,"listItemPrefixWhitespace")?n(e):t(e)}),"listItemPrefixWhitespace",o.parser.constructs.disable.null.indexOf("codeIndented")>-1?void 0:5)},partial:!0},p={tokenize:function(e,t,n){var o=this;return s(e,(function(e){return a(o.events,"listItemIndent")===o.containerState.size?t(e):n(e)}),"listItemIndent",o.containerState.size+1)},partial:!0};e.exports=u},"5pEW":function(e,t,n){"use strict";var o=n("NOby"),r=n("E/Jm"),a=n("HtLg"),i=n("Vx/6"),s=n("pe0m"),l=n("Ig3s"),c=n("FE4A"),u=n("T0BQ"),d=n("20u5");e.exports=function(e,t,n){var p=n?u(n):{line:1,column:1,offset:0},f={},h=[],m=[],g=[],T={consume:function(e){r(e)?(p.line++,p.column=1,p.offset+=-3===e?2:1,O()):-1!==e&&(p.column++,p.offset++);p._bufferIndex<0?p._index++:(p._bufferIndex++,p._bufferIndex===m[p._index].length&&(p._bufferIndex=-1,p._index++));E.previous=e},enter:function(e,t){var n=t||{};return n.type=e,n.start=k(),E.events.push(["enter",n,E]),g.push(n),n},exit:function(e){var t=g.pop();return t.end=k(),E.events.push(["exit",t,E]),t},attempt:C((function(e,t){x(e,t.from)})),check:C(_),interrupt:C(_,{interrupt:!0}),lazy:C(_,{lazy:!0})},E={previous:null,events:[],parser:e,sliceStream:A,sliceSerialize:function(e){return c(A(e))},now:k,defineSkip:function(e){f[e.line]=e.column,O()},write:function(e){if(m=a(m,e),y(),null!==m[m.length-1])return[];return x(t,0),E.events=l(h,E.events,E),E.events}},b=t.tokenize.call(E,T);return t.resolveAll&&h.push(t),p._index=0,p._bufferIndex=-1,E;function A(e){return d(m,e)}function k(){return u(p)}function y(){for(var e,t;p._index-1)return m();return e.tokenize.call(t?o({},E,t):E,T,h,m)(n)}}function h(t){return e(c,u),r}function m(e){return u.restore(),++lcode':{position:"relative",borderLeft:"10px solid #358ccb",boxShadow:"-1px 0px 0px 0px #358ccb, 0px 0px 0px 1px #dfdfdf",backgroundColor:"#fdfdfd",backgroundImage:"linear-gradient(transparent 50%, rgba(69, 142, 209, 0.04) 50%)",backgroundSize:"3em 3em",backgroundOrigin:"content-box",backgroundAttachment:"local"},':not(pre) > code[class*="language-"]':{backgroundColor:"#fdfdfd",WebkitBoxSizing:"border-box",MozBoxSizing:"border-box",boxSizing:"border-box",marginBottom:"1em",position:"relative",padding:".2em",borderRadius:"0.3em",color:"#c92c2c",border:"1px solid rgba(0, 0, 0, 0.1)",display:"inline",whiteSpace:"normal"},'pre[class*="language-"]:before':{content:"''",zIndex:"-2",display:"block",position:"absolute",bottom:"0.75em",left:"0.18em",width:"40%",height:"20%",maxHeight:"13em",boxShadow:"0px 13px 8px #979797",WebkitTransform:"rotate(-2deg)",MozTransform:"rotate(-2deg)",msTransform:"rotate(-2deg)",OTransform:"rotate(-2deg)",transform:"rotate(-2deg)"},'pre[class*="language-"]:after':{content:"''",zIndex:"-2",display:"block",position:"absolute",bottom:"0.75em",left:"auto",width:"40%",height:"20%",maxHeight:"13em",boxShadow:"0px 13px 8px #979797",WebkitTransform:"rotate(2deg)",MozTransform:"rotate(2deg)",msTransform:"rotate(2deg)",OTransform:"rotate(2deg)",transform:"rotate(2deg)",right:"0.75em"},comment:{color:"#7D8B99"},"block-comment":{color:"#7D8B99"},prolog:{color:"#7D8B99"},doctype:{color:"#7D8B99"},cdata:{color:"#7D8B99"},punctuation:{color:"#5F6364"},property:{color:"#c92c2c"},tag:{color:"#c92c2c"},boolean:{color:"#c92c2c"},number:{color:"#c92c2c"},"function-name":{color:"#c92c2c"},constant:{color:"#c92c2c"},symbol:{color:"#c92c2c"},deleted:{color:"#c92c2c"},selector:{color:"#2f9c0a"},"attr-name":{color:"#2f9c0a"},string:{color:"#2f9c0a"},char:{color:"#2f9c0a"},function:{color:"#2f9c0a"},builtin:{color:"#2f9c0a"},inserted:{color:"#2f9c0a"},operator:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},entity:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)",cursor:"help"},url:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},variable:{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},atrule:{color:"#1990b8"},"attr-value":{color:"#1990b8"},keyword:{color:"#1990b8"},"class-name":{color:"#1990b8"},regex:{color:"#e90"},important:{color:"#e90",fontWeight:"normal"},".language-css .token.string":{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},".style .token.string":{color:"#a67f59",background:"rgba(255, 255, 255, 0.5)"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},namespace:{Opacity:".7"},'pre[class*="language-"].line-numbers.line-numbers':{paddingLeft:"0"},'pre[class*="language-"].line-numbers.line-numbers code':{paddingLeft:"3.8em"},'pre[class*="language-"].line-numbers.line-numbers .line-numbers-rows':{left:"0"},'pre[class*="language-"][data-line]':{paddingTop:"0",paddingBottom:"0",paddingLeft:"0"},"pre[data-line] code":{position:"relative",paddingLeft:"4em"},"pre .line-highlight":{marginTop:"0"}}},"6MAg":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{color:"black",background:"none",textShadow:"0 1px white",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"black",background:"#f5f2f0",textShadow:"0 1px white",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#b3d4fc"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#b3d4fc"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#b3d4fc"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#b3d4fc"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#b3d4fc"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#b3d4fc"},'code[class*="language-"]::selection':{textShadow:"none",background:"#b3d4fc"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#b3d4fc"},':not(pre) > code[class*="language-"]':{background:"#f5f2f0",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"slategray"},prolog:{color:"slategray"},doctype:{color:"slategray"},cdata:{color:"slategray"},punctuation:{color:"#999"},namespace:{Opacity:".7"},property:{color:"#905"},tag:{color:"#905"},boolean:{color:"#905"},number:{color:"#905"},constant:{color:"#905"},symbol:{color:"#905"},deleted:{color:"#905"},selector:{color:"#690"},"attr-name":{color:"#690"},string:{color:"#690"},char:{color:"#690"},builtin:{color:"#690"},inserted:{color:"#690"},operator:{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},entity:{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)",cursor:"help"},url:{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},".language-css .token.string":{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},".style .token.string":{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},atrule:{color:"#07a"},"attr-value":{color:"#07a"},keyword:{color:"#07a"},function:{color:"#DD4A68"},"class-name":{color:"#DD4A68"},regex:{color:"#e90"},important:{color:"#e90",fontWeight:"bold"},variable:{color:"#e90"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}}},"6dBs":function(e,t,n){"use strict";var o=Object.prototype.hasOwnProperty,r=Object.prototype.toString,a=Object.defineProperty,i=Object.getOwnPropertyDescriptor,s=function(e){return"function"===typeof Array.isArray?Array.isArray(e):"[object Array]"===r.call(e)},l=function(e){if(!e||"[object Object]"!==r.call(e))return!1;var t,n=o.call(e,"constructor"),a=e.constructor&&e.constructor.prototype&&o.call(e.constructor.prototype,"isPrototypeOf");if(e.constructor&&!n&&!a)return!1;for(t in e);return"undefined"===typeof t||o.call(e,t)},c=function(e,t){a&&"__proto__"===t.name?a(e,t.name,{enumerable:!0,configurable:!0,value:t.newValue,writable:!0}):e[t.name]=t.newValue},u=function(e,t){if("__proto__"===t){if(!o.call(e,t))return;if(i)return i(e,t).value}return e[t]};e.exports=function e(){var t,n,o,r,a,i,d=arguments[0],p=1,f=arguments.length,h=!1;for("boolean"===typeof d&&(h=d,d=arguments[1]||{},p=2),(null==d||"object"!==typeof d&&"function"!==typeof d)&&(d={});p for more info)`),delete h[o]}const t=a().use(i).use(e.remarkPlugins||e.plugins||[]).use(s,{allowDangerousHtml:!0}).use(e.rehypePlugins||[]).use(u,e);let n;"string"===typeof e.children?n=r(e.children):(void 0!==e.children&&null!==e.children&&console.warn(`[react-markdown] Warning: please pass a string as \`children\` (not: \`${e.children}\`)`),n=r());const l=t.runSync(t.parse(n),n);if("root"!==l.type)throw new TypeError("Expected a `root` node");let d=o.createElement(o.Fragment,{},p({options:e,schema:c,listDepth:0},l));return e.className&&(d=o.createElement("div",{className:e.className},d)),d}m.defaultProps={transformLinkUri:d},m.propTypes={children:l.string,className:l.string,allowElement:l.func,allowedElements:l.arrayOf(l.string),disallowedElements:l.arrayOf(l.string),unwrapDisallowed:l.bool,remarkPlugins:l.arrayOf(l.oneOfType([l.object,l.func,l.arrayOf(l.oneOfType([l.object,l.func]))])),rehypePlugins:l.arrayOf(l.oneOfType([l.object,l.func,l.arrayOf(l.oneOfType([l.object,l.func]))])),sourcePos:l.bool,rawSourcePos:l.bool,skipHtml:l.bool,includeElementIndex:l.bool,transformLinkUri:l.oneOfType([l.func,l.bool]),linkTarget:l.oneOfType([l.func,l.string]),transformImageUri:l.func,components:l.object},m.uriTransformer=d},"7+hk":function(e,t,n){"use strict";var o=n("z2ZG"),r=n("du5t"),a=n("eAD1"),i=n("dXJL"),s=n("bHgY"),l=n("RXC2");e.exports=o([a,r,i,s,l])},"7J+x":function(e,t){e.exports=function(e){var t,n;e._compiled||(t=e.before?"(?:"+e.before+")":"",n=e.after?"(?:"+e.after+")":"",e.atBreak&&(t="[\\r\\n][\\t ]*"+t),e._compiled=new RegExp((t?"("+t+")":"")+(/[|\\{}()[\]^$+*?.-]/.test(e.character)?"\\":"")+e.character+(n||""),"g"));return e._compiled}},"7enW":function(e,t,n){"use strict";var o={name:"labelStartImage",tokenize:function(e,t,n){var o=this;return function(t){return e.enter("labelImage"),e.enter("labelImageMarker"),e.consume(t),e.exit("labelImageMarker"),r};function r(t){return 91===t?(e.enter("labelMarker"),e.consume(t),e.exit("labelMarker"),e.exit("labelImage"),a):n(t)}function a(e){return 94===e&&"_hiddenFootnoteSupport"in o.parser.constructs?n(e):t(e)}},resolveAll:n("OaLn").resolveAll};e.exports=o},"7nPM":function(e,t,n){"use strict";e.exports=function(e){var t=String(e),n=[],o=/\r?\n|\r/g;for(;o.exec(t);)n.push(o.lastIndex);return n.push(t.length+1),{toPoint:r,toPosition:r,toOffset:function(e){var t,o=e&&e.line,r=e&&e.column;isNaN(o)||isNaN(r)||!(o-1 in n)||(t=(n[o-2]||0)+r-1||0);return t>-1&&t-1&&ee)return{line:t+1,column:e-(n[t-1]||0)+1,offset:e};return{}}}},"8Kt/":function(e,t,n){"use strict";var o=n("lSNA");function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}t.__esModule=!0,t.defaultHead=p,t.default=void 0;var a,i=function(e){if(e&&e.__esModule)return e;if(null===e||"object"!==typeof e&&"function"!==typeof e)return{default:e};var t=d();if(t&&t.has(e))return t.get(e);var n={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var r in e)if(Object.prototype.hasOwnProperty.call(e,r)){var a=o?Object.getOwnPropertyDescriptor(e,r):null;a&&(a.get||a.set)?Object.defineProperty(n,r,a):n[r]=e[r]}n.default=e,t&&t.set(e,n);return n}(n("q1tI")),s=(a=n("Xuae"))&&a.__esModule?a:{default:a},l=n("lwAK"),c=n("FYa8"),u=n("/0+H");function d(){if("function"!==typeof WeakMap)return null;var e=new WeakMap;return d=function(){return e},e}function p(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=[i.default.createElement("meta",{charSet:"utf-8"})];return e||t.push(i.default.createElement("meta",{name:"viewport",content:"width=device-width"})),t}function f(e,t){return"string"===typeof t||"number"===typeof t?e:t.type===i.default.Fragment?e.concat(i.default.Children.toArray(t.props.children).reduce((function(e,t){return"string"===typeof t||"number"===typeof t?e:e.concat(t)}),[])):e.concat(t)}var h=["name","httpEquiv","charSet","itemProp"];function m(e,t){return e.reduce((function(e,t){var n=i.default.Children.toArray(t.props.children);return e.concat(n)}),[]).reduce(f,[]).reverse().concat(p(t.inAmpMode)).filter(function(){var e=new Set,t=new Set,n=new Set,o={};return function(r){var a=!0,i=!1;if(r.key&&"number"!==typeof r.key&&r.key.indexOf("$")>0){i=!0;var s=r.key.slice(r.key.indexOf("$")+1);e.has(s)?a=!1:e.add(s)}switch(r.type){case"title":case"base":t.has(r.type)?a=!1:t.add(r.type);break;case"meta":for(var l=0,c=h.length;l code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#435643"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#435643"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#435643"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#435643"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#435643"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#435643"},'code[class*="language-"]::selection':{textShadow:"none",background:"#435643"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#435643"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#535f53"},prolog:{color:"#535f53"},doctype:{color:"#535f53"},cdata:{color:"#535f53"},punctuation:{color:"#535f53"},namespace:{Opacity:".7"},tag:{color:"#a2b34d"},operator:{color:"#a2b34d"},number:{color:"#a2b34d"},property:{color:"#687d68"},function:{color:"#687d68"},"tag-id":{color:"#f0fff0"},selector:{color:"#f0fff0"},"atrule-id":{color:"#f0fff0"},"code.language-javascript":{color:"#b3d6b3"},"attr-name":{color:"#b3d6b3"},"code.language-css":{color:"#e5fb79"},"code.language-scss":{color:"#e5fb79"},boolean:{color:"#e5fb79"},string:{color:"#e5fb79"},entity:{color:"#e5fb79",cursor:"help"},url:{color:"#e5fb79"},".language-css .token.string":{color:"#e5fb79"},".language-scss .token.string":{color:"#e5fb79"},".style .token.string":{color:"#e5fb79"},"attr-value":{color:"#e5fb79"},keyword:{color:"#e5fb79"},control:{color:"#e5fb79"},directive:{color:"#e5fb79"},unit:{color:"#e5fb79"},statement:{color:"#e5fb79"},regex:{color:"#e5fb79"},atrule:{color:"#e5fb79"},placeholder:{color:"#e5fb79"},variable:{color:"#e5fb79"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #f0fff0",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#b3d6b3"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid #5c705c",OutlineOffset:".4em"},".line-numbers .line-numbers-rows":{borderRightColor:"#2c302c"},".line-numbers-rows > span:before":{color:"#3b423b"},".line-highlight":{background:"linear-gradient(to right, rgba(162, 179, 77, 0.2) 70%, rgba(162, 179, 77, 0))"}}},"9SNS":function(e,t,n){"use strict";e.exports=function(e){return e<32||127===e}},"9kwo":function(e,t,n){"use strict";const o=n("HwUZ");e.exports=class extends o{constructor(e,t){super(e),this.posTracker=null,this.onParseError=t.onParseError}_setErrorLocation(e){e.startLine=e.endLine=this.posTracker.line,e.startCol=e.endCol=this.posTracker.col,e.startOffset=e.endOffset=this.posTracker.offset}_reportError(e){const t={code:e,startLine:-1,startCol:-1,startOffset:-1,endLine:-1,endCol:-1,endOffset:-1};this._setErrorLocation(t),this.onParseError(t)}_getOverriddenMethods(e){return{_err(t){e._reportError(t)}}}}},"9ppO":function(e,t,n){"use strict";var o=n("E/Jm"),r=n("yRGd");e.exports=function(e,t,n,a,i,s){var l;return function(t){return e.enter(a),e.enter(i),e.consume(t),e.exit(i),l=40===t?41:t,c};function c(n){return n===l?(e.enter(i),e.consume(n),e.exit(i),e.exit(a),t):(e.enter(s),u(n))}function u(t){return t===l?(e.exit(s),c(l)):null===t?n(t):o(t)?(e.enter("lineEnding"),e.consume(t),e.exit("lineEnding"),r(e,u,"linePrefix")):(e.enter("chunkString",{contentType:"string"}),d(t))}function d(t){return t===l||null===t||o(t)?(e.exit("chunkString"),u(t)):(e.consume(t),92===t?p:d)}function p(t){return t===l||92===t?(e.consume(t),d):d(t)}}},A0ZL:function(e,t,n){"use strict";class o{constructor(e){this.length=0,this.entries=[],this.treeAdapter=e,this.bookmark=null}_getNoahArkConditionCandidates(e){const t=[];if(this.length>=3){const n=this.treeAdapter.getAttrList(e).length,r=this.treeAdapter.getTagName(e),a=this.treeAdapter.getNamespaceURI(e);for(let e=this.length-1;e>=0;e--){const i=this.entries[e];if(i.type===o.MARKER_ENTRY)break;const s=i.element,l=this.treeAdapter.getAttrList(s);this.treeAdapter.getTagName(s)===r&&this.treeAdapter.getNamespaceURI(s)===a&&l.length===n&&t.push({idx:e,attrs:l})}}return t.length<3?[]:t}_ensureNoahArkCondition(e){const t=this._getNoahArkConditionCandidates(e);let n=t.length;if(n){const o=this.treeAdapter.getAttrList(e),r=o.length,a=Object.create(null);for(let e=0;e=2;e--)this.entries.splice(t[e].idx,1),this.length--}}insertMarker(){this.entries.push({type:o.MARKER_ENTRY}),this.length++}pushElement(e,t){this._ensureNoahArkCondition(e),this.entries.push({type:o.ELEMENT_ENTRY,element:e,token:t}),this.length++}insertElementAfterBookmark(e,t){let n=this.length-1;for(;n>=0&&this.entries[n]!==this.bookmark;n--);this.entries.splice(n+1,0,{type:o.ELEMENT_ENTRY,element:e,token:t}),this.length++}removeEntry(e){for(let t=this.length-1;t>=0;t--)if(this.entries[t]===e){this.entries.splice(t,1),this.length--;break}}clearToLastMarker(){for(;this.length;){const e=this.entries.pop();if(this.length--,e.type===o.MARKER_ENTRY)break}}getElementEntryInScopeWithTagName(e){for(let t=this.length-1;t>=0;t--){const n=this.entries[t];if(n.type===o.MARKER_ENTRY)return null;if(this.treeAdapter.getTagName(n.element)===e)return n}return null}getElementEntry(e){for(let t=this.length-1;t>=0;t--){const n=this.entries[t];if(n.type===o.ELEMENT_ENTRY&&n.element===e)return n}return null}}o.MARKER_ENTRY="MARKER_ENTRY",o.ELEMENT_ENTRY="ELEMENT_ENTRY",e.exports=o},ADT3:function(e,t,n){"use strict";e.exports=function(e,t,n,o){var r,a;"string"===typeof t||t&&"function"===typeof t.exec?a=[[t,n]]:(a=t,o=n);return s(e,r=o||{},function e(t){var n=t[0];return o;function o(o,a){var l,c,u,d,p=n[0],f=n[1],h=[],m=0,g=a.children.indexOf(o);for(p.lastIndex=0,c=p.exec(o.value);c&&(l=c.index,!1!==(d=f.apply(null,[].concat(c,{index:c.index,input:c.input})))&&(m!==l&&h.push({type:"text",value:o.value.slice(m,l)}),"string"===typeof d&&d.length>0&&(d={type:"text",value:d}),d&&(h=[].concat(h,d)),m=l+c[0].length),p.global);)c=p.exec(o.value);if(void 0===l?(h=[o],g--):(m1)for(u=e(t.slice(1)),l=-1;++lString(e))).join("")),!A&&s.rawSourcePos&&(u.sourcePosition=t.position),!A&&s.includeElementIndex&&(u.index=m(i,t),u.siblingCount=m(i)),A||(u.node=t),T.length>0?o.createElement(b,u,T):o.createElement(b,u)}function m(e,t){let n=-1,o=0;for(;++n(Object.keys(t).forEach((n=>{e[n]=t[n]})),e)),Object.create(null))}},B5Lt:function(e,t,n){e.exports=function(e,t){var n,r=e.children||[],a=[],i=-1;for(;++i code[class*="language-"]':{backgroundColor:"transparent !important",backgroundImage:"linear-gradient(to bottom, #2a2139 75%, #34294f)",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"#8e8e8e"},"block-comment":{color:"#8e8e8e"},prolog:{color:"#8e8e8e"},doctype:{color:"#8e8e8e"},cdata:{color:"#8e8e8e"},punctuation:{color:"#ccc"},tag:{color:"#e2777a"},"attr-name":{color:"#e2777a"},namespace:{color:"#e2777a"},number:{color:"#e2777a"},unit:{color:"#e2777a"},hexcode:{color:"#e2777a"},deleted:{color:"#e2777a"},property:{color:"#72f1b8",textShadow:"0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475"},selector:{color:"#72f1b8",textShadow:"0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475"},"function-name":{color:"#6196cc"},boolean:{color:"#fdfdfd",textShadow:"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975"},"selector .token.id":{color:"#fdfdfd",textShadow:"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975"},function:{color:"#fdfdfd",textShadow:"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975"},"class-name":{color:"#fff5f6",textShadow:"0 0 2px #000, 0 0 10px #fc1f2c75, 0 0 5px #fc1f2c75, 0 0 25px #fc1f2c75"},constant:{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"},symbol:{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"},important:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575",fontWeight:"bold"},atrule:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"},keyword:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"},"selector .token.class":{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"},builtin:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"},string:{color:"#f87c32"},char:{color:"#f87c32"},"attr-value":{color:"#f87c32"},regex:{color:"#f87c32"},variable:{color:"#f87c32"},operator:{color:"#67cdcc"},entity:{color:"#67cdcc",cursor:"help"},url:{color:"#67cdcc"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},inserted:{color:"green"}}},BfbN:function(e,t,n){"use strict";var o=i("start"),r=i("end");function a(e){return{start:o(e),end:r(e)}}function i(e){return t.displayName=e,t;function t(t){var n=t&&t.position&&t.position[e]||{};return{line:n.line||null,column:n.column||null,offset:isNaN(n.offset)?null:n.offset}}}e.exports=a,a.start=o,a.end=r},Bh6z:function(e,t,n){"use strict";e.exports=function(e){return e.replace(/[\t\n\r ]+/g," ").replace(/^ | $/g,"").toLowerCase().toUpperCase()}},BjXi:function(e,t,n){"use strict";var o=n("M8+4"),r=n("rm/B")(o);e.exports=r},Bnag:function(e,t){e.exports=function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}},C7Ve:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{color:"#393A34",fontFamily:'"Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",fontSize:".9em",lineHeight:"1.2em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#393A34",fontFamily:'"Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace',direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",fontSize:".9em",lineHeight:"1.2em",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",border:"1px solid #dddddd",backgroundColor:"white"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{background:"#C1DEF1"},'pre[class*="language-"] ::-moz-selection':{background:"#C1DEF1"},'code[class*="language-"]::-moz-selection':{background:"#C1DEF1"},'code[class*="language-"] ::-moz-selection':{background:"#C1DEF1"},'pre[class*="language-"]::selection':{background:"#C1DEF1"},'pre[class*="language-"] ::selection':{background:"#C1DEF1"},'code[class*="language-"]::selection':{background:"#C1DEF1"},'code[class*="language-"] ::selection':{background:"#C1DEF1"},':not(pre) > code[class*="language-"]':{padding:".2em",paddingTop:"1px",paddingBottom:"1px",background:"#f8f8f8",border:"1px solid #dddddd"},comment:{color:"#008000",fontStyle:"italic"},prolog:{color:"#008000",fontStyle:"italic"},doctype:{color:"#008000",fontStyle:"italic"},cdata:{color:"#008000",fontStyle:"italic"},namespace:{Opacity:".7"},string:{color:"#A31515"},punctuation:{color:"#393A34"},operator:{color:"#393A34"},url:{color:"#36acaa"},symbol:{color:"#36acaa"},number:{color:"#36acaa"},boolean:{color:"#36acaa"},variable:{color:"#36acaa"},constant:{color:"#36acaa"},inserted:{color:"#36acaa"},atrule:{color:"#0000ff"},keyword:{color:"#0000ff"},"attr-value":{color:"#0000ff"},".language-autohotkey .token.selector":{color:"#0000ff"},".language-json .token.boolean":{color:"#0000ff"},".language-json .token.number":{color:"#0000ff"},'code[class*="language-css"]':{color:"#0000ff"},function:{color:"#393A34"},deleted:{color:"#9a050f"},".language-autohotkey .token.tag":{color:"#9a050f"},selector:{color:"#800000"},".language-autohotkey .token.keyword":{color:"#00009f"},important:{fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},"class-name":{color:"#2B91AF"},".language-json .token.property":{color:"#2B91AF"},tag:{color:"#800000"},"attr-name":{color:"#ff0000"},property:{color:"#ff0000"},regex:{color:"#ff0000"},entity:{color:"#ff0000"},"directive.tag .tag":{background:"#ffff00",color:"#393A34"},".line-numbers .line-numbers-rows":{borderRightColor:"#a5a5a5"},".line-numbers-rows > span:before":{color:"#2B91AF"},".line-highlight":{background:"linear-gradient(to right, rgba(193, 222, 241, 0.2) 70%, rgba(221, 222, 241, 0))"}}},CC3I:function(e,t,n){var o=n("Lc7W");e.exports=function(e,t){var n,r=null;if(!e||"string"!==typeof e)return r;for(var a,i,s=o(e),l="function"===typeof t,c=0,u=s.length;ca&&"whitespace"===e[r][1].type&&(r-=2);"atxHeadingSequence"===e[r][1].type&&(a===r-1||r-4>a&&"whitespace"===e[r-2][1].type)&&(r-=a+1===r?2:4);r>a&&(n={type:"atxHeadingText",start:e[a][1].start,end:e[r][1].end},o={type:"chunkText",start:e[a][1].start,end:e[r][1].end,contentType:"text"},i(e,a,r-a+1,[["enter",n,t],["enter",o,t],["exit",o,t],["exit",n,t]]));return e}};e.exports=l},Cjod:function(e,t,n){"use strict";var o=n("7+hk"),r=n("IEZ+"),a=n("F6fn"),i=n("Ho5A"),s=n("TTG4"),l=n("vfP8"),c=n("CC3I"),u=n("qrWY"),d=n("Zasy"),p=d("root"),f=d("element"),h=d("text");function m(e,t,n){var o,a,i=n.schema,s=i,l=t.tagName,c={},d=[],p=-1;for(o in"html"===i.space&&"svg"===l.toLowerCase()&&(s=r,n.schema=s),t.properties)g(c,o,t.properties[o],n,l);if(n.vdom&&("html"===s.space?l=l.toUpperCase():c.namespace=u[s.space]),n.prefix&&(n.key++,c.key=n.prefix+n.key),t.children)for(;++p0&&n.push(o("text","\n"));return n};var o=n("vUGn")},"E/Jm":function(e,t,n){"use strict";e.exports=function(e){return e<-2}},EBzq:function(e,t,n){"use strict";var o=[].slice;e.exports=function(e,t){var n;return function(){var t,i=o.call(arguments,0),s=e.length>i.length;s&&i.push(r);try{t=e.apply(null,i)}catch(l){if(s&&n)throw l;return r(l)}s||(t&&"function"===typeof t.then?t.then(a,r):t instanceof Error?r(t):a(t))};function r(){n||(n=!0,t.apply(null,arguments))}function a(e){r(null,e)}}},EIjK:function(e,t,n){"use strict";var o=String.fromCharCode;e.exports=o},EbDI:function(e,t){e.exports=function(e){if("undefined"!==typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}},"EfL/":function(e,t,n){const o=n("ZkSf");e.exports=function(e){if(e.allowedElements&&e.disallowedElements)throw new TypeError("Only one of `allowedElements` and `disallowedElements` should be defined");if(e.allowedElements||e.disallowedElements||e.allowElement)return e=>{o(e,"element",t)};function t(t,n,o){const r=t,a=o;let i;if(e.allowedElements?i=!e.allowedElements.includes(r.tagName):e.disallowedElements&&(i=e.disallowedElements.includes(r.tagName)),!i&&e.allowElement&&"number"===typeof n&&(i=!e.allowElement(r,n,a)),i&&"number"===typeof n)return e.unwrapDisallowed&&r.children?a.children.splice(n,1,...r.children):a.children.splice(n,1),n}}},Esvb:function(e,t,n){"use strict";e.exports=n("PPHF")},F2il:function(e,t,n){"use strict";e.exports=function(e,t){var n,o=String(e),r=0;if("string"!==typeof t)throw new Error("Expected character");n=o.indexOf(t);for(;-1!==n;)r++,n=o.indexOf(t,n+t.length);return r}},F6fn:function(e,t,n){"use strict";var o=n("bAF5"),r=n("qTn3"),a=n("Ut8p"),i="data";e.exports=function(e,t){var n=o(t),p=t,f=a;if(n in e.normal)return e.property[e.normal[n]];n.length>4&&n.slice(0,4)===i&&s.test(t)&&("-"===t.charAt(4)?p=function(e){var t=e.slice(5).replace(l,d);return i+t.charAt(0).toUpperCase()+t.slice(1)}(t):t=function(e){var t=e.slice(4);if(l.test(t))return e;"-"!==(t=t.replace(c,u)).charAt(0)&&(t="-"+t);return i+t}(t),f=r);return new f(p,t)};var s=/^data[-\w.:]+$/i,l=/-[a-z]/g,c=/[A-Z]/g;function u(e){return"-"+e.toLowerCase()}function d(e){return e.charAt(1).toUpperCase()}},FE4A:function(e,t,n){"use strict";var o=n("EIjK");e.exports=function(e){for(var t,n,r,a=-1,i=[];++a code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{background:"#b3d4fc"},'pre[class*="language-"] ::-moz-selection':{background:"#b3d4fc"},'code[class*="language-"]::-moz-selection':{background:"#b3d4fc"},'code[class*="language-"] ::-moz-selection':{background:"#b3d4fc"},'pre[class*="language-"]::selection':{background:"#b3d4fc"},'pre[class*="language-"] ::selection':{background:"#b3d4fc"},'code[class*="language-"]::selection':{background:"#b3d4fc"},'code[class*="language-"] ::selection':{background:"#b3d4fc"},':not(pre) > code[class*="language-"]':{padding:".2em",paddingTop:"1px",paddingBottom:"1px",background:"#f8f8f8",border:"1px solid #dddddd"},comment:{color:"#999988",fontStyle:"italic"},prolog:{color:"#999988",fontStyle:"italic"},doctype:{color:"#999988",fontStyle:"italic"},cdata:{color:"#999988",fontStyle:"italic"},namespace:{Opacity:".7"},string:{color:"#e3116c"},"attr-value":{color:"#e3116c"},punctuation:{color:"#393A34"},operator:{color:"#393A34"},entity:{color:"#36acaa"},url:{color:"#36acaa"},symbol:{color:"#36acaa"},number:{color:"#36acaa"},boolean:{color:"#36acaa"},variable:{color:"#36acaa"},constant:{color:"#36acaa"},property:{color:"#36acaa"},regex:{color:"#36acaa"},inserted:{color:"#36acaa"},atrule:{color:"#00a4db"},keyword:{color:"#00a4db"},"attr-name":{color:"#00a4db"},".language-autohotkey .token.selector":{color:"#00a4db"},function:{color:"#9a050f",fontWeight:"bold"},deleted:{color:"#9a050f"},".language-autohotkey .token.tag":{color:"#9a050f"},tag:{color:"#00009f"},selector:{color:"#00009f"},".language-autohotkey .token.keyword":{color:"#00009f"},important:{fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}}},Gdbo:function(e,t,n){"use strict";e.exports=function(e){if(e)throw e}},GjEx:function(e,t,n){"use strict";e.exports=function(e,t){var n,r=t.value?t.value+"\n":"",a=t.lang&&t.lang.match(/^[^ \t]+(?=[ \t]|$)/),i={};a&&(i.className=["language-"+a]);n=e(t,"code",i,[o("text",r)]),t.meta&&(n.data={meta:t.meta});return e(t.position,"pre",[n])};var o=n("vUGn")},H0fq:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"black",color:"white",boxShadow:"-.3em 0 0 .3em black, .3em 0 0 .3em black"},'pre[class*="language-"]':{fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:".4em .8em",margin:".5em 0",overflow:"auto",background:'url(\'data:image/svg+xml;charset=utf-8,%0D%0A%0D%0A%0D%0A<%2Fsvg>\')',backgroundSize:"1em 1em"},':not(pre) > code[class*="language-"]':{padding:".2em",borderRadius:".3em",boxShadow:"none",whiteSpace:"normal"},comment:{color:"#aaa"},prolog:{color:"#aaa"},doctype:{color:"#aaa"},cdata:{color:"#aaa"},punctuation:{color:"#999"},namespace:{Opacity:".7"},property:{color:"#0cf"},tag:{color:"#0cf"},boolean:{color:"#0cf"},number:{color:"#0cf"},constant:{color:"#0cf"},symbol:{color:"#0cf"},selector:{color:"yellow"},"attr-name":{color:"yellow"},string:{color:"yellow"},char:{color:"yellow"},builtin:{color:"yellow"},operator:{color:"yellowgreen"},entity:{color:"yellowgreen",cursor:"help"},url:{color:"yellowgreen"},".language-css .token.string":{color:"yellowgreen"},variable:{color:"yellowgreen"},inserted:{color:"yellowgreen"},atrule:{color:"deeppink"},"attr-value":{color:"deeppink"},keyword:{color:"deeppink"},regex:{color:"orange"},important:{color:"orange",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},deleted:{color:"red"},"pre.diff-highlight.diff-highlight > code .token.deleted:not(.prefix)":{backgroundColor:"rgba(255, 0, 0, .3)",display:"inline"},"pre > code.diff-highlight.diff-highlight .token.deleted:not(.prefix)":{backgroundColor:"rgba(255, 0, 0, .3)",display:"inline"},"pre.diff-highlight.diff-highlight > code .token.inserted:not(.prefix)":{backgroundColor:"rgba(0, 255, 128, .3)",display:"inline"},"pre > code.diff-highlight.diff-highlight .token.inserted:not(.prefix)":{backgroundColor:"rgba(0, 255, 128, .3)",display:"inline"}}},HbD6:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{fontFamily:'"Fira Mono", Menlo, Monaco, "Lucida Console", "Courier New", Courier, monospace',fontSize:"16px",lineHeight:"1.375",direction:"ltr",textAlign:"left",wordSpacing:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",whiteSpace:"pre-wrap",wordBreak:"break-all",wordWrap:"break-word",background:"#322931",color:"#b9b5b8"},'pre[class*="language-"]':{fontFamily:'"Fira Mono", Menlo, Monaco, "Lucida Console", "Courier New", Courier, monospace',fontSize:"16px",lineHeight:"1.375",direction:"ltr",textAlign:"left",wordSpacing:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",whiteSpace:"pre-wrap",wordBreak:"break-all",wordWrap:"break-word",background:"#322931",color:"#b9b5b8",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#797379"},prolog:{color:"#797379"},doctype:{color:"#797379"},cdata:{color:"#797379"},punctuation:{color:"#b9b5b8"},".namespace":{Opacity:".7"},null:{color:"#fd8b19"},operator:{color:"#fd8b19"},boolean:{color:"#fd8b19"},number:{color:"#fd8b19"},property:{color:"#fdcc59"},tag:{color:"#1290bf"},string:{color:"#149b93"},selector:{color:"#c85e7c"},"attr-name":{color:"#fd8b19"},entity:{color:"#149b93",cursor:"help"},url:{color:"#149b93"},".language-css .token.string":{color:"#149b93"},".style .token.string":{color:"#149b93"},"attr-value":{color:"#8fc13e"},keyword:{color:"#8fc13e"},control:{color:"#8fc13e"},directive:{color:"#8fc13e"},unit:{color:"#8fc13e"},statement:{color:"#149b93"},regex:{color:"#149b93"},atrule:{color:"#149b93"},placeholder:{color:"#1290bf"},variable:{color:"#1290bf"},important:{color:"#dd464c",fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid red",OutlineOffset:".4em"}}},Ho5A:function(e){e.exports=JSON.parse('{"classId":"classID","dataType":"datatype","itemId":"itemID","strokeDashArray":"strokeDasharray","strokeDashOffset":"strokeDashoffset","strokeLineCap":"strokeLinecap","strokeLineJoin":"strokeLinejoin","strokeMiterLimit":"strokeMiterlimit","typeOf":"typeof","xLinkActuate":"xlinkActuate","xLinkArcRole":"xlinkArcrole","xLinkHref":"xlinkHref","xLinkRole":"xlinkRole","xLinkShow":"xlinkShow","xLinkTitle":"xlinkTitle","xLinkType":"xlinkType","xmlnsXLink":"xmlnsXlink"}')},HtLg:function(e,t,n){"use strict";var o=n("Vx/6");e.exports=function(e,t){return e.length?(o(e,e.length,0,t),e):t}},HwUZ:function(e,t,n){"use strict";class o{constructor(e){const t={},n=this._getOverriddenMethods(this,t);for(const o of Object.keys(n))"function"===typeof n[o]&&(t[o]=e[o],e[o]=n[o])}_getOverriddenMethods(){throw new Error("Not implemented")}}o.install=function(e,t,n){e.__mixins||(e.__mixins=[]);for(let r=0;r-1?(d=1,T.interrupt?t(o):P(o)):c.indexOf(h.toLowerCase())>-1?(d=6,47===o?(e.consume(o),_):T.interrupt?t(o):P(o)):(d=7,T.interrupt?n(o):p?x(o):C(o)):45===o||r(o)?(e.consume(o),h+=l(o),S):n(o)}function _(o){return 62===o?(e.consume(o),T.interrupt?t:P):n(o)}function C(t){return s(t)?(e.consume(t),C):I(t)}function x(t){return 47===t?(e.consume(t),I):58===t||95===t||o(t)?(e.consume(t),O):s(t)?(e.consume(t),x):I(t)}function O(t){return 45===t||46===t||58===t||95===t||r(t)?(e.consume(t),O):N(t)}function N(t){return 61===t?(e.consume(t),v):s(t)?(e.consume(t),N):x(t)}function v(t){return null===t||60===t||61===t||62===t||96===t?n(t):34===t||39===t?(e.consume(t),g=t,M):s(t)?(e.consume(t),v):(g=void 0,R(t))}function M(t){return t===g?(e.consume(t),w):null===t||a(t)?n(t):(e.consume(t),M)}function R(t){return null===t||34===t||39===t||60===t||61===t||62===t||96===t||i(t)?N(t):(e.consume(t),R)}function w(e){return 47===e||62===e||s(e)?x(e):n(e)}function I(t){return 62===t?(e.consume(t),L):n(t)}function L(t){return s(t)?(e.consume(t),L):null===t||a(t)?P(t):n(t)}function P(t){return 45===t&&2===d?(e.consume(t),F):60===t&&1===d?(e.consume(t),B):62===t&&4===d?(e.consume(t),W):63===t&&3===d?(e.consume(t),G):93===t&&5===d?(e.consume(t),U):!a(t)||6!==d&&7!==d?null===t||a(t)?H(t):(e.consume(t),P):e.check(f,W,H)(t)}function H(t){return e.exit("htmlFlowData"),D(t)}function D(t){return null===t?K(t):a(t)?(e.enter("lineEnding"),e.consume(t),e.exit("lineEnding"),D):(e.enter("htmlFlowData"),P(t))}function F(t){return 45===t?(e.consume(t),G):P(t)}function B(t){return 47===t?(e.consume(t),h="",z):P(t)}function z(t){return 62===t&&u.indexOf(h.toLowerCase())>-1?(e.consume(t),W):o(t)&&h.length<8?(e.consume(t),h+=l(t),z):P(t)}function U(t){return 93===t?(e.consume(t),G):P(t)}function G(t){return 62===t?(e.consume(t),W):P(t)}function W(t){return null===t||a(t)?(e.exit("htmlFlowData"),K(t)):(e.consume(t),W)}function K(n){return e.exit("htmlFlow"),t(n)}},resolveTo:function(e){var t=e.length;for(;t--&&("enter"!==e[t][0]||"htmlFlow"!==e[t][1].type););t>1&&"linePrefix"===e[t-2][1].type&&(e[t][1].start=e[t-2][1].start,e[t+1][1].start=e[t-2][1].start,e.splice(t-2,2));return e},concrete:!0},f={tokenize:function(e,t,n){return function(o){return e.exit("htmlFlowData"),e.enter("lineEndingBlank"),e.consume(o),e.exit("lineEndingBlank"),e.attempt(d,t,n)}},partial:!0};e.exports=p},L8sx:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=n("rCOv"),r=n("yRGd"),a=n("VLot"),i=function(e){var t=this,n=e.attempt(a,(function(o){if(null===o)return void e.consume(o);return e.enter("lineEndingBlank"),e.consume(o),e.exit("lineEndingBlank"),t.currentConstruct=void 0,n}),e.attempt(this.parser.constructs.flowInitial,i,r(e,e.attempt(this.parser.constructs.flow,i,e.attempt(o,i)),"linePrefix")));return n;function i(o){if(null!==o)return e.enter("lineEnding"),e.consume(o),e.exit("lineEnding"),t.currentConstruct=void 0,n;e.consume(o)}};t.tokenize=i},LLHA:function(e,t,n){"use strict";e.exports=n("wJMj")},Lc7W:function(e,t){var n=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g,o=/\n/g,r=/^\s*/,a=/^(\*?[-#/*\\\w]+(\[[0-9a-z_-]+\])?)\s*/,i=/^:\s*/,s=/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};])+)/,l=/^[;\s]*/,c=/^\s+|\s+$/g,u="";function d(e){return e?e.replace(c,u):u}e.exports=function(e,t){if("string"!==typeof e)throw new TypeError("First argument must be a string");if(!e)return[];t=t||{};var c=1,p=1;function f(e){var t=e.match(o);t&&(c+=t.length);var n=e.lastIndexOf("\n");p=~n?e.length-n:p+e.length}function h(){var e={line:c,column:p};return function(t){return t.position=new m(e),b(),t}}function m(e){this.start=e,this.end={line:c,column:p},this.source=t.source}m.prototype.content=e;var g=[];function T(n){var o=new Error(t.source+":"+c+":"+p+": "+n);if(o.reason=n,o.filename=t.source,o.line=c,o.column=p,o.source=e,!t.silent)throw o;g.push(o)}function E(t){var n=t.exec(e);if(n){var o=n[0];return f(o),e=e.slice(o.length),n}}function b(){E(r)}function A(e){var t;for(e=e||[];t=k();)!1!==t&&e.push(t);return e}function k(){var t=h();if("/"==e.charAt(0)&&"*"==e.charAt(1)){for(var n=2;u!=e.charAt(n)&&("*"!=e.charAt(n)||"/"!=e.charAt(n+1));)++n;if(n+=2,u===e.charAt(n-1))return T("End of comment missing");var o=e.slice(2,n-2);return p+=2,f(o),e=e.slice(n),p+=2,t({type:"comment",comment:o})}}function y(){var e=h(),t=E(a);if(t){if(k(),!E(i))return T("property missing ':'");var o=E(s),r=e({type:"declaration",property:d(t[0].replace(n,u)),value:o?d(o[0].replace(n,u)):u});return E(l),r}}return b(),function(){var e,t=[];for(A(t);e=y();)!1!==e&&(t.push(e),A(t));return t}()}},"M3+Y":function(e,t,n){"use strict";e.exports=function(e,t){var n=t.value.replace(/\r?\n|\r/g," ");return e(t,"code",[o("text",n)])};var o=n("vUGn")},"M8+4":function(e,t,n){"use strict";e.exports=/[!-\/:-@\[-`\{-~\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4F\u2E52\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]/},MVZn:function(e,t,n){var o=n("lSNA");e.exports=function(e){for(var t=1;t code[class*="language-"]':{background:"#1d1f21",padding:".1em",borderRadius:".3em"},comment:{color:"#7C7C7C"},prolog:{color:"#7C7C7C"},doctype:{color:"#7C7C7C"},cdata:{color:"#7C7C7C"},punctuation:{color:"#c5c8c6"},".namespace":{Opacity:".7"},property:{color:"#96CBFE"},keyword:{color:"#96CBFE"},tag:{color:"#96CBFE"},"class-name":{color:"#FFFFB6",textDecoration:"underline"},boolean:{color:"#99CC99"},constant:{color:"#99CC99"},symbol:{color:"#f92672"},deleted:{color:"#f92672"},number:{color:"#FF73FD"},selector:{color:"#A8FF60"},"attr-name":{color:"#A8FF60"},string:{color:"#A8FF60"},char:{color:"#A8FF60"},builtin:{color:"#A8FF60"},inserted:{color:"#A8FF60"},variable:{color:"#C6C5FE"},operator:{color:"#EDEDED"},entity:{color:"#FFFFB6",cursor:"help"},url:{color:"#96CBFE"},".language-css .token.string":{color:"#87C38A"},".style .token.string":{color:"#87C38A"},atrule:{color:"#F9EE98"},"attr-value":{color:"#F9EE98"},function:{color:"#DAD085"},regex:{color:"#E9C062"},important:{color:"#fd971f",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}}},NNOl:function(e,t,n){"use strict";var o=n("E/Jm"),r=n("Vx/6"),a=n("O+c1"),i=n("yRGd"),s={name:"codeIndented",tokenize:function(e,t,n){return e.attempt(l,r,n);function r(n){return null===n?t(n):o(n)?e.attempt(l,r,t)(n):(e.enter("codeFlowValue"),a(n))}function a(t){return null===t||o(t)?(e.exit("codeFlowValue"),r(t)):(e.consume(t),a)}},resolve:function(e,t){var n={type:"codeIndented",start:e[0][1].start,end:e[e.length-1][1].end};return r(e,0,0,[["enter",n,t]]),r(e,e.length,0,[["exit",n,t]]),e}},l={tokenize:function(e,t,n){var r=this;return i(e,(function s(l){if(o(l))return e.enter("lineEnding"),e.consume(l),e.exit("lineEnding"),i(e,s,"linePrefix",5);return a(r.events,"linePrefix")<4?n(l):t(l)}),"linePrefix",5)},partial:!0};e.exports=s},NOby:function(e,t,n){"use strict";var o=Object.assign;e.exports=o},Ne21:function(e,t,n){"use strict";const o=n("9kwo"),r=n("srZV"),a=n("HwUZ");e.exports=class extends o{constructor(e,t){super(e,t);const n=a.install(e.preprocessor,r,t);this.posTracker=n.posTracker}}},NfWH:function(e,t){e.exports=function(e){var t=e.options.listItemIndent||"tab";if(1===t||"1"===t)return"one";if("tab"!==t&&"one"!==t&&"mixed"!==t)throw new Error("Cannot serialize items with `"+t+"` for `options.listItemIndent`, expected `tab`, `one`, or `mixed`");return t}},Ny5O:function(e,t,n){"use strict";var o=n("rm/B")(/[\dA-Za-z]/);e.exports=o},"O+c1":function(e,t,n){"use strict";var o=n("jeK3");e.exports=function(e,t){var n=e[e.length-1];return n&&n[1].type===t?o(n[2].sliceStream(n[1])):0}},OaLn:function(e,t,n){"use strict";var o=n("Q3zd"),r=n("HtLg"),a=n("Vx/6"),i=n("Bh6z"),s=n("Ig3s"),l=n("T0BQ"),c=n("haLp"),u=n("kViG"),d=n("9ppO"),p=n("0mGV"),f={name:"labelEnd",tokenize:function(e,t,n){var o,r,a=this,s=a.events.length;for(;s--;)if(("labelImage"===a.events[s][1].type||"labelLink"===a.events[s][1].type)&&!a.events[s][1]._balanced){o=a.events[s][1];break}return function(t){if(!o)return n(t);return o._inactive?c(t):(r=a.parser.defined.indexOf(i(a.sliceSerialize({start:o.end,end:a.now()})))>-1,e.enter("labelEnd"),e.enter("labelMarker"),e.consume(t),e.exit("labelMarker"),e.exit("labelEnd"),l)};function l(n){return 40===n?e.attempt(h,t,r?t:c)(n):91===n?e.attempt(m,t,r?e.attempt(g,t,c):c)(n):r?t(n):c(n)}function c(e){return o._balanced=!0,n(e)}},resolveTo:function(e,t){var n,o,i,c,u,d,p,f=e.length,h=0;for(;f--;)if(c=e[f][1],u){if("link"===c.type||"labelLink"===c.type&&c._inactive)break;"enter"===e[f][0]&&"labelLink"===c.type&&(c._inactive=!0)}else if(d){if("enter"===e[f][0]&&("labelImage"===c.type||"labelLink"===c.type)&&!c._balanced&&(u=f,"labelLink"!==c.type)){h=2;break}}else"labelEnd"===c.type&&(d=f);return n={type:"labelLink"===e[u][1].type?"link":"image",start:l(e[u][1].start),end:l(e[e.length-1][1].end)},o={type:"label",start:l(e[u][1].start),end:l(e[d][1].end)},i={type:"labelText",start:l(e[u+h+2][1].end),end:l(e[d-2][1].start)},p=r(p=[["enter",n,t],["enter",o,t]],e.slice(u+1,u+h+3)),p=r(p,[["enter",i,t]]),p=r(p,s(t.parser.constructs.insideSpan.null,e.slice(u+h+4,d-3),t)),p=r(p,[["exit",i,t],e[d-2],e[d-1],["exit",o,t]]),p=r(p,e.slice(d+1)),p=r(p,[["exit",n,t]]),a(e,u,e.length,p),e},resolveAll:function(e){var t,n=-1;for(;++n code[class*="language-"]':{background:"hsl(30, 20%, 25%)",padding:".15em .2em .05em",borderRadius:".3em",border:".13em solid hsl(30, 20%, 40%)",boxShadow:"1px 1px .3em -.1em black inset",whiteSpace:"normal"},comment:{color:"hsl(30, 20%, 50%)"},prolog:{color:"hsl(30, 20%, 50%)"},doctype:{color:"hsl(30, 20%, 50%)"},cdata:{color:"hsl(30, 20%, 50%)"},punctuation:{Opacity:".7"},namespace:{Opacity:".7"},property:{color:"hsl(350, 40%, 70%)"},tag:{color:"hsl(350, 40%, 70%)"},boolean:{color:"hsl(350, 40%, 70%)"},number:{color:"hsl(350, 40%, 70%)"},constant:{color:"hsl(350, 40%, 70%)"},symbol:{color:"hsl(350, 40%, 70%)"},selector:{color:"hsl(75, 70%, 60%)"},"attr-name":{color:"hsl(75, 70%, 60%)"},string:{color:"hsl(75, 70%, 60%)"},char:{color:"hsl(75, 70%, 60%)"},builtin:{color:"hsl(75, 70%, 60%)"},inserted:{color:"hsl(75, 70%, 60%)"},operator:{color:"hsl(40, 90%, 60%)"},entity:{color:"hsl(40, 90%, 60%)",cursor:"help"},url:{color:"hsl(40, 90%, 60%)"},".language-css .token.string":{color:"hsl(40, 90%, 60%)"},".style .token.string":{color:"hsl(40, 90%, 60%)"},variable:{color:"hsl(40, 90%, 60%)"},atrule:{color:"hsl(350, 40%, 70%)"},"attr-value":{color:"hsl(350, 40%, 70%)"},keyword:{color:"hsl(350, 40%, 70%)"},regex:{color:"#e90"},important:{color:"#e90",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},deleted:{color:"red"}}},PGbq:function(e){e.exports=JSON.parse('["area","base","basefont","bgsound","br","col","command","embed","frame","hr","image","img","input","isindex","keygen","link","menuitem","meta","nextid","param","source","track","wbr"]')},PPHF:function(e,t,n){"use strict";var o=n("aCXt"),r=n("tgGP");e.exports=r,r.prototype.message=function(e,t,n){var r=new o(e,t,n);this.path&&(r.name=this.path+":"+r.name,r.file=this.path);return r.fatal=!1,this.messages.push(r),r},r.prototype.info=function(){var e=this.message.apply(this,arguments);return e.fatal=null,e},r.prototype.fail=function(){var e=this.message.apply(this,arguments);throw e.fatal=!0,e}},PSll:function(e,t,n){"use strict";var o=n("E/Jm"),r=n("Q3zd"),a=n("O+c1"),i=n("yRGd"),s={name:"codeFenced",tokenize:function(e,t,n){var s,l=this,c={tokenize:function(e,t,n){var r=0;return i(e,a,"linePrefix",this.parser.constructs.disable.null.indexOf("codeIndented")>-1?void 0:4);function a(t){return e.enter("codeFencedFence"),e.enter("codeFencedFenceSequence"),l(t)}function l(t){return t===s?(e.consume(t),r++,l):r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}},R5yl:function(e,t,n){"use strict";e.exports=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","section","source","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"]},REpm:function(e,t){const n=["http","https","mailto","tel"];e.exports=function(e){const t=(e||"").trim(),o=t.charAt(0);if("#"===o||"/"===o)return t;const r=t.indexOf(":");if(-1===r)return t;let a=-1;for(;++aa)return t;if(a=t.indexOf("#"),-1!==a&&r>a)return t;return"javascript:void(0)"}},RIqP:function(e,t,n){var o=n("Ijbi"),r=n("EbDI"),a=n("ZhPi"),i=n("Bnag");e.exports=function(e){return o(e)||r(e)||a(e)||i()}},RXC2:function(e,t,n){"use strict";var o=n("FWC9"),r=n("DUvi"),a=n("y3WP"),i=o.boolean,s=o.overloadedBoolean,l=o.booleanish,c=o.number,u=o.spaceSeparated,d=o.commaSeparated;e.exports=r({space:"html",attributes:{acceptcharset:"accept-charset",classname:"class",htmlfor:"for",httpequiv:"http-equiv"},transform:a,mustUseProperty:["checked","multiple","muted","selected"],properties:{abbr:null,accept:d,acceptCharset:u,accessKey:u,action:null,allow:null,allowFullScreen:i,allowPaymentRequest:i,allowUserMedia:i,alt:null,as:null,async:i,autoCapitalize:null,autoComplete:u,autoFocus:i,autoPlay:i,capture:i,charSet:null,checked:i,cite:null,className:u,cols:c,colSpan:null,content:null,contentEditable:l,controls:i,controlsList:u,coords:c|d,crossOrigin:null,data:null,dateTime:null,decoding:null,default:i,defer:i,dir:null,dirName:null,disabled:i,download:s,draggable:l,encType:null,enterKeyHint:null,form:null,formAction:null,formEncType:null,formMethod:null,formNoValidate:i,formTarget:null,headers:u,height:c,hidden:i,high:c,href:null,hrefLang:null,htmlFor:u,httpEquiv:u,id:null,imageSizes:null,imageSrcSet:d,inputMode:null,integrity:null,is:null,isMap:i,itemId:null,itemProp:u,itemRef:u,itemScope:i,itemType:u,kind:null,label:null,lang:null,language:null,list:null,loading:null,loop:i,low:c,manifest:null,max:null,maxLength:c,media:null,method:null,min:null,minLength:c,multiple:i,muted:i,name:null,nonce:null,noModule:i,noValidate:i,onAbort:null,onAfterPrint:null,onAuxClick:null,onBeforePrint:null,onBeforeUnload:null,onBlur:null,onCancel:null,onCanPlay:null,onCanPlayThrough:null,onChange:null,onClick:null,onClose:null,onContextMenu:null,onCopy:null,onCueChange:null,onCut:null,onDblClick:null,onDrag:null,onDragEnd:null,onDragEnter:null,onDragExit:null,onDragLeave:null,onDragOver:null,onDragStart:null,onDrop:null,onDurationChange:null,onEmptied:null,onEnded:null,onError:null,onFocus:null,onFormData:null,onHashChange:null,onInput:null,onInvalid:null,onKeyDown:null,onKeyPress:null,onKeyUp:null,onLanguageChange:null,onLoad:null,onLoadedData:null,onLoadedMetadata:null,onLoadEnd:null,onLoadStart:null,onMessage:null,onMessageError:null,onMouseDown:null,onMouseEnter:null,onMouseLeave:null,onMouseMove:null,onMouseOut:null,onMouseOver:null,onMouseUp:null,onOffline:null,onOnline:null,onPageHide:null,onPageShow:null,onPaste:null,onPause:null,onPlay:null,onPlaying:null,onPopState:null,onProgress:null,onRateChange:null,onRejectionHandled:null,onReset:null,onResize:null,onScroll:null,onSecurityPolicyViolation:null,onSeeked:null,onSeeking:null,onSelect:null,onSlotChange:null,onStalled:null,onStorage:null,onSubmit:null,onSuspend:null,onTimeUpdate:null,onToggle:null,onUnhandledRejection:null,onUnload:null,onVolumeChange:null,onWaiting:null,onWheel:null,open:i,optimum:c,pattern:null,ping:u,placeholder:null,playsInline:i,poster:null,preload:null,readOnly:i,referrerPolicy:null,rel:u,required:i,reversed:i,rows:c,rowSpan:c,sandbox:u,scope:null,scoped:i,seamless:i,selected:i,shape:null,size:c,sizes:null,slot:null,span:c,spellCheck:l,src:null,srcDoc:null,srcLang:null,srcSet:d,start:c,step:null,style:null,tabIndex:c,target:null,title:null,translate:null,type:null,typeMustMatch:i,useMap:null,value:l,width:c,wrap:null,align:null,aLink:null,archive:u,axis:null,background:null,bgColor:null,border:c,borderColor:null,bottomMargin:c,cellPadding:null,cellSpacing:null,char:null,charOff:null,classId:null,clear:null,code:null,codeBase:null,codeType:null,color:null,compact:i,declare:i,event:null,face:null,frame:null,frameBorder:null,hSpace:c,leftMargin:c,link:null,longDesc:null,lowSrc:null,marginHeight:c,marginWidth:c,noResize:i,noHref:i,noShade:i,noWrap:i,object:null,profile:null,prompt:null,rev:null,rightMargin:c,rules:null,scheme:null,scrolling:l,standby:null,summary:null,text:null,topMargin:c,valueType:null,version:null,vAlign:null,vLink:null,vSpace:c,allowTransparency:null,autoCorrect:null,autoSave:null,disablePictureInPicture:i,disableRemotePlayback:i,prefix:null,property:null,results:c,security:null,unselectable:null}})},RjOF:function(e,t,n){"use strict";var o,r="";e.exports=function(e,t){if("string"!==typeof e)throw new TypeError("expected a string");if(1===t)return e;if(2===t)return e+e;var n=e.length*t;if(o!==e||"undefined"===typeof o)o=e,r="";else if(r.length>=n)return r.substr(0,n);for(;n>r.length&&t>1;)1&t&&(r+=e),t>>=1,e+=e;return r=(r+=e).substr(0,n)}},RrMp:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=n("+Pz5"),r=n("dAEq"),a=n("Atxm"),i=n("kQY0"),s=n("Ue0c"),l=n("42yH"),c=n("PSll"),u=n("NNOl"),d=n("/apb"),p=n("HxRD"),f=n("gyVW"),h=n("CUvb"),m=n("KynH"),g=n("3iNw"),T=n("OaLn"),E=n("7enW"),b=n("Ie4K"),A=n("escJ"),k=n("5bit"),y=n("Iv+h"),S=n("33Zt"),_={42:k,43:k,45:k,48:k,49:k,50:k,51:k,52:k,53:k,54:k,55:k,56:k,57:k,62:i},C={91:p},x={"-2":u,"-1":u,32:u},O={35:h,42:S,45:[y,S],60:m,61:y,95:S,96:c,126:c},N={38:l,92:s},v={"-5":A,"-4":A,"-3":A,33:E,38:l,42:r,60:[a,g],91:b,92:[f,s],93:T,95:r,96:d},M={null:[r,o.resolver]};t.contentInitial=C,t.disable={null:[]},t.document=_,t.flow=O,t.flowInitial=x,t.insideSpan=M,t.string=N,t.text=v},Ry5F:function(e,t,n){"use strict";e.exports=function(e,t){var n,i,s,l,c,u=t.children,d=u.length,p=t.align||[],f=p.length,h=[];for(;d--;){for(i=u[d].children,l=0===d?"th":"td",n=f||i.length,s=[];n--;)c=i[n],s[n]=e(c,l,{align:p[n]},c?a(e,c):[]);h[d]=e(u[d],"tr",r(s,!0))}return e(t,"table",r([e(h[0].position,"thead",r([h[0]],!0))].concat(h[1]?e({start:o.start(h[1]),end:o.end(h[h.length-1])},"tbody",r(h.slice(1),!0)):[]),!0))};var o=n("BfbN"),r=n("Dvol"),a=n("WFsM")},ScQ6:function(e,t,n){e.exports=function(e,t,n){var l,c,u,d=r(n),p=a(n);t&&t.ordered&&(d=(t.start>-1?t.start:1)+(!1===n.options.incrementListMarker?0:t.children.indexOf(e))+".");l=d.length+1,("tab"===p||"mixed"===p&&(t&&t.spread||e.spread))&&(l=4*Math.ceil(l/4));return u=n.enter("listItem"),c=s(i(e,n),(function(e,t,n){if(t)return(n?"":o(" ",l))+e;return(n?d:d+o(" ",l-d.length))+e})),u(),c};var o=n("RjOF"),r=n("/cIb"),a=n("NfWH"),i=n("B5Lt"),s=n("deF/")},T0BQ:function(e,t,n){"use strict";var o=n("NOby");e.exports=function(e){return o({},e)}},TDhK:function(e,t,n){"use strict";var o={}.hasOwnProperty;e.exports=o},THrT:function(e,t,n){e.exports=n("qOO9")},TTG4:function(e,t,n){"use strict";t.parse=function(e){var t=String(e||"").trim();return""===t?[]:t.split(o)},t.stringify=function(e){return e.join(" ").trim()};var o=/[ \t\n\r\f]+/g},Tauu:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{color:"#a9b7c6",fontFamily:"Consolas, Monaco, 'Andale Mono', monospace",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#a9b7c6",fontFamily:"Consolas, Monaco, 'Andale Mono', monospace",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",background:"#2b2b2b"},'pre[class*="language-"]::-moz-selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'pre[class*="language-"] ::-moz-selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'code[class*="language-"]::-moz-selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'code[class*="language-"] ::-moz-selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'pre[class*="language-"]::selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'pre[class*="language-"] ::selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'code[class*="language-"]::selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},'code[class*="language-"] ::selection':{color:"inherit",background:"rgba(33, 66, 131, .85)"},':not(pre) > code[class*="language-"]':{background:"#2b2b2b",padding:".1em",borderRadius:".3em"},comment:{color:"#808080"},prolog:{color:"#808080"},cdata:{color:"#808080"},delimiter:{color:"#cc7832"},boolean:{color:"#cc7832"},keyword:{color:"#cc7832"},selector:{color:"#cc7832"},important:{color:"#cc7832"},atrule:{color:"#cc7832"},operator:{color:"#a9b7c6"},punctuation:{color:"#a9b7c6"},"attr-name":{color:"#a9b7c6"},tag:{color:"#e8bf6a"},"tag .punctuation":{color:"#e8bf6a"},doctype:{color:"#e8bf6a"},builtin:{color:"#e8bf6a"},entity:{color:"#6897bb"},number:{color:"#6897bb"},symbol:{color:"#6897bb"},property:{color:"#9876aa"},constant:{color:"#9876aa"},variable:{color:"#9876aa"},string:{color:"#6a8759"},char:{color:"#6a8759"},"attr-value":{color:"#a5c261"},"attr-value .punctuation":{color:"#a5c261"},"attr-value .punctuation:first-child":{color:"#a9b7c6"},url:{color:"#287bde",textDecoration:"underline"},function:{color:"#ffc66d"},regex:{background:"#364135"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},inserted:{background:"#294436"},deleted:{background:"#484a4a"},"code.language-css .token.property":{color:"#a9b7c6"},"code.language-css .token.property + .token.punctuation":{color:"#a9b7c6"},"code.language-css .token.id":{color:"#ffc66d"},"code.language-css .token.selector > .token.class":{color:"#ffc66d"},"code.language-css .token.selector > .token.attribute":{color:"#ffc66d"},"code.language-css .token.selector > .token.pseudo-class":{color:"#ffc66d"},"code.language-css .token.selector > .token.pseudo-element":{color:"#ffc66d"}}},U6jy:function(e,t){e.exports=function(){for(var e={},t=0;t0;t--)e.onItemPop(this.items[t]);t.popAllUpToHtmlElement.call(this)},remove(n){e.onItemPop(this.current),t.remove.call(this,n)}}}}},Ue0c:function(e,t,n){"use strict";var o=n("qF1g"),r={name:"characterEscape",tokenize:function(e,t,n){return function(t){return e.enter("characterEscape"),e.enter("escapeMarker"),e.consume(t),e.exit("escapeMarker"),r};function r(r){return o(r)?(e.enter("characterEscapeValue"),e.consume(r),e.exit("characterEscapeValue"),e.exit("characterEscape"),t):n(r)}}};e.exports=r},UhtW:function(e,t){e.exports=function e(t,n){var o,r=-1;if(n.extensions)for(;++ri?0:i+t:t>i?i:t,n=n>0?n:0,r.length<1e4)(a=Array.from(r)).unshift(t,n),o.apply(e,a);else for(n&&o.apply(e,[t,n]);s code[class*="language-"]':{background:"#272822",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"#8292a2"},prolog:{color:"#8292a2"},doctype:{color:"#8292a2"},cdata:{color:"#8292a2"},punctuation:{color:"#f8f8f2"},namespace:{Opacity:".7"},property:{color:"#f92672"},tag:{color:"#f92672"},constant:{color:"#f92672"},symbol:{color:"#f92672"},deleted:{color:"#f92672"},boolean:{color:"#ae81ff"},number:{color:"#ae81ff"},selector:{color:"#a6e22e"},"attr-name":{color:"#a6e22e"},string:{color:"#a6e22e"},char:{color:"#a6e22e"},builtin:{color:"#a6e22e"},inserted:{color:"#a6e22e"},operator:{color:"#f8f8f2"},entity:{color:"#f8f8f2",cursor:"help"},url:{color:"#f8f8f2"},".language-css .token.string":{color:"#f8f8f2"},".style .token.string":{color:"#f8f8f2"},variable:{color:"#f8f8f2"},atrule:{color:"#e6db74"},"attr-value":{color:"#e6db74"},function:{color:"#e6db74"},"class-name":{color:"#e6db74"},keyword:{color:"#66d9ef"},regex:{color:"#fd971f"},important:{color:"#fd971f",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}}},WniP:function(e,t,n){"use strict";e.exports=function(e,t){var n,a,i,s=t.referenceType,l="]";"collapsed"===s?l+="[]":"full"===s&&(l+="["+(t.label||t.identifier)+"]");if("imageReference"===t.type)return o("text","!["+t.alt+l);n=r(e,t),(a=n[0])&&"text"===a.type?a.value="["+a.value:n.unshift(o("text","["));(i=n[n.length-1])&&"text"===i.type?i.value+=l:n.push(o("text",l));return n};var o=n("vUGn"),r=n("WFsM")},WtKE:function(e,t,n){"use strict";var o;e.exports=function(e){var t,n="&"+e+";";if((o=o||document.createElement("i")).innerHTML=n,59===(t=o.textContent).charCodeAt(t.length-1)&&"semi"!==e)return!1;return t!==n&&t}},Xuae:function(e,t,n){"use strict";var o=n("RIqP"),r=n("lwsE"),a=n("W8MJ"),i=(n("PJYZ"),n("7W2i")),s=n("a1gu"),l=n("Nsbk");function c(e){var t=function(){if("undefined"===typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"===typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,o=l(e);if(t){var r=l(this).constructor;n=Reflect.construct(o,arguments,r)}else n=o.apply(this,arguments);return s(this,n)}}t.__esModule=!0,t.default=void 0;var u=n("q1tI"),d=function(e){i(n,e);var t=c(n);function n(e){var a;return r(this,n),(a=t.call(this,e))._hasHeadManager=void 0,a.emitChange=function(){a._hasHeadManager&&a.props.headManager.updateHead(a.props.reduceComponentsToState(o(a.props.headManager.mountedInstances),a.props))},a._hasHeadManager=a.props.headManager&&a.props.headManager.mountedInstances,a}return a(n,[{key:"componentDidMount",value:function(){this._hasHeadManager&&this.props.headManager.mountedInstances.add(this),this.emitChange()}},{key:"componentDidUpdate",value:function(){this.emitChange()}},{key:"componentWillUnmount",value:function(){this._hasHeadManager&&this.props.headManager.mountedInstances.delete(this),this.emitChange()}},{key:"render",value:function(){return null}}]),n}(u.Component);t.default=d},"Y+Mq":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#24242e",color:"#767693"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#24242e",color:"#767693",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#5151e6"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#5151e6"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#5151e6"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#5151e6"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#5151e6"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#5151e6"},'code[class*="language-"]::selection':{textShadow:"none",background:"#5151e6"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#5151e6"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#5b5b76"},prolog:{color:"#5b5b76"},doctype:{color:"#5b5b76"},cdata:{color:"#5b5b76"},punctuation:{color:"#5b5b76"},namespace:{Opacity:".7"},tag:{color:"#dd672c"},operator:{color:"#dd672c"},number:{color:"#dd672c"},property:{color:"#767693"},function:{color:"#767693"},"tag-id":{color:"#ebebff"},selector:{color:"#ebebff"},"atrule-id":{color:"#ebebff"},"code.language-javascript":{color:"#aaaaca"},"attr-name":{color:"#aaaaca"},"code.language-css":{color:"#fe8c52"},"code.language-scss":{color:"#fe8c52"},boolean:{color:"#fe8c52"},string:{color:"#fe8c52"},entity:{color:"#fe8c52",cursor:"help"},url:{color:"#fe8c52"},".language-css .token.string":{color:"#fe8c52"},".language-scss .token.string":{color:"#fe8c52"},".style .token.string":{color:"#fe8c52"},"attr-value":{color:"#fe8c52"},keyword:{color:"#fe8c52"},control:{color:"#fe8c52"},directive:{color:"#fe8c52"},unit:{color:"#fe8c52"},statement:{color:"#fe8c52"},regex:{color:"#fe8c52"},atrule:{color:"#fe8c52"},placeholder:{color:"#fe8c52"},variable:{color:"#fe8c52"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #ebebff",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#aaaaca"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid #7676f4",OutlineOffset:".4em"},".line-numbers .line-numbers-rows":{borderRightColor:"#262631"},".line-numbers-rows > span:before":{color:"#393949"},".line-highlight":{background:"linear-gradient(to right, rgba(221, 103, 44, 0.2) 70%, rgba(221, 103, 44, 0))"}}},"Y/Y8":function(e,t,n){"use strict";const o=n("HwUZ"),r=n("zpDW"),a=n("lb9w"),i=n("UTAp"),s=n("UwWT").TAG_NAMES;e.exports=class extends o{constructor(e){super(e),this.parser=e,this.treeAdapter=this.parser.treeAdapter,this.posTracker=null,this.lastStartTagToken=null,this.lastFosterParentingLocation=null,this.currentToken=null}_setStartLocation(e){let t=null;this.lastStartTagToken&&(t=Object.assign({},this.lastStartTagToken.location),t.startTag=this.lastStartTagToken.location),this.treeAdapter.setNodeSourceCodeLocation(e,t)}_setEndLocation(e,t){if(this.treeAdapter.getNodeSourceCodeLocation(e)&&t.location){const n=t.location,o=this.treeAdapter.getTagName(e),a={};t.type===r.END_TAG_TOKEN&&o===t.tagName?(a.endTag=Object.assign({},n),a.endLine=n.endLine,a.endCol=n.endCol,a.endOffset=n.endOffset):(a.endLine=n.startLine,a.endCol=n.startCol,a.endOffset=n.startOffset),this.treeAdapter.updateNodeSourceCodeLocation(e,a)}}_getOverriddenMethods(e,t){return{_bootstrap(n,r){t._bootstrap.call(this,n,r),e.lastStartTagToken=null,e.lastFosterParentingLocation=null,e.currentToken=null;const s=o.install(this.tokenizer,a);e.posTracker=s.posTracker,o.install(this.openElements,i,{onItemPop:function(t){e._setEndLocation(t,e.currentToken)}})},_runParsingLoop(n){t._runParsingLoop.call(this,n);for(let t=this.openElements.stackTop;t>=0;t--)e._setEndLocation(this.openElements.items[t],e.currentToken)},_processTokenInForeignContent(n){e.currentToken=n,t._processTokenInForeignContent.call(this,n)},_processToken(n){e.currentToken=n,t._processToken.call(this,n);if(n.type===r.END_TAG_TOKEN&&(n.tagName===s.HTML||n.tagName===s.BODY&&this.openElements.hasInScope(s.BODY)))for(let t=this.openElements.stackTop;t>=0;t--){const o=this.openElements.items[t];if(this.treeAdapter.getTagName(o)===n.tagName){e._setEndLocation(o,n);break}}},_setDocumentType(e){t._setDocumentType.call(this,e);const n=this.treeAdapter.getChildNodes(this.document),o=n.length;for(let t=0;tt;)i.containerState=c[a][1],c[a][0].exit.call(i,e);c.length=t}},s={tokenize:function(e,t,n){return r(e,e.attempt(this.parser.constructs.document,t,n),"linePrefix",this.parser.constructs.disable.null.indexOf("codeIndented")>-1?void 0:4)}},l={tokenize:function(e,t,n){return r(e,e.lazy(this.parser.constructs.flow,t,n),"linePrefix",this.parser.constructs.disable.null.indexOf("codeIndented")>-1?void 0:4)}};t.tokenize=i},YpxX:function(e,t,n){"use strict";const o=n("pRQB"),r=n("2l2D"),a=o.CODE_POINTS;e.exports=class{constructor(){this.html=null,this.pos=-1,this.lastGapPos=-1,this.lastCharPos=-1,this.gapStack=[],this.skipNextNewLine=!1,this.lastChunkWritten=!1,this.endOfChunkHit=!1,this.bufferWaterline=65536}_err(){}_addGap(){this.gapStack.push(this.lastGapPos),this.lastGapPos=this.pos}_processSurrogate(e){if(this.pos!==this.lastCharPos){const t=this.html.charCodeAt(this.pos+1);if(o.isSurrogatePair(t))return this.pos++,this._addGap(),o.getSurrogatePairCodePoint(e,t)}else if(!this.lastChunkWritten)return this.endOfChunkHit=!0,a.EOF;return this._err(r.surrogateInInputStream),e}dropParsedChunk(){this.pos>this.bufferWaterline&&(this.lastCharPos-=this.pos,this.html=this.html.substring(this.pos),this.pos=0,this.lastGapPos=-1,this.gapStack=[])}write(e,t){this.html?this.html+=e:this.html=e,this.lastCharPos=this.html.length-1,this.endOfChunkHit=!1,this.lastChunkWritten=t}insertHtmlAtCurrentPos(e){this.html=this.html.substring(0,this.pos+1)+e+this.html.substring(this.pos+1,this.html.length),this.lastCharPos=this.html.length-1,this.endOfChunkHit=!1}advance(){if(this.pos++,this.pos>this.lastCharPos)return this.endOfChunkHit=!this.lastChunkWritten,a.EOF;let e=this.html.charCodeAt(this.pos);if(this.skipNextNewLine&&e===a.LINE_FEED)return this.skipNextNewLine=!1,this._addGap(),this.advance();if(e===a.CARRIAGE_RETURN)return this.skipNextNewLine=!0,a.LINE_FEED;this.skipNextNewLine=!1,o.isSurrogate(e)&&(e=this._processSurrogate(e));return e>31&&e<127||e===a.LINE_FEED||e===a.CARRIAGE_RETURN||e>159&&e<64976||this._checkForProblematicCharacters(e),e}_checkForProblematicCharacters(e){o.isControlCodePoint(e)?this._err(r.controlCharacterInInputStream):o.isUndefinedCodePoint(e)&&this._err(r.noncharacterInInputStream)}retreat(){this.pos===this.lastGapPos&&(this.lastGapPos=this.gapStack.pop(),this.pos--),this.pos--}}},Z0IX:function(e,t,n){"use strict";var o=n("EIjK");e.exports=function(e,t){var n=parseInt(e,t);return n<9||11===n||n>13&&n<32||n>126&&n<160||n>55295&&n<57344||n>64975&&n<65008||65535===(65535&n)||65534===(65535&n)||n>1114111?"\ufffd":o(n)}},ZOei:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{color:"#f8f8f2",background:"none",fontFamily:"\"Fira Code\", Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#f8f8f2",background:"#2E3440",fontFamily:"\"Fira Code\", Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",borderRadius:"0.3em"},':not(pre) > code[class*="language-"]':{background:"#2E3440",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"#636f88"},prolog:{color:"#636f88"},doctype:{color:"#636f88"},cdata:{color:"#636f88"},punctuation:{color:"#81A1C1"},".namespace":{Opacity:".7"},property:{color:"#81A1C1"},tag:{color:"#81A1C1"},constant:{color:"#81A1C1"},symbol:{color:"#81A1C1"},deleted:{color:"#81A1C1"},number:{color:"#B48EAD"},boolean:{color:"#81A1C1"},selector:{color:"#A3BE8C"},"attr-name":{color:"#A3BE8C"},string:{color:"#A3BE8C"},char:{color:"#A3BE8C"},builtin:{color:"#A3BE8C"},inserted:{color:"#A3BE8C"},operator:{color:"#81A1C1"},entity:{color:"#81A1C1",cursor:"help"},url:{color:"#81A1C1"},".language-css .token.string":{color:"#81A1C1"},".style .token.string":{color:"#81A1C1"},variable:{color:"#81A1C1"},atrule:{color:"#88C0D0"},"attr-value":{color:"#88C0D0"},function:{color:"#88C0D0"},"class-name":{color:"#88C0D0"},keyword:{color:"#81A1C1"},regex:{color:"#EBCB8B"},important:{color:"#EBCB8B",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}}},"ZTJ+":function(e,t,n){"use strict";function o(){return null}e.exports={blockquote:n("iX4R"),break:n("aRXn"),code:n("GjEx"),delete:n("/Fgc"),emphasis:n("ktEA"),footnoteReference:n("/BR8"),footnote:n("nbFU"),heading:n("lQDV"),html:n("fFcG"),imageReference:n("rRyo"),image:n("I3zf"),inlineCode:n("M3+Y"),linkReference:n("W+EG"),link:n("/ulP"),listItem:n("bS0g"),list:n("pI64"),paragraph:n("1rba"),root:n("N+Fa"),strong:n("CndC"),table:n("Ry5F"),text:n("KvLk"),thematicBreak:n("WV47"),toml:o,yaml:o,definition:o,footnoteDefinition:o}},Zasy:function(e,t,n){"use strict";function o(e){if(null==e)return r;if("string"===typeof e)return function(e){return t;function t(t){return Boolean(t&&t.type===e)}}(e);if("object"===typeof e)return"length"in e?function(e){var t=[],n=-1;for(;++n code[class*="language-"]':{whiteSpace:"normal",borderRadius:"0.2em",padding:"0.1em"},".language-css > code":{color:"#f76d47"},".language-sass > code":{color:"#f76d47"},".language-scss > code":{color:"#f76d47"},'[class*="language-"] .namespace':{Opacity:"0.7"},atrule:{color:"#7c4dff"},"attr-name":{color:"#39adb5"},"attr-value":{color:"#f6a434"},attribute:{color:"#f6a434"},boolean:{color:"#7c4dff"},builtin:{color:"#39adb5"},cdata:{color:"#39adb5"},char:{color:"#39adb5"},class:{color:"#39adb5"},"class-name":{color:"#6182b8"},comment:{color:"#aabfc9"},constant:{color:"#7c4dff"},deleted:{color:"#e53935"},doctype:{color:"#aabfc9"},entity:{color:"#e53935"},function:{color:"#7c4dff"},hexcode:{color:"#f76d47"},id:{color:"#7c4dff",fontWeight:"bold"},important:{color:"#7c4dff",fontWeight:"bold"},inserted:{color:"#39adb5"},keyword:{color:"#7c4dff"},number:{color:"#f76d47"},operator:{color:"#39adb5"},prolog:{color:"#aabfc9"},property:{color:"#39adb5"},"pseudo-class":{color:"#f6a434"},"pseudo-element":{color:"#f6a434"},punctuation:{color:"#39adb5"},regex:{color:"#6182b8"},selector:{color:"#e53935"},string:{color:"#f6a434"},symbol:{color:"#7c4dff"},tag:{color:"#e53935"},unit:{color:"#f76d47"},url:{color:"#e53935"},variable:{color:"#e53935"}}},b9um:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{MozTabSize:"2",OTabSize:"2",tabSize:"2",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",whiteSpace:"pre-wrap",wordWrap:"normal",fontFamily:'Menlo, Monaco, "Courier New", monospace',fontSize:"14px",color:"#76d9e6",textShadow:"none"},'pre[class*="language-"]':{MozTabSize:"2",OTabSize:"2",tabSize:"2",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",whiteSpace:"pre-wrap",wordWrap:"normal",fontFamily:'Menlo, Monaco, "Courier New", monospace',fontSize:"14px",color:"#76d9e6",textShadow:"none",background:"#2a2a2a",padding:"15px",borderRadius:"4px",border:"1px solid #e1e1e8",overflow:"auto",position:"relative"},'pre > code[class*="language-"]':{fontSize:"1em"},':not(pre) > code[class*="language-"]':{background:"#2a2a2a",padding:"0.15em 0.2em 0.05em",borderRadius:".3em",border:"0.13em solid #7a6652",boxShadow:"1px 1px 0.3em -0.1em #000 inset"},'pre[class*="language-"] code':{whiteSpace:"pre",display:"block"},namespace:{Opacity:".7"},comment:{color:"#6f705e"},prolog:{color:"#6f705e"},doctype:{color:"#6f705e"},cdata:{color:"#6f705e"},operator:{color:"#a77afe"},boolean:{color:"#a77afe"},number:{color:"#a77afe"},"attr-name":{color:"#e6d06c"},string:{color:"#e6d06c"},entity:{color:"#e6d06c",cursor:"help"},url:{color:"#e6d06c"},".language-css .token.string":{color:"#e6d06c"},".style .token.string":{color:"#e6d06c"},selector:{color:"#a6e22d"},inserted:{color:"#a6e22d"},atrule:{color:"#ef3b7d"},"attr-value":{color:"#ef3b7d"},keyword:{color:"#ef3b7d"},important:{color:"#ef3b7d",fontWeight:"bold"},deleted:{color:"#ef3b7d"},regex:{color:"#76d9e6"},statement:{color:"#76d9e6",fontWeight:"bold"},placeholder:{color:"#fff"},variable:{color:"#fff"},bold:{fontWeight:"bold"},punctuation:{color:"#bebec5"},italic:{fontStyle:"italic"},"code.language-markup":{color:"#f9f9f9"},"code.language-markup .token.tag":{color:"#ef3b7d"},"code.language-markup .token.attr-name":{color:"#a6e22d"},"code.language-markup .token.attr-value":{color:"#e6d06c"},"code.language-markup .token.style":{color:"#76d9e6"},"code.language-markup .token.script":{color:"#76d9e6"},"code.language-markup .token.script .token.keyword":{color:"#76d9e6"},'pre[class*="language-"][data-line]':{position:"relative",padding:"1em 0 1em 3em"},"pre[data-line] .line-highlight":{position:"absolute",left:"0",right:"0",padding:"0",marginTop:"1em",background:"rgba(255, 255, 255, 0.08)",pointerEvents:"none",lineHeight:"inherit",whiteSpace:"pre"},"pre[data-line] .line-highlight:before":{content:"attr(data-start)",position:"absolute",top:".4em",left:".6em",minWidth:"1em",padding:"0.2em 0.5em",backgroundColor:"rgba(255, 255, 255, 0.4)",color:"black",font:"bold 65%/1 sans-serif",height:"1em",lineHeight:"1em",textAlign:"center",borderRadius:"999px",textShadow:"none",boxShadow:"0 1px 1px rgba(255, 255, 255, 0.7)"},"pre[data-line] .line-highlight[data-end]:after":{content:"attr(data-end)",position:"absolute",top:"auto",left:".6em",minWidth:"1em",padding:"0.2em 0.5em",backgroundColor:"rgba(255, 255, 255, 0.4)",color:"black",font:"bold 65%/1 sans-serif",height:"1em",lineHeight:"1em",textAlign:"center",borderRadius:"999px",textShadow:"none",boxShadow:"0 1px 1px rgba(255, 255, 255, 0.7)",bottom:".4em"}}},bAF5:function(e,t,n){"use strict";e.exports=function(e){return e.toLowerCase()}},bFEn:function(e,t,n){"use strict";var o=n("7+hk"),r=n("rS7C")(o,"div");r.displayName="html",e.exports=r},bHgY:function(e,t,n){"use strict";var o=n("FWC9"),r=n("DUvi"),a=o.booleanish,i=o.number,s=o.spaceSeparated;e.exports=r({transform:function(e,t){return"role"===t?t:"aria-"+t.slice(4).toLowerCase()},properties:{ariaActiveDescendant:null,ariaAtomic:a,ariaAutoComplete:null,ariaBusy:a,ariaChecked:a,ariaColCount:i,ariaColIndex:i,ariaColSpan:i,ariaControls:s,ariaCurrent:null,ariaDescribedBy:s,ariaDetails:null,ariaDisabled:a,ariaDropEffect:s,ariaErrorMessage:null,ariaExpanded:a,ariaFlowTo:s,ariaGrabbed:a,ariaHasPopup:null,ariaHidden:a,ariaInvalid:null,ariaKeyShortcuts:null,ariaLabel:null,ariaLabelledBy:s,ariaLevel:i,ariaLive:null,ariaModal:a,ariaMultiLine:a,ariaMultiSelectable:a,ariaOrientation:null,ariaOwns:s,ariaPlaceholder:null,ariaPosInSet:i,ariaPressed:a,ariaReadOnly:a,ariaRelevant:null,ariaRequired:a,ariaRoleDescription:s,ariaRowCount:i,ariaRowIndex:i,ariaRowSpan:i,ariaSelected:a,ariaSetSize:i,ariaSort:null,ariaValueMax:i,ariaValueMin:i,ariaValueNow:i,ariaValueText:null,role:null}})},bS0g:function(e,t,n){"use strict";e.exports=function(e,t,n){var i,s,l,c=r(e,t),u=c[0],d=n?function(e){var t=e.spread,n=e.children,o=n.length,r=-1;for(;!t&&++r0&&u.children.unshift(o("text"," ")),u.children.unshift(e(null,"input",{type:"checkbox",checked:t.checked,disabled:!0})),p.className=["task-list-item"]);i=c.length,s=-1;for(;++s1:t}},bWFg:function(e,t,n){"use strict";e.exports=e=>{if("string"!==typeof e)throw new TypeError("Expected a string");return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}},bwJB:function(e,t,n){"use strict";e.exports=e=>{if("[object Object]"!==Object.prototype.toString.call(e))return!1;const t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}},c2c2:function(e,t,n){"use strict";var o=n("TqRt");Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"coy",{enumerable:!0,get:function(){return r.default}}),Object.defineProperty(t,"dark",{enumerable:!0,get:function(){return a.default}}),Object.defineProperty(t,"funky",{enumerable:!0,get:function(){return i.default}}),Object.defineProperty(t,"okaidia",{enumerable:!0,get:function(){return s.default}}),Object.defineProperty(t,"solarizedlight",{enumerable:!0,get:function(){return l.default}}),Object.defineProperty(t,"tomorrow",{enumerable:!0,get:function(){return c.default}}),Object.defineProperty(t,"twilight",{enumerable:!0,get:function(){return u.default}}),Object.defineProperty(t,"prism",{enumerable:!0,get:function(){return d.default}}),Object.defineProperty(t,"a11yDark",{enumerable:!0,get:function(){return p.default}}),Object.defineProperty(t,"atomDark",{enumerable:!0,get:function(){return f.default}}),Object.defineProperty(t,"base16AteliersulphurpoolLight",{enumerable:!0,get:function(){return h.default}}),Object.defineProperty(t,"cb",{enumerable:!0,get:function(){return m.default}}),Object.defineProperty(t,"darcula",{enumerable:!0,get:function(){return g.default}}),Object.defineProperty(t,"dracula",{enumerable:!0,get:function(){return T.default}}),Object.defineProperty(t,"duotoneDark",{enumerable:!0,get:function(){return E.default}}),Object.defineProperty(t,"duotoneEarth",{enumerable:!0,get:function(){return b.default}}),Object.defineProperty(t,"duotoneForest",{enumerable:!0,get:function(){return A.default}}),Object.defineProperty(t,"duotoneLight",{enumerable:!0,get:function(){return k.default}}),Object.defineProperty(t,"duotoneSea",{enumerable:!0,get:function(){return y.default}}),Object.defineProperty(t,"duotoneSpace",{enumerable:!0,get:function(){return S.default}}),Object.defineProperty(t,"ghcolors",{enumerable:!0,get:function(){return _.default}}),Object.defineProperty(t,"hopscotch",{enumerable:!0,get:function(){return C.default}}),Object.defineProperty(t,"materialDark",{enumerable:!0,get:function(){return x.default}}),Object.defineProperty(t,"materialLight",{enumerable:!0,get:function(){return O.default}}),Object.defineProperty(t,"materialOceanic",{enumerable:!0,get:function(){return N.default}}),Object.defineProperty(t,"nord",{enumerable:!0,get:function(){return v.default}}),Object.defineProperty(t,"pojoaque",{enumerable:!0,get:function(){return M.default}}),Object.defineProperty(t,"shadesOfPurple",{enumerable:!0,get:function(){return R.default}}),Object.defineProperty(t,"synthwave84",{enumerable:!0,get:function(){return w.default}}),Object.defineProperty(t,"vs",{enumerable:!0,get:function(){return I.default}}),Object.defineProperty(t,"vscDarkPlus",{enumerable:!0,get:function(){return L.default}}),Object.defineProperty(t,"xonokai",{enumerable:!0,get:function(){return P.default}});var r=o(n("61xa")),a=o(n("PCRY")),i=o(n("H0fq")),s=o(n("WVFU")),l=o(n("fL8H")),c=o(n("wGQB")),u=o(n("iy38")),d=o(n("6MAg")),p=o(n("yix/")),f=o(n("N4m7")),h=o(n("mAwW")),m=o(n("38Ti")),g=o(n("Tauu")),T=o(n("slJw")),E=o(n("007m")),b=o(n("kWEd")),A=o(n("9891")),k=o(n("4+h/")),y=o(n("++Eq")),S=o(n("Y+Mq")),_=o(n("GVPn")),C=o(n("HbD6")),x=o(n("vjtj")),O=o(n("auM2")),N=o(n("2uWR")),v=o(n("ZOei")),M=o(n("fe/W")),R=o(n("otMa")),w=o(n("BYRM")),I=o(n("C7Ve")),L=o(n("u0PD")),P=o(n("b9um"))},cRLj:function(e,t,n){"use strict";e.exports=new Uint16Array([4,52,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,106,303,412,810,1432,1701,1796,1987,2114,2360,2420,2484,3170,3251,4140,4393,4575,4610,5106,5512,5728,6117,6274,6315,6345,6427,6516,7002,7910,8733,9323,9870,10170,10631,10893,11318,11386,11467,12773,13092,14474,14922,15448,15542,16419,17666,18166,18611,19004,19095,19298,19397,4,16,69,77,97,98,99,102,103,108,109,110,111,112,114,115,116,117,140,150,158,169,176,194,199,210,216,222,226,242,256,266,283,294,108,105,103,5,198,1,59,148,1,198,80,5,38,1,59,156,1,38,99,117,116,101,5,193,1,59,167,1,193,114,101,118,101,59,1,258,4,2,105,121,182,191,114,99,5,194,1,59,189,1,194,59,1,1040,114,59,3,55349,56580,114,97,118,101,5,192,1,59,208,1,192,112,104,97,59,1,913,97,99,114,59,1,256,100,59,1,10835,4,2,103,112,232,237,111,110,59,1,260,102,59,3,55349,56632,112,108,121,70,117,110,99,116,105,111,110,59,1,8289,105,110,103,5,197,1,59,264,1,197,4,2,99,115,272,277,114,59,3,55349,56476,105,103,110,59,1,8788,105,108,100,101,5,195,1,59,292,1,195,109,108,5,196,1,59,301,1,196,4,8,97,99,101,102,111,114,115,117,321,350,354,383,388,394,400,405,4,2,99,114,327,336,107,115,108,97,115,104,59,1,8726,4,2,118,119,342,345,59,1,10983,101,100,59,1,8966,121,59,1,1041,4,3,99,114,116,362,369,379,97,117,115,101,59,1,8757,110,111,117,108,108,105,115,59,1,8492,97,59,1,914,114,59,3,55349,56581,112,102,59,3,55349,56633,101,118,101,59,1,728,99,114,59,1,8492,109,112,101,113,59,1,8782,4,14,72,79,97,99,100,101,102,104,105,108,111,114,115,117,442,447,456,504,542,547,569,573,577,616,678,784,790,796,99,121,59,1,1063,80,89,5,169,1,59,454,1,169,4,3,99,112,121,464,470,497,117,116,101,59,1,262,4,2,59,105,476,478,1,8914,116,97,108,68,105,102,102,101,114,101,110,116,105,97,108,68,59,1,8517,108,101,121,115,59,1,8493,4,4,97,101,105,111,514,520,530,535,114,111,110,59,1,268,100,105,108,5,199,1,59,528,1,199,114,99,59,1,264,110,105,110,116,59,1,8752,111,116,59,1,266,4,2,100,110,553,560,105,108,108,97,59,1,184,116,101,114,68,111,116,59,1,183,114,59,1,8493,105,59,1,935,114,99,108,101,4,4,68,77,80,84,591,596,603,609,111,116,59,1,8857,105,110,117,115,59,1,8854,108,117,115,59,1,8853,105,109,101,115,59,1,8855,111,4,2,99,115,623,646,107,119,105,115,101,67,111,110,116,111,117,114,73,110,116,101,103,114,97,108,59,1,8754,101,67,117,114,108,121,4,2,68,81,658,671,111,117,98,108,101,81,117,111,116,101,59,1,8221,117,111,116,101,59,1,8217,4,4,108,110,112,117,688,701,736,753,111,110,4,2,59,101,696,698,1,8759,59,1,10868,4,3,103,105,116,709,717,722,114,117,101,110,116,59,1,8801,110,116,59,1,8751,111,117,114,73,110,116,101,103,114,97,108,59,1,8750,4,2,102,114,742,745,59,1,8450,111,100,117,99,116,59,1,8720,110,116,101,114,67,108,111,99,107,119,105,115,101,67,111,110,116,111,117,114,73,110,116,101,103,114,97,108,59,1,8755,111,115,115,59,1,10799,99,114,59,3,55349,56478,112,4,2,59,67,803,805,1,8915,97,112,59,1,8781,4,11,68,74,83,90,97,99,101,102,105,111,115,834,850,855,860,865,888,903,916,921,1011,1415,4,2,59,111,840,842,1,8517,116,114,97,104,100,59,1,10513,99,121,59,1,1026,99,121,59,1,1029,99,121,59,1,1039,4,3,103,114,115,873,879,883,103,101,114,59,1,8225,114,59,1,8609,104,118,59,1,10980,4,2,97,121,894,900,114,111,110,59,1,270,59,1,1044,108,4,2,59,116,910,912,1,8711,97,59,1,916,114,59,3,55349,56583,4,2,97,102,927,998,4,2,99,109,933,992,114,105,116,105,99,97,108,4,4,65,68,71,84,950,957,978,985,99,117,116,101,59,1,180,111,4,2,116,117,964,967,59,1,729,98,108,101,65,99,117,116,101,59,1,733,114,97,118,101,59,1,96,105,108,100,101,59,1,732,111,110,100,59,1,8900,102,101,114,101,110,116,105,97,108,68,59,1,8518,4,4,112,116,117,119,1021,1026,1048,1249,102,59,3,55349,56635,4,3,59,68,69,1034,1036,1041,1,168,111,116,59,1,8412,113,117,97,108,59,1,8784,98,108,101,4,6,67,68,76,82,85,86,1065,1082,1101,1189,1211,1236,111,110,116,111,117,114,73,110,116,101,103,114,97,108,59,1,8751,111,4,2,116,119,1089,1092,59,1,168,110,65,114,114,111,119,59,1,8659,4,2,101,111,1107,1141,102,116,4,3,65,82,84,1117,1124,1136,114,114,111,119,59,1,8656,105,103,104,116,65,114,114,111,119,59,1,8660,101,101,59,1,10980,110,103,4,2,76,82,1149,1177,101,102,116,4,2,65,82,1158,1165,114,114,111,119,59,1,10232,105,103,104,116,65,114,114,111,119,59,1,10234,105,103,104,116,65,114,114,111,119,59,1,10233,105,103,104,116,4,2,65,84,1199,1206,114,114,111,119,59,1,8658,101,101,59,1,8872,112,4,2,65,68,1218,1225,114,114,111,119,59,1,8657,111,119,110,65,114,114,111,119,59,1,8661,101,114,116,105,99,97,108,66,97,114,59,1,8741,110,4,6,65,66,76,82,84,97,1264,1292,1299,1352,1391,1408,114,114,111,119,4,3,59,66,85,1276,1278,1283,1,8595,97,114,59,1,10515,112,65,114,114,111,119,59,1,8693,114,101,118,101,59,1,785,101,102,116,4,3,82,84,86,1310,1323,1334,105,103,104,116,86,101,99,116,111,114,59,1,10576,101,101,86,101,99,116,111,114,59,1,10590,101,99,116,111,114,4,2,59,66,1345,1347,1,8637,97,114,59,1,10582,105,103,104,116,4,2,84,86,1362,1373,101,101,86,101,99,116,111,114,59,1,10591,101,99,116,111,114,4,2,59,66,1384,1386,1,8641,97,114,59,1,10583,101,101,4,2,59,65,1399,1401,1,8868,114,114,111,119,59,1,8615,114,114,111,119,59,1,8659,4,2,99,116,1421,1426,114,59,3,55349,56479,114,111,107,59,1,272,4,16,78,84,97,99,100,102,103,108,109,111,112,113,115,116,117,120,1466,1470,1478,1489,1515,1520,1525,1536,1544,1593,1609,1617,1650,1664,1668,1677,71,59,1,330,72,5,208,1,59,1476,1,208,99,117,116,101,5,201,1,59,1487,1,201,4,3,97,105,121,1497,1503,1512,114,111,110,59,1,282,114,99,5,202,1,59,1510,1,202,59,1,1069,111,116,59,1,278,114,59,3,55349,56584,114,97,118,101,5,200,1,59,1534,1,200,101,109,101,110,116,59,1,8712,4,2,97,112,1550,1555,99,114,59,1,274,116,121,4,2,83,86,1563,1576,109,97,108,108,83,113,117,97,114,101,59,1,9723,101,114,121,83,109,97,108,108,83,113,117,97,114,101,59,1,9643,4,2,103,112,1599,1604,111,110,59,1,280,102,59,3,55349,56636,115,105,108,111,110,59,1,917,117,4,2,97,105,1624,1640,108,4,2,59,84,1631,1633,1,10869,105,108,100,101,59,1,8770,108,105,98,114,105,117,109,59,1,8652,4,2,99,105,1656,1660,114,59,1,8496,109,59,1,10867,97,59,1,919,109,108,5,203,1,59,1675,1,203,4,2,105,112,1683,1689,115,116,115,59,1,8707,111,110,101,110,116,105,97,108,69,59,1,8519,4,5,99,102,105,111,115,1713,1717,1722,1762,1791,121,59,1,1060,114,59,3,55349,56585,108,108,101,100,4,2,83,86,1732,1745,109,97,108,108,83,113,117,97,114,101,59,1,9724,101,114,121,83,109,97,108,108,83,113,117,97,114,101,59,1,9642,4,3,112,114,117,1770,1775,1781,102,59,3,55349,56637,65,108,108,59,1,8704,114,105,101,114,116,114,102,59,1,8497,99,114,59,1,8497,4,12,74,84,97,98,99,100,102,103,111,114,115,116,1822,1827,1834,1848,1855,1877,1882,1887,1890,1896,1978,1984,99,121,59,1,1027,5,62,1,59,1832,1,62,109,109,97,4,2,59,100,1843,1845,1,915,59,1,988,114,101,118,101,59,1,286,4,3,101,105,121,1863,1869,1874,100,105,108,59,1,290,114,99,59,1,284,59,1,1043,111,116,59,1,288,114,59,3,55349,56586,59,1,8921,112,102,59,3,55349,56638,101,97,116,101,114,4,6,69,70,71,76,83,84,1915,1933,1944,1953,1959,1971,113,117,97,108,4,2,59,76,1925,1927,1,8805,101,115,115,59,1,8923,117,108,108,69,113,117,97,108,59,1,8807,114,101,97,116,101,114,59,1,10914,101,115,115,59,1,8823,108,97,110,116,69,113,117,97,108,59,1,10878,105,108,100,101,59,1,8819,99,114,59,3,55349,56482,59,1,8811,4,8,65,97,99,102,105,111,115,117,2005,2012,2026,2032,2036,2049,2073,2089,82,68,99,121,59,1,1066,4,2,99,116,2018,2023,101,107,59,1,711,59,1,94,105,114,99,59,1,292,114,59,1,8460,108,98,101,114,116,83,112,97,99,101,59,1,8459,4,2,112,114,2055,2059,102,59,1,8461,105,122,111,110,116,97,108,76,105,110,101,59,1,9472,4,2,99,116,2079,2083,114,59,1,8459,114,111,107,59,1,294,109,112,4,2,68,69,2097,2107,111,119,110,72,117,109,112,59,1,8782,113,117,97,108,59,1,8783,4,14,69,74,79,97,99,100,102,103,109,110,111,115,116,117,2144,2149,2155,2160,2171,2189,2194,2198,2209,2245,2307,2329,2334,2341,99,121,59,1,1045,108,105,103,59,1,306,99,121,59,1,1025,99,117,116,101,5,205,1,59,2169,1,205,4,2,105,121,2177,2186,114,99,5,206,1,59,2184,1,206,59,1,1048,111,116,59,1,304,114,59,1,8465,114,97,118,101,5,204,1,59,2207,1,204,4,3,59,97,112,2217,2219,2238,1,8465,4,2,99,103,2225,2229,114,59,1,298,105,110,97,114,121,73,59,1,8520,108,105,101,115,59,1,8658,4,2,116,118,2251,2281,4,2,59,101,2257,2259,1,8748,4,2,103,114,2265,2271,114,97,108,59,1,8747,115,101,99,116,105,111,110,59,1,8898,105,115,105,98,108,101,4,2,67,84,2293,2300,111,109,109,97,59,1,8291,105,109,101,115,59,1,8290,4,3,103,112,116,2315,2320,2325,111,110,59,1,302,102,59,3,55349,56640,97,59,1,921,99,114,59,1,8464,105,108,100,101,59,1,296,4,2,107,109,2347,2352,99,121,59,1,1030,108,5,207,1,59,2358,1,207,4,5,99,102,111,115,117,2372,2386,2391,2397,2414,4,2,105,121,2378,2383,114,99,59,1,308,59,1,1049,114,59,3,55349,56589,112,102,59,3,55349,56641,4,2,99,101,2403,2408,114,59,3,55349,56485,114,99,121,59,1,1032,107,99,121,59,1,1028,4,7,72,74,97,99,102,111,115,2436,2441,2446,2452,2467,2472,2478,99,121,59,1,1061,99,121,59,1,1036,112,112,97,59,1,922,4,2,101,121,2458,2464,100,105,108,59,1,310,59,1,1050,114,59,3,55349,56590,112,102,59,3,55349,56642,99,114,59,3,55349,56486,4,11,74,84,97,99,101,102,108,109,111,115,116,2508,2513,2520,2562,2585,2981,2986,3004,3011,3146,3167,99,121,59,1,1033,5,60,1,59,2518,1,60,4,5,99,109,110,112,114,2532,2538,2544,2548,2558,117,116,101,59,1,313,98,100,97,59,1,923,103,59,1,10218,108,97,99,101,116,114,102,59,1,8466,114,59,1,8606,4,3,97,101,121,2570,2576,2582,114,111,110,59,1,317,100,105,108,59,1,315,59,1,1051,4,2,102,115,2591,2907,116,4,10,65,67,68,70,82,84,85,86,97,114,2614,2663,2672,2728,2735,2760,2820,2870,2888,2895,4,2,110,114,2620,2633,103,108,101,66,114,97,99,107,101,116,59,1,10216,114,111,119,4,3,59,66,82,2644,2646,2651,1,8592,97,114,59,1,8676,105,103,104,116,65,114,114,111,119,59,1,8646,101,105,108,105,110,103,59,1,8968,111,4,2,117,119,2679,2692,98,108,101,66,114,97,99,107,101,116,59,1,10214,110,4,2,84,86,2699,2710,101,101,86,101,99,116,111,114,59,1,10593,101,99,116,111,114,4,2,59,66,2721,2723,1,8643,97,114,59,1,10585,108,111,111,114,59,1,8970,105,103,104,116,4,2,65,86,2745,2752,114,114,111,119,59,1,8596,101,99,116,111,114,59,1,10574,4,2,101,114,2766,2792,101,4,3,59,65,86,2775,2777,2784,1,8867,114,114,111,119,59,1,8612,101,99,116,111,114,59,1,10586,105,97,110,103,108,101,4,3,59,66,69,2806,2808,2813,1,8882,97,114,59,1,10703,113,117,97,108,59,1,8884,112,4,3,68,84,86,2829,2841,2852,111,119,110,86,101,99,116,111,114,59,1,10577,101,101,86,101,99,116,111,114,59,1,10592,101,99,116,111,114,4,2,59,66,2863,2865,1,8639,97,114,59,1,10584,101,99,116,111,114,4,2,59,66,2881,2883,1,8636,97,114,59,1,10578,114,114,111,119,59,1,8656,105,103,104,116,97,114,114,111,119,59,1,8660,115,4,6,69,70,71,76,83,84,2922,2936,2947,2956,2962,2974,113,117,97,108,71,114,101,97,116,101,114,59,1,8922,117,108,108,69,113,117,97,108,59,1,8806,114,101,97,116,101,114,59,1,8822,101,115,115,59,1,10913,108,97,110,116,69,113,117,97,108,59,1,10877,105,108,100,101,59,1,8818,114,59,3,55349,56591,4,2,59,101,2992,2994,1,8920,102,116,97,114,114,111,119,59,1,8666,105,100,111,116,59,1,319,4,3,110,112,119,3019,3110,3115,103,4,4,76,82,108,114,3030,3058,3070,3098,101,102,116,4,2,65,82,3039,3046,114,114,111,119,59,1,10229,105,103,104,116,65,114,114,111,119,59,1,10231,105,103,104,116,65,114,114,111,119,59,1,10230,101,102,116,4,2,97,114,3079,3086,114,114,111,119,59,1,10232,105,103,104,116,97,114,114,111,119,59,1,10234,105,103,104,116,97,114,114,111,119,59,1,10233,102,59,3,55349,56643,101,114,4,2,76,82,3123,3134,101,102,116,65,114,114,111,119,59,1,8601,105,103,104,116,65,114,114,111,119,59,1,8600,4,3,99,104,116,3154,3158,3161,114,59,1,8466,59,1,8624,114,111,107,59,1,321,59,1,8810,4,8,97,99,101,102,105,111,115,117,3188,3192,3196,3222,3227,3237,3243,3248,112,59,1,10501,121,59,1,1052,4,2,100,108,3202,3213,105,117,109,83,112,97,99,101,59,1,8287,108,105,110,116,114,102,59,1,8499,114,59,3,55349,56592,110,117,115,80,108,117,115,59,1,8723,112,102,59,3,55349,56644,99,114,59,1,8499,59,1,924,4,9,74,97,99,101,102,111,115,116,117,3271,3276,3283,3306,3422,3427,4120,4126,4137,99,121,59,1,1034,99,117,116,101,59,1,323,4,3,97,101,121,3291,3297,3303,114,111,110,59,1,327,100,105,108,59,1,325,59,1,1053,4,3,103,115,119,3314,3380,3415,97,116,105,118,101,4,3,77,84,86,3327,3340,3365,101,100,105,117,109,83,112,97,99,101,59,1,8203,104,105,4,2,99,110,3348,3357,107,83,112,97,99,101,59,1,8203,83,112,97,99,101,59,1,8203,101,114,121,84,104,105,110,83,112,97,99,101,59,1,8203,116,101,100,4,2,71,76,3389,3405,114,101,97,116,101,114,71,114,101,97,116,101,114,59,1,8811,101,115,115,76,101,115,115,59,1,8810,76,105,110,101,59,1,10,114,59,3,55349,56593,4,4,66,110,112,116,3437,3444,3460,3464,114,101,97,107,59,1,8288,66,114,101,97,107,105,110,103,83,112,97,99,101,59,1,160,102,59,1,8469,4,13,59,67,68,69,71,72,76,78,80,82,83,84,86,3492,3494,3517,3536,3578,3657,3685,3784,3823,3860,3915,4066,4107,1,10988,4,2,111,117,3500,3510,110,103,114,117,101,110,116,59,1,8802,112,67,97,112,59,1,8813,111,117,98,108,101,86,101,114,116,105,99,97,108,66,97,114,59,1,8742,4,3,108,113,120,3544,3552,3571,101,109,101,110,116,59,1,8713,117,97,108,4,2,59,84,3561,3563,1,8800,105,108,100,101,59,3,8770,824,105,115,116,115,59,1,8708,114,101,97,116,101,114,4,7,59,69,70,71,76,83,84,3600,3602,3609,3621,3631,3637,3650,1,8815,113,117,97,108,59,1,8817,117,108,108,69,113,117,97,108,59,3,8807,824,114,101,97,116,101,114,59,3,8811,824,101,115,115,59,1,8825,108,97,110,116,69,113,117,97,108,59,3,10878,824,105,108,100,101,59,1,8821,117,109,112,4,2,68,69,3666,3677,111,119,110,72,117,109,112,59,3,8782,824,113,117,97,108,59,3,8783,824,101,4,2,102,115,3692,3724,116,84,114,105,97,110,103,108,101,4,3,59,66,69,3709,3711,3717,1,8938,97,114,59,3,10703,824,113,117,97,108,59,1,8940,115,4,6,59,69,71,76,83,84,3739,3741,3748,3757,3764,3777,1,8814,113,117,97,108,59,1,8816,114,101,97,116,101,114,59,1,8824,101,115,115,59,3,8810,824,108,97,110,116,69,113,117,97,108,59,3,10877,824,105,108,100,101,59,1,8820,101,115,116,101,100,4,2,71,76,3795,3812,114,101,97,116,101,114,71,114,101,97,116,101,114,59,3,10914,824,101,115,115,76,101,115,115,59,3,10913,824,114,101,99,101,100,101,115,4,3,59,69,83,3838,3840,3848,1,8832,113,117,97,108,59,3,10927,824,108,97,110,116,69,113,117,97,108,59,1,8928,4,2,101,105,3866,3881,118,101,114,115,101,69,108,101,109,101,110,116,59,1,8716,103,104,116,84,114,105,97,110,103,108,101,4,3,59,66,69,3900,3902,3908,1,8939,97,114,59,3,10704,824,113,117,97,108,59,1,8941,4,2,113,117,3921,3973,117,97,114,101,83,117,4,2,98,112,3933,3952,115,101,116,4,2,59,69,3942,3945,3,8847,824,113,117,97,108,59,1,8930,101,114,115,101,116,4,2,59,69,3963,3966,3,8848,824,113,117,97,108,59,1,8931,4,3,98,99,112,3981,4e3,4045,115,101,116,4,2,59,69,3990,3993,3,8834,8402,113,117,97,108,59,1,8840,99,101,101,100,115,4,4,59,69,83,84,4015,4017,4025,4037,1,8833,113,117,97,108,59,3,10928,824,108,97,110,116,69,113,117,97,108,59,1,8929,105,108,100,101,59,3,8831,824,101,114,115,101,116,4,2,59,69,4056,4059,3,8835,8402,113,117,97,108,59,1,8841,105,108,100,101,4,4,59,69,70,84,4080,4082,4089,4100,1,8769,113,117,97,108,59,1,8772,117,108,108,69,113,117,97,108,59,1,8775,105,108,100,101,59,1,8777,101,114,116,105,99,97,108,66,97,114,59,1,8740,99,114,59,3,55349,56489,105,108,100,101,5,209,1,59,4135,1,209,59,1,925,4,14,69,97,99,100,102,103,109,111,112,114,115,116,117,118,4170,4176,4187,4205,4212,4217,4228,4253,4259,4292,4295,4316,4337,4346,108,105,103,59,1,338,99,117,116,101,5,211,1,59,4185,1,211,4,2,105,121,4193,4202,114,99,5,212,1,59,4200,1,212,59,1,1054,98,108,97,99,59,1,336,114,59,3,55349,56594,114,97,118,101,5,210,1,59,4226,1,210,4,3,97,101,105,4236,4241,4246,99,114,59,1,332,103,97,59,1,937,99,114,111,110,59,1,927,112,102,59,3,55349,56646,101,110,67,117,114,108,121,4,2,68,81,4272,4285,111,117,98,108,101,81,117,111,116,101,59,1,8220,117,111,116,101,59,1,8216,59,1,10836,4,2,99,108,4301,4306,114,59,3,55349,56490,97,115,104,5,216,1,59,4314,1,216,105,4,2,108,109,4323,4332,100,101,5,213,1,59,4330,1,213,101,115,59,1,10807,109,108,5,214,1,59,4344,1,214,101,114,4,2,66,80,4354,4380,4,2,97,114,4360,4364,114,59,1,8254,97,99,4,2,101,107,4372,4375,59,1,9182,101,116,59,1,9140,97,114,101,110,116,104,101,115,105,115,59,1,9180,4,9,97,99,102,104,105,108,111,114,115,4413,4422,4426,4431,4435,4438,4448,4471,4561,114,116,105,97,108,68,59,1,8706,121,59,1,1055,114,59,3,55349,56595,105,59,1,934,59,1,928,117,115,77,105,110,117,115,59,1,177,4,2,105,112,4454,4467,110,99,97,114,101,112,108,97,110,101,59,1,8460,102,59,1,8473,4,4,59,101,105,111,4481,4483,4526,4531,1,10939,99,101,100,101,115,4,4,59,69,83,84,4498,4500,4507,4519,1,8826,113,117,97,108,59,1,10927,108,97,110,116,69,113,117,97,108,59,1,8828,105,108,100,101,59,1,8830,109,101,59,1,8243,4,2,100,112,4537,4543,117,99,116,59,1,8719,111,114,116,105,111,110,4,2,59,97,4555,4557,1,8759,108,59,1,8733,4,2,99,105,4567,4572,114,59,3,55349,56491,59,1,936,4,4,85,102,111,115,4585,4594,4599,4604,79,84,5,34,1,59,4592,1,34,114,59,3,55349,56596,112,102,59,1,8474,99,114,59,3,55349,56492,4,12,66,69,97,99,101,102,104,105,111,114,115,117,4636,4642,4650,4681,4704,4763,4767,4771,5047,5069,5081,5094,97,114,114,59,1,10512,71,5,174,1,59,4648,1,174,4,3,99,110,114,4658,4664,4668,117,116,101,59,1,340,103,59,1,10219,114,4,2,59,116,4675,4677,1,8608,108,59,1,10518,4,3,97,101,121,4689,4695,4701,114,111,110,59,1,344,100,105,108,59,1,342,59,1,1056,4,2,59,118,4710,4712,1,8476,101,114,115,101,4,2,69,85,4722,4748,4,2,108,113,4728,4736,101,109,101,110,116,59,1,8715,117,105,108,105,98,114,105,117,109,59,1,8651,112,69,113,117,105,108,105,98,114,105,117,109,59,1,10607,114,59,1,8476,111,59,1,929,103,104,116,4,8,65,67,68,70,84,85,86,97,4792,4840,4849,4905,4912,4972,5022,5040,4,2,110,114,4798,4811,103,108,101,66,114,97,99,107,101,116,59,1,10217,114,111,119,4,3,59,66,76,4822,4824,4829,1,8594,97,114,59,1,8677,101,102,116,65,114,114,111,119,59,1,8644,101,105,108,105,110,103,59,1,8969,111,4,2,117,119,4856,4869,98,108,101,66,114,97,99,107,101,116,59,1,10215,110,4,2,84,86,4876,4887,101,101,86,101,99,116,111,114,59,1,10589,101,99,116,111,114,4,2,59,66,4898,4900,1,8642,97,114,59,1,10581,108,111,111,114,59,1,8971,4,2,101,114,4918,4944,101,4,3,59,65,86,4927,4929,4936,1,8866,114,114,111,119,59,1,8614,101,99,116,111,114,59,1,10587,105,97,110,103,108,101,4,3,59,66,69,4958,4960,4965,1,8883,97,114,59,1,10704,113,117,97,108,59,1,8885,112,4,3,68,84,86,4981,4993,5004,111,119,110,86,101,99,116,111,114,59,1,10575,101,101,86,101,99,116,111,114,59,1,10588,101,99,116,111,114,4,2,59,66,5015,5017,1,8638,97,114,59,1,10580,101,99,116,111,114,4,2,59,66,5033,5035,1,8640,97,114,59,1,10579,114,114,111,119,59,1,8658,4,2,112,117,5053,5057,102,59,1,8477,110,100,73,109,112,108,105,101,115,59,1,10608,105,103,104,116,97,114,114,111,119,59,1,8667,4,2,99,104,5087,5091,114,59,1,8475,59,1,8625,108,101,68,101,108,97,121,101,100,59,1,10740,4,13,72,79,97,99,102,104,105,109,111,113,115,116,117,5134,5150,5157,5164,5198,5203,5259,5265,5277,5283,5374,5380,5385,4,2,67,99,5140,5146,72,99,121,59,1,1065,121,59,1,1064,70,84,99,121,59,1,1068,99,117,116,101,59,1,346,4,5,59,97,101,105,121,5176,5178,5184,5190,5195,1,10940,114,111,110,59,1,352,100,105,108,59,1,350,114,99,59,1,348,59,1,1057,114,59,3,55349,56598,111,114,116,4,4,68,76,82,85,5216,5227,5238,5250,111,119,110,65,114,114,111,119,59,1,8595,101,102,116,65,114,114,111,119,59,1,8592,105,103,104,116,65,114,114,111,119,59,1,8594,112,65,114,114,111,119,59,1,8593,103,109,97,59,1,931,97,108,108,67,105,114,99,108,101,59,1,8728,112,102,59,3,55349,56650,4,2,114,117,5289,5293,116,59,1,8730,97,114,101,4,4,59,73,83,85,5306,5308,5322,5367,1,9633,110,116,101,114,115,101,99,116,105,111,110,59,1,8851,117,4,2,98,112,5329,5347,115,101,116,4,2,59,69,5338,5340,1,8847,113,117,97,108,59,1,8849,101,114,115,101,116,4,2,59,69,5358,5360,1,8848,113,117,97,108,59,1,8850,110,105,111,110,59,1,8852,99,114,59,3,55349,56494,97,114,59,1,8902,4,4,98,99,109,112,5395,5420,5475,5478,4,2,59,115,5401,5403,1,8912,101,116,4,2,59,69,5411,5413,1,8912,113,117,97,108,59,1,8838,4,2,99,104,5426,5468,101,101,100,115,4,4,59,69,83,84,5440,5442,5449,5461,1,8827,113,117,97,108,59,1,10928,108,97,110,116,69,113,117,97,108,59,1,8829,105,108,100,101,59,1,8831,84,104,97,116,59,1,8715,59,1,8721,4,3,59,101,115,5486,5488,5507,1,8913,114,115,101,116,4,2,59,69,5498,5500,1,8835,113,117,97,108,59,1,8839,101,116,59,1,8913,4,11,72,82,83,97,99,102,104,105,111,114,115,5536,5546,5552,5567,5579,5602,5607,5655,5695,5701,5711,79,82,78,5,222,1,59,5544,1,222,65,68,69,59,1,8482,4,2,72,99,5558,5563,99,121,59,1,1035,121,59,1,1062,4,2,98,117,5573,5576,59,1,9,59,1,932,4,3,97,101,121,5587,5593,5599,114,111,110,59,1,356,100,105,108,59,1,354,59,1,1058,114,59,3,55349,56599,4,2,101,105,5613,5631,4,2,114,116,5619,5627,101,102,111,114,101,59,1,8756,97,59,1,920,4,2,99,110,5637,5647,107,83,112,97,99,101,59,3,8287,8202,83,112,97,99,101,59,1,8201,108,100,101,4,4,59,69,70,84,5668,5670,5677,5688,1,8764,113,117,97,108,59,1,8771,117,108,108,69,113,117,97,108,59,1,8773,105,108,100,101,59,1,8776,112,102,59,3,55349,56651,105,112,108,101,68,111,116,59,1,8411,4,2,99,116,5717,5722,114,59,3,55349,56495,114,111,107,59,1,358,4,14,97,98,99,100,102,103,109,110,111,112,114,115,116,117,5758,5789,5805,5823,5830,5835,5846,5852,5921,5937,6089,6095,6101,6108,4,2,99,114,5764,5774,117,116,101,5,218,1,59,5772,1,218,114,4,2,59,111,5781,5783,1,8607,99,105,114,59,1,10569,114,4,2,99,101,5796,5800,121,59,1,1038,118,101,59,1,364,4,2,105,121,5811,5820,114,99,5,219,1,59,5818,1,219,59,1,1059,98,108,97,99,59,1,368,114,59,3,55349,56600,114,97,118,101,5,217,1,59,5844,1,217,97,99,114,59,1,362,4,2,100,105,5858,5905,101,114,4,2,66,80,5866,5892,4,2,97,114,5872,5876,114,59,1,95,97,99,4,2,101,107,5884,5887,59,1,9183,101,116,59,1,9141,97,114,101,110,116,104,101,115,105,115,59,1,9181,111,110,4,2,59,80,5913,5915,1,8899,108,117,115,59,1,8846,4,2,103,112,5927,5932,111,110,59,1,370,102,59,3,55349,56652,4,8,65,68,69,84,97,100,112,115,5955,5985,5996,6009,6026,6033,6044,6075,114,114,111,119,4,3,59,66,68,5967,5969,5974,1,8593,97,114,59,1,10514,111,119,110,65,114,114,111,119,59,1,8645,111,119,110,65,114,114,111,119,59,1,8597,113,117,105,108,105,98,114,105,117,109,59,1,10606,101,101,4,2,59,65,6017,6019,1,8869,114,114,111,119,59,1,8613,114,114,111,119,59,1,8657,111,119,110,97,114,114,111,119,59,1,8661,101,114,4,2,76,82,6052,6063,101,102,116,65,114,114,111,119,59,1,8598,105,103,104,116,65,114,114,111,119,59,1,8599,105,4,2,59,108,6082,6084,1,978,111,110,59,1,933,105,110,103,59,1,366,99,114,59,3,55349,56496,105,108,100,101,59,1,360,109,108,5,220,1,59,6115,1,220,4,9,68,98,99,100,101,102,111,115,118,6137,6143,6148,6152,6166,6250,6255,6261,6267,97,115,104,59,1,8875,97,114,59,1,10987,121,59,1,1042,97,115,104,4,2,59,108,6161,6163,1,8873,59,1,10982,4,2,101,114,6172,6175,59,1,8897,4,3,98,116,121,6183,6188,6238,97,114,59,1,8214,4,2,59,105,6194,6196,1,8214,99,97,108,4,4,66,76,83,84,6209,6214,6220,6231,97,114,59,1,8739,105,110,101,59,1,124,101,112,97,114,97,116,111,114,59,1,10072,105,108,100,101,59,1,8768,84,104,105,110,83,112,97,99,101,59,1,8202,114,59,3,55349,56601,112,102,59,3,55349,56653,99,114,59,3,55349,56497,100,97,115,104,59,1,8874,4,5,99,101,102,111,115,6286,6292,6298,6303,6309,105,114,99,59,1,372,100,103,101,59,1,8896,114,59,3,55349,56602,112,102,59,3,55349,56654,99,114,59,3,55349,56498,4,4,102,105,111,115,6325,6330,6333,6339,114,59,3,55349,56603,59,1,926,112,102,59,3,55349,56655,99,114,59,3,55349,56499,4,9,65,73,85,97,99,102,111,115,117,6365,6370,6375,6380,6391,6405,6410,6416,6422,99,121,59,1,1071,99,121,59,1,1031,99,121,59,1,1070,99,117,116,101,5,221,1,59,6389,1,221,4,2,105,121,6397,6402,114,99,59,1,374,59,1,1067,114,59,3,55349,56604,112,102,59,3,55349,56656,99,114,59,3,55349,56500,109,108,59,1,376,4,8,72,97,99,100,101,102,111,115,6445,6450,6457,6472,6477,6501,6505,6510,99,121,59,1,1046,99,117,116,101,59,1,377,4,2,97,121,6463,6469,114,111,110,59,1,381,59,1,1047,111,116,59,1,379,4,2,114,116,6483,6497,111,87,105,100,116,104,83,112,97,99,101,59,1,8203,97,59,1,918,114,59,1,8488,112,102,59,1,8484,99,114,59,3,55349,56501,4,16,97,98,99,101,102,103,108,109,110,111,112,114,115,116,117,119,6550,6561,6568,6612,6622,6634,6645,6672,6699,6854,6870,6923,6933,6963,6974,6983,99,117,116,101,5,225,1,59,6559,1,225,114,101,118,101,59,1,259,4,6,59,69,100,105,117,121,6582,6584,6588,6591,6600,6609,1,8766,59,3,8766,819,59,1,8767,114,99,5,226,1,59,6598,1,226,116,101,5,180,1,59,6607,1,180,59,1,1072,108,105,103,5,230,1,59,6620,1,230,4,2,59,114,6628,6630,1,8289,59,3,55349,56606,114,97,118,101,5,224,1,59,6643,1,224,4,2,101,112,6651,6667,4,2,102,112,6657,6663,115,121,109,59,1,8501,104,59,1,8501,104,97,59,1,945,4,2,97,112,6678,6692,4,2,99,108,6684,6688,114,59,1,257,103,59,1,10815,5,38,1,59,6697,1,38,4,2,100,103,6705,6737,4,5,59,97,100,115,118,6717,6719,6724,6727,6734,1,8743,110,100,59,1,10837,59,1,10844,108,111,112,101,59,1,10840,59,1,10842,4,7,59,101,108,109,114,115,122,6753,6755,6758,6762,6814,6835,6848,1,8736,59,1,10660,101,59,1,8736,115,100,4,2,59,97,6770,6772,1,8737,4,8,97,98,99,100,101,102,103,104,6790,6793,6796,6799,6802,6805,6808,6811,59,1,10664,59,1,10665,59,1,10666,59,1,10667,59,1,10668,59,1,10669,59,1,10670,59,1,10671,116,4,2,59,118,6821,6823,1,8735,98,4,2,59,100,6830,6832,1,8894,59,1,10653,4,2,112,116,6841,6845,104,59,1,8738,59,1,197,97,114,114,59,1,9084,4,2,103,112,6860,6865,111,110,59,1,261,102,59,3,55349,56658,4,7,59,69,97,101,105,111,112,6886,6888,6891,6897,6900,6904,6908,1,8776,59,1,10864,99,105,114,59,1,10863,59,1,8778,100,59,1,8779,115,59,1,39,114,111,120,4,2,59,101,6917,6919,1,8776,113,59,1,8778,105,110,103,5,229,1,59,6931,1,229,4,3,99,116,121,6941,6946,6949,114,59,3,55349,56502,59,1,42,109,112,4,2,59,101,6957,6959,1,8776,113,59,1,8781,105,108,100,101,5,227,1,59,6972,1,227,109,108,5,228,1,59,6981,1,228,4,2,99,105,6989,6997,111,110,105,110,116,59,1,8755,110,116,59,1,10769,4,16,78,97,98,99,100,101,102,105,107,108,110,111,112,114,115,117,7036,7041,7119,7135,7149,7155,7219,7224,7347,7354,7463,7489,7786,7793,7814,7866,111,116,59,1,10989,4,2,99,114,7047,7094,107,4,4,99,101,112,115,7058,7064,7073,7080,111,110,103,59,1,8780,112,115,105,108,111,110,59,1,1014,114,105,109,101,59,1,8245,105,109,4,2,59,101,7088,7090,1,8765,113,59,1,8909,4,2,118,119,7100,7105,101,101,59,1,8893,101,100,4,2,59,103,7113,7115,1,8965,101,59,1,8965,114,107,4,2,59,116,7127,7129,1,9141,98,114,107,59,1,9142,4,2,111,121,7141,7146,110,103,59,1,8780,59,1,1073,113,117,111,59,1,8222,4,5,99,109,112,114,116,7167,7181,7188,7193,7199,97,117,115,4,2,59,101,7176,7178,1,8757,59,1,8757,112,116,121,118,59,1,10672,115,105,59,1,1014,110,111,117,59,1,8492,4,3,97,104,119,7207,7210,7213,59,1,946,59,1,8502,101,101,110,59,1,8812,114,59,3,55349,56607,103,4,7,99,111,115,116,117,118,119,7241,7262,7288,7305,7328,7335,7340,4,3,97,105,117,7249,7253,7258,112,59,1,8898,114,99,59,1,9711,112,59,1,8899,4,3,100,112,116,7270,7275,7281,111,116,59,1,10752,108,117,115,59,1,10753,105,109,101,115,59,1,10754,4,2,113,116,7294,7300,99,117,112,59,1,10758,97,114,59,1,9733,114,105,97,110,103,108,101,4,2,100,117,7318,7324,111,119,110,59,1,9661,112,59,1,9651,112,108,117,115,59,1,10756,101,101,59,1,8897,101,100,103,101,59,1,8896,97,114,111,119,59,1,10509,4,3,97,107,111,7362,7436,7458,4,2,99,110,7368,7432,107,4,3,108,115,116,7377,7386,7394,111,122,101,110,103,101,59,1,10731,113,117,97,114,101,59,1,9642,114,105,97,110,103,108,101,4,4,59,100,108,114,7411,7413,7419,7425,1,9652,111,119,110,59,1,9662,101,102,116,59,1,9666,105,103,104,116,59,1,9656,107,59,1,9251,4,2,49,51,7442,7454,4,2,50,52,7448,7451,59,1,9618,59,1,9617,52,59,1,9619,99,107,59,1,9608,4,2,101,111,7469,7485,4,2,59,113,7475,7478,3,61,8421,117,105,118,59,3,8801,8421,116,59,1,8976,4,4,112,116,119,120,7499,7504,7517,7523,102,59,3,55349,56659,4,2,59,116,7510,7512,1,8869,111,109,59,1,8869,116,105,101,59,1,8904,4,12,68,72,85,86,98,100,104,109,112,116,117,118,7549,7571,7597,7619,7655,7660,7682,7708,7715,7721,7728,7750,4,4,76,82,108,114,7559,7562,7565,7568,59,1,9559,59,1,9556,59,1,9558,59,1,9555,4,5,59,68,85,100,117,7583,7585,7588,7591,7594,1,9552,59,1,9574,59,1,9577,59,1,9572,59,1,9575,4,4,76,82,108,114,7607,7610,7613,7616,59,1,9565,59,1,9562,59,1,9564,59,1,9561,4,7,59,72,76,82,104,108,114,7635,7637,7640,7643,7646,7649,7652,1,9553,59,1,9580,59,1,9571,59,1,9568,59,1,9579,59,1,9570,59,1,9567,111,120,59,1,10697,4,4,76,82,108,114,7670,7673,7676,7679,59,1,9557,59,1,9554,59,1,9488,59,1,9484,4,5,59,68,85,100,117,7694,7696,7699,7702,7705,1,9472,59,1,9573,59,1,9576,59,1,9516,59,1,9524,105,110,117,115,59,1,8863,108,117,115,59,1,8862,105,109,101,115,59,1,8864,4,4,76,82,108,114,7738,7741,7744,7747,59,1,9563,59,1,9560,59,1,9496,59,1,9492,4,7,59,72,76,82,104,108,114,7766,7768,7771,7774,7777,7780,7783,1,9474,59,1,9578,59,1,9569,59,1,9566,59,1,9532,59,1,9508,59,1,9500,114,105,109,101,59,1,8245,4,2,101,118,7799,7804,118,101,59,1,728,98,97,114,5,166,1,59,7812,1,166,4,4,99,101,105,111,7824,7829,7834,7846,114,59,3,55349,56503,109,105,59,1,8271,109,4,2,59,101,7841,7843,1,8765,59,1,8909,108,4,3,59,98,104,7855,7857,7860,1,92,59,1,10693,115,117,98,59,1,10184,4,2,108,109,7872,7885,108,4,2,59,101,7879,7881,1,8226,116,59,1,8226,112,4,3,59,69,101,7894,7896,7899,1,8782,59,1,10926,4,2,59,113,7905,7907,1,8783,59,1,8783,4,15,97,99,100,101,102,104,105,108,111,114,115,116,117,119,121,7942,8021,8075,8080,8121,8126,8157,8279,8295,8430,8446,8485,8491,8707,8726,4,3,99,112,114,7950,7956,8007,117,116,101,59,1,263,4,6,59,97,98,99,100,115,7970,7972,7977,7984,7998,8003,1,8745,110,100,59,1,10820,114,99,117,112,59,1,10825,4,2,97,117,7990,7994,112,59,1,10827,112,59,1,10823,111,116,59,1,10816,59,3,8745,65024,4,2,101,111,8013,8017,116,59,1,8257,110,59,1,711,4,4,97,101,105,117,8031,8046,8056,8061,4,2,112,114,8037,8041,115,59,1,10829,111,110,59,1,269,100,105,108,5,231,1,59,8054,1,231,114,99,59,1,265,112,115,4,2,59,115,8069,8071,1,10828,109,59,1,10832,111,116,59,1,267,4,3,100,109,110,8088,8097,8104,105,108,5,184,1,59,8095,1,184,112,116,121,118,59,1,10674,116,5,162,2,59,101,8112,8114,1,162,114,100,111,116,59,1,183,114,59,3,55349,56608,4,3,99,101,105,8134,8138,8154,121,59,1,1095,99,107,4,2,59,109,8146,8148,1,10003,97,114,107,59,1,10003,59,1,967,114,4,7,59,69,99,101,102,109,115,8174,8176,8179,8258,8261,8268,8273,1,9675,59,1,10691,4,3,59,101,108,8187,8189,8193,1,710,113,59,1,8791,101,4,2,97,100,8200,8223,114,114,111,119,4,2,108,114,8210,8216,101,102,116,59,1,8634,105,103,104,116,59,1,8635,4,5,82,83,97,99,100,8235,8238,8241,8246,8252,59,1,174,59,1,9416,115,116,59,1,8859,105,114,99,59,1,8858,97,115,104,59,1,8861,59,1,8791,110,105,110,116,59,1,10768,105,100,59,1,10991,99,105,114,59,1,10690,117,98,115,4,2,59,117,8288,8290,1,9827,105,116,59,1,9827,4,4,108,109,110,112,8305,8326,8376,8400,111,110,4,2,59,101,8313,8315,1,58,4,2,59,113,8321,8323,1,8788,59,1,8788,4,2,109,112,8332,8344,97,4,2,59,116,8339,8341,1,44,59,1,64,4,3,59,102,108,8352,8354,8358,1,8705,110,59,1,8728,101,4,2,109,120,8365,8371,101,110,116,59,1,8705,101,115,59,1,8450,4,2,103,105,8382,8395,4,2,59,100,8388,8390,1,8773,111,116,59,1,10861,110,116,59,1,8750,4,3,102,114,121,8408,8412,8417,59,3,55349,56660,111,100,59,1,8720,5,169,2,59,115,8424,8426,1,169,114,59,1,8471,4,2,97,111,8436,8441,114,114,59,1,8629,115,115,59,1,10007,4,2,99,117,8452,8457,114,59,3,55349,56504,4,2,98,112,8463,8474,4,2,59,101,8469,8471,1,10959,59,1,10961,4,2,59,101,8480,8482,1,10960,59,1,10962,100,111,116,59,1,8943,4,7,100,101,108,112,114,118,119,8507,8522,8536,8550,8600,8697,8702,97,114,114,4,2,108,114,8516,8519,59,1,10552,59,1,10549,4,2,112,115,8528,8532,114,59,1,8926,99,59,1,8927,97,114,114,4,2,59,112,8545,8547,1,8630,59,1,10557,4,6,59,98,99,100,111,115,8564,8566,8573,8587,8592,8596,1,8746,114,99,97,112,59,1,10824,4,2,97,117,8579,8583,112,59,1,10822,112,59,1,10826,111,116,59,1,8845,114,59,1,10821,59,3,8746,65024,4,4,97,108,114,118,8610,8623,8663,8672,114,114,4,2,59,109,8618,8620,1,8631,59,1,10556,121,4,3,101,118,119,8632,8651,8656,113,4,2,112,115,8639,8645,114,101,99,59,1,8926,117,99,99,59,1,8927,101,101,59,1,8910,101,100,103,101,59,1,8911,101,110,5,164,1,59,8670,1,164,101,97,114,114,111,119,4,2,108,114,8684,8690,101,102,116,59,1,8630,105,103,104,116,59,1,8631,101,101,59,1,8910,101,100,59,1,8911,4,2,99,105,8713,8721,111,110,105,110,116,59,1,8754,110,116,59,1,8753,108,99,116,121,59,1,9005,4,19,65,72,97,98,99,100,101,102,104,105,106,108,111,114,115,116,117,119,122,8773,8778,8783,8821,8839,8854,8887,8914,8930,8944,9036,9041,9058,9197,9227,9258,9281,9297,9305,114,114,59,1,8659,97,114,59,1,10597,4,4,103,108,114,115,8793,8799,8805,8809,103,101,114,59,1,8224,101,116,104,59,1,8504,114,59,1,8595,104,4,2,59,118,8816,8818,1,8208,59,1,8867,4,2,107,108,8827,8834,97,114,111,119,59,1,10511,97,99,59,1,733,4,2,97,121,8845,8851,114,111,110,59,1,271,59,1,1076,4,3,59,97,111,8862,8864,8880,1,8518,4,2,103,114,8870,8876,103,101,114,59,1,8225,114,59,1,8650,116,115,101,113,59,1,10871,4,3,103,108,109,8895,8902,8907,5,176,1,59,8900,1,176,116,97,59,1,948,112,116,121,118,59,1,10673,4,2,105,114,8920,8926,115,104,116,59,1,10623,59,3,55349,56609,97,114,4,2,108,114,8938,8941,59,1,8643,59,1,8642,4,5,97,101,103,115,118,8956,8986,8989,8996,9001,109,4,3,59,111,115,8965,8967,8983,1,8900,110,100,4,2,59,115,8975,8977,1,8900,117,105,116,59,1,9830,59,1,9830,59,1,168,97,109,109,97,59,1,989,105,110,59,1,8946,4,3,59,105,111,9009,9011,9031,1,247,100,101,5,247,2,59,111,9020,9022,1,247,110,116,105,109,101,115,59,1,8903,110,120,59,1,8903,99,121,59,1,1106,99,4,2,111,114,9048,9053,114,110,59,1,8990,111,112,59,1,8973,4,5,108,112,116,117,119,9070,9076,9081,9130,9144,108,97,114,59,1,36,102,59,3,55349,56661,4,5,59,101,109,112,115,9093,9095,9109,9116,9122,1,729,113,4,2,59,100,9102,9104,1,8784,111,116,59,1,8785,105,110,117,115,59,1,8760,108,117,115,59,1,8724,113,117,97,114,101,59,1,8865,98,108,101,98,97,114,119,101,100,103,101,59,1,8966,110,4,3,97,100,104,9153,9160,9172,114,114,111,119,59,1,8595,111,119,110,97,114,114,111,119,115,59,1,8650,97,114,112,111,111,110,4,2,108,114,9184,9190,101,102,116,59,1,8643,105,103,104,116,59,1,8642,4,2,98,99,9203,9211,107,97,114,111,119,59,1,10512,4,2,111,114,9217,9222,114,110,59,1,8991,111,112,59,1,8972,4,3,99,111,116,9235,9248,9252,4,2,114,121,9241,9245,59,3,55349,56505,59,1,1109,108,59,1,10742,114,111,107,59,1,273,4,2,100,114,9264,9269,111,116,59,1,8945,105,4,2,59,102,9276,9278,1,9663,59,1,9662,4,2,97,104,9287,9292,114,114,59,1,8693,97,114,59,1,10607,97,110,103,108,101,59,1,10662,4,2,99,105,9311,9315,121,59,1,1119,103,114,97,114,114,59,1,10239,4,18,68,97,99,100,101,102,103,108,109,110,111,112,113,114,115,116,117,120,9361,9376,9398,9439,9444,9447,9462,9495,9531,9585,9598,9614,9659,9755,9771,9792,9808,9826,4,2,68,111,9367,9372,111,116,59,1,10871,116,59,1,8785,4,2,99,115,9382,9392,117,116,101,5,233,1,59,9390,1,233,116,101,114,59,1,10862,4,4,97,105,111,121,9408,9414,9430,9436,114,111,110,59,1,283,114,4,2,59,99,9421,9423,1,8790,5,234,1,59,9428,1,234,108,111,110,59,1,8789,59,1,1101,111,116,59,1,279,59,1,8519,4,2,68,114,9453,9458,111,116,59,1,8786,59,3,55349,56610,4,3,59,114,115,9470,9472,9482,1,10906,97,118,101,5,232,1,59,9480,1,232,4,2,59,100,9488,9490,1,10902,111,116,59,1,10904,4,4,59,105,108,115,9505,9507,9515,9518,1,10905,110,116,101,114,115,59,1,9191,59,1,8467,4,2,59,100,9524,9526,1,10901,111,116,59,1,10903,4,3,97,112,115,9539,9544,9564,99,114,59,1,275,116,121,4,3,59,115,118,9554,9556,9561,1,8709,101,116,59,1,8709,59,1,8709,112,4,2,49,59,9571,9583,4,2,51,52,9577,9580,59,1,8196,59,1,8197,1,8195,4,2,103,115,9591,9594,59,1,331,112,59,1,8194,4,2,103,112,9604,9609,111,110,59,1,281,102,59,3,55349,56662,4,3,97,108,115,9622,9635,9640,114,4,2,59,115,9629,9631,1,8917,108,59,1,10723,117,115,59,1,10865,105,4,3,59,108,118,9649,9651,9656,1,949,111,110,59,1,949,59,1,1013,4,4,99,115,117,118,9669,9686,9716,9747,4,2,105,111,9675,9680,114,99,59,1,8790,108,111,110,59,1,8789,4,2,105,108,9692,9696,109,59,1,8770,97,110,116,4,2,103,108,9705,9710,116,114,59,1,10902,101,115,115,59,1,10901,4,3,97,101,105,9724,9729,9734,108,115,59,1,61,115,116,59,1,8799,118,4,2,59,68,9741,9743,1,8801,68,59,1,10872,112,97,114,115,108,59,1,10725,4,2,68,97,9761,9766,111,116,59,1,8787,114,114,59,1,10609,4,3,99,100,105,9779,9783,9788,114,59,1,8495,111,116,59,1,8784,109,59,1,8770,4,2,97,104,9798,9801,59,1,951,5,240,1,59,9806,1,240,4,2,109,114,9814,9822,108,5,235,1,59,9820,1,235,111,59,1,8364,4,3,99,105,112,9834,9838,9843,108,59,1,33,115,116,59,1,8707,4,2,101,111,9849,9859,99,116,97,116,105,111,110,59,1,8496,110,101,110,116,105,97,108,101,59,1,8519,4,12,97,99,101,102,105,106,108,110,111,112,114,115,9896,9910,9914,9921,9954,9960,9967,9989,9994,10027,10036,10164,108,108,105,110,103,100,111,116,115,101,113,59,1,8786,121,59,1,1092,109,97,108,101,59,1,9792,4,3,105,108,114,9929,9935,9950,108,105,103,59,1,64259,4,2,105,108,9941,9945,103,59,1,64256,105,103,59,1,64260,59,3,55349,56611,108,105,103,59,1,64257,108,105,103,59,3,102,106,4,3,97,108,116,9975,9979,9984,116,59,1,9837,105,103,59,1,64258,110,115,59,1,9649,111,102,59,1,402,4,2,112,114,1e4,10005,102,59,3,55349,56663,4,2,97,107,10011,10016,108,108,59,1,8704,4,2,59,118,10022,10024,1,8916,59,1,10969,97,114,116,105,110,116,59,1,10765,4,2,97,111,10042,10159,4,2,99,115,10048,10155,4,6,49,50,51,52,53,55,10062,10102,10114,10135,10139,10151,4,6,50,51,52,53,54,56,10076,10083,10086,10093,10096,10099,5,189,1,59,10081,1,189,59,1,8531,5,188,1,59,10091,1,188,59,1,8533,59,1,8537,59,1,8539,4,2,51,53,10108,10111,59,1,8532,59,1,8534,4,3,52,53,56,10122,10129,10132,5,190,1,59,10127,1,190,59,1,8535,59,1,8540,53,59,1,8536,4,2,54,56,10145,10148,59,1,8538,59,1,8541,56,59,1,8542,108,59,1,8260,119,110,59,1,8994,99,114,59,3,55349,56507,4,17,69,97,98,99,100,101,102,103,105,106,108,110,111,114,115,116,118,10206,10217,10247,10254,10268,10273,10358,10363,10374,10380,10385,10406,10458,10464,10470,10497,10610,4,2,59,108,10212,10214,1,8807,59,1,10892,4,3,99,109,112,10225,10231,10244,117,116,101,59,1,501,109,97,4,2,59,100,10239,10241,1,947,59,1,989,59,1,10886,114,101,118,101,59,1,287,4,2,105,121,10260,10265,114,99,59,1,285,59,1,1075,111,116,59,1,289,4,4,59,108,113,115,10283,10285,10288,10308,1,8805,59,1,8923,4,3,59,113,115,10296,10298,10301,1,8805,59,1,8807,108,97,110,116,59,1,10878,4,4,59,99,100,108,10318,10320,10324,10345,1,10878,99,59,1,10921,111,116,4,2,59,111,10332,10334,1,10880,4,2,59,108,10340,10342,1,10882,59,1,10884,4,2,59,101,10351,10354,3,8923,65024,115,59,1,10900,114,59,3,55349,56612,4,2,59,103,10369,10371,1,8811,59,1,8921,109,101,108,59,1,8503,99,121,59,1,1107,4,4,59,69,97,106,10395,10397,10400,10403,1,8823,59,1,10898,59,1,10917,59,1,10916,4,4,69,97,101,115,10416,10419,10434,10453,59,1,8809,112,4,2,59,112,10426,10428,1,10890,114,111,120,59,1,10890,4,2,59,113,10440,10442,1,10888,4,2,59,113,10448,10450,1,10888,59,1,8809,105,109,59,1,8935,112,102,59,3,55349,56664,97,118,101,59,1,96,4,2,99,105,10476,10480,114,59,1,8458,109,4,3,59,101,108,10489,10491,10494,1,8819,59,1,10894,59,1,10896,5,62,6,59,99,100,108,113,114,10512,10514,10527,10532,10538,10545,1,62,4,2,99,105,10520,10523,59,1,10919,114,59,1,10874,111,116,59,1,8919,80,97,114,59,1,10645,117,101,115,116,59,1,10876,4,5,97,100,101,108,115,10557,10574,10579,10599,10605,4,2,112,114,10563,10570,112,114,111,120,59,1,10886,114,59,1,10616,111,116,59,1,8919,113,4,2,108,113,10586,10592,101,115,115,59,1,8923,108,101,115,115,59,1,10892,101,115,115,59,1,8823,105,109,59,1,8819,4,2,101,110,10616,10626,114,116,110,101,113,113,59,3,8809,65024,69,59,3,8809,65024,4,10,65,97,98,99,101,102,107,111,115,121,10653,10658,10713,10718,10724,10760,10765,10786,10850,10875,114,114,59,1,8660,4,4,105,108,109,114,10668,10674,10678,10684,114,115,112,59,1,8202,102,59,1,189,105,108,116,59,1,8459,4,2,100,114,10690,10695,99,121,59,1,1098,4,3,59,99,119,10703,10705,10710,1,8596,105,114,59,1,10568,59,1,8621,97,114,59,1,8463,105,114,99,59,1,293,4,3,97,108,114,10732,10748,10754,114,116,115,4,2,59,117,10741,10743,1,9829,105,116,59,1,9829,108,105,112,59,1,8230,99,111,110,59,1,8889,114,59,3,55349,56613,115,4,2,101,119,10772,10779,97,114,111,119,59,1,10533,97,114,111,119,59,1,10534,4,5,97,109,111,112,114,10798,10803,10809,10839,10844,114,114,59,1,8703,116,104,116,59,1,8763,107,4,2,108,114,10816,10827,101,102,116,97,114,114,111,119,59,1,8617,105,103,104,116,97,114,114,111,119,59,1,8618,102,59,3,55349,56665,98,97,114,59,1,8213,4,3,99,108,116,10858,10863,10869,114,59,3,55349,56509,97,115,104,59,1,8463,114,111,107,59,1,295,4,2,98,112,10881,10887,117,108,108,59,1,8259,104,101,110,59,1,8208,4,15,97,99,101,102,103,105,106,109,110,111,112,113,115,116,117,10925,10936,10958,10977,10990,11001,11039,11045,11101,11192,11220,11226,11237,11285,11299,99,117,116,101,5,237,1,59,10934,1,237,4,3,59,105,121,10944,10946,10955,1,8291,114,99,5,238,1,59,10953,1,238,59,1,1080,4,2,99,120,10964,10968,121,59,1,1077,99,108,5,161,1,59,10975,1,161,4,2,102,114,10983,10986,59,1,8660,59,3,55349,56614,114,97,118,101,5,236,1,59,10999,1,236,4,4,59,105,110,111,11011,11013,11028,11034,1,8520,4,2,105,110,11019,11024,110,116,59,1,10764,116,59,1,8749,102,105,110,59,1,10716,116,97,59,1,8489,108,105,103,59,1,307,4,3,97,111,112,11053,11092,11096,4,3,99,103,116,11061,11065,11088,114,59,1,299,4,3,101,108,112,11073,11076,11082,59,1,8465,105,110,101,59,1,8464,97,114,116,59,1,8465,104,59,1,305,102,59,1,8887,101,100,59,1,437,4,5,59,99,102,111,116,11113,11115,11121,11136,11142,1,8712,97,114,101,59,1,8453,105,110,4,2,59,116,11129,11131,1,8734,105,101,59,1,10717,100,111,116,59,1,305,4,5,59,99,101,108,112,11154,11156,11161,11179,11186,1,8747,97,108,59,1,8890,4,2,103,114,11167,11173,101,114,115,59,1,8484,99,97,108,59,1,8890,97,114,104,107,59,1,10775,114,111,100,59,1,10812,4,4,99,103,112,116,11202,11206,11211,11216,121,59,1,1105,111,110,59,1,303,102,59,3,55349,56666,97,59,1,953,114,111,100,59,1,10812,117,101,115,116,5,191,1,59,11235,1,191,4,2,99,105,11243,11248,114,59,3,55349,56510,110,4,5,59,69,100,115,118,11261,11263,11266,11271,11282,1,8712,59,1,8953,111,116,59,1,8949,4,2,59,118,11277,11279,1,8948,59,1,8947,59,1,8712,4,2,59,105,11291,11293,1,8290,108,100,101,59,1,297,4,2,107,109,11305,11310,99,121,59,1,1110,108,5,239,1,59,11316,1,239,4,6,99,102,109,111,115,117,11332,11346,11351,11357,11363,11380,4,2,105,121,11338,11343,114,99,59,1,309,59,1,1081,114,59,3,55349,56615,97,116,104,59,1,567,112,102,59,3,55349,56667,4,2,99,101,11369,11374,114,59,3,55349,56511,114,99,121,59,1,1112,107,99,121,59,1,1108,4,8,97,99,102,103,104,106,111,115,11404,11418,11433,11438,11445,11450,11455,11461,112,112,97,4,2,59,118,11413,11415,1,954,59,1,1008,4,2,101,121,11424,11430,100,105,108,59,1,311,59,1,1082,114,59,3,55349,56616,114,101,101,110,59,1,312,99,121,59,1,1093,99,121,59,1,1116,112,102,59,3,55349,56668,99,114,59,3,55349,56512,4,23,65,66,69,72,97,98,99,100,101,102,103,104,106,108,109,110,111,112,114,115,116,117,118,11515,11538,11544,11555,11560,11721,11780,11818,11868,12136,12160,12171,12203,12208,12246,12275,12327,12509,12523,12569,12641,12732,12752,4,3,97,114,116,11523,11528,11532,114,114,59,1,8666,114,59,1,8656,97,105,108,59,1,10523,97,114,114,59,1,10510,4,2,59,103,11550,11552,1,8806,59,1,10891,97,114,59,1,10594,4,9,99,101,103,109,110,112,113,114,116,11580,11586,11594,11600,11606,11624,11627,11636,11694,117,116,101,59,1,314,109,112,116,121,118,59,1,10676,114,97,110,59,1,8466,98,100,97,59,1,955,103,4,3,59,100,108,11615,11617,11620,1,10216,59,1,10641,101,59,1,10216,59,1,10885,117,111,5,171,1,59,11634,1,171,114,4,8,59,98,102,104,108,112,115,116,11655,11657,11669,11673,11677,11681,11685,11690,1,8592,4,2,59,102,11663,11665,1,8676,115,59,1,10527,115,59,1,10525,107,59,1,8617,112,59,1,8619,108,59,1,10553,105,109,59,1,10611,108,59,1,8610,4,3,59,97,101,11702,11704,11709,1,10923,105,108,59,1,10521,4,2,59,115,11715,11717,1,10925,59,3,10925,65024,4,3,97,98,114,11729,11734,11739,114,114,59,1,10508,114,107,59,1,10098,4,2,97,107,11745,11758,99,4,2,101,107,11752,11755,59,1,123,59,1,91,4,2,101,115,11764,11767,59,1,10635,108,4,2,100,117,11774,11777,59,1,10639,59,1,10637,4,4,97,101,117,121,11790,11796,11811,11815,114,111,110,59,1,318,4,2,100,105,11802,11807,105,108,59,1,316,108,59,1,8968,98,59,1,123,59,1,1083,4,4,99,113,114,115,11828,11832,11845,11864,97,59,1,10550,117,111,4,2,59,114,11840,11842,1,8220,59,1,8222,4,2,100,117,11851,11857,104,97,114,59,1,10599,115,104,97,114,59,1,10571,104,59,1,8626,4,5,59,102,103,113,115,11880,11882,12008,12011,12031,1,8804,116,4,5,97,104,108,114,116,11895,11913,11935,11947,11996,114,114,111,119,4,2,59,116,11905,11907,1,8592,97,105,108,59,1,8610,97,114,112,111,111,110,4,2,100,117,11925,11931,111,119,110,59,1,8637,112,59,1,8636,101,102,116,97,114,114,111,119,115,59,1,8647,105,103,104,116,4,3,97,104,115,11959,11974,11984,114,114,111,119,4,2,59,115,11969,11971,1,8596,59,1,8646,97,114,112,111,111,110,115,59,1,8651,113,117,105,103,97,114,114,111,119,59,1,8621,104,114,101,101,116,105,109,101,115,59,1,8907,59,1,8922,4,3,59,113,115,12019,12021,12024,1,8804,59,1,8806,108,97,110,116,59,1,10877,4,5,59,99,100,103,115,12043,12045,12049,12070,12083,1,10877,99,59,1,10920,111,116,4,2,59,111,12057,12059,1,10879,4,2,59,114,12065,12067,1,10881,59,1,10883,4,2,59,101,12076,12079,3,8922,65024,115,59,1,10899,4,5,97,100,101,103,115,12095,12103,12108,12126,12131,112,112,114,111,120,59,1,10885,111,116,59,1,8918,113,4,2,103,113,12115,12120,116,114,59,1,8922,103,116,114,59,1,10891,116,114,59,1,8822,105,109,59,1,8818,4,3,105,108,114,12144,12150,12156,115,104,116,59,1,10620,111,111,114,59,1,8970,59,3,55349,56617,4,2,59,69,12166,12168,1,8822,59,1,10897,4,2,97,98,12177,12198,114,4,2,100,117,12184,12187,59,1,8637,4,2,59,108,12193,12195,1,8636,59,1,10602,108,107,59,1,9604,99,121,59,1,1113,4,5,59,97,99,104,116,12220,12222,12227,12235,12241,1,8810,114,114,59,1,8647,111,114,110,101,114,59,1,8990,97,114,100,59,1,10603,114,105,59,1,9722,4,2,105,111,12252,12258,100,111,116,59,1,320,117,115,116,4,2,59,97,12267,12269,1,9136,99,104,101,59,1,9136,4,4,69,97,101,115,12285,12288,12303,12322,59,1,8808,112,4,2,59,112,12295,12297,1,10889,114,111,120,59,1,10889,4,2,59,113,12309,12311,1,10887,4,2,59,113,12317,12319,1,10887,59,1,8808,105,109,59,1,8934,4,8,97,98,110,111,112,116,119,122,12345,12359,12364,12421,12446,12467,12474,12490,4,2,110,114,12351,12355,103,59,1,10220,114,59,1,8701,114,107,59,1,10214,103,4,3,108,109,114,12373,12401,12409,101,102,116,4,2,97,114,12382,12389,114,114,111,119,59,1,10229,105,103,104,116,97,114,114,111,119,59,1,10231,97,112,115,116,111,59,1,10236,105,103,104,116,97,114,114,111,119,59,1,10230,112,97,114,114,111,119,4,2,108,114,12433,12439,101,102,116,59,1,8619,105,103,104,116,59,1,8620,4,3,97,102,108,12454,12458,12462,114,59,1,10629,59,3,55349,56669,117,115,59,1,10797,105,109,101,115,59,1,10804,4,2,97,98,12480,12485,115,116,59,1,8727,97,114,59,1,95,4,3,59,101,102,12498,12500,12506,1,9674,110,103,101,59,1,9674,59,1,10731,97,114,4,2,59,108,12517,12519,1,40,116,59,1,10643,4,5,97,99,104,109,116,12535,12540,12548,12561,12564,114,114,59,1,8646,111,114,110,101,114,59,1,8991,97,114,4,2,59,100,12556,12558,1,8651,59,1,10605,59,1,8206,114,105,59,1,8895,4,6,97,99,104,105,113,116,12583,12589,12594,12597,12614,12635,113,117,111,59,1,8249,114,59,3,55349,56513,59,1,8624,109,4,3,59,101,103,12606,12608,12611,1,8818,59,1,10893,59,1,10895,4,2,98,117,12620,12623,59,1,91,111,4,2,59,114,12630,12632,1,8216,59,1,8218,114,111,107,59,1,322,5,60,8,59,99,100,104,105,108,113,114,12660,12662,12675,12680,12686,12692,12698,12705,1,60,4,2,99,105,12668,12671,59,1,10918,114,59,1,10873,111,116,59,1,8918,114,101,101,59,1,8907,109,101,115,59,1,8905,97,114,114,59,1,10614,117,101,115,116,59,1,10875,4,2,80,105,12711,12716,97,114,59,1,10646,4,3,59,101,102,12724,12726,12729,1,9667,59,1,8884,59,1,9666,114,4,2,100,117,12739,12746,115,104,97,114,59,1,10570,104,97,114,59,1,10598,4,2,101,110,12758,12768,114,116,110,101,113,113,59,3,8808,65024,69,59,3,8808,65024,4,14,68,97,99,100,101,102,104,105,108,110,111,112,115,117,12803,12809,12893,12908,12914,12928,12933,12937,13011,13025,13032,13049,13052,13069,68,111,116,59,1,8762,4,4,99,108,112,114,12819,12827,12849,12887,114,5,175,1,59,12825,1,175,4,2,101,116,12833,12836,59,1,9794,4,2,59,101,12842,12844,1,10016,115,101,59,1,10016,4,2,59,115,12855,12857,1,8614,116,111,4,4,59,100,108,117,12869,12871,12877,12883,1,8614,111,119,110,59,1,8615,101,102,116,59,1,8612,112,59,1,8613,107,101,114,59,1,9646,4,2,111,121,12899,12905,109,109,97,59,1,10793,59,1,1084,97,115,104,59,1,8212,97,115,117,114,101,100,97,110,103,108,101,59,1,8737,114,59,3,55349,56618,111,59,1,8487,4,3,99,100,110,12945,12954,12985,114,111,5,181,1,59,12952,1,181,4,4,59,97,99,100,12964,12966,12971,12976,1,8739,115,116,59,1,42,105,114,59,1,10992,111,116,5,183,1,59,12983,1,183,117,115,4,3,59,98,100,12995,12997,13e3,1,8722,59,1,8863,4,2,59,117,13006,13008,1,8760,59,1,10794,4,2,99,100,13017,13021,112,59,1,10971,114,59,1,8230,112,108,117,115,59,1,8723,4,2,100,112,13038,13044,101,108,115,59,1,8871,102,59,3,55349,56670,59,1,8723,4,2,99,116,13058,13063,114,59,3,55349,56514,112,111,115,59,1,8766,4,3,59,108,109,13077,13079,13087,1,956,116,105,109,97,112,59,1,8888,97,112,59,1,8888,4,24,71,76,82,86,97,98,99,100,101,102,103,104,105,106,108,109,111,112,114,115,116,117,118,119,13142,13165,13217,13229,13247,13330,13359,13414,13420,13508,13513,13579,13602,13626,13631,13762,13767,13855,13936,13995,14214,14285,14312,14432,4,2,103,116,13148,13152,59,3,8921,824,4,2,59,118,13158,13161,3,8811,8402,59,3,8811,824,4,3,101,108,116,13173,13200,13204,102,116,4,2,97,114,13181,13188,114,114,111,119,59,1,8653,105,103,104,116,97,114,114,111,119,59,1,8654,59,3,8920,824,4,2,59,118,13210,13213,3,8810,8402,59,3,8810,824,105,103,104,116,97,114,114,111,119,59,1,8655,4,2,68,100,13235,13241,97,115,104,59,1,8879,97,115,104,59,1,8878,4,5,98,99,110,112,116,13259,13264,13270,13275,13308,108,97,59,1,8711,117,116,101,59,1,324,103,59,3,8736,8402,4,5,59,69,105,111,112,13287,13289,13293,13298,13302,1,8777,59,3,10864,824,100,59,3,8779,824,115,59,1,329,114,111,120,59,1,8777,117,114,4,2,59,97,13316,13318,1,9838,108,4,2,59,115,13325,13327,1,9838,59,1,8469,4,2,115,117,13336,13344,112,5,160,1,59,13342,1,160,109,112,4,2,59,101,13352,13355,3,8782,824,59,3,8783,824,4,5,97,101,111,117,121,13371,13385,13391,13407,13411,4,2,112,114,13377,13380,59,1,10819,111,110,59,1,328,100,105,108,59,1,326,110,103,4,2,59,100,13399,13401,1,8775,111,116,59,3,10861,824,112,59,1,10818,59,1,1085,97,115,104,59,1,8211,4,7,59,65,97,100,113,115,120,13436,13438,13443,13466,13472,13478,13494,1,8800,114,114,59,1,8663,114,4,2,104,114,13450,13454,107,59,1,10532,4,2,59,111,13460,13462,1,8599,119,59,1,8599,111,116,59,3,8784,824,117,105,118,59,1,8802,4,2,101,105,13484,13489,97,114,59,1,10536,109,59,3,8770,824,105,115,116,4,2,59,115,13503,13505,1,8708,59,1,8708,114,59,3,55349,56619,4,4,69,101,115,116,13523,13527,13563,13568,59,3,8807,824,4,3,59,113,115,13535,13537,13559,1,8817,4,3,59,113,115,13545,13547,13551,1,8817,59,3,8807,824,108,97,110,116,59,3,10878,824,59,3,10878,824,105,109,59,1,8821,4,2,59,114,13574,13576,1,8815,59,1,8815,4,3,65,97,112,13587,13592,13597,114,114,59,1,8654,114,114,59,1,8622,97,114,59,1,10994,4,3,59,115,118,13610,13612,13623,1,8715,4,2,59,100,13618,13620,1,8956,59,1,8954,59,1,8715,99,121,59,1,1114,4,7,65,69,97,100,101,115,116,13647,13652,13656,13661,13665,13737,13742,114,114,59,1,8653,59,3,8806,824,114,114,59,1,8602,114,59,1,8229,4,4,59,102,113,115,13675,13677,13703,13725,1,8816,116,4,2,97,114,13684,13691,114,114,111,119,59,1,8602,105,103,104,116,97,114,114,111,119,59,1,8622,4,3,59,113,115,13711,13713,13717,1,8816,59,3,8806,824,108,97,110,116,59,3,10877,824,4,2,59,115,13731,13734,3,10877,824,59,1,8814,105,109,59,1,8820,4,2,59,114,13748,13750,1,8814,105,4,2,59,101,13757,13759,1,8938,59,1,8940,105,100,59,1,8740,4,2,112,116,13773,13778,102,59,3,55349,56671,5,172,3,59,105,110,13787,13789,13829,1,172,110,4,4,59,69,100,118,13800,13802,13806,13812,1,8713,59,3,8953,824,111,116,59,3,8949,824,4,3,97,98,99,13820,13823,13826,59,1,8713,59,1,8951,59,1,8950,105,4,2,59,118,13836,13838,1,8716,4,3,97,98,99,13846,13849,13852,59,1,8716,59,1,8958,59,1,8957,4,3,97,111,114,13863,13892,13899,114,4,4,59,97,115,116,13874,13876,13883,13888,1,8742,108,108,101,108,59,1,8742,108,59,3,11005,8421,59,3,8706,824,108,105,110,116,59,1,10772,4,3,59,99,101,13907,13909,13914,1,8832,117,101,59,1,8928,4,2,59,99,13920,13923,3,10927,824,4,2,59,101,13929,13931,1,8832,113,59,3,10927,824,4,4,65,97,105,116,13946,13951,13971,13982,114,114,59,1,8655,114,114,4,3,59,99,119,13961,13963,13967,1,8603,59,3,10547,824,59,3,8605,824,103,104,116,97,114,114,111,119,59,1,8603,114,105,4,2,59,101,13990,13992,1,8939,59,1,8941,4,7,99,104,105,109,112,113,117,14011,14036,14060,14080,14085,14090,14106,4,4,59,99,101,114,14021,14023,14028,14032,1,8833,117,101,59,1,8929,59,3,10928,824,59,3,55349,56515,111,114,116,4,2,109,112,14045,14050,105,100,59,1,8740,97,114,97,108,108,101,108,59,1,8742,109,4,2,59,101,14067,14069,1,8769,4,2,59,113,14075,14077,1,8772,59,1,8772,105,100,59,1,8740,97,114,59,1,8742,115,117,4,2,98,112,14098,14102,101,59,1,8930,101,59,1,8931,4,3,98,99,112,14114,14157,14171,4,4,59,69,101,115,14124,14126,14130,14133,1,8836,59,3,10949,824,59,1,8840,101,116,4,2,59,101,14141,14144,3,8834,8402,113,4,2,59,113,14151,14153,1,8840,59,3,10949,824,99,4,2,59,101,14164,14166,1,8833,113,59,3,10928,824,4,4,59,69,101,115,14181,14183,14187,14190,1,8837,59,3,10950,824,59,1,8841,101,116,4,2,59,101,14198,14201,3,8835,8402,113,4,2,59,113,14208,14210,1,8841,59,3,10950,824,4,4,103,105,108,114,14224,14228,14238,14242,108,59,1,8825,108,100,101,5,241,1,59,14236,1,241,103,59,1,8824,105,97,110,103,108,101,4,2,108,114,14254,14269,101,102,116,4,2,59,101,14263,14265,1,8938,113,59,1,8940,105,103,104,116,4,2,59,101,14279,14281,1,8939,113,59,1,8941,4,2,59,109,14291,14293,1,957,4,3,59,101,115,14301,14303,14308,1,35,114,111,59,1,8470,112,59,1,8199,4,9,68,72,97,100,103,105,108,114,115,14332,14338,14344,14349,14355,14369,14376,14408,14426,97,115,104,59,1,8877,97,114,114,59,1,10500,112,59,3,8781,8402,97,115,104,59,1,8876,4,2,101,116,14361,14365,59,3,8805,8402,59,3,62,8402,110,102,105,110,59,1,10718,4,3,65,101,116,14384,14389,14393,114,114,59,1,10498,59,3,8804,8402,4,2,59,114,14399,14402,3,60,8402,105,101,59,3,8884,8402,4,2,65,116,14414,14419,114,114,59,1,10499,114,105,101,59,3,8885,8402,105,109,59,3,8764,8402,4,3,65,97,110,14440,14445,14468,114,114,59,1,8662,114,4,2,104,114,14452,14456,107,59,1,10531,4,2,59,111,14462,14464,1,8598,119,59,1,8598,101,97,114,59,1,10535,4,18,83,97,99,100,101,102,103,104,105,108,109,111,112,114,115,116,117,118,14512,14515,14535,14560,14597,14603,14618,14643,14657,14662,14701,14741,14747,14769,14851,14877,14907,14916,59,1,9416,4,2,99,115,14521,14531,117,116,101,5,243,1,59,14529,1,243,116,59,1,8859,4,2,105,121,14541,14557,114,4,2,59,99,14548,14550,1,8858,5,244,1,59,14555,1,244,59,1,1086,4,5,97,98,105,111,115,14572,14577,14583,14587,14591,115,104,59,1,8861,108,97,99,59,1,337,118,59,1,10808,116,59,1,8857,111,108,100,59,1,10684,108,105,103,59,1,339,4,2,99,114,14609,14614,105,114,59,1,10687,59,3,55349,56620,4,3,111,114,116,14626,14630,14640,110,59,1,731,97,118,101,5,242,1,59,14638,1,242,59,1,10689,4,2,98,109,14649,14654,97,114,59,1,10677,59,1,937,110,116,59,1,8750,4,4,97,99,105,116,14672,14677,14693,14698,114,114,59,1,8634,4,2,105,114,14683,14687,114,59,1,10686,111,115,115,59,1,10683,110,101,59,1,8254,59,1,10688,4,3,97,101,105,14709,14714,14719,99,114,59,1,333,103,97,59,1,969,4,3,99,100,110,14727,14733,14736,114,111,110,59,1,959,59,1,10678,117,115,59,1,8854,112,102,59,3,55349,56672,4,3,97,101,108,14755,14759,14764,114,59,1,10679,114,112,59,1,10681,117,115,59,1,8853,4,7,59,97,100,105,111,115,118,14785,14787,14792,14831,14837,14841,14848,1,8744,114,114,59,1,8635,4,4,59,101,102,109,14802,14804,14817,14824,1,10845,114,4,2,59,111,14811,14813,1,8500,102,59,1,8500,5,170,1,59,14822,1,170,5,186,1,59,14829,1,186,103,111,102,59,1,8886,114,59,1,10838,108,111,112,101,59,1,10839,59,1,10843,4,3,99,108,111,14859,14863,14873,114,59,1,8500,97,115,104,5,248,1,59,14871,1,248,108,59,1,8856,105,4,2,108,109,14884,14893,100,101,5,245,1,59,14891,1,245,101,115,4,2,59,97,14901,14903,1,8855,115,59,1,10806,109,108,5,246,1,59,14914,1,246,98,97,114,59,1,9021,4,12,97,99,101,102,104,105,108,109,111,114,115,117,14948,14992,14996,15033,15038,15068,15090,15189,15192,15222,15427,15441,114,4,4,59,97,115,116,14959,14961,14976,14989,1,8741,5,182,2,59,108,14968,14970,1,182,108,101,108,59,1,8741,4,2,105,108,14982,14986,109,59,1,10995,59,1,11005,59,1,8706,121,59,1,1087,114,4,5,99,105,109,112,116,15009,15014,15019,15024,15027,110,116,59,1,37,111,100,59,1,46,105,108,59,1,8240,59,1,8869,101,110,107,59,1,8241,114,59,3,55349,56621,4,3,105,109,111,15046,15057,15063,4,2,59,118,15052,15054,1,966,59,1,981,109,97,116,59,1,8499,110,101,59,1,9742,4,3,59,116,118,15076,15078,15087,1,960,99,104,102,111,114,107,59,1,8916,59,1,982,4,2,97,117,15096,15119,110,4,2,99,107,15103,15115,107,4,2,59,104,15110,15112,1,8463,59,1,8462,118,59,1,8463,115,4,9,59,97,98,99,100,101,109,115,116,15140,15142,15148,15151,15156,15168,15171,15179,15184,1,43,99,105,114,59,1,10787,59,1,8862,105,114,59,1,10786,4,2,111,117,15162,15165,59,1,8724,59,1,10789,59,1,10866,110,5,177,1,59,15177,1,177,105,109,59,1,10790,119,111,59,1,10791,59,1,177,4,3,105,112,117,15200,15208,15213,110,116,105,110,116,59,1,10773,102,59,3,55349,56673,110,100,5,163,1,59,15220,1,163,4,10,59,69,97,99,101,105,110,111,115,117,15244,15246,15249,15253,15258,15334,15347,15367,15416,15421,1,8826,59,1,10931,112,59,1,10935,117,101,59,1,8828,4,2,59,99,15264,15266,1,10927,4,6,59,97,99,101,110,115,15280,15282,15290,15299,15303,15329,1,8826,112,112,114,111,120,59,1,10935,117,114,108,121,101,113,59,1,8828,113,59,1,10927,4,3,97,101,115,15311,15319,15324,112,112,114,111,120,59,1,10937,113,113,59,1,10933,105,109,59,1,8936,105,109,59,1,8830,109,101,4,2,59,115,15342,15344,1,8242,59,1,8473,4,3,69,97,115,15355,15358,15362,59,1,10933,112,59,1,10937,105,109,59,1,8936,4,3,100,102,112,15375,15378,15404,59,1,8719,4,3,97,108,115,15386,15392,15398,108,97,114,59,1,9006,105,110,101,59,1,8978,117,114,102,59,1,8979,4,2,59,116,15410,15412,1,8733,111,59,1,8733,105,109,59,1,8830,114,101,108,59,1,8880,4,2,99,105,15433,15438,114,59,3,55349,56517,59,1,968,110,99,115,112,59,1,8200,4,6,102,105,111,112,115,117,15462,15467,15472,15478,15485,15491,114,59,3,55349,56622,110,116,59,1,10764,112,102,59,3,55349,56674,114,105,109,101,59,1,8279,99,114,59,3,55349,56518,4,3,97,101,111,15499,15520,15534,116,4,2,101,105,15506,15515,114,110,105,111,110,115,59,1,8461,110,116,59,1,10774,115,116,4,2,59,101,15528,15530,1,63,113,59,1,8799,116,5,34,1,59,15540,1,34,4,21,65,66,72,97,98,99,100,101,102,104,105,108,109,110,111,112,114,115,116,117,120,15586,15609,15615,15620,15796,15855,15893,15931,15977,16001,16039,16183,16204,16222,16228,16285,16312,16318,16363,16408,16416,4,3,97,114,116,15594,15599,15603,114,114,59,1,8667,114,59,1,8658,97,105,108,59,1,10524,97,114,114,59,1,10511,97,114,59,1,10596,4,7,99,100,101,110,113,114,116,15636,15651,15656,15664,15687,15696,15770,4,2,101,117,15642,15646,59,3,8765,817,116,101,59,1,341,105,99,59,1,8730,109,112,116,121,118,59,1,10675,103,4,4,59,100,101,108,15675,15677,15680,15683,1,10217,59,1,10642,59,1,10661,101,59,1,10217,117,111,5,187,1,59,15694,1,187,114,4,11,59,97,98,99,102,104,108,112,115,116,119,15721,15723,15727,15739,15742,15746,15750,15754,15758,15763,15767,1,8594,112,59,1,10613,4,2,59,102,15733,15735,1,8677,115,59,1,10528,59,1,10547,115,59,1,10526,107,59,1,8618,112,59,1,8620,108,59,1,10565,105,109,59,1,10612,108,59,1,8611,59,1,8605,4,2,97,105,15776,15781,105,108,59,1,10522,111,4,2,59,110,15788,15790,1,8758,97,108,115,59,1,8474,4,3,97,98,114,15804,15809,15814,114,114,59,1,10509,114,107,59,1,10099,4,2,97,107,15820,15833,99,4,2,101,107,15827,15830,59,1,125,59,1,93,4,2,101,115,15839,15842,59,1,10636,108,4,2,100,117,15849,15852,59,1,10638,59,1,10640,4,4,97,101,117,121,15865,15871,15886,15890,114,111,110,59,1,345,4,2,100,105,15877,15882,105,108,59,1,343,108,59,1,8969,98,59,1,125,59,1,1088,4,4,99,108,113,115,15903,15907,15914,15927,97,59,1,10551,100,104,97,114,59,1,10601,117,111,4,2,59,114,15922,15924,1,8221,59,1,8221,104,59,1,8627,4,3,97,99,103,15939,15966,15970,108,4,4,59,105,112,115,15950,15952,15957,15963,1,8476,110,101,59,1,8475,97,114,116,59,1,8476,59,1,8477,116,59,1,9645,5,174,1,59,15975,1,174,4,3,105,108,114,15985,15991,15997,115,104,116,59,1,10621,111,111,114,59,1,8971,59,3,55349,56623,4,2,97,111,16007,16028,114,4,2,100,117,16014,16017,59,1,8641,4,2,59,108,16023,16025,1,8640,59,1,10604,4,2,59,118,16034,16036,1,961,59,1,1009,4,3,103,110,115,16047,16167,16171,104,116,4,6,97,104,108,114,115,116,16063,16081,16103,16130,16143,16155,114,114,111,119,4,2,59,116,16073,16075,1,8594,97,105,108,59,1,8611,97,114,112,111,111,110,4,2,100,117,16093,16099,111,119,110,59,1,8641,112,59,1,8640,101,102,116,4,2,97,104,16112,16120,114,114,111,119,115,59,1,8644,97,114,112,111,111,110,115,59,1,8652,105,103,104,116,97,114,114,111,119,115,59,1,8649,113,117,105,103,97,114,114,111,119,59,1,8605,104,114,101,101,116,105,109,101,115,59,1,8908,103,59,1,730,105,110,103,100,111,116,115,101,113,59,1,8787,4,3,97,104,109,16191,16196,16201,114,114,59,1,8644,97,114,59,1,8652,59,1,8207,111,117,115,116,4,2,59,97,16214,16216,1,9137,99,104,101,59,1,9137,109,105,100,59,1,10990,4,4,97,98,112,116,16238,16252,16257,16278,4,2,110,114,16244,16248,103,59,1,10221,114,59,1,8702,114,107,59,1,10215,4,3,97,102,108,16265,16269,16273,114,59,1,10630,59,3,55349,56675,117,115,59,1,10798,105,109,101,115,59,1,10805,4,2,97,112,16291,16304,114,4,2,59,103,16298,16300,1,41,116,59,1,10644,111,108,105,110,116,59,1,10770,97,114,114,59,1,8649,4,4,97,99,104,113,16328,16334,16339,16342,113,117,111,59,1,8250,114,59,3,55349,56519,59,1,8625,4,2,98,117,16348,16351,59,1,93,111,4,2,59,114,16358,16360,1,8217,59,1,8217,4,3,104,105,114,16371,16377,16383,114,101,101,59,1,8908,109,101,115,59,1,8906,105,4,4,59,101,102,108,16394,16396,16399,16402,1,9657,59,1,8885,59,1,9656,116,114,105,59,1,10702,108,117,104,97,114,59,1,10600,59,1,8478,4,19,97,98,99,100,101,102,104,105,108,109,111,112,113,114,115,116,117,119,122,16459,16466,16472,16572,16590,16672,16687,16746,16844,16850,16924,16963,16988,17115,17121,17154,17206,17614,17656,99,117,116,101,59,1,347,113,117,111,59,1,8218,4,10,59,69,97,99,101,105,110,112,115,121,16494,16496,16499,16513,16518,16531,16536,16556,16564,16569,1,8827,59,1,10932,4,2,112,114,16505,16508,59,1,10936,111,110,59,1,353,117,101,59,1,8829,4,2,59,100,16524,16526,1,10928,105,108,59,1,351,114,99,59,1,349,4,3,69,97,115,16544,16547,16551,59,1,10934,112,59,1,10938,105,109,59,1,8937,111,108,105,110,116,59,1,10771,105,109,59,1,8831,59,1,1089,111,116,4,3,59,98,101,16582,16584,16587,1,8901,59,1,8865,59,1,10854,4,7,65,97,99,109,115,116,120,16606,16611,16634,16642,16646,16652,16668,114,114,59,1,8664,114,4,2,104,114,16618,16622,107,59,1,10533,4,2,59,111,16628,16630,1,8600,119,59,1,8600,116,5,167,1,59,16640,1,167,105,59,1,59,119,97,114,59,1,10537,109,4,2,105,110,16659,16665,110,117,115,59,1,8726,59,1,8726,116,59,1,10038,114,4,2,59,111,16679,16682,3,55349,56624,119,110,59,1,8994,4,4,97,99,111,121,16697,16702,16716,16739,114,112,59,1,9839,4,2,104,121,16708,16713,99,121,59,1,1097,59,1,1096,114,116,4,2,109,112,16724,16729,105,100,59,1,8739,97,114,97,108,108,101,108,59,1,8741,5,173,1,59,16744,1,173,4,2,103,109,16752,16770,109,97,4,3,59,102,118,16762,16764,16767,1,963,59,1,962,59,1,962,4,8,59,100,101,103,108,110,112,114,16788,16790,16795,16806,16817,16828,16832,16838,1,8764,111,116,59,1,10858,4,2,59,113,16801,16803,1,8771,59,1,8771,4,2,59,69,16812,16814,1,10910,59,1,10912,4,2,59,69,16823,16825,1,10909,59,1,10911,101,59,1,8774,108,117,115,59,1,10788,97,114,114,59,1,10610,97,114,114,59,1,8592,4,4,97,101,105,116,16860,16883,16891,16904,4,2,108,115,16866,16878,108,115,101,116,109,105,110,117,115,59,1,8726,104,112,59,1,10803,112,97,114,115,108,59,1,10724,4,2,100,108,16897,16900,59,1,8739,101,59,1,8995,4,2,59,101,16910,16912,1,10922,4,2,59,115,16918,16920,1,10924,59,3,10924,65024,4,3,102,108,112,16932,16938,16958,116,99,121,59,1,1100,4,2,59,98,16944,16946,1,47,4,2,59,97,16952,16954,1,10692,114,59,1,9023,102,59,3,55349,56676,97,4,2,100,114,16970,16985,101,115,4,2,59,117,16978,16980,1,9824,105,116,59,1,9824,59,1,8741,4,3,99,115,117,16996,17028,17089,4,2,97,117,17002,17015,112,4,2,59,115,17009,17011,1,8851,59,3,8851,65024,112,4,2,59,115,17022,17024,1,8852,59,3,8852,65024,117,4,2,98,112,17035,17062,4,3,59,101,115,17043,17045,17048,1,8847,59,1,8849,101,116,4,2,59,101,17056,17058,1,8847,113,59,1,8849,4,3,59,101,115,17070,17072,17075,1,8848,59,1,8850,101,116,4,2,59,101,17083,17085,1,8848,113,59,1,8850,4,3,59,97,102,17097,17099,17112,1,9633,114,4,2,101,102,17106,17109,59,1,9633,59,1,9642,59,1,9642,97,114,114,59,1,8594,4,4,99,101,109,116,17131,17136,17142,17148,114,59,3,55349,56520,116,109,110,59,1,8726,105,108,101,59,1,8995,97,114,102,59,1,8902,4,2,97,114,17160,17172,114,4,2,59,102,17167,17169,1,9734,59,1,9733,4,2,97,110,17178,17202,105,103,104,116,4,2,101,112,17188,17197,112,115,105,108,111,110,59,1,1013,104,105,59,1,981,115,59,1,175,4,5,98,99,109,110,112,17218,17351,17420,17423,17427,4,9,59,69,100,101,109,110,112,114,115,17238,17240,17243,17248,17261,17267,17279,17285,17291,1,8834,59,1,10949,111,116,59,1,10941,4,2,59,100,17254,17256,1,8838,111,116,59,1,10947,117,108,116,59,1,10945,4,2,69,101,17273,17276,59,1,10955,59,1,8842,108,117,115,59,1,10943,97,114,114,59,1,10617,4,3,101,105,117,17299,17335,17339,116,4,3,59,101,110,17308,17310,17322,1,8834,113,4,2,59,113,17317,17319,1,8838,59,1,10949,101,113,4,2,59,113,17330,17332,1,8842,59,1,10955,109,59,1,10951,4,2,98,112,17345,17348,59,1,10965,59,1,10963,99,4,6,59,97,99,101,110,115,17366,17368,17376,17385,17389,17415,1,8827,112,112,114,111,120,59,1,10936,117,114,108,121,101,113,59,1,8829,113,59,1,10928,4,3,97,101,115,17397,17405,17410,112,112,114,111,120,59,1,10938,113,113,59,1,10934,105,109,59,1,8937,105,109,59,1,8831,59,1,8721,103,59,1,9834,4,13,49,50,51,59,69,100,101,104,108,109,110,112,115,17455,17462,17469,17476,17478,17481,17496,17509,17524,17530,17536,17548,17554,5,185,1,59,17460,1,185,5,178,1,59,17467,1,178,5,179,1,59,17474,1,179,1,8835,59,1,10950,4,2,111,115,17487,17491,116,59,1,10942,117,98,59,1,10968,4,2,59,100,17502,17504,1,8839,111,116,59,1,10948,115,4,2,111,117,17516,17520,108,59,1,10185,98,59,1,10967,97,114,114,59,1,10619,117,108,116,59,1,10946,4,2,69,101,17542,17545,59,1,10956,59,1,8843,108,117,115,59,1,10944,4,3,101,105,117,17562,17598,17602,116,4,3,59,101,110,17571,17573,17585,1,8835,113,4,2,59,113,17580,17582,1,8839,59,1,10950,101,113,4,2,59,113,17593,17595,1,8843,59,1,10956,109,59,1,10952,4,2,98,112,17608,17611,59,1,10964,59,1,10966,4,3,65,97,110,17622,17627,17650,114,114,59,1,8665,114,4,2,104,114,17634,17638,107,59,1,10534,4,2,59,111,17644,17646,1,8601,119,59,1,8601,119,97,114,59,1,10538,108,105,103,5,223,1,59,17664,1,223,4,13,97,98,99,100,101,102,104,105,111,112,114,115,119,17694,17709,17714,17737,17742,17749,17754,17860,17905,17957,17964,18090,18122,4,2,114,117,17700,17706,103,101,116,59,1,8982,59,1,964,114,107,59,1,9140,4,3,97,101,121,17722,17728,17734,114,111,110,59,1,357,100,105,108,59,1,355,59,1,1090,111,116,59,1,8411,108,114,101,99,59,1,8981,114,59,3,55349,56625,4,4,101,105,107,111,17764,17805,17836,17851,4,2,114,116,17770,17786,101,4,2,52,102,17777,17780,59,1,8756,111,114,101,59,1,8756,97,4,3,59,115,118,17795,17797,17802,1,952,121,109,59,1,977,59,1,977,4,2,99,110,17811,17831,107,4,2,97,115,17818,17826,112,112,114,111,120,59,1,8776,105,109,59,1,8764,115,112,59,1,8201,4,2,97,115,17842,17846,112,59,1,8776,105,109,59,1,8764,114,110,5,254,1,59,17858,1,254,4,3,108,109,110,17868,17873,17901,100,101,59,1,732,101,115,5,215,3,59,98,100,17884,17886,17898,1,215,4,2,59,97,17892,17894,1,8864,114,59,1,10801,59,1,10800,116,59,1,8749,4,3,101,112,115,17913,17917,17953,97,59,1,10536,4,4,59,98,99,102,17927,17929,17934,17939,1,8868,111,116,59,1,9014,105,114,59,1,10993,4,2,59,111,17945,17948,3,55349,56677,114,107,59,1,10970,97,59,1,10537,114,105,109,101,59,1,8244,4,3,97,105,112,17972,17977,18082,100,101,59,1,8482,4,7,97,100,101,109,112,115,116,17993,18051,18056,18059,18066,18072,18076,110,103,108,101,4,5,59,100,108,113,114,18009,18011,18017,18032,18035,1,9653,111,119,110,59,1,9663,101,102,116,4,2,59,101,18026,18028,1,9667,113,59,1,8884,59,1,8796,105,103,104,116,4,2,59,101,18045,18047,1,9657,113,59,1,8885,111,116,59,1,9708,59,1,8796,105,110,117,115,59,1,10810,108,117,115,59,1,10809,98,59,1,10701,105,109,101,59,1,10811,101,122,105,117,109,59,1,9186,4,3,99,104,116,18098,18111,18116,4,2,114,121,18104,18108,59,3,55349,56521,59,1,1094,99,121,59,1,1115,114,111,107,59,1,359,4,2,105,111,18128,18133,120,116,59,1,8812,104,101,97,100,4,2,108,114,18143,18154,101,102,116,97,114,114,111,119,59,1,8606,105,103,104,116,97,114,114,111,119,59,1,8608,4,18,65,72,97,98,99,100,102,103,104,108,109,111,112,114,115,116,117,119,18204,18209,18214,18234,18250,18268,18292,18308,18319,18343,18379,18397,18413,18504,18547,18553,18584,18603,114,114,59,1,8657,97,114,59,1,10595,4,2,99,114,18220,18230,117,116,101,5,250,1,59,18228,1,250,114,59,1,8593,114,4,2,99,101,18241,18245,121,59,1,1118,118,101,59,1,365,4,2,105,121,18256,18265,114,99,5,251,1,59,18263,1,251,59,1,1091,4,3,97,98,104,18276,18281,18287,114,114,59,1,8645,108,97,99,59,1,369,97,114,59,1,10606,4,2,105,114,18298,18304,115,104,116,59,1,10622,59,3,55349,56626,114,97,118,101,5,249,1,59,18317,1,249,4,2,97,98,18325,18338,114,4,2,108,114,18332,18335,59,1,8639,59,1,8638,108,107,59,1,9600,4,2,99,116,18349,18374,4,2,111,114,18355,18369,114,110,4,2,59,101,18363,18365,1,8988,114,59,1,8988,111,112,59,1,8975,114,105,59,1,9720,4,2,97,108,18385,18390,99,114,59,1,363,5,168,1,59,18395,1,168,4,2,103,112,18403,18408,111,110,59,1,371,102,59,3,55349,56678,4,6,97,100,104,108,115,117,18427,18434,18445,18470,18475,18494,114,114,111,119,59,1,8593,111,119,110,97,114,114,111,119,59,1,8597,97,114,112,111,111,110,4,2,108,114,18457,18463,101,102,116,59,1,8639,105,103,104,116,59,1,8638,117,115,59,1,8846,105,4,3,59,104,108,18484,18486,18489,1,965,59,1,978,111,110,59,1,965,112,97,114,114,111,119,115,59,1,8648,4,3,99,105,116,18512,18537,18542,4,2,111,114,18518,18532,114,110,4,2,59,101,18526,18528,1,8989,114,59,1,8989,111,112,59,1,8974,110,103,59,1,367,114,105,59,1,9721,99,114,59,3,55349,56522,4,3,100,105,114,18561,18566,18572,111,116,59,1,8944,108,100,101,59,1,361,105,4,2,59,102,18579,18581,1,9653,59,1,9652,4,2,97,109,18590,18595,114,114,59,1,8648,108,5,252,1,59,18601,1,252,97,110,103,108,101,59,1,10663,4,15,65,66,68,97,99,100,101,102,108,110,111,112,114,115,122,18643,18648,18661,18667,18847,18851,18857,18904,18909,18915,18931,18937,18943,18949,18996,114,114,59,1,8661,97,114,4,2,59,118,18656,18658,1,10984,59,1,10985,97,115,104,59,1,8872,4,2,110,114,18673,18679,103,114,116,59,1,10652,4,7,101,107,110,112,114,115,116,18695,18704,18711,18720,18742,18754,18810,112,115,105,108,111,110,59,1,1013,97,112,112,97,59,1,1008,111,116,104,105,110,103,59,1,8709,4,3,104,105,114,18728,18732,18735,105,59,1,981,59,1,982,111,112,116,111,59,1,8733,4,2,59,104,18748,18750,1,8597,111,59,1,1009,4,2,105,117,18760,18766,103,109,97,59,1,962,4,2,98,112,18772,18791,115,101,116,110,101,113,4,2,59,113,18784,18787,3,8842,65024,59,3,10955,65024,115,101,116,110,101,113,4,2,59,113,18803,18806,3,8843,65024,59,3,10956,65024,4,2,104,114,18816,18822,101,116,97,59,1,977,105,97,110,103,108,101,4,2,108,114,18834,18840,101,102,116,59,1,8882,105,103,104,116,59,1,8883,121,59,1,1074,97,115,104,59,1,8866,4,3,101,108,114,18865,18884,18890,4,3,59,98,101,18873,18875,18880,1,8744,97,114,59,1,8891,113,59,1,8794,108,105,112,59,1,8942,4,2,98,116,18896,18901,97,114,59,1,124,59,1,124,114,59,3,55349,56627,116,114,105,59,1,8882,115,117,4,2,98,112,18923,18927,59,3,8834,8402,59,3,8835,8402,112,102,59,3,55349,56679,114,111,112,59,1,8733,116,114,105,59,1,8883,4,2,99,117,18955,18960,114,59,3,55349,56523,4,2,98,112,18966,18981,110,4,2,69,101,18973,18977,59,3,10955,65024,59,3,8842,65024,110,4,2,69,101,18988,18992,59,3,10956,65024,59,3,8843,65024,105,103,122,97,103,59,1,10650,4,7,99,101,102,111,112,114,115,19020,19026,19061,19066,19072,19075,19089,105,114,99,59,1,373,4,2,100,105,19032,19055,4,2,98,103,19038,19043,97,114,59,1,10847,101,4,2,59,113,19050,19052,1,8743,59,1,8793,101,114,112,59,1,8472,114,59,3,55349,56628,112,102,59,3,55349,56680,59,1,8472,4,2,59,101,19081,19083,1,8768,97,116,104,59,1,8768,99,114,59,3,55349,56524,4,14,99,100,102,104,105,108,109,110,111,114,115,117,118,119,19125,19146,19152,19157,19173,19176,19192,19197,19202,19236,19252,19269,19286,19291,4,3,97,105,117,19133,19137,19142,112,59,1,8898,114,99,59,1,9711,112,59,1,8899,116,114,105,59,1,9661,114,59,3,55349,56629,4,2,65,97,19163,19168,114,114,59,1,10234,114,114,59,1,10231,59,1,958,4,2,65,97,19182,19187,114,114,59,1,10232,114,114,59,1,10229,97,112,59,1,10236,105,115,59,1,8955,4,3,100,112,116,19210,19215,19230,111,116,59,1,10752,4,2,102,108,19221,19225,59,3,55349,56681,117,115,59,1,10753,105,109,101,59,1,10754,4,2,65,97,19242,19247,114,114,59,1,10233,114,114,59,1,10230,4,2,99,113,19258,19263,114,59,3,55349,56525,99,117,112,59,1,10758,4,2,112,116,19275,19281,108,117,115,59,1,10756,114,105,59,1,9651,101,101,59,1,8897,101,100,103,101,59,1,8896,4,8,97,99,101,102,105,111,115,117,19316,19335,19349,19357,19362,19367,19373,19379,99,4,2,117,121,19323,19332,116,101,5,253,1,59,19330,1,253,59,1,1103,4,2,105,121,19341,19346,114,99,59,1,375,59,1,1099,110,5,165,1,59,19355,1,165,114,59,3,55349,56630,99,121,59,1,1111,112,102,59,3,55349,56682,99,114,59,3,55349,56526,4,2,99,109,19385,19389,121,59,1,1102,108,5,255,1,59,19395,1,255,4,10,97,99,100,101,102,104,105,111,115,119,19419,19426,19441,19446,19462,19467,19472,19480,19486,19492,99,117,116,101,59,1,378,4,2,97,121,19432,19438,114,111,110,59,1,382,59,1,1079,111,116,59,1,380,4,2,101,116,19452,19458,116,114,102,59,1,8488,97,59,1,950,114,59,3,55349,56631,99,121,59,1,1078,103,114,97,114,114,59,1,8669,112,102,59,3,55349,56683,99,114,59,3,55349,56527,4,2,106,110,19498,19501,59,1,8205,106,59,1,8204])},dAEq:function(e,t,n){"use strict";var o=n("HtLg"),r=n("Vx/6"),a=n("fuKP"),i=n("/+k/"),s=n("Ig3s"),l=n("T0BQ"),c={name:"attention",tokenize:function(e,t){var n,o=a(this.previous);return function(t){return e.enter("attentionSequence"),n=t,r(t)};function r(i){var s,l,c,u;return i===n?(e.consume(i),r):(s=e.exit("attentionSequence"),c=!(l=a(i))||2===l&&o,u=!o||2===o&&l,s._open=42===n?c:c&&(o||!u),s._close=42===n?u:u&&(l||!c),t(i))}},resolveAll:function(e,t){var n,a,c,u,d,p,f,h,m=-1;for(;++m1&&e[m][1].end.offset-e[m][1].start.offset>1?2:1,u={type:p>1?"strongSequence":"emphasisSequence",start:i(l(e[n][1].end),-p),end:l(e[n][1].end)},d={type:p>1?"strongSequence":"emphasisSequence",start:l(e[m][1].start),end:i(l(e[m][1].start),p)},c={type:p>1?"strongText":"emphasisText",start:l(e[n][1].end),end:l(e[m][1].start)},a={type:p>1?"strong":"emphasis",start:l(u.start),end:l(d.end)},e[n][1].end=l(u.start),e[m][1].start=l(d.end),f=[],e[n][1].end.offset-e[n][1].start.offset&&(f=o(f,[["enter",e[n][1],t],["exit",e[n][1],t]])),f=o(f,[["enter",a,t],["enter",u,t],["exit",u,t],["enter",c,t]]),f=o(f,s(t.parser.constructs.insideSpan.null,e.slice(n+1,m),t)),f=o(f,[["exit",c,t],["enter",d,t],["exit",d,t],["exit",a,t]]),e[m][1].end.offset-e[m][1].start.offset?(h=2,f=o(f,[["enter",e[m][1],t],["exit",e[m][1],t]])):h=0,r(e,n-1,m-n+3,f),m=n+f.length-h-2;break}m=-1;for(;++m?\]}]+$/.exec(e);if(a)for(e=e.slice(0,a.index),t=(a=a[0]).indexOf(")"),n=o(e,"("),r=o(e,")");-1!==t&&n>r;)e+=a.slice(0,t+1),t=(a=a.slice(t+1)).indexOf(")"),r++;return[e,a]}(n+r))[0]&&(s={type:"link",title:null,url:l+t+i[0],children:[{type:"text",value:t+i[0]}]},i[1]&&(s=[s,{type:"text",value:i[1]}]),s)))}function c(e,t,n,o){return!(!u(o,!0)||/[_-]$/.test(n))&&{type:"link",title:null,url:"mailto:"+t+"@"+n,children:[{type:"text",value:t+"@"+n}]}}function u(e,t){var n=e.input.charCodeAt(e.index-1);return(n!==n||i(n)||a(n))&&(!t||47!==n)}t.transforms=[function(e){r(e,[[/(https?:\/\/|www(?=\.))([-.\w]+)([^ \t\r\n]*)/i,l],[/([-.\w+]+)@([-\w]+(?:\.[-\w]+)+)/,c]],{ignore:["link","linkReference"]})}],t.enter={literalAutolink:function(e){this.enter({type:"link",title:null,url:"",children:[]},e)},literalAutolinkEmail:s,literalAutolinkHttp:s,literalAutolinkWww:s},t.exit={literalAutolink:function(e){this.exit(e)},literalAutolinkEmail:function(e){this.config.exit.autolinkEmail.call(this,e)},literalAutolinkHttp:function(e){this.config.exit.autolinkProtocol.call(this,e)},literalAutolinkWww:function(e){this.config.exit.data.call(this,e),this.stack[this.stack.length-1].url="http://"+this.sliceSerialize(e)}}},ecSx:function(e,t,n){"use strict";var o=n("ek1N");e.exports=function(e,t){e&&!e.process&&(t=e,e=null);return e?function(e,t){return n;function n(n,r,a){function i(e){a(e)}e.run(o(n,t),r,i)}}(e,t):function(e){return t;function t(t){return o(t,e)}}(t)}},ek1N:function(e,t,n){"use strict";e.exports=n("FYh5")},escJ:function(e,t,n){"use strict";var o=n("yRGd"),r={name:"lineEnding",tokenize:function(e,t){return function(n){return e.enter("lineEnding"),e.consume(n),e.exit("lineEnding"),o(e,t,"linePrefix")}}};e.exports=r},f8fV:function(e,t,n){e.exports=function(e){var t=(e||{}).singleTilde,n={tokenize:function(e,n,r){var a=this.previous,i=this.events,s=0;return l;function l(t){return 126!==t||126===a&&"characterEscape"!==i[i.length-1][1].type?r(t):(e.enter("strikethroughSequenceTemporary"),c(t))}function c(i){var l,u,d=o(a);return 126===i?s>1?r(i):(e.consume(i),s++,c):s<2&&!t?r(i):(l=e.exit("strikethroughSequenceTemporary"),u=o(i),l._open=!u||2===u&&d,l._close=!d||2===d&&u,n(i))}},resolveAll:function(e,t){var n,o,s,l,c=-1;for(;++c-1)return o.QUIRKS;let e=null===t?i:a;if(d(n,e))return o.QUIRKS;if(e=null===t?l:c,d(n,e))return o.LIMITED_QUIRKS}return o.NO_QUIRKS},t.serializeContent=function(e,t,n){let o="!DOCTYPE ";return e&&(o+=e),t?o+=" PUBLIC "+u(t):n&&(o+=" SYSTEM"),null!==n&&(o+=" "+u(n)),o}},fFcG:function(e,t,n){"use strict";e.exports=function(e,t){return e.dangerous?e.augment(t,o("raw",t.value)):null};var o=n("vUGn")},fL8H:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{color:"#657b83",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#657b83",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",borderRadius:"0.3em",backgroundColor:"#fdf6e3"},'pre[class*="language-"]::-moz-selection':{background:"#073642"},'pre[class*="language-"] ::-moz-selection':{background:"#073642"},'code[class*="language-"]::-moz-selection':{background:"#073642"},'code[class*="language-"] ::-moz-selection':{background:"#073642"},'pre[class*="language-"]::selection':{background:"#073642"},'pre[class*="language-"] ::selection':{background:"#073642"},'code[class*="language-"]::selection':{background:"#073642"},'code[class*="language-"] ::selection':{background:"#073642"},':not(pre) > code[class*="language-"]':{backgroundColor:"#fdf6e3",padding:".1em",borderRadius:".3em"},comment:{color:"#93a1a1"},prolog:{color:"#93a1a1"},doctype:{color:"#93a1a1"},cdata:{color:"#93a1a1"},punctuation:{color:"#586e75"},namespace:{Opacity:".7"},property:{color:"#268bd2"},tag:{color:"#268bd2"},boolean:{color:"#268bd2"},number:{color:"#268bd2"},constant:{color:"#268bd2"},symbol:{color:"#268bd2"},deleted:{color:"#268bd2"},selector:{color:"#2aa198"},"attr-name":{color:"#2aa198"},string:{color:"#2aa198"},char:{color:"#2aa198"},builtin:{color:"#2aa198"},url:{color:"#2aa198"},inserted:{color:"#2aa198"},entity:{color:"#657b83",background:"#eee8d5",cursor:"help"},atrule:{color:"#859900"},"attr-value":{color:"#859900"},keyword:{color:"#859900"},function:{color:"#b58900"},"class-name":{color:"#b58900"},regex:{color:"#cb4b16"},important:{color:"#cb4b16",fontWeight:"bold"},variable:{color:"#cb4b16"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}}},fUUT:function(e,t,n){"use strict";e.exports=function(e){var t=this;this.Parser=function(n){return o(n,Object.assign({},t.data("settings"),e,{extensions:t.data("micromarkExtensions")||[],mdastExtensions:t.data("fromMarkdownExtensions")||[]}))}};var o=n("LLHA")},"fe/W":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",whiteSpace:"pre-wrap",wordBreak:"break-all",wordWrap:"break-word",fontFamily:'Menlo, Monaco, "Courier New", monospace',fontSize:"15px",lineHeight:"1.5",color:"#dccf8f",textShadow:"0"},'pre[class*="language-"]':{MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",whiteSpace:"pre-wrap",wordBreak:"break-all",wordWrap:"break-word",fontFamily:'Menlo, Monaco, "Courier New", monospace',fontSize:"15px",lineHeight:"1.5",color:"#DCCF8F",textShadow:"0",borderRadius:"5px",border:"1px solid #000",background:"#181914 url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAMAAA/+4ADkFkb2JlAGTAAAAAAf/bAIQACQYGBgcGCQcHCQ0IBwgNDwsJCQsPEQ4ODw4OERENDg4ODg0RERQUFhQUERoaHBwaGiYmJiYmKysrKysrKysrKwEJCAgJCgkMCgoMDwwODA8TDg4ODhMVDg4PDg4VGhMRERERExoXGhYWFhoXHR0aGh0dJCQjJCQrKysrKysrKysr/8AAEQgAjACMAwEiAAIRAQMRAf/EAF4AAQEBAAAAAAAAAAAAAAAAAAABBwEBAQAAAAAAAAAAAAAAAAAAAAIQAAEDAwIHAQEAAAAAAAAAAADwAREhYaExkUFRcYGxwdHh8REBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AyGFEjHaBS2fDDs2zkhKmBKktb7km+ZwwCnXPkLVmCTMItj6AXFxRS465/BTnkAJvkLkJe+7AKKoi2AtRS2zuAWsCb5GOlBN8gKfmuGHZ8MFqIth3ALmFoFwbwKWyAlTAp17uKqBvgBD8sM4fTjhvAhkzhaRkBMKBrfs7jGPIpzy7gFrAqnC0C0gB0EWwBDW2cBVQwm+QtPpa3wBO3sVvszCnLAhkzgL5/RLf13cLQd8/AGlu0Cb5HTx9KuAEieGJEdcehS3eRTp2ATdt3CpIm+QtZwAhROXFeb7swp/ahaM3kBE/jSIUBc/AWrgBN8uNFAl+b7sAXFxFn2YLUU5Ns7gFX8C4ib+hN8gFWXwK3bZglxEJm+gKdciLPsFV/TClsgJUwKJ5FVA7tvIFrfZhVfGJDcsCKaYgAqv6YRbE+RWOWBtu7+AL3yRalXLyKqAIIfk+zARbDgFyEsncYwJvlgFRW+GEWntIi2P0BooyFxcNr8Ep3+ANLbMO+QyhvbiqdgC0kVvgUUiLYgBS2QtPbiVI1/sgOmG9uO+Y8DW+7jS2zAOnj6O2BndwuIAUtkdRN8gFoK3wwXMQyZwHVbClsuNLd4E3yAUR6FVDBR+BafQGt93LVMxJTv8ABts4CVLhcfYWsCb5kC9/BHdU8CLYFY5bMAd+eX9MGthhpbA1vu4B7+RKkaW2Yq4AQtVBBFsAJU/AuIXBhN8gGWnstefhiZyWvLAEnbYS1uzSFP6Jvn4Baxx70JKkQojLib5AVTey1jjgkKJGO0AKWyOm7N7cSpgSpAdPH0Tfd/gp1z5C1ZgKqN9J2wFxcUUuAFLZAm+QC0Fb4YUVRFsAOvj4KW2dwtYE3yAWk/wS/PLMKfmuGHZ8MAXF/Ja32Yi5haAKWz4Ydm2cSpgU693Atb7km+Zwwh+WGcPpxw3gAkzCLY+iYUDW/Z3Adc/gpzyFrAqnALkJe+7DoItgAtRS2zuKqGE3yAx0oJvkdvYrfZmALURbDuL5/RLf13cAuDeBS2RpbtAm+QFVA3wR+3fUtFHoBDJnC0jIXH0HWsgMY8inPLuOkd9chp4z20ALQLSA8cI9jYAIa2zjzjBd8gRafS1vgiUho/kAKcsCGTOGWvoOpkAtB3z8Hm8x2Ff5ADp4+lXAlIvcmwH/2Q==') repeat left top",padding:"12px",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},':not(pre) > code[class*="language-"]':{borderRadius:"5px",border:"1px solid #000",color:"#DCCF8F",background:"#181914 url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAMAAA/+4ADkFkb2JlAGTAAAAAAf/bAIQACQYGBgcGCQcHCQ0IBwgNDwsJCQsPEQ4ODw4OERENDg4ODg0RERQUFhQUERoaHBwaGiYmJiYmKysrKysrKysrKwEJCAgJCgkMCgoMDwwODA8TDg4ODhMVDg4PDg4VGhMRERERExoXGhYWFhoXHR0aGh0dJCQjJCQrKysrKysrKysr/8AAEQgAjACMAwEiAAIRAQMRAf/EAF4AAQEBAAAAAAAAAAAAAAAAAAABBwEBAQAAAAAAAAAAAAAAAAAAAAIQAAEDAwIHAQEAAAAAAAAAAADwAREhYaExkUFRcYGxwdHh8REBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AyGFEjHaBS2fDDs2zkhKmBKktb7km+ZwwCnXPkLVmCTMItj6AXFxRS465/BTnkAJvkLkJe+7AKKoi2AtRS2zuAWsCb5GOlBN8gKfmuGHZ8MFqIth3ALmFoFwbwKWyAlTAp17uKqBvgBD8sM4fTjhvAhkzhaRkBMKBrfs7jGPIpzy7gFrAqnC0C0gB0EWwBDW2cBVQwm+QtPpa3wBO3sVvszCnLAhkzgL5/RLf13cLQd8/AGlu0Cb5HTx9KuAEieGJEdcehS3eRTp2ATdt3CpIm+QtZwAhROXFeb7swp/ahaM3kBE/jSIUBc/AWrgBN8uNFAl+b7sAXFxFn2YLUU5Ns7gFX8C4ib+hN8gFWXwK3bZglxEJm+gKdciLPsFV/TClsgJUwKJ5FVA7tvIFrfZhVfGJDcsCKaYgAqv6YRbE+RWOWBtu7+AL3yRalXLyKqAIIfk+zARbDgFyEsncYwJvlgFRW+GEWntIi2P0BooyFxcNr8Ep3+ANLbMO+QyhvbiqdgC0kVvgUUiLYgBS2QtPbiVI1/sgOmG9uO+Y8DW+7jS2zAOnj6O2BndwuIAUtkdRN8gFoK3wwXMQyZwHVbClsuNLd4E3yAUR6FVDBR+BafQGt93LVMxJTv8ABts4CVLhcfYWsCb5kC9/BHdU8CLYFY5bMAd+eX9MGthhpbA1vu4B7+RKkaW2Yq4AQtVBBFsAJU/AuIXBhN8gGWnstefhiZyWvLAEnbYS1uzSFP6Jvn4Baxx70JKkQojLib5AVTey1jjgkKJGO0AKWyOm7N7cSpgSpAdPH0Tfd/gp1z5C1ZgKqN9J2wFxcUUuAFLZAm+QC0Fb4YUVRFsAOvj4KW2dwtYE3yAWk/wS/PLMKfmuGHZ8MAXF/Ja32Yi5haAKWz4Ydm2cSpgU693Atb7km+Zwwh+WGcPpxw3gAkzCLY+iYUDW/Z3Adc/gpzyFrAqnALkJe+7DoItgAtRS2zuKqGE3yAx0oJvkdvYrfZmALURbDuL5/RLf13cAuDeBS2RpbtAm+QFVA3wR+3fUtFHoBDJnC0jIXH0HWsgMY8inPLuOkd9chp4z20ALQLSA8cI9jYAIa2zjzjBd8gRafS1vgiUho/kAKcsCGTOGWvoOpkAtB3z8Hm8x2Ff5ADp4+lXAlIvcmwH/2Q==') repeat left top",padding:"2px 6px"},namespace:{Opacity:".7"},comment:{color:"#586e75",fontStyle:"italic"},prolog:{color:"#586e75",fontStyle:"italic"},doctype:{color:"#586e75",fontStyle:"italic"},cdata:{color:"#586e75",fontStyle:"italic"},number:{color:"#b89859"},string:{color:"#468966"},char:{color:"#468966"},builtin:{color:"#468966"},inserted:{color:"#468966"},"attr-name":{color:"#b89859"},operator:{color:"#dccf8f"},entity:{color:"#dccf8f",cursor:"help"},url:{color:"#dccf8f"},".language-css .token.string":{color:"#dccf8f"},".style .token.string":{color:"#dccf8f"},selector:{color:"#859900"},regex:{color:"#859900"},atrule:{color:"#cb4b16"},keyword:{color:"#cb4b16"},"attr-value":{color:"#468966"},function:{color:"#b58900"},variable:{color:"#b58900"},placeholder:{color:"#b58900"},property:{color:"#b89859"},tag:{color:"#ffb03b"},boolean:{color:"#b89859"},constant:{color:"#b89859"},symbol:{color:"#b89859"},important:{color:"#dc322f"},statement:{color:"#dc322f"},deleted:{color:"#dc322f"},punctuation:{color:"#dccf8f"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}}},fuKP:function(e,t,n){"use strict";var o=n("Q3zd"),r=n("BjXi"),a=n("uDje");e.exports=function(e){return null===e||o(e)||a(e)?1:r(e)?2:void 0}},g4pe:function(e,t,n){e.exports=n("8Kt/")},gsvO:function(e,t,n){e.exports=r,r.peek=function(){return"`"};var o=n("7J+x");function r(e,t,n){for(var r,a,i,s,l=e.value||"",c="`",u=-1;new RegExp("(^|[^`])"+c+"([^`]|$)").test(l);)c+="`";for(/[^ \r\n]/.test(l)&&(/[ \r\n`]/.test(l.charAt(0))||/[ \r\n`]/.test(l.charAt(l.length-1)))&&(l=" "+l+" ");++up?n(a):(e.consume(a),T):41===a?f--?(e.consume(a),T):(e.exit("chunkString"),e.exit(u),e.exit(c),e.exit(i),t(a)):null===a||r(a)?f?n(a):(e.exit("chunkString"),e.exit(u),e.exit(c),e.exit(i),t(a)):o(a)?n(a):(e.consume(a),92===a?E:T)}function E(t){return 40===t||41===t||92===t?(e.consume(t),T):T(t)}}},hq1P:function(e,t,n){"use strict";var o=n("rm/B")(/[A-Za-z]/);e.exports=o},iX4R:function(e,t,n){"use strict";e.exports=function(e,t){return e(t,"blockquote",o(r(e,t),!0))};var o=n("Dvol"),r=n("WFsM")},iy38:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{color:"white",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",textShadow:"0 -.1em .2em black",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"white",background:"hsl(0, 0%, 8%)",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",textShadow:"0 -.1em .2em black",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",borderRadius:".5em",border:".3em solid hsl(0, 0%, 33%)",boxShadow:"1px 1px .5em black inset",margin:".5em 0",overflow:"auto",padding:"1em"},':not(pre) > code[class*="language-"]':{background:"hsl(0, 0%, 8%)",borderRadius:".3em",border:".13em solid hsl(0, 0%, 33%)",boxShadow:"1px 1px .3em -.1em black inset",padding:".15em .2em .05em",whiteSpace:"normal"},'pre[class*="language-"]::-moz-selection':{background:"hsla(0, 0%, 93%, 0.15)",textShadow:"none"},'pre[class*="language-"]::selection':{background:"hsla(0, 0%, 93%, 0.15)",textShadow:"none"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"hsla(0, 0%, 93%, 0.15)"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"hsla(0, 0%, 93%, 0.15)"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"hsla(0, 0%, 93%, 0.15)"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"hsla(0, 0%, 93%, 0.15)"},'code[class*="language-"]::selection':{textShadow:"none",background:"hsla(0, 0%, 93%, 0.15)"},'code[class*="language-"] ::selection':{textShadow:"none",background:"hsla(0, 0%, 93%, 0.15)"},comment:{color:"hsl(0, 0%, 47%)"},prolog:{color:"hsl(0, 0%, 47%)"},doctype:{color:"hsl(0, 0%, 47%)"},cdata:{color:"hsl(0, 0%, 47%)"},punctuation:{Opacity:".7"},namespace:{Opacity:".7"},tag:{color:"hsl(14, 58%, 55%)"},boolean:{color:"hsl(14, 58%, 55%)"},number:{color:"hsl(14, 58%, 55%)"},deleted:{color:"hsl(14, 58%, 55%)"},keyword:{color:"hsl(53, 89%, 79%)"},property:{color:"hsl(53, 89%, 79%)"},selector:{color:"hsl(53, 89%, 79%)"},constant:{color:"hsl(53, 89%, 79%)"},symbol:{color:"hsl(53, 89%, 79%)"},builtin:{color:"hsl(53, 89%, 79%)"},"attr-name":{color:"hsl(76, 21%, 52%)"},"attr-value":{color:"hsl(76, 21%, 52%)"},string:{color:"hsl(76, 21%, 52%)"},char:{color:"hsl(76, 21%, 52%)"},operator:{color:"hsl(76, 21%, 52%)"},entity:{color:"hsl(76, 21%, 52%)",cursor:"help"},url:{color:"hsl(76, 21%, 52%)"},".language-css .token.string":{color:"hsl(76, 21%, 52%)"},".style .token.string":{color:"hsl(76, 21%, 52%)"},variable:{color:"hsl(76, 21%, 52%)"},inserted:{color:"hsl(76, 21%, 52%)"},atrule:{color:"hsl(218, 22%, 55%)"},regex:{color:"hsl(42, 75%, 65%)"},important:{color:"hsl(42, 75%, 65%)",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},"pre[data-line]":{padding:"1em 0 1em 3em",position:"relative"},".language-markup .token.tag":{color:"hsl(33, 33%, 52%)"},".language-markup .token.attr-name":{color:"hsl(33, 33%, 52%)"},".language-markup .token.punctuation":{color:"hsl(33, 33%, 52%)"},"":{position:"relative",zIndex:"1"},".line-highlight":{background:"linear-gradient(to right, hsla(0, 0%, 33%, .1) 70%, hsla(0, 0%, 33%, 0))",borderBottom:"1px dashed hsl(0, 0%, 33%)",borderTop:"1px dashed hsl(0, 0%, 33%)",left:"0",lineHeight:"inherit",marginTop:"0.75em",padding:"inherit 0",pointerEvents:"none",position:"absolute",right:"0",whiteSpace:"pre",zIndex:"0"},".line-highlight:before":{backgroundColor:"hsl(215, 15%, 59%)",borderRadius:"999px",boxShadow:"0 1px white",color:"hsl(24, 20%, 95%)",content:"attr(data-start)",font:"bold 65%/1.5 sans-serif",left:".6em",minWidth:"1em",padding:"0 .5em",position:"absolute",textAlign:"center",textShadow:"none",top:".4em",verticalAlign:".3em"},".line-highlight[data-end]:after":{backgroundColor:"hsl(215, 15%, 59%)",borderRadius:"999px",boxShadow:"0 1px white",color:"hsl(24, 20%, 95%)",content:"attr(data-end)",font:"bold 65%/1.5 sans-serif",left:".6em",minWidth:"1em",padding:"0 .5em",position:"absolute",textAlign:"center",textShadow:"none",top:"auto",verticalAlign:".3em",bottom:".4em"}}},jO3g:function(e,t,n){"use strict";e.exports=function(e,t,n){var o,r=t&&t.type;if(!r)throw new Error("Expected node, got `"+t+"`");o=a.call(e.handlers,r)?e.handlers[r]:e.passThrough&&e.passThrough.indexOf(r)>-1?s:e.unknownHandler;return("function"===typeof o?o:i)(e,t,n)};var o=n("vUGn"),r=n("WFsM"),a={}.hasOwnProperty;function i(e,t){return function(e){var t=e.data||{};if(a.call(t,"hName")||a.call(t,"hProperties")||a.call(t,"hChildren"))return!1;return"value"in e}(t)?e.augment(t,o("text",t.value)):e(t,"div",r(e,t))}function s(e,t){var n;return t.children?((n=Object.assign({},t)).children=r(e,t),n):t}},jeK3:function(e,t,n){"use strict";e.exports=function(e){for(var t=-1,n=0;++t-1?void 0:4)}},exit:function(e){e.exit("blockQuote")}};e.exports=a},kViG:function(e,t,n){"use strict";var o=n("E/Jm"),r=n("2N74");e.exports=function(e,t,n,a,i,s){var l,c=this,u=0;return function(t){return e.enter(a),e.enter(i),e.consume(t),e.exit(i),e.enter(s),d};function d(r){return null===r||91===r||93===r&&!l||94===r&&!u&&"_hiddenFootnoteSupport"in c.parser.constructs||u>999?n(r):93===r?(e.exit(s),e.enter(i),e.consume(r),e.exit(i),e.exit(a),t):o(r)?(e.enter("lineEnding"),e.consume(r),e.exit("lineEnding"),d):(e.enter("chunkString",{contentType:"string"}),p(r))}function p(t){return null===t||91===t||93===t||o(t)||u++>999?(e.exit("chunkString"),d(t)):(e.consume(t),l=l||!r(t),92===t?f:p)}function f(t){return 91===t||92===t||93===t?(e.consume(t),u++,p):p(t)}}},kWEd:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#322d29",color:"#88786d"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#322d29",color:"#88786d",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#6f5849"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#6f5849"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#6f5849"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#6f5849"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#6f5849"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#6f5849"},'code[class*="language-"]::selection':{textShadow:"none",background:"#6f5849"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#6f5849"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#6a5f58"},prolog:{color:"#6a5f58"},doctype:{color:"#6a5f58"},cdata:{color:"#6a5f58"},punctuation:{color:"#6a5f58"},namespace:{Opacity:".7"},tag:{color:"#bfa05a"},operator:{color:"#bfa05a"},number:{color:"#bfa05a"},property:{color:"#88786d"},function:{color:"#88786d"},"tag-id":{color:"#fff3eb"},selector:{color:"#fff3eb"},"atrule-id":{color:"#fff3eb"},"code.language-javascript":{color:"#a48774"},"attr-name":{color:"#a48774"},"code.language-css":{color:"#fcc440"},"code.language-scss":{color:"#fcc440"},boolean:{color:"#fcc440"},string:{color:"#fcc440"},entity:{color:"#fcc440",cursor:"help"},url:{color:"#fcc440"},".language-css .token.string":{color:"#fcc440"},".language-scss .token.string":{color:"#fcc440"},".style .token.string":{color:"#fcc440"},"attr-value":{color:"#fcc440"},keyword:{color:"#fcc440"},control:{color:"#fcc440"},directive:{color:"#fcc440"},unit:{color:"#fcc440"},statement:{color:"#fcc440"},regex:{color:"#fcc440"},atrule:{color:"#fcc440"},placeholder:{color:"#fcc440"},variable:{color:"#fcc440"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #fff3eb",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#a48774"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:".4em solid #816d5f",OutlineOffset:".4em"},".line-numbers .line-numbers-rows":{borderRightColor:"#35302b"},".line-numbers-rows > span:before":{color:"#46403d"},".line-highlight":{background:"linear-gradient(to right, rgba(191, 160, 90, 0.2) 70%, rgba(191, 160, 90, 0))"}}},ki31:function(e,t){t.canContainEols=["delete"],t.enter={strikethrough:function(e){this.enter({type:"delete",children:[]},e)}},t.exit={strikethrough:function(e){this.exit(e)}}},ktEA:function(e,t,n){"use strict";e.exports=function(e,t){return e(t,"em",o(e,t))};var o=n("WFsM")},lQDV:function(e,t,n){"use strict";e.exports=function(e,t){return e(t,"h"+t.depth,o(e,t))};var o=n("WFsM")},lVxK:function(e,t,n){"use strict";const o=n("zpDW"),r=n("UwWT"),a=r.TAG_NAMES,i=r.NAMESPACES,s=r.ATTRS,l="text/html",c="application/xhtml+xml",u={attributename:"attributeName",attributetype:"attributeType",basefrequency:"baseFrequency",baseprofile:"baseProfile",calcmode:"calcMode",clippathunits:"clipPathUnits",diffuseconstant:"diffuseConstant",edgemode:"edgeMode",filterunits:"filterUnits",glyphref:"glyphRef",gradienttransform:"gradientTransform",gradientunits:"gradientUnits",kernelmatrix:"kernelMatrix",kernelunitlength:"kernelUnitLength",keypoints:"keyPoints",keysplines:"keySplines",keytimes:"keyTimes",lengthadjust:"lengthAdjust",limitingconeangle:"limitingConeAngle",markerheight:"markerHeight",markerunits:"markerUnits",markerwidth:"markerWidth",maskcontentunits:"maskContentUnits",maskunits:"maskUnits",numoctaves:"numOctaves",pathlength:"pathLength",patterncontentunits:"patternContentUnits",patterntransform:"patternTransform",patternunits:"patternUnits",pointsatx:"pointsAtX",pointsaty:"pointsAtY",pointsatz:"pointsAtZ",preservealpha:"preserveAlpha",preserveaspectratio:"preserveAspectRatio",primitiveunits:"primitiveUnits",refx:"refX",refy:"refY",repeatcount:"repeatCount",repeatdur:"repeatDur",requiredextensions:"requiredExtensions",requiredfeatures:"requiredFeatures",specularconstant:"specularConstant",specularexponent:"specularExponent",spreadmethod:"spreadMethod",startoffset:"startOffset",stddeviation:"stdDeviation",stitchtiles:"stitchTiles",surfacescale:"surfaceScale",systemlanguage:"systemLanguage",tablevalues:"tableValues",targetx:"targetX",targety:"targetY",textlength:"textLength",viewbox:"viewBox",viewtarget:"viewTarget",xchannelselector:"xChannelSelector",ychannelselector:"yChannelSelector",zoomandpan:"zoomAndPan"},d={"xlink:actuate":{prefix:"xlink",name:"actuate",namespace:i.XLINK},"xlink:arcrole":{prefix:"xlink",name:"arcrole",namespace:i.XLINK},"xlink:href":{prefix:"xlink",name:"href",namespace:i.XLINK},"xlink:role":{prefix:"xlink",name:"role",namespace:i.XLINK},"xlink:show":{prefix:"xlink",name:"show",namespace:i.XLINK},"xlink:title":{prefix:"xlink",name:"title",namespace:i.XLINK},"xlink:type":{prefix:"xlink",name:"type",namespace:i.XLINK},"xml:base":{prefix:"xml",name:"base",namespace:i.XML},"xml:lang":{prefix:"xml",name:"lang",namespace:i.XML},"xml:space":{prefix:"xml",name:"space",namespace:i.XML},xmlns:{prefix:"",name:"xmlns",namespace:i.XMLNS},"xmlns:xlink":{prefix:"xmlns",name:"xlink",namespace:i.XMLNS}},p=t.SVG_TAG_NAMES_ADJUSTMENT_MAP={altglyph:"altGlyph",altglyphdef:"altGlyphDef",altglyphitem:"altGlyphItem",animatecolor:"animateColor",animatemotion:"animateMotion",animatetransform:"animateTransform",clippath:"clipPath",feblend:"feBlend",fecolormatrix:"feColorMatrix",fecomponenttransfer:"feComponentTransfer",fecomposite:"feComposite",feconvolvematrix:"feConvolveMatrix",fediffuselighting:"feDiffuseLighting",fedisplacementmap:"feDisplacementMap",fedistantlight:"feDistantLight",feflood:"feFlood",fefunca:"feFuncA",fefuncb:"feFuncB",fefuncg:"feFuncG",fefuncr:"feFuncR",fegaussianblur:"feGaussianBlur",feimage:"feImage",femerge:"feMerge",femergenode:"feMergeNode",femorphology:"feMorphology",feoffset:"feOffset",fepointlight:"fePointLight",fespecularlighting:"feSpecularLighting",fespotlight:"feSpotLight",fetile:"feTile",feturbulence:"feTurbulence",foreignobject:"foreignObject",glyphref:"glyphRef",lineargradient:"linearGradient",radialgradient:"radialGradient",textpath:"textPath"},f={[a.B]:!0,[a.BIG]:!0,[a.BLOCKQUOTE]:!0,[a.BODY]:!0,[a.BR]:!0,[a.CENTER]:!0,[a.CODE]:!0,[a.DD]:!0,[a.DIV]:!0,[a.DL]:!0,[a.DT]:!0,[a.EM]:!0,[a.EMBED]:!0,[a.H1]:!0,[a.H2]:!0,[a.H3]:!0,[a.H4]:!0,[a.H5]:!0,[a.H6]:!0,[a.HEAD]:!0,[a.HR]:!0,[a.I]:!0,[a.IMG]:!0,[a.LI]:!0,[a.LISTING]:!0,[a.MENU]:!0,[a.META]:!0,[a.NOBR]:!0,[a.OL]:!0,[a.P]:!0,[a.PRE]:!0,[a.RUBY]:!0,[a.S]:!0,[a.SMALL]:!0,[a.SPAN]:!0,[a.STRONG]:!0,[a.STRIKE]:!0,[a.SUB]:!0,[a.SUP]:!0,[a.TABLE]:!0,[a.TT]:!0,[a.U]:!0,[a.UL]:!0,[a.VAR]:!0};t.causesExit=function(e){const t=e.tagName;return!!(t===a.FONT&&(null!==o.getTokenAttr(e,s.COLOR)||null!==o.getTokenAttr(e,s.SIZE)||null!==o.getTokenAttr(e,s.FACE)))||f[t]},t.adjustTokenMathMLAttrs=function(e){for(let t=0;t{const a=r.MODE[o];n[a]=function(n){e.ctLoc=e._getCurrentLocation(),t[a].call(this,n)}})),n}}},ljYj:function(e,t,n){"use strict";var o=n("rm/B")(/\d/);e.exports=o},lwAK:function(e,t,n){"use strict";var o;t.__esModule=!0,t.AmpStateContext=void 0;var r=((o=n("q1tI"))&&o.__esModule?o:{default:o}).default.createContext({});t.AmpStateContext=r},mAwW:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#f5f7ff",color:"#5e6687"},'pre[class*="language-"]':{fontFamily:'Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace',fontSize:"14px",lineHeight:"1.375",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",background:"#f5f7ff",color:"#5e6687",padding:"1em",margin:".5em 0",overflow:"auto"},'pre > code[class*="language-"]':{fontSize:"1em"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#dfe2f1"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#dfe2f1"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#dfe2f1"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#dfe2f1"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#dfe2f1"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#dfe2f1"},'code[class*="language-"]::selection':{textShadow:"none",background:"#dfe2f1"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#dfe2f1"},':not(pre) > code[class*="language-"]':{padding:".1em",borderRadius:".3em"},comment:{color:"#898ea4"},prolog:{color:"#898ea4"},doctype:{color:"#898ea4"},cdata:{color:"#898ea4"},punctuation:{color:"#5e6687"},namespace:{Opacity:".7"},operator:{color:"#c76b29"},boolean:{color:"#c76b29"},number:{color:"#c76b29"},property:{color:"#c08b30"},tag:{color:"#3d8fd1"},string:{color:"#22a2c9"},selector:{color:"#6679cc"},"attr-name":{color:"#c76b29"},entity:{color:"#22a2c9",cursor:"help"},url:{color:"#22a2c9"},".language-css .token.string":{color:"#22a2c9"},".style .token.string":{color:"#22a2c9"},"attr-value":{color:"#ac9739"},keyword:{color:"#ac9739"},control:{color:"#ac9739"},directive:{color:"#ac9739"},unit:{color:"#ac9739"},statement:{color:"#22a2c9"},regex:{color:"#22a2c9"},atrule:{color:"#22a2c9"},placeholder:{color:"#3d8fd1"},variable:{color:"#3d8fd1"},deleted:{textDecoration:"line-through"},inserted:{borderBottom:"1px dotted #202746",textDecoration:"none"},italic:{fontStyle:"italic"},important:{fontWeight:"bold",color:"#c94922"},bold:{fontWeight:"bold"},"pre > code.highlight":{Outline:"0.4em solid #c94922",OutlineOffset:".4em"},".line-numbers .line-numbers-rows":{borderRightColor:"#dfe2f1"},".line-numbers-rows > span:before":{color:"#979db4"},".line-highlight":{background:"linear-gradient(to right, rgba(107, 115, 148, 0.2) 70%, rgba(107, 115, 148, 0))"}}},nbFU:function(e,t,n){"use strict";e.exports=function(e,t){var n=e.footnoteById,r=e.footnoteOrder,a=1;for(;a in n;)a++;return a=String(a),r.push(a),n[a]={type:"footnoteDefinition",identifier:a,children:[{type:"paragraph",children:t.children}],position:t.position},o(e,{type:"footnoteReference",identifier:a,position:t.position})};var o=n("/BR8")},niEq:function(e,t,n){"use strict";const o=n("9kwo"),r=n("Ne21"),a=n("lb9w"),i=n("HwUZ");e.exports=class extends o{constructor(e,t){super(e,t),this.opts=t,this.ctLoc=null,this.locBeforeToken=!1}_setErrorLocation(e){this.ctLoc&&(e.startLine=this.ctLoc.startLine,e.startCol=this.ctLoc.startCol,e.startOffset=this.ctLoc.startOffset,e.endLine=this.locBeforeToken?this.ctLoc.startLine:this.ctLoc.endLine,e.endCol=this.locBeforeToken?this.ctLoc.startCol:this.ctLoc.endCol,e.endOffset=this.locBeforeToken?this.ctLoc.startOffset:this.ctLoc.endOffset)}_getOverriddenMethods(e,t){return{_bootstrap(n,o){t._bootstrap.call(this,n,o),i.install(this.tokenizer,r,e.opts),i.install(this.tokenizer,a)},_processInputToken(n){e.ctLoc=n.location,t._processInputToken.call(this,n)},_err(t,n){e.locBeforeToken=n&&n.beforeToken,e._reportError(t)}}}}},o8bm:function(e,t,n){"use strict";var o=/[\0\t\n\r]/g;e.exports=function(){var e,t=!0,n=1,r="";return function(a,i,s){var l,c,u,d,p,f=[];a=r+a.toString(i),u=0,r="",t&&(65279===a.charCodeAt(0)&&u++,t=void 0);for(;u code[class*='language-']":{background:"#1e1e3f",padding:"0.1em",borderRadius:"0.3em"},"":{fontWeight:"400"},comment:{color:"#b362ff"},prolog:{color:"#b362ff"},cdata:{color:"#b362ff"},delimiter:{color:"#ff9d00"},keyword:{color:"#ff9d00"},selector:{color:"#ff9d00"},important:{color:"#ff9d00"},atrule:{color:"#ff9d00"},operator:{color:"rgb(255, 180, 84)",background:"none"},"attr-name":{color:"rgb(255, 180, 84)"},punctuation:{color:"#ffffff"},boolean:{color:"rgb(255, 98, 140)"},tag:{color:"rgb(255, 157, 0)"},"tag .punctuation":{color:"rgb(255, 157, 0)"},doctype:{color:"rgb(255, 157, 0)"},builtin:{color:"rgb(255, 157, 0)"},entity:{color:"#6897bb",background:"none"},symbol:{color:"#6897bb"},number:{color:"#ff628c"},property:{color:"#ff628c"},constant:{color:"#ff628c"},variable:{color:"#ff628c"},string:{color:"#a5ff90"},char:{color:"#a5ff90"},"attr-value":{color:"#a5c261"},"attr-value .punctuation":{color:"#a5c261"},"attr-value .punctuation:first-child":{color:"#a9b7c6"},url:{color:"#287bde",textDecoration:"underline",background:"none"},function:{color:"rgb(250, 208, 0)"},regex:{background:"#364135"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},inserted:{background:"#00ff00"},deleted:{background:"#ff000d"},"code.language-css .token.property":{color:"#a9b7c6"},"code.language-css .token.property + .token.punctuation":{color:"#a9b7c6"},"code.language-css .token.id":{color:"#ffc66d"},"code.language-css .token.selector > .token.class":{color:"#ffc66d"},"code.language-css .token.selector > .token.attribute":{color:"#ffc66d"},"code.language-css .token.selector > .token.pseudo-class":{color:"#ffc66d"},"code.language-css .token.selector > .token.pseudo-element":{color:"#ffc66d"},"class-name":{color:"#fb94ff"},".language-css .token.string":{background:"none"},".style .token.string":{background:"none"},"pre .line-highlight":{marginTop:"36px",background:"linear-gradient(to right, rgba(179, 98, 255, 0.17), transparent)"},"pre .line-highlight.line-highlight":{marginTop:"36px",background:"linear-gradient(to right, rgba(179, 98, 255, 0.17), transparent)"},"pre > code.line-highlight":{marginTop:"36px",background:"linear-gradient(to right, rgba(179, 98, 255, 0.17), transparent)"},"pre .line-highlight:before":{content:"''"},"pre > code.line-highlight:before":{content:"''"},"pre .line-highlight[data-end]:after":{content:"''"},"pre > code.line-highlight[data-end]:after":{content:"''"}}},pI64:function(e,t,n){"use strict";e.exports=function(e,t){var n,a,i={},s=t.ordered?"ol":"ul",l=-1;"number"===typeof t.start&&1!==t.start&&(i.start=t.start);n=r(e,t),a=n.length;for(;++l=55296&&e<=57343},t.isSurrogatePair=function(e){return e>=56320&&e<=57343},t.getSurrogatePairCodePoint=function(e,t){return 1024*(e-55296)+9216+t},t.isControlCodePoint=function(e){return 32!==e&&10!==e&&13!==e&&9!==e&&12!==e&&e>=1&&e<=31||e>=127&&e<=159},t.isUndefinedCodePoint=function(e){return e>=64976&&e<=65007||o.indexOf(e)>-1}},pe0m:function(e,t,n){"use strict";e.exports=function(e){return null===e||void 0===e?[]:"length"in e?e:[e]}},penn:function(e,t,n){e.exports=n("YK6v")},qD0n:function(e,t){function n(e){this.stack[this.stack.length-2].checked="taskListCheckValueChecked"===e.type}t.exit={taskListCheckValueChecked:n,taskListCheckValueUnchecked:n,paragraph:function(e){var t,n=this.stack[this.stack.length-2],o=this.stack[this.stack.length-1],r=n.children,a=o.children[0],i=-1;if(n&&"listItem"===n.type&&"boolean"===typeof n.checked&&a&&"text"===a.type){for(;++i-1||r(a.events,"linePrefix")<4?e.interrupt(a.parser.constructs.flow,n,t)(i):t(i)}},partial:!0};e.exports=s},rRyo:function(e,t,n){"use strict";e.exports=function(e,t){var n,a=e.definition(t.identifier);if(!a)return r(e,t);n={src:o(a.url||""),alt:t.alt},null!==a.title&&void 0!==a.title&&(n.title=a.title);return e(t,"img",n)};var o=n("xGQ6"),r=n("WniP")},rS7C:function(e,t,n){"use strict";var o=n("F6fn"),r=n("bAF5"),a=n("r3IV"),i=n("TTG4").parse,s=n("vfP8").parse;e.exports=function(e,t,n){var r=n?function(e){var t,n=e.length,o=-1,r={};for(;++o code[class*="language-"]':{background:"#282a36",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"#6272a4"},prolog:{color:"#6272a4"},doctype:{color:"#6272a4"},cdata:{color:"#6272a4"},punctuation:{color:"#f8f8f2"},".namespace":{Opacity:".7"},property:{color:"#ff79c6"},tag:{color:"#ff79c6"},constant:{color:"#ff79c6"},symbol:{color:"#ff79c6"},deleted:{color:"#ff79c6"},boolean:{color:"#bd93f9"},number:{color:"#bd93f9"},selector:{color:"#50fa7b"},"attr-name":{color:"#50fa7b"},string:{color:"#50fa7b"},char:{color:"#50fa7b"},builtin:{color:"#50fa7b"},inserted:{color:"#50fa7b"},operator:{color:"#f8f8f2"},entity:{color:"#f8f8f2",cursor:"help"},url:{color:"#f8f8f2"},".language-css .token.string":{color:"#f8f8f2"},".style .token.string":{color:"#f8f8f2"},variable:{color:"#f8f8f2"},atrule:{color:"#f1fa8c"},"attr-value":{color:"#f1fa8c"},function:{color:"#f1fa8c"},"class-name":{color:"#f1fa8c"},keyword:{color:"#8be9fd"},regex:{color:"#ffb86c"},important:{color:"#ffb86c",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}}},srZV:function(e,t,n){"use strict";const o=n("9kwo"),r=n("CGnT"),a=n("HwUZ");e.exports=class extends o{constructor(e,t){super(e,t),this.posTracker=a.install(e,r),this.lastErrOffset=-1}_reportError(e){this.lastErrOffset!==this.posTracker.offset&&(this.lastErrOffset=this.posTracker.offset,super._reportError(e))}}},tgGP:function(e,t,n){"use strict";var o=n("ueQ+"),r=n("+OJB"),a=n("BEtg");e.exports=l;var i={}.hasOwnProperty,s=["history","path","basename","stem","extname","dirname"];function l(e){var t,n;if(e){if("string"===typeof e||a(e))e={contents:e};else if("message"in e&&"messages"in e)return e}else e={};if(!(this instanceof l))return new l(e);for(this.data={},this.messages=[],this.history=[],this.cwd=r.cwd(),n=-1;++n-1)throw new Error("`"+t+"` cannot be a path: did not expect `"+o.sep+"`")}function u(e,t){if(!e)throw new Error("`"+t+"` cannot be empty")}function d(e,t){if(!e)throw new Error("Setting `"+t+"` requires `path` to be set too")}l.prototype.toString=function(e){return(this.contents||"").toString(e)},Object.defineProperty(l.prototype,"path",{get:function(){return this.history[this.history.length-1]},set:function(e){u(e,"path"),this.path!==e&&this.history.push(e)}}),Object.defineProperty(l.prototype,"dirname",{get:function(){return"string"===typeof this.path?o.dirname(this.path):void 0},set:function(e){d(this.path,"dirname"),this.path=o.join(e||"",this.basename)}}),Object.defineProperty(l.prototype,"basename",{get:function(){return"string"===typeof this.path?o.basename(this.path):void 0},set:function(e){u(e,"basename"),c(e,"basename"),this.path=o.join(this.dirname||"",e)}}),Object.defineProperty(l.prototype,"extname",{get:function(){return"string"===typeof this.path?o.extname(this.path):void 0},set:function(e){if(c(e,"extname"),d(this.path,"extname"),e){if(46!==e.charCodeAt(0))throw new Error("`extname` must start with `.`");if(e.indexOf(".",1)>-1)throw new Error("`extname` cannot contain multiple dots")}this.path=o.join(this.dirname,this.stem+(e||""))}}),Object.defineProperty(l.prototype,"stem",{get:function(){return"string"===typeof this.path?o.basename(this.path,this.extname):void 0},set:function(e){u(e,"stem"),c(e,"stem"),this.path=o.join(this.dirname||"",e+(this.extname||""))}})},u0PD:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'pre[class*="language-"]':{color:"#d4d4d4",fontSize:"13px",textShadow:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto",background:"#1e1e1e"},'code[class*="language-"]':{color:"#d4d4d4",fontSize:"13px",textShadow:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",direction:"ltr",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#b3d4fc"},'code[class*="language-"]::selection':{textShadow:"none",background:"#b3d4fc"},':not(pre) > code[class*="language-"]':{padding:".1em .3em",borderRadius:".3em",color:"#db4c69",background:"#f9f2f4"},".namespace":{Opacity:".7"},comment:{color:"#6a9955"},prolog:{color:"#6a9955"},doctype:{color:"#6a9955"},cdata:{color:"#6a9955"},punctuation:{color:"#d4d4d4"},property:{color:"#9cdcfe"},tag:{color:"#569cd6"},boolean:{color:"#569cd6"},number:{color:"#b5cea8"},constant:{color:"#9CDCFE"},symbol:{color:"#b5cea8"},deleted:{color:"#b5cea8"},selector:{color:"#d7ba7d"},"attr-name":{color:"#9cdcfe"},string:{color:"#ce9178"},char:{color:"#ce9178"},builtin:{color:"#ce9178"},inserted:{color:"#ce9178"},operator:{color:"#d4d4d4",background:"#1e1e1e"},entity:{color:"#4ec9b0",background:"#1e1e1e",cursor:"unset"},url:{color:"#d4d4d4",background:"#1e1e1e"},".language-css .token.string":{color:"#d4d4d4",background:"#1e1e1e"},".style .token.string":{color:"#d4d4d4",background:"#1e1e1e"},atrule:{color:"#c586c0"},"attr-value":{color:"#ce9178"},keyword:{color:"#c586c0"},function:{color:"#dcdcaa"},regex:{color:"#d16969"},important:{color:"#d16969",fontWeight:"bold"},variable:{color:"#d16969"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},"class-name":{color:"#4EC9B0"},parameter:{color:"#9CDCFE"},interpolation:{color:"#9CDCFE"},"punctuation.interpolation-punctuation":{color:"#569cd6"},namespace:{color:"#4ec9b0"},'pre[class*="language-javascript"]':{color:"#4ec9b0"},'code[class*="language-javascript"]':{color:"#4ec9b0"},'pre[class*="language-css"]':{color:"#CE9178"},'code[class*="language-css"]':{color:"#CE9178"},'pre[class*="language-html"]':{color:"#d4d4d4"},'code[class*="language-html"]':{color:"#d4d4d4"},".language-html .token.punctuation":{color:"#808080"},"pre[data-line]":{position:"relative"},'pre[class*="language-"] > code[class*="language-"]':{position:"relative",zIndex:"1"},".line-highlight":{position:"absolute",left:"0",right:"0",padding:"inherit 0",marginTop:"1em",background:"#f7ebc6",boxShadow:"inset 5px 0 0 #f7d87c",zIndex:"0",pointerEvents:"none",lineHeight:"inherit",whiteSpace:"pre"}}},uDje:function(e,t,n){"use strict";var o=n("rm/B")(/\s/);e.exports=o},uGmZ:function(e,t,n){e.exports=n("CGL2")},"ueQ+":function(e,t,n){"use strict";function o(e){var t,n;return r(e),t=47===e.charCodeAt(0),(n=function(e,t){var n,o,r="",a=0,i=-1,s=0,l=-1;for(;++l<=e.length;){if(l2){if((o=r.lastIndexOf("/"))!==r.length-1){o<0?(r="",a=0):a=(r=r.slice(0,o)).length-1-r.lastIndexOf("/"),i=l,s=0;continue}}else if(r.length){r="",a=0,i=l,s=0;continue}t&&(r=r.length?r+"/..":"..",a=2)}else r.length?r+="/"+e.slice(i+1,l):r=e.slice(i+1,l),a=l-i-1;i=l,s=0}else 46===n&&s>-1?s++:s=-1}return r}(e,!t)).length||t||(n="."),n.length&&47===e.charCodeAt(e.length-1)&&(n+="/"),t?"/"+n:n}function r(e){if("string"!==typeof e)throw new TypeError("Path must be a string. Received "+JSON.stringify(e))}t.basename=function(e,t){var n,o,a,i,s=0,l=-1;if(void 0!==t&&"string"!==typeof t)throw new TypeError('"ext" argument must be a string');if(r(e),n=e.length,void 0===t||!t.length||t.length>e.length){for(;n--;)if(47===e.charCodeAt(n)){if(a){s=n+1;break}}else l<0&&(a=!0,l=n+1);return l<0?"":e.slice(s,l)}if(t===e)return"";o=-1,i=t.length-1;for(;n--;)if(47===e.charCodeAt(n)){if(a){s=n+1;break}}else o<0&&(a=!0,o=n+1),i>-1&&(e.charCodeAt(n)===t.charCodeAt(i--)?i<0&&(l=n):(i=-1,l=o));s===l?l=o:l<0&&(l=e.length);return e.slice(s,l)},t.dirname=function(e){var t,n,o;if(r(e),!e.length)return".";t=-1,o=e.length;for(;--o;)if(47===e.charCodeAt(o)){if(n){t=o;break}}else n||(n=!0);return t<0?47===e.charCodeAt(0)?"/":".":1===t&&47===e.charCodeAt(0)?"//":e.slice(0,t)},t.extname=function(e){var t,n,o,a=-1,i=0,s=-1,l=0;r(e),o=e.length;for(;o--;)if(47!==(n=e.charCodeAt(o)))s<0&&(t=!0,s=o+1),46===n?a<0?a=o:1!==l&&(l=1):a>-1&&(l=-1);else if(t){i=o+1;break}if(a<0||s<0||0===l||1===l&&a===s-1&&a===i+1)return"";return e.slice(a,s)},t.join=function(){var e,t=-1;for(;++t0&&("\r"===c||"\n"===c)&&"html"===a.type&&(s[s.length-1]=s[s.length-1].replace(/(\r?\n|\r)$/," "),c=" "),s.push(t.handle(a,e,t,{before:c,after:o})),c=s[s.length-1].slice(-1);return s.join("")}},uzq8:function(e,t,n){"use strict";e.exports=l;var o=n("Zasy"),r=n("AJTF"),a=!0,i="skip",s=!1;function l(e,t,n,l){var c,u;"function"===typeof t&&"function"!==typeof n&&(l=n,n=t,t=null),u=o(t),c=l?-1:1,function e(o,d,p){var f,h="object"===typeof o&&null!==o?o:{};"string"===typeof h.type&&(f="string"===typeof h.tagName?h.tagName:"string"===typeof h.name?h.name:void 0,m.displayName="node ("+r(h.type+(f?"<"+f+">":""))+")");return m;function m(){var r,f,h=p.concat(o),m=[];if((!t||u(o,d,p[p.length-1]||null))&&(m=function(e){if(null!==e&&"object"===typeof e&&"length"in e)return e;if("number"===typeof e)return[a,e];return[e]}(n(o,p)))[0]===s)return m;if(o.children&&m[0]!==i)for(f=(l?o.children.length:-1)+c;f>-1&&f code[class*="language-"]':{whiteSpace:"normal",borderRadius:"0.2em",padding:"0.1em"},".language-css > code":{color:"#fd9170"},".language-sass > code":{color:"#fd9170"},".language-scss > code":{color:"#fd9170"},'[class*="language-"] .namespace':{Opacity:"0.7"},atrule:{color:"#c792ea"},"attr-name":{color:"#ffcb6b"},"attr-value":{color:"#a5e844"},attribute:{color:"#a5e844"},boolean:{color:"#c792ea"},builtin:{color:"#ffcb6b"},cdata:{color:"#80cbc4"},char:{color:"#80cbc4"},class:{color:"#ffcb6b"},"class-name":{color:"#f2ff00"},comment:{color:"#616161"},constant:{color:"#c792ea"},deleted:{color:"#ff6666"},doctype:{color:"#616161"},entity:{color:"#ff6666"},function:{color:"#c792ea"},hexcode:{color:"#f2ff00"},id:{color:"#c792ea",fontWeight:"bold"},important:{color:"#c792ea",fontWeight:"bold"},inserted:{color:"#80cbc4"},keyword:{color:"#c792ea"},number:{color:"#fd9170"},operator:{color:"#89ddff"},prolog:{color:"#616161"},property:{color:"#80cbc4"},"pseudo-class":{color:"#a5e844"},"pseudo-element":{color:"#a5e844"},punctuation:{color:"#89ddff"},regex:{color:"#f2ff00"},selector:{color:"#ff6666"},string:{color:"#a5e844"},symbol:{color:"#c792ea"},tag:{color:"#ff6666"},unit:{color:"#fd9170"},url:{color:"#ff6666"},variable:{color:"#ff6666"}}},wGQB:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={'code[class*="language-"]':{color:"#ccc",background:"none",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"#ccc",background:"#2d2d2d",fontFamily:"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace",fontSize:"1em",textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:".5em 0",overflow:"auto"},':not(pre) > code[class*="language-"]':{background:"#2d2d2d",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"#999"},"block-comment":{color:"#999"},prolog:{color:"#999"},doctype:{color:"#999"},cdata:{color:"#999"},punctuation:{color:"#ccc"},tag:{color:"#e2777a"},"attr-name":{color:"#e2777a"},namespace:{color:"#e2777a"},deleted:{color:"#e2777a"},"function-name":{color:"#6196cc"},boolean:{color:"#f08d49"},number:{color:"#f08d49"},function:{color:"#f08d49"},property:{color:"#f8c555"},"class-name":{color:"#f8c555"},constant:{color:"#f8c555"},symbol:{color:"#f8c555"},selector:{color:"#cc99cd"},important:{color:"#cc99cd",fontWeight:"bold"},atrule:{color:"#cc99cd"},keyword:{color:"#cc99cd"},builtin:{color:"#cc99cd"},string:{color:"#7ec699"},char:{color:"#7ec699"},"attr-value":{color:"#7ec699"},regex:{color:"#7ec699"},variable:{color:"#7ec699"},operator:{color:"#67cdcc"},entity:{color:"#67cdcc",cursor:"help"},url:{color:"#67cdcc"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"},inserted:{color:"green"}}},wH4i:function(e,t,n){"use strict";var o,r=n("penn"),a=n("jv5L"),i=n("ywEd");e.exports=function(e){var t=this.data();!o&&(this.Parser&&this.Parser.prototype&&this.Parser.prototype.blockTokenizers||this.Compiler&&this.Compiler.prototype&&this.Compiler.prototype.visitors)&&(o=!0,console.warn("[remark-gfm] Warning: please upgrade to remark 13 to use this plugin"));function n(e,n){t[e]?t[e].push(n):t[e]=[n]}n("micromarkExtensions",r(e)),n("fromMarkdownExtensions",a),n("toMarkdownExtensions",i(e))}},wJMj:function(e,t,n){"use strict";e.exports=function(e,t,n){"string"!==typeof t&&(n=t,t=void 0);return function(e){var t=e||{},n=function(e,t){var n=-1;for(;++n-1&&(D.call(this,e),F.call(this,e))}function z(){h("atHardBreak",!0)}function U(){var e=this.resume();this.stack[this.stack.length-1].value=e}function G(){var e=this.resume();this.stack[this.stack.length-1].value=e}function W(){var e=this.resume();this.stack[this.stack.length-1].value=e}function K(){var e=this.stack[this.stack.length-1];m("inReference")?(e.type+="Reference",e.referenceType=m("referenceType")||"shortcut",delete e.url,delete e.title):(delete e.identifier,delete e.label,delete e.referenceType),h("referenceType")}function j(){var e=this.stack[this.stack.length-1];m("inReference")?(e.type+="Reference",e.referenceType=m("referenceType")||"shortcut",delete e.url,delete e.title):(delete e.identifier,delete e.label,delete e.referenceType),h("referenceType")}function Y(e){this.stack[this.stack.length-2].identifier=i(this.sliceSerialize(e)).toLowerCase()}function Q(){var e=this.stack[this.stack.length-1],t=this.resume();this.stack[this.stack.length-1].label=t,h("inReference",!0),"link"===this.stack[this.stack.length-1].type?this.stack[this.stack.length-1].children=e.children:this.stack[this.stack.length-1].alt=t}function V(){var e=this.resume();this.stack[this.stack.length-1].url=e}function q(){var e=this.resume();this.stack[this.stack.length-1].title=e}function X(){h("inReference")}function J(){h("referenceType","collapsed")}function Z(e){var t=this.resume();this.stack[this.stack.length-1].label=t,this.stack[this.stack.length-1].identifier=i(this.sliceSerialize(e)).toLowerCase(),h("referenceType","full")}function $(e){h("characterReferenceType",e.type)}function ee(e){var t,n,o=this.sliceSerialize(e),r=m("characterReferenceType");r?(t=s(o,"characterReferenceMarkerNumeric"===r?10:16),h("characterReferenceType")):t=d(o),(n=this.stack.pop()).value+=t,n.position.end=g(e.end)}function te(e){F.call(this,e),this.stack[this.stack.length-1].url=this.sliceSerialize(e)}function ne(e){F.call(this,e),this.stack[this.stack.length-1].url="mailto:"+this.sliceSerialize(e)}function oe(){return{type:"blockquote",children:[]}}function re(){return{type:"code",lang:null,meta:null,value:""}}function ae(){return{type:"inlineCode",value:""}}function ie(){return{type:"definition",identifier:"",label:null,title:null,url:""}}function se(){return{type:"emphasis",children:[]}}function le(){return{type:"heading",depth:void 0,children:[]}}function ce(){return{type:"break"}}function ue(){return{type:"html",value:""}}function de(){return{type:"image",title:null,url:"",alt:null}}function pe(){return{type:"link",title:null,url:"",children:[]}}function fe(e){return{type:"list",ordered:"listOrdered"===e.type,start:null,spread:e._spread,children:[]}}function he(e){return{type:"listItem",spread:e._spread,checked:null,children:[]}}function me(){return{type:"paragraph",children:[]}}function ge(){return{type:"strong",children:[]}}function Te(){return{type:"text",value:""}}function Ee(){return{type:"thematicBreak"}}}(n)(u(l(n).document().write(c()(e,t,!0))))};var o=n("IW26"),r=n("NOby"),a=n("TDhK"),i=n("Bh6z"),s=n("Z0IX"),l=n("0RbX"),c=n("o8bm"),u=n("1mpw"),d=n("WtKE"),p=n("/qNp");function f(e,t){var n,o;for(n in t)o=a.call(e,n)?e[n]:e[n]={},"canContainEols"===n||"transforms"===n?e[n]=[].concat(o,t[n]):Object.assign(o,t[n])}},wYf1:function(e,t,n){var o=n("uzhd"),r=n("gsvO"),a=n("55fs");e.exports=function(e){var t=e||{},n=t.tableCellPadding,i=t.tablePipeAlign,s=t.stringLength,l=n?" ":"|";return{unsafe:[{character:"\r",inConstruct:"tableCell"},{character:"\n",inConstruct:"tableCell"},{atBreak:!0,character:"|",after:"[\t :-]"},{character:"|",inConstruct:"tableCell"},{atBreak:!0,character:":",after:"-"},{atBreak:!0,character:"-",after:"[:|-]"}],handlers:{table:function(e,t,n){return u(function(e,t){var n=e.children,o=-1,r=n.length,a=[],i=t.enter("table");for(;++o=55296&&s<=57343){if(s>=55296&&s<=56319&&a+1=56320&&l<=57343){u+=encodeURIComponent(e[a]+e[a+1]),a++;continue}u+="%EF%BF%BD"}else u+=encodeURIComponent(e[a]);return u}r.defaultChars=";/?:@&=+$,-_.!~*'()#",r.componentChars="-_.!~*'()",e.exports=r},xkQk:function(e,t,n){"use strict";var o=n("EBzq");e.exports=a,a.wrap=o;var r=[].slice;function a(){var e=[],t={run:function(){var t=-1,n=r.call(arguments,0,-1),a=arguments[arguments.length-1];if("function"!==typeof a)throw new Error("Expected function as last argument, not "+a);function i(s){var l=e[++t],c=r.call(arguments,0),u=c.slice(1),d=n.length,p=-1;if(s)a(s);else{for(;++p code[class*="language-"]':{background:"#2b2b2b",padding:"0.1em",borderRadius:"0.3em",whiteSpace:"normal"},comment:{color:"#d4d0ab"},prolog:{color:"#d4d0ab"},doctype:{color:"#d4d0ab"},cdata:{color:"#d4d0ab"},punctuation:{color:"#fefefe"},property:{color:"#ffa07a"},tag:{color:"#ffa07a"},constant:{color:"#ffa07a"},symbol:{color:"#ffa07a"},deleted:{color:"#ffa07a"},boolean:{color:"#00e0e0"},number:{color:"#00e0e0"},selector:{color:"#abe338"},"attr-name":{color:"#abe338"},string:{color:"#abe338"},char:{color:"#abe338"},builtin:{color:"#abe338"},inserted:{color:"#abe338"},operator:{color:"#00e0e0"},entity:{color:"#00e0e0",cursor:"help"},url:{color:"#00e0e0"},".language-css .token.string":{color:"#00e0e0"},".style .token.string":{color:"#00e0e0"},variable:{color:"#00e0e0"},atrule:{color:"#ffd700"},"attr-value":{color:"#ffd700"},function:{color:"#ffd700"},keyword:{color:"#00e0e0"},regex:{color:"#ffd700"},important:{color:"#ffd700",fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}}},ywEd:function(e,t,n){var o=n("oDdY"),r=n("K/gC"),a=n("wYf1"),i=n("vSfO"),s=n("UhtW");e.exports=function(e){var t=s({handlers:{},join:[],unsafe:[],options:{}},{extensions:[o,r,a(e),i]});return Object.assign(t.options,{handlers:t.handlers,join:t.join,unsafe:t.unsafe})}},z2ZG:function(e,t,n){"use strict";var o=n("U6jy"),r=n("dKIx");e.exports=function(e){var t,n,a=e.length,i=[],s=[],l=-1;for(;++l=0||(r[n]=e[n]);return r}n.d(t,"a",(function(){return o}))},zSMa:function(e,t,n){"use strict";const o=n("zpDW"),r=n("1CLp"),a=n("A0ZL"),i=n("Y/Y8"),s=n("niEq"),l=n("HwUZ"),c=n("IVgD"),u=n("B0QI"),d=n("fBAZ"),p=n("lVxK"),f=n("2l2D"),h=n("pRQB"),m=n("UwWT"),g=m.TAG_NAMES,T=m.NAMESPACES,E=m.ATTRS,b={scriptingEnabled:!0,sourceCodeLocationInfo:!1,onParseError:null,treeAdapter:c},A="hidden",k="INITIAL_MODE",y="BEFORE_HTML_MODE",S="BEFORE_HEAD_MODE",_="IN_HEAD_MODE",C="IN_HEAD_NO_SCRIPT_MODE",x="AFTER_HEAD_MODE",O="IN_BODY_MODE",N="TEXT_MODE",v="IN_TABLE_MODE",M="IN_TABLE_TEXT_MODE",R="IN_CAPTION_MODE",w="IN_COLUMN_GROUP_MODE",I="IN_TABLE_BODY_MODE",L="IN_ROW_MODE",P="IN_CELL_MODE",H="IN_SELECT_MODE",D="IN_SELECT_IN_TABLE_MODE",F="IN_TEMPLATE_MODE",B="AFTER_BODY_MODE",z="IN_FRAMESET_MODE",U="AFTER_FRAMESET_MODE",G="AFTER_AFTER_BODY_MODE",W="AFTER_AFTER_FRAMESET_MODE",K={[g.TR]:L,[g.TBODY]:I,[g.THEAD]:I,[g.TFOOT]:I,[g.CAPTION]:R,[g.COLGROUP]:w,[g.TABLE]:v,[g.BODY]:O,[g.FRAMESET]:z},j={[g.CAPTION]:v,[g.COLGROUP]:v,[g.TBODY]:v,[g.TFOOT]:v,[g.THEAD]:v,[g.COL]:w,[g.TR]:I,[g.TD]:L,[g.TH]:L},Y={[k]:{[o.CHARACTER_TOKEN]:ie,[o.NULL_CHARACTER_TOKEN]:ie,[o.WHITESPACE_CHARACTER_TOKEN]:ee,[o.COMMENT_TOKEN]:ne,[o.DOCTYPE_TOKEN]:function(e,t){e._setDocumentType(t);const n=t.forceQuirks?m.DOCUMENT_MODE.QUIRKS:d.getDocumentMode(t);d.isConforming(t)||e._err(f.nonConformingDoctype);e.treeAdapter.setDocumentMode(e.document,n),e.insertionMode=y},[o.START_TAG_TOKEN]:ie,[o.END_TAG_TOKEN]:ie,[o.EOF_TOKEN]:ie},[y]:{[o.CHARACTER_TOKEN]:se,[o.NULL_CHARACTER_TOKEN]:se,[o.WHITESPACE_CHARACTER_TOKEN]:ee,[o.COMMENT_TOKEN]:ne,[o.DOCTYPE_TOKEN]:ee,[o.START_TAG_TOKEN]:function(e,t){t.tagName===g.HTML?(e._insertElement(t,T.HTML),e.insertionMode=S):se(e,t)},[o.END_TAG_TOKEN]:function(e,t){const n=t.tagName;n!==g.HTML&&n!==g.HEAD&&n!==g.BODY&&n!==g.BR||se(e,t)},[o.EOF_TOKEN]:se},[S]:{[o.CHARACTER_TOKEN]:le,[o.NULL_CHARACTER_TOKEN]:le,[o.WHITESPACE_CHARACTER_TOKEN]:ee,[o.COMMENT_TOKEN]:ne,[o.DOCTYPE_TOKEN]:te,[o.START_TAG_TOKEN]:function(e,t){const n=t.tagName;n===g.HTML?xe(e,t):n===g.HEAD?(e._insertElement(t,T.HTML),e.headElement=e.openElements.current,e.insertionMode=_):le(e,t)},[o.END_TAG_TOKEN]:function(e,t){const n=t.tagName;n===g.HEAD||n===g.BODY||n===g.HTML||n===g.BR?le(e,t):e._err(f.endTagWithoutMatchingOpenElement)},[o.EOF_TOKEN]:le},[_]:{[o.CHARACTER_TOKEN]:de,[o.NULL_CHARACTER_TOKEN]:de,[o.WHITESPACE_CHARACTER_TOKEN]:re,[o.COMMENT_TOKEN]:ne,[o.DOCTYPE_TOKEN]:te,[o.START_TAG_TOKEN]:ce,[o.END_TAG_TOKEN]:ue,[o.EOF_TOKEN]:de},[C]:{[o.CHARACTER_TOKEN]:pe,[o.NULL_CHARACTER_TOKEN]:pe,[o.WHITESPACE_CHARACTER_TOKEN]:re,[o.COMMENT_TOKEN]:ne,[o.DOCTYPE_TOKEN]:te,[o.START_TAG_TOKEN]:function(e,t){const n=t.tagName;n===g.HTML?xe(e,t):n===g.BASEFONT||n===g.BGSOUND||n===g.HEAD||n===g.LINK||n===g.META||n===g.NOFRAMES||n===g.STYLE?ce(e,t):n===g.NOSCRIPT?e._err(f.nestedNoscriptInHead):pe(e,t)},[o.END_TAG_TOKEN]:function(e,t){const n=t.tagName;n===g.NOSCRIPT?(e.openElements.pop(),e.insertionMode=_):n===g.BR?pe(e,t):e._err(f.endTagWithoutMatchingOpenElement)},[o.EOF_TOKEN]:pe},[x]:{[o.CHARACTER_TOKEN]:fe,[o.NULL_CHARACTER_TOKEN]:fe,[o.WHITESPACE_CHARACTER_TOKEN]:re,[o.COMMENT_TOKEN]:ne,[o.DOCTYPE_TOKEN]:te,[o.START_TAG_TOKEN]:function(e,t){const n=t.tagName;n===g.HTML?xe(e,t):n===g.BODY?(e._insertElement(t,T.HTML),e.framesetOk=!1,e.insertionMode=O):n===g.FRAMESET?(e._insertElement(t,T.HTML),e.insertionMode=z):n===g.BASE||n===g.BASEFONT||n===g.BGSOUND||n===g.LINK||n===g.META||n===g.NOFRAMES||n===g.SCRIPT||n===g.STYLE||n===g.TEMPLATE||n===g.TITLE?(e._err(f.abandonedHeadElementChild),e.openElements.push(e.headElement),ce(e,t),e.openElements.remove(e.headElement)):n===g.HEAD?e._err(f.misplacedStartTagForHeadElement):fe(e,t)},[o.END_TAG_TOKEN]:function(e,t){const n=t.tagName;n===g.BODY||n===g.HTML||n===g.BR?fe(e,t):n===g.TEMPLATE?ue(e,t):e._err(f.endTagWithoutMatchingOpenElement)},[o.EOF_TOKEN]:fe},[O]:{[o.CHARACTER_TOKEN]:me,[o.NULL_CHARACTER_TOKEN]:ee,[o.WHITESPACE_CHARACTER_TOKEN]:he,[o.COMMENT_TOKEN]:ne,[o.DOCTYPE_TOKEN]:ee,[o.START_TAG_TOKEN]:xe,[o.END_TAG_TOKEN]:Me,[o.EOF_TOKEN]:Re},[N]:{[o.CHARACTER_TOKEN]:re,[o.NULL_CHARACTER_TOKEN]:re,[o.WHITESPACE_CHARACTER_TOKEN]:re,[o.COMMENT_TOKEN]:ee,[o.DOCTYPE_TOKEN]:ee,[o.START_TAG_TOKEN]:ee,[o.END_TAG_TOKEN]:function(e,t){t.tagName===g.SCRIPT&&(e.pendingScript=e.openElements.current);e.openElements.pop(),e.insertionMode=e.originalInsertionMode},[o.EOF_TOKEN]:function(e,t){e._err(f.eofInElementThatCanContainOnlyText),e.openElements.pop(),e.insertionMode=e.originalInsertionMode,e._processToken(t)}},[v]:{[o.CHARACTER_TOKEN]:we,[o.NULL_CHARACTER_TOKEN]:we,[o.WHITESPACE_CHARACTER_TOKEN]:we,[o.COMMENT_TOKEN]:ne,[o.DOCTYPE_TOKEN]:ee,[o.START_TAG_TOKEN]:Ie,[o.END_TAG_TOKEN]:Le,[o.EOF_TOKEN]:Re},[M]:{[o.CHARACTER_TOKEN]:function(e,t){e.pendingCharacterTokens.push(t),e.hasNonWhitespacePendingCharacterToken=!0},[o.NULL_CHARACTER_TOKEN]:ee,[o.WHITESPACE_CHARACTER_TOKEN]:function(e,t){e.pendingCharacterTokens.push(t)},[o.COMMENT_TOKEN]:He,[o.DOCTYPE_TOKEN]:He,[o.START_TAG_TOKEN]:He,[o.END_TAG_TOKEN]:He,[o.EOF_TOKEN]:He},[R]:{[o.CHARACTER_TOKEN]:me,[o.NULL_CHARACTER_TOKEN]:ee,[o.WHITESPACE_CHARACTER_TOKEN]:he,[o.COMMENT_TOKEN]:ne,[o.DOCTYPE_TOKEN]:ee,[o.START_TAG_TOKEN]:function(e,t){const n=t.tagName;n===g.CAPTION||n===g.COL||n===g.COLGROUP||n===g.TBODY||n===g.TD||n===g.TFOOT||n===g.TH||n===g.THEAD||n===g.TR?e.openElements.hasInTableScope(g.CAPTION)&&(e.openElements.generateImpliedEndTags(),e.openElements.popUntilTagNamePopped(g.CAPTION),e.activeFormattingElements.clearToLastMarker(),e.insertionMode=v,e._processToken(t)):xe(e,t)},[o.END_TAG_TOKEN]:function(e,t){const n=t.tagName;n===g.CAPTION||n===g.TABLE?e.openElements.hasInTableScope(g.CAPTION)&&(e.openElements.generateImpliedEndTags(),e.openElements.popUntilTagNamePopped(g.CAPTION),e.activeFormattingElements.clearToLastMarker(),e.insertionMode=v,n===g.TABLE&&e._processToken(t)):n!==g.BODY&&n!==g.COL&&n!==g.COLGROUP&&n!==g.HTML&&n!==g.TBODY&&n!==g.TD&&n!==g.TFOOT&&n!==g.TH&&n!==g.THEAD&&n!==g.TR&&Me(e,t)},[o.EOF_TOKEN]:Re},[w]:{[o.CHARACTER_TOKEN]:De,[o.NULL_CHARACTER_TOKEN]:De,[o.WHITESPACE_CHARACTER_TOKEN]:re,[o.COMMENT_TOKEN]:ne,[o.DOCTYPE_TOKEN]:ee,[o.START_TAG_TOKEN]:function(e,t){const n=t.tagName;n===g.HTML?xe(e,t):n===g.COL?(e._appendElement(t,T.HTML),t.ackSelfClosing=!0):n===g.TEMPLATE?ce(e,t):De(e,t)},[o.END_TAG_TOKEN]:function(e,t){const n=t.tagName;n===g.COLGROUP?e.openElements.currentTagName===g.COLGROUP&&(e.openElements.pop(),e.insertionMode=v):n===g.TEMPLATE?ue(e,t):n!==g.COL&&De(e,t)},[o.EOF_TOKEN]:Re},[I]:{[o.CHARACTER_TOKEN]:we,[o.NULL_CHARACTER_TOKEN]:we,[o.WHITESPACE_CHARACTER_TOKEN]:we,[o.COMMENT_TOKEN]:ne,[o.DOCTYPE_TOKEN]:ee,[o.START_TAG_TOKEN]:function(e,t){const n=t.tagName;n===g.TR?(e.openElements.clearBackToTableBodyContext(),e._insertElement(t,T.HTML),e.insertionMode=L):n===g.TH||n===g.TD?(e.openElements.clearBackToTableBodyContext(),e._insertFakeElement(g.TR),e.insertionMode=L,e._processToken(t)):n===g.CAPTION||n===g.COL||n===g.COLGROUP||n===g.TBODY||n===g.TFOOT||n===g.THEAD?e.openElements.hasTableBodyContextInTableScope()&&(e.openElements.clearBackToTableBodyContext(),e.openElements.pop(),e.insertionMode=v,e._processToken(t)):Ie(e,t)},[o.END_TAG_TOKEN]:function(e,t){const n=t.tagName;n===g.TBODY||n===g.TFOOT||n===g.THEAD?e.openElements.hasInTableScope(n)&&(e.openElements.clearBackToTableBodyContext(),e.openElements.pop(),e.insertionMode=v):n===g.TABLE?e.openElements.hasTableBodyContextInTableScope()&&(e.openElements.clearBackToTableBodyContext(),e.openElements.pop(),e.insertionMode=v,e._processToken(t)):(n!==g.BODY&&n!==g.CAPTION&&n!==g.COL&&n!==g.COLGROUP||n!==g.HTML&&n!==g.TD&&n!==g.TH&&n!==g.TR)&&Le(e,t)},[o.EOF_TOKEN]:Re},[L]:{[o.CHARACTER_TOKEN]:we,[o.NULL_CHARACTER_TOKEN]:we,[o.WHITESPACE_CHARACTER_TOKEN]:we,[o.COMMENT_TOKEN]:ne,[o.DOCTYPE_TOKEN]:ee,[o.START_TAG_TOKEN]:function(e,t){const n=t.tagName;n===g.TH||n===g.TD?(e.openElements.clearBackToTableRowContext(),e._insertElement(t,T.HTML),e.insertionMode=P,e.activeFormattingElements.insertMarker()):n===g.CAPTION||n===g.COL||n===g.COLGROUP||n===g.TBODY||n===g.TFOOT||n===g.THEAD||n===g.TR?e.openElements.hasInTableScope(g.TR)&&(e.openElements.clearBackToTableRowContext(),e.openElements.pop(),e.insertionMode=I,e._processToken(t)):Ie(e,t)},[o.END_TAG_TOKEN]:function(e,t){const n=t.tagName;n===g.TR?e.openElements.hasInTableScope(g.TR)&&(e.openElements.clearBackToTableRowContext(),e.openElements.pop(),e.insertionMode=I):n===g.TABLE?e.openElements.hasInTableScope(g.TR)&&(e.openElements.clearBackToTableRowContext(),e.openElements.pop(),e.insertionMode=I,e._processToken(t)):n===g.TBODY||n===g.TFOOT||n===g.THEAD?(e.openElements.hasInTableScope(n)||e.openElements.hasInTableScope(g.TR))&&(e.openElements.clearBackToTableRowContext(),e.openElements.pop(),e.insertionMode=I,e._processToken(t)):(n!==g.BODY&&n!==g.CAPTION&&n!==g.COL&&n!==g.COLGROUP||n!==g.HTML&&n!==g.TD&&n!==g.TH)&&Le(e,t)},[o.EOF_TOKEN]:Re},[P]:{[o.CHARACTER_TOKEN]:me,[o.NULL_CHARACTER_TOKEN]:ee,[o.WHITESPACE_CHARACTER_TOKEN]:he,[o.COMMENT_TOKEN]:ne,[o.DOCTYPE_TOKEN]:ee,[o.START_TAG_TOKEN]:function(e,t){const n=t.tagName;n===g.CAPTION||n===g.COL||n===g.COLGROUP||n===g.TBODY||n===g.TD||n===g.TFOOT||n===g.TH||n===g.THEAD||n===g.TR?(e.openElements.hasInTableScope(g.TD)||e.openElements.hasInTableScope(g.TH))&&(e._closeTableCell(),e._processToken(t)):xe(e,t)},[o.END_TAG_TOKEN]:function(e,t){const n=t.tagName;n===g.TD||n===g.TH?e.openElements.hasInTableScope(n)&&(e.openElements.generateImpliedEndTags(),e.openElements.popUntilTagNamePopped(n),e.activeFormattingElements.clearToLastMarker(),e.insertionMode=L):n===g.TABLE||n===g.TBODY||n===g.TFOOT||n===g.THEAD||n===g.TR?e.openElements.hasInTableScope(n)&&(e._closeTableCell(),e._processToken(t)):n!==g.BODY&&n!==g.CAPTION&&n!==g.COL&&n!==g.COLGROUP&&n!==g.HTML&&Me(e,t)},[o.EOF_TOKEN]:Re},[H]:{[o.CHARACTER_TOKEN]:re,[o.NULL_CHARACTER_TOKEN]:ee,[o.WHITESPACE_CHARACTER_TOKEN]:re,[o.COMMENT_TOKEN]:ne,[o.DOCTYPE_TOKEN]:ee,[o.START_TAG_TOKEN]:Fe,[o.END_TAG_TOKEN]:Be,[o.EOF_TOKEN]:Re},[D]:{[o.CHARACTER_TOKEN]:re,[o.NULL_CHARACTER_TOKEN]:ee,[o.WHITESPACE_CHARACTER_TOKEN]:re,[o.COMMENT_TOKEN]:ne,[o.DOCTYPE_TOKEN]:ee,[o.START_TAG_TOKEN]:function(e,t){const n=t.tagName;n===g.CAPTION||n===g.TABLE||n===g.TBODY||n===g.TFOOT||n===g.THEAD||n===g.TR||n===g.TD||n===g.TH?(e.openElements.popUntilTagNamePopped(g.SELECT),e._resetInsertionMode(),e._processToken(t)):Fe(e,t)},[o.END_TAG_TOKEN]:function(e,t){const n=t.tagName;n===g.CAPTION||n===g.TABLE||n===g.TBODY||n===g.TFOOT||n===g.THEAD||n===g.TR||n===g.TD||n===g.TH?e.openElements.hasInTableScope(n)&&(e.openElements.popUntilTagNamePopped(g.SELECT),e._resetInsertionMode(),e._processToken(t)):Be(e,t)},[o.EOF_TOKEN]:Re},[F]:{[o.CHARACTER_TOKEN]:me,[o.NULL_CHARACTER_TOKEN]:ee,[o.WHITESPACE_CHARACTER_TOKEN]:he,[o.COMMENT_TOKEN]:ne,[o.DOCTYPE_TOKEN]:ee,[o.START_TAG_TOKEN]:function(e,t){const n=t.tagName;if(n===g.BASE||n===g.BASEFONT||n===g.BGSOUND||n===g.LINK||n===g.META||n===g.NOFRAMES||n===g.SCRIPT||n===g.STYLE||n===g.TEMPLATE||n===g.TITLE)ce(e,t);else{const o=j[n]||O;e._popTmplInsertionMode(),e._pushTmplInsertionMode(o),e.insertionMode=o,e._processToken(t)}},[o.END_TAG_TOKEN]:function(e,t){t.tagName===g.TEMPLATE&&ue(e,t)},[o.EOF_TOKEN]:ze},[B]:{[o.CHARACTER_TOKEN]:Ue,[o.NULL_CHARACTER_TOKEN]:Ue,[o.WHITESPACE_CHARACTER_TOKEN]:he,[o.COMMENT_TOKEN]:function(e,t){e._appendCommentNode(t,e.openElements.items[0])},[o.DOCTYPE_TOKEN]:ee,[o.START_TAG_TOKEN]:function(e,t){t.tagName===g.HTML?xe(e,t):Ue(e,t)},[o.END_TAG_TOKEN]:function(e,t){t.tagName===g.HTML?e.fragmentContext||(e.insertionMode=G):Ue(e,t)},[o.EOF_TOKEN]:ae},[z]:{[o.CHARACTER_TOKEN]:ee,[o.NULL_CHARACTER_TOKEN]:ee,[o.WHITESPACE_CHARACTER_TOKEN]:re,[o.COMMENT_TOKEN]:ne,[o.DOCTYPE_TOKEN]:ee,[o.START_TAG_TOKEN]:function(e,t){const n=t.tagName;n===g.HTML?xe(e,t):n===g.FRAMESET?e._insertElement(t,T.HTML):n===g.FRAME?(e._appendElement(t,T.HTML),t.ackSelfClosing=!0):n===g.NOFRAMES&&ce(e,t)},[o.END_TAG_TOKEN]:function(e,t){t.tagName!==g.FRAMESET||e.openElements.isRootHtmlElementCurrent()||(e.openElements.pop(),e.fragmentContext||e.openElements.currentTagName===g.FRAMESET||(e.insertionMode=U))},[o.EOF_TOKEN]:ae},[U]:{[o.CHARACTER_TOKEN]:ee,[o.NULL_CHARACTER_TOKEN]:ee,[o.WHITESPACE_CHARACTER_TOKEN]:re,[o.COMMENT_TOKEN]:ne,[o.DOCTYPE_TOKEN]:ee,[o.START_TAG_TOKEN]:function(e,t){const n=t.tagName;n===g.HTML?xe(e,t):n===g.NOFRAMES&&ce(e,t)},[o.END_TAG_TOKEN]:function(e,t){t.tagName===g.HTML&&(e.insertionMode=W)},[o.EOF_TOKEN]:ae},[G]:{[o.CHARACTER_TOKEN]:Ge,[o.NULL_CHARACTER_TOKEN]:Ge,[o.WHITESPACE_CHARACTER_TOKEN]:he,[o.COMMENT_TOKEN]:oe,[o.DOCTYPE_TOKEN]:ee,[o.START_TAG_TOKEN]:function(e,t){t.tagName===g.HTML?xe(e,t):Ge(e,t)},[o.END_TAG_TOKEN]:Ge,[o.EOF_TOKEN]:ae},[W]:{[o.CHARACTER_TOKEN]:ee,[o.NULL_CHARACTER_TOKEN]:ee,[o.WHITESPACE_CHARACTER_TOKEN]:he,[o.COMMENT_TOKEN]:oe,[o.DOCTYPE_TOKEN]:ee,[o.START_TAG_TOKEN]:function(e,t){const n=t.tagName;n===g.HTML?xe(e,t):n===g.NOFRAMES&&ce(e,t)},[o.END_TAG_TOKEN]:ee,[o.EOF_TOKEN]:ae}};function Q(e,t){let n=e.activeFormattingElements.getElementEntryInScopeWithTagName(t.tagName);return n?e.openElements.contains(n.element)?e.openElements.hasInScope(t.tagName)||(n=null):(e.activeFormattingElements.removeEntry(n),n=null):ve(e,t),n}function V(e,t){let n=null;for(let o=e.openElements.stackTop;o>=0;o--){const r=e.openElements.items[o];if(r===t.element)break;e._isSpecialElement(r)&&(n=r)}return n||(e.openElements.popUntilElementPopped(t.element),e.activeFormattingElements.removeEntry(t)),n}function q(e,t,n){let o=t,r=e.openElements.getCommonAncestor(t);for(let a=0,i=r;i!==n;a++,i=r){r=e.openElements.getCommonAncestor(i);const n=e.activeFormattingElements.getElementEntry(i),s=n&&a>=3;!n||s?(s&&e.activeFormattingElements.removeEntry(n),e.openElements.remove(i)):(i=X(e,n),o===t&&(e.activeFormattingElements.bookmark=n),e.treeAdapter.detachNode(o),e.treeAdapter.appendChild(i,o),o=i)}return o}function X(e,t){const n=e.treeAdapter.getNamespaceURI(t.element),o=e.treeAdapter.createElement(t.token.tagName,n,t.token.attrs);return e.openElements.replace(t.element,o),t.element=o,o}function J(e,t,n){if(e._isElementCausesFosterParenting(t))e._fosterParentElement(n);else{const o=e.treeAdapter.getTagName(t),r=e.treeAdapter.getNamespaceURI(t);o===g.TEMPLATE&&r===T.HTML&&(t=e.treeAdapter.getTemplateContent(t)),e.treeAdapter.appendChild(t,n)}}function Z(e,t,n){const o=e.treeAdapter.getNamespaceURI(n.element),r=n.token,a=e.treeAdapter.createElement(r.tagName,o,r.attrs);e._adoptNodes(t,a),e.treeAdapter.appendChild(t,a),e.activeFormattingElements.insertElementAfterBookmark(a,n.token),e.activeFormattingElements.removeEntry(n),e.openElements.remove(n.element),e.openElements.insertAfter(t,a)}function $(e,t){let n;for(let o=0;o<8&&(n=Q(e,t),n);o++){const t=V(e,n);if(!t)break;e.activeFormattingElements.bookmark=n;const o=q(e,t,n.element),r=e.openElements.getCommonAncestor(n.element);e.treeAdapter.detachNode(o),J(e,r,o),Z(e,t,n)}}function ee(){}function te(e){e._err(f.misplacedDoctype)}function ne(e,t){e._appendCommentNode(t,e.openElements.currentTmplContent||e.openElements.current)}function oe(e,t){e._appendCommentNode(t,e.document)}function re(e,t){e._insertCharacters(t)}function ae(e){e.stopped=!0}function ie(e,t){e._err(f.missingDoctype,{beforeToken:!0}),e.treeAdapter.setDocumentMode(e.document,m.DOCUMENT_MODE.QUIRKS),e.insertionMode=y,e._processToken(t)}function se(e,t){e._insertFakeRootElement(),e.insertionMode=S,e._processToken(t)}function le(e,t){e._insertFakeElement(g.HEAD),e.headElement=e.openElements.current,e.insertionMode=_,e._processToken(t)}function ce(e,t){const n=t.tagName;n===g.HTML?xe(e,t):n===g.BASE||n===g.BASEFONT||n===g.BGSOUND||n===g.LINK||n===g.META?(e._appendElement(t,T.HTML),t.ackSelfClosing=!0):n===g.TITLE?e._switchToTextParsing(t,o.MODE.RCDATA):n===g.NOSCRIPT?e.options.scriptingEnabled?e._switchToTextParsing(t,o.MODE.RAWTEXT):(e._insertElement(t,T.HTML),e.insertionMode=C):n===g.NOFRAMES||n===g.STYLE?e._switchToTextParsing(t,o.MODE.RAWTEXT):n===g.SCRIPT?e._switchToTextParsing(t,o.MODE.SCRIPT_DATA):n===g.TEMPLATE?(e._insertTemplate(t,T.HTML),e.activeFormattingElements.insertMarker(),e.framesetOk=!1,e.insertionMode=F,e._pushTmplInsertionMode(F)):n===g.HEAD?e._err(f.misplacedStartTagForHeadElement):de(e,t)}function ue(e,t){const n=t.tagName;n===g.HEAD?(e.openElements.pop(),e.insertionMode=x):n===g.BODY||n===g.BR||n===g.HTML?de(e,t):n===g.TEMPLATE&&e.openElements.tmplCount>0?(e.openElements.generateImpliedEndTagsThoroughly(),e.openElements.currentTagName!==g.TEMPLATE&&e._err(f.closingOfElementWithOpenChildElements),e.openElements.popUntilTagNamePopped(g.TEMPLATE),e.activeFormattingElements.clearToLastMarker(),e._popTmplInsertionMode(),e._resetInsertionMode()):e._err(f.endTagWithoutMatchingOpenElement)}function de(e,t){e.openElements.pop(),e.insertionMode=x,e._processToken(t)}function pe(e,t){const n=t.type===o.EOF_TOKEN?f.openElementsLeftAfterEof:f.disallowedContentInNoscriptInHead;e._err(n),e.openElements.pop(),e.insertionMode=_,e._processToken(t)}function fe(e,t){e._insertFakeElement(g.BODY),e.insertionMode=O,e._processToken(t)}function he(e,t){e._reconstructActiveFormattingElements(),e._insertCharacters(t)}function me(e,t){e._reconstructActiveFormattingElements(),e._insertCharacters(t),e.framesetOk=!1}function ge(e,t){e.openElements.hasInButtonScope(g.P)&&e._closePElement(),e._insertElement(t,T.HTML)}function Te(e,t){e.openElements.hasInButtonScope(g.P)&&e._closePElement(),e._insertElement(t,T.HTML),e.skipNextNewLine=!0,e.framesetOk=!1}function Ee(e,t){e._reconstructActiveFormattingElements(),e._insertElement(t,T.HTML),e.activeFormattingElements.pushElement(e.openElements.current,t)}function be(e,t){e._reconstructActiveFormattingElements(),e._insertElement(t,T.HTML),e.activeFormattingElements.insertMarker(),e.framesetOk=!1}function Ae(e,t){e._reconstructActiveFormattingElements(),e._appendElement(t,T.HTML),e.framesetOk=!1,t.ackSelfClosing=!0}function ke(e,t){e._appendElement(t,T.HTML),t.ackSelfClosing=!0}function ye(e,t){e._switchToTextParsing(t,o.MODE.RAWTEXT)}function Se(e,t){e.openElements.currentTagName===g.OPTION&&e.openElements.pop(),e._reconstructActiveFormattingElements(),e._insertElement(t,T.HTML)}function _e(e,t){e.openElements.hasInScope(g.RUBY)&&e.openElements.generateImpliedEndTags(),e._insertElement(t,T.HTML)}function Ce(e,t){e._reconstructActiveFormattingElements(),e._insertElement(t,T.HTML)}function xe(e,t){const n=t.tagName;switch(n.length){case 1:n===g.I||n===g.S||n===g.B||n===g.U?Ee(e,t):n===g.P?ge(e,t):n===g.A?function(e,t){const n=e.activeFormattingElements.getElementEntryInScopeWithTagName(g.A);n&&($(e,t),e.openElements.remove(n.element),e.activeFormattingElements.removeEntry(n)),e._reconstructActiveFormattingElements(),e._insertElement(t,T.HTML),e.activeFormattingElements.pushElement(e.openElements.current,t)}(e,t):Ce(e,t);break;case 2:n===g.DL||n===g.OL||n===g.UL?ge(e,t):n===g.H1||n===g.H2||n===g.H3||n===g.H4||n===g.H5||n===g.H6?function(e,t){e.openElements.hasInButtonScope(g.P)&&e._closePElement();const n=e.openElements.currentTagName;n!==g.H1&&n!==g.H2&&n!==g.H3&&n!==g.H4&&n!==g.H5&&n!==g.H6||e.openElements.pop(),e._insertElement(t,T.HTML)}(e,t):n===g.LI||n===g.DD||n===g.DT?function(e,t){e.framesetOk=!1;const n=t.tagName;for(let o=e.openElements.stackTop;o>=0;o--){const t=e.openElements.items[o],r=e.treeAdapter.getTagName(t);let a=null;if(n===g.LI&&r===g.LI?a=g.LI:n!==g.DD&&n!==g.DT||r!==g.DD&&r!==g.DT||(a=r),a){e.openElements.generateImpliedEndTagsWithExclusion(a),e.openElements.popUntilTagNamePopped(a);break}if(r!==g.ADDRESS&&r!==g.DIV&&r!==g.P&&e._isSpecialElement(t))break}e.openElements.hasInButtonScope(g.P)&&e._closePElement(),e._insertElement(t,T.HTML)}(e,t):n===g.EM||n===g.TT?Ee(e,t):n===g.BR?Ae(e,t):n===g.HR?function(e,t){e.openElements.hasInButtonScope(g.P)&&e._closePElement(),e._appendElement(t,T.HTML),e.framesetOk=!1,t.ackSelfClosing=!0}(e,t):n===g.RB?_e(e,t):n===g.RT||n===g.RP?function(e,t){e.openElements.hasInScope(g.RUBY)&&e.openElements.generateImpliedEndTagsWithExclusion(g.RTC),e._insertElement(t,T.HTML)}(e,t):n!==g.TH&&n!==g.TD&&n!==g.TR&&Ce(e,t);break;case 3:n===g.DIV||n===g.DIR||n===g.NAV?ge(e,t):n===g.PRE?Te(e,t):n===g.BIG?Ee(e,t):n===g.IMG||n===g.WBR?Ae(e,t):n===g.XMP?function(e,t){e.openElements.hasInButtonScope(g.P)&&e._closePElement(),e._reconstructActiveFormattingElements(),e.framesetOk=!1,e._switchToTextParsing(t,o.MODE.RAWTEXT)}(e,t):n===g.SVG?function(e,t){e._reconstructActiveFormattingElements(),p.adjustTokenSVGAttrs(t),p.adjustTokenXMLAttrs(t),t.selfClosing?e._appendElement(t,T.SVG):e._insertElement(t,T.SVG),t.ackSelfClosing=!0}(e,t):n===g.RTC?_e(e,t):n!==g.COL&&Ce(e,t);break;case 4:n===g.HTML?function(e,t){0===e.openElements.tmplCount&&e.treeAdapter.adoptAttributes(e.openElements.items[0],t.attrs)}(e,t):n===g.BASE||n===g.LINK||n===g.META?ce(e,t):n===g.BODY?function(e,t){const n=e.openElements.tryPeekProperlyNestedBodyElement();n&&0===e.openElements.tmplCount&&(e.framesetOk=!1,e.treeAdapter.adoptAttributes(n,t.attrs))}(e,t):n===g.MAIN||n===g.MENU?ge(e,t):n===g.FORM?function(e,t){const n=e.openElements.tmplCount>0;e.formElement&&!n||(e.openElements.hasInButtonScope(g.P)&&e._closePElement(),e._insertElement(t,T.HTML),n||(e.formElement=e.openElements.current))}(e,t):n===g.CODE||n===g.FONT?Ee(e,t):n===g.NOBR?function(e,t){e._reconstructActiveFormattingElements(),e.openElements.hasInScope(g.NOBR)&&($(e,t),e._reconstructActiveFormattingElements()),e._insertElement(t,T.HTML),e.activeFormattingElements.pushElement(e.openElements.current,t)}(e,t):n===g.AREA?Ae(e,t):n===g.MATH?function(e,t){e._reconstructActiveFormattingElements(),p.adjustTokenMathMLAttrs(t),p.adjustTokenXMLAttrs(t),t.selfClosing?e._appendElement(t,T.MATHML):e._insertElement(t,T.MATHML),t.ackSelfClosing=!0}(e,t):n===g.MENU?function(e,t){e.openElements.hasInButtonScope(g.P)&&e._closePElement(),e._insertElement(t,T.HTML)}(e,t):n!==g.HEAD&&Ce(e,t);break;case 5:n===g.STYLE||n===g.TITLE?ce(e,t):n===g.ASIDE?ge(e,t):n===g.SMALL?Ee(e,t):n===g.TABLE?function(e,t){e.treeAdapter.getDocumentMode(e.document)!==m.DOCUMENT_MODE.QUIRKS&&e.openElements.hasInButtonScope(g.P)&&e._closePElement(),e._insertElement(t,T.HTML),e.framesetOk=!1,e.insertionMode=v}(e,t):n===g.EMBED?Ae(e,t):n===g.INPUT?function(e,t){e._reconstructActiveFormattingElements(),e._appendElement(t,T.HTML);const n=o.getTokenAttr(t,E.TYPE);n&&n.toLowerCase()===A||(e.framesetOk=!1),t.ackSelfClosing=!0}(e,t):n===g.PARAM||n===g.TRACK?ke(e,t):n===g.IMAGE?function(e,t){t.tagName=g.IMG,Ae(e,t)}(e,t):n!==g.FRAME&&n!==g.TBODY&&n!==g.TFOOT&&n!==g.THEAD&&Ce(e,t);break;case 6:n===g.SCRIPT?ce(e,t):n===g.CENTER||n===g.FIGURE||n===g.FOOTER||n===g.HEADER||n===g.HGROUP||n===g.DIALOG?ge(e,t):n===g.BUTTON?function(e,t){e.openElements.hasInScope(g.BUTTON)&&(e.openElements.generateImpliedEndTags(),e.openElements.popUntilTagNamePopped(g.BUTTON)),e._reconstructActiveFormattingElements(),e._insertElement(t,T.HTML),e.framesetOk=!1}(e,t):n===g.STRIKE||n===g.STRONG?Ee(e,t):n===g.APPLET||n===g.OBJECT?be(e,t):n===g.KEYGEN?Ae(e,t):n===g.SOURCE?ke(e,t):n===g.IFRAME?function(e,t){e.framesetOk=!1,e._switchToTextParsing(t,o.MODE.RAWTEXT)}(e,t):n===g.SELECT?function(e,t){e._reconstructActiveFormattingElements(),e._insertElement(t,T.HTML),e.framesetOk=!1,e.insertionMode===v||e.insertionMode===R||e.insertionMode===I||e.insertionMode===L||e.insertionMode===P?e.insertionMode=D:e.insertionMode=H}(e,t):n===g.OPTION?Se(e,t):Ce(e,t);break;case 7:n===g.BGSOUND?ce(e,t):n===g.DETAILS||n===g.ADDRESS||n===g.ARTICLE||n===g.SECTION||n===g.SUMMARY?ge(e,t):n===g.LISTING?Te(e,t):n===g.MARQUEE?be(e,t):n===g.NOEMBED?ye(e,t):n!==g.CAPTION&&Ce(e,t);break;case 8:n===g.BASEFONT?ce(e,t):n===g.FRAMESET?function(e,t){const n=e.openElements.tryPeekProperlyNestedBodyElement();e.framesetOk&&n&&(e.treeAdapter.detachNode(n),e.openElements.popAllUpToHtmlElement(),e._insertElement(t,T.HTML),e.insertionMode=z)}(e,t):n===g.FIELDSET?ge(e,t):n===g.TEXTAREA?function(e,t){e._insertElement(t,T.HTML),e.skipNextNewLine=!0,e.tokenizer.state=o.MODE.RCDATA,e.originalInsertionMode=e.insertionMode,e.framesetOk=!1,e.insertionMode=N}(e,t):n===g.TEMPLATE?ce(e,t):n===g.NOSCRIPT?e.options.scriptingEnabled?ye(e,t):Ce(e,t):n===g.OPTGROUP?Se(e,t):n!==g.COLGROUP&&Ce(e,t);break;case 9:n===g.PLAINTEXT?function(e,t){e.openElements.hasInButtonScope(g.P)&&e._closePElement(),e._insertElement(t,T.HTML),e.tokenizer.state=o.MODE.PLAINTEXT}(e,t):Ce(e,t);break;case 10:n===g.BLOCKQUOTE||n===g.FIGCAPTION?ge(e,t):Ce(e,t);break;default:Ce(e,t)}}function Oe(e,t){const n=t.tagName;e.openElements.hasInScope(n)&&(e.openElements.generateImpliedEndTags(),e.openElements.popUntilTagNamePopped(n))}function Ne(e,t){const n=t.tagName;e.openElements.hasInScope(n)&&(e.openElements.generateImpliedEndTags(),e.openElements.popUntilTagNamePopped(n),e.activeFormattingElements.clearToLastMarker())}function ve(e,t){const n=t.tagName;for(let o=e.openElements.stackTop;o>0;o--){const t=e.openElements.items[o];if(e.treeAdapter.getTagName(t)===n){e.openElements.generateImpliedEndTagsWithExclusion(n),e.openElements.popUntilElementPopped(t);break}if(e._isSpecialElement(t))break}}function Me(e,t){const n=t.tagName;switch(n.length){case 1:n===g.A||n===g.B||n===g.I||n===g.S||n===g.U?$(e,t):n===g.P?function(e){e.openElements.hasInButtonScope(g.P)||e._insertFakeElement(g.P),e._closePElement()}(e):ve(e,t);break;case 2:n===g.DL||n===g.UL||n===g.OL?Oe(e,t):n===g.LI?function(e){e.openElements.hasInListItemScope(g.LI)&&(e.openElements.generateImpliedEndTagsWithExclusion(g.LI),e.openElements.popUntilTagNamePopped(g.LI))}(e):n===g.DD||n===g.DT?function(e,t){const n=t.tagName;e.openElements.hasInScope(n)&&(e.openElements.generateImpliedEndTagsWithExclusion(n),e.openElements.popUntilTagNamePopped(n))}(e,t):n===g.H1||n===g.H2||n===g.H3||n===g.H4||n===g.H5||n===g.H6?function(e){e.openElements.hasNumberedHeaderInScope()&&(e.openElements.generateImpliedEndTags(),e.openElements.popUntilNumberedHeaderPopped())}(e):n===g.BR?function(e){e._reconstructActiveFormattingElements(),e._insertFakeElement(g.BR),e.openElements.pop(),e.framesetOk=!1}(e):n===g.EM||n===g.TT?$(e,t):ve(e,t);break;case 3:n===g.BIG?$(e,t):n===g.DIR||n===g.DIV||n===g.NAV||n===g.PRE?Oe(e,t):ve(e,t);break;case 4:n===g.BODY?function(e){e.openElements.hasInScope(g.BODY)&&(e.insertionMode=B)}(e):n===g.HTML?function(e,t){e.openElements.hasInScope(g.BODY)&&(e.insertionMode=B,e._processToken(t))}(e,t):n===g.FORM?function(e){const t=e.openElements.tmplCount>0,n=e.formElement;t||(e.formElement=null),(n||t)&&e.openElements.hasInScope(g.FORM)&&(e.openElements.generateImpliedEndTags(),t?e.openElements.popUntilTagNamePopped(g.FORM):e.openElements.remove(n))}(e):n===g.CODE||n===g.FONT||n===g.NOBR?$(e,t):n===g.MAIN||n===g.MENU?Oe(e,t):ve(e,t);break;case 5:n===g.ASIDE?Oe(e,t):n===g.SMALL?$(e,t):ve(e,t);break;case 6:n===g.CENTER||n===g.FIGURE||n===g.FOOTER||n===g.HEADER||n===g.HGROUP||n===g.DIALOG?Oe(e,t):n===g.APPLET||n===g.OBJECT?Ne(e,t):n===g.STRIKE||n===g.STRONG?$(e,t):ve(e,t);break;case 7:n===g.ADDRESS||n===g.ARTICLE||n===g.DETAILS||n===g.SECTION||n===g.SUMMARY||n===g.LISTING?Oe(e,t):n===g.MARQUEE?Ne(e,t):ve(e,t);break;case 8:n===g.FIELDSET?Oe(e,t):n===g.TEMPLATE?ue(e,t):ve(e,t);break;case 10:n===g.BLOCKQUOTE||n===g.FIGCAPTION?Oe(e,t):ve(e,t);break;default:ve(e,t)}}function Re(e,t){e.tmplInsertionModeStackTop>-1?ze(e,t):e.stopped=!0}function we(e,t){const n=e.openElements.currentTagName;n===g.TABLE||n===g.TBODY||n===g.TFOOT||n===g.THEAD||n===g.TR?(e.pendingCharacterTokens=[],e.hasNonWhitespacePendingCharacterToken=!1,e.originalInsertionMode=e.insertionMode,e.insertionMode=M,e._processToken(t)):Pe(e,t)}function Ie(e,t){const n=t.tagName;switch(n.length){case 2:n===g.TD||n===g.TH||n===g.TR?function(e,t){e.openElements.clearBackToTableContext(),e._insertFakeElement(g.TBODY),e.insertionMode=I,e._processToken(t)}(e,t):Pe(e,t);break;case 3:n===g.COL?function(e,t){e.openElements.clearBackToTableContext(),e._insertFakeElement(g.COLGROUP),e.insertionMode=w,e._processToken(t)}(e,t):Pe(e,t);break;case 4:n===g.FORM?function(e,t){e.formElement||0!==e.openElements.tmplCount||(e._insertElement(t,T.HTML),e.formElement=e.openElements.current,e.openElements.pop())}(e,t):Pe(e,t);break;case 5:n===g.TABLE?function(e,t){e.openElements.hasInTableScope(g.TABLE)&&(e.openElements.popUntilTagNamePopped(g.TABLE),e._resetInsertionMode(),e._processToken(t))}(e,t):n===g.STYLE?ce(e,t):n===g.TBODY||n===g.TFOOT||n===g.THEAD?function(e,t){e.openElements.clearBackToTableContext(),e._insertElement(t,T.HTML),e.insertionMode=I}(e,t):n===g.INPUT?function(e,t){const n=o.getTokenAttr(t,E.TYPE);n&&n.toLowerCase()===A?e._appendElement(t,T.HTML):Pe(e,t),t.ackSelfClosing=!0}(e,t):Pe(e,t);break;case 6:n===g.SCRIPT?ce(e,t):Pe(e,t);break;case 7:n===g.CAPTION?function(e,t){e.openElements.clearBackToTableContext(),e.activeFormattingElements.insertMarker(),e._insertElement(t,T.HTML),e.insertionMode=R}(e,t):Pe(e,t);break;case 8:n===g.COLGROUP?function(e,t){e.openElements.clearBackToTableContext(),e._insertElement(t,T.HTML),e.insertionMode=w}(e,t):n===g.TEMPLATE?ce(e,t):Pe(e,t);break;default:Pe(e,t)}}function Le(e,t){const n=t.tagName;n===g.TABLE?e.openElements.hasInTableScope(g.TABLE)&&(e.openElements.popUntilTagNamePopped(g.TABLE),e._resetInsertionMode()):n===g.TEMPLATE?ue(e,t):n!==g.BODY&&n!==g.CAPTION&&n!==g.COL&&n!==g.COLGROUP&&n!==g.HTML&&n!==g.TBODY&&n!==g.TD&&n!==g.TFOOT&&n!==g.TH&&n!==g.THEAD&&n!==g.TR&&Pe(e,t)}function Pe(e,t){const n=e.fosterParentingEnabled;e.fosterParentingEnabled=!0,e._processTokenInBodyMode(t),e.fosterParentingEnabled=n}function He(e,t){let n=0;if(e.hasNonWhitespacePendingCharacterToken)for(;n0?(e.openElements.popUntilTagNamePopped(g.TEMPLATE),e.activeFormattingElements.clearToLastMarker(),e._popTmplInsertionMode(),e._resetInsertionMode(),e._processToken(t)):e.stopped=!0}function Ue(e,t){e.insertionMode=O,e._processToken(t)}function Ge(e,t){e.insertionMode=O,e._processToken(t)}e.exports=class{constructor(e){this.options=u(b,e),this.treeAdapter=this.options.treeAdapter,this.pendingScript=null,this.options.sourceCodeLocationInfo&&l.install(this,i),this.options.onParseError&&l.install(this,s,{onParseError:this.options.onParseError})}parse(e){const t=this.treeAdapter.createDocument();return this._bootstrap(t,null),this.tokenizer.write(e,!0),this._runParsingLoop(null),t}parseFragment(e,t){t||(t=this.treeAdapter.createElement(g.TEMPLATE,T.HTML,[]));const n=this.treeAdapter.createElement("documentmock",T.HTML,[]);this._bootstrap(n,t),this.treeAdapter.getTagName(t)===g.TEMPLATE&&this._pushTmplInsertionMode(F),this._initTokenizerForFragmentParsing(),this._insertFakeRootElement(),this._resetInsertionMode(),this._findFormInFragmentContext(),this.tokenizer.write(e,!0),this._runParsingLoop(null);const o=this.treeAdapter.getFirstChild(n),r=this.treeAdapter.createDocumentFragment();return this._adoptNodes(o,r),r}_bootstrap(e,t){this.tokenizer=new o(this.options),this.stopped=!1,this.insertionMode=k,this.originalInsertionMode="",this.document=e,this.fragmentContext=t,this.headElement=null,this.formElement=null,this.openElements=new r(this.document,this.treeAdapter),this.activeFormattingElements=new a(this.treeAdapter),this.tmplInsertionModeStack=[],this.tmplInsertionModeStackTop=-1,this.currentTmplInsertionMode=null,this.pendingCharacterTokens=[],this.hasNonWhitespacePendingCharacterToken=!1,this.framesetOk=!0,this.skipNextNewLine=!1,this.fosterParentingEnabled=!1}_err(){}_runParsingLoop(e){for(;!this.stopped;){this._setupTokenizerCDATAMode();const t=this.tokenizer.getNextToken();if(t.type===o.HIBERNATION_TOKEN)break;if(this.skipNextNewLine&&(this.skipNextNewLine=!1,t.type===o.WHITESPACE_CHARACTER_TOKEN&&"\n"===t.chars[0])){if(1===t.chars.length)continue;t.chars=t.chars.substr(1)}if(this._processInputToken(t),e&&this.pendingScript)break}}runParsingLoopForCurrentChunk(e,t){if(this._runParsingLoop(t),t&&this.pendingScript){const e=this.pendingScript;return this.pendingScript=null,void t(e)}e&&e()}_setupTokenizerCDATAMode(){const e=this._getAdjustedCurrentElement();this.tokenizer.allowCDATA=e&&e!==this.document&&this.treeAdapter.getNamespaceURI(e)!==T.HTML&&!this._isIntegrationPoint(e)}_switchToTextParsing(e,t){this._insertElement(e,T.HTML),this.tokenizer.state=t,this.originalInsertionMode=this.insertionMode,this.insertionMode=N}switchToPlaintextParsing(){this.insertionMode=N,this.originalInsertionMode=O,this.tokenizer.state=o.MODE.PLAINTEXT}_getAdjustedCurrentElement(){return 0===this.openElements.stackTop&&this.fragmentContext?this.fragmentContext:this.openElements.current}_findFormInFragmentContext(){let e=this.fragmentContext;do{if(this.treeAdapter.getTagName(e)===g.FORM){this.formElement=e;break}e=this.treeAdapter.getParentNode(e)}while(e)}_initTokenizerForFragmentParsing(){if(this.treeAdapter.getNamespaceURI(this.fragmentContext)===T.HTML){const e=this.treeAdapter.getTagName(this.fragmentContext);e===g.TITLE||e===g.TEXTAREA?this.tokenizer.state=o.MODE.RCDATA:e===g.STYLE||e===g.XMP||e===g.IFRAME||e===g.NOEMBED||e===g.NOFRAMES||e===g.NOSCRIPT?this.tokenizer.state=o.MODE.RAWTEXT:e===g.SCRIPT?this.tokenizer.state=o.MODE.SCRIPT_DATA:e===g.PLAINTEXT&&(this.tokenizer.state=o.MODE.PLAINTEXT)}}_setDocumentType(e){const t=e.name||"",n=e.publicId||"",o=e.systemId||"";this.treeAdapter.setDocumentType(this.document,t,n,o)}_attachElementToTree(e){if(this._shouldFosterParentOnInsertion())this._fosterParentElement(e);else{const t=this.openElements.currentTmplContent||this.openElements.current;this.treeAdapter.appendChild(t,e)}}_appendElement(e,t){const n=this.treeAdapter.createElement(e.tagName,t,e.attrs);this._attachElementToTree(n)}_insertElement(e,t){const n=this.treeAdapter.createElement(e.tagName,t,e.attrs);this._attachElementToTree(n),this.openElements.push(n)}_insertFakeElement(e){const t=this.treeAdapter.createElement(e,T.HTML,[]);this._attachElementToTree(t),this.openElements.push(t)}_insertTemplate(e){const t=this.treeAdapter.createElement(e.tagName,T.HTML,e.attrs),n=this.treeAdapter.createDocumentFragment();this.treeAdapter.setTemplateContent(t,n),this._attachElementToTree(t),this.openElements.push(t)}_insertFakeRootElement(){const e=this.treeAdapter.createElement(g.HTML,T.HTML,[]);this.treeAdapter.appendChild(this.openElements.current,e),this.openElements.push(e)}_appendCommentNode(e,t){const n=this.treeAdapter.createCommentNode(e.data);this.treeAdapter.appendChild(t,n)}_insertCharacters(e){if(this._shouldFosterParentOnInsertion())this._fosterParentText(e.chars);else{const t=this.openElements.currentTmplContent||this.openElements.current;this.treeAdapter.insertText(t,e.chars)}}_adoptNodes(e,t){for(let n=this.treeAdapter.getFirstChild(e);n;n=this.treeAdapter.getFirstChild(e))this.treeAdapter.detachNode(n),this.treeAdapter.appendChild(t,n)}_shouldProcessTokenInForeignContent(e){const t=this._getAdjustedCurrentElement();if(!t||t===this.document)return!1;const n=this.treeAdapter.getNamespaceURI(t);if(n===T.HTML)return!1;if(this.treeAdapter.getTagName(t)===g.ANNOTATION_XML&&n===T.MATHML&&e.type===o.START_TAG_TOKEN&&e.tagName===g.SVG)return!1;const r=e.type===o.CHARACTER_TOKEN||e.type===o.NULL_CHARACTER_TOKEN||e.type===o.WHITESPACE_CHARACTER_TOKEN;return(!(e.type===o.START_TAG_TOKEN&&e.tagName!==g.MGLYPH&&e.tagName!==g.MALIGNMARK)&&!r||!this._isIntegrationPoint(t,T.MATHML))&&((e.type!==o.START_TAG_TOKEN&&!r||!this._isIntegrationPoint(t,T.HTML))&&e.type!==o.EOF_TOKEN)}_processToken(e){Y[this.insertionMode][e.type](this,e)}_processTokenInBodyMode(e){Y.IN_BODY_MODE[e.type](this,e)}_processTokenInForeignContent(e){e.type===o.CHARACTER_TOKEN?function(e,t){e._insertCharacters(t),e.framesetOk=!1}(this,e):e.type===o.NULL_CHARACTER_TOKEN?function(e,t){t.chars=h.REPLACEMENT_CHARACTER,e._insertCharacters(t)}(this,e):e.type===o.WHITESPACE_CHARACTER_TOKEN?re(this,e):e.type===o.COMMENT_TOKEN?ne(this,e):e.type===o.START_TAG_TOKEN?function(e,t){if(p.causesExit(t)&&!e.fragmentContext){for(;e.treeAdapter.getNamespaceURI(e.openElements.current)!==T.HTML&&!e._isIntegrationPoint(e.openElements.current);)e.openElements.pop();e._processToken(t)}else{const n=e._getAdjustedCurrentElement(),o=e.treeAdapter.getNamespaceURI(n);o===T.MATHML?p.adjustTokenMathMLAttrs(t):o===T.SVG&&(p.adjustTokenSVGTagName(t),p.adjustTokenSVGAttrs(t)),p.adjustTokenXMLAttrs(t),t.selfClosing?e._appendElement(t,o):e._insertElement(t,o),t.ackSelfClosing=!0}}(this,e):e.type===o.END_TAG_TOKEN&&function(e,t){for(let n=e.openElements.stackTop;n>0;n--){const o=e.openElements.items[n];if(e.treeAdapter.getNamespaceURI(o)===T.HTML){e._processToken(t);break}if(e.treeAdapter.getTagName(o).toLowerCase()===t.tagName){e.openElements.popUntilElementPopped(o);break}}}(this,e)}_processInputToken(e){this._shouldProcessTokenInForeignContent(e)?this._processTokenInForeignContent(e):this._processToken(e),e.type===o.START_TAG_TOKEN&&e.selfClosing&&!e.ackSelfClosing&&this._err(f.nonVoidHtmlElementStartTagWithTrailingSolidus)}_isIntegrationPoint(e,t){const n=this.treeAdapter.getTagName(e),o=this.treeAdapter.getNamespaceURI(e),r=this.treeAdapter.getAttrList(e);return p.isIntegrationPoint(n,o,r,t)}_reconstructActiveFormattingElements(){const e=this.activeFormattingElements.length;if(e){let t=e,n=null;do{if(t--,n=this.activeFormattingElements.entries[t],n.type===a.MARKER_ENTRY||this.openElements.contains(n.element)){t++;break}}while(t>0);for(let o=t;o=0;e--){let n=this.openElements.items[e];0===e&&(t=!0,this.fragmentContext&&(n=this.fragmentContext));const o=this.treeAdapter.getTagName(n),r=K[o];if(r){this.insertionMode=r;break}if(!(t||o!==g.TD&&o!==g.TH)){this.insertionMode=P;break}if(!t&&o===g.HEAD){this.insertionMode=_;break}if(o===g.SELECT){this._resetInsertionModeForSelect(e);break}if(o===g.TEMPLATE){this.insertionMode=this.currentTmplInsertionMode;break}if(o===g.HTML){this.insertionMode=this.headElement?x:S;break}if(t){this.insertionMode=O;break}}}_resetInsertionModeForSelect(e){if(e>0)for(let t=e-1;t>0;t--){const e=this.openElements.items[t],n=this.treeAdapter.getTagName(e);if(n===g.TEMPLATE)break;if(n===g.TABLE)return void(this.insertionMode=D)}this.insertionMode=H}_pushTmplInsertionMode(e){this.tmplInsertionModeStack.push(e),this.tmplInsertionModeStackTop++,this.currentTmplInsertionMode=e}_popTmplInsertionMode(){this.tmplInsertionModeStack.pop(),this.tmplInsertionModeStackTop--,this.currentTmplInsertionMode=this.tmplInsertionModeStack[this.tmplInsertionModeStackTop]}_isElementCausesFosterParenting(e){const t=this.treeAdapter.getTagName(e);return t===g.TABLE||t===g.TBODY||t===g.TFOOT||t===g.THEAD||t===g.TR}_shouldFosterParentOnInsertion(){return this.fosterParentingEnabled&&this._isElementCausesFosterParenting(this.openElements.current)}_findFosterParentingLocation(){const e={parent:null,beforeElement:null};for(let t=this.openElements.stackTop;t>=0;t--){const n=this.openElements.items[t],o=this.treeAdapter.getTagName(n),r=this.treeAdapter.getNamespaceURI(n);if(o===g.TEMPLATE&&r===T.HTML){e.parent=this.treeAdapter.getTemplateContent(n);break}if(o===g.TABLE){e.parent=this.treeAdapter.getParentNode(n),e.parent?e.beforeElement=n:e.parent=this.openElements.items[t-1];break}}return e.parent||(e.parent=this.openElements.items[0]),e}_fosterParentElement(e){const t=this._findFosterParentingLocation();t.beforeElement?this.treeAdapter.insertBefore(t.parent,e,t.beforeElement):this.treeAdapter.appendChild(t.parent,e)}_fosterParentText(e){const t=this._findFosterParentingLocation();t.beforeElement?this.treeAdapter.insertTextBefore(t.parent,e,t.beforeElement):this.treeAdapter.insertText(t.parent,e)}_isSpecialElement(e){const t=this.treeAdapter.getTagName(e),n=this.treeAdapter.getNamespaceURI(e);return m.SPECIAL_ELEMENTS[n][t]}}},zktx:function(e,t,n){"use strict";var o=n("FWC9"),r=n("DUvi"),a=n("vGni"),i=o.boolean,s=o.number,l=o.spaceSeparated,c=o.commaSeparated,u=o.commaOrSpaceSeparated;e.exports=r({space:"svg",attributes:{accentHeight:"accent-height",alignmentBaseline:"alignment-baseline",arabicForm:"arabic-form",baselineShift:"baseline-shift",capHeight:"cap-height",className:"class",clipPath:"clip-path",clipRule:"clip-rule",colorInterpolation:"color-interpolation",colorInterpolationFilters:"color-interpolation-filters",colorProfile:"color-profile",colorRendering:"color-rendering",crossOrigin:"crossorigin",dataType:"datatype",dominantBaseline:"dominant-baseline",enableBackground:"enable-background",fillOpacity:"fill-opacity",fillRule:"fill-rule",floodColor:"flood-color",floodOpacity:"flood-opacity",fontFamily:"font-family",fontSize:"font-size",fontSizeAdjust:"font-size-adjust",fontStretch:"font-stretch",fontStyle:"font-style",fontVariant:"font-variant",fontWeight:"font-weight",glyphName:"glyph-name",glyphOrientationHorizontal:"glyph-orientation-horizontal",glyphOrientationVertical:"glyph-orientation-vertical",hrefLang:"hreflang",horizAdvX:"horiz-adv-x",horizOriginX:"horiz-origin-x",horizOriginY:"horiz-origin-y",imageRendering:"image-rendering",letterSpacing:"letter-spacing",lightingColor:"lighting-color",markerEnd:"marker-end",markerMid:"marker-mid",markerStart:"marker-start",navDown:"nav-down",navDownLeft:"nav-down-left",navDownRight:"nav-down-right",navLeft:"nav-left",navNext:"nav-next",navPrev:"nav-prev",navRight:"nav-right",navUp:"nav-up",navUpLeft:"nav-up-left",navUpRight:"nav-up-right",onAbort:"onabort",onActivate:"onactivate",onAfterPrint:"onafterprint",onBeforePrint:"onbeforeprint",onBegin:"onbegin",onCancel:"oncancel",onCanPlay:"oncanplay",onCanPlayThrough:"oncanplaythrough",onChange:"onchange",onClick:"onclick",onClose:"onclose",onCopy:"oncopy",onCueChange:"oncuechange",onCut:"oncut",onDblClick:"ondblclick",onDrag:"ondrag",onDragEnd:"ondragend",onDragEnter:"ondragenter",onDragExit:"ondragexit",onDragLeave:"ondragleave",onDragOver:"ondragover",onDragStart:"ondragstart",onDrop:"ondrop",onDurationChange:"ondurationchange",onEmptied:"onemptied",onEnd:"onend",onEnded:"onended",onError:"onerror",onFocus:"onfocus",onFocusIn:"onfocusin",onFocusOut:"onfocusout",onHashChange:"onhashchange",onInput:"oninput",onInvalid:"oninvalid",onKeyDown:"onkeydown",onKeyPress:"onkeypress",onKeyUp:"onkeyup",onLoad:"onload",onLoadedData:"onloadeddata",onLoadedMetadata:"onloadedmetadata",onLoadStart:"onloadstart",onMessage:"onmessage",onMouseDown:"onmousedown",onMouseEnter:"onmouseenter",onMouseLeave:"onmouseleave",onMouseMove:"onmousemove",onMouseOut:"onmouseout",onMouseOver:"onmouseover",onMouseUp:"onmouseup",onMouseWheel:"onmousewheel",onOffline:"onoffline",onOnline:"ononline",onPageHide:"onpagehide",onPageShow:"onpageshow",onPaste:"onpaste",onPause:"onpause",onPlay:"onplay",onPlaying:"onplaying",onPopState:"onpopstate",onProgress:"onprogress",onRateChange:"onratechange",onRepeat:"onrepeat",onReset:"onreset",onResize:"onresize",onScroll:"onscroll",onSeeked:"onseeked",onSeeking:"onseeking",onSelect:"onselect",onShow:"onshow",onStalled:"onstalled",onStorage:"onstorage",onSubmit:"onsubmit",onSuspend:"onsuspend",onTimeUpdate:"ontimeupdate",onToggle:"ontoggle",onUnload:"onunload",onVolumeChange:"onvolumechange",onWaiting:"onwaiting",onZoom:"onzoom",overlinePosition:"overline-position",overlineThickness:"overline-thickness",paintOrder:"paint-order",panose1:"panose-1",pointerEvents:"pointer-events",referrerPolicy:"referrerpolicy",renderingIntent:"rendering-intent",shapeRendering:"shape-rendering",stopColor:"stop-color",stopOpacity:"stop-opacity",strikethroughPosition:"strikethrough-position",strikethroughThickness:"strikethrough-thickness",strokeDashArray:"stroke-dasharray",strokeDashOffset:"stroke-dashoffset",strokeLineCap:"stroke-linecap",strokeLineJoin:"stroke-linejoin",strokeMiterLimit:"stroke-miterlimit",strokeOpacity:"stroke-opacity",strokeWidth:"stroke-width",tabIndex:"tabindex",textAnchor:"text-anchor",textDecoration:"text-decoration",textRendering:"text-rendering",typeOf:"typeof",underlinePosition:"underline-position",underlineThickness:"underline-thickness",unicodeBidi:"unicode-bidi",unicodeRange:"unicode-range",unitsPerEm:"units-per-em",vAlphabetic:"v-alphabetic",vHanging:"v-hanging",vIdeographic:"v-ideographic",vMathematical:"v-mathematical",vectorEffect:"vector-effect",vertAdvY:"vert-adv-y",vertOriginX:"vert-origin-x",vertOriginY:"vert-origin-y",wordSpacing:"word-spacing",writingMode:"writing-mode",xHeight:"x-height",playbackOrder:"playbackorder",timelineBegin:"timelinebegin"},transform:a,properties:{about:u,accentHeight:s,accumulate:null,additive:null,alignmentBaseline:null,alphabetic:s,amplitude:s,arabicForm:null,ascent:s,attributeName:null,attributeType:null,azimuth:s,bandwidth:null,baselineShift:null,baseFrequency:null,baseProfile:null,bbox:null,begin:null,bias:s,by:null,calcMode:null,capHeight:s,className:l,clip:null,clipPath:null,clipPathUnits:null,clipRule:null,color:null,colorInterpolation:null,colorInterpolationFilters:null,colorProfile:null,colorRendering:null,content:null,contentScriptType:null,contentStyleType:null,crossOrigin:null,cursor:null,cx:null,cy:null,d:null,dataType:null,defaultAction:null,descent:s,diffuseConstant:s,direction:null,display:null,dur:null,divisor:s,dominantBaseline:null,download:i,dx:null,dy:null,edgeMode:null,editable:null,elevation:s,enableBackground:null,end:null,event:null,exponent:s,externalResourcesRequired:null,fill:null,fillOpacity:s,fillRule:null,filter:null,filterRes:null,filterUnits:null,floodColor:null,floodOpacity:null,focusable:null,focusHighlight:null,fontFamily:null,fontSize:null,fontSizeAdjust:null,fontStretch:null,fontStyle:null,fontVariant:null,fontWeight:null,format:null,fr:null,from:null,fx:null,fy:null,g1:c,g2:c,glyphName:c,glyphOrientationHorizontal:null,glyphOrientationVertical:null,glyphRef:null,gradientTransform:null,gradientUnits:null,handler:null,hanging:s,hatchContentUnits:null,hatchUnits:null,height:null,href:null,hrefLang:null,horizAdvX:s,horizOriginX:s,horizOriginY:s,id:null,ideographic:s,imageRendering:null,initialVisibility:null,in:null,in2:null,intercept:s,k:s,k1:s,k2:s,k3:s,k4:s,kernelMatrix:u,kernelUnitLength:null,keyPoints:null,keySplines:null,keyTimes:null,kerning:null,lang:null,lengthAdjust:null,letterSpacing:null,lightingColor:null,limitingConeAngle:s,local:null,markerEnd:null,markerMid:null,markerStart:null,markerHeight:null,markerUnits:null,markerWidth:null,mask:null,maskContentUnits:null,maskUnits:null,mathematical:null,max:null,media:null,mediaCharacterEncoding:null,mediaContentEncodings:null,mediaSize:s,mediaTime:null,method:null,min:null,mode:null,name:null,navDown:null,navDownLeft:null,navDownRight:null,navLeft:null,navNext:null,navPrev:null,navRight:null,navUp:null,navUpLeft:null,navUpRight:null,numOctaves:null,observer:null,offset:null,onAbort:null,onActivate:null,onAfterPrint:null,onBeforePrint:null,onBegin:null,onCancel:null,onCanPlay:null,onCanPlayThrough:null,onChange:null,onClick:null,onClose:null,onCopy:null,onCueChange:null,onCut:null,onDblClick:null,onDrag:null,onDragEnd:null,onDragEnter:null,onDragExit:null,onDragLeave:null,onDragOver:null,onDragStart:null,onDrop:null,onDurationChange:null,onEmptied:null,onEnd:null,onEnded:null,onError:null,onFocus:null,onFocusIn:null,onFocusOut:null,onHashChange:null,onInput:null,onInvalid:null,onKeyDown:null,onKeyPress:null,onKeyUp:null,onLoad:null,onLoadedData:null,onLoadedMetadata:null,onLoadStart:null,onMessage:null,onMouseDown:null,onMouseEnter:null,onMouseLeave:null,onMouseMove:null,onMouseOut:null,onMouseOver:null,onMouseUp:null,onMouseWheel:null,onOffline:null,onOnline:null,onPageHide:null,onPageShow:null,onPaste:null,onPause:null,onPlay:null,onPlaying:null,onPopState:null,onProgress:null,onRateChange:null,onRepeat:null,onReset:null,onResize:null,onScroll:null,onSeeked:null,onSeeking:null,onSelect:null,onShow:null,onStalled:null,onStorage:null,onSubmit:null,onSuspend:null,onTimeUpdate:null,onToggle:null,onUnload:null,onVolumeChange:null,onWaiting:null,onZoom:null,opacity:null,operator:null,order:null,orient:null,orientation:null,origin:null,overflow:null,overlay:null,overlinePosition:s,overlineThickness:s,paintOrder:null,panose1:null,path:null,pathLength:s,patternContentUnits:null,patternTransform:null,patternUnits:null,phase:null,ping:l,pitch:null,playbackOrder:null,pointerEvents:null,points:null,pointsAtX:s,pointsAtY:s,pointsAtZ:s,preserveAlpha:null,preserveAspectRatio:null,primitiveUnits:null,propagate:null,property:u,r:null,radius:null,referrerPolicy:null,refX:null,refY:null,rel:u,rev:u,renderingIntent:null,repeatCount:null,repeatDur:null,requiredExtensions:u,requiredFeatures:u,requiredFonts:u,requiredFormats:u,resource:null,restart:null,result:null,rotate:null,rx:null,ry:null,scale:null,seed:null,shapeRendering:null,side:null,slope:null,snapshotTime:null,specularConstant:s,specularExponent:s,spreadMethod:null,spacing:null,startOffset:null,stdDeviation:null,stemh:null,stemv:null,stitchTiles:null,stopColor:null,stopOpacity:null,strikethroughPosition:s,strikethroughThickness:s,string:null,stroke:null,strokeDashArray:u,strokeDashOffset:null,strokeLineCap:null,strokeLineJoin:null,strokeMiterLimit:s,strokeOpacity:s,strokeWidth:null,style:null,surfaceScale:s,syncBehavior:null,syncBehaviorDefault:null,syncMaster:null,syncTolerance:null,syncToleranceDefault:null,systemLanguage:u,tabIndex:s,tableValues:null,target:null,targetX:s,targetY:s,textAnchor:null,textDecoration:null,textRendering:null,textLength:null,timelineBegin:null,title:null,transformBehavior:null,type:null,typeOf:u,to:null,transform:null,u1:null,u2:null,underlinePosition:s,underlineThickness:s,unicode:null,unicodeBidi:null,unicodeRange:null,unitsPerEm:s,values:null,vAlphabetic:s,vMathematical:s,vectorEffect:null,vHanging:s,vIdeographic:s,version:null,vertAdvY:s,vertOriginX:s,vertOriginY:s,viewBox:null,viewTarget:null,visibility:null,width:null,widths:null,wordSpacing:null,writingMode:null,x:null,x1:null,x2:null,xChannelSelector:null,xHeight:s,y:null,y1:null,y2:null,yChannelSelector:null,z:null,zoomAndPan:null}})},zpDW:function(e,t,n){"use strict";const o=n("YpxX"),r=n("pRQB"),a=n("cRLj"),i=n("2l2D"),s=r.CODE_POINTS,l=r.CODE_POINT_SEQUENCES,c={128:8364,130:8218,131:402,132:8222,133:8230,134:8224,135:8225,136:710,137:8240,138:352,139:8249,140:338,142:381,145:8216,146:8217,147:8220,148:8221,149:8226,150:8211,151:8212,152:732,153:8482,154:353,155:8250,156:339,158:382,159:376},u="DATA_STATE",d="RCDATA_STATE",p="RAWTEXT_STATE",f="SCRIPT_DATA_STATE",h="PLAINTEXT_STATE",m="TAG_OPEN_STATE",g="END_TAG_OPEN_STATE",T="TAG_NAME_STATE",E="RCDATA_LESS_THAN_SIGN_STATE",b="RCDATA_END_TAG_OPEN_STATE",A="RCDATA_END_TAG_NAME_STATE",k="RAWTEXT_LESS_THAN_SIGN_STATE",y="RAWTEXT_END_TAG_OPEN_STATE",S="RAWTEXT_END_TAG_NAME_STATE",_="SCRIPT_DATA_LESS_THAN_SIGN_STATE",C="SCRIPT_DATA_END_TAG_OPEN_STATE",x="SCRIPT_DATA_END_TAG_NAME_STATE",O="SCRIPT_DATA_ESCAPE_START_STATE",N="SCRIPT_DATA_ESCAPE_START_DASH_STATE",v="SCRIPT_DATA_ESCAPED_STATE",M="SCRIPT_DATA_ESCAPED_DASH_STATE",R="SCRIPT_DATA_ESCAPED_DASH_DASH_STATE",w="SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE",I="SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE",L="SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE",P="SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE",H="SCRIPT_DATA_DOUBLE_ESCAPED_STATE",D="SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE",F="SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE",B="SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE",z="SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE",U="BEFORE_ATTRIBUTE_NAME_STATE",G="ATTRIBUTE_NAME_STATE",W="AFTER_ATTRIBUTE_NAME_STATE",K="BEFORE_ATTRIBUTE_VALUE_STATE",j="ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE",Y="ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE",Q="ATTRIBUTE_VALUE_UNQUOTED_STATE",V="AFTER_ATTRIBUTE_VALUE_QUOTED_STATE",q="SELF_CLOSING_START_TAG_STATE",X="BOGUS_COMMENT_STATE",J="MARKUP_DECLARATION_OPEN_STATE",Z="COMMENT_START_STATE",$="COMMENT_START_DASH_STATE",ee="COMMENT_STATE",te="COMMENT_LESS_THAN_SIGN_STATE",ne="COMMENT_LESS_THAN_SIGN_BANG_STATE",oe="COMMENT_LESS_THAN_SIGN_BANG_DASH_STATE",re="COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH_STATE",ae="COMMENT_END_DASH_STATE",ie="COMMENT_END_STATE",se="COMMENT_END_BANG_STATE",le="DOCTYPE_STATE",ce="BEFORE_DOCTYPE_NAME_STATE",ue="DOCTYPE_NAME_STATE",de="AFTER_DOCTYPE_NAME_STATE",pe="AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE",fe="BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE",he="DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE",me="DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE",ge="AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE",Te="BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE",Ee="AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE",be="BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE",Ae="DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE",ke="DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE",ye="AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE",Se="BOGUS_DOCTYPE_STATE",_e="CDATA_SECTION_STATE",Ce="CDATA_SECTION_BRACKET_STATE",xe="CDATA_SECTION_END_STATE",Oe="CHARACTER_REFERENCE_STATE",Ne="NAMED_CHARACTER_REFERENCE_STATE",ve="AMBIGUOS_AMPERSAND_STATE",Me="NUMERIC_CHARACTER_REFERENCE_STATE",Re="HEXADEMICAL_CHARACTER_REFERENCE_START_STATE",we="DECIMAL_CHARACTER_REFERENCE_START_STATE",Ie="HEXADEMICAL_CHARACTER_REFERENCE_STATE",Le="DECIMAL_CHARACTER_REFERENCE_STATE",Pe="NUMERIC_CHARACTER_REFERENCE_END_STATE";function He(e){return e===s.SPACE||e===s.LINE_FEED||e===s.TABULATION||e===s.FORM_FEED}function De(e){return e>=s.DIGIT_0&&e<=s.DIGIT_9}function Fe(e){return e>=s.LATIN_CAPITAL_A&&e<=s.LATIN_CAPITAL_Z}function Be(e){return e>=s.LATIN_SMALL_A&&e<=s.LATIN_SMALL_Z}function ze(e){return Be(e)||Fe(e)}function Ue(e){return ze(e)||De(e)}function Ge(e){return e>=s.LATIN_CAPITAL_A&&e<=s.LATIN_CAPITAL_F}function We(e){return e>=s.LATIN_SMALL_A&&e<=s.LATIN_SMALL_F}function Ke(e){return e+32}function je(e){return e<=65535?String.fromCharCode(e):(e-=65536,String.fromCharCode(e>>>10&1023|55296)+String.fromCharCode(56320|1023&e))}function Ye(e){return String.fromCharCode(Ke(e))}function Qe(e,t){const n=a[++e];let o=++e,r=o+n-1;for(;o<=r;){const e=o+r>>>1,i=a[e];if(it))return a[e+n];r=e-1}}return-1}class Ve{constructor(){this.preprocessor=new o,this.tokenQueue=[],this.allowCDATA=!1,this.state=u,this.returnState="",this.charRefCode=-1,this.tempBuff=[],this.lastStartTagName="",this.consumedAfterSnapshot=-1,this.active=!1,this.currentCharacterToken=null,this.currentToken=null,this.currentAttr=null}_err(){}_errOnNextCodePoint(e){this._consume(),this._err(e),this._unconsume()}getNextToken(){for(;!this.tokenQueue.length&&this.active;){this.consumedAfterSnapshot=0;const e=this._consume();this._ensureHibernation()||this[this.state](e)}return this.tokenQueue.shift()}write(e,t){this.active=!0,this.preprocessor.write(e,t)}insertHtmlAtCurrentPos(e){this.active=!0,this.preprocessor.insertHtmlAtCurrentPos(e)}_ensureHibernation(){if(this.preprocessor.endOfChunkHit){for(;this.consumedAfterSnapshot>0;this.consumedAfterSnapshot--)this.preprocessor.retreat();return this.active=!1,this.tokenQueue.push({type:Ve.HIBERNATION_TOKEN}),!0}return!1}_consume(){return this.consumedAfterSnapshot++,this.preprocessor.advance()}_unconsume(){this.consumedAfterSnapshot--,this.preprocessor.retreat()}_reconsumeInState(e){this.state=e,this._unconsume()}_consumeSequenceIfMatch(e,t,n){let o=0,r=!0;const a=e.length;let i,l=0,c=t;for(;l0&&(c=this._consume(),o++),c===s.EOF){r=!1;break}if(i=e[l],c!==i&&(n||c!==Ke(i))){r=!1;break}}if(!r)for(;o--;)this._unconsume();return r}_isTempBufferEqualToScriptString(){if(this.tempBuff.length!==l.SCRIPT_STRING.length)return!1;for(let e=0;e0&&this._err(i.endTagWithAttributes),e.selfClosing&&this._err(i.endTagWithTrailingSolidus)),this.tokenQueue.push(e)}_emitCurrentCharacterToken(){this.currentCharacterToken&&(this.tokenQueue.push(this.currentCharacterToken),this.currentCharacterToken=null)}_emitEOFToken(){this._createEOFToken(),this._emitCurrentToken()}_appendCharToCurrentCharacterToken(e,t){this.currentCharacterToken&&this.currentCharacterToken.type!==e&&this._emitCurrentCharacterToken(),this.currentCharacterToken?this.currentCharacterToken.chars+=t:this._createCharacterToken(e,t)}_emitCodePoint(e){let t=Ve.CHARACTER_TOKEN;He(e)?t=Ve.WHITESPACE_CHARACTER_TOKEN:e===s.NULL&&(t=Ve.NULL_CHARACTER_TOKEN),this._appendCharToCurrentCharacterToken(t,je(e))}_emitSeveralCodePoints(e){for(let t=0;t-1;){const e=a[o],r=e<7;r&&1&e&&(t=2&e?[a[++o],a[++o]]:[a[++o]],n=0);const i=this._consume();if(this.tempBuff.push(i),n++,i===s.EOF)break;o=r?4&e?Qe(o,i):-1:i===e?++o:-1}for(;n--;)this.tempBuff.pop(),this._unconsume();return t}_isCharacterReferenceInAttribute(){return this.returnState===j||this.returnState===Y||this.returnState===Q}_isCharacterReferenceAttributeQuirk(e){if(!e&&this._isCharacterReferenceInAttribute()){const e=this._consume();return this._unconsume(),e===s.EQUALS_SIGN||Ue(e)}return!1}_flushCodePointsConsumedAsCharacterReference(){if(this._isCharacterReferenceInAttribute())for(let e=0;e")):e===s.NULL?(this._err(i.unexpectedNullCharacter),this.state=v,this._emitChars(r.REPLACEMENT_CHARACTER)):e===s.EOF?(this._err(i.eofInScriptHtmlCommentLikeText),this._emitEOFToken()):(this.state=v,this._emitCodePoint(e))}[w](e){e===s.SOLIDUS?(this.tempBuff=[],this.state=I):ze(e)?(this.tempBuff=[],this._emitChars("<"),this._reconsumeInState(P)):(this._emitChars("<"),this._reconsumeInState(v))}[I](e){ze(e)?(this._createEndTagToken(),this._reconsumeInState(L)):(this._emitChars("")):e===s.NULL?(this._err(i.unexpectedNullCharacter),this.state=H,this._emitChars(r.REPLACEMENT_CHARACTER)):e===s.EOF?(this._err(i.eofInScriptHtmlCommentLikeText),this._emitEOFToken()):(this.state=H,this._emitCodePoint(e))}[B](e){e===s.SOLIDUS?(this.tempBuff=[],this.state=z,this._emitChars("/")):this._reconsumeInState(H)}[z](e){He(e)||e===s.SOLIDUS||e===s.GREATER_THAN_SIGN?(this.state=this._isTempBufferEqualToScriptString()?v:H,this._emitCodePoint(e)):Fe(e)?(this.tempBuff.push(Ke(e)),this._emitCodePoint(e)):Be(e)?(this.tempBuff.push(e),this._emitCodePoint(e)):this._reconsumeInState(H)}[U](e){He(e)||(e===s.SOLIDUS||e===s.GREATER_THAN_SIGN||e===s.EOF?this._reconsumeInState(W):e===s.EQUALS_SIGN?(this._err(i.unexpectedEqualsSignBeforeAttributeName),this._createAttr("="),this.state=G):(this._createAttr(""),this._reconsumeInState(G)))}[G](e){He(e)||e===s.SOLIDUS||e===s.GREATER_THAN_SIGN||e===s.EOF?(this._leaveAttrName(W),this._unconsume()):e===s.EQUALS_SIGN?this._leaveAttrName(K):Fe(e)?this.currentAttr.name+=Ye(e):e===s.QUOTATION_MARK||e===s.APOSTROPHE||e===s.LESS_THAN_SIGN?(this._err(i.unexpectedCharacterInAttributeName),this.currentAttr.name+=je(e)):e===s.NULL?(this._err(i.unexpectedNullCharacter),this.currentAttr.name+=r.REPLACEMENT_CHARACTER):this.currentAttr.name+=je(e)}[W](e){He(e)||(e===s.SOLIDUS?this.state=q:e===s.EQUALS_SIGN?this.state=K:e===s.GREATER_THAN_SIGN?(this.state=u,this._emitCurrentToken()):e===s.EOF?(this._err(i.eofInTag),this._emitEOFToken()):(this._createAttr(""),this._reconsumeInState(G)))}[K](e){He(e)||(e===s.QUOTATION_MARK?this.state=j:e===s.APOSTROPHE?this.state=Y:e===s.GREATER_THAN_SIGN?(this._err(i.missingAttributeValue),this.state=u,this._emitCurrentToken()):this._reconsumeInState(Q))}[j](e){e===s.QUOTATION_MARK?this.state=V:e===s.AMPERSAND?(this.returnState=j,this.state=Oe):e===s.NULL?(this._err(i.unexpectedNullCharacter),this.currentAttr.value+=r.REPLACEMENT_CHARACTER):e===s.EOF?(this._err(i.eofInTag),this._emitEOFToken()):this.currentAttr.value+=je(e)}[Y](e){e===s.APOSTROPHE?this.state=V:e===s.AMPERSAND?(this.returnState=Y,this.state=Oe):e===s.NULL?(this._err(i.unexpectedNullCharacter),this.currentAttr.value+=r.REPLACEMENT_CHARACTER):e===s.EOF?(this._err(i.eofInTag),this._emitEOFToken()):this.currentAttr.value+=je(e)}[Q](e){He(e)?this._leaveAttrValue(U):e===s.AMPERSAND?(this.returnState=Q,this.state=Oe):e===s.GREATER_THAN_SIGN?(this._leaveAttrValue(u),this._emitCurrentToken()):e===s.NULL?(this._err(i.unexpectedNullCharacter),this.currentAttr.value+=r.REPLACEMENT_CHARACTER):e===s.QUOTATION_MARK||e===s.APOSTROPHE||e===s.LESS_THAN_SIGN||e===s.EQUALS_SIGN||e===s.GRAVE_ACCENT?(this._err(i.unexpectedCharacterInUnquotedAttributeValue),this.currentAttr.value+=je(e)):e===s.EOF?(this._err(i.eofInTag),this._emitEOFToken()):this.currentAttr.value+=je(e)}[V](e){He(e)?this._leaveAttrValue(U):e===s.SOLIDUS?this._leaveAttrValue(q):e===s.GREATER_THAN_SIGN?(this._leaveAttrValue(u),this._emitCurrentToken()):e===s.EOF?(this._err(i.eofInTag),this._emitEOFToken()):(this._err(i.missingWhitespaceBetweenAttributes),this._reconsumeInState(U))}[q](e){e===s.GREATER_THAN_SIGN?(this.currentToken.selfClosing=!0,this.state=u,this._emitCurrentToken()):e===s.EOF?(this._err(i.eofInTag),this._emitEOFToken()):(this._err(i.unexpectedSolidusInTag),this._reconsumeInState(U))}[X](e){e===s.GREATER_THAN_SIGN?(this.state=u,this._emitCurrentToken()):e===s.EOF?(this._emitCurrentToken(),this._emitEOFToken()):e===s.NULL?(this._err(i.unexpectedNullCharacter),this.currentToken.data+=r.REPLACEMENT_CHARACTER):this.currentToken.data+=je(e)}[J](e){this._consumeSequenceIfMatch(l.DASH_DASH_STRING,e,!0)?(this._createCommentToken(),this.state=Z):this._consumeSequenceIfMatch(l.DOCTYPE_STRING,e,!1)?this.state=le:this._consumeSequenceIfMatch(l.CDATA_START_STRING,e,!0)?this.allowCDATA?this.state=_e:(this._err(i.cdataInHtmlContent),this._createCommentToken(),this.currentToken.data="[CDATA[",this.state=X):this._ensureHibernation()||(this._err(i.incorrectlyOpenedComment),this._createCommentToken(),this._reconsumeInState(X))}[Z](e){e===s.HYPHEN_MINUS?this.state=$:e===s.GREATER_THAN_SIGN?(this._err(i.abruptClosingOfEmptyComment),this.state=u,this._emitCurrentToken()):this._reconsumeInState(ee)}[$](e){e===s.HYPHEN_MINUS?this.state=ie:e===s.GREATER_THAN_SIGN?(this._err(i.abruptClosingOfEmptyComment),this.state=u,this._emitCurrentToken()):e===s.EOF?(this._err(i.eofInComment),this._emitCurrentToken(),this._emitEOFToken()):(this.currentToken.data+="-",this._reconsumeInState(ee))}[ee](e){e===s.HYPHEN_MINUS?this.state=ae:e===s.LESS_THAN_SIGN?(this.currentToken.data+="<",this.state=te):e===s.NULL?(this._err(i.unexpectedNullCharacter),this.currentToken.data+=r.REPLACEMENT_CHARACTER):e===s.EOF?(this._err(i.eofInComment),this._emitCurrentToken(),this._emitEOFToken()):this.currentToken.data+=je(e)}[te](e){e===s.EXCLAMATION_MARK?(this.currentToken.data+="!",this.state=ne):e===s.LESS_THAN_SIGN?this.currentToken.data+="!":this._reconsumeInState(ee)}[ne](e){e===s.HYPHEN_MINUS?this.state=oe:this._reconsumeInState(ee)}[oe](e){e===s.HYPHEN_MINUS?this.state=re:this._reconsumeInState(ae)}[re](e){e!==s.GREATER_THAN_SIGN&&e!==s.EOF&&this._err(i.nestedComment),this._reconsumeInState(ie)}[ae](e){e===s.HYPHEN_MINUS?this.state=ie:e===s.EOF?(this._err(i.eofInComment),this._emitCurrentToken(),this._emitEOFToken()):(this.currentToken.data+="-",this._reconsumeInState(ee))}[ie](e){e===s.GREATER_THAN_SIGN?(this.state=u,this._emitCurrentToken()):e===s.EXCLAMATION_MARK?this.state=se:e===s.HYPHEN_MINUS?this.currentToken.data+="-":e===s.EOF?(this._err(i.eofInComment),this._emitCurrentToken(),this._emitEOFToken()):(this.currentToken.data+="--",this._reconsumeInState(ee))}[se](e){e===s.HYPHEN_MINUS?(this.currentToken.data+="--!",this.state=ae):e===s.GREATER_THAN_SIGN?(this._err(i.incorrectlyClosedComment),this.state=u,this._emitCurrentToken()):e===s.EOF?(this._err(i.eofInComment),this._emitCurrentToken(),this._emitEOFToken()):(this.currentToken.data+="--!",this._reconsumeInState(ee))}[le](e){He(e)?this.state=ce:e===s.GREATER_THAN_SIGN?this._reconsumeInState(ce):e===s.EOF?(this._err(i.eofInDoctype),this._createDoctypeToken(null),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):(this._err(i.missingWhitespaceBeforeDoctypeName),this._reconsumeInState(ce))}[ce](e){He(e)||(Fe(e)?(this._createDoctypeToken(Ye(e)),this.state=ue):e===s.NULL?(this._err(i.unexpectedNullCharacter),this._createDoctypeToken(r.REPLACEMENT_CHARACTER),this.state=ue):e===s.GREATER_THAN_SIGN?(this._err(i.missingDoctypeName),this._createDoctypeToken(null),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this.state=u):e===s.EOF?(this._err(i.eofInDoctype),this._createDoctypeToken(null),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):(this._createDoctypeToken(je(e)),this.state=ue))}[ue](e){He(e)?this.state=de:e===s.GREATER_THAN_SIGN?(this.state=u,this._emitCurrentToken()):Fe(e)?this.currentToken.name+=Ye(e):e===s.NULL?(this._err(i.unexpectedNullCharacter),this.currentToken.name+=r.REPLACEMENT_CHARACTER):e===s.EOF?(this._err(i.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):this.currentToken.name+=je(e)}[de](e){He(e)||(e===s.GREATER_THAN_SIGN?(this.state=u,this._emitCurrentToken()):e===s.EOF?(this._err(i.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):this._consumeSequenceIfMatch(l.PUBLIC_STRING,e,!1)?this.state=pe:this._consumeSequenceIfMatch(l.SYSTEM_STRING,e,!1)?this.state=Ee:this._ensureHibernation()||(this._err(i.invalidCharacterSequenceAfterDoctypeName),this.currentToken.forceQuirks=!0,this._reconsumeInState(Se)))}[pe](e){He(e)?this.state=fe:e===s.QUOTATION_MARK?(this._err(i.missingWhitespaceAfterDoctypePublicKeyword),this.currentToken.publicId="",this.state=he):e===s.APOSTROPHE?(this._err(i.missingWhitespaceAfterDoctypePublicKeyword),this.currentToken.publicId="",this.state=me):e===s.GREATER_THAN_SIGN?(this._err(i.missingDoctypePublicIdentifier),this.currentToken.forceQuirks=!0,this.state=u,this._emitCurrentToken()):e===s.EOF?(this._err(i.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):(this._err(i.missingQuoteBeforeDoctypePublicIdentifier),this.currentToken.forceQuirks=!0,this._reconsumeInState(Se))}[fe](e){He(e)||(e===s.QUOTATION_MARK?(this.currentToken.publicId="",this.state=he):e===s.APOSTROPHE?(this.currentToken.publicId="",this.state=me):e===s.GREATER_THAN_SIGN?(this._err(i.missingDoctypePublicIdentifier),this.currentToken.forceQuirks=!0,this.state=u,this._emitCurrentToken()):e===s.EOF?(this._err(i.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):(this._err(i.missingQuoteBeforeDoctypePublicIdentifier),this.currentToken.forceQuirks=!0,this._reconsumeInState(Se)))}[he](e){e===s.QUOTATION_MARK?this.state=ge:e===s.NULL?(this._err(i.unexpectedNullCharacter),this.currentToken.publicId+=r.REPLACEMENT_CHARACTER):e===s.GREATER_THAN_SIGN?(this._err(i.abruptDoctypePublicIdentifier),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this.state=u):e===s.EOF?(this._err(i.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):this.currentToken.publicId+=je(e)}[me](e){e===s.APOSTROPHE?this.state=ge:e===s.NULL?(this._err(i.unexpectedNullCharacter),this.currentToken.publicId+=r.REPLACEMENT_CHARACTER):e===s.GREATER_THAN_SIGN?(this._err(i.abruptDoctypePublicIdentifier),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this.state=u):e===s.EOF?(this._err(i.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):this.currentToken.publicId+=je(e)}[ge](e){He(e)?this.state=Te:e===s.GREATER_THAN_SIGN?(this.state=u,this._emitCurrentToken()):e===s.QUOTATION_MARK?(this._err(i.missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers),this.currentToken.systemId="",this.state=Ae):e===s.APOSTROPHE?(this._err(i.missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers),this.currentToken.systemId="",this.state=ke):e===s.EOF?(this._err(i.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):(this._err(i.missingQuoteBeforeDoctypeSystemIdentifier),this.currentToken.forceQuirks=!0,this._reconsumeInState(Se))}[Te](e){He(e)||(e===s.GREATER_THAN_SIGN?(this._emitCurrentToken(),this.state=u):e===s.QUOTATION_MARK?(this.currentToken.systemId="",this.state=Ae):e===s.APOSTROPHE?(this.currentToken.systemId="",this.state=ke):e===s.EOF?(this._err(i.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):(this._err(i.missingQuoteBeforeDoctypeSystemIdentifier),this.currentToken.forceQuirks=!0,this._reconsumeInState(Se)))}[Ee](e){He(e)?this.state=be:e===s.QUOTATION_MARK?(this._err(i.missingWhitespaceAfterDoctypeSystemKeyword),this.currentToken.systemId="",this.state=Ae):e===s.APOSTROPHE?(this._err(i.missingWhitespaceAfterDoctypeSystemKeyword),this.currentToken.systemId="",this.state=ke):e===s.GREATER_THAN_SIGN?(this._err(i.missingDoctypeSystemIdentifier),this.currentToken.forceQuirks=!0,this.state=u,this._emitCurrentToken()):e===s.EOF?(this._err(i.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):(this._err(i.missingQuoteBeforeDoctypeSystemIdentifier),this.currentToken.forceQuirks=!0,this._reconsumeInState(Se))}[be](e){He(e)||(e===s.QUOTATION_MARK?(this.currentToken.systemId="",this.state=Ae):e===s.APOSTROPHE?(this.currentToken.systemId="",this.state=ke):e===s.GREATER_THAN_SIGN?(this._err(i.missingDoctypeSystemIdentifier),this.currentToken.forceQuirks=!0,this.state=u,this._emitCurrentToken()):e===s.EOF?(this._err(i.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):(this._err(i.missingQuoteBeforeDoctypeSystemIdentifier),this.currentToken.forceQuirks=!0,this._reconsumeInState(Se)))}[Ae](e){e===s.QUOTATION_MARK?this.state=ye:e===s.NULL?(this._err(i.unexpectedNullCharacter),this.currentToken.systemId+=r.REPLACEMENT_CHARACTER):e===s.GREATER_THAN_SIGN?(this._err(i.abruptDoctypeSystemIdentifier),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this.state=u):e===s.EOF?(this._err(i.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):this.currentToken.systemId+=je(e)}[ke](e){e===s.APOSTROPHE?this.state=ye:e===s.NULL?(this._err(i.unexpectedNullCharacter),this.currentToken.systemId+=r.REPLACEMENT_CHARACTER):e===s.GREATER_THAN_SIGN?(this._err(i.abruptDoctypeSystemIdentifier),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this.state=u):e===s.EOF?(this._err(i.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):this.currentToken.systemId+=je(e)}[ye](e){He(e)||(e===s.GREATER_THAN_SIGN?(this._emitCurrentToken(),this.state=u):e===s.EOF?(this._err(i.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):(this._err(i.unexpectedCharacterAfterDoctypeSystemIdentifier),this._reconsumeInState(Se)))}[Se](e){e===s.GREATER_THAN_SIGN?(this._emitCurrentToken(),this.state=u):e===s.NULL?this._err(i.unexpectedNullCharacter):e===s.EOF&&(this._emitCurrentToken(),this._emitEOFToken())}[_e](e){e===s.RIGHT_SQUARE_BRACKET?this.state=Ce:e===s.EOF?(this._err(i.eofInCdata),this._emitEOFToken()):this._emitCodePoint(e)}[Ce](e){e===s.RIGHT_SQUARE_BRACKET?this.state=xe:(this._emitChars("]"),this._reconsumeInState(_e))}[xe](e){e===s.GREATER_THAN_SIGN?this.state=u:e===s.RIGHT_SQUARE_BRACKET?this._emitChars("]"):(this._emitChars("]]"),this._reconsumeInState(_e))}[Oe](e){this.tempBuff=[s.AMPERSAND],e===s.NUMBER_SIGN?(this.tempBuff.push(e),this.state=Me):Ue(e)?this._reconsumeInState(Ne):(this._flushCodePointsConsumedAsCharacterReference(),this._reconsumeInState(this.returnState))}[Ne](e){const t=this._matchNamedCharacterReference(e);if(this._ensureHibernation())this.tempBuff=[s.AMPERSAND];else if(t){const e=this.tempBuff[this.tempBuff.length-1]===s.SEMICOLON;this._isCharacterReferenceAttributeQuirk(e)||(e||this._errOnNextCodePoint(i.missingSemicolonAfterCharacterReference),this.tempBuff=t),this._flushCodePointsConsumedAsCharacterReference(),this.state=this.returnState}else this._flushCodePointsConsumedAsCharacterReference(),this.state=ve}[ve](e){Ue(e)?this._isCharacterReferenceInAttribute()?this.currentAttr.value+=je(e):this._emitCodePoint(e):(e===s.SEMICOLON&&this._err(i.unknownNamedCharacterReference),this._reconsumeInState(this.returnState))}[Me](e){this.charRefCode=0,e===s.LATIN_SMALL_X||e===s.LATIN_CAPITAL_X?(this.tempBuff.push(e),this.state=Re):this._reconsumeInState(we)}[Re](e){!function(e){return De(e)||Ge(e)||We(e)}(e)?(this._err(i.absenceOfDigitsInNumericCharacterReference),this._flushCodePointsConsumedAsCharacterReference(),this._reconsumeInState(this.returnState)):this._reconsumeInState(Ie)}[we](e){De(e)?this._reconsumeInState(Le):(this._err(i.absenceOfDigitsInNumericCharacterReference),this._flushCodePointsConsumedAsCharacterReference(),this._reconsumeInState(this.returnState))}[Ie](e){Ge(e)?this.charRefCode=16*this.charRefCode+e-55:We(e)?this.charRefCode=16*this.charRefCode+e-87:De(e)?this.charRefCode=16*this.charRefCode+e-48:e===s.SEMICOLON?this.state=Pe:(this._err(i.missingSemicolonAfterCharacterReference),this._reconsumeInState(Pe))}[Le](e){De(e)?this.charRefCode=10*this.charRefCode+e-48:e===s.SEMICOLON?this.state=Pe:(this._err(i.missingSemicolonAfterCharacterReference),this._reconsumeInState(Pe))}[Pe](){if(this.charRefCode===s.NULL)this._err(i.nullCharacterReference),this.charRefCode=s.REPLACEMENT_CHARACTER;else if(this.charRefCode>1114111)this._err(i.characterReferenceOutsideUnicodeRange),this.charRefCode=s.REPLACEMENT_CHARACTER;else if(r.isSurrogate(this.charRefCode))this._err(i.surrogateCharacterReference),this.charRefCode=s.REPLACEMENT_CHARACTER;else if(r.isUndefinedCodePoint(this.charRefCode))this._err(i.noncharacterCharacterReference);else if(r.isControlCodePoint(this.charRefCode)||this.charRefCode===s.CARRIAGE_RETURN){this._err(i.controlCharacterReference);const e=c[this.charRefCode];e&&(this.charRefCode=e)}this.tempBuff=[this.charRefCode],this._flushCodePointsConsumedAsCharacterReference(),this._reconsumeInState(this.returnState)}}Ve.CHARACTER_TOKEN="CHARACTER_TOKEN",Ve.NULL_CHARACTER_TOKEN="NULL_CHARACTER_TOKEN",Ve.WHITESPACE_CHARACTER_TOKEN="WHITESPACE_CHARACTER_TOKEN",Ve.START_TAG_TOKEN="START_TAG_TOKEN",Ve.END_TAG_TOKEN="END_TAG_TOKEN",Ve.COMMENT_TOKEN="COMMENT_TOKEN",Ve.DOCTYPE_TOKEN="DOCTYPE_TOKEN",Ve.EOF_TOKEN="EOF_TOKEN",Ve.HIBERNATION_TOKEN="HIBERNATION_TOKEN",Ve.MODE={DATA:u,RCDATA:d,RAWTEXT:p,SCRIPT_DATA:f,PLAINTEXT:h},Ve.getTokenAttr=function(e,t){for(let n=e.attrs.length-1;n>=0;n--)if(e.attrs[n].name===t)return e.attrs[n].value;return null},e.exports=Ve}}]); \ No newline at end of file diff --git a/_next/static/chunks/226daff62b2d4bc1e9a7210a7f6000a544319a74.45f8ee3fa1e207d4a680.js b/_next/static/chunks/226daff62b2d4bc1e9a7210a7f6000a544319a74.45f8ee3fa1e207d4a680.js new file mode 100644 index 000000000..aefa0e303 --- /dev/null +++ b/_next/static/chunks/226daff62b2d4bc1e9a7210a7f6000a544319a74.45f8ee3fa1e207d4a680.js @@ -0,0 +1 @@ +(window.webpackJsonp_N_E=window.webpackJsonp_N_E||[]).push([[3],{"8OQS":function(t,r){t.exports=function(t,r){if(null==t)return{};var e,o,n={},i=Object.keys(t);for(o=0;o=0||(n[e]=t[e]);return n}},"9/5/":function(t,r,e){(function(r){var e=/^\s+|\s+$/g,o=/^[-+]0x[0-9a-f]+$/i,n=/^0b[01]+$/i,i=/^0o[0-7]+$/i,a=parseInt,p="object"==typeof r&&r&&r.Object===Object&&r,y="object"==typeof self&&self&&self.Object===Object&&self,c=p||y||Function("return this")(),f=Object.prototype.toString,u=Math.max,l=Math.min,s=function(){return c.Date.now()};function d(t){var r=typeof t;return!!t&&("object"==r||"function"==r)}function A(t){if("number"==typeof t)return t;if(function(t){return"symbol"==typeof t||function(t){return!!t&&"object"==typeof t}(t)&&"[object Symbol]"==f.call(t)}(t))return NaN;if(d(t)){var r="function"==typeof t.valueOf?t.valueOf():t;t=d(r)?r+"":r}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(e,"");var p=n.test(t);return p||i.test(t)?a(t.slice(2),p?2:8):o.test(t)?NaN:+t}t.exports=function(t,r,e){var o,n,i,a,p,y,c=0,f=!1,b=!1,g=!0;if("function"!=typeof t)throw new TypeError("Expected a function");function m(r){var e=o,i=n;return o=n=void 0,c=r,a=t.apply(i,e)}function P(t){return c=t,p=setTimeout(h,r),f?m(t):a}function v(t){var e=t-y;return void 0===y||e>=r||e<0||b&&t-c>=i}function h(){var t=s();if(v(t))return S(t);p=setTimeout(h,function(t){var e=r-(t-y);return b?l(e,i-(t-c)):e}(t))}function S(t){return p=void 0,g&&o?m(t):(o=n=void 0,a)}function O(){var t=s(),e=v(t);if(o=arguments,n=this,y=t,e){if(void 0===p)return P(y);if(b)return p=setTimeout(h,r),m(y)}return void 0===p&&(p=setTimeout(h,r)),a}return r=A(r)||0,d(e)&&(f=!!e.leading,i=(b="maxWait"in e)?u(A(e.maxWait)||0,r):i,g="trailing"in e?!!e.trailing:g),O.cancel=function(){void 0!==p&&clearTimeout(p),c=0,o=y=n=p=void 0},O.flush=function(){return void 0===p?a:S(s())},O}}).call(this,e("ntbh"))},AM7I:function(t,r,e){"use strict";var o,n=SyntaxError,i=Function,a=TypeError,p=function(t){try{return i('"use strict"; return ('+t+").constructor;")()}catch(r){}},y=Object.getOwnPropertyDescriptor;if(y)try{y({},"")}catch(R){y=null}var c=function(){throw new a},f=y?function(){try{return c}catch(t){try{return y(arguments,"callee").get}catch(r){return c}}}():c,u=e("UVaH")(),l=e("CjYj")(),s=Object.getPrototypeOf||(l?function(t){return t.__proto__}:null),d={},A="undefined"!==typeof Uint8Array&&s?s(Uint8Array):o,b={"%AggregateError%":"undefined"===typeof AggregateError?o:AggregateError,"%Array%":Array,"%ArrayBuffer%":"undefined"===typeof ArrayBuffer?o:ArrayBuffer,"%ArrayIteratorPrototype%":u&&s?s([][Symbol.iterator]()):o,"%AsyncFromSyncIteratorPrototype%":o,"%AsyncFunction%":d,"%AsyncGenerator%":d,"%AsyncGeneratorFunction%":d,"%AsyncIteratorPrototype%":d,"%Atomics%":"undefined"===typeof Atomics?o:Atomics,"%BigInt%":"undefined"===typeof BigInt?o:BigInt,"%BigInt64Array%":"undefined"===typeof BigInt64Array?o:BigInt64Array,"%BigUint64Array%":"undefined"===typeof BigUint64Array?o:BigUint64Array,"%Boolean%":Boolean,"%DataView%":"undefined"===typeof DataView?o:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":Error,"%eval%":eval,"%EvalError%":EvalError,"%Float32Array%":"undefined"===typeof Float32Array?o:Float32Array,"%Float64Array%":"undefined"===typeof Float64Array?o:Float64Array,"%FinalizationRegistry%":"undefined"===typeof FinalizationRegistry?o:FinalizationRegistry,"%Function%":i,"%GeneratorFunction%":d,"%Int8Array%":"undefined"===typeof Int8Array?o:Int8Array,"%Int16Array%":"undefined"===typeof Int16Array?o:Int16Array,"%Int32Array%":"undefined"===typeof Int32Array?o:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":u&&s?s(s([][Symbol.iterator]())):o,"%JSON%":"object"===typeof JSON?JSON:o,"%Map%":"undefined"===typeof Map?o:Map,"%MapIteratorPrototype%":"undefined"!==typeof Map&&u&&s?s((new Map)[Symbol.iterator]()):o,"%Math%":Math,"%Number%":Number,"%Object%":Object,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":"undefined"===typeof Promise?o:Promise,"%Proxy%":"undefined"===typeof Proxy?o:Proxy,"%RangeError%":RangeError,"%ReferenceError%":ReferenceError,"%Reflect%":"undefined"===typeof Reflect?o:Reflect,"%RegExp%":RegExp,"%Set%":"undefined"===typeof Set?o:Set,"%SetIteratorPrototype%":"undefined"!==typeof Set&&u&&s?s((new Set)[Symbol.iterator]()):o,"%SharedArrayBuffer%":"undefined"===typeof SharedArrayBuffer?o:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":u&&s?s(""[Symbol.iterator]()):o,"%Symbol%":u?Symbol:o,"%SyntaxError%":n,"%ThrowTypeError%":f,"%TypedArray%":A,"%TypeError%":a,"%Uint8Array%":"undefined"===typeof Uint8Array?o:Uint8Array,"%Uint8ClampedArray%":"undefined"===typeof Uint8ClampedArray?o:Uint8ClampedArray,"%Uint16Array%":"undefined"===typeof Uint16Array?o:Uint16Array,"%Uint32Array%":"undefined"===typeof Uint32Array?o:Uint32Array,"%URIError%":URIError,"%WeakMap%":"undefined"===typeof WeakMap?o:WeakMap,"%WeakRef%":"undefined"===typeof WeakRef?o:WeakRef,"%WeakSet%":"undefined"===typeof WeakSet?o:WeakSet};if(s)try{null.error}catch(R){var g=s(s(R));b["%Error.prototype%"]=g}var m=function t(r){var e;if("%AsyncFunction%"===r)e=p("async function () {}");else if("%GeneratorFunction%"===r)e=p("function* () {}");else if("%AsyncGeneratorFunction%"===r)e=p("async function* () {}");else if("%AsyncGenerator%"===r){var o=t("%AsyncGeneratorFunction%");o&&(e=o.prototype)}else if("%AsyncIteratorPrototype%"===r){var n=t("%AsyncGenerator%");n&&s&&(e=s(n.prototype))}return b[r]=e,e},P={"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},v=e("D3zA"),h=e("oNNP"),S=v.call(Function.call,Array.prototype.concat),O=v.call(Function.apply,Array.prototype.splice),w=v.call(Function.call,String.prototype.replace),E=v.call(Function.call,String.prototype.slice),j=v.call(Function.call,RegExp.prototype.exec),F=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,I=/\\(\\)?/g,x=function(t){var r=E(t,0,1),e=E(t,-1);if("%"===r&&"%"!==e)throw new n("invalid intrinsic syntax, expected closing `%`");if("%"===e&&"%"!==r)throw new n("invalid intrinsic syntax, expected opening `%`");var o=[];return w(t,F,(function(t,r,e,n){o[o.length]=e?w(n,I,"$1"):r||t})),o},U=function(t,r){var e,o=t;if(h(P,o)&&(o="%"+(e=P[o])[0]+"%"),h(b,o)){var i=b[o];if(i===d&&(i=m(o)),"undefined"===typeof i&&!r)throw new a("intrinsic "+t+" exists, but is not available. Please file an issue!");return{alias:e,name:o,value:i}}throw new n("intrinsic "+t+" does not exist!")};t.exports=function(t,r){if("string"!==typeof t||0===t.length)throw new a("intrinsic name must be a non-empty string");if(arguments.length>1&&"boolean"!==typeof r)throw new a('"allowMissing" argument must be a boolean');if(null===j(/^%?[^%]*%?$/,t))throw new n("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var e=x(t),o=e.length>0?e[0]:"",i=U("%"+o+"%",r),p=i.name,c=i.value,f=!1,u=i.alias;u&&(o=u[0],O(e,S([0,1],u)));for(var l=1,s=!0;l=e.length){var m=y(c,d);c=(s=!!m)&&"get"in m&&!("originalValue"in m.get)?m.get:c[d]}else s=h(c,d),c=c[d];s&&!f&&(b[p]=c)}}return c}},CjYj:function(t,r,e){"use strict";var o={foo:{}},n=Object;t.exports=function(){return{__proto__:o}.foo===o.foo&&!({__proto__:null}instanceof n)}},D3zA:function(t,r,e){"use strict";var o=e("aI7X");t.exports=Function.prototype.bind||o},FpZJ:function(t,r,e){"use strict";t.exports=function(){if("function"!==typeof Symbol||"function"!==typeof Object.getOwnPropertySymbols)return!1;if("symbol"===typeof Symbol.iterator)return!0;var t={},r=Symbol("test"),e=Object(r);if("string"===typeof r)return!1;if("[object Symbol]"!==Object.prototype.toString.call(r))return!1;if("[object Symbol]"!==Object.prototype.toString.call(e))return!1;for(r in t[r]=42,t)return!1;if("function"===typeof Object.keys&&0!==Object.keys(t).length)return!1;if("function"===typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(t).length)return!1;var o=Object.getOwnPropertySymbols(t);if(1!==o.length||o[0]!==r)return!1;if(!Object.prototype.propertyIsEnumerable.call(t,r))return!1;if("function"===typeof Object.getOwnPropertyDescriptor){var n=Object.getOwnPropertyDescriptor(t,r);if(42!==n.value||!0!==n.enumerable)return!1}return!0}},PrET:function(t,r,e){"use strict";var o=e("D3zA"),n=e("AM7I"),i=n("%Function.prototype.apply%"),a=n("%Function.prototype.call%"),p=n("%Reflect.apply%",!0)||o.call(a,i),y=n("%Object.getOwnPropertyDescriptor%",!0),c=n("%Object.defineProperty%",!0),f=n("%Math.max%");if(c)try{c({},"a",{value:1})}catch(l){c=null}t.exports=function(t){var r=p(o,a,arguments);if(y&&c){var e=y(r,"length");e.configurable&&c(r,"length",{value:1+f(0,t.length-(arguments.length-1))})}return r};var u=function(){return p(o,i,arguments)};c?c(t.exports,"apply",{value:u}):t.exports.apply=u},RLeF:function(t,r,e){"use strict";t.exports=e("PrET")},UVaH:function(t,r,e){"use strict";var o="undefined"!==typeof Symbol&&Symbol,n=e("FpZJ");t.exports=function(){return"function"===typeof o&&("function"===typeof Symbol&&("symbol"===typeof o("foo")&&("symbol"===typeof Symbol("bar")&&n())))}},VbXa:function(t,r){t.exports=function(t,r){t.prototype=Object.create(r.prototype),t.prototype.constructor=t,t.__proto__=r}},aI7X:function(t,r,e){"use strict";var o="Function.prototype.bind called on incompatible ",n=Array.prototype.slice,i=Object.prototype.toString,a="[object Function]";t.exports=function(t){var r=this;if("function"!==typeof r||i.call(r)!==a)throw new TypeError(o+r);for(var e,p=n.call(arguments,1),y=function(){if(this instanceof e){var o=r.apply(this,p.concat(n.call(arguments)));return Object(o)===o?o:this}return r.apply(t,p.concat(n.call(arguments)))},c=Math.max(0,r.length-p.length),f=[],u=0;ut.length)&&(r=t.length);for(var e=0,o=new Array(r);e=0||(n[e]=t[e]);return n},t.exports.__esModule=!0,t.exports.default=t.exports},"9/5/":function(t,r,e){(function(r){var e=/^\s+|\s+$/g,o=/^[-+]0x[0-9a-f]+$/i,n=/^0b[01]+$/i,i=/^0o[0-7]+$/i,p=parseInt,a="object"==typeof r&&r&&r.Object===Object&&r,y="object"==typeof self&&self&&self.Object===Object&&self,u=a||y||Function("return this")(),f=Object.prototype.toString,c=Math.max,s=Math.min,l=function(){return u.Date.now()};function d(t){var r=typeof t;return!!t&&("object"==r||"function"==r)}function b(t){if("number"==typeof t)return t;if(function(t){return"symbol"==typeof t||function(t){return!!t&&"object"==typeof t}(t)&&"[object Symbol]"==f.call(t)}(t))return NaN;if(d(t)){var r="function"==typeof t.valueOf?t.valueOf():t;t=d(r)?r+"":r}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(e,"");var a=n.test(t);return a||i.test(t)?p(t.slice(2),a?2:8):o.test(t)?NaN:+t}t.exports=function(t,r,e){var o,n,i,p,a,y,u=0,f=!1,m=!1,A=!0;if("function"!=typeof t)throw new TypeError("Expected a function");function x(r){var e=o,i=n;return o=n=void 0,u=r,p=t.apply(i,e)}function g(t){return u=t,a=setTimeout(P,r),f?x(t):p}function v(t){var e=t-y;return void 0===y||e>=r||e<0||m&&t-u>=i}function P(){var t=l();if(v(t))return h(t);a=setTimeout(P,function(t){var e=r-(t-y);return m?s(e,i-(t-u)):e}(t))}function h(t){return a=void 0,A&&o?x(t):(o=n=void 0,p)}function S(){var t=l(),e=v(t);if(o=arguments,n=this,y=t,e){if(void 0===a)return g(y);if(m)return a=setTimeout(P,r),x(y)}return void 0===a&&(a=setTimeout(P,r)),p}return r=b(r)||0,d(e)&&(f=!!e.leading,i=(m="maxWait"in e)?c(b(e.maxWait)||0,r):i,A="trailing"in e?!!e.trailing:A),S.cancel=function(){void 0!==a&&clearTimeout(a),u=0,o=y=n=a=void 0},S.flush=function(){return void 0===a?p:h(l())},S}}).call(this,e("ntbh"))},AM7I:function(t,r,e){"use strict";var o,n=SyntaxError,i=Function,p=TypeError,a=function(t){try{return i('"use strict"; return ('+t+").constructor;")()}catch(r){}},y=Object.getOwnPropertyDescriptor;if(y)try{y({},"")}catch(F){y=null}var u=function(){throw new p},f=y?function(){try{return u}catch(t){try{return y(arguments,"callee").get}catch(r){return u}}}():u,c=e("UVaH")(),s=Object.getPrototypeOf||function(t){return t.__proto__},l={},d="undefined"===typeof Uint8Array?o:s(Uint8Array),b={"%AggregateError%":"undefined"===typeof AggregateError?o:AggregateError,"%Array%":Array,"%ArrayBuffer%":"undefined"===typeof ArrayBuffer?o:ArrayBuffer,"%ArrayIteratorPrototype%":c?s([][Symbol.iterator]()):o,"%AsyncFromSyncIteratorPrototype%":o,"%AsyncFunction%":l,"%AsyncGenerator%":l,"%AsyncGeneratorFunction%":l,"%AsyncIteratorPrototype%":l,"%Atomics%":"undefined"===typeof Atomics?o:Atomics,"%BigInt%":"undefined"===typeof BigInt?o:BigInt,"%Boolean%":Boolean,"%DataView%":"undefined"===typeof DataView?o:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":Error,"%eval%":eval,"%EvalError%":EvalError,"%Float32Array%":"undefined"===typeof Float32Array?o:Float32Array,"%Float64Array%":"undefined"===typeof Float64Array?o:Float64Array,"%FinalizationRegistry%":"undefined"===typeof FinalizationRegistry?o:FinalizationRegistry,"%Function%":i,"%GeneratorFunction%":l,"%Int8Array%":"undefined"===typeof Int8Array?o:Int8Array,"%Int16Array%":"undefined"===typeof Int16Array?o:Int16Array,"%Int32Array%":"undefined"===typeof Int32Array?o:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":c?s(s([][Symbol.iterator]())):o,"%JSON%":"object"===typeof JSON?JSON:o,"%Map%":"undefined"===typeof Map?o:Map,"%MapIteratorPrototype%":"undefined"!==typeof Map&&c?s((new Map)[Symbol.iterator]()):o,"%Math%":Math,"%Number%":Number,"%Object%":Object,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":"undefined"===typeof Promise?o:Promise,"%Proxy%":"undefined"===typeof Proxy?o:Proxy,"%RangeError%":RangeError,"%ReferenceError%":ReferenceError,"%Reflect%":"undefined"===typeof Reflect?o:Reflect,"%RegExp%":RegExp,"%Set%":"undefined"===typeof Set?o:Set,"%SetIteratorPrototype%":"undefined"!==typeof Set&&c?s((new Set)[Symbol.iterator]()):o,"%SharedArrayBuffer%":"undefined"===typeof SharedArrayBuffer?o:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":c?s(""[Symbol.iterator]()):o,"%Symbol%":c?Symbol:o,"%SyntaxError%":n,"%ThrowTypeError%":f,"%TypedArray%":d,"%TypeError%":p,"%Uint8Array%":"undefined"===typeof Uint8Array?o:Uint8Array,"%Uint8ClampedArray%":"undefined"===typeof Uint8ClampedArray?o:Uint8ClampedArray,"%Uint16Array%":"undefined"===typeof Uint16Array?o:Uint16Array,"%Uint32Array%":"undefined"===typeof Uint32Array?o:Uint32Array,"%URIError%":URIError,"%WeakMap%":"undefined"===typeof WeakMap?o:WeakMap,"%WeakRef%":"undefined"===typeof WeakRef?o:WeakRef,"%WeakSet%":"undefined"===typeof WeakSet?o:WeakSet},m=function t(r){var e;if("%AsyncFunction%"===r)e=a("async function () {}");else if("%GeneratorFunction%"===r)e=a("function* () {}");else if("%AsyncGeneratorFunction%"===r)e=a("async function* () {}");else if("%AsyncGenerator%"===r){var o=t("%AsyncGeneratorFunction%");o&&(e=o.prototype)}else if("%AsyncIteratorPrototype%"===r){var n=t("%AsyncGenerator%");n&&(e=s(n.prototype))}return b[r]=e,e},A={"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},x=e("D3zA"),g=e("oNNP"),v=x.call(Function.call,Array.prototype.concat),P=x.call(Function.apply,Array.prototype.splice),h=x.call(Function.call,String.prototype.replace),S=x.call(Function.call,String.prototype.slice),O=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,w=/\\(\\)?/g,j=function(t){var r=S(t,0,1),e=S(t,-1);if("%"===r&&"%"!==e)throw new n("invalid intrinsic syntax, expected closing `%`");if("%"===e&&"%"!==r)throw new n("invalid intrinsic syntax, expected opening `%`");var o=[];return h(t,O,(function(t,r,e,n){o[o.length]=e?h(n,w,"$1"):r||t})),o},E=function(t,r){var e,o=t;if(g(A,o)&&(o="%"+(e=A[o])[0]+"%"),g(b,o)){var i=b[o];if(i===l&&(i=m(o)),"undefined"===typeof i&&!r)throw new p("intrinsic "+t+" exists, but is not available. Please file an issue!");return{alias:e,name:o,value:i}}throw new n("intrinsic "+t+" does not exist!")};t.exports=function(t,r){if("string"!==typeof t||0===t.length)throw new p("intrinsic name must be a non-empty string");if(arguments.length>1&&"boolean"!==typeof r)throw new p('"allowMissing" argument must be a boolean');var e=j(t),o=e.length>0?e[0]:"",i=E("%"+o+"%",r),a=i.name,u=i.value,f=!1,c=i.alias;c&&(o=c[0],P(e,v([0,1],c)));for(var s=1,l=!0;s=e.length){var x=y(u,d);u=(l=!!x)&&"get"in x&&!("originalValue"in x.get)?x.get:u[d]}else l=g(u,d),u=u[d];l&&!f&&(b[a]=u)}}return u}},"C+bE":function(t,r){function e(r){return"function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?t.exports=e=function(t){return typeof t}:t.exports=e=function(t){return t&&"function"===typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},e(r)}t.exports=e},D3zA:function(t,r,e){"use strict";var o=e("aI7X");t.exports=Function.prototype.bind||o},FpZJ:function(t,r,e){"use strict";t.exports=function(){if("function"!==typeof Symbol||"function"!==typeof Object.getOwnPropertySymbols)return!1;if("symbol"===typeof Symbol.iterator)return!0;var t={},r=Symbol("test"),e=Object(r);if("string"===typeof r)return!1;if("[object Symbol]"!==Object.prototype.toString.call(r))return!1;if("[object Symbol]"!==Object.prototype.toString.call(e))return!1;for(r in t[r]=42,t)return!1;if("function"===typeof Object.keys&&0!==Object.keys(t).length)return!1;if("function"===typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(t).length)return!1;var o=Object.getOwnPropertySymbols(t);if(1!==o.length||o[0]!==r)return!1;if(!Object.prototype.propertyIsEnumerable.call(t,r))return!1;if("function"===typeof Object.getOwnPropertyDescriptor){var n=Object.getOwnPropertyDescriptor(t,r);if(42!==n.value||!0!==n.enumerable)return!1}return!0}},KckH:function(t,r,e){var o=e("7eYB");t.exports=function(t,r){if(t){if("string"===typeof t)return o(t,r);var e=Object.prototype.toString.call(t).slice(8,-1);return"Object"===e&&t.constructor&&(e=t.constructor.name),"Map"===e||"Set"===e?Array.from(t):"Arguments"===e||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e)?o(t,r):void 0}}},PJYZ:function(t,r){t.exports=function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t},t.exports.__esModule=!0,t.exports.default=t.exports},PrET:function(t,r,e){"use strict";var o=e("D3zA"),n=e("AM7I"),i=n("%Function.prototype.apply%"),p=n("%Function.prototype.call%"),a=n("%Reflect.apply%",!0)||o.call(p,i),y=n("%Object.getOwnPropertyDescriptor%",!0),u=n("%Object.defineProperty%",!0),f=n("%Math.max%");if(u)try{u({},"a",{value:1})}catch(s){u=null}t.exports=function(t){var r=a(o,p,arguments);if(y&&u){var e=y(r,"length");e.configurable&&u(r,"length",{value:1+f(0,t.length-(arguments.length-1))})}return r};var c=function(){return a(o,i,arguments)};u?u(t.exports,"apply",{value:c}):t.exports.apply=c},Qetd:function(t,r,e){"use strict";var o=Object.assign.bind(Object);t.exports=o,t.exports.default=t.exports},RLeF:function(t,r,e){"use strict";t.exports=e("PrET")},SksO:function(t,r){function e(r,o){return t.exports=e=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,r){return t.__proto__=r,t},t.exports.__esModule=!0,t.exports.default=t.exports,e(r,o)}t.exports=e,t.exports.__esModule=!0,t.exports.default=t.exports},UVaH:function(t,r,e){"use strict";var o="undefined"!==typeof Symbol&&Symbol,n=e("FpZJ");t.exports=function(){return"function"===typeof o&&("function"===typeof Symbol&&("symbol"===typeof o("foo")&&("symbol"===typeof Symbol("bar")&&n())))}},VbXa:function(t,r,e){var o=e("SksO");t.exports=function(t,r){t.prototype=Object.create(r.prototype),t.prototype.constructor=t,o(t,r)},t.exports.__esModule=!0,t.exports.default=t.exports},aI7X:function(t,r,e){"use strict";var o="Function.prototype.bind called on incompatible ",n=Array.prototype.slice,i=Object.prototype.toString,p="[object Function]";t.exports=function(t){var r=this;if("function"!==typeof r||i.call(r)!==p)throw new TypeError(o+r);for(var e,a=n.call(arguments,1),y=function(){if(this instanceof e){var o=r.apply(this,a.concat(n.call(arguments)));return Object(o)===o?o:this}return r.apply(t,a.concat(n.call(arguments)))},u=Math.max(0,r.length-a.length),f=[],c=0;c1?t-1:0),n=1;n1&&void 0!==arguments[1]?arguments[1]:"",r="/"===e?"/index":/^\/index(\/|$)/.test(e)?"/index".concat(e):"".concat(e);return r+t}},Nh2W:function(e,t,r){"use strict";var n=r("TqRt");t.__esModule=!0,t.markAssetError=u,t.isAssetError=function(e){return e&&s in e},t.getClientBuildManifest=l,t.default=void 0;n(r("Lab5"));var a=r("0G5g");function o(e,t,r){var n,a=t.get(e);if(a)return"future"in a?a.future:Promise.resolve(a);var o=new Promise((function(e){n=e}));return t.set(e,a={resolve:n,future:o}),r?r().then((function(e){return n(e),e})):o}var i=function(e){try{return e=document.createElement("link"),!!window.MSInputMethodContext&&!!document.documentMode||e.relList.supports("prefetch")}catch(t){return!1}}();var s=Symbol("ASSET_LOAD_ERROR");function u(e){return Object.defineProperty(e,s,{})}function c(e,t,r){return new Promise((function(n,o){var i=!1;e.then((function(e){i=!0,n(e)})).catch(o),(0,a.requestIdleCallback)((function(){return setTimeout((function(){i||o(r)}),t)}))}))}function l(){return self.__BUILD_MANIFEST?Promise.resolve(self.__BUILD_MANIFEST):c(new Promise((function(e){var t=self.__BUILD_MANIFEST_CB;self.__BUILD_MANIFEST_CB=function(){e(self.__BUILD_MANIFEST),t&&t()}})),3800,u(new Error("Failed to load client build manifest")))}function h(e,t){return l().then((function(r){if(!(t in r))throw u(new Error("Failed to lookup route: ".concat(t)));var n=r[t].map((function(t){return e+"/_next/"+encodeURI(t)}));return{scripts:n.filter((function(e){return e.endsWith(".js")})),css:n.filter((function(e){return e.endsWith(".css")}))}}))}var f=function(e){var t=new Map,r=new Map,n=new Map,s=new Map;function l(e){var t=r.get(e);return t||(document.querySelector('script[src^="'.concat(e,'"]'))?Promise.resolve():(r.set(e,t=function(e,t){return new Promise((function(r,n){(t=document.createElement("script")).onload=r,t.onerror=function(){return n(u(new Error("Failed to load script: ".concat(e))))},t.crossOrigin=void 0,t.src=e,document.body.appendChild(t)}))}(e)),t))}function f(e){var t=n.get(e);return t||(n.set(e,t=fetch(e).then((function(t){if(!t.ok)throw new Error("Failed to load stylesheet: ".concat(e));return t.text().then((function(t){return{href:e,content:t}}))})).catch((function(e){throw u(e)}))),t)}return{whenEntrypoint:function(e){return o(e,t)},onEntrypoint:function(e,r){Promise.resolve(r).then((function(e){return e()})).then((function(e){return{component:e&&e.default||e,exports:e}}),(function(e){return{error:e}})).then((function(r){var n=t.get(e);t.set(e,r),n&&"resolve"in n&&n.resolve(r)}))},loadRoute:function(r,n){var a=this;return o(r,s,(function(){return c(h(e,r).then((function(e){var n=e.scripts,a=e.css;return Promise.all([t.has(r)?[]:Promise.all(n.map(l)),Promise.all(a.map(f))])})).then((function(e){return a.whenEntrypoint(r).then((function(t){return{entrypoint:t,styles:e[1]}}))})),3800,u(new Error("Route did not complete loading: ".concat(r)))).then((function(e){var t=e.entrypoint,r=e.styles,n=Object.assign({styles:r},t);return"error"in t?t:n})).catch((function(e){if(n)throw e;return{error:e}}))}))},prefetch:function(t){var r,n=this;return(r=navigator.connection)&&(r.saveData||/2g/.test(r.effectiveType))?Promise.resolve():h(e,t).then((function(e){return Promise.all(i?e.scripts.map((function(e){return t=e,r="script",new Promise((function(e,a){if(document.querySelector('link[rel="prefetch"][href^="'.concat(t,'"]')))return e();n=document.createElement("link"),r&&(n.as=r),n.rel="prefetch",n.crossOrigin=void 0,n.onload=e,n.onerror=a,n.href=t,document.head.appendChild(n)}));var t,r,n})):[])})).then((function(){(0,a.requestIdleCallback)((function(){return n.loadRoute(t,!0).catch((function(){}))}))})).catch((function(){}))}}};t.default=f},"X24+":function(e,t,r){"use strict";function n(e){return e.endsWith("/")&&"/"!==e?e.slice(0,-1):e}t.__esModule=!0,t.removePathTrailingSlash=n,t.normalizePathTrailingSlash=void 0;var a=n;t.normalizePathTrailingSlash=a},YTqd:function(e,t,r){"use strict";t.__esModule=!0,t.getRouteRegex=function(e){var t=(e.replace(/\/$/,"")||"/").slice(1).split("/"),r={},n=1,a=t.map((function(e){if(e.startsWith("[")&&e.endsWith("]")){var t=function(e){var t=e.startsWith("[")&&e.endsWith("]");t&&(e=e.slice(1,-1));var r=e.startsWith("...");r&&(e=e.slice(3));return{key:e,repeat:r,optional:t}}(e.slice(1,-1)),a=t.key,o=t.optional,i=t.repeat;return r[a]={pos:n++,repeat:i,optional:o},i?o?"(?:/(.+?))?":"/(.+?)":"/([^/]+?)"}return"/".concat(e.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&"))})).join("");0;return{re:new RegExp("^".concat(a,"(?:/)?$")),groups:r}}},b48C:function(e,t){e.exports=function(){if("undefined"===typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"===typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}},dZ6Y:function(e,t,r){"use strict";t.__esModule=!0,t.default=function(){var e=Object.create(null);return{on:function(t,r){(e[t]||(e[t]=[])).push(r)},off:function(t,r){e[t]&&e[t].splice(e[t].indexOf(r)>>>0,1)},emit:function(t){for(var r=arguments.length,n=new Array(r>1?r-1:0),a=1;a-1||r>-1)&&(e=e.substring(0,t>-1?t:r)),e}function x(e){return""===(e=k(e))||e.startsWith("/")}function S(e){return function(e,t){return t&&e.startsWith("/")?"/"===e?(0,u.normalizePathTrailingSlash)(t):"".concat(t).concat("/"===k(e)?e.substring(1):e):e}(e,"")}function R(e){return(e=e.slice("".length)).startsWith("/")||(e="/".concat(e)),e}function C(e){if(e.startsWith("/")||e.startsWith("#"))return!0;try{var t=(0,f.getLocationOrigin)(),r=new URL(e,t);return r.origin===t&&x(r.pathname)}catch(n){return!1}}function E(e,t,r){var n="",a=(0,y.getRouteRegex)(e),o=a.groups,i=(t!==e?(0,g.getRouteMatcher)(a)(t):"")||r;n=e;var s=Object.keys(o);return s.every((function(e){var t=i[e]||"",r=o[e],a=r.repeat,s=r.optional,u="[".concat(a?"...":"").concat(e,"]");return s&&(u="".concat(t?"":"/","[").concat(u,"]")),a&&!Array.isArray(t)&&(t=[t]),(s||e in i)&&(n=n.replace(u,a?t.map((function(e){return encodeURIComponent(e)})).join("/"):encodeURIComponent(t))||"/")}))||(n=""),{params:s,result:n}}function L(e,t){var r={};return Object.keys(e).forEach((function(n){t.includes(n)||(r[n]=e[n])})),r}function I(e,t,r){var n;try{n=new URL(e,"http://n")}catch(m){n=new URL("/","http://n")}var a="string"===typeof t?t:(0,f.formatWithValidation)(t);if(!C(a))return r?[a]:a;try{var o=new URL(a,n);o.pathname=(0,u.normalizePathTrailingSlash)(o.pathname);var i="";if((0,p.isDynamicRoute)(o.pathname)&&o.searchParams&&r){var s=(0,v.searchParamsToUrlQuery)(o.searchParams),c=E(o.pathname,o.pathname,s),l=c.result,h=c.params;l&&(i=(0,f.formatWithValidation)({pathname:l,hash:o.hash,query:L(s,h)}))}var d=o.origin===n.origin?o.href.slice(o.origin.length):o.href;return r?[d,i||d]:d}catch(m){return r?[a]:a}}function O(e){var t=(0,f.getLocationOrigin)();return e.startsWith(t)?e.substring(t.length):e}function T(e,t,r){var n=I(e.asPath,t,!0),a=s(n,2),o=a[0],i=a[1],u=(0,f.getLocationOrigin)(),c=o.startsWith(u),l=i&&i.startsWith(u);o=O(o),i=i?O(i):i;var h=c?o:S(o),p=r?O(I(e.asPath,r)):i||o;return{url:h,as:l?p:S(p)}}function A(e,t){var r=(0,u.removePathTrailingSlash)((0,l.denormalizePagePath)(e));return"/404"===r||"/_error"===r?e:(t.includes(r)||t.some((function(t){if((0,p.isDynamicRoute)(t)&&(0,y.getRouteRegex)(t).re.test(r))return e=t,!0})),(0,u.removePathTrailingSlash)(e))}var D=Symbol("SSG_DATA_NOT_FOUND");function j(e,t){return fetch(e,{credentials:"same-origin"}).then((function(r){if(!r.ok){if(t>1&&r.status>=500)return j(e,t-1);if(404===r.status)return r.json().then((function(e){if(e.notFound)return{notFound:D};throw new Error("Failed to load static props")}));throw new Error("Failed to load static props")}return r.json()}))}function M(e,t){return j(e,t?3:1).catch((function(e){throw t||(0,c.markAssetError)(e),e}))}var U=function(){function e(t,r,n,a){var i=this,s=a.initialProps,c=a.pageLoader,l=a.App,h=a.wrapApp,v=a.Component,m=a.err,g=a.subscription,y=a.isFallback,_=a.locale,b=(a.locales,a.defaultLocale,a.domainLocales,a.isPreview);o(this,e),this.route=void 0,this.pathname=void 0,this.query=void 0,this.asPath=void 0,this.basePath=void 0,this.components=void 0,this.sdc={},this.sdr={},this.sub=void 0,this.clc=void 0,this.pageLoader=void 0,this._bps=void 0,this.events=void 0,this._wrapApp=void 0,this.isSsr=void 0,this.isFallback=void 0,this._inFlightRoute=void 0,this._shallow=void 0,this.locale=void 0,this.locales=void 0,this.defaultLocale=void 0,this.domainLocales=void 0,this.isReady=void 0,this.isPreview=void 0,this.isLocaleDomain=void 0,this._idx=0,this.onPopState=function(e){var t=e.state;if(t){if(t.__N){var r=t.url,n=t.as,a=t.options,o=t.idx;i._idx=o;var s=(0,d.parseRelativeUrl)(r).pathname;i.isSsr&&n===i.asPath&&s===i.pathname||i._bps&&!i._bps(t)||i.change("replaceState",r,n,Object.assign({},a,{shallow:a.shallow&&i._shallow,locale:a.locale||i.defaultLocale}),undefined)}}else{var u=i.pathname,c=i.query;i.changeState("replaceState",(0,f.formatWithValidation)({pathname:S(u),query:c}),(0,f.getURL)())}},this.route=(0,u.removePathTrailingSlash)(t),this.components={},"/_error"!==t&&(this.components[this.route]={Component:v,initial:!0,props:s,err:m,__N_SSG:s&&s.__N_SSG,__N_SSP:s&&s.__N_SSP}),this.components["/_app"]={Component:l,styleSheets:[]},this.events=e.events,this.pageLoader=c,this.pathname=t,this.query=r;var w=(0,p.isDynamicRoute)(t)&&self.__NEXT_DATA__.autoExport;this.asPath=w?t:n,this.basePath="",this.sub=g,this.clc=null,this._wrapApp=h,this.isSsr=!0,this.isFallback=y,this.isReady=!(!self.__NEXT_DATA__.gssp&&!self.__NEXT_DATA__.gip&&(w||self.location.search)),this.isPreview=!!b,this.isLocaleDomain=!1,"//"!==n.substr(0,2)&&this.changeState("replaceState",(0,f.formatWithValidation)({pathname:S(t),query:r}),(0,f.getURL)(),{locale:_}),window.addEventListener("popstate",this.onPopState)}return i(e,[{key:"reload",value:function(){window.location.reload()}},{key:"back",value:function(){window.history.back()}},{key:"push",value:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};var n=T(this,e,t);return e=n.url,t=n.as,this.change("pushState",e,t,r)}},{key:"replace",value:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=T(this,e,t);return e=n.url,t=n.as,this.change("replaceState",e,t,r)}},{key:"change",value:function(){var t=a(n.mark((function t(r,a,o,i,s){var l,h,v,m,_,b,k,I,O,j,M,U,N,W,q,F,B,G,V,H,X,z,$,J,Q,Y,Z,K,ee,te,re,ne,ae,oe,ie;return n.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(C(a)){t.next=3;break}return window.location.href=a,t.abrupt("return",!1);case 3:h=a===o||i._h,i._h&&(this.isReady=!0),i.scroll=!(null!=(l=i.scroll)&&!l),v=i.locale!==this.locale,t.next=19;break;case 19:if(i._h||(this.isSsr=!1),f.ST&&performance.mark("routeChange"),m=i.shallow,_={shallow:void 0!==m&&m},this._inFlightRoute&&this.abortComponentLoad(this._inFlightRoute,_),o=S(w(x(o)?R(o):o,i.locale,this.defaultLocale)),b=P(x(o)?R(o):o,this.locale),this._inFlightRoute=o,i._h||!this.onlyAHashChange(b)){t.next=35;break}return this.asPath=b,e.events.emit("hashChangeStart",o,_),this.changeState(r,a,o,i),this.scrollToHash(b),this.notify(this.components[this.route],null),e.events.emit("hashChangeComplete",o,_),t.abrupt("return",!0);case 35:return k=(0,d.parseRelativeUrl)(a),I=k.pathname,O=k.query,t.prev=37,t.next=40,this.pageLoader.getPageList();case 40:return j=t.sent,t.next=43,(0,c.getClientBuildManifest)();case 43:M=t.sent,M.__rewrites,t.next=51;break;case 47:return t.prev=47,t.t0=t.catch(37),window.location.href=o,t.abrupt("return",!1);case 51:if(this.urlIsNew(b)||v||(r="replaceState"),U=o,I=I?(0,u.removePathTrailingSlash)(R(I)):I,h&&"/_error"!==I&&(k.pathname=A(I,j),k.pathname!==I&&(I=k.pathname,a=(0,f.formatWithValidation)(k))),N=(0,u.removePathTrailingSlash)(I),C(o)){t.next=61;break}t.next=59;break;case 59:return window.location.href=o,t.abrupt("return",!1);case 61:if(U=P(R(U),this.locale),!(0,p.isDynamicRoute)(N)){t.next=77;break}if(W=(0,d.parseRelativeUrl)(U),q=W.pathname,F=(0,y.getRouteRegex)(N),B=(0,g.getRouteMatcher)(F)(q),V=(G=N===q)?E(N,q,O):{},B&&(!G||V.result)){t.next=76;break}if(!((H=Object.keys(F.groups).filter((function(e){return!O[e]}))).length>0)){t.next=74;break}throw new Error((G?"The provided `href` (".concat(a,") value is missing query values (").concat(H.join(", "),") to be interpolated properly. "):"The provided `as` value (".concat(q,") is incompatible with the `href` value (").concat(N,"). "))+"Read more: https://nextjs.org/docs/messages/".concat(G?"href-interpolation-failed":"incompatible-href-as"));case 74:t.next=77;break;case 76:G?o=(0,f.formatWithValidation)(Object.assign({},W,{pathname:V.result,query:L(O,V.params)})):Object.assign(O,B);case 77:return e.events.emit("routeChangeStart",o,_),t.prev=78,t.next=81,this.getRouteInfo(N,I,O,o,U,_);case 81:if($=t.sent,Q=(J=$).error,Y=J.props,Z=J.__N_SSG,K=J.__N_SSP,!Z&&!K||!Y){t.next=108;break}if(!Y.pageProps||!Y.pageProps.__N_REDIRECT){t.next=94;break}if(!(ee=Y.pageProps.__N_REDIRECT).startsWith("/")){t.next=92;break}if((te=(0,d.parseRelativeUrl)(ee)).pathname=A(te.pathname,j),!j.includes(te.pathname)){t.next=92;break}return re=T(this,ee,ee),ne=re.url,ae=re.as,t.abrupt("return",this.change(r,ne,ae,i));case 92:return window.location.href=ee,t.abrupt("return",new Promise((function(){})));case 94:if(this.isPreview=!!Y.__N_PREVIEW,Y.notFound!==D){t.next=108;break}return t.prev=96,t.next=99,this.fetchComponent("/404");case 99:oe="/404",t.next=105;break;case 102:t.prev=102,t.t1=t.catch(96),oe="/_error";case 105:return t.next=107,this.getRouteInfo(oe,oe,O,o,U,{shallow:!1});case 107:$=t.sent;case 108:return e.events.emit("beforeHistoryChange",o,_),this.changeState(r,a,o,i),ie=i.shallow&&this.route===N,i._h&&"/_error"===I&&500===(null==(X=self.__NEXT_DATA__.props)||null==(z=X.pageProps)?void 0:z.statusCode)&&null!=Y&&Y.pageProps&&(Y.pageProps.statusCode=500),t.next=115,this.set(N,I,O,b,$,s||(ie||!i.scroll?null:{x:0,y:0})).catch((function(e){if(!e.cancelled)throw e;Q=Q||e}));case 115:if(!Q){t.next=118;break}throw e.events.emit("routeChangeError",Q,b,_),Q;case 118:return e.events.emit("routeChangeComplete",o,_),t.abrupt("return",!0);case 123:if(t.prev=123,t.t2=t.catch(78),!t.t2.cancelled){t.next=127;break}return t.abrupt("return",!1);case 127:throw t.t2;case 128:case"end":return t.stop()}}),t,this,[[37,47],[78,123],[96,102]])})));return function(e,r,n,a,o){return t.apply(this,arguments)}}()},{key:"changeState",value:function(e,t,r){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};"pushState"===e&&(0,f.getURL)()===r||(this._shallow=n.shallow,window.history[e]({url:t,as:r,options:n,__N:!0,idx:this._idx="pushState"!==e?this._idx:this._idx+1},"",r))}},{key:"handleRouteInfoError",value:function(){var t=a(n.mark((function t(r,a,o,i,s,u){var l,h,f,p;return n.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!r.cancelled){t.next=2;break}throw r;case 2:if(!(0,c.isAssetError)(r)&&!u){t.next=6;break}throw e.events.emit("routeChangeError",r,i,s),window.location.href=i,b();case 6:if(t.prev=6,"undefined"!==typeof l&&"undefined"!==typeof h){t.next=14;break}return t.next=11,this.fetchComponent("/_error");case 11:f=t.sent,l=f.page,h=f.styleSheets;case 14:if((p={props:undefined,Component:l,styleSheets:h,err:r,error:r}).props){t.next=26;break}return t.prev=16,t.next=19,this.getInitialProps(l,{err:r,pathname:a,query:o});case 19:p.props=t.sent,t.next=26;break;case 22:t.prev=22,t.t0=t.catch(16),console.error("Error in error page `getInitialProps`: ",t.t0),p.props={};case 26:return t.abrupt("return",p);case 29:return t.prev=29,t.t1=t.catch(6),t.abrupt("return",this.handleRouteInfoError(t.t1,a,o,i,s,!0));case 32:case"end":return t.stop()}}),t,this,[[6,29],[16,22]])})));return function(e,r,n,a,o,i){return t.apply(this,arguments)}}()},{key:"getRouteInfo",value:function(){var e=a(n.mark((function e(t,r,a,o,i,s){var u,c,l,h,p,d,v,m,g=this;return n.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,u=this.components[t],!s.shallow||!u||this.route!==t){e.next=4;break}return e.abrupt("return",u);case 4:if(!(c=u&&"initial"in u?void 0:u)){e.next=9;break}e.t0=c,e.next=12;break;case 9:return e.next=11,this.fetchComponent(t).then((function(e){return{Component:e.page,styleSheets:e.styleSheets,__N_SSG:e.mod.__N_SSG,__N_SSP:e.mod.__N_SSP}}));case 11:e.t0=e.sent;case 12:l=e.t0,h=l.Component,p=l.__N_SSG,d=l.__N_SSP,e.next=18;break;case 18:return(p||d)&&(v=this.pageLoader.getDataHref((0,f.formatWithValidation)({pathname:r,query:a}),i,p,this.locale)),e.next=21,this._getData((function(){return p?g._getStaticData(v):d?g._getServerData(v):g.getInitialProps(h,{pathname:r,query:a,asPath:o,locale:g.locale,locales:g.locales,defaultLocale:g.defaultLocale})}));case 21:return m=e.sent,l.props=m,this.components[t]=l,e.abrupt("return",l);case 27:return e.prev=27,e.t1=e.catch(0),e.abrupt("return",this.handleRouteInfoError(e.t1,r,a,o,s));case 30:case"end":return e.stop()}}),e,this,[[0,27]])})));return function(t,r,n,a,o,i){return e.apply(this,arguments)}}()},{key:"set",value:function(e,t,r,n,a,o){return this.isFallback=!1,this.route=e,this.pathname=t,this.query=r,this.asPath=n,this.notify(a,o)}},{key:"beforePopState",value:function(e){this._bps=e}},{key:"onlyAHashChange",value:function(e){if(!this.asPath)return!1;var t=this.asPath.split("#"),r=s(t,2),n=r[0],a=r[1],o=e.split("#"),i=s(o,2),u=i[0],c=i[1];return!(!c||n!==u||a!==c)||n===u&&a!==c}},{key:"scrollToHash",value:function(e){var t=e.split("#"),r=s(t,2)[1];if(""!==r&&"top"!==r){var n=document.getElementById(r);if(n)n.scrollIntoView();else{var a=document.getElementsByName(r)[0];a&&a.scrollIntoView()}}else window.scrollTo(0,0)}},{key:"urlIsNew",value:function(e){return this.asPath!==e}},{key:"prefetch",value:function(){var e=a(n.mark((function e(t){var r,a,o,i,s,c,l,h,p,v,g=this,y=arguments;return n.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=y.length>1&&void 0!==y[1]?y[1]:t,a=y.length>2&&void 0!==y[2]?y[2]:{},o=(0,d.parseRelativeUrl)(t),i=o.pathname,e.next=7,this.pageLoader.getPageList();case 7:s=e.sent,c=r,e.next=19;break;case 12:h=e.sent,l=h.__rewrites,p=(0,m.default)(S(w(r,this.locale)),s,l,o.query,(function(e){return A(e,s)}),this.locales),c=P(R(p.asPath),this.locale),p.matchedPage&&p.resolvedHref&&(i=p.resolvedHref,o.pathname=i,t=(0,f.formatWithValidation)(o)),e.next=21;break;case 19:o.pathname=A(o.pathname,s),o.pathname!==i&&(i=o.pathname,t=(0,f.formatWithValidation)(o));case 21:v=(0,u.removePathTrailingSlash)(i),e.next=24;break;case 24:return e.next=26,Promise.all([this.pageLoader._isSsg(v).then((function(e){return!!e&&g._getStaticData(g.pageLoader.getDataHref(t,c,!0,"undefined"!==typeof a.locale?a.locale:g.locale))})),this.pageLoader[a.priority?"loadPage":"prefetch"](v)]);case 26:case"end":return e.stop()}}),e,this)})));return function(t){return e.apply(this,arguments)}}()},{key:"fetchComponent",value:function(){var e=a(n.mark((function e(t){var r,a,o,i;return n.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=!1,a=this.clc=function(){r=!0},e.next=4,this.pageLoader.loadPage(t);case 4:if(o=e.sent,!r){e.next=9;break}throw(i=new Error('Abort fetching component for route: "'.concat(t,'"'))).cancelled=!0,i;case 9:return a===this.clc&&(this.clc=null),e.abrupt("return",o);case 11:case"end":return e.stop()}}),e,this)})));return function(t){return e.apply(this,arguments)}}()},{key:"_getData",value:function(e){var t=this,r=!1,n=function(){r=!0};return this.clc=n,e().then((function(e){if(n===t.clc&&(t.clc=null),r){var a=new Error("Loading initial props cancelled");throw a.cancelled=!0,a}return e}))}},{key:"_getStaticData",value:function(e){var t=this,r=new URL(e,window.location.href).href;return!this.isPreview&&this.sdc[r]?Promise.resolve(this.sdc[r]):M(e,this.isSsr).then((function(e){return t.sdc[r]=e,e}))}},{key:"_getServerData",value:function(e){var t=this,r=new URL(e,window.location.href).href;return this.sdr[r]?this.sdr[r]:this.sdr[r]=M(e,this.isSsr).then((function(e){return delete t.sdr[r],e})).catch((function(e){throw delete t.sdr[r],e}))}},{key:"getInitialProps",value:function(e,t){var r=this.components["/_app"].Component,n=this._wrapApp(r);return t.AppTree=n,(0,f.loadGetInitialProps)(r,{AppTree:n,Component:e,router:this,ctx:t})}},{key:"abortComponentLoad",value:function(t,r){this.clc&&(e.events.emit("routeChangeError",b(),t,r),this.clc(),this.clc=null)}},{key:"notify",value:function(e,t){return this.sub(e,this.components["/_app"].Component,t)}}]),e}();t.default=U,U.events=(0,h.default)()},"g/15":function(e,t,r){"use strict";var n=r("o0o1"),a=r("yXPU");t.__esModule=!0,t.execOnce=function(e){var t,r=!1;return function(){return r||(r=!0,t=e.apply(void 0,arguments)),t}},t.getLocationOrigin=i,t.getURL=function(){var e=window.location.href,t=i();return e.substring(t.length)},t.getDisplayName=s,t.isResSent=u,t.loadGetInitialProps=c,t.formatWithValidation=function(e){0;return(0,o.formatUrl)(e)},t.ST=t.SP=t.urlObjectKeys=void 0;var o=r("6D7l");function i(){var e=window.location,t=e.protocol,r=e.hostname,n=e.port;return"".concat(t,"//").concat(r).concat(n?":"+n:"")}function s(e){return"string"===typeof e?e:e.displayName||e.name||"Unknown"}function u(e){return e.finished||e.headersSent}function c(e,t){return l.apply(this,arguments)}function l(){return(l=a(n.mark((function e(t,r){var a,o,i;return n.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:e.next=4;break;case 4:if(a=r.res||r.ctx&&r.ctx.res,t.getInitialProps){e.next=12;break}if(!r.ctx||!r.Component){e.next=11;break}return e.next=9,c(r.Component,r.ctx);case 9:return e.t0=e.sent,e.abrupt("return",{pageProps:e.t0});case 11:return e.abrupt("return",{});case 12:return e.next=14,t.getInitialProps(r);case 14:if(o=e.sent,!a||!u(a)){e.next=17;break}return e.abrupt("return",o);case 17:if(o){e.next=20;break}throw i='"'.concat(s(t),'.getInitialProps()" should resolve to an object. But found "').concat(o,'" instead.'),new Error(i);case 20:return e.abrupt("return",o);case 22:case"end":return e.stop()}}),e)})))).apply(this,arguments)}t.urlObjectKeys=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];var h="undefined"!==typeof performance;t.SP=h;var f=h&&"function"===typeof performance.mark&&"function"===typeof performance.measure;t.ST=f},gguc:function(e,t,r){"use strict";t.__esModule=!0,t.getRouteMatcher=function(e){var t=e.re,r=e.groups;return function(e){var n=t.exec(e);if(!n)return!1;var a=function(e){try{return decodeURIComponent(e)}catch(r){var t=new Error("failed to decode param");throw t.code="DECODE_FAILED",t}},o={};return Object.keys(r).forEach((function(e){var t=r[e],i=n[t.pos];void 0!==i&&(o[e]=~i.indexOf("/")?i.split("/").map((function(e){return a(e)})):t.repeat?[a(i)]:a(i))})),o}}},hS4m:function(e,t,r){"use strict";t.__esModule=!0,t.parseRelativeUrl=function(e,t){var r=new URL((0,n.getLocationOrigin)()),o=t?new URL(t,r):r,i=new URL(e,o),s=i.pathname,u=i.searchParams,c=i.search,l=i.hash,h=i.href;if(i.origin!==r.origin)throw new Error("invariant: invalid relative URL, router received ".concat(e));return{pathname:s,query:(0,a.searchParamsToUrlQuery)(u),search:c,hash:l,href:h.slice(r.origin.length)}};var n=r("g/15"),a=r("3WeD")},m0LI:function(e,t){e.exports=function(e,t){if("undefined"!==typeof Symbol&&Symbol.iterator in Object(e)){var r=[],n=!0,a=!1,o=void 0;try{for(var i,s=e[Symbol.iterator]();!(n=(i=s.next()).done)&&(r.push(i.value),!t||r.length!==t);n=!0);}catch(u){a=!0,o=u}finally{try{n||null==s.return||s.return()}finally{if(a)throw o}}return r}}},nOHt:function(e,t,r){"use strict";var n=r("sXyB");function a(e,t){var r;if("undefined"===typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(r=function(e,t){if(!e)return;if("string"===typeof e)return o(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return o(e,t)}(e))||t&&e&&"number"===typeof e.length){r&&(e=r);var n=0,a=function(){};return{s:a,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,s=!0,u=!1;return{s:function(){r=e[Symbol.iterator]()},n:function(){var e=r.next();return s=e.done,e},e:function(e){u=!0,i=e},f:function(){try{s||null==r.return||r.return()}finally{if(u)throw i}}}}function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r1?e-1:0),n=1;n1&&void 0!==arguments[1]?arguments[1]:"",r="/"===t?"/index":/^\/index(\/|$)/.test(t)?"/index".concat(t):"".concat(t);return r+e}},Nh2W:function(t,e,r){"use strict";var n=r("AroE");e.__esModule=!0,e.markAssetError=s,e.isAssetError=function(t){return t&&c in t},e.getClientBuildManifest=l,e.default=void 0;n(r("Lab5"));var o=r("0G5g");function a(t,e,r){var n,o=e.get(t);if(o)return"future"in o?o.future:Promise.resolve(o);var a=new Promise((function(t){n=t}));return e.set(t,o={resolve:n,future:a}),r?r().then((function(t){return n(t),t})):a}var i=function(t){try{return t=document.createElement("link"),!!window.MSInputMethodContext&&!!document.documentMode||t.relList.supports("prefetch")}catch(e){return!1}}();var c=Symbol("ASSET_LOAD_ERROR");function s(t){return Object.defineProperty(t,c,{})}function u(t,e,r){return new Promise((function(n,a){var i=!1;t.then((function(t){i=!0,n(t)})).catch(a),(0,o.requestIdleCallback)((function(){return setTimeout((function(){i||a(r)}),e)}))}))}function l(){return self.__BUILD_MANIFEST?Promise.resolve(self.__BUILD_MANIFEST):u(new Promise((function(t){var e=self.__BUILD_MANIFEST_CB;self.__BUILD_MANIFEST_CB=function(){t(self.__BUILD_MANIFEST),e&&e()}})),3800,s(new Error("Failed to load client build manifest")))}function h(t,e){return l().then((function(r){if(!(e in r))throw s(new Error("Failed to lookup route: ".concat(e)));var n=r[e].map((function(e){return t+"/_next/"+encodeURI(e)}));return{scripts:n.filter((function(t){return t.endsWith(".js")})),css:n.filter((function(t){return t.endsWith(".css")}))}}))}var f=function(t){var e=new Map,r=new Map,n=new Map,c=new Map;function l(t){var e=r.get(t);return e||(document.querySelector('script[src^="'.concat(t,'"]'))?Promise.resolve():(r.set(t,e=function(t,e){return new Promise((function(r,n){(e=document.createElement("script")).onload=r,e.onerror=function(){return n(s(new Error("Failed to load script: ".concat(t))))},e.crossOrigin=void 0,e.src=t,document.body.appendChild(e)}))}(t)),e))}function f(t){var e=n.get(t);return e||(n.set(t,e=fetch(t).then((function(e){if(!e.ok)throw new Error("Failed to load stylesheet: ".concat(t));return e.text().then((function(e){return{href:t,content:e}}))})).catch((function(t){throw s(t)}))),e)}return{whenEntrypoint:function(t){return a(t,e)},onEntrypoint:function(t,r){Promise.resolve(r).then((function(t){return t()})).then((function(t){return{component:t&&t.default||t,exports:t}}),(function(t){return{error:t}})).then((function(r){var n=e.get(t);e.set(t,r),n&&"resolve"in n&&n.resolve(r)}))},loadRoute:function(r,n){var o=this;return a(r,c,(function(){return u(h(t,r).then((function(t){var n=t.scripts,o=t.css;return Promise.all([e.has(r)?[]:Promise.all(n.map(l)),Promise.all(o.map(f))])})).then((function(t){return o.whenEntrypoint(r).then((function(e){return{entrypoint:e,styles:t[1]}}))})),3800,s(new Error("Route did not complete loading: ".concat(r)))).then((function(t){var e=t.entrypoint,r=t.styles,n=Object.assign({styles:r},e);return"error"in e?e:n})).catch((function(t){if(n)throw t;return{error:t}}))}))},prefetch:function(e){var r,n=this;return(r=navigator.connection)&&(r.saveData||/2g/.test(r.effectiveType))?Promise.resolve():h(t,e).then((function(t){return Promise.all(i?t.scripts.map((function(t){return e=t,r="script",new Promise((function(t,o){if(document.querySelector('link[rel="prefetch"][href^="'.concat(e,'"]')))return t();n=document.createElement("link"),r&&(n.as=r),n.rel="prefetch",n.crossOrigin=void 0,n.onload=t,n.onerror=o,n.href=e,document.head.appendChild(n)}));var e,r,n})):[])})).then((function(){(0,o.requestIdleCallback)((function(){return n.loadRoute(e,!0).catch((function(){}))}))})).catch((function(){}))}}};e.default=f},PqPU:function(t,e){t.exports=function(t){if(Array.isArray(t))return t}},"X24+":function(t,e,r){"use strict";function n(t){return t.endsWith("/")&&"/"!==t?t.slice(0,-1):t}e.__esModule=!0,e.removePathTrailingSlash=n,e.normalizePathTrailingSlash=void 0;var o=n;e.normalizePathTrailingSlash=o},YTqd:function(t,e,r){"use strict";e.__esModule=!0,e.getRouteRegex=function(t){var e=(t.replace(/\/$/,"")||"/").slice(1).split("/"),r={},n=1,o=e.map((function(t){if(t.startsWith("[")&&t.endsWith("]")){var e=function(t){var e=t.startsWith("[")&&t.endsWith("]");e&&(t=t.slice(1,-1));var r=t.startsWith("...");r&&(t=t.slice(3));return{key:t,repeat:r,optional:e}}(t.slice(1,-1)),o=e.key,a=e.optional,i=e.repeat;return r[o]={pos:n++,repeat:i,optional:a},i?a?"(?:/(.+?))?":"/(.+?)":"/([^/]+?)"}return"/".concat(t.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&"))})).join("");0;return{re:new RegExp("^".concat(o,"(?:/)?$")),groups:r}}},dZ6Y:function(t,e,r){"use strict";e.__esModule=!0,e.default=function(){var t=Object.create(null);return{on:function(e,r){(t[e]||(t[e]=[])).push(r)},off:function(e,r){t[e]&&t[e].splice(t[e].indexOf(r)>>>0,1)},emit:function(e){for(var r=arguments.length,n=new Array(r>1?r-1:0),o=1;o-1||r>-1)&&(t=t.substring(0,e>-1?e:r)),t}function k(t){return""===(t=P(t))||t.startsWith("/")}function S(t){return function(t,e){return e&&t.startsWith("/")?"/"===t?(0,s.normalizePathTrailingSlash)(e):"".concat(e).concat("/"===P(t)?t.substring(1):t):t}(t,"")}function E(t){return(t=t.slice("".length)).startsWith("/")||(t="/".concat(t)),t}function R(t){if(t.startsWith("/")||t.startsWith("#"))return!0;try{var e=(0,f.getLocationOrigin)(),r=new URL(t,e);return r.origin===e&&k(r.pathname)}catch(n){return!1}}function L(t,e,r){var n="",o=(0,g.getRouteRegex)(t),a=o.groups,i=(e!==t?(0,y.getRouteMatcher)(o)(e):"")||r;n=t;var c=Object.keys(a);return c.every((function(t){var e=i[t]||"",r=a[t],o=r.repeat,c=r.optional,s="[".concat(o?"...":"").concat(t,"]");return c&&(s="".concat(e?"":"/","[").concat(s,"]")),o&&!Array.isArray(e)&&(e=[e]),(c||t in i)&&(n=n.replace(s,o?e.map((function(t){return encodeURIComponent(t)})).join("/"):encodeURIComponent(e))||"/")}))||(n=""),{params:c,result:n}}function C(t,e){var r={};return Object.keys(t).forEach((function(n){e.includes(n)||(r[n]=t[n])})),r}function O(t,e,r){var n;try{n=new URL(t,"http://n")}catch(m){n=new URL("/","http://n")}var o="string"===typeof e?e:(0,f.formatWithValidation)(e);if(!R(o))return r?[o]:o;try{var a=new URL(o,n);a.pathname=(0,s.normalizePathTrailingSlash)(a.pathname);var i="";if((0,p.isDynamicRoute)(a.pathname)&&a.searchParams&&r){var c=(0,v.searchParamsToUrlQuery)(a.searchParams),u=L(a.pathname,a.pathname,c),l=u.result,h=u.params;l&&(i=(0,f.formatWithValidation)({pathname:l,hash:a.hash,query:C(c,h)}))}var d=a.origin===n.origin?a.href.slice(a.origin.length):a.href;return r?[d,i||d]:d}catch(m){return r?[o]:o}}function I(t){var e=(0,f.getLocationOrigin)();return t.startsWith(e)?t.substring(e.length):t}function A(t,e,r){var n=O(t.asPath,e,!0),o=c(n,2),a=o[0],i=o[1],s=(0,f.getLocationOrigin)(),u=a.startsWith(s),l=i&&i.startsWith(s);a=I(a),i=i?I(i):i;var h=u?a:S(a),p=r?I(O(t.asPath,r)):i||a;return{url:h,as:l?p:S(p)}}function T(t,e){var r=(0,s.removePathTrailingSlash)((0,l.denormalizePagePath)(t));return"/404"===r||"/_error"===r?t:(e.includes(r)||e.some((function(e){if((0,p.isDynamicRoute)(e)&&(0,g.getRouteRegex)(e).re.test(r))return t=e,!0})),(0,s.removePathTrailingSlash)(t))}var j=Symbol("SSG_DATA_NOT_FOUND");function D(t,e){return fetch(t,{credentials:"same-origin"}).then((function(r){if(!r.ok){if(e>1&&r.status>=500)return D(t,e-1);if(404===r.status)return r.json().then((function(t){if(t.notFound)return{notFound:j};throw new Error("Failed to load static props")}));throw new Error("Failed to load static props")}return r.json()}))}function N(t,e){return D(t,e?3:1).catch((function(t){throw e||(0,u.markAssetError)(t),t}))}var M=function(){function t(e,r,n,o){var i=this,c=o.initialProps,u=o.pageLoader,l=o.App,h=o.wrapApp,v=o.Component,m=o.err,y=o.subscription,g=o.isFallback,w=o.locale,_=(o.locales,o.defaultLocale,o.domainLocales,o.isPreview);a(this,t),this.route=void 0,this.pathname=void 0,this.query=void 0,this.asPath=void 0,this.basePath=void 0,this.components=void 0,this.sdc={},this.sdr={},this.sub=void 0,this.clc=void 0,this.pageLoader=void 0,this._bps=void 0,this.events=void 0,this._wrapApp=void 0,this.isSsr=void 0,this.isFallback=void 0,this._inFlightRoute=void 0,this._shallow=void 0,this.locale=void 0,this.locales=void 0,this.defaultLocale=void 0,this.domainLocales=void 0,this.isReady=void 0,this.isPreview=void 0,this.isLocaleDomain=void 0,this._idx=0,this.onPopState=function(t){var e=t.state;if(e){if(e.__N){var r=e.url,n=e.as,o=e.options,a=e.idx;i._idx=a;var c=(0,d.parseRelativeUrl)(r).pathname;i.isSsr&&n===i.asPath&&c===i.pathname||i._bps&&!i._bps(e)||i.change("replaceState",r,n,Object.assign({},o,{shallow:o.shallow&&i._shallow,locale:o.locale||i.defaultLocale}),undefined)}}else{var s=i.pathname,u=i.query;i.changeState("replaceState",(0,f.formatWithValidation)({pathname:S(s),query:u}),(0,f.getURL)())}},this.route=(0,s.removePathTrailingSlash)(e),this.components={},"/_error"!==e&&(this.components[this.route]={Component:v,initial:!0,props:c,err:m,__N_SSG:c&&c.__N_SSG,__N_SSP:c&&c.__N_SSP}),this.components["/_app"]={Component:l,styleSheets:[]},this.events=t.events,this.pageLoader=u,this.pathname=e,this.query=r;var b=(0,p.isDynamicRoute)(e)&&self.__NEXT_DATA__.autoExport;this.asPath=b?e:n,this.basePath="",this.sub=y,this.clc=null,this._wrapApp=h,this.isSsr=!0,this.isFallback=g,this.isReady=!(!self.__NEXT_DATA__.gssp&&!self.__NEXT_DATA__.gip&&(b||self.location.search)),this.isPreview=!!_,this.isLocaleDomain=!1,"//"!==n.substr(0,2)&&this.changeState("replaceState",(0,f.formatWithValidation)({pathname:S(e),query:r}),(0,f.getURL)(),{locale:w}),window.addEventListener("popstate",this.onPopState)}return i(t,[{key:"reload",value:function(){window.location.reload()}},{key:"back",value:function(){window.history.back()}},{key:"push",value:function(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};var n=A(this,t,e);return t=n.url,e=n.as,this.change("pushState",t,e,r)}},{key:"replace",value:function(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=A(this,t,e);return t=n.url,e=n.as,this.change("replaceState",t,e,r)}},{key:"change",value:function(){var e=o(n.mark((function e(r,o,a,i,c){var l,h,v,m,w,_,P,O,I,D,N,M,U,W,q,F,G,B,V,H,z,K,X,Y,$,J,Q,Z,tt,et,rt,nt,ot,at,it;return n.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(R(o)){e.next=3;break}return window.location.href=o,e.abrupt("return",!1);case 3:h=o===a||i._h,i._h&&(this.isReady=!0),i.scroll=!(null!=(l=i.scroll)&&!l),v=i.locale!==this.locale,e.next=19;break;case 19:if(i._h||(this.isSsr=!1),f.ST&&performance.mark("routeChange"),m=i.shallow,w={shallow:void 0!==m&&m},this._inFlightRoute&&this.abortComponentLoad(this._inFlightRoute,w),a=S(b(k(a)?E(a):a,i.locale,this.defaultLocale)),_=x(k(a)?E(a):a,this.locale),this._inFlightRoute=a,i._h||!this.onlyAHashChange(_)){e.next=35;break}return this.asPath=_,t.events.emit("hashChangeStart",a,w),this.changeState(r,o,a,i),this.scrollToHash(_),this.notify(this.components[this.route],null),t.events.emit("hashChangeComplete",a,w),e.abrupt("return",!0);case 35:return P=(0,d.parseRelativeUrl)(o),O=P.pathname,I=P.query,e.prev=37,e.next=40,this.pageLoader.getPageList();case 40:return D=e.sent,e.next=43,(0,u.getClientBuildManifest)();case 43:N=e.sent,N.__rewrites,e.next=51;break;case 47:return e.prev=47,e.t0=e.catch(37),window.location.href=a,e.abrupt("return",!1);case 51:if(this.urlIsNew(_)||v||(r="replaceState"),M=a,O=O?(0,s.removePathTrailingSlash)(E(O)):O,h&&"/_error"!==O&&(P.pathname=T(O,D),P.pathname!==O&&(O=P.pathname,o=(0,f.formatWithValidation)(P))),U=(0,s.removePathTrailingSlash)(O),R(a)){e.next=61;break}e.next=59;break;case 59:return window.location.href=a,e.abrupt("return",!1);case 61:if(M=x(E(M),this.locale),!(0,p.isDynamicRoute)(U)){e.next=77;break}if(W=(0,d.parseRelativeUrl)(M),q=W.pathname,F=(0,g.getRouteRegex)(U),G=(0,y.getRouteMatcher)(F)(q),V=(B=U===q)?L(U,q,I):{},G&&(!B||V.result)){e.next=76;break}if(!((H=Object.keys(F.groups).filter((function(t){return!I[t]}))).length>0)){e.next=74;break}throw new Error((B?"The provided `href` (".concat(o,") value is missing query values (").concat(H.join(", "),") to be interpolated properly. "):"The provided `as` value (".concat(q,") is incompatible with the `href` value (").concat(U,"). "))+"Read more: https://nextjs.org/docs/messages/".concat(B?"href-interpolation-failed":"incompatible-href-as"));case 74:e.next=77;break;case 76:B?a=(0,f.formatWithValidation)(Object.assign({},W,{pathname:V.result,query:C(I,V.params)})):Object.assign(I,G);case 77:return t.events.emit("routeChangeStart",a,w),e.prev=78,e.next=81,this.getRouteInfo(U,O,I,a,M,w);case 81:if(X=e.sent,$=(Y=X).error,J=Y.props,Q=Y.__N_SSG,Z=Y.__N_SSP,!Q&&!Z||!J){e.next=108;break}if(!J.pageProps||!J.pageProps.__N_REDIRECT){e.next=94;break}if(!(tt=J.pageProps.__N_REDIRECT).startsWith("/")){e.next=92;break}if((et=(0,d.parseRelativeUrl)(tt)).pathname=T(et.pathname,D),!D.includes(et.pathname)){e.next=92;break}return rt=A(this,tt,tt),nt=rt.url,ot=rt.as,e.abrupt("return",this.change(r,nt,ot,i));case 92:return window.location.href=tt,e.abrupt("return",new Promise((function(){})));case 94:if(this.isPreview=!!J.__N_PREVIEW,J.notFound!==j){e.next=108;break}return e.prev=96,e.next=99,this.fetchComponent("/404");case 99:at="/404",e.next=105;break;case 102:e.prev=102,e.t1=e.catch(96),at="/_error";case 105:return e.next=107,this.getRouteInfo(at,at,I,a,M,{shallow:!1});case 107:X=e.sent;case 108:return t.events.emit("beforeHistoryChange",a,w),this.changeState(r,o,a,i),it=i.shallow&&this.route===U,i._h&&"/_error"===O&&500===(null==(z=self.__NEXT_DATA__.props)||null==(K=z.pageProps)?void 0:K.statusCode)&&null!=J&&J.pageProps&&(J.pageProps.statusCode=500),e.next=115,this.set(U,O,I,_,X,c||(it||!i.scroll?null:{x:0,y:0})).catch((function(t){if(!t.cancelled)throw t;$=$||t}));case 115:if(!$){e.next=118;break}throw t.events.emit("routeChangeError",$,_,w),$;case 118:return t.events.emit("routeChangeComplete",a,w),e.abrupt("return",!0);case 123:if(e.prev=123,e.t2=e.catch(78),!e.t2.cancelled){e.next=127;break}return e.abrupt("return",!1);case 127:throw e.t2;case 128:case"end":return e.stop()}}),e,this,[[37,47],[78,123],[96,102]])})));return function(t,r,n,o,a){return e.apply(this,arguments)}}()},{key:"changeState",value:function(t,e,r){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};"pushState"===t&&(0,f.getURL)()===r||(this._shallow=n.shallow,window.history[t]({url:e,as:r,options:n,__N:!0,idx:this._idx="pushState"!==t?this._idx:this._idx+1},"",r))}},{key:"handleRouteInfoError",value:function(){var e=o(n.mark((function e(r,o,a,i,c,s){var l,h,f,p;return n.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!r.cancelled){e.next=2;break}throw r;case 2:if(!(0,u.isAssetError)(r)&&!s){e.next=6;break}throw t.events.emit("routeChangeError",r,i,c),window.location.href=i,_();case 6:if(e.prev=6,"undefined"!==typeof l&&"undefined"!==typeof h){e.next=14;break}return e.next=11,this.fetchComponent("/_error");case 11:f=e.sent,l=f.page,h=f.styleSheets;case 14:if((p={props:undefined,Component:l,styleSheets:h,err:r,error:r}).props){e.next=26;break}return e.prev=16,e.next=19,this.getInitialProps(l,{err:r,pathname:o,query:a});case 19:p.props=e.sent,e.next=26;break;case 22:e.prev=22,e.t0=e.catch(16),console.error("Error in error page `getInitialProps`: ",e.t0),p.props={};case 26:return e.abrupt("return",p);case 29:return e.prev=29,e.t1=e.catch(6),e.abrupt("return",this.handleRouteInfoError(e.t1,o,a,i,c,!0));case 32:case"end":return e.stop()}}),e,this,[[6,29],[16,22]])})));return function(t,r,n,o,a,i){return e.apply(this,arguments)}}()},{key:"getRouteInfo",value:function(){var t=o(n.mark((function t(e,r,o,a,i,c){var s,u,l,h,p,d,v,m,y=this;return n.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(t.prev=0,s=this.components[e],!c.shallow||!s||this.route!==e){t.next=4;break}return t.abrupt("return",s);case 4:if(!(u=s&&"initial"in s?void 0:s)){t.next=9;break}t.t0=u,t.next=12;break;case 9:return t.next=11,this.fetchComponent(e).then((function(t){return{Component:t.page,styleSheets:t.styleSheets,__N_SSG:t.mod.__N_SSG,__N_SSP:t.mod.__N_SSP}}));case 11:t.t0=t.sent;case 12:l=t.t0,h=l.Component,p=l.__N_SSG,d=l.__N_SSP,t.next=18;break;case 18:return(p||d)&&(v=this.pageLoader.getDataHref((0,f.formatWithValidation)({pathname:r,query:o}),i,p,this.locale)),t.next=21,this._getData((function(){return p?y._getStaticData(v):d?y._getServerData(v):y.getInitialProps(h,{pathname:r,query:o,asPath:a,locale:y.locale,locales:y.locales,defaultLocale:y.defaultLocale})}));case 21:return m=t.sent,l.props=m,this.components[e]=l,t.abrupt("return",l);case 27:return t.prev=27,t.t1=t.catch(0),t.abrupt("return",this.handleRouteInfoError(t.t1,r,o,a,c));case 30:case"end":return t.stop()}}),t,this,[[0,27]])})));return function(e,r,n,o,a,i){return t.apply(this,arguments)}}()},{key:"set",value:function(t,e,r,n,o,a){return this.isFallback=!1,this.route=t,this.pathname=e,this.query=r,this.asPath=n,this.notify(o,a)}},{key:"beforePopState",value:function(t){this._bps=t}},{key:"onlyAHashChange",value:function(t){if(!this.asPath)return!1;var e=this.asPath.split("#"),r=c(e,2),n=r[0],o=r[1],a=t.split("#"),i=c(a,2),s=i[0],u=i[1];return!(!u||n!==s||o!==u)||n===s&&o!==u}},{key:"scrollToHash",value:function(t){var e=t.split("#"),r=c(e,2)[1];if(""!==r&&"top"!==r){var n=document.getElementById(r);if(n)n.scrollIntoView();else{var o=document.getElementsByName(r)[0];o&&o.scrollIntoView()}}else window.scrollTo(0,0)}},{key:"urlIsNew",value:function(t){return this.asPath!==t}},{key:"prefetch",value:function(){var t=o(n.mark((function t(e){var r,o,a,i,c,u,l,h,p,v,y=this,g=arguments;return n.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=g.length>1&&void 0!==g[1]?g[1]:e,o=g.length>2&&void 0!==g[2]?g[2]:{},a=(0,d.parseRelativeUrl)(e),i=a.pathname,t.next=7,this.pageLoader.getPageList();case 7:c=t.sent,u=r,t.next=19;break;case 12:h=t.sent,l=h.__rewrites,p=(0,m.default)(S(b(r,this.locale)),c,l,a.query,(function(t){return T(t,c)}),this.locales),u=x(E(p.asPath),this.locale),p.matchedPage&&p.resolvedHref&&(i=p.resolvedHref,a.pathname=i,e=(0,f.formatWithValidation)(a)),t.next=21;break;case 19:a.pathname=T(a.pathname,c),a.pathname!==i&&(i=a.pathname,e=(0,f.formatWithValidation)(a));case 21:v=(0,s.removePathTrailingSlash)(i),t.next=24;break;case 24:return t.next=26,Promise.all([this.pageLoader._isSsg(v).then((function(t){return!!t&&y._getStaticData(y.pageLoader.getDataHref(e,u,!0,"undefined"!==typeof o.locale?o.locale:y.locale))})),this.pageLoader[o.priority?"loadPage":"prefetch"](v)]);case 26:case"end":return t.stop()}}),t,this)})));return function(e){return t.apply(this,arguments)}}()},{key:"fetchComponent",value:function(){var t=o(n.mark((function t(e){var r,o,a,i;return n.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=!1,o=this.clc=function(){r=!0},t.next=4,this.pageLoader.loadPage(e);case 4:if(a=t.sent,!r){t.next=9;break}throw(i=new Error('Abort fetching component for route: "'.concat(e,'"'))).cancelled=!0,i;case 9:return o===this.clc&&(this.clc=null),t.abrupt("return",a);case 11:case"end":return t.stop()}}),t,this)})));return function(e){return t.apply(this,arguments)}}()},{key:"_getData",value:function(t){var e=this,r=!1,n=function(){r=!0};return this.clc=n,t().then((function(t){if(n===e.clc&&(e.clc=null),r){var o=new Error("Loading initial props cancelled");throw o.cancelled=!0,o}return t}))}},{key:"_getStaticData",value:function(t){var e=this,r=new URL(t,window.location.href).href;return!this.isPreview&&this.sdc[r]?Promise.resolve(this.sdc[r]):N(t,this.isSsr).then((function(t){return e.sdc[r]=t,t}))}},{key:"_getServerData",value:function(t){var e=this,r=new URL(t,window.location.href).href;return this.sdr[r]?this.sdr[r]:this.sdr[r]=N(t,this.isSsr).then((function(t){return delete e.sdr[r],t})).catch((function(t){throw delete e.sdr[r],t}))}},{key:"getInitialProps",value:function(t,e){var r=this.components["/_app"].Component,n=this._wrapApp(r);return e.AppTree=n,(0,f.loadGetInitialProps)(r,{AppTree:n,Component:t,router:this,ctx:e})}},{key:"abortComponentLoad",value:function(e,r){this.clc&&(t.events.emit("routeChangeError",_(),e,r),this.clc(),this.clc=null)}},{key:"notify",value:function(t,e){return this.sub(t,this.components["/_app"].Component,e)}}]),t}();e.default=M,M.events=(0,h.default)()},"g/15":function(t,e,r){"use strict";var n=r("vJKn"),o=r("qVT1");e.__esModule=!0,e.execOnce=function(t){var e,r=!1;return function(){return r||(r=!0,e=t.apply(void 0,arguments)),e}},e.getLocationOrigin=i,e.getURL=function(){var t=window.location.href,e=i();return t.substring(e.length)},e.getDisplayName=c,e.isResSent=s,e.loadGetInitialProps=u,e.formatWithValidation=function(t){0;return(0,a.formatUrl)(t)},e.ST=e.SP=e.urlObjectKeys=void 0;var a=r("6D7l");function i(){var t=window.location,e=t.protocol,r=t.hostname,n=t.port;return"".concat(e,"//").concat(r).concat(n?":"+n:"")}function c(t){return"string"===typeof t?t:t.displayName||t.name||"Unknown"}function s(t){return t.finished||t.headersSent}function u(t,e){return l.apply(this,arguments)}function l(){return(l=o(n.mark((function t(e,r){var o,a,i;return n.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:t.next=4;break;case 4:if(o=r.res||r.ctx&&r.ctx.res,e.getInitialProps){t.next=12;break}if(!r.ctx||!r.Component){t.next=11;break}return t.next=9,u(r.Component,r.ctx);case 9:return t.t0=t.sent,t.abrupt("return",{pageProps:t.t0});case 11:return t.abrupt("return",{});case 12:return t.next=14,e.getInitialProps(r);case 14:if(a=t.sent,!o||!s(o)){t.next=17;break}return t.abrupt("return",a);case 17:if(a){t.next=20;break}throw i='"'.concat(c(e),'.getInitialProps()" should resolve to an object. But found "').concat(a,'" instead.'),new Error(i);case 20:return t.abrupt("return",a);case 22:case"end":return t.stop()}}),t)})))).apply(this,arguments)}e.urlObjectKeys=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];var h="undefined"!==typeof performance;e.SP=h;var f=h&&"function"===typeof performance.mark&&"function"===typeof performance.measure;e.ST=f},gguc:function(t,e,r){"use strict";e.__esModule=!0,e.getRouteMatcher=function(t){var e=t.re,r=t.groups;return function(t){var n=e.exec(t);if(!n)return!1;var o=function(t){try{return decodeURIComponent(t)}catch(r){var e=new Error("failed to decode param");throw e.code="DECODE_FAILED",e}},a={};return Object.keys(r).forEach((function(t){var e=r[t],i=n[e.pos];void 0!==i&&(a[t]=~i.indexOf("/")?i.split("/").map((function(t){return o(t)})):e.repeat?[o(i)]:o(i))})),a}}},hS4m:function(t,e,r){"use strict";e.__esModule=!0,e.parseRelativeUrl=function(t,e){var r=new URL((0,n.getLocationOrigin)()),a=e?new URL(e,r):r,i=new URL(t,a),c=i.pathname,s=i.searchParams,u=i.search,l=i.hash,h=i.href;if(i.origin!==r.origin)throw new Error("invariant: invalid relative URL, router received ".concat(t));return{pathname:c,query:(0,o.searchParamsToUrlQuery)(s),search:u,hash:l,href:h.slice(r.origin.length)}};var n=r("g/15"),o=r("3WeD")},kl55:function(t,e){t.exports=function(){if("undefined"===typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"===typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(t){return!1}}},ls82:function(t,e,r){var n=function(t){"use strict";var e,r=Object.prototype,n=r.hasOwnProperty,o=Object.defineProperty||function(t,e,r){t[e]=r.value},a="function"===typeof Symbol?Symbol:{},i=a.iterator||"@@iterator",c=a.asyncIterator||"@@asyncIterator",s=a.toStringTag||"@@toStringTag";function u(t,e,r){return Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{u({},"")}catch(A){u=function(t,e,r){return t[e]=r}}function l(t,e,r,n){var a=e&&e.prototype instanceof m?e:m,i=Object.create(a.prototype),c=new C(n||[]);return o(i,"_invoke",{value:S(t,r,c)}),i}function h(t,e,r){try{return{type:"normal",arg:t.call(e,r)}}catch(A){return{type:"throw",arg:A}}}t.wrap=l;var f="suspendedStart",p="executing",d="completed",v={};function m(){}function y(){}function g(){}var w={};u(w,i,(function(){return this}));var _=Object.getPrototypeOf,b=_&&_(_(O([])));b&&b!==r&&n.call(b,i)&&(w=b);var x=g.prototype=m.prototype=Object.create(w);function P(t){["next","throw","return"].forEach((function(e){u(t,e,(function(t){return this._invoke(e,t)}))}))}function k(t,e){function r(o,a,i,c){var s=h(t[o],t,a);if("throw"!==s.type){var u=s.arg,l=u.value;return l&&"object"===typeof l&&n.call(l,"__await")?e.resolve(l.__await).then((function(t){r("next",t,i,c)}),(function(t){r("throw",t,i,c)})):e.resolve(l).then((function(t){u.value=t,i(u)}),(function(t){return r("throw",t,i,c)}))}c(s.arg)}var a;o(this,"_invoke",{value:function(t,n){function o(){return new e((function(e,o){r(t,n,e,o)}))}return a=a?a.then(o,o):o()}})}function S(t,e,r){var n=f;return function(o,a){if(n===p)throw new Error("Generator is already running");if(n===d){if("throw"===o)throw a;return I()}for(r.method=o,r.arg=a;;){var i=r.delegate;if(i){var c=E(i,r);if(c){if(c===v)continue;return c}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(n===f)throw n=d,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);n=p;var s=h(t,e,r);if("normal"===s.type){if(n=r.done?d:"suspendedYield",s.arg===v)continue;return{value:s.arg,done:r.done}}"throw"===s.type&&(n=d,r.method="throw",r.arg=s.arg)}}}function E(t,r){var n=r.method,o=t.iterator[n];if(o===e)return r.delegate=null,"throw"===n&&t.iterator.return&&(r.method="return",r.arg=e,E(t,r),"throw"===r.method)||"return"!==n&&(r.method="throw",r.arg=new TypeError("The iterator does not provide a '"+n+"' method")),v;var a=h(o,t.iterator,r.arg);if("throw"===a.type)return r.method="throw",r.arg=a.arg,r.delegate=null,v;var i=a.arg;return i?i.done?(r[t.resultName]=i.value,r.next=t.nextLoc,"return"!==r.method&&(r.method="next",r.arg=e),r.delegate=null,v):i:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,v)}function R(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function L(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function C(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(R,this),this.reset(!0)}function O(t){if(t){var r=t[i];if(r)return r.call(t);if("function"===typeof t.next)return t;if(!isNaN(t.length)){var o=-1,a=function r(){for(;++o=0;--a){var i=this.tryEntries[a],c=i.completion;if("root"===i.tryLoc)return o("end");if(i.tryLoc<=this.prev){var s=n.call(i,"catchLoc"),u=n.call(i,"finallyLoc");if(s&&u){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),L(r),v}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;L(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,r,n){return this.delegate={iterator:O(t),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=e),v}},t}(t.exports);try{regeneratorRuntime=n}catch(o){"object"===typeof globalThis?globalThis.regeneratorRuntime=n:Function("r","regeneratorRuntime = r")(n)}},mxvI:function(t,e){t.exports=function(t,e){if("undefined"!==typeof Symbol&&Symbol.iterator in Object(t)){var r=[],n=!0,o=!1,a=void 0;try{for(var i,c=t[Symbol.iterator]();!(n=(i=c.next()).done)&&(r.push(i.value),!e||r.length!==e);n=!0);}catch(s){o=!0,a=s}finally{try{n||null==c.return||c.return()}finally{if(o)throw a}}return r}}},nOHt:function(t,e,r){"use strict";var n=r("q722");function o(t,e){var r;if("undefined"===typeof Symbol||null==t[Symbol.iterator]){if(Array.isArray(t)||(r=function(t,e){if(!t)return;if("string"===typeof t)return a(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);"Object"===r&&t.constructor&&(r=t.constructor.name);if("Map"===r||"Set"===r)return Array.from(t);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return a(t,e)}(t))||e&&t&&"number"===typeof t.length){r&&(t=r);var n=0,o=function(){};return{s:o,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,c=!0,s=!1;return{s:function(){r=t[Symbol.iterator]()},n:function(){var t=r.next();return c=t.done,t},e:function(t){s=!0,i=t},f:function(){try{c||null==r.return||r.return()}finally{if(s)throw i}}}}function a(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function P(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function M(e,t){return!t||"object"!==typeof t&&"function"!==typeof t?P(e):t}function T(e){var t=function(){if("undefined"===typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"===typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(dn){return!1}}();return function(){var n,l=F(e);if(t){var o=F(this).constructor;n=Reflect.construct(l,arguments,o)}else n=l.apply(this,arguments);return M(this,n)}}function D(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if("undefined"===typeof Symbol||!(Symbol.iterator in Object(e)))return;var n=[],l=!0,o=!1,r=void 0;try{for(var a,i=e[Symbol.iterator]();!(l=(a=i.next()).done)&&(n.push(a.value),!t||n.length!==t);l=!0);}catch(d){o=!0,r=d}finally{try{l||null==i.return||i.return()}finally{if(o)throw r}}return n}(e,t)||function(e,t){if(!e)return;if("string"===typeof e)return z(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return z(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function z(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,l=new Array(t);n=0?l=setTimeout(d,t-u):(l=null,n||(i=e.apply(r,o),l||(r=null,o=null)))};return function(){r=this,o=arguments,a=+new Date;var u=n&&!l;return l||(l=setTimeout(d,t)),u&&(i=e.apply(r,o),r=null,o=null),i}}}));nn(On);var Rn=ln((function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,n){var l,o;return t||(t=250),function(){var r=n||this,a=+new Date,i=arguments;l&&a=0&&F-E[0]<=f&&F+y+E[1]>=0}(e,n):function(e){var t=o.default.findDOMNode(e);if(!(t.offsetWidth||t.offsetHeight||t.getClientRects().length))return!1;var n=void 0,l=void 0;try{var r=t.getBoundingClientRect();n=r.top,l=r.height}catch(dn){n=_,l=x}var a=window.innerHeight||document.documentElement.clientHeight,i=Array.isArray(e.props.offset)?e.props.offset:[e.props.offset,e.props.offset];return n-i[0]<=a&&n+l+i[1]>=0}(e))?e.visible||(e.props.once&&w.push(e),e.visible=!0,e.forceUpdate()):e.props.once&&e.visible||(e.visible=!1,e.props.unmountIfInvisible&&e.forceUpdate())}},E=function(){w.forEach((function(e){var t=v.indexOf(e);-1!==t&&v.splice(t,1)})),w=[]},S=function(){for(var e=0;e0&&void 0!==arguments[0]?arguments[0]:{};return function(t){return function(o){function r(){m(this,r);var e=p(this,(r.__proto__||Object.getPrototypeOf(r)).call(this));return e.displayName="LazyLoad"+D(t),e}return f(r,o),n(r,[{key:"render",value:function(){return l.default.createElement(T,e,l.default.createElement(t,this.props))}}]),r}(r.Component)}},t.default=T,t.forceCheck=S,t.forceVisible=function(){for(var e=0;e=0&&0===t[e];)e--;return-1===e?null:e}(o))?[null,null]:[o,t[o]-1]:[o,r-1]:0===t||0===r?[null,null]:null===r?[null,t-1]:[null,r-1]},isLast:function(e){return null===l(e)[1]}}},Zn=ln((function(e,t){Object.defineProperty(t,"__esModule",{value:!0});var n=function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],l=!0,o=!1,r=void 0;try{for(var a,i=e[Symbol.iterator]();!(l=(a=i.next()).done)&&(n.push(a.value),!t||n.length!==t);l=!0);}catch(d){o=!0,r=d}finally{try{!l&&i.return&&i.return()}finally{if(o)throw r}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")};function l(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t1?t-1:0),o=1;o2&&void 0!==arguments[2]?arguments[2]:[];if(e===t)return!1;var o=Object.keys(e),r=Object.keys(t);if(o.length!==r.length)return!0;var a={},i=void 0,d=void 0;for(i=0,d=l.length;i=0||Object.prototype.hasOwnProperty.call(e,l)&&(n[l]=e[l]);return n}(e,["isHighlighted","item","renderItem","renderItemData"]);return delete i.sectionIndex,delete i.itemIndex,"function"===typeof i.onMouseEnter&&(i.onMouseEnter=this.onMouseEnter),"function"===typeof i.onMouseLeave&&(i.onMouseLeave=this.onMouseLeave),"function"===typeof i.onMouseDown&&(i.onMouseDown=this.onMouseDown),"function"===typeof i.onClick&&(i.onClick=this.onClick),o.default.createElement("li",n({role:"option"},i,{ref:this.storeItemReference}),r(l,n({isHighlighted:t},a)))}}]),t}(r.Component);c.propTypes={sectionIndex:a.default.number,isHighlighted:a.default.bool.isRequired,itemIndex:a.default.number.isRequired,item:a.default.any.isRequired,renderItem:a.default.func.isRequired,renderItemData:a.default.object.isRequired,onMouseEnter:a.default.func,onMouseLeave:a.default.func,onMouseDown:a.default.func,onClick:a.default.func},t.default=c}));nn(tl);var nl=ln((function(e,t){Object.defineProperty(t,"__esModule",{value:!0});var n=Object.assign||function(e){for(var t=1;tl+t.offsetHeight&&(l=n+e.offsetHeight-t.offsetHeight),l!==t.scrollTop&&(t.scrollTop=l)}}},{key:"render",value:function(){var e=this.theme,t=this.props,l=t.id,o=t.multiSection,r=t.renderInputComponent,i=t.renderItemsContainer,d=t.highlightedSectionIndex,u=t.highlightedItemIndex,s=this.state.isInputFocused,c=o?this.renderSections():this.renderItems(),m=null!==c,p=this.getItemId(d,u),f="react-autowhatever-"+l,_=n({role:"combobox","aria-haspopup":"listbox","aria-owns":f,"aria-expanded":m},e("react-autowhatever-"+l+"-container","container",m&&"containerOpen"),this.props.containerProps),h=r(n({type:"text",value:"",autoComplete:"off","aria-autocomplete":"list","aria-controls":f,"aria-activedescendant":p},e("react-autowhatever-"+l+"-input","input",m&&"inputOpen",s&&"inputFocused"),this.props.inputProps,{onFocus:this.onFocus,onBlur:this.onBlur,onKeyDown:this.props.inputProps.onKeyDown&&this.onKeyDown,ref:this.storeInputReference})),g=i({containerProps:n({id:f,role:"listbox"},e("react-autowhatever-"+l+"-items-container","itemsContainer",m&&"itemsContainerOpen"),{ref:this.storeItemsContainerReference}),children:c});return a.default.createElement("div",_,h,g)}}]),t}(r.Component);f.propTypes={id:i.default.string,multiSection:i.default.bool,renderInputComponent:i.default.func,renderItemsContainer:i.default.func,items:i.default.array.isRequired,renderItem:i.default.func,renderItemData:i.default.object,renderSectionTitle:i.default.func,getSectionItems:i.default.func,containerProps:i.default.object,inputProps:i.default.object,itemProps:i.default.oneOfType([i.default.object,i.default.func]),highlightedSectionIndex:i.default.number,highlightedItemIndex:i.default.number,theme:i.default.oneOfType([i.default.object,i.default.array])},f.defaultProps={id:"1",multiSection:!1,renderInputComponent:function(e){return a.default.createElement("input",e)},renderItemsContainer:function(e){var t=e.containerProps,n=e.children;return a.default.createElement("div",t,n)},renderItem:function(){throw new Error("`renderItem` must be provided")},renderItemData:p,renderSectionTitle:function(){throw new Error("`renderSectionTitle` must be provided")},getSectionItems:function(){throw new Error("`getSectionItems` must be provided")},containerProps:p,inputProps:p,itemProps:p,highlightedSectionIndex:null,highlightedItemIndex:null,theme:{container:"react-autowhatever__container",containerOpen:"react-autowhatever__container--open",input:"react-autowhatever__input",inputOpen:"react-autowhatever__input--open",inputFocused:"react-autowhatever__input--focused",itemsContainer:"react-autowhatever__items-container",itemsContainerOpen:"react-autowhatever__items-container--open",itemsList:"react-autowhatever__items-list",item:"react-autowhatever__item",itemFirst:"react-autowhatever__item--first",itemHighlighted:"react-autowhatever__item--highlighted",sectionContainer:"react-autowhatever__section-container",sectionContainerFirst:"react-autowhatever__section-container--first",sectionTitle:"react-autowhatever__section-title"}},t.default=f}));nn(ll);var ol=ll.default,rl=ln((function(e,t){Object.defineProperty(t,"__esModule",{value:!0});t.defaultTheme={container:"react-autosuggest__container",containerOpen:"react-autosuggest__container--open",input:"react-autosuggest__input",inputOpen:"react-autosuggest__input--open",inputFocused:"react-autosuggest__input--focused",suggestionsContainer:"react-autosuggest__suggestions-container",suggestionsContainerOpen:"react-autosuggest__suggestions-container--open",suggestionsList:"react-autosuggest__suggestions-list",suggestion:"react-autosuggest__suggestion",suggestionFirst:"react-autosuggest__suggestion--first",suggestionHighlighted:"react-autosuggest__suggestion--highlighted",sectionContainer:"react-autosuggest__section-container",sectionContainerFirst:"react-autosuggest__section-container--first",sectionTitle:"react-autosuggest__section-title"},t.mapToAutowhateverTheme=function(e){var t={};for(var n in e)switch(n){case"suggestionsContainer":t.itemsContainer=e[n];break;case"suggestionsContainerOpen":t.itemsContainerOpen=e[n];break;case"suggestion":t.item=e[n];break;case"suggestionFirst":t.itemFirst=e[n];break;case"suggestionHighlighted":t.itemHighlighted=e[n];break;case"suggestionsList":t.itemsList=e[n];break;default:t[n]=e[n]}return t}}));nn(rl);rl.defaultTheme,rl.mapToAutowhateverTheme;var al=ln((function(e,t){Object.defineProperty(t,"__esModule",{value:!0});var n=Object.assign||function(e){for(var t=1;t0&&!1===this.justPressedUpDown&&!1===this.justMouseEntered&&this.highlightFirstSuggestion():this.willRenderSuggestions(e)?this.state.isCollapsed&&!this.justSelectedSuggestion&&this.revealSuggestions():this.resetHighlightedSuggestion()}},{key:"componentDidUpdate",value:function(e,t){var n=this.props,l=n.suggestions,o=n.onSuggestionHighlighted,r=n.highlightFirstSuggestion;if(!(0,i.default)(l,e.suggestions)&&l.length>0&&r)this.highlightFirstSuggestion();else if(o){var a=this.getHighlightedSuggestion();a!=t.highlightedSuggestion&&o({suggestion:a})}}},{key:"componentWillUnmount",value:function(){document.removeEventListener("mousedown",this.onDocumentMouseDown),document.removeEventListener("mouseup",this.onDocumentMouseUp)}},{key:"updateHighlightedSuggestion",value:function(e,t,n){var l=this;this.setState((function(o){var r=o.valueBeforeUpDown;return null===t?r=null:null===r&&"undefined"!==typeof n&&(r=n),{highlightedSectionIndex:e,highlightedSuggestionIndex:t,highlightedSuggestion:null===t?null:l.getSuggestion(e,t),valueBeforeUpDown:r}}))}},{key:"resetHighlightedSuggestion",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.setState((function(t){var n=t.valueBeforeUpDown;return{highlightedSectionIndex:null,highlightedSuggestionIndex:null,highlightedSuggestion:null,valueBeforeUpDown:e?null:n}}))}},{key:"revealSuggestions",value:function(){this.setState({isCollapsed:!1})}},{key:"closeSuggestions",value:function(){this.setState({highlightedSectionIndex:null,highlightedSuggestionIndex:null,highlightedSuggestion:null,valueBeforeUpDown:null,isCollapsed:!0})}},{key:"getSuggestion",value:function(e,t){var n=this.props,l=n.suggestions,o=n.multiSection,r=n.getSectionSuggestions;return o?r(l[e])[t]:l[t]}},{key:"getHighlightedSuggestion",value:function(){var e=this.state,t=e.highlightedSectionIndex,n=e.highlightedSuggestionIndex;return null===n?null:this.getSuggestion(t,n)}},{key:"getSuggestionValueByIndex",value:function(e,t){return(0,this.props.getSuggestionValue)(this.getSuggestion(e,t))}},{key:"getSuggestionIndices",value:function(e){var t=e.getAttribute("data-section-index"),n=e.getAttribute("data-suggestion-index");return{sectionIndex:"string"===typeof t?parseInt(t,10):null,suggestionIndex:parseInt(n,10)}}},{key:"findSuggestionElement",value:function(e){var t=e;do{if(null!==t.getAttribute("data-suggestion-index"))return t;t=t.parentNode}while(null!==t);throw console.error("Clicked element:",e),new Error("Couldn't find suggestion element")}},{key:"maybeCallOnChange",value:function(e,t,n){var l=this.props.inputProps,o=l.value,r=l.onChange;t!==o&&r(e,{newValue:t,method:n})}},{key:"willRenderSuggestions",value:function(e){var t=e.suggestions,n=e.inputProps,l=e.shouldRenderSuggestions,o=n.value;return t.length>0&&l(o)}},{key:"getQuery",value:function(){var e=this.props.inputProps.value,t=this.state.valueBeforeUpDown;return(null===t?e:t).trim()}},{key:"render",value:function(){var e=this,t=this.props,l=t.suggestions,r=t.renderInputComponent,a=t.onSuggestionsFetchRequested,i=t.renderSuggestion,u=t.inputProps,s=t.multiSection,m=t.renderSectionTitle,p=t.id,f=t.getSectionSuggestions,_=t.theme,h=t.getSuggestionValue,g=t.alwaysRenderSuggestions,x=t.highlightFirstSuggestion,b=this.state,v=b.isFocused,w=b.isCollapsed,y=b.highlightedSectionIndex,k=b.highlightedSuggestionIndex,C=b.valueBeforeUpDown,F=g?c:this.props.shouldRenderSuggestions,E=u.value,S=u.onFocus,P=u.onKeyDown,M=this.willRenderSuggestions(this.props),T=g||v&&!w&&M,D=T?l:[],z=n({},u,{onFocus:function(t){if(!e.justSelectedSuggestion&&!e.justClickedOnSuggestionsContainer){var n=F(E);e.setState({isFocused:!0,isCollapsed:!n}),S&&S(t),n&&a({value:E,reason:"input-focused"})}},onBlur:function(t){e.justClickedOnSuggestionsContainer?e.input.focus():(e.blurEvent=t,e.justSelectedSuggestion||(e.onBlur(),e.onSuggestionsClearRequested()))},onChange:function(t){var l=t.target.value,o=F(l);e.maybeCallOnChange(t,l,"type"),e.suggestionsContainer&&(e.suggestionsContainer.scrollTop=0),e.setState(n({},x?{}:{highlightedSectionIndex:null,highlightedSuggestionIndex:null,highlightedSuggestion:null},{valueBeforeUpDown:null,isCollapsed:!o})),o?a({value:l,reason:"input-changed"}):e.onSuggestionsClearRequested()},onKeyDown:function(t,n){var o=t.keyCode;switch(o){case 40:case 38:if(w)F(E)&&(a({value:E,reason:"suggestions-revealed"}),e.revealSuggestions());else if(l.length>0){var r=n.newHighlightedSectionIndex,i=n.newHighlightedItemIndex,d=void 0;d=null===i?null===C?E:C:e.getSuggestionValueByIndex(r,i),e.updateHighlightedSuggestion(r,i,E),e.maybeCallOnChange(t,d,40===o?"down":"up")}t.preventDefault(),e.justPressedUpDown=!0,setTimeout((function(){e.justPressedUpDown=!1}));break;case 13:if(229===t.keyCode)break;var u=e.getHighlightedSuggestion();if(T&&!g&&e.closeSuggestions(),null!=u){var s=h(u);e.maybeCallOnChange(t,s,"enter"),e.onSuggestionSelected(t,{suggestion:u,suggestionValue:s,suggestionIndex:k,sectionIndex:y,method:"enter"}),e.justSelectedSuggestion=!0,setTimeout((function(){e.justSelectedSuggestion=!1}))}break;case 27:T&&t.preventDefault();var c=T&&!g;if(null===C){if(!c){e.maybeCallOnChange(t,"","escape"),F("")?a({value:"",reason:"escape-pressed"}):e.onSuggestionsClearRequested()}}else e.maybeCallOnChange(t,C,"escape");c?(e.onSuggestionsClearRequested(),e.closeSuggestions()):e.resetHighlightedSuggestion()}P&&P(t)}}),I={query:this.getQuery()};return o.default.createElement(d.default,{multiSection:s,items:D,renderInputComponent:r,renderItemsContainer:this.renderSuggestionsContainer,renderItem:i,renderItemData:I,renderSectionTitle:m,getSectionItems:f,highlightedSectionIndex:y,highlightedItemIndex:k,inputProps:z,itemProps:this.itemProps,theme:(0,rl.mapToAutowhateverTheme)(_),id:p,ref:this.storeAutowhateverRef})}}]),t}(r.Component);m.propTypes={suggestions:a.default.array.isRequired,onSuggestionsFetchRequested:function(e,t){var n=e[t];if("function"!==typeof n)throw new Error("'onSuggestionsFetchRequested' must be implemented. See: https://github.com/moroshko/react-autosuggest#onSuggestionsFetchRequestedProp")},onSuggestionsClearRequested:function(e,t){var n=e[t];if(!1===e.alwaysRenderSuggestions&&"function"!==typeof n)throw new Error("'onSuggestionsClearRequested' must be implemented. See: https://github.com/moroshko/react-autosuggest#onSuggestionsClearRequestedProp")},onSuggestionSelected:a.default.func,onSuggestionHighlighted:a.default.func,renderInputComponent:a.default.func,renderSuggestionsContainer:a.default.func,getSuggestionValue:a.default.func.isRequired,renderSuggestion:a.default.func.isRequired,inputProps:function(e,t){var n=e[t];if(!n.hasOwnProperty("value"))throw new Error("'inputProps' must have 'value'.");if(!n.hasOwnProperty("onChange"))throw new Error("'inputProps' must have 'onChange'.")},shouldRenderSuggestions:a.default.func,alwaysRenderSuggestions:a.default.bool,multiSection:a.default.bool,renderSectionTitle:function(e,t){var n=e[t];if(!0===e.multiSection&&"function"!==typeof n)throw new Error("'renderSectionTitle' must be implemented. See: https://github.com/moroshko/react-autosuggest#renderSectionTitleProp")},getSectionSuggestions:function(e,t){var n=e[t];if(!0===e.multiSection&&"function"!==typeof n)throw new Error("'getSectionSuggestions' must be implemented. See: https://github.com/moroshko/react-autosuggest#getSectionSuggestionsProp")},focusInputOnSuggestionClick:a.default.bool,highlightFirstSuggestion:a.default.bool,theme:a.default.object,id:a.default.string},m.defaultProps={renderSuggestionsContainer:function(e){var t=e.containerProps,n=e.children;return o.default.createElement("div",t,n)},shouldRenderSuggestions:function(e){return e.trim().length>0},alwaysRenderSuggestions:!1,multiSection:!1,focusInputOnSuggestionClick:!0,highlightFirstSuggestion:!1,theme:rl.defaultTheme,id:"1"};var p=function(){var e=this;this.onDocumentMouseDown=function(t){e.justClickedOnSuggestionsContainer=!1;for(var n=t.detail&&t.detail.target||t.target;null!==n&&n!==document;){if(null!==n.getAttribute("data-suggestion-index"))return;if(n===e.suggestionsContainer)return void(e.justClickedOnSuggestionsContainer=!0);n=n.parentNode}},this.storeAutowhateverRef=function(t){null!==t&&(e.autowhatever=t)},this.onSuggestionMouseEnter=function(t,n){var l=n.sectionIndex,o=n.itemIndex;e.updateHighlightedSuggestion(l,o),t.target===e.pressedSuggestion&&(e.justSelectedSuggestion=!0),e.justMouseEntered=!0,setTimeout((function(){e.justMouseEntered=!1}))},this.highlightFirstSuggestion=function(){e.updateHighlightedSuggestion(e.props.multiSection?0:null,0)},this.onDocumentMouseUp=function(){e.pressedSuggestion&&!e.justSelectedSuggestion&&e.input.focus(),e.pressedSuggestion=null},this.onSuggestionMouseDown=function(t){e.justSelectedSuggestion||(e.justSelectedSuggestion=!0,e.pressedSuggestion=t.target)},this.onSuggestionsClearRequested=function(){var t=e.props.onSuggestionsClearRequested;t&&t()},this.onSuggestionSelected=function(t,n){var l=e.props,o=l.alwaysRenderSuggestions,r=l.onSuggestionSelected,a=l.onSuggestionsFetchRequested;r&&r(t,n),o?a({value:n.suggestionValue,reason:"suggestion-selected"}):e.onSuggestionsClearRequested(),e.resetHighlightedSuggestion()},this.onSuggestionClick=function(t){var n=e.props,l=n.alwaysRenderSuggestions,o=n.focusInputOnSuggestionClick,r=e.getSuggestionIndices(e.findSuggestionElement(t.target)),a=r.sectionIndex,i=r.suggestionIndex,d=e.getSuggestion(a,i),u=e.props.getSuggestionValue(d);e.maybeCallOnChange(t,u,"click"),e.onSuggestionSelected(t,{suggestion:d,suggestionValue:u,suggestionIndex:i,sectionIndex:a,method:"click"}),l||e.closeSuggestions(),!0===o?e.input.focus():e.onBlur(),setTimeout((function(){e.justSelectedSuggestion=!1}))},this.onBlur=function(){var t=e.props,n=t.inputProps,l=t.shouldRenderSuggestions,o=n.value,r=n.onBlur,a=e.getHighlightedSuggestion(),i=l(o);e.setState({isFocused:!1,highlightedSectionIndex:null,highlightedSuggestionIndex:null,highlightedSuggestion:null,valueBeforeUpDown:null,isCollapsed:!i}),r&&r(e.blurEvent,{highlightedSuggestion:a})},this.onSuggestionMouseLeave=function(t){e.resetHighlightedSuggestion(!1),e.justSelectedSuggestion&&t.target===e.pressedSuggestion&&(e.justSelectedSuggestion=!1)},this.onSuggestionTouchStart=function(){e.justSelectedSuggestion=!0},this.onSuggestionTouchMove=function(){e.justSelectedSuggestion=!1,e.pressedSuggestion=null,e.input.focus()},this.itemProps=function(t){return{"data-section-index":t.sectionIndex,"data-suggestion-index":t.itemIndex,onMouseEnter:e.onSuggestionMouseEnter,onMouseLeave:e.onSuggestionMouseLeave,onMouseDown:e.onSuggestionMouseDown,onTouchStart:e.onSuggestionTouchStart,onTouchMove:e.onSuggestionTouchMove,onClick:e.onSuggestionClick}},this.renderSuggestionsContainer=function(t){var n=t.containerProps,l=t.children;return(0,e.props.renderSuggestionsContainer)({containerProps:n,children:l,query:e.getQuery()})}};t.default=m}));nn(al);var il=al.default,dl="AutoSuggestInput-module__container",ul="AutoSuggestInput-module__suggestionsContainer",sl="AutoSuggestInput-module__suggestionsList",cl="AutoSuggestInput-module__suggestion",ml="AutoSuggestInput-module__suggestionHighlighted";function pl(e,t){var n=function(e,t){if(!e||!t)return[];for(var n,l=new RegExp(e,"gi"),o=[];n=l.exec(t);){var r=n.index,a=l.lastIndex;a>r&&o.push({start:r,end:a}),n.index===l.lastIndex&&l.lastIndex++}return o}(e,t);if(0===n.length)return t;var l=0;return n.map((function(e,o){var a=e.start,i=e.end,d=r.createElement(r.Fragment,null,t.slice(l,a),r.createElement("strong",null,t.slice(a,i)),o===n.length-1&&t.slice(i));return l=i,d}))}var fl=o.forwardRef((function(e,t){var n=e.suggestions,l=e.onSuggestionSelected,a=e.onSuggestionHighlighted,i=e.value,d=void 0===i?"":i,u=e.onChange,s=void 0===u?function(){}:u,c=S(e,["suggestions","onSuggestionSelected","onSuggestionHighlighted","value","onChange"]);fl.displayName="AutoSuggestInput";var m=D(o.useState(n),2),p=m[0],f=m[1];return r.createElement(il,{ref:t,suggestions:p,onSuggestionsFetchRequested:function(e){var t=e.value.toLowerCase();f(n.filter((function(e){return e.value.toString().toLowerCase().includes(t)})))},onSuggestionsClearRequested:function(){return f([])},getSuggestionValue:function(e){return e.value},renderSuggestion:function(e,t){return pl(t.query,e.value)},inputProps:{onChange:s,value:d.toString()},renderInputComponent:function(e){return r.createElement(Kn,w({},c,e))},onSuggestionSelected:"function"===typeof l?function(e,t){var n=t.suggestion;e.stopPropagation(),e.preventDefault(),l(n)}:void 0,onSuggestionHighlighted:"function"===typeof a?function(e){return a(e.suggestion.value)}:void 0,shouldRenderSuggestions:function(){return!0},theme:{container:dl,suggestionsContainer:ul,suggestionsList:sl,suggestion:cl,suggestionHighlighted:ml}})})),_l=o.forwardRef((function(e,t){_l.displayName="Input";var n=e.id,l=e.label,o=e.className,a=e.hideErrorText,i=e.error,d=e.touched,u=e.onChange,s=e.value,c=e.suggestions,m=e.onSuggestionSelected,p=e.onSuggestionHighlighted,f=S(e,["id","label","className","hideErrorText","error","touched","onChange","value","suggestions","onSuggestionSelected","onSuggestionHighlighted"]),_=[o,Gn.wrapper].filter(Boolean).join(" "),h=n||l&&"".concat(l.toString().split(" ").join("-"),"-input")||"";return r.createElement(Un,{className:_,direction:"column"},l&&r.createElement(qn,{htmlFor:h},l),c?r.createElement(fl,w({ref:t,error:i,id:n,touched:d,onChange:u,value:s,suggestions:c,onSuggestionSelected:m,onSuggestionHighlighted:p},f)):r.createElement(Kn,w({ref:t,error:i,id:n,touched:d,onChange:u,value:s},f)),i&&d&&!a&&r.createElement(Z,null,i))})),hl=function(e){C(n,e);var t=T(n);function n(){return g(this,n),t.apply(this,arguments)}return b(n,[{key:"render",value:function(){var e=this.props,t=e.children,n=e.as,l=S(e,["children","as"]);return o.createElement(V,w({as:n},l),t)}}]),n}(o.PureComponent);v(hl,"defaultProps",{as:"p",fontSize:"body"});var gl=function(e){C(n,e);var t=T(n);function n(){return g(this,n),t.apply(this,arguments)}return b(n,[{key:"render",value:function(){var e=this.props,t=e.children,n=e.as,l=S(e,["children","as"]);return o.createElement(V,w({as:n},l),t)}}]),n}(o.PureComponent);v(gl,"defaultProps",{as:"span",fontSize:"body"});var xl={"d-none":"RangeSlider-module__d-none","d-inline":"RangeSlider-module__d-inline","d-inline-block":"RangeSlider-module__d-inline-block","d-block":"RangeSlider-module__d-block","d-table":"RangeSlider-module__d-table","d-table-row":"RangeSlider-module__d-table-row","d-table-cell":"RangeSlider-module__d-table-cell","d-flex":"RangeSlider-module__d-flex","d-inline-flex":"RangeSlider-module__d-inline-flex","d-sm-none":"RangeSlider-module__d-sm-none","d-sm-inline":"RangeSlider-module__d-sm-inline","d-sm-inline-block":"RangeSlider-module__d-sm-inline-block","d-sm-block":"RangeSlider-module__d-sm-block","d-sm-table":"RangeSlider-module__d-sm-table","d-sm-table-row":"RangeSlider-module__d-sm-table-row","d-sm-table-cell":"RangeSlider-module__d-sm-table-cell","d-sm-flex":"RangeSlider-module__d-sm-flex","d-sm-inline-flex":"RangeSlider-module__d-sm-inline-flex","d-md-none":"RangeSlider-module__d-md-none","d-md-inline":"RangeSlider-module__d-md-inline","d-md-inline-block":"RangeSlider-module__d-md-inline-block","d-md-block":"RangeSlider-module__d-md-block","d-md-table":"RangeSlider-module__d-md-table","d-md-table-row":"RangeSlider-module__d-md-table-row","d-md-table-cell":"RangeSlider-module__d-md-table-cell","d-md-flex":"RangeSlider-module__d-md-flex","d-md-inline-flex":"RangeSlider-module__d-md-inline-flex","d-lg-none":"RangeSlider-module__d-lg-none","d-lg-inline":"RangeSlider-module__d-lg-inline","d-lg-inline-block":"RangeSlider-module__d-lg-inline-block","d-lg-block":"RangeSlider-module__d-lg-block","d-lg-table":"RangeSlider-module__d-lg-table","d-lg-table-row":"RangeSlider-module__d-lg-table-row","d-lg-table-cell":"RangeSlider-module__d-lg-table-cell","d-lg-flex":"RangeSlider-module__d-lg-flex","d-lg-inline-flex":"RangeSlider-module__d-lg-inline-flex","d-xl-none":"RangeSlider-module__d-xl-none","d-xl-inline":"RangeSlider-module__d-xl-inline","d-xl-inline-block":"RangeSlider-module__d-xl-inline-block","d-xl-block":"RangeSlider-module__d-xl-block","d-xl-table":"RangeSlider-module__d-xl-table","d-xl-table-row":"RangeSlider-module__d-xl-table-row","d-xl-table-cell":"RangeSlider-module__d-xl-table-cell","d-xl-flex":"RangeSlider-module__d-xl-flex","d-xl-inline-flex":"RangeSlider-module__d-xl-inline-flex","d-print-none":"RangeSlider-module__d-print-none","d-print-inline":"RangeSlider-module__d-print-inline","d-print-inline-block":"RangeSlider-module__d-print-inline-block","d-print-block":"RangeSlider-module__d-print-block","d-print-table":"RangeSlider-module__d-print-table","d-print-table-row":"RangeSlider-module__d-print-table-row","d-print-table-cell":"RangeSlider-module__d-print-table-cell","d-print-flex":"RangeSlider-module__d-print-flex","d-print-inline-flex":"RangeSlider-module__d-print-inline-flex",slider:"RangeSlider-module__slider"},bl=function(e){C(n,e);var t=T(n);function n(){return g(this,n),t.apply(this,arguments)}return b(n,[{key:"render",value:function(){var e=this.props,t=e.className,n=S(e,["className"]);return o.createElement("input",w({},n,{type:"range",className:t?[xl.slider,t].join(" "):xl.slider}))}}]),n}(o.PureComponent),vl={row:"Row-module__row","no-gutters":"Row-module__no-gutters",col:"Row-module__col","justify-content-start":"Row-module__justify-content-start","justify-content-end":"Row-module__justify-content-end","justify-content-center":"Row-module__justify-content-center","justify-content-between":"Row-module__justify-content-between","justify-content-around":"Row-module__justify-content-around","justify-content-evenly":"Row-module__justify-content-evenly","align-items-start":"Row-module__align-items-start","align-items-end":"Row-module__align-items-end","align-items-center":"Row-module__align-items-center","align-items-baseline":"Row-module__align-items-baseline","align-items-stretch":"Row-module__align-items-stretch","align-content-start":"Row-module__align-content-start","align-content-end":"Row-module__align-content-end","align-content-center":"Row-module__align-content-center","align-content-between":"Row-module__align-content-between","align-content-around":"Row-module__align-content-around","align-content-stretch":"Row-module__align-content-stretch","justify-content-sm-start":"Row-module__justify-content-sm-start","justify-content-sm-end":"Row-module__justify-content-sm-end","justify-content-sm-center":"Row-module__justify-content-sm-center","justify-content-sm-between":"Row-module__justify-content-sm-between","justify-content-sm-around":"Row-module__justify-content-sm-around","justify-content-sm-evenly":"Row-module__justify-content-sm-evenly","align-items-sm-start":"Row-module__align-items-sm-start","align-items-sm-end":"Row-module__align-items-sm-end","align-items-sm-center":"Row-module__align-items-sm-center","align-items-sm-baseline":"Row-module__align-items-sm-baseline","align-items-sm-stretch":"Row-module__align-items-sm-stretch","align-content-sm-start":"Row-module__align-content-sm-start","align-content-sm-end":"Row-module__align-content-sm-end","align-content-sm-center":"Row-module__align-content-sm-center","align-content-sm-between":"Row-module__align-content-sm-between","align-content-sm-around":"Row-module__align-content-sm-around","align-content-sm-stretch":"Row-module__align-content-sm-stretch","justify-content-md-start":"Row-module__justify-content-md-start","justify-content-md-end":"Row-module__justify-content-md-end","justify-content-md-center":"Row-module__justify-content-md-center","justify-content-md-between":"Row-module__justify-content-md-between","justify-content-md-around":"Row-module__justify-content-md-around","justify-content-md-evenly":"Row-module__justify-content-md-evenly","align-items-md-start":"Row-module__align-items-md-start","align-items-md-end":"Row-module__align-items-md-end","align-items-md-center":"Row-module__align-items-md-center","align-items-md-baseline":"Row-module__align-items-md-baseline","align-items-md-stretch":"Row-module__align-items-md-stretch","align-content-md-start":"Row-module__align-content-md-start","align-content-md-end":"Row-module__align-content-md-end","align-content-md-center":"Row-module__align-content-md-center","align-content-md-between":"Row-module__align-content-md-between","align-content-md-around":"Row-module__align-content-md-around","align-content-md-stretch":"Row-module__align-content-md-stretch","justify-content-lg-start":"Row-module__justify-content-lg-start","justify-content-lg-end":"Row-module__justify-content-lg-end","justify-content-lg-center":"Row-module__justify-content-lg-center","justify-content-lg-between":"Row-module__justify-content-lg-between","justify-content-lg-around":"Row-module__justify-content-lg-around","justify-content-lg-evenly":"Row-module__justify-content-lg-evenly","align-items-lg-start":"Row-module__align-items-lg-start","align-items-lg-end":"Row-module__align-items-lg-end","align-items-lg-center":"Row-module__align-items-lg-center","align-items-lg-baseline":"Row-module__align-items-lg-baseline","align-items-lg-stretch":"Row-module__align-items-lg-stretch","align-content-lg-start":"Row-module__align-content-lg-start","align-content-lg-end":"Row-module__align-content-lg-end","align-content-lg-center":"Row-module__align-content-lg-center","align-content-lg-between":"Row-module__align-content-lg-between","align-content-lg-around":"Row-module__align-content-lg-around","align-content-lg-stretch":"Row-module__align-content-lg-stretch","justify-content-xl-start":"Row-module__justify-content-xl-start","justify-content-xl-end":"Row-module__justify-content-xl-end","justify-content-xl-center":"Row-module__justify-content-xl-center","justify-content-xl-between":"Row-module__justify-content-xl-between","justify-content-xl-around":"Row-module__justify-content-xl-around","justify-content-xl-evenly":"Row-module__justify-content-xl-evenly","align-items-xl-start":"Row-module__align-items-xl-start","align-items-xl-end":"Row-module__align-items-xl-end","align-items-xl-center":"Row-module__align-items-xl-center","align-items-xl-baseline":"Row-module__align-items-xl-baseline","align-items-xl-stretch":"Row-module__align-items-xl-stretch","align-content-xl-start":"Row-module__align-content-xl-start","align-content-xl-end":"Row-module__align-content-xl-end","align-content-xl-center":"Row-module__align-content-xl-center","align-content-xl-between":"Row-module__align-content-xl-between","align-content-xl-around":"Row-module__align-content-xl-around","align-content-xl-stretch":"Row-module__align-content-xl-stretch"},wl=function(e){C(n,e);var t=T(n);function n(){return g(this,n),t.apply(this,arguments)}return b(n,[{key:"render",value:function(){var e=this.props,t=e.className,n=e.children,l=e.alignItems,r=e.smAlignItems,a=e.mdAlignItems,i=e.lgAlignItems,d=e.xlAlignItems,u=e.justifyContent,s=e.smJustifyContent,c=e.mdJustifyContent,m=e.lgJustifyContent,p=e.xlJustifyContent,f=e.noGutters,_=S(e,["className","children","alignItems","smAlignItems","mdAlignItems","lgAlignItems","xlAlignItems","justifyContent","smJustifyContent","mdJustifyContent","lgJustifyContent","xlJustifyContent","noGutters"]);return o.createElement("div",w({className:[vl.row,l&&vl["align-items-".concat(l)],r&&vl["align-items-sm-".concat(r)],a&&vl["align-items-md-".concat(a)],i&&vl["align-items-lg-".concat(i)],d&&vl["align-items-xl-".concat(d)],u&&vl["justify-content-".concat(u)],s&&vl["justify-content-sm-".concat(s)],c&&vl["justify-content-md-".concat(c)],m&&vl["justify-content-lg-".concat(m)],p&&vl["justify-content-xl-".concat(p)],f&&vl["no-gutters"],t].filter(Boolean).join(" ")},_),n)}}]),n}(o.PureComponent),yl={"d-none":"TextArea-module__d-none","d-inline":"TextArea-module__d-inline","d-inline-block":"TextArea-module__d-inline-block","d-block":"TextArea-module__d-block","d-table":"TextArea-module__d-table","d-table-row":"TextArea-module__d-table-row","d-table-cell":"TextArea-module__d-table-cell","d-flex":"TextArea-module__d-flex","d-inline-flex":"TextArea-module__d-inline-flex","d-sm-none":"TextArea-module__d-sm-none","d-sm-inline":"TextArea-module__d-sm-inline","d-sm-inline-block":"TextArea-module__d-sm-inline-block","d-sm-block":"TextArea-module__d-sm-block","d-sm-table":"TextArea-module__d-sm-table","d-sm-table-row":"TextArea-module__d-sm-table-row","d-sm-table-cell":"TextArea-module__d-sm-table-cell","d-sm-flex":"TextArea-module__d-sm-flex","d-sm-inline-flex":"TextArea-module__d-sm-inline-flex","d-md-none":"TextArea-module__d-md-none","d-md-inline":"TextArea-module__d-md-inline","d-md-inline-block":"TextArea-module__d-md-inline-block","d-md-block":"TextArea-module__d-md-block","d-md-table":"TextArea-module__d-md-table","d-md-table-row":"TextArea-module__d-md-table-row","d-md-table-cell":"TextArea-module__d-md-table-cell","d-md-flex":"TextArea-module__d-md-flex","d-md-inline-flex":"TextArea-module__d-md-inline-flex","d-lg-none":"TextArea-module__d-lg-none","d-lg-inline":"TextArea-module__d-lg-inline","d-lg-inline-block":"TextArea-module__d-lg-inline-block","d-lg-block":"TextArea-module__d-lg-block","d-lg-table":"TextArea-module__d-lg-table","d-lg-table-row":"TextArea-module__d-lg-table-row","d-lg-table-cell":"TextArea-module__d-lg-table-cell","d-lg-flex":"TextArea-module__d-lg-flex","d-lg-inline-flex":"TextArea-module__d-lg-inline-flex","d-xl-none":"TextArea-module__d-xl-none","d-xl-inline":"TextArea-module__d-xl-inline","d-xl-inline-block":"TextArea-module__d-xl-inline-block","d-xl-block":"TextArea-module__d-xl-block","d-xl-table":"TextArea-module__d-xl-table","d-xl-table-row":"TextArea-module__d-xl-table-row","d-xl-table-cell":"TextArea-module__d-xl-table-cell","d-xl-flex":"TextArea-module__d-xl-flex","d-xl-inline-flex":"TextArea-module__d-xl-inline-flex","d-print-none":"TextArea-module__d-print-none","d-print-inline":"TextArea-module__d-print-inline","d-print-inline-block":"TextArea-module__d-print-inline-block","d-print-block":"TextArea-module__d-print-block","d-print-table":"TextArea-module__d-print-table","d-print-table-row":"TextArea-module__d-print-table-row","d-print-table-cell":"TextArea-module__d-print-table-cell","d-print-flex":"TextArea-module__d-print-flex","d-print-inline-flex":"TextArea-module__d-print-inline-flex","vdb-textarea-container":"TextArea-module__vdb-textarea-container","vdb-textarea":"TextArea-module__vdb-textarea","vdb-textarea-icon":"TextArea-module__vdb-textarea-icon","vdb-textarea-icon-focus":"TextArea-module__vdb-textarea-icon-focus"},kl=function(e){C(n,e);var t=T(n);function n(e){var l;return g(this,n),v(P(l=t.call(this,e)),"emitChangeDebounced",void 0),v(P(l),"state",{isFocused:!1}),v(P(l),"handleChange",(function(e){l.emitChangeDebounced(e.target.value),l.props.onChange&&l.props.onChange(e)})),v(P(l),"onTextAreaFocus",(function(){l.setState({isFocused:!0})})),v(P(l),"onTextAreaBlur",(function(){l.setState({isFocused:!1})})),l.emitChangeDebounced=u(l.emitChange,l.props.debounceTime||250),l}return b(n,[{key:"componentWillUnmount",value:function(){this.emitChangeDebounced.cancel()}},{key:"render",value:function(){var e=this.state.isFocused,t=this.props,n=t.className,l=(t.debounceTime,t.onDebouncedChange,t.icon),r=S(t,["className","debounceTime","onDebouncedChange","icon"]);return o.createElement("div",{className:["".concat(n||""),yl["vdb-textarea-container"]].join(" ")},o.createElement("textarea",w({className:yl["vdb-textarea"]},r,{onChange:this.handleChange,onFocus:this.onTextAreaFocus,onBlur:this.onTextAreaBlur})),l?o.createElement(Gt,{name:l,className:e?yl["vdb-textarea-icon-focus"]:yl["vdb-textarea-icon"],fontSize:"16"}):null)}},{key:"emitChange",value:function(e){this.props.onDebouncedChange&&this.props.onDebouncedChange(e)}}]),n}(o.PureComponent),Cl={"d-none":"Toggle-module__d-none","d-inline":"Toggle-module__d-inline","d-inline-block":"Toggle-module__d-inline-block","d-block":"Toggle-module__d-block","d-table":"Toggle-module__d-table","d-table-row":"Toggle-module__d-table-row","d-table-cell":"Toggle-module__d-table-cell","d-flex":"Toggle-module__d-flex","d-inline-flex":"Toggle-module__d-inline-flex","d-sm-none":"Toggle-module__d-sm-none","d-sm-inline":"Toggle-module__d-sm-inline","d-sm-inline-block":"Toggle-module__d-sm-inline-block","d-sm-block":"Toggle-module__d-sm-block","d-sm-table":"Toggle-module__d-sm-table","d-sm-table-row":"Toggle-module__d-sm-table-row","d-sm-table-cell":"Toggle-module__d-sm-table-cell","d-sm-flex":"Toggle-module__d-sm-flex","d-sm-inline-flex":"Toggle-module__d-sm-inline-flex","d-md-none":"Toggle-module__d-md-none","d-md-inline":"Toggle-module__d-md-inline","d-md-inline-block":"Toggle-module__d-md-inline-block","d-md-block":"Toggle-module__d-md-block","d-md-table":"Toggle-module__d-md-table","d-md-table-row":"Toggle-module__d-md-table-row","d-md-table-cell":"Toggle-module__d-md-table-cell","d-md-flex":"Toggle-module__d-md-flex","d-md-inline-flex":"Toggle-module__d-md-inline-flex","d-lg-none":"Toggle-module__d-lg-none","d-lg-inline":"Toggle-module__d-lg-inline","d-lg-inline-block":"Toggle-module__d-lg-inline-block","d-lg-block":"Toggle-module__d-lg-block","d-lg-table":"Toggle-module__d-lg-table","d-lg-table-row":"Toggle-module__d-lg-table-row","d-lg-table-cell":"Toggle-module__d-lg-table-cell","d-lg-flex":"Toggle-module__d-lg-flex","d-lg-inline-flex":"Toggle-module__d-lg-inline-flex","d-xl-none":"Toggle-module__d-xl-none","d-xl-inline":"Toggle-module__d-xl-inline","d-xl-inline-block":"Toggle-module__d-xl-inline-block","d-xl-block":"Toggle-module__d-xl-block","d-xl-table":"Toggle-module__d-xl-table","d-xl-table-row":"Toggle-module__d-xl-table-row","d-xl-table-cell":"Toggle-module__d-xl-table-cell","d-xl-flex":"Toggle-module__d-xl-flex","d-xl-inline-flex":"Toggle-module__d-xl-inline-flex","d-print-none":"Toggle-module__d-print-none","d-print-inline":"Toggle-module__d-print-inline","d-print-inline-block":"Toggle-module__d-print-inline-block","d-print-block":"Toggle-module__d-print-block","d-print-table":"Toggle-module__d-print-table","d-print-table-row":"Toggle-module__d-print-table-row","d-print-table-cell":"Toggle-module__d-print-table-cell","d-print-flex":"Toggle-module__d-print-flex","d-print-inline-flex":"Toggle-module__d-print-inline-flex",switch:"Toggle-module__switch","switch-input":"Toggle-module__switch-input","switch-wrapper":"Toggle-module__switch-wrapper","switch-label--on":"Toggle-module__switch-label--on","switch-toggle":"Toggle-module__switch-toggle","switch-label":"Toggle-module__switch-label","switch-label--off":"Toggle-module__switch-label--off","switch-icon":"Toggle-module__switch-icon","switch-icon-right":"Toggle-module__switch-icon-right",dark:"Toggle-module__dark",switchChecked:"Toggle-module__switchChecked"},Fl=function(e){C(n,e);var t=T(n);function n(e){var l;return g(this,n),(l=t.call(this,e)).state={checked:!!e.checked},l}return b(n,[{key:"handleChange",value:function(e){this.setState({checked:e}),"function"===typeof this.props.onChange&&this.props.onChange(e)}},{key:"render",value:function(){var e,t=this,n=this.props,l=n.name,r=n.customIcons,a=n.setCheckedByParent,i=n.theme,d=n.iconSize,u=S(n,["name","customIcons","setCheckedByParent","theme","iconSize"]),s=(a?this.props:this.state).checked,c=s?Cl.switchChecked:"";return e="dark"===i?s?1:0:2,o.createElement("div",{className:[Cl.switch,Cl[i],c].filter(Boolean).join(" ")},o.createElement("input",w({},u,{type:"checkbox",id:l,name:l,checked:s,className:Cl["switch-input"],onChange:function(e){return t.handleChange(e.target.checked)}})),o.createElement("label",{htmlFor:l,className:Cl["switch-wrapper"]},o.createElement("div",{className:Cl["switch-toggle"]}),o.createElement("div",{className:[Cl["switch-label"],Cl["switch-label--on"]].join(" ")},o.createElement(Gt,{className:Cl["switch-icon"],name:r&&r.left||"check",variant:e,fontSize:d}),r&&r.right&&o.createElement(Gt,{className:Cl["switch-icon-right"],name:r.right,variant:e,fontSize:d}))))}}]),n}(o.Component);v(Fl,"defaultProps",{theme:"light",iconSize:"11px"});var El={"d-none":"Pressable-module__d-none","d-inline":"Pressable-module__d-inline","d-inline-block":"Pressable-module__d-inline-block","d-block":"Pressable-module__d-block","d-table":"Pressable-module__d-table","d-table-row":"Pressable-module__d-table-row","d-table-cell":"Pressable-module__d-table-cell","d-flex":"Pressable-module__d-flex","d-inline-flex":"Pressable-module__d-inline-flex","d-sm-none":"Pressable-module__d-sm-none","d-sm-inline":"Pressable-module__d-sm-inline","d-sm-inline-block":"Pressable-module__d-sm-inline-block","d-sm-block":"Pressable-module__d-sm-block","d-sm-table":"Pressable-module__d-sm-table","d-sm-table-row":"Pressable-module__d-sm-table-row","d-sm-table-cell":"Pressable-module__d-sm-table-cell","d-sm-flex":"Pressable-module__d-sm-flex","d-sm-inline-flex":"Pressable-module__d-sm-inline-flex","d-md-none":"Pressable-module__d-md-none","d-md-inline":"Pressable-module__d-md-inline","d-md-inline-block":"Pressable-module__d-md-inline-block","d-md-block":"Pressable-module__d-md-block","d-md-table":"Pressable-module__d-md-table","d-md-table-row":"Pressable-module__d-md-table-row","d-md-table-cell":"Pressable-module__d-md-table-cell","d-md-flex":"Pressable-module__d-md-flex","d-md-inline-flex":"Pressable-module__d-md-inline-flex","d-lg-none":"Pressable-module__d-lg-none","d-lg-inline":"Pressable-module__d-lg-inline","d-lg-inline-block":"Pressable-module__d-lg-inline-block","d-lg-block":"Pressable-module__d-lg-block","d-lg-table":"Pressable-module__d-lg-table","d-lg-table-row":"Pressable-module__d-lg-table-row","d-lg-table-cell":"Pressable-module__d-lg-table-cell","d-lg-flex":"Pressable-module__d-lg-flex","d-lg-inline-flex":"Pressable-module__d-lg-inline-flex","d-xl-none":"Pressable-module__d-xl-none","d-xl-inline":"Pressable-module__d-xl-inline","d-xl-inline-block":"Pressable-module__d-xl-inline-block","d-xl-block":"Pressable-module__d-xl-block","d-xl-table":"Pressable-module__d-xl-table","d-xl-table-row":"Pressable-module__d-xl-table-row","d-xl-table-cell":"Pressable-module__d-xl-table-cell","d-xl-flex":"Pressable-module__d-xl-flex","d-xl-inline-flex":"Pressable-module__d-xl-inline-flex","d-print-none":"Pressable-module__d-print-none","d-print-inline":"Pressable-module__d-print-inline","d-print-inline-block":"Pressable-module__d-print-inline-block","d-print-block":"Pressable-module__d-print-block","d-print-table":"Pressable-module__d-print-table","d-print-table-row":"Pressable-module__d-print-table-row","d-print-table-cell":"Pressable-module__d-print-table-cell","d-print-flex":"Pressable-module__d-print-flex","d-print-inline-flex":"Pressable-module__d-print-inline-flex",button:"Pressable-module__button","button-speadIcon":"Pressable-module__button-speadIcon","button-primary":"Pressable-module__button-primary","icon-variant-1":"Pressable-module__icon-variant-1","icon-variant-2":"Pressable-module__icon-variant-2","icon-variant-3":"Pressable-module__icon-variant-3","icon-variant-4":"Pressable-module__icon-variant-4","button-alternate":"Pressable-module__button-alternate","button-outline":"Pressable-module__button-outline","button-red":"Pressable-module__button-red","button-start":"Pressable-module__button-start","button-icon":"Pressable-module__button-icon","button-small":"Pressable-module__button-small","button-end":"Pressable-module__button-end","button-xsmall":"Pressable-module__button-xsmall","button-icononly":"Pressable-module__button-icononly",text:"Pressable-module__text","text-with-icon":"Pressable-module__text-with-icon",white:"Pressable-module__white","charcoal-gray":"Pressable-module__charcoal-gray","warm-gray":"Pressable-module__warm-gray"},Sl=function(e,t,n){return!t&&o.createElement(o.Fragment,null,o.createElement(Gt,{name:e,className:[El["button-icon"],El["icon-variant-1"]].join(" "),variant:1,fontSize:n}),o.createElement(Gt,{name:e,className:[El["button-icon"],El["icon-variant-2"]].join(" "),variant:2,fontSize:n}),o.createElement(Gt,{name:e,className:[El["button-icon"],El["icon-variant-3"]].join(" "),variant:3,fontSize:n}),o.createElement(Gt,{name:e,className:[El["button-icon"],El["icon-variant-4"]].join(" "),variant:4,fontSize:n}))},Pl=function(e){C(n,e);var t=T(n);function n(){return g(this,n),t.apply(this,arguments)}return b(n,[{key:"render",value:function(){var e,t=this.props,n=t.children,l=t.className,r=t.variant,a=t.small,i=t.iconplacement,d=t.icon,u=t.icononly,s=t.color,c=t.hideicon,m=t.size,p=t.iconSize,f=t.as,_=t.spreadIcon,h=S(t,["children","className","variant","small","iconplacement","icon","icononly","color","hideicon","size","iconSize","as","spreadIcon"]),g="xsmall"===m,x="small"===m||a;e=p||(x?"11px":"14px");var b="text"===r||!!c,v=f;if(!r)return null;var y=$(El.button,El[r],g&&El["button-xsmall"],x&&El["button-small"],El["button-".concat(i)],u&&El["button-icononly"],s&&El[s],_&&El["button-speadIcon"],l);return o.createElement(v,w({className:y},h),"start"===i&&d&&Sl(d,b,e),!u&&n,"end"===i&&d&&Sl(d,b,e))}}]),n}(o.PureComponent),Ml=function(e){C(n,e);var t=T(n);function n(){var e;g(this,n);for(var l=arguments.length,r=new Array(l),a=0;a1?"s":"")+" required, but only "+t.length+" present")}function Fo(e){return Co(1,arguments),e instanceof Date||"object"===typeof e&&"[object Date]"===Object.prototype.toString.call(e)}function Eo(e){Co(1,arguments);var t=Object.prototype.toString.call(e);return e instanceof Date||"object"===typeof e&&"[object Date]"===t?new Date(e.getTime()):"number"===typeof e||"[object Number]"===t?new Date(e):("string"!==typeof e&&"[object String]"!==t||"undefined"===typeof console||(console.warn("Starting with v2.0.0-beta.1 date-fns doesn't accept strings as date arguments. Please use `parseISO` to parse strings. See: https://git.io/fjule"),console.warn((new Error).stack)),new Date(NaN))}function So(e){Co(1,arguments);var t=Eo(e);return!isNaN(t)}var Po={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"1 second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"about 1 hour",other:"about {{count}} hours"},xHours:{one:"1 hour",other:"{{count}} hours"},xDays:{one:"1 day",other:"{{count}} days"},aboutXWeeks:{one:"about 1 week",other:"about {{count}} weeks"},xWeeks:{one:"1 week",other:"{{count}} weeks"},aboutXMonths:{one:"about 1 month",other:"about {{count}} months"},xMonths:{one:"1 month",other:"{{count}} months"},aboutXYears:{one:"about 1 year",other:"about {{count}} years"},xYears:{one:"1 year",other:"{{count}} years"},overXYears:{one:"over 1 year",other:"over {{count}} years"},almostXYears:{one:"almost 1 year",other:"almost {{count}} years"}};function Mo(e){return function(t){var n=t||{},l=n.width?String(n.width):e.defaultWidth;return e.formats[l]||e.formats[e.defaultWidth]}}var To={date:Mo({formats:{full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},defaultWidth:"full"}),time:Mo({formats:{full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},defaultWidth:"full"}),dateTime:Mo({formats:{full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},defaultWidth:"full"})},Do={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"};function zo(e){return function(t,n){var l,o=n||{};if("formatting"===(o.context?String(o.context):"standalone")&&e.formattingValues){var r=e.defaultFormattingWidth||e.defaultWidth,a=o.width?String(o.width):r;l=e.formattingValues[a]||e.formattingValues[r]}else{var i=e.defaultWidth,d=o.width?String(o.width):e.defaultWidth;l=e.values[d]||e.values[i]}return l[e.argumentCallback?e.argumentCallback(t):t]}}function Io(e){return function(t,n){var l=String(t),o=n||{},r=o.width,a=r&&e.matchPatterns[r]||e.matchPatterns[e.defaultMatchWidth],i=l.match(a);if(!i)return null;var d,u=i[0],s=r&&e.parsePatterns[r]||e.parsePatterns[e.defaultParseWidth];return d="[object Array]"===Object.prototype.toString.call(s)?function(e,t){for(var n=0;n0?"in "+l:l+" ago":l},formatLong:To,formatRelative:function(e,t,n,l){return Do[e]},localize:{ordinalNumber:function(e,t){var n=Number(e),l=n%100;if(l>20||l<10)switch(l%10){case 1:return n+"st";case 2:return n+"nd";case 3:return n+"rd"}return n+"th"},era:zo({values:{narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},defaultWidth:"wide"}),quarter:zo({values:{narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},defaultWidth:"wide",argumentCallback:function(e){return Number(e)-1}}),month:zo({values:{narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},defaultWidth:"wide"}),day:zo({values:{narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},defaultWidth:"wide"}),dayPeriod:zo({values:{narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},defaultWidth:"wide",formattingValues:{narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},defaultFormattingWidth:"wide"})},match:{ordinalNumber:(Bo={matchPattern:/^(\d+)(th|st|nd|rd)?/i,parsePattern:/\d+/i,valueCallback:function(e){return parseInt(e,10)}},function(e,t){var n=String(e),l=t||{},o=n.match(Bo.matchPattern);if(!o)return null;var r=o[0],a=n.match(Bo.parsePattern);if(!a)return null;var i=Bo.valueCallback?Bo.valueCallback(a[0]):a[0];return{value:i=l.valueCallback?l.valueCallback(i):i,rest:n.slice(r.length)}}),era:Io({matchPatterns:{narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},defaultMatchWidth:"wide",parsePatterns:{any:[/^b/i,/^(a|c)/i]},defaultParseWidth:"any"}),quarter:Io({matchPatterns:{narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},defaultMatchWidth:"wide",parsePatterns:{any:[/1/i,/2/i,/3/i,/4/i]},defaultParseWidth:"any",valueCallback:function(e){return e+1}}),month:Io({matchPatterns:{narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},defaultMatchWidth:"wide",parsePatterns:{narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},defaultParseWidth:"any"}),day:Io({matchPatterns:{narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},defaultMatchWidth:"wide",parsePatterns:{narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},defaultParseWidth:"any"}),dayPeriod:Io({matchPatterns:{narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},defaultMatchWidth:"any",parsePatterns:{any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},defaultParseWidth:"any"})},options:{weekStartsOn:0,firstWeekContainsDate:1}};function Ro(e){if(null===e||!0===e||!1===e)return NaN;var t=Number(e);return isNaN(t)?t:t<0?Math.ceil(t):Math.floor(t)}function Lo(e,t){Co(2,arguments);var n=Eo(e).getTime(),l=Ro(t);return new Date(n+l)}function No(e,t){Co(2,arguments);var n=Ro(t);return Lo(e,-n)}function Ho(e,t){for(var n=e<0?"-":"",l=Math.abs(e).toString();l.length0?n:1-n;return Ho("yy"===t?l%100:l,t.length)},Ao=function(e,t){var n=e.getUTCMonth();return"M"===t?String(n+1):Ho(n+1,2)},Vo=function(e,t){return Ho(e.getUTCDate(),t.length)},Yo=function(e,t){return Ho(e.getUTCHours()%12||12,t.length)},Uo=function(e,t){return Ho(e.getUTCHours(),t.length)},Wo=function(e,t){return Ho(e.getUTCMinutes(),t.length)},qo=function(e,t){return Ho(e.getUTCSeconds(),t.length)},Go=function(e,t){var n=t.length,l=e.getUTCMilliseconds();return Ho(Math.floor(l*Math.pow(10,n-3)),t.length)},Qo=864e5;function Ko(e){Co(1,arguments);var t=1,n=Eo(e),l=n.getUTCDay(),o=(l=o.getTime()?n+1:t.getTime()>=a.getTime()?n:n-1}function Xo(e){Co(1,arguments);var t=$o(e),n=new Date(0);n.setUTCFullYear(t,0,4),n.setUTCHours(0,0,0,0);var l=Ko(n);return l}var Zo=6048e5;function Jo(e){Co(1,arguments);var t=Eo(e),n=Ko(t).getTime()-Xo(t).getTime();return Math.round(n/Zo)+1}function er(e,t){Co(1,arguments);var n=t||{},l=n.locale,o=l&&l.options&&l.options.weekStartsOn,r=null==o?0:Ro(o),a=null==n.weekStartsOn?r:Ro(n.weekStartsOn);if(!(a>=0&&a<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");var i=Eo(e),d=i.getUTCDay(),u=(d=1&&d<=7))throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var u=new Date(0);u.setUTCFullYear(l+1,0,d),u.setUTCHours(0,0,0,0);var s=er(u,t),c=new Date(0);c.setUTCFullYear(l,0,d),c.setUTCHours(0,0,0,0);var m=er(c,t);return n.getTime()>=s.getTime()?l+1:n.getTime()>=m.getTime()?l:l-1}function nr(e,t){Co(1,arguments);var n=t||{},l=n.locale,o=l&&l.options&&l.options.firstWeekContainsDate,r=null==o?1:Ro(o),a=null==n.firstWeekContainsDate?r:Ro(n.firstWeekContainsDate),i=tr(e,t),d=new Date(0);d.setUTCFullYear(i,0,a),d.setUTCHours(0,0,0,0);var u=er(d,t);return u}var lr=6048e5;function or(e,t){Co(1,arguments);var n=Eo(e),l=er(n,t).getTime()-nr(n,t).getTime();return Math.round(l/lr)+1}var rr="midnight",ar="noon",ir="morning",dr="afternoon",ur="evening",sr="night",cr={G:function(e,t,n){var l=e.getUTCFullYear()>0?1:0;switch(t){case"G":case"GG":case"GGG":return n.era(l,{width:"abbreviated"});case"GGGGG":return n.era(l,{width:"narrow"});case"GGGG":default:return n.era(l,{width:"wide"})}},y:function(e,t,n){if("yo"===t){var l=e.getUTCFullYear(),o=l>0?l:1-l;return n.ordinalNumber(o,{unit:"year"})}return jo(e,t)},Y:function(e,t,n,l){var o=tr(e,l),r=o>0?o:1-o;return"YY"===t?Ho(r%100,2):"Yo"===t?n.ordinalNumber(r,{unit:"year"}):Ho(r,t.length)},R:function(e,t){return Ho($o(e),t.length)},u:function(e,t){return Ho(e.getUTCFullYear(),t.length)},Q:function(e,t,n){var l=Math.ceil((e.getUTCMonth()+1)/3);switch(t){case"Q":return String(l);case"QQ":return Ho(l,2);case"Qo":return n.ordinalNumber(l,{unit:"quarter"});case"QQQ":return n.quarter(l,{width:"abbreviated",context:"formatting"});case"QQQQQ":return n.quarter(l,{width:"narrow",context:"formatting"});case"QQQQ":default:return n.quarter(l,{width:"wide",context:"formatting"})}},q:function(e,t,n){var l=Math.ceil((e.getUTCMonth()+1)/3);switch(t){case"q":return String(l);case"qq":return Ho(l,2);case"qo":return n.ordinalNumber(l,{unit:"quarter"});case"qqq":return n.quarter(l,{width:"abbreviated",context:"standalone"});case"qqqqq":return n.quarter(l,{width:"narrow",context:"standalone"});case"qqqq":default:return n.quarter(l,{width:"wide",context:"standalone"})}},M:function(e,t,n){var l=e.getUTCMonth();switch(t){case"M":case"MM":return Ao(e,t);case"Mo":return n.ordinalNumber(l+1,{unit:"month"});case"MMM":return n.month(l,{width:"abbreviated",context:"formatting"});case"MMMMM":return n.month(l,{width:"narrow",context:"formatting"});case"MMMM":default:return n.month(l,{width:"wide",context:"formatting"})}},L:function(e,t,n){var l=e.getUTCMonth();switch(t){case"L":return String(l+1);case"LL":return Ho(l+1,2);case"Lo":return n.ordinalNumber(l+1,{unit:"month"});case"LLL":return n.month(l,{width:"abbreviated",context:"standalone"});case"LLLLL":return n.month(l,{width:"narrow",context:"standalone"});case"LLLL":default:return n.month(l,{width:"wide",context:"standalone"})}},w:function(e,t,n,l){var o=or(e,l);return"wo"===t?n.ordinalNumber(o,{unit:"week"}):Ho(o,t.length)},I:function(e,t,n){var l=Jo(e);return"Io"===t?n.ordinalNumber(l,{unit:"week"}):Ho(l,t.length)},d:function(e,t,n){return"do"===t?n.ordinalNumber(e.getUTCDate(),{unit:"date"}):Vo(e,t)},D:function(e,t,n){var l=function(e){Co(1,arguments);var t=Eo(e),n=t.getTime();t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0);var l=t.getTime(),o=n-l;return Math.floor(o/Qo)+1}(e);return"Do"===t?n.ordinalNumber(l,{unit:"dayOfYear"}):Ho(l,t.length)},E:function(e,t,n){var l=e.getUTCDay();switch(t){case"E":case"EE":case"EEE":return n.day(l,{width:"abbreviated",context:"formatting"});case"EEEEE":return n.day(l,{width:"narrow",context:"formatting"});case"EEEEEE":return n.day(l,{width:"short",context:"formatting"});case"EEEE":default:return n.day(l,{width:"wide",context:"formatting"})}},e:function(e,t,n,l){var o=e.getUTCDay(),r=(o-l.weekStartsOn+8)%7||7;switch(t){case"e":return String(r);case"ee":return Ho(r,2);case"eo":return n.ordinalNumber(r,{unit:"day"});case"eee":return n.day(o,{width:"abbreviated",context:"formatting"});case"eeeee":return n.day(o,{width:"narrow",context:"formatting"});case"eeeeee":return n.day(o,{width:"short",context:"formatting"});case"eeee":default:return n.day(o,{width:"wide",context:"formatting"})}},c:function(e,t,n,l){var o=e.getUTCDay(),r=(o-l.weekStartsOn+8)%7||7;switch(t){case"c":return String(r);case"cc":return Ho(r,t.length);case"co":return n.ordinalNumber(r,{unit:"day"});case"ccc":return n.day(o,{width:"abbreviated",context:"standalone"});case"ccccc":return n.day(o,{width:"narrow",context:"standalone"});case"cccccc":return n.day(o,{width:"short",context:"standalone"});case"cccc":default:return n.day(o,{width:"wide",context:"standalone"})}},i:function(e,t,n){var l=e.getUTCDay(),o=0===l?7:l;switch(t){case"i":return String(o);case"ii":return Ho(o,t.length);case"io":return n.ordinalNumber(o,{unit:"day"});case"iii":return n.day(l,{width:"abbreviated",context:"formatting"});case"iiiii":return n.day(l,{width:"narrow",context:"formatting"});case"iiiiii":return n.day(l,{width:"short",context:"formatting"});case"iiii":default:return n.day(l,{width:"wide",context:"formatting"})}},a:function(e,t,n){var l=e.getUTCHours()/12>=1?"pm":"am";switch(t){case"a":case"aa":case"aaa":return n.dayPeriod(l,{width:"abbreviated",context:"formatting"});case"aaaaa":return n.dayPeriod(l,{width:"narrow",context:"formatting"});case"aaaa":default:return n.dayPeriod(l,{width:"wide",context:"formatting"})}},b:function(e,t,n){var l,o=e.getUTCHours();switch(l=12===o?ar:0===o?rr:o/12>=1?"pm":"am",t){case"b":case"bb":case"bbb":return n.dayPeriod(l,{width:"abbreviated",context:"formatting"});case"bbbbb":return n.dayPeriod(l,{width:"narrow",context:"formatting"});case"bbbb":default:return n.dayPeriod(l,{width:"wide",context:"formatting"})}},B:function(e,t,n){var l,o=e.getUTCHours();switch(l=o>=17?ur:o>=12?dr:o>=4?ir:sr,t){case"B":case"BB":case"BBB":return n.dayPeriod(l,{width:"abbreviated",context:"formatting"});case"BBBBB":return n.dayPeriod(l,{width:"narrow",context:"formatting"});case"BBBB":default:return n.dayPeriod(l,{width:"wide",context:"formatting"})}},h:function(e,t,n){if("ho"===t){var l=e.getUTCHours()%12;return 0===l&&(l=12),n.ordinalNumber(l,{unit:"hour"})}return Yo(e,t)},H:function(e,t,n){return"Ho"===t?n.ordinalNumber(e.getUTCHours(),{unit:"hour"}):Uo(e,t)},K:function(e,t,n){var l=e.getUTCHours()%12;return"Ko"===t?n.ordinalNumber(l,{unit:"hour"}):Ho(l,t.length)},k:function(e,t,n){var l=e.getUTCHours();return 0===l&&(l=24),"ko"===t?n.ordinalNumber(l,{unit:"hour"}):Ho(l,t.length)},m:function(e,t,n){return"mo"===t?n.ordinalNumber(e.getUTCMinutes(),{unit:"minute"}):Wo(e,t)},s:function(e,t,n){return"so"===t?n.ordinalNumber(e.getUTCSeconds(),{unit:"second"}):qo(e,t)},S:function(e,t){return Go(e,t)},X:function(e,t,n,l){var o=(l._originalDate||e).getTimezoneOffset();if(0===o)return"Z";switch(t){case"X":return pr(o);case"XXXX":case"XX":return fr(o);case"XXXXX":case"XXX":default:return fr(o,":")}},x:function(e,t,n,l){var o=(l._originalDate||e).getTimezoneOffset();switch(t){case"x":return pr(o);case"xxxx":case"xx":return fr(o);case"xxxxx":case"xxx":default:return fr(o,":")}},O:function(e,t,n,l){var o=(l._originalDate||e).getTimezoneOffset();switch(t){case"O":case"OO":case"OOO":return"GMT"+mr(o,":");case"OOOO":default:return"GMT"+fr(o,":")}},z:function(e,t,n,l){var o=(l._originalDate||e).getTimezoneOffset();switch(t){case"z":case"zz":case"zzz":return"GMT"+mr(o,":");case"zzzz":default:return"GMT"+fr(o,":")}},t:function(e,t,n,l){var o=l._originalDate||e;return Ho(Math.floor(o.getTime()/1e3),t.length)},T:function(e,t,n,l){return Ho((l._originalDate||e).getTime(),t.length)}};function mr(e,t){var n=e>0?"-":"+",l=Math.abs(e),o=Math.floor(l/60),r=l%60;if(0===r)return n+String(o);var a=t||"";return n+String(o)+a+Ho(r,2)}function pr(e,t){return e%60===0?(e>0?"-":"+")+Ho(Math.abs(e)/60,2):fr(e,t)}function fr(e,t){var n=t||"",l=e>0?"-":"+",o=Math.abs(e);return l+Ho(Math.floor(o/60),2)+n+Ho(o%60,2)}function _r(e,t){switch(e){case"P":return t.date({width:"short"});case"PP":return t.date({width:"medium"});case"PPP":return t.date({width:"long"});case"PPPP":default:return t.date({width:"full"})}}function hr(e,t){switch(e){case"p":return t.time({width:"short"});case"pp":return t.time({width:"medium"});case"ppp":return t.time({width:"long"});case"pppp":default:return t.time({width:"full"})}}var gr={p:hr,P:function(e,t){var n,l=e.match(/(P+)(p+)?/),o=l[1],r=l[2];if(!r)return _r(e,t);switch(o){case"P":n=t.dateTime({width:"short"});break;case"PP":n=t.dateTime({width:"medium"});break;case"PPP":n=t.dateTime({width:"long"});break;case"PPPP":default:n=t.dateTime({width:"full"})}return n.replace("{{date}}",_r(o,t)).replace("{{time}}",hr(r,t))}},xr=6e4;function br(e){return e.getTime()%xr}function vr(e){var t=new Date(e.getTime()),n=Math.ceil(t.getTimezoneOffset());t.setSeconds(0,0);var l=n>0?(xr+br(t))%xr:br(t);return n*xr+l}var wr=["D","DD"],yr=["YY","YYYY"];function kr(e){return-1!==wr.indexOf(e)}function Cr(e){return-1!==yr.indexOf(e)}function Fr(e,t,n){if("YYYY"===e)throw new RangeError("Use `yyyy` instead of `YYYY` (in `".concat(t,"`) for formatting years to the input `").concat(n,"`; see: https://git.io/fxCyr"));if("YY"===e)throw new RangeError("Use `yy` instead of `YY` (in `".concat(t,"`) for formatting years to the input `").concat(n,"`; see: https://git.io/fxCyr"));if("D"===e)throw new RangeError("Use `d` instead of `D` (in `".concat(t,"`) for formatting days of the month to the input `").concat(n,"`; see: https://git.io/fxCyr"));if("DD"===e)throw new RangeError("Use `dd` instead of `DD` (in `".concat(t,"`) for formatting days of the month to the input `").concat(n,"`; see: https://git.io/fxCyr"))}var Er=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,Sr=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,Pr=/^'([^]*?)'?$/,Mr=/''/g,Tr=/[a-zA-Z]/;function Dr(e,t,n){Co(2,arguments);var l=String(t),o=n||{},r=o.locale||Oo,a=r.options&&r.options.firstWeekContainsDate,i=null==a?1:Ro(a),d=null==o.firstWeekContainsDate?i:Ro(o.firstWeekContainsDate);if(!(d>=1&&d<=7))throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var u=r.options&&r.options.weekStartsOn,s=null==u?0:Ro(u),c=null==o.weekStartsOn?s:Ro(o.weekStartsOn);if(!(c>=0&&c<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");if(!r.localize)throw new RangeError("locale must contain localize property");if(!r.formatLong)throw new RangeError("locale must contain formatLong property");var m=Eo(e);if(!So(m))throw new RangeError("Invalid time value");var p=vr(m),f=No(m,p),_={firstWeekContainsDate:d,weekStartsOn:c,locale:r,_originalDate:m},h=l.match(Sr).map((function(e){var t=e[0];return"p"===t||"P"===t?(0,gr[t])(e,r.formatLong,_):e})).join("").match(Er).map((function(n){if("''"===n)return"'";var l=n[0];if("'"===l)return zr(n);var a=cr[l];if(a)return!o.useAdditionalWeekYearTokens&&Cr(n)&&Fr(n,t,e),!o.useAdditionalDayOfYearTokens&&kr(n)&&Fr(n,t,e),a(f,n,r.localize,_);if(l.match(Tr))throw new RangeError("Format string contains an unescaped latin alphabet character `"+l+"`");return n})).join("");return h}function zr(e){return e.match(Pr)[1].replace(Mr,"'")}function Ir(e,t){Co(2,arguments);var n=Ro(t);return Lo(e,6e4*n)}var Br=36e5;function Or(e,t){Co(2,arguments);var n=Ro(t);return Lo(e,n*Br)}function Rr(e,t){Co(2,arguments);var n=Eo(e),l=Ro(t);return isNaN(l)?new Date(NaN):l?(n.setDate(n.getDate()+l),n):n}function Lr(e,t){Co(2,arguments);var n=Ro(t),l=7*n;return Rr(e,l)}function Nr(e,t){Co(2,arguments);var n=Eo(e),l=Ro(t);if(isNaN(l))return new Date(NaN);if(!l)return n;var o=n.getDate(),r=new Date(n.getTime());r.setMonth(n.getMonth()+l+1,0);var a=r.getDate();return o>=a?r:(n.setFullYear(r.getFullYear(),r.getMonth(),o),n)}function Hr(e,t){Co(2,arguments);var n=Ro(t);return Nr(e,12*n)}function jr(e,t){Co(2,arguments);var n=Ro(t);return Nr(e,-n)}function Ar(e,t){Co(2,arguments);var n=Ro(t);return Hr(e,-n)}function Vr(e){Co(1,arguments);var t=Eo(e),n=t.getSeconds();return n}function Yr(e){Co(1,arguments);var t=Eo(e),n=t.getMinutes();return n}function Ur(e){Co(1,arguments);var t=Eo(e),n=t.getHours();return n}function Wr(e){Co(1,arguments);var t=Eo(e),n=t.getDay();return n}function qr(e){Co(1,arguments);var t=Eo(e),n=t.getDate();return n}function Gr(e,t){Co(1,arguments);var n=t||{},l=n.locale,o=l&&l.options&&l.options.weekStartsOn,r=null==o?0:Ro(o),a=null==n.weekStartsOn?r:Ro(n.weekStartsOn);if(!(a>=0&&a<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");var i=Eo(e),d=i.getDay(),u=(d=1&&d<=7))throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var u=new Date(0);u.setFullYear(l+1,0,d),u.setHours(0,0,0,0);var s=Gr(u,t),c=new Date(0);c.setFullYear(l,0,d),c.setHours(0,0,0,0);var m=Gr(c,t);return n.getTime()>=s.getTime()?l+1:n.getTime()>=m.getTime()?l:l-1}function Kr(e,t){Co(1,arguments);var n=t||{},l=n.locale,o=l&&l.options&&l.options.firstWeekContainsDate,r=null==o?1:Ro(o),a=null==n.firstWeekContainsDate?r:Ro(n.firstWeekContainsDate),i=Qr(e,t),d=new Date(0);d.setFullYear(i,0,a),d.setHours(0,0,0,0);var u=Gr(d,t);return u}var $r=6048e5;function Xr(e){Co(1,arguments);var t=Eo(e),n=t.getMonth();return n}function Zr(e){Co(1,arguments);var t=Eo(e),n=Math.floor(t.getMonth()/3)+1;return n}function Jr(e){Co(1,arguments);var t=Eo(e),n=t.getFullYear();return n}function ea(e){Co(1,arguments);var t=Eo(e),n=t.getTime();return n}function ta(e,t){Co(2,arguments);var n=Eo(e),l=Ro(t);return n.setMinutes(l),n}function na(e,t){Co(2,arguments);var n=Eo(e),l=Ro(t);return n.setHours(l),n}function la(e){Co(1,arguments);var t=Eo(e),n=t.getFullYear(),l=t.getMonth(),o=new Date(0);return o.setFullYear(n,l+1,0),o.setHours(0,0,0,0),o.getDate()}function oa(e,t){Co(2,arguments);var n=Eo(e),l=Ro(t),o=n.getFullYear(),r=n.getDate(),a=new Date(0);a.setFullYear(o,l,15),a.setHours(0,0,0,0);var i=la(a);return n.setMonth(l,Math.min(r,i)),n}function ra(e,t){Co(2,arguments);var n=Eo(e),l=Ro(t),o=Math.floor(n.getMonth()/3)+1,r=l-o;return oa(n,n.getMonth()+3*r)}function aa(e,t){Co(2,arguments);var n=Eo(e),l=Ro(t);return isNaN(n)?new Date(NaN):(n.setFullYear(l),n)}function ia(e){var t,n;if(Co(1,arguments),e&&"function"===typeof e.forEach)t=e;else{if("object"!==typeof e||null===e)return new Date(NaN);t=Array.prototype.slice.call(e)}return t.forEach((function(e){var t=Eo(e);(void 0===n||n>t||isNaN(t))&&(n=t)})),n||new Date(NaN)}function da(e){var t,n;if(Co(1,arguments),e&&"function"===typeof e.forEach)t=e;else{if("object"!==typeof e||null===e)return new Date(NaN);t=Array.prototype.slice.call(e)}return t.forEach((function(e){var t=Eo(e);(void 0===n||nl.getTime()}function ha(e,t){Co(2,arguments);var n=Eo(e),l=Eo(t);return n.getTime()=o&&l<=r}function xa(e,t){if(null==e)throw new TypeError("assign requires that input parameter not be null or undefined");for(var n in t=t||{})t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function ba(e,t,n){Co(2,arguments);var l=n||{},o=l.locale,r=o&&o.options&&o.options.weekStartsOn,a=null==r?0:Ro(r),i=null==l.weekStartsOn?a:Ro(l.weekStartsOn);if(!(i>=0&&i<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");var d=Eo(e),u=Ro(t),s=d.getUTCDay(),c=u%7,m=(c+7)%7,p=(m0,o=l?t:1-t;if(o<=50)n=e||100;else{var r=o+50;n=e+100*Math.floor(r/100)-(e>=r%100?100:0)}return l?n:1-n}var Xa=[31,28,31,30,31,30,31,31,30,31,30,31],Za=[31,29,31,30,31,30,31,31,30,31,30,31];function Ja(e){return e%400===0||e%4===0&&e%100!==0}var ei={G:{priority:140,parse:function(e,t,n,l){switch(t){case"G":case"GG":case"GGG":return n.era(e,{width:"abbreviated"})||n.era(e,{width:"narrow"});case"GGGGG":return n.era(e,{width:"narrow"});case"GGGG":default:return n.era(e,{width:"wide"})||n.era(e,{width:"abbreviated"})||n.era(e,{width:"narrow"})}},set:function(e,t,n,l){return t.era=n,e.setUTCFullYear(n,0,1),e.setUTCHours(0,0,0,0),e},incompatibleTokens:["R","u","t","T"]},y:{priority:130,parse:function(e,t,n,l){var o=function(e){return{year:e,isTwoDigitYear:"yy"===t}};switch(t){case"y":return Ga(4,e,o);case"yo":return n.ordinalNumber(e,{unit:"year",valueCallback:o});default:return Ga(t.length,e,o)}},validate:function(e,t,n){return t.isTwoDigitYear||t.year>0},set:function(e,t,n,l){var o=e.getUTCFullYear();if(n.isTwoDigitYear){var r=$a(n.year,o);return e.setUTCFullYear(r,0,1),e.setUTCHours(0,0,0,0),e}var a="era"in t&&1!==t.era?1-n.year:n.year;return e.setUTCFullYear(a,0,1),e.setUTCHours(0,0,0,0),e},incompatibleTokens:["Y","R","u","w","I","i","e","c","t","T"]},Y:{priority:130,parse:function(e,t,n,l){var o=function(e){return{year:e,isTwoDigitYear:"YY"===t}};switch(t){case"Y":return Ga(4,e,o);case"Yo":return n.ordinalNumber(e,{unit:"year",valueCallback:o});default:return Ga(t.length,e,o)}},validate:function(e,t,n){return t.isTwoDigitYear||t.year>0},set:function(e,t,n,l){var o=tr(e,l);if(n.isTwoDigitYear){var r=$a(n.year,o);return e.setUTCFullYear(r,0,l.firstWeekContainsDate),e.setUTCHours(0,0,0,0),er(e,l)}var a="era"in t&&1!==t.era?1-n.year:n.year;return e.setUTCFullYear(a,0,l.firstWeekContainsDate),e.setUTCHours(0,0,0,0),er(e,l)},incompatibleTokens:["y","R","u","Q","q","M","L","I","d","D","i","t","T"]},R:{priority:130,parse:function(e,t,n,l){return Qa("R"===t?4:t.length,e)},set:function(e,t,n,l){var o=new Date(0);return o.setUTCFullYear(n,0,4),o.setUTCHours(0,0,0,0),Ko(o)},incompatibleTokens:["G","y","Y","u","Q","q","M","L","w","d","D","e","c","t","T"]},u:{priority:130,parse:function(e,t,n,l){return Qa("u"===t?4:t.length,e)},set:function(e,t,n,l){return e.setUTCFullYear(n,0,1),e.setUTCHours(0,0,0,0),e},incompatibleTokens:["G","y","Y","R","w","I","i","e","c","t","T"]},Q:{priority:120,parse:function(e,t,n,l){switch(t){case"Q":case"QQ":return Ga(t.length,e);case"Qo":return n.ordinalNumber(e,{unit:"quarter"});case"QQQ":return n.quarter(e,{width:"abbreviated",context:"formatting"})||n.quarter(e,{width:"narrow",context:"formatting"});case"QQQQQ":return n.quarter(e,{width:"narrow",context:"formatting"});case"QQQQ":default:return n.quarter(e,{width:"wide",context:"formatting"})||n.quarter(e,{width:"abbreviated",context:"formatting"})||n.quarter(e,{width:"narrow",context:"formatting"})}},validate:function(e,t,n){return t>=1&&t<=4},set:function(e,t,n,l){return e.setUTCMonth(3*(n-1),1),e.setUTCHours(0,0,0,0),e},incompatibleTokens:["Y","R","q","M","L","w","I","d","D","i","e","c","t","T"]},q:{priority:120,parse:function(e,t,n,l){switch(t){case"q":case"qq":return Ga(t.length,e);case"qo":return n.ordinalNumber(e,{unit:"quarter"});case"qqq":return n.quarter(e,{width:"abbreviated",context:"standalone"})||n.quarter(e,{width:"narrow",context:"standalone"});case"qqqqq":return n.quarter(e,{width:"narrow",context:"standalone"});case"qqqq":default:return n.quarter(e,{width:"wide",context:"standalone"})||n.quarter(e,{width:"abbreviated",context:"standalone"})||n.quarter(e,{width:"narrow",context:"standalone"})}},validate:function(e,t,n){return t>=1&&t<=4},set:function(e,t,n,l){return e.setUTCMonth(3*(n-1),1),e.setUTCHours(0,0,0,0),e},incompatibleTokens:["Y","R","Q","M","L","w","I","d","D","i","e","c","t","T"]},M:{priority:110,parse:function(e,t,n,l){var o=function(e){return e-1};switch(t){case"M":return Ua(va,e,o);case"MM":return Ga(2,e,o);case"Mo":return n.ordinalNumber(e,{unit:"month",valueCallback:o});case"MMM":return n.month(e,{width:"abbreviated",context:"formatting"})||n.month(e,{width:"narrow",context:"formatting"});case"MMMMM":return n.month(e,{width:"narrow",context:"formatting"});case"MMMM":default:return n.month(e,{width:"wide",context:"formatting"})||n.month(e,{width:"abbreviated",context:"formatting"})||n.month(e,{width:"narrow",context:"formatting"})}},validate:function(e,t,n){return t>=0&&t<=11},set:function(e,t,n,l){return e.setUTCMonth(n,1),e.setUTCHours(0,0,0,0),e},incompatibleTokens:["Y","R","q","Q","L","w","I","D","i","e","c","t","T"]},L:{priority:110,parse:function(e,t,n,l){var o=function(e){return e-1};switch(t){case"L":return Ua(va,e,o);case"LL":return Ga(2,e,o);case"Lo":return n.ordinalNumber(e,{unit:"month",valueCallback:o});case"LLL":return n.month(e,{width:"abbreviated",context:"standalone"})||n.month(e,{width:"narrow",context:"standalone"});case"LLLLL":return n.month(e,{width:"narrow",context:"standalone"});case"LLLL":default:return n.month(e,{width:"wide",context:"standalone"})||n.month(e,{width:"abbreviated",context:"standalone"})||n.month(e,{width:"narrow",context:"standalone"})}},validate:function(e,t,n){return t>=0&&t<=11},set:function(e,t,n,l){return e.setUTCMonth(n,1),e.setUTCHours(0,0,0,0),e},incompatibleTokens:["Y","R","q","Q","M","w","I","D","i","e","c","t","T"]},w:{priority:100,parse:function(e,t,n,l){switch(t){case"w":return Ua(ka,e);case"wo":return n.ordinalNumber(e,{unit:"week"});default:return Ga(t.length,e)}},validate:function(e,t,n){return t>=1&&t<=53},set:function(e,t,n,l){return er(function(e,t,n){Co(2,arguments);var l=Eo(e),o=Ro(t),r=or(l,n)-o;return l.setUTCDate(l.getUTCDate()-7*r),l}(e,n,l),l)},incompatibleTokens:["y","R","u","q","Q","M","L","I","d","D","i","t","T"]},I:{priority:100,parse:function(e,t,n,l){switch(t){case"I":return Ua(ka,e);case"Io":return n.ordinalNumber(e,{unit:"week"});default:return Ga(t.length,e)}},validate:function(e,t,n){return t>=1&&t<=53},set:function(e,t,n,l){return Ko(function(e,t){Co(2,arguments);var n=Eo(e),l=Ro(t),o=Jo(n)-l;return n.setUTCDate(n.getUTCDate()-7*o),n}(e,n,l),l)},incompatibleTokens:["y","Y","u","q","Q","M","L","w","d","D","e","c","t","T"]},d:{priority:90,subPriority:1,parse:function(e,t,n,l){switch(t){case"d":return Ua(wa,e);case"do":return n.ordinalNumber(e,{unit:"date"});default:return Ga(t.length,e)}},validate:function(e,t,n){var l=Ja(e.getUTCFullYear()),o=e.getUTCMonth();return l?t>=1&&t<=Za[o]:t>=1&&t<=Xa[o]},set:function(e,t,n,l){return e.setUTCDate(n),e.setUTCHours(0,0,0,0),e},incompatibleTokens:["Y","R","q","Q","w","I","D","i","e","c","t","T"]},D:{priority:90,subPriority:1,parse:function(e,t,n,l){switch(t){case"D":case"DD":return Ua(ya,e);case"Do":return n.ordinalNumber(e,{unit:"date"});default:return Ga(t.length,e)}},validate:function(e,t,n){return Ja(e.getUTCFullYear())?t>=1&&t<=366:t>=1&&t<=365},set:function(e,t,n,l){return e.setUTCMonth(0,n),e.setUTCHours(0,0,0,0),e},incompatibleTokens:["Y","R","q","Q","M","L","w","I","d","E","i","e","c","t","T"]},E:{priority:90,parse:function(e,t,n,l){switch(t){case"E":case"EE":case"EEE":return n.day(e,{width:"abbreviated",context:"formatting"})||n.day(e,{width:"short",context:"formatting"})||n.day(e,{width:"narrow",context:"formatting"});case"EEEEE":return n.day(e,{width:"narrow",context:"formatting"});case"EEEEEE":return n.day(e,{width:"short",context:"formatting"})||n.day(e,{width:"narrow",context:"formatting"});case"EEEE":default:return n.day(e,{width:"wide",context:"formatting"})||n.day(e,{width:"abbreviated",context:"formatting"})||n.day(e,{width:"short",context:"formatting"})||n.day(e,{width:"narrow",context:"formatting"})}},validate:function(e,t,n){return t>=0&&t<=6},set:function(e,t,n,l){return(e=ba(e,n,l)).setUTCHours(0,0,0,0),e},incompatibleTokens:["D","i","e","c","t","T"]},e:{priority:90,parse:function(e,t,n,l){var o=function(e){var t=7*Math.floor((e-1)/7);return(e+l.weekStartsOn+6)%7+t};switch(t){case"e":case"ee":return Ga(t.length,e,o);case"eo":return n.ordinalNumber(e,{unit:"day",valueCallback:o});case"eee":return n.day(e,{width:"abbreviated",context:"formatting"})||n.day(e,{width:"short",context:"formatting"})||n.day(e,{width:"narrow",context:"formatting"});case"eeeee":return n.day(e,{width:"narrow",context:"formatting"});case"eeeeee":return n.day(e,{width:"short",context:"formatting"})||n.day(e,{width:"narrow",context:"formatting"});case"eeee":default:return n.day(e,{width:"wide",context:"formatting"})||n.day(e,{width:"abbreviated",context:"formatting"})||n.day(e,{width:"short",context:"formatting"})||n.day(e,{width:"narrow",context:"formatting"})}},validate:function(e,t,n){return t>=0&&t<=6},set:function(e,t,n,l){return(e=ba(e,n,l)).setUTCHours(0,0,0,0),e},incompatibleTokens:["y","R","u","q","Q","M","L","I","d","D","E","i","c","t","T"]},c:{priority:90,parse:function(e,t,n,l){var o=function(e){var t=7*Math.floor((e-1)/7);return(e+l.weekStartsOn+6)%7+t};switch(t){case"c":case"cc":return Ga(t.length,e,o);case"co":return n.ordinalNumber(e,{unit:"day",valueCallback:o});case"ccc":return n.day(e,{width:"abbreviated",context:"standalone"})||n.day(e,{width:"short",context:"standalone"})||n.day(e,{width:"narrow",context:"standalone"});case"ccccc":return n.day(e,{width:"narrow",context:"standalone"});case"cccccc":return n.day(e,{width:"short",context:"standalone"})||n.day(e,{width:"narrow",context:"standalone"});case"cccc":default:return n.day(e,{width:"wide",context:"standalone"})||n.day(e,{width:"abbreviated",context:"standalone"})||n.day(e,{width:"short",context:"standalone"})||n.day(e,{width:"narrow",context:"standalone"})}},validate:function(e,t,n){return t>=0&&t<=6},set:function(e,t,n,l){return(e=ba(e,n,l)).setUTCHours(0,0,0,0),e},incompatibleTokens:["y","R","u","q","Q","M","L","I","d","D","E","i","e","t","T"]},i:{priority:90,parse:function(e,t,n,l){var o=function(e){return 0===e?7:e};switch(t){case"i":case"ii":return Ga(t.length,e);case"io":return n.ordinalNumber(e,{unit:"day"});case"iii":return n.day(e,{width:"abbreviated",context:"formatting",valueCallback:o})||n.day(e,{width:"short",context:"formatting",valueCallback:o})||n.day(e,{width:"narrow",context:"formatting",valueCallback:o});case"iiiii":return n.day(e,{width:"narrow",context:"formatting",valueCallback:o});case"iiiiii":return n.day(e,{width:"short",context:"formatting",valueCallback:o})||n.day(e,{width:"narrow",context:"formatting",valueCallback:o});case"iiii":default:return n.day(e,{width:"wide",context:"formatting",valueCallback:o})||n.day(e,{width:"abbreviated",context:"formatting",valueCallback:o})||n.day(e,{width:"short",context:"formatting",valueCallback:o})||n.day(e,{width:"narrow",context:"formatting",valueCallback:o})}},validate:function(e,t,n){return t>=1&&t<=7},set:function(e,t,n,l){return(e=function(e,t){Co(2,arguments);var n=Ro(t);n%7===0&&(n-=7);var l=1,o=Eo(e),r=o.getUTCDay(),a=((n%7+7)%7=1&&t<=12},set:function(e,t,n,l){var o=e.getUTCHours()>=12;return o&&n<12?e.setUTCHours(n+12,0,0,0):o||12!==n?e.setUTCHours(n,0,0,0):e.setUTCHours(0,0,0,0),e},incompatibleTokens:["H","K","k","t","T"]},H:{priority:70,parse:function(e,t,n,l){switch(t){case"H":return Ua(Ca,e);case"Ho":return n.ordinalNumber(e,{unit:"hour"});default:return Ga(t.length,e)}},validate:function(e,t,n){return t>=0&&t<=23},set:function(e,t,n,l){return e.setUTCHours(n,0,0,0),e},incompatibleTokens:["a","b","h","K","k","t","T"]},K:{priority:70,parse:function(e,t,n,l){switch(t){case"K":return Ua(Ea,e);case"Ko":return n.ordinalNumber(e,{unit:"hour"});default:return Ga(t.length,e)}},validate:function(e,t,n){return t>=0&&t<=11},set:function(e,t,n,l){return e.getUTCHours()>=12&&n<12?e.setUTCHours(n+12,0,0,0):e.setUTCHours(n,0,0,0),e},incompatibleTokens:["a","b","h","H","k","t","T"]},k:{priority:70,parse:function(e,t,n,l){switch(t){case"k":return Ua(Fa,e);case"ko":return n.ordinalNumber(e,{unit:"hour"});default:return Ga(t.length,e)}},validate:function(e,t,n){return t>=1&&t<=24},set:function(e,t,n,l){var o=n<=24?n%24:n;return e.setUTCHours(o,0,0,0),e},incompatibleTokens:["a","b","h","H","K","t","T"]},m:{priority:60,parse:function(e,t,n,l){switch(t){case"m":return Ua(Pa,e);case"mo":return n.ordinalNumber(e,{unit:"minute"});default:return Ga(t.length,e)}},validate:function(e,t,n){return t>=0&&t<=59},set:function(e,t,n,l){return e.setUTCMinutes(n,0,0),e},incompatibleTokens:["t","T"]},s:{priority:50,parse:function(e,t,n,l){switch(t){case"s":return Ua(Ma,e);case"so":return n.ordinalNumber(e,{unit:"second"});default:return Ga(t.length,e)}},validate:function(e,t,n){return t>=0&&t<=59},set:function(e,t,n,l){return e.setUTCSeconds(n,0),e},incompatibleTokens:["t","T"]},S:{priority:30,parse:function(e,t,n,l){return Ga(t.length,e,(function(e){return Math.floor(e*Math.pow(10,3-t.length))}))},set:function(e,t,n,l){return e.setUTCMilliseconds(n),e},incompatibleTokens:["t","T"]},X:{priority:10,parse:function(e,t,n,l){switch(t){case"X":return Wa(Ha,e);case"XX":return Wa(ja,e);case"XXXX":return Wa(Aa,e);case"XXXXX":return Wa(Ya,e);case"XXX":default:return Wa(Va,e)}},set:function(e,t,n,l){return t.timestampIsSet?e:new Date(e.getTime()-n)},incompatibleTokens:["t","T","x"]},x:{priority:10,parse:function(e,t,n,l){switch(t){case"x":return Wa(Ha,e);case"xx":return Wa(ja,e);case"xxxx":return Wa(Aa,e);case"xxxxx":return Wa(Ya,e);case"xxx":default:return Wa(Va,e)}},set:function(e,t,n,l){return t.timestampIsSet?e:new Date(e.getTime()-n)},incompatibleTokens:["t","T","X"]},t:{priority:40,parse:function(e,t,n,l){return qa(e)},set:function(e,t,n,l){return[new Date(1e3*n),{timestampIsSet:!0}]},incompatibleTokens:"*"},T:{priority:20,parse:function(e,t,n,l){return qa(e)},set:function(e,t,n,l){return[new Date(n),{timestampIsSet:!0}]},incompatibleTokens:"*"}},ti=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,ni=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,li=/^'([^]*?)'?$/,oi=/''/g,ri=/\S/,ai=/[a-zA-Z]/;function ii(e,t,n,l){Co(3,arguments);var o=String(e),r=String(t),a=l||{},i=a.locale||Oo;if(!i.match)throw new RangeError("locale must contain match property");var d=i.options&&i.options.firstWeekContainsDate,u=null==d?1:Ro(d),s=null==a.firstWeekContainsDate?u:Ro(a.firstWeekContainsDate);if(!(s>=1&&s<=7))throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var c=i.options&&i.options.weekStartsOn,m=null==c?0:Ro(c),p=null==a.weekStartsOn?m:Ro(a.weekStartsOn);if(!(p>=0&&p<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");if(""===r)return""===o?Eo(n):new Date(NaN);var f,_={firstWeekContainsDate:s,weekStartsOn:p,locale:i},h=[{priority:10,subPriority:-1,set:di,index:0}],g=r.match(ni).map((function(e){var t=e[0];return"p"===t||"P"===t?(0,gr[t])(e,i.formatLong,_):e})).join("").match(ti),x=[];for(f=0;f0&&ri.test(o))return new Date(NaN);var S=h.map((function(e){return e.priority})).sort((function(e,t){return t-e})).filter((function(e,t,n){return n.indexOf(e)===t})).map((function(e){return h.filter((function(t){return t.priority===e})).sort((function(e,t){return t.subPriority-e.subPriority}))})).map((function(e){return e[0]})),P=Eo(n);if(isNaN(P))return new Date(NaN);var M=No(P,vr(P)),T={};for(f=0;f2)return n;if(/:/.test(l[0])?(n.date=null,t=l[0]):(n.date=l[0],t=l[1],ci.timeZoneDelimiter.test(n.date)&&(n.date=e.split(ci.timeZoneDelimiter)[0],t=e.substr(n.date.length,e.length))),t){var o=ci.timezone.exec(t);o?(n.time=t.replace(o[1],""),n.timezone=o[1]):n.time=t}return n}function hi(e,t){var n=new RegExp("^(?:(\\d{4}|[+-]\\d{"+(4+t)+"})|(\\d{2}|[+-]\\d{"+(2+t)+"})$)"),l=e.match(n);if(!l)return{year:null};var o=l[1]&&parseInt(l[1]),r=l[2]&&parseInt(l[2]);return{year:null==r?o:100*r,restDateString:e.slice((l[1]||l[2]).length)}}function gi(e,t){if(null===t)return null;var n=e.match(mi);if(!n)return null;var l=!!n[4],o=xi(n[1]),r=xi(n[2])-1,a=xi(n[3]),i=xi(n[4]),d=xi(n[5])-1;if(l)return function(e,t,n){return t>=1&&t<=53&&n>=0&&n<=6}(0,i,d)?function(e,t,n){var l=new Date(0);l.setUTCFullYear(e,0,4);var o=l.getUTCDay()||7,r=7*(t-1)+n+1-o;return l.setUTCDate(l.getUTCDate()+r),l}(t,i,d):new Date(NaN);var u=new Date(0);return function(e,t,n){return t>=0&&t<=11&&n>=1&&n<=(yi[t]||(ki(e)?29:28))}(t,r,a)&&function(e,t){return t>=1&&t<=(ki(e)?366:365)}(t,o)?(u.setUTCFullYear(t,r,Math.max(o,a)),u):new Date(NaN)}function xi(e){return e?parseInt(e):1}function bi(e){var t=e.match(pi);if(!t)return null;var n=vi(t[1]),l=vi(t[2]),o=vi(t[3]);return function(e,t,n){if(24===e)return 0===t&&0===n;return n>=0&&n<60&&t>=0&&t<60&&e>=0&&e<25}(n,l,o)?n*si+6e4*l+1e3*o:NaN}function vi(e){return e&&parseFloat(e.replace(",","."))||0}function wi(e){if("Z"===e)return 0;var t=e.match(fi);if(!t)return 0;var n="+"===t[1]?-1:1,l=parseInt(t[2]),o=t[3]&&parseInt(t[3])||0;return function(e,t){return t>=0&&t<=59}(0,o)?n*(l*si+6e4*o):NaN}var yi=[31,null,31,30,31,30,31,31,30,31,30,31];function ki(e){return e%400===0||e%4===0&&e%100}function Ci(e,t,n){return e===t||(e.correspondingElement?e.correspondingElement.classList.contains(n):e.classList.contains(n))}var Fi,Ei,Si=(void 0===Fi&&(Fi=0),function(){return++Fi}),Pi={},Mi={},Ti=["touchstart","touchmove"];function Di(e,t){var n=null;return-1!==Ti.indexOf(t)&&Ei&&(n={passive:!e.props.preventDefault}),n}function zi(e,t){var n,l,r=e.displayName||e.name||"Component";return l=n=function(n){var l,i;function d(e){var l;return(l=n.call(this,e)||this).__outsideClickHandler=function(e){if("function"!==typeof l.__clickOutsideHandlerProp){var t=l.getInstance();if("function"!==typeof t.props.handleClickOutside){if("function"!==typeof t.handleClickOutside)throw new Error("WrappedComponent: "+r+" lacks a handleClickOutside(event) function for processing outside click events.");t.handleClickOutside(e)}else t.props.handleClickOutside(e)}else l.__clickOutsideHandlerProp(e)},l.__getComponentNode=function(){var e=l.getInstance();return t&&"function"===typeof t.setClickOutsideRef?t.setClickOutsideRef()(e):"function"===typeof e.setClickOutsideRef?e.setClickOutsideRef():a.findDOMNode(e)},l.enableOnClickOutside=function(){if("undefined"!==typeof document&&!Mi[l._uid]){"undefined"===typeof Ei&&(Ei=function(){if("function"===typeof window.addEventListener){var e=!1,t=Object.defineProperty({},"passive",{get:function(){e=!0}}),n=function(){};return window.addEventListener("testPassiveEventSupport",n,t),window.removeEventListener("testPassiveEventSupport",n,t),e}}()),Mi[l._uid]=!0;var e=l.props.eventTypes;e.forEach||(e=[e]),Pi[l._uid]=function(e){var t;null!==l.componentNode&&(l.props.preventDefault&&e.preventDefault(),l.props.stopPropagation&&e.stopPropagation(),l.props.excludeScrollbar&&(t=e,document.documentElement.clientWidth<=t.clientX||document.documentElement.clientHeight<=t.clientY)||function(e,t,n){if(e===t)return!0;for(;e.parentNode;){if(Ci(e,t,n))return!0;e=e.parentNode}return e}(e.target,l.componentNode,l.props.outsideClickIgnoreClass)===document&&l.__outsideClickHandler(e))},e.forEach((function(e){document.addEventListener(e,Pi[l._uid],Di(l,e))}))}},l.disableOnClickOutside=function(){delete Mi[l._uid];var e=Pi[l._uid];if(e&&"undefined"!==typeof document){var t=l.props.eventTypes;t.forEach||(t=[t]),t.forEach((function(t){return document.removeEventListener(t,e,Di(l,t))})),delete Pi[l._uid]}},l.getRef=function(e){return l.instanceRef=e},l._uid=Si(),l}i=n,(l=d).prototype=Object.create(i.prototype),l.prototype.constructor=l,l.__proto__=i;var u=d.prototype;return u.getInstance=function(){if(!e.prototype.isReactComponent)return this;var t=this.instanceRef;return t.getInstance?t.getInstance():t},u.componentDidMount=function(){if("undefined"!==typeof document&&document.createElement){var e=this.getInstance();if(t&&"function"===typeof t.handleClickOutside&&(this.__clickOutsideHandlerProp=t.handleClickOutside(e),"function"!==typeof this.__clickOutsideHandlerProp))throw new Error("WrappedComponent: "+r+" lacks a function for processing outside click events specified by the handleClickOutside config option.");this.componentNode=this.__getComponentNode(),this.props.disableOnClickOutside||this.enableOnClickOutside()}},u.componentDidUpdate=function(){this.componentNode=this.__getComponentNode()},u.componentWillUnmount=function(){this.disableOnClickOutside()},u.render=function(){var t=this.props,n=(t.excludeScrollbar,function(e,t){if(null==e)return{};var n,l,o={},r=Object.keys(e);for(l=0;l=0||(o[n]=e[n]);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(t,["excludeScrollbar"]));return e.prototype.isReactComponent?n.ref=this.getRef:n.wrappedRef=this.getRef,n.disableOnClickOutside=this.disableOnClickOutside,n.enableOnClickOutside=this.enableOnClickOutside,o.createElement(e,n)},d}(o.Component),n.displayName="OnClickOutside("+r+")",n.defaultProps={eventTypes:["mousedown","touchstart"],excludeScrollbar:t&&t.excludeScrollbar||!1,outsideClickIgnoreClass:"ignore-react-onclickoutside",preventDefault:!1,stopPropagation:!1},n.getClass=function(){return e.getClass?e.getClass():e},l}var Ii,Bi=Object.prototype.toString,Oi=function(e){var t=Bi.call(e),n="[object Arguments]"===t;return n||(n="[object Array]"!==t&&null!==e&&"object"===typeof e&&"number"===typeof e.length&&e.length>=0&&"[object Function]"===Bi.call(e.callee)),n};if(!Object.keys){var Ri=Object.prototype.hasOwnProperty,Li=Object.prototype.toString,Ni=Oi,Hi=Object.prototype.propertyIsEnumerable,ji=!Hi.call({toString:null},"toString"),Ai=Hi.call((function(){}),"prototype"),Vi=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],Yi=function(e){var t=e.constructor;return t&&t.prototype===e},Ui={$applicationCache:!0,$console:!0,$external:!0,$frame:!0,$frameElement:!0,$frames:!0,$innerHeight:!0,$innerWidth:!0,$onmozfullscreenchange:!0,$onmozfullscreenerror:!0,$outerHeight:!0,$outerWidth:!0,$pageXOffset:!0,$pageYOffset:!0,$parent:!0,$scrollLeft:!0,$scrollTop:!0,$scrollX:!0,$scrollY:!0,$self:!0,$webkitIndexedDB:!0,$webkitStorageInfo:!0,$window:!0},Wi=function(){for(var e in window)try{if(!Ui["$"+e]&&Ri.call(window,e)&&null!==window[e]&&"object"===typeof window[e])try{Yi(window[e])}catch(dn){return!0}}catch(dn){return!0}return!1}();Ii=function(e){var t=null!==e&&"object"===typeof e,n="[object Function]"===Li.call(e),l=Ni(e),o=t&&"[object String]"===Li.call(e),r=[];if(!t&&!n&&!l)throw new TypeError("Object.keys called on a non-object");var a=Ai&&n;if(o&&e.length>0&&!Ri.call(e,0))for(var i=0;i0)for(var d=0;d=0&&"[object Array]"!==Ji.call(e)&&"[object Function]"===Ji.call(e.callee)},nd=function(){return ed(arguments)}();ed.isLegacyArguments=td;var ld=nd?ed:td,od="function"===typeof Symbol&&"symbol"===typeof Symbol("foo"),rd=Object.prototype.toString,ad=Array.prototype.concat,id=Object.defineProperty,dd=id&&function(){var e={};try{for(var t in id(e,"x",{enumerable:!1,value:e}),e)return!1;return e.x===e}catch(dn){return!1}}(),ud=function(e,t,n,l){var o;(!(t in e)||"function"===typeof(o=l)&&"[object Function]"===rd.call(o)&&l())&&(dd?id(e,t,{configurable:!0,enumerable:!1,value:n,writable:!0}):e[t]=n)},sd=function(e,t){var n=arguments.length>2?arguments[2]:{},l=Xi(t);od&&(l=ad.call(l,Object.getOwnPropertySymbols(t)));for(var o=0;o=0;l--)if(u[l]!=s[l])return!1;for(l=u.length-1;l>=0;l--)if(!Gd(e[o=u[l]],t[o],n))return!1;return!0}(e,t,l))}function Qd(e){return null===e||void 0===e}function Kd(e){return!(!e||"object"!==typeof e||"number"!==typeof e.length)&&("function"===typeof e.copy&&"function"===typeof e.slice&&!(e.length>0&&"number"!==typeof e[0]))}var $d=Gd,Xd="undefined"!==typeof document&&"undefined"!==typeof navigator,Zd=function(){for(var e=["Edge","Trident","Firefox"],t=0;t=0)return 1;return 0}();var Jd=Xd&&window.Promise?function(e){var t=!1;return function(){t||(t=!0,window.Promise.resolve().then((function(){t=!1,e()})))}}:function(e){var t=!1;return function(){t||(t=!0,setTimeout((function(){t=!1,e()}),Zd))}};function eu(e){return e&&"[object Function]"==={}.toString.call(e)}function tu(e,t){if(1!==e.nodeType)return[];var n=e.ownerDocument.defaultView.getComputedStyle(e,null);return t?n[t]:n}function nu(e){return"HTML"===e.nodeName?e:e.parentNode||e.host}function lu(e){if(!e)return document.body;switch(e.nodeName){case"HTML":case"BODY":return e.ownerDocument.body;case"#document":return e.body}var t=tu(e),n=t.overflow,l=t.overflowX,o=t.overflowY;return/(auto|scroll|overlay)/.test(n+o+l)?e:lu(nu(e))}function ou(e){return e&&e.referenceNode?e.referenceNode:e}var ru=Xd&&!(!window.MSInputMethodContext||!document.documentMode),au=Xd&&/MSIE 10/.test(navigator.userAgent);function iu(e){return 11===e?ru:10===e?au:ru||au}function du(e){if(!e)return document.documentElement;for(var t=iu(10)?document.body:null,n=e.offsetParent||null;n===t&&e.nextElementSibling;)n=(e=e.nextElementSibling).offsetParent;var l=n&&n.nodeName;return l&&"BODY"!==l&&"HTML"!==l?-1!==["TH","TD","TABLE"].indexOf(n.nodeName)&&"static"===tu(n,"position")?du(n):n:e?e.ownerDocument.documentElement:document.documentElement}function uu(e){return null!==e.parentNode?uu(e.parentNode):e}function su(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return document.documentElement;var n=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,l=n?e:t,o=n?t:e,r=document.createRange();r.setStart(l,0),r.setEnd(o,0);var a=r.commonAncestorContainer;if(e!==a&&t!==a||l.contains(o))return function(e){var t=e.nodeName;return"BODY"!==t&&("HTML"===t||du(e.firstElementChild)===e)}(a)?a:du(a);var i=uu(e);return i.host?su(i.host,t):su(e,uu(t).host)}function cu(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"top",n="top"===t?"scrollTop":"scrollLeft",l=e.nodeName;if("BODY"===l||"HTML"===l){var o=e.ownerDocument.documentElement,r=e.ownerDocument.scrollingElement||o;return r[n]}return e[n]}function mu(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],l=cu(t,"top"),o=cu(t,"left"),r=n?-1:1;return e.top+=l*r,e.bottom+=l*r,e.left+=o*r,e.right+=o*r,e}function pu(e,t){var n="x"===t?"Left":"Top",l="Left"===n?"Right":"Bottom";return parseFloat(e["border"+n+"Width"])+parseFloat(e["border"+l+"Width"])}function fu(e,t,n,l){return Math.max(t["offset"+e],t["scroll"+e],n["client"+e],n["offset"+e],n["scroll"+e],iu(10)?parseInt(n["offset"+e])+parseInt(l["margin"+("Height"===e?"Top":"Left")])+parseInt(l["margin"+("Height"===e?"Bottom":"Right")]):0)}function _u(e){var t=e.body,n=e.documentElement,l=iu(10)&&getComputedStyle(n);return{height:fu("Height",t,n,l),width:fu("Width",t,n,l)}}var hu=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},gu=function(){function e(e,t){for(var n=0;n2&&void 0!==arguments[2]&&arguments[2],l=iu(10),o="HTML"===t.nodeName,r=wu(e),a=wu(t),i=lu(e),d=tu(t),u=parseFloat(d.borderTopWidth),s=parseFloat(d.borderLeftWidth);n&&o&&(a.top=Math.max(a.top,0),a.left=Math.max(a.left,0));var c=vu({top:r.top-a.top-u,left:r.left-a.left-s,width:r.width,height:r.height});if(c.marginTop=0,c.marginLeft=0,!l&&o){var m=parseFloat(d.marginTop),p=parseFloat(d.marginLeft);c.top-=u-m,c.bottom-=u-m,c.left-=s-p,c.right-=s-p,c.marginTop=m,c.marginLeft=p}return(l&&!n?t.contains(i):t===i&&"BODY"!==i.nodeName)&&(c=mu(c,t)),c}function ku(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=e.ownerDocument.documentElement,l=yu(e,n),o=Math.max(n.clientWidth,window.innerWidth||0),r=Math.max(n.clientHeight,window.innerHeight||0),a=t?0:cu(n),i=t?0:cu(n,"left"),d={top:a-l.top+l.marginTop,left:i-l.left+l.marginLeft,width:o,height:r};return vu(d)}function Cu(e){var t=e.nodeName;if("BODY"===t||"HTML"===t)return!1;if("fixed"===tu(e,"position"))return!0;var n=nu(e);return!!n&&Cu(n)}function Fu(e){if(!e||!e.parentElement||iu())return document.documentElement;for(var t=e.parentElement;t&&"none"===tu(t,"transform");)t=t.parentElement;return t||document.documentElement}function Eu(e,t,n,l){var o=arguments.length>4&&void 0!==arguments[4]&&arguments[4],r={top:0,left:0},a=o?Fu(e):su(e,ou(t));if("viewport"===l)r=ku(a,o);else{var i=void 0;"scrollParent"===l?"BODY"===(i=lu(nu(t))).nodeName&&(i=e.ownerDocument.documentElement):i="window"===l?e.ownerDocument.documentElement:l;var d=yu(i,a,o);if("HTML"!==i.nodeName||Cu(a))r=d;else{var u=_u(e.ownerDocument),s=u.height,c=u.width;r.top+=d.top-d.marginTop,r.bottom=s+d.top,r.left+=d.left-d.marginLeft,r.right=c+d.left}}var m="number"===typeof(n=n||0);return r.left+=m?n:n.left||0,r.top+=m?n:n.top||0,r.right-=m?n:n.right||0,r.bottom-=m?n:n.bottom||0,r}function Su(e){return e.width*e.height}function Pu(e,t,n,l,o){var r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0;if(-1===e.indexOf("auto"))return e;var a=Eu(n,l,r,o),i={top:{width:a.width,height:t.top-a.top},right:{width:a.right-t.right,height:a.height},bottom:{width:a.width,height:a.bottom-t.bottom},left:{width:t.left-a.left,height:a.height}},d=Object.keys(i).map((function(e){return bu({key:e},i[e],{area:Su(i[e])})})).sort((function(e,t){return t.area-e.area})),u=d.filter((function(e){var t=e.width,l=e.height;return t>=n.clientWidth&&l>=n.clientHeight})),s=u.length>0?u[0].key:d[0].key,c=e.split("-")[1];return s+(c?"-"+c:"")}function Mu(e,t,n){var l=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,o=l?Fu(t):su(t,ou(n));return yu(n,o,l)}function Tu(e){var t=e.ownerDocument.defaultView.getComputedStyle(e),n=parseFloat(t.marginTop||0)+parseFloat(t.marginBottom||0),l=parseFloat(t.marginLeft||0)+parseFloat(t.marginRight||0);return{width:e.offsetWidth+l,height:e.offsetHeight+n}}function Du(e){var t={left:"right",right:"left",bottom:"top",top:"bottom"};return e.replace(/left|right|bottom|top/g,(function(e){return t[e]}))}function zu(e,t,n){n=n.split("-")[0];var l=Tu(e),o={width:l.width,height:l.height},r=-1!==["right","left"].indexOf(n),a=r?"top":"left",i=r?"left":"top",d=r?"height":"width",u=r?"width":"height";return o[a]=t[a]+t[d]/2-l[d]/2,o[i]=n===i?t[i]-l[u]:t[Du(i)],o}function Iu(e,t){return Array.prototype.find?e.find(t):e.filter(t)[0]}function Bu(e,t,n){return(void 0===n?e:e.slice(0,function(e,t,n){if(Array.prototype.findIndex)return e.findIndex((function(e){return e[t]===n}));var l=Iu(e,(function(e){return e[t]===n}));return e.indexOf(l)}(e,"name",n))).forEach((function(e){e.function&&console.warn("`modifier.function` is deprecated, use `modifier.fn`!");var n=e.function||e.fn;e.enabled&&eu(n)&&(t.offsets.popper=vu(t.offsets.popper),t.offsets.reference=vu(t.offsets.reference),t=n(t,e))})),t}function Ou(){if(!this.state.isDestroyed){var e={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:!1,offsets:{}};e.offsets.reference=Mu(this.state,this.popper,this.reference,this.options.positionFixed),e.placement=Pu(this.options.placement,e.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding),e.originalPlacement=e.placement,e.positionFixed=this.options.positionFixed,e.offsets.popper=zu(this.popper,e.offsets.reference,e.placement),e.offsets.popper.position=this.options.positionFixed?"fixed":"absolute",e=Bu(this.modifiers,e),this.state.isCreated?this.options.onUpdate(e):(this.state.isCreated=!0,this.options.onCreate(e))}}function Ru(e,t){return e.some((function(e){var n=e.name;return e.enabled&&n===t}))}function Lu(e){for(var t=[!1,"ms","Webkit","Moz","O"],n=e.charAt(0).toUpperCase()+e.slice(1),l=0;l1&&void 0!==arguments[1]&&arguments[1],n=Ku.indexOf(e),l=Ku.slice(n+1).concat(Ku.slice(0,n));return t?l.reverse():l}var Xu="flip",Zu="clockwise",Ju="counterclockwise";function es(e,t,n,l){var o=[0,0],r=-1!==["right","left"].indexOf(l),a=e.split(/(\+|\-)/).map((function(e){return e.trim()})),i=a.indexOf(Iu(a,(function(e){return-1!==e.search(/,|\s/)})));a[i]&&-1===a[i].indexOf(",")&&console.warn("Offsets separated by white space(s) are deprecated, use a comma (,) instead.");var d=/\s*,\s*|\s+/,u=-1!==i?[a.slice(0,i).concat([a[i].split(d)[0]]),[a[i].split(d)[1]].concat(a.slice(i+1))]:[a];return(u=u.map((function(e,l){var o=(1===l?!r:r)?"height":"width",a=!1;return e.reduce((function(e,t){return""===e[e.length-1]&&-1!==["+","-"].indexOf(t)?(e[e.length-1]=t,a=!0,e):a?(e[e.length-1]+=t,a=!1,e):e.concat(t)}),[]).map((function(e){return function(e,t,n,l){var o=e.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),r=+o[1],a=o[2];if(!r)return e;if(0===a.indexOf("%")){var i=void 0;switch(a){case"%p":i=n;break;case"%":case"%r":default:i=l}return vu(i)[t]/100*r}if("vh"===a||"vw"===a)return("vh"===a?Math.max(document.documentElement.clientHeight,window.innerHeight||0):Math.max(document.documentElement.clientWidth,window.innerWidth||0))/100*r;return r}(e,o,t,n)}))}))).forEach((function(e,t){e.forEach((function(n,l){Uu(n)&&(o[t]+=n*("-"===e[l-1]?-1:1))}))})),o}var ts={placement:"bottom",positionFixed:!1,eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(e){var t=e.placement,n=t.split("-")[0],l=t.split("-")[1];if(l){var o=e.offsets,r=o.reference,a=o.popper,i=-1!==["bottom","top"].indexOf(n),d=i?"left":"top",u=i?"width":"height",s={start:xu({},d,r[d]),end:xu({},d,r[d]+r[u]-a[u])};e.offsets.popper=bu({},a,s[l])}return e}},offset:{order:200,enabled:!0,fn:function(e,t){var n=t.offset,l=e.placement,o=e.offsets,r=o.popper,a=o.reference,i=l.split("-")[0],d=void 0;return d=Uu(+n)?[+n,0]:es(n,r,a,i),"left"===i?(r.top+=d[0],r.left-=d[1]):"right"===i?(r.top+=d[0],r.left+=d[1]):"top"===i?(r.left+=d[0],r.top-=d[1]):"bottom"===i&&(r.left+=d[0],r.top+=d[1]),e.popper=r,e},offset:0},preventOverflow:{order:300,enabled:!0,fn:function(e,t){var n=t.boundariesElement||du(e.instance.popper);e.instance.reference===n&&(n=du(n));var l=Lu("transform"),o=e.instance.popper.style,r=o.top,a=o.left,i=o[l];o.top="",o.left="",o[l]="";var d=Eu(e.instance.popper,e.instance.reference,t.padding,n,e.positionFixed);o.top=r,o.left=a,o[l]=i,t.boundaries=d;var u=t.priority,s=e.offsets.popper,c={primary:function(e){var n=s[e];return s[e]d[e]&&!t.escapeWithReference&&(l=Math.min(s[n],d[e]-("right"===e?s.width:s.height))),xu({},n,l)}};return u.forEach((function(e){var t=-1!==["left","top"].indexOf(e)?"primary":"secondary";s=bu({},s,c[t](e))})),e.offsets.popper=s,e},priority:["left","right","top","bottom"],padding:5,boundariesElement:"scrollParent"},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,n=t.popper,l=t.reference,o=e.placement.split("-")[0],r=Math.floor,a=-1!==["top","bottom"].indexOf(o),i=a?"right":"bottom",d=a?"left":"top",u=a?"width":"height";return n[i]r(l[i])&&(e.offsets.popper[d]=r(l[i])),e}},arrow:{order:500,enabled:!0,fn:function(e,t){var n;if(!Gu(e.instance.modifiers,"arrow","keepTogether"))return e;var l=t.element;if("string"===typeof l){if(!(l=e.instance.popper.querySelector(l)))return e}else if(!e.instance.popper.contains(l))return console.warn("WARNING: `arrow.element` must be child of its popper element!"),e;var o=e.placement.split("-")[0],r=e.offsets,a=r.popper,i=r.reference,d=-1!==["left","right"].indexOf(o),u=d?"height":"width",s=d?"Top":"Left",c=s.toLowerCase(),m=d?"left":"top",p=d?"bottom":"right",f=Tu(l)[u];i[p]-fa[p]&&(e.offsets.popper[c]+=i[c]+f-a[p]),e.offsets.popper=vu(e.offsets.popper);var _=i[c]+i[u]/2-f/2,h=tu(e.instance.popper),g=parseFloat(h["margin"+s]),x=parseFloat(h["border"+s+"Width"]),b=_-e.offsets.popper[c]-g-x;return b=Math.max(Math.min(a[u]-f,b),0),e.arrowElement=l,e.offsets.arrow=(xu(n={},c,Math.round(b)),xu(n,m,""),n),e},element:"[x-arrow]"},flip:{order:600,enabled:!0,fn:function(e,t){if(Ru(e.instance.modifiers,"inner"))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var n=Eu(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement,e.positionFixed),l=e.placement.split("-")[0],o=Du(l),r=e.placement.split("-")[1]||"",a=[];switch(t.behavior){case Xu:a=[l,o];break;case Zu:a=$u(l);break;case Ju:a=$u(l,!0);break;default:a=t.behavior}return a.forEach((function(i,d){if(l!==i||a.length===d+1)return e;l=e.placement.split("-")[0],o=Du(l);var u=e.offsets.popper,s=e.offsets.reference,c=Math.floor,m="left"===l&&c(u.right)>c(s.left)||"right"===l&&c(u.left)c(s.top)||"bottom"===l&&c(u.top)c(n.right),_=c(u.top)c(n.bottom),g="left"===l&&p||"right"===l&&f||"top"===l&&_||"bottom"===l&&h,x=-1!==["top","bottom"].indexOf(l),b=!!t.flipVariations&&(x&&"start"===r&&p||x&&"end"===r&&f||!x&&"start"===r&&_||!x&&"end"===r&&h),v=!!t.flipVariationsByContent&&(x&&"start"===r&&f||x&&"end"===r&&p||!x&&"start"===r&&h||!x&&"end"===r&&_),w=b||v;(m||g||w)&&(e.flipped=!0,(m||g)&&(l=a[d+1]),w&&(r=function(e){return"end"===e?"start":"start"===e?"end":e}(r)),e.placement=l+(r?"-"+r:""),e.offsets.popper=bu({},e.offsets.popper,zu(e.instance.popper,e.offsets.reference,e.placement)),e=Bu(e.instance.modifiers,e,"flip"))})),e},behavior:"flip",padding:5,boundariesElement:"viewport",flipVariations:!1,flipVariationsByContent:!1},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,n=t.split("-")[0],l=e.offsets,o=l.popper,r=l.reference,a=-1!==["left","right"].indexOf(n),i=-1===["top","left"].indexOf(n);return o[a?"left":"top"]=r[n]-(i?o[a?"width":"height"]:0),e.placement=Du(t),e.offsets.popper=vu(o),e}},hide:{order:800,enabled:!0,fn:function(e){if(!Gu(e.instance.modifiers,"hide","preventOverflow"))return e;var t=e.offsets.reference,n=Iu(e.instance.modifiers,(function(e){return"preventOverflow"===e.name})).boundaries;if(t.bottomn.right||t.top>n.bottom||t.right2&&void 0!==arguments[2]?arguments[2]:{};hu(this,e),this.scheduleUpdate=function(){return requestAnimationFrame(l.update)},this.update=Jd(this.update.bind(this)),this.options=bu({},e.Defaults,o),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=t&&t.jquery?t[0]:t,this.popper=n&&n.jquery?n[0]:n,this.options.modifiers={},Object.keys(bu({},e.Defaults.modifiers,o.modifiers)).forEach((function(t){l.options.modifiers[t]=bu({},e.Defaults.modifiers[t]||{},o.modifiers?o.modifiers[t]:{})})),this.modifiers=Object.keys(this.options.modifiers).map((function(e){return bu({name:e},l.options.modifiers[e])})).sort((function(e,t){return e.order-t.order})),this.modifiers.forEach((function(e){e.enabled&&eu(e.onLoad)&&e.onLoad(l.reference,l.popper,l.options,e,l.state)})),this.update();var r=this.options.eventsEnabled;r&&this.enableEventListeners(),this.state.eventsEnabled=r}return gu(e,[{key:"update",value:function(){return Ou.call(this)}},{key:"destroy",value:function(){return Nu.call(this)}},{key:"enableEventListeners",value:function(){return Vu.call(this)}},{key:"disableEventListeners",value:function(){return Yu.call(this)}}]),e}();ns.Utils=window.PopperUtils,ns.placements=Qu,ns.Defaults=ts;var ls="__global_unique_id__",os=function(){return tn[ls]=(tn[ls]||0)+1},rs=function(){},as=rs,is=ln((function(e,t){t.__esModule=!0;o(r);var n=o(zn),l=o(os);o(as);function o(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!==typeof t&&"function"!==typeof t?e:t}function d(e,t){if("function"!==typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var u=1073741823;function s(e){var t=[];return{on:function(e){t.push(e)},off:function(e){t=t.filter((function(t){return t!==e}))},get:function(){return e},set:function(n,l){e=n,t.forEach((function(t){return t(e,l)}))}}}t.default=function(e,t){var o,c,m="__create-react-context-"+(0,l.default)()+"__",p=function(e){function n(){var t,l;a(this,n);for(var o=arguments.length,r=Array(o),d=0;d1?t-1:0),l=1;l0&&(o=ii(e,t.slice(0,e.length),new Date)),As(o)||(o=new Date(e))),As(o)&&a?o:null)}function As(e){return So(e)&&_a(e,new Date("1/1/1000"))}function Vs(e,t,n){if("en"===n)return Dr(e,t,{awareOfUnicodeTokens:!0});var l=lc(n);return n&&!l&&console.warn('A locale object was not found for the provided string ["'.concat(n,'"].')),!l&&nc()&&lc(nc())&&(l=lc(nc())),Dr(e,t,{locale:l||null,awareOfUnicodeTokens:!0})}function Ys(e,t){var n=t.hour,l=void 0===n?0:n,o=t.minute,r=void 0===o?0:o,a=t.second;return na(ta(function(e,t){Co(2,arguments);var n=Eo(e),l=Ro(t);return n.setSeconds(l),n}(e,void 0===a?0:a),r),l)}function Us(e,t){var n=t&&lc(t)||nc()&&lc(nc());return function(e,t){Co(1,arguments);var n=Eo(e),l=Gr(n,t).getTime()-Kr(n,t).getTime();return Math.round(l/$r)+1}(e,n?{locale:n}:null)}function Ws(e,t){return Vs(e,"ddd",t)}function qs(e){return ua(e)}function Gs(e,t){return Gr(e,{locale:lc(t||nc())})}function Qs(e){return function(e){Co(1,arguments);var t=Eo(e);return t.setDate(1),t.setHours(0,0,0,0),t}(e)}function Ks(e){return fa(e)}function $s(e,t){return e&&t?function(e,t){Co(2,arguments);var n=Eo(e),l=Eo(t);return n.getFullYear()===l.getFullYear()}(e,t):!e&&!t}function Xs(e,t){return e&&t?function(e,t){Co(2,arguments);var n=Eo(e),l=Eo(t);return n.getFullYear()===l.getFullYear()&&n.getMonth()===l.getMonth()}(e,t):!e&&!t}function Zs(e,t){return e&&t?function(e,t){Co(2,arguments);var n=fa(e),l=fa(t);return n.getTime()===l.getTime()}(e,t):!e&&!t}function Js(e,t){return e&&t?function(e,t){Co(2,arguments);var n=ua(e),l=ua(t);return n.getTime()===l.getTime()}(e,t):!e&&!t}function ec(e,t){return e&&t?function(e,t){Co(2,arguments);var n=Eo(e),l=Eo(t);return n.getTime()===l.getTime()}(e,t):!e&&!t}function tc(e,t,n){var l,o=ua(t),r=function(e){Co(1,arguments);var t=Eo(e);return t.setHours(23,59,59,999),t}(n);try{l=ga(e,{start:o,end:r})}catch(e){l=!1}return l}function nc(){return window.__localeId__}function lc(e){if("string"==typeof e){var t=window;return t.__localeData__?t.__localeData__[e]:null}return e}function oc(e,t){return Vs(oa(Hs(),e),"LLLL",t)}function rc(e,t){return Vs(oa(Hs(),e),"LLL",t)}function ac(e,t){return Vs(ra(Hs(),e),"QQQ",t)}function ic(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.minDate,l=t.maxDate,o=t.excludeDates,r=t.includeDates,a=t.filterDate;return pc(e,{minDate:n,maxDate:l})||o&&o.some((function(t){return Js(e,t)}))||r&&!r.some((function(t){return Js(e,t)}))||a&&!a(Hs(e))||!1}function dc(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.excludeDates;return n&&n.some((function(t){return Js(e,t)}))||!1}function uc(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.minDate,l=t.maxDate,o=t.excludeDates,r=t.includeDates,a=t.filterDate;return pc(e,{minDate:n,maxDate:l})||o&&o.some((function(t){return Xs(e,t)}))||r&&!r.some((function(t){return Xs(e,t)}))||a&&!a(Hs(e))||!1}function sc(e,t,n,l){var o=Jr(e),r=Xr(e),a=Jr(t),i=Xr(t),d=Jr(l);return o===a&&o===d?r<=n&&n<=i:o=n||do:void 0}function cc(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.minDate,l=t.maxDate,o=t.excludeDates,r=t.includeDates,a=t.filterDate;return pc(e,{minDate:n,maxDate:l})||o&&o.some((function(t){return Zs(e,t)}))||r&&!r.some((function(t){return Zs(e,t)}))||a&&!a(Hs(e))||!1}function mc(e,t,n,l){var o=Jr(e),r=Zr(e),a=Jr(t),i=Zr(t),d=Jr(l);return o===a&&o===d?r<=n&&n<=i:o=n||do:void 0}function pc(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.minDate,l=t.maxDate;return n&&ca(e,n)<0||l&&ca(e,l)>0}function fc(e,t){for(var n=t.length,l=0;l1&&void 0!==arguments[1]?arguments[1]:{},n=t.minDate,l=t.includeDates,o=jr(e,1);return n&&ma(n,o)>0||l&&l.every((function(e){return ma(e,o)>0}))||!1}function gc(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.maxDate,l=t.includeDates,o=Nr(e,1);return n&&ma(o,n)>0||l&&l.every((function(e){return ma(o,e)>0}))||!1}function xc(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.minDate,l=t.includeDates,o=Ar(e,1);return n&&pa(n,o)>0||l&&l.every((function(e){return pa(e,o)>0}))||!1}function bc(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.maxDate,l=t.includeDates,o=Hr(e,1);return n&&pa(o,n)>0||l&&l.every((function(e){return pa(o,e)>0}))||!1}function vc(e){var t=e.minDate,n=e.includeDates;return n&&t?ia(n.filter((function(e){return ca(e,t)>=0}))):n?ia(n):t}function wc(e){var t=e.maxDate,n=e.includeDates;return n&&t?da(n.filter((function(e){return ca(e,t)<=0}))):n?da(n):t}function yc(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"react-datepicker__day--highlighted",n=new Map,l=0,o=e.length;l=a),i&&o.push(a)}return o}var Ec=zi(function(e){Ms(n,r.Component);var t=Bs(n);function n(e){var l;ys(this,n),Fs(zs(l=t.call(this,e)),"renderOptions",(function(){var e=l.props.year,t=l.state.yearsList.map((function(t){return r.createElement("div",{className:e===t?"react-datepicker__year-option react-datepicker__year-option--selected_year":"react-datepicker__year-option",key:t,onClick:l.onChange.bind(zs(l),t)},e===t?r.createElement("span",{className:"react-datepicker__year-option--selected"},"\u2713"):"",t)})),n=l.props.minDate?Jr(l.props.minDate):null,o=l.props.maxDate?Jr(l.props.maxDate):null;return o&&l.state.yearsList.find((function(e){return e===o}))||t.unshift(r.createElement("div",{className:"react-datepicker__year-option",key:"upcoming",onClick:l.incrementYears},r.createElement("a",{className:"react-datepicker__navigation react-datepicker__navigation--years react-datepicker__navigation--years-upcoming"}))),n&&l.state.yearsList.find((function(e){return e===n}))||t.push(r.createElement("div",{className:"react-datepicker__year-option",key:"previous",onClick:l.decrementYears},r.createElement("a",{className:"react-datepicker__navigation react-datepicker__navigation--years react-datepicker__navigation--years-previous"}))),t})),Fs(zs(l),"onChange",(function(e){l.props.onChange(e)})),Fs(zs(l),"handleClickOutside",(function(){l.props.onCancel()})),Fs(zs(l),"shiftYears",(function(e){var t=l.state.yearsList.map((function(t){return t+e}));l.setState({yearsList:t})})),Fs(zs(l),"incrementYears",(function(){return l.shiftYears(1)})),Fs(zs(l),"decrementYears",(function(){return l.shiftYears(-1)}));var o=e.yearDropdownItemNumber,a=e.scrollableYearDropdown,i=o||(a?10:5);return l.state={yearsList:Fc(l.props.year,i,l.props.minDate,l.props.maxDate)},l}return Cs(n,[{key:"render",value:function(){var e=ko({"react-datepicker__year-dropdown":!0,"react-datepicker__year-dropdown--scrollable":this.props.scrollableYearDropdown});return r.createElement("div",{className:e},this.renderOptions())}}]),n}()),Sc=function(e){Ms(n,r.Component);var t=Bs(n);function n(){var e;ys(this,n);for(var l=arguments.length,o=new Array(l),a=0;a0&&void 0!==arguments[0]?arguments[0]:{},n=!1;0===e.getTabIndex()&&!t.isInputFocused&&e.isSameDay(e.props.preSelection)&&(document.activeElement&&document.activeElement!==document.body||(n=!0),e.props.containerRef&&e.props.containerRef.current&&e.props.containerRef.current.contains(document.activeElement)&&document.activeElement.classList.contains("react-datepicker__day")&&(n=!0)),n&&e.dayEl.current.focus()})),Fs(zs(e),"render",(function(){return r.createElement("div",{ref:e.dayEl,className:e.getClassNames(e.props.day),onKeyDown:e.handleOnKeyDown,onClick:e.handleClick,onMouseEnter:e.handleMouseEnter,tabIndex:e.getTabIndex(),"aria-label":e.getAriaLabel(),role:"button","aria-disabled":e.isDisabled()},e.props.renderDayContents?e.props.renderDayContents(qr(e.props.day),e.props.day):qr(e.props.day))})),e}return Cs(n,[{key:"componentDidMount",value:function(){this.handleFocusDay()}},{key:"componentDidUpdate",value:function(e){this.handleFocusDay(e)}}]),n}(),Bc=function(e){Ms(n,r.Component);var t=Bs(n);function n(){var e;ys(this,n);for(var l=arguments.length,o=new Array(l),r=0;r=6,d=!n&&!e.isWeekInMonth(l);if(i||d){if(!e.props.peekNextMonth)break;a=!0}}return t})),Fs(zs(e),"onMonthClick",(function(t,n){e.handleDayClick(Qs(oa(e.props.day,n)),t)})),Fs(zs(e),"onQuarterClick",(function(t,n){e.handleDayClick(Ks(ra(e.props.day,n)),t)})),Fs(zs(e),"getMonthClassNames",(function(t){var n=e.props,l=n.day,o=n.startDate,r=n.endDate,a=n.selected,i=n.minDate,d=n.maxDate;return ko("react-datepicker__month-text","react-datepicker__month-".concat(t),{"react-datepicker__month--disabled":(i||d)&&uc(oa(l,t),e.props),"react-datepicker__month--selected":Xr(l)===t&&Jr(l)===Jr(a),"react-datepicker__month--in-range":sc(o,r,t,l),"react-datepicker__month--range-start":e.isRangeStartMonth(t),"react-datepicker__month--range-end":e.isRangeEndMonth(t)})})),Fs(zs(e),"getQuarterClassNames",(function(t){var n=e.props,l=n.day,o=n.startDate,r=n.endDate,a=n.selected,i=n.minDate,d=n.maxDate;return ko("react-datepicker__quarter-text","react-datepicker__quarter-".concat(t),{"react-datepicker__quarter--disabled":(i||d)&&cc(ra(l,t),e.props),"react-datepicker__quarter--selected":Zr(l)===t&&Jr(l)===Jr(a),"react-datepicker__quarter--in-range":mc(o,r,t,l),"react-datepicker__quarter--range-start":e.isRangeStartQuarter(t),"react-datepicker__quarter--range-end":e.isRangeEndQuarter(t)})})),Fs(zs(e),"renderMonths",(function(){var t=e.props,n=t.showFullMonthYearPicker,l=t.locale;return[[0,1,2],[3,4,5],[6,7,8],[9,10,11]].map((function(t,o){return r.createElement("div",{className:"react-datepicker__month-wrapper",key:o},t.map((function(t,o){return r.createElement("div",{key:o,onClick:function(n){e.onMonthClick(n,t)},className:e.getMonthClassNames(t)},n?oc(t,l):rc(t,l))})))}))})),Fs(zs(e),"renderQuarters",(function(){return r.createElement("div",{className:"react-datepicker__quarter-wrapper"},[1,2,3,4].map((function(t,n){return r.createElement("div",{key:n,onClick:function(n){e.onQuarterClick(n,t)},className:e.getQuarterClassNames(t)},ac(t,e.props.locale))})))})),Fs(zs(e),"getClassNames",(function(){var t=e.props,n=t.selectingDate,l=t.selectsStart,o=t.selectsEnd,r=t.showMonthYearPicker,a=t.showQuarterYearPicker;return ko("react-datepicker__month",{"react-datepicker__month--selecting-range":n&&(l||o)},{"react-datepicker__monthPicker":r},{"react-datepicker__quarterPicker":a})})),e}return Cs(n,[{key:"render",value:function(){var e=this.props,t=e.showMonthYearPicker,n=e.showQuarterYearPicker,l=e.day,o=e.ariaLabelPrefix,a=void 0===o?"month ":o;return r.createElement("div",{className:this.getClassNames(),onMouseLeave:this.handleMouseLeave,"aria-label":"".concat(a," ").concat(Vs(l,"yyyy-MM"))},t?this.renderMonths():n?this.renderQuarters():this.renderWeeks())}}]),n}(),Lc=function(e){Ms(n,r.Component);var t=Bs(n);function n(){var e;ys(this,n);for(var l=arguments.length,o=new Array(l),a=0;a=Yr(t)&&(e.centerLi=n)}},Vs(t,n,e.props.locale))}))})),e}return Cs(n,[{key:"componentDidMount",value:function(){this.list.scrollTop=n.calcCenterPosition(this.props.monthRef?this.props.monthRef.clientHeight-this.header.clientHeight:this.list.clientHeight,this.centerLi),this.props.monthRef&&this.header&&this.setState({height:this.props.monthRef.clientHeight-this.header.clientHeight})}},{key:"render",value:function(){var e=this,t=this.state.height;return r.createElement("div",{className:"react-datepicker__time-container ".concat(this.props.todayButton?"react-datepicker__time-container--with-today-button":"")},r.createElement("div",{className:"react-datepicker__header react-datepicker__header--time",ref:function(t){e.header=t}},r.createElement("div",{className:"react-datepicker-time__header"},this.props.timeCaption)),r.createElement("div",{className:"react-datepicker__time"},r.createElement("div",{className:"react-datepicker__time-box"},r.createElement("ul",{className:"react-datepicker__time-list",ref:function(t){e.list=t},style:t?{height:t}:{}},this.renderTimes()))))}}],[{key:"defaultProps",get:function(){return{intervals:30,onTimeChange:function(){},todayButton:null,timeCaption:"Time"}}}]),n}();Fs(Lc,"calcCenterPosition",(function(e,t){return t.offsetTop-(e/2-t.clientHeight/2)}));var Nc=function(e){Ms(n,r.Component);var t=Bs(n);function n(e){var l;return ys(this,n),Fs(zs(l=t.call(this,e)),"handleYearClick",(function(e,t){l.props.onDayClick&&l.props.onDayClick(e,t)})),Fs(zs(l),"onYearClick",(function(e,t){l.handleYearClick(function(e){Co(1,arguments);var t=Eo(e),n=new Date(0);return n.setFullYear(t.getFullYear(),0,1),n.setHours(0,0,0,0),n}(aa(l.props.date,t)),e)})),l}return Cs(n,[{key:"render",value:function(){for(var e=this,t=[],n=this.props.date,l=function(n,l){t.push(r.createElement("div",{onClick:function(t){e.onYearClick(t,n)},className:"react-datepicker__year-container-text",key:n},n))},o=Jr(n)-11,a=0;o<=Jr(n);o++,a++)l(o);return r.createElement("div",{className:"react-datepicker__year-container"},t)}}]),n}(),Hc=function(e){Ms(n,r.Component);var t=Bs(n);function n(e){var l;return ys(this,n),Fs(zs(l=t.call(this,e)),"onTimeChange",(function(e){l.setState({time:e});var t=new Date;t.setHours(e.split(":")[0]),t.setMinutes(e.split(":")[1]),l.props.onChange(t)})),Fs(zs(l),"renderTimeInput",(function(){var e=l.state.time,t=l.props,n=t.timeString,o=t.customTimeInput;return o?r.cloneElement(o,{value:e,onChange:l.onTimeChange}):r.createElement("input",{type:"time",className:"react-datepicker-time__input",placeholder:"Time",name:"time-input",required:!0,value:e,onChange:function(e){l.onTimeChange(e.target.value||n)}})})),l.state={time:l.props.timeString},l}return Cs(n,[{key:"render",value:function(){return r.createElement("div",{className:"react-datepicker__input-time-container"},r.createElement("div",{className:"react-datepicker-time__caption"},this.props.timeInputLabel),r.createElement("div",{className:"react-datepicker-time__input-container"},r.createElement("div",{className:"react-datepicker-time__input"},this.renderTimeInput())))}}]),n}();function jc(e){var t=e.className,n=e.children,l=e.showPopperArrow,o=e.arrowProps,a=void 0===o?{}:o;return r.createElement("div",{className:t},l&&r.createElement("div",Es({className:"react-datepicker__triangle"},a)),n)}var Ac=["react-datepicker__year-select","react-datepicker__month-select","react-datepicker__month-year-select"],Vc=function(e){Ms(n,r.Component);var t=Bs(n);function n(e){var l;return ys(this,n),Fs(zs(l=t.call(this,e)),"handleClickOutside",(function(e){l.props.onClickOutside(e)})),Fs(zs(l),"setClickOutsideRef",(function(){return l.containerRef.current})),Fs(zs(l),"handleDropdownFocus",(function(e){(function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=(e.className||"").split(/\s+/);return Ac.some((function(e){return t.indexOf(e)>=0}))})(e.target)&&l.props.onDropdownFocus()})),Fs(zs(l),"getDateInView",(function(){var e=l.props,t=e.preSelection,n=e.selected,o=e.openToDate,r=vc(l.props),a=wc(l.props),i=Hs();return o||n||t||(r&&ha(i,r)?r:a&&_a(i,a)?a:i)})),Fs(zs(l),"increaseMonth",(function(){l.setState((function(e){return{date:Nr(e.date,1)}}),(function(){return l.handleMonthChange(l.state.date)}))})),Fs(zs(l),"decreaseMonth",(function(){l.setState((function(e){return{date:jr(e.date,1)}}),(function(){return l.handleMonthChange(l.state.date)}))})),Fs(zs(l),"handleDayClick",(function(e,t,n){return l.props.onSelect(e,t,n)})),Fs(zs(l),"handleDayMouseEnter",(function(e){l.setState({selectingDate:e}),l.props.onDayMouseEnter&&l.props.onDayMouseEnter(e)})),Fs(zs(l),"handleMonthMouseLeave",(function(){l.setState({selectingDate:null}),l.props.onMonthMouseLeave&&l.props.onMonthMouseLeave()})),Fs(zs(l),"handleYearChange",(function(e){l.props.onYearChange&&l.props.onYearChange(e)})),Fs(zs(l),"handleMonthChange",(function(e){l.props.onMonthChange&&l.props.onMonthChange(e),l.props.adjustDateOnChange&&(l.props.onSelect&&l.props.onSelect(e),l.props.setOpen&&l.props.setOpen(!0)),l.props.setPreSelection&&l.props.setPreSelection(e)})),Fs(zs(l),"handleMonthYearChange",(function(e){l.handleYearChange(e),l.handleMonthChange(e)})),Fs(zs(l),"changeYear",(function(e){l.setState((function(t){return{date:aa(t.date,e)}}),(function(){return l.handleYearChange(l.state.date)}))})),Fs(zs(l),"changeMonth",(function(e){l.setState((function(t){return{date:oa(t.date,e)}}),(function(){return l.handleMonthChange(l.state.date)}))})),Fs(zs(l),"changeMonthYear",(function(e){l.setState((function(t){return{date:aa(oa(t.date,Xr(e)),Jr(e))}}),(function(){return l.handleMonthYearChange(l.state.date)}))})),Fs(zs(l),"header",(function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:l.state.date,t=Gs(e,l.props.locale),n=[];return l.props.showWeekNumbers&&n.push(r.createElement("div",{key:"W",className:"react-datepicker__day-name"},l.props.weekLabel||"#")),n.concat([0,1,2,3,4,5,6].map((function(e){var n=Rr(t,e),o=l.formatWeekday(n,l.props.locale),a=l.props.weekDayClassName?l.props.weekDayClassName(n):void 0;return r.createElement("div",{key:e,className:ko("react-datepicker__day-name",a)},o)})))})),Fs(zs(l),"formatWeekday",(function(e,t){return l.props.formatWeekDay?function(e,t,n){return t(Vs(e,"EEEE",n))}(e,l.props.formatWeekDay,t):l.props.useWeekdaysShort?function(e,t){return Vs(e,"EEE",t)}(e,t):function(e,t){return Vs(e,"EEEEEE",t)}(e,t)})),Fs(zs(l),"decreaseYear",(function(){l.setState((function(e){return{date:Ar(e.date,l.props.showYearPicker?11:1)}}),(function(){return l.handleYearChange(l.state.date)}))})),Fs(zs(l),"renderPreviousButton",(function(){if(!l.props.renderCustomHeader){var e=l.props.showMonthYearPicker?xc(l.state.date,l.props):hc(l.state.date,l.props);if((l.props.forceShowMonthNavigation||l.props.showDisabledMonthNavigation||!e)&&!l.props.showTimeSelectOnly){var t=["react-datepicker__navigation","react-datepicker__navigation--previous"],n=l.decreaseMonth;(l.props.showMonthYearPicker||l.props.showQuarterYearPicker||l.props.showYearPicker)&&(n=l.decreaseYear),e&&l.props.showDisabledMonthNavigation&&(t.push("react-datepicker__navigation--previous--disabled"),n=null);var o=l.props.showMonthYearPicker||l.props.showQuarterYearPicker,a=l.props,i=a.previousMonthAriaLabel,d=void 0===i?"Previous Month":i,u=a.previousYearAriaLabel,s=void 0===u?"Previous Year":u;return r.createElement("button",{type:"button",className:t.join(" "),onClick:n,"aria-label":o?s:d},o?l.props.previousYearButtonLabel:l.props.previousMonthButtonLabel)}}})),Fs(zs(l),"increaseYear",(function(){l.setState((function(e){return{date:Hr(e.date,l.props.showYearPicker?11:1)}}),(function(){return l.handleYearChange(l.state.date)}))})),Fs(zs(l),"renderNextButton",(function(){if(!l.props.renderCustomHeader){var e=l.props.showMonthYearPicker?bc(l.state.date,l.props):gc(l.state.date,l.props);if((l.props.forceShowMonthNavigation||l.props.showDisabledMonthNavigation||!e)&&!l.props.showTimeSelectOnly){var t=["react-datepicker__navigation","react-datepicker__navigation--next"];l.props.showTimeSelect&&t.push("react-datepicker__navigation--next--with-time"),l.props.todayButton&&t.push("react-datepicker__navigation--next--with-today-button");var n=l.increaseMonth;(l.props.showMonthYearPicker||l.props.showQuarterYearPicker||l.props.showYearPicker)&&(n=l.increaseYear),e&&l.props.showDisabledMonthNavigation&&(t.push("react-datepicker__navigation--next--disabled"),n=null);var o=l.props.showMonthYearPicker||l.props.showQuarterYearPicker,a=l.props,i=a.nextMonthAriaLabel,d=void 0===i?"Next Month":i,u=a.nextYearAriaLabel,s=void 0===u?"Next Year":u;return r.createElement("button",{type:"button",className:t.join(" "),onClick:n,"aria-label":o?s:d},o?l.props.nextYearButtonLabel:l.props.nextMonthButtonLabel)}}})),Fs(zs(l),"renderCurrentMonth",(function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:l.state.date,t=["react-datepicker__current-month"];return l.props.showYearDropdown&&t.push("react-datepicker__current-month--hasYearDropdown"),l.props.showMonthDropdown&&t.push("react-datepicker__current-month--hasMonthDropdown"),l.props.showMonthYearDropdown&&t.push("react-datepicker__current-month--hasMonthYearDropdown"),r.createElement("div",{className:t.join(" ")},Vs(e,l.props.dateFormat,l.props.locale))})),Fs(zs(l),"renderYearDropdown",(function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(l.props.showYearDropdown&&!e)return r.createElement(Sc,{adjustDateOnChange:l.props.adjustDateOnChange,date:l.state.date,onSelect:l.props.onSelect,setOpen:l.props.setOpen,dropdownMode:l.props.dropdownMode,onChange:l.changeYear,minDate:l.props.minDate,maxDate:l.props.maxDate,year:Jr(l.state.date),scrollableYearDropdown:l.props.scrollableYearDropdown,yearDropdownItemNumber:l.props.yearDropdownItemNumber})})),Fs(zs(l),"renderMonthDropdown",(function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(l.props.showMonthDropdown&&!e)return r.createElement(Mc,{dropdownMode:l.props.dropdownMode,locale:l.props.locale,onChange:l.changeMonth,month:Xr(l.state.date),useShortMonthInDropdown:l.props.useShortMonthInDropdown})})),Fs(zs(l),"renderMonthYearDropdown",(function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(l.props.showMonthYearDropdown&&!e)return r.createElement(zc,{dropdownMode:l.props.dropdownMode,locale:l.props.locale,dateFormat:l.props.dateFormat,onChange:l.changeMonthYear,minDate:l.props.minDate,maxDate:l.props.maxDate,date:l.state.date,scrollableMonthYearDropdown:l.props.scrollableMonthYearDropdown})})),Fs(zs(l),"renderTodayButton",(function(){if(l.props.todayButton&&!l.props.showTimeSelectOnly)return r.createElement("div",{className:"react-datepicker__today-button",onClick:function(e){return l.props.onSelect(ua(Hs()),e)}},l.props.todayButton)})),Fs(zs(l),"renderDefaultHeader",(function(e){var t=e.monthDate,n=e.i;return r.createElement("div",{className:"react-datepicker__header"},l.renderCurrentMonth(t),r.createElement("div",{className:"react-datepicker__header__dropdown react-datepicker__header__dropdown--".concat(l.props.dropdownMode),onFocus:l.handleDropdownFocus},l.renderMonthDropdown(0!==n),l.renderMonthYearDropdown(0!==n),l.renderYearDropdown(0!==n)),r.createElement("div",{className:"react-datepicker__day-names"},l.header(t)))})),Fs(zs(l),"renderCustomHeader",(function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.monthDate,n=e.i;if(0!==n&&void 0!==n)return null;var o=hc(l.state.date,l.props),a=gc(l.state.date,l.props),i=xc(l.state.date,l.props),d=bc(l.state.date,l.props),u=!l.props.showMonthYearPicker&&!l.props.showQuarterYearPicker&&!l.props.showYearPicker;return r.createElement("div",{className:"react-datepicker__header react-datepicker__header--custom",onFocus:l.props.onDropdownFocus},l.props.renderCustomHeader(Ps(Ps({},l.state),{},{changeMonth:l.changeMonth,changeYear:l.changeYear,decreaseMonth:l.decreaseMonth,increaseMonth:l.increaseMonth,decreaseYear:l.decreaseYear,increaseYear:l.increaseYear,prevMonthButtonDisabled:o,nextMonthButtonDisabled:a,prevYearButtonDisabled:i,nextYearButtonDisabled:d})),u&&r.createElement("div",{className:"react-datepicker__day-names"},l.header(t)))})),Fs(zs(l),"renderYearHeader",(function(){return r.createElement("div",{className:"react-datepicker__header react-datepicker-year-header"},l.props.showYearPicker?"".concat(Jr(l.state.date)-11," - ").concat(Jr(l.state.date)):Jr(l.state.date))})),Fs(zs(l),"renderHeader",(function(e){switch(!0){case void 0!==l.props.renderCustomHeader:return l.renderCustomHeader(e);case l.props.showMonthYearPicker||l.props.showQuarterYearPicker||l.props.showYearPicker:return l.renderYearHeader(e);default:return l.renderDefaultHeader(e)}})),Fs(zs(l),"renderMonths",(function(){if(!l.props.showTimeSelectOnly&&!l.props.showYearPicker){for(var e=[],t=l.props.showPreviousMonths?l.props.monthsShown-1:0,n=jr(l.state.date,t),o=0;o1&&t[t.length-1].focus()})),Fs(zs(l),"handleFocusEnd",(function(e){var t=l.getTabChildren();t&&t.length>1&&t[0].focus()})),l.tabLoopRef=r.createRef(),l}return Cs(n,null,[{key:"defaultProps",get:function(){return{enableTabLoop:!0}}}]),Cs(n,[{key:"render",value:function(){return this.props.enableTabLoop?r.createElement("div",{className:"react-datepicker__tab-loop",ref:this.tabLoopRef},r.createElement("div",{className:"react-datepicker__tab-loop__start",tabIndex:"0",onFocus:this.handleFocusStart}),this.props.children,r.createElement("div",{className:"react-datepicker__tab-loop__end",tabIndex:"0",onFocus:this.handleFocusEnd})):this.props.children}}]),n}(),Wc=function(e){Ms(n,r.Component);var t=Bs(n);function n(){return ys(this,n),t.apply(this,arguments)}return Cs(n,[{key:"render",value:function(){var e,t=this.props,n=t.className,l=t.wrapperClassName,o=t.hidePopper,a=t.popperComponent,i=t.popperModifiers,d=t.popperPlacement,u=t.popperProps,s=t.targetComponent,c=t.enableTabLoop,m=t.popperOnKeyDown;if(!o){var p=ko("react-datepicker-popper",n);e=r.createElement(xs,Es({modifiers:i,placement:d},u),(function(e){var t=e.ref,n=e.style,l=e.placement,o=e.arrowProps;return r.createElement(Uc,{enableTabLoop:c},r.createElement("div",Es({ref:t,style:n},{className:p,"data-placement":l,onKeyDown:m}),r.cloneElement(a,{arrowProps:o})))}))}this.props.popperContainer&&(e=r.createElement(this.props.popperContainer,{},e));var f=ko("react-datepicker-wrapper",l);return r.createElement(cs,{className:"react-datepicker-manager"},r.createElement(vs,null,(function(e){var t=e.ref;return r.createElement("div",{ref:t,className:f},s)})),e)}}],[{key:"defaultProps",get:function(){return{hidePopper:!0,popperModifiers:{preventOverflow:{enabled:!0,escapeWithReference:!0,boundariesElement:"viewport"}},popperProps:{},popperPlacement:"bottom-start"}}}]),n}(),qc=zi(Vc),Gc=function(e){Ms(n,r.Component);var t=Bs(n);function n(e){var l;return ys(this,n),Fs(zs(l=t.call(this,e)),"getPreSelection",(function(){return l.props.openToDate?l.props.openToDate:l.props.selectsEnd&&l.props.startDate?l.props.startDate:l.props.selectsStart&&l.props.endDate?l.props.endDate:Hs()})),Fs(zs(l),"calcInitialState",(function(){var e=l.getPreSelection(),t=vc(l.props),n=wc(l.props),o=t&&ha(e,t)?t:n&&_a(e,n)?n:e;return{open:l.props.startOpen||!1,preventFocus:!1,preSelection:l.props.selected?l.props.selected:o,highlightDates:yc(l.props.highlightDates),focused:!1}})),Fs(zs(l),"clearPreventFocusTimeout",(function(){l.preventFocusTimeout&&clearTimeout(l.preventFocusTimeout)})),Fs(zs(l),"setFocus",(function(){l.input&&l.input.focus&&l.input.focus()})),Fs(zs(l),"setBlur",(function(){l.input&&l.input.blur&&l.input.blur(),l.cancelFocusInput()})),Fs(zs(l),"setOpen",(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];l.setState({open:e,preSelection:e&&l.state.open?l.state.preSelection:l.calcInitialState().preSelection,lastPreSelectChange:Kc},(function(){e||l.setState((function(e){return{focused:!!t&&e.focused}}),(function(){!t&&l.setBlur(),l.setState({inputValue:null})}))}))})),Fs(zs(l),"inputOk",(function(){return Fo(l.state.preSelection)})),Fs(zs(l),"isCalendarOpen",(function(){return void 0===l.props.open?l.state.open&&!l.props.disabled&&!l.props.readOnly:l.props.open})),Fs(zs(l),"handleFocus",(function(e){l.state.preventFocus||(l.props.onFocus(e),l.props.preventOpenOnFocus||l.props.readOnly||l.setOpen(!0)),l.setState({focused:!0})})),Fs(zs(l),"cancelFocusInput",(function(){clearTimeout(l.inputFocusTimeout),l.inputFocusTimeout=null})),Fs(zs(l),"deferFocusInput",(function(){l.cancelFocusInput(),l.inputFocusTimeout=setTimeout((function(){return l.setFocus()}),1)})),Fs(zs(l),"handleDropdownFocus",(function(){l.cancelFocusInput()})),Fs(zs(l),"handleBlur",(function(e){(!l.state.open||l.props.withPortal||l.props.showTimeInput)&&l.props.onBlur(e),l.setState({focused:!1})})),Fs(zs(l),"handleCalendarClickOutside",(function(e){l.props.inline||l.setOpen(!1),l.props.onClickOutside(e),l.props.withPortal&&e.preventDefault()})),Fs(zs(l),"handleChange",(function(){for(var e=arguments.length,t=new Array(e),n=0;n1&&!l.props.inlineFocusSelectedMonth&&l.setState({monthSelectedIn:o})),l.props.onChange(r,t)),l.props.onSelect(r,t),n||l.setState({inputValue:null}))})),Fs(zs(l),"setPreSelection",(function(e){var t=void 0!==l.props.minDate,n=void 0!==l.props.maxDate,o=!0;e&&(t&&n?o=tc(e,l.props.minDate,l.props.maxDate):t?o=_a(e,l.props.minDate):n&&(o=ha(e,l.props.maxDate))),o&&l.setState({preSelection:e})})),Fs(zs(l),"handleTimeChange",(function(e){var t=Ys(l.props.selected?l.props.selected:l.getPreSelection(),{hour:Ur(e),minute:Yr(e)});l.setState({preSelection:t}),l.props.onChange(t),l.props.shouldCloseOnSelect&&l.setOpen(!1),l.props.showTimeInput&&l.setOpen(!0),l.setState({inputValue:null})})),Fs(zs(l),"onInputClick",(function(){l.props.disabled||l.props.readOnly||l.setOpen(!0),l.props.onInputClick()})),Fs(zs(l),"onInputKeyDown",(function(e){l.props.onKeyDown(e);var t=e.key;if(l.state.open||l.props.inline||l.props.preventOpenOnFocus){if(l.state.open){if("ArrowDown"===t||"ArrowUp"===t){e.preventDefault();var n=l.calendar.componentNode&&l.calendar.componentNode.querySelector('.react-datepicker__day[tabindex="0"]');return void(n&&n.focus())}var o=Hs(l.state.preSelection);"Enter"===t?(e.preventDefault(),l.inputOk()&&l.state.lastPreSelectChange===Kc?(l.handleSelect(o,e),!l.props.shouldCloseOnSelect&&l.setPreSelection(o)):l.setOpen(!1)):"Escape"===t&&(e.preventDefault(),l.setOpen(!1)),l.inputOk()||l.props.onInputError({code:1,msg:"Date input not valid."})}}else"ArrowDown"!==t&&"ArrowUp"!==t&&"Enter"!==t||l.onInputClick()})),Fs(zs(l),"onDayKeyDown",(function(e){l.props.onKeyDown(e);var t=e.key,n=Hs(l.state.preSelection);if("Enter"===t)e.preventDefault(),l.handleSelect(n,e),!l.props.shouldCloseOnSelect&&l.setPreSelection(n);else if("Escape"===t)e.preventDefault(),l.setOpen(!1),l.inputOk()||l.props.onInputError({code:1,msg:"Date input not valid."});else if(!l.props.disabledKeyboardNavigation){var o;switch(t){case"ArrowLeft":o=function(e,t){Co(2,arguments);var n=Ro(t);return Rr(e,-n)}(n,1);break;case"ArrowRight":o=Rr(n,1);break;case"ArrowUp":o=function(e,t){Co(2,arguments);var n=Ro(t);return Lr(e,-n)}(n,1);break;case"ArrowDown":o=Lr(n,1);break;case"PageUp":o=jr(n,1);break;case"PageDown":o=Nr(n,1);break;case"Home":o=Ar(n,1);break;case"End":o=Hr(n,1)}if(!o)return void(l.props.onInputError&&l.props.onInputError({code:1,msg:"Date input not valid."}));e.preventDefault(),l.setState({lastPreSelectChange:Kc}),l.props.adjustDateOnChange&&l.setSelected(o),l.setPreSelection(o)}})),Fs(zs(l),"onPopperKeyDown",(function(e){"Escape"===e.key&&(e.preventDefault(),l.setState({preventFocus:!0},(function(){l.setOpen(!1),setTimeout((function(){l.setFocus(),l.setState({preventFocus:!1})}))})))})),Fs(zs(l),"onClearClick",(function(e){e&&e.preventDefault&&e.preventDefault(),l.props.onChange(null,e),l.setState({inputValue:null})})),Fs(zs(l),"clear",(function(){l.onClearClick()})),Fs(zs(l),"renderCalendar",(function(){return l.props.inline||l.isCalendarOpen()?r.createElement(qc,{ref:function(e){l.calendar=e},locale:l.props.locale,chooseDayAriaLabelPrefix:l.props.chooseDayAriaLabelPrefix,disabledDayAriaLabelPrefix:l.props.disabledDayAriaLabelPrefix,weekAriaLabelPrefix:l.props.weekAriaLabelPrefix,adjustDateOnChange:l.props.adjustDateOnChange,setOpen:l.setOpen,shouldCloseOnSelect:l.props.shouldCloseOnSelect,dateFormat:l.props.dateFormatCalendar,useWeekdaysShort:l.props.useWeekdaysShort,formatWeekDay:l.props.formatWeekDay,dropdownMode:l.props.dropdownMode,selected:l.props.selected,preSelection:l.state.preSelection,onSelect:l.handleSelect,onWeekSelect:l.props.onWeekSelect,openToDate:l.props.openToDate,minDate:l.props.minDate,maxDate:l.props.maxDate,selectsStart:l.props.selectsStart,selectsEnd:l.props.selectsEnd,startDate:l.props.startDate,endDate:l.props.endDate,excludeDates:l.props.excludeDates,filterDate:l.props.filterDate,onClickOutside:l.handleCalendarClickOutside,formatWeekNumber:l.props.formatWeekNumber,highlightDates:l.state.highlightDates,includeDates:l.props.includeDates,includeTimes:l.props.includeTimes,injectTimes:l.props.injectTimes,inline:l.props.inline,peekNextMonth:l.props.peekNextMonth,showMonthDropdown:l.props.showMonthDropdown,showPreviousMonths:l.props.showPreviousMonths,useShortMonthInDropdown:l.props.useShortMonthInDropdown,showMonthYearDropdown:l.props.showMonthYearDropdown,showWeekNumbers:l.props.showWeekNumbers,showYearDropdown:l.props.showYearDropdown,withPortal:l.props.withPortal,forceShowMonthNavigation:l.props.forceShowMonthNavigation,showDisabledMonthNavigation:l.props.showDisabledMonthNavigation,scrollableYearDropdown:l.props.scrollableYearDropdown,scrollableMonthYearDropdown:l.props.scrollableMonthYearDropdown,todayButton:l.props.todayButton,weekLabel:l.props.weekLabel,outsideClickIgnoreClass:"react-datepicker-ignore-onclickoutside",fixedHeight:l.props.fixedHeight,monthsShown:l.props.monthsShown,monthSelectedIn:l.state.monthSelectedIn,onDropdownFocus:l.handleDropdownFocus,onMonthChange:l.props.onMonthChange,onYearChange:l.props.onYearChange,dayClassName:l.props.dayClassName,weekDayClassName:l.props.weekDayClassName,monthClassName:l.props.monthClassName,timeClassName:l.props.timeClassName,showTimeSelect:l.props.showTimeSelect,showTimeSelectOnly:l.props.showTimeSelectOnly,onTimeChange:l.handleTimeChange,timeFormat:l.props.timeFormat,timeIntervals:l.props.timeIntervals,minTime:l.props.minTime,maxTime:l.props.maxTime,excludeTimes:l.props.excludeTimes,timeCaption:l.props.timeCaption,className:l.props.calendarClassName,container:l.props.calendarContainer,yearDropdownItemNumber:l.props.yearDropdownItemNumber,previousMonthButtonLabel:l.props.previousMonthButtonLabel,nextMonthButtonLabel:l.props.nextMonthButtonLabel,previousYearButtonLabel:l.props.previousYearButtonLabel,nextYearButtonLabel:l.props.nextYearButtonLabel,timeInputLabel:l.props.timeInputLabel,disabledKeyboardNavigation:l.props.disabledKeyboardNavigation,renderCustomHeader:l.props.renderCustomHeader,popperProps:l.props.popperProps,renderDayContents:l.props.renderDayContents,onDayMouseEnter:l.props.onDayMouseEnter,onMonthMouseLeave:l.props.onMonthMouseLeave,showTimeInput:l.props.showTimeInput,showMonthYearPicker:l.props.showMonthYearPicker,showFullMonthYearPicker:l.props.showFullMonthYearPicker,showYearPicker:l.props.showYearPicker,showQuarterYearPicker:l.props.showQuarterYearPicker,showPopperArrow:l.props.showPopperArrow,excludeScrollbar:l.props.excludeScrollbar,handleOnKeyDown:l.onDayKeyDown,isInputFocused:l.state.focused,customTimeInput:l.props.customTimeInput,setPreSelection:l.setPreSelection},l.props.children):null})),Fs(zs(l),"renderDateInput",(function(){var e,t,n,o,a,i=ko(l.props.className,Fs({},"react-datepicker-ignore-onclickoutside",l.state.open)),d=l.props.customInput||r.createElement("input",{type:"text"}),u=l.props.customInputRef||"ref",s="string"==typeof l.props.value?l.props.value:"string"==typeof l.state.inputValue?l.state.inputValue:(t=l.props.selected,o=(n=l.props).dateFormat,a=n.locale,t&&Vs(t,Array.isArray(o)?o[0]:o,a)||"");return r.cloneElement(d,(Fs(e={},u,(function(e){l.input=e})),Fs(e,"value",s),Fs(e,"onBlur",l.handleBlur),Fs(e,"onChange",l.handleChange),Fs(e,"onClick",l.onInputClick),Fs(e,"onFocus",l.handleFocus),Fs(e,"onKeyDown",l.onInputKeyDown),Fs(e,"id",l.props.id),Fs(e,"name",l.props.name),Fs(e,"autoFocus",l.props.autoFocus),Fs(e,"placeholder",l.props.placeholderText),Fs(e,"disabled",l.props.disabled),Fs(e,"autoComplete",l.props.autoComplete),Fs(e,"className",ko(d.props.className,i)),Fs(e,"title",l.props.title),Fs(e,"readOnly",l.props.readOnly),Fs(e,"required",l.props.required),Fs(e,"tabIndex",l.props.tabIndex),Fs(e,"aria-labelledby",l.props.ariaLabelledBy),e))})),Fs(zs(l),"renderClearButton",(function(){var e=l.props,t=e.isClearable,n=e.selected,o=e.clearButtonTitle,a=e.ariaLabelClose,i=void 0===a?"Close":a;return t&&null!=n?r.createElement("button",{type:"button",className:"react-datepicker__close-icon","aria-label":i,onClick:l.onClearClick,title:o,tabIndex:-1}):null})),l.state=l.calcInitialState(),l}return Cs(n,null,[{key:"defaultProps",get:function(){return{allowSameDay:!1,dateFormat:"MM/dd/yyyy",dateFormatCalendar:"LLLL yyyy",onChange:function(){},disabled:!1,disabledKeyboardNavigation:!1,dropdownMode:"scroll",onFocus:function(){},onBlur:function(){},onKeyDown:function(){},onInputClick:function(){},onSelect:function(){},onClickOutside:function(){},onMonthChange:function(){},onCalendarOpen:function(){},onCalendarClose:function(){},preventOpenOnFocus:!1,onYearChange:function(){},onInputError:function(){},monthsShown:1,readOnly:!1,withPortal:!1,shouldCloseOnSelect:!0,showTimeSelect:!1,showTimeInput:!1,showPreviousMonths:!1,showMonthYearPicker:!1,showFullMonthYearPicker:!1,showYearPicker:!1,showQuarterYearPicker:!1,strictParsing:!1,timeIntervals:30,timeCaption:"Time",previousMonthButtonLabel:"Previous Month",nextMonthButtonLabel:"Next Month",previousYearButtonLabel:"Previous Year",nextYearButtonLabel:"Next Year",timeInputLabel:"Time",enableTabLoop:!0,renderDayContents:function(e){return e},inlineFocusSelectedMonth:!1,showPopperArrow:!0,excludeScrollbar:!0,customTimeInput:null}}}]),Cs(n,[{key:"componentDidUpdate",value:function(e,t){var n,l;e.inline&&(n=e.selected,l=this.props.selected,n&&l?Xr(n)!==Xr(l)||Jr(n)!==Jr(l):n!==l)&&this.setPreSelection(this.props.selected),void 0!==this.state.monthSelectedIn&&e.monthsShown!==this.props.monthsShown&&this.setState({monthSelectedIn:0}),e.highlightDates!==this.props.highlightDates&&this.setState({highlightDates:yc(this.props.highlightDates)}),t.focused||ec(e.selected,this.props.selected)||this.setState({inputValue:null}),t.open!==this.state.open&&(!1===t.open&&!0===this.state.open&&this.props.onCalendarOpen(),!0===t.open&&!1===this.state.open&&this.props.onCalendarClose())}},{key:"componentWillUnmount",value:function(){this.clearPreventFocusTimeout()}},{key:"render",value:function(){var e=this.renderCalendar();return this.props.inline&&!this.props.withPortal?e:this.props.withPortal?r.createElement("div",null,this.props.inline?null:r.createElement("div",{className:"react-datepicker__input-container"},this.renderDateInput(),this.renderClearButton()),this.state.open||this.props.inline?r.createElement("div",{className:"react-datepicker__portal"},e):null):r.createElement(Wc,{className:this.props.popperClassName,wrapperClassName:this.props.wrapperClassName,hidePopper:!this.isCalendarOpen(),popperModifiers:this.props.popperModifiers,targetComponent:r.createElement("div",{className:"react-datepicker__input-container"},this.renderDateInput(),this.renderClearButton()),popperContainer:this.props.popperContainer,popperComponent:e,popperPlacement:this.props.popperPlacement,popperProps:this.props.popperProps,popperOnKeyDown:this.onPopperKeyDown,enableTabLoop:this.props.enableTabLoop})}}]),n}(),Qc="input",Kc="navigate",$c={"d-none":"DatePicker-module__d-none","d-inline":"DatePicker-module__d-inline","d-inline-block":"DatePicker-module__d-inline-block","d-block":"DatePicker-module__d-block","d-table":"DatePicker-module__d-table","d-table-row":"DatePicker-module__d-table-row","d-table-cell":"DatePicker-module__d-table-cell","d-flex":"DatePicker-module__d-flex","d-inline-flex":"DatePicker-module__d-inline-flex","d-sm-none":"DatePicker-module__d-sm-none","d-sm-inline":"DatePicker-module__d-sm-inline","d-sm-inline-block":"DatePicker-module__d-sm-inline-block","d-sm-block":"DatePicker-module__d-sm-block","d-sm-table":"DatePicker-module__d-sm-table","d-sm-table-row":"DatePicker-module__d-sm-table-row","d-sm-table-cell":"DatePicker-module__d-sm-table-cell","d-sm-flex":"DatePicker-module__d-sm-flex","d-sm-inline-flex":"DatePicker-module__d-sm-inline-flex","d-md-none":"DatePicker-module__d-md-none","d-md-inline":"DatePicker-module__d-md-inline","d-md-inline-block":"DatePicker-module__d-md-inline-block","d-md-block":"DatePicker-module__d-md-block","d-md-table":"DatePicker-module__d-md-table","d-md-table-row":"DatePicker-module__d-md-table-row","d-md-table-cell":"DatePicker-module__d-md-table-cell","d-md-flex":"DatePicker-module__d-md-flex","d-md-inline-flex":"DatePicker-module__d-md-inline-flex","d-lg-none":"DatePicker-module__d-lg-none","d-lg-inline":"DatePicker-module__d-lg-inline","d-lg-inline-block":"DatePicker-module__d-lg-inline-block","d-lg-block":"DatePicker-module__d-lg-block","d-lg-table":"DatePicker-module__d-lg-table","d-lg-table-row":"DatePicker-module__d-lg-table-row","d-lg-table-cell":"DatePicker-module__d-lg-table-cell","d-lg-flex":"DatePicker-module__d-lg-flex","d-lg-inline-flex":"DatePicker-module__d-lg-inline-flex","d-xl-none":"DatePicker-module__d-xl-none","d-xl-inline":"DatePicker-module__d-xl-inline","d-xl-inline-block":"DatePicker-module__d-xl-inline-block","d-xl-block":"DatePicker-module__d-xl-block","d-xl-table":"DatePicker-module__d-xl-table","d-xl-table-row":"DatePicker-module__d-xl-table-row","d-xl-table-cell":"DatePicker-module__d-xl-table-cell","d-xl-flex":"DatePicker-module__d-xl-flex","d-xl-inline-flex":"DatePicker-module__d-xl-inline-flex","d-print-none":"DatePicker-module__d-print-none","d-print-inline":"DatePicker-module__d-print-inline","d-print-inline-block":"DatePicker-module__d-print-inline-block","d-print-block":"DatePicker-module__d-print-block","d-print-table":"DatePicker-module__d-print-table","d-print-table-row":"DatePicker-module__d-print-table-row","d-print-table-cell":"DatePicker-module__d-print-table-cell","d-print-flex":"DatePicker-module__d-print-flex","d-print-inline-flex":"DatePicker-module__d-print-inline-flex",Calendar:"DatePicker-module__Calendar"},Xc={"d-none":"Collapsible-module__d-none","d-inline":"Collapsible-module__d-inline","d-inline-block":"Collapsible-module__d-inline-block","d-block":"Collapsible-module__d-block","d-table":"Collapsible-module__d-table","d-table-row":"Collapsible-module__d-table-row","d-table-cell":"Collapsible-module__d-table-cell","d-flex":"Collapsible-module__d-flex","d-inline-flex":"Collapsible-module__d-inline-flex","d-sm-none":"Collapsible-module__d-sm-none","d-sm-inline":"Collapsible-module__d-sm-inline","d-sm-inline-block":"Collapsible-module__d-sm-inline-block","d-sm-block":"Collapsible-module__d-sm-block","d-sm-table":"Collapsible-module__d-sm-table","d-sm-table-row":"Collapsible-module__d-sm-table-row","d-sm-table-cell":"Collapsible-module__d-sm-table-cell","d-sm-flex":"Collapsible-module__d-sm-flex","d-sm-inline-flex":"Collapsible-module__d-sm-inline-flex","d-md-none":"Collapsible-module__d-md-none","d-md-inline":"Collapsible-module__d-md-inline","d-md-inline-block":"Collapsible-module__d-md-inline-block","d-md-block":"Collapsible-module__d-md-block","d-md-table":"Collapsible-module__d-md-table","d-md-table-row":"Collapsible-module__d-md-table-row","d-md-table-cell":"Collapsible-module__d-md-table-cell","d-md-flex":"Collapsible-module__d-md-flex","d-md-inline-flex":"Collapsible-module__d-md-inline-flex","d-lg-none":"Collapsible-module__d-lg-none","d-lg-inline":"Collapsible-module__d-lg-inline","d-lg-inline-block":"Collapsible-module__d-lg-inline-block","d-lg-block":"Collapsible-module__d-lg-block","d-lg-table":"Collapsible-module__d-lg-table","d-lg-table-row":"Collapsible-module__d-lg-table-row","d-lg-table-cell":"Collapsible-module__d-lg-table-cell","d-lg-flex":"Collapsible-module__d-lg-flex","d-lg-inline-flex":"Collapsible-module__d-lg-inline-flex","d-xl-none":"Collapsible-module__d-xl-none","d-xl-inline":"Collapsible-module__d-xl-inline","d-xl-inline-block":"Collapsible-module__d-xl-inline-block","d-xl-block":"Collapsible-module__d-xl-block","d-xl-table":"Collapsible-module__d-xl-table","d-xl-table-row":"Collapsible-module__d-xl-table-row","d-xl-table-cell":"Collapsible-module__d-xl-table-cell","d-xl-flex":"Collapsible-module__d-xl-flex","d-xl-inline-flex":"Collapsible-module__d-xl-inline-flex","d-print-none":"Collapsible-module__d-print-none","d-print-inline":"Collapsible-module__d-print-inline","d-print-inline-block":"Collapsible-module__d-print-inline-block","d-print-block":"Collapsible-module__d-print-block","d-print-table":"Collapsible-module__d-print-table","d-print-table-row":"Collapsible-module__d-print-table-row","d-print-table-cell":"Collapsible-module__d-print-table-cell","d-print-flex":"Collapsible-module__d-print-flex","d-print-inline-flex":"Collapsible-module__d-print-inline-flex",container:"Collapsible-module__container",buttonOnBottom:"Collapsible-module__buttonOnBottom",button:"Collapsible-module__button",content:"Collapsible-module__content",chevron:"Collapsible-module__chevron",chevronCollapsed:"Collapsible-module__chevronCollapsed",title:"Collapsible-module__title",small:"Collapsible-module__small",buttonRight:"Collapsible-module__buttonRight",contentCollapsed:"Collapsible-module__contentCollapsed"},Zc={"d-none":"Switch-module__d-none","d-inline":"Switch-module__d-inline","d-inline-block":"Switch-module__d-inline-block","d-block":"Switch-module__d-block","d-table":"Switch-module__d-table","d-table-row":"Switch-module__d-table-row","d-table-cell":"Switch-module__d-table-cell","d-flex":"Switch-module__d-flex","d-inline-flex":"Switch-module__d-inline-flex","d-sm-none":"Switch-module__d-sm-none","d-sm-inline":"Switch-module__d-sm-inline","d-sm-inline-block":"Switch-module__d-sm-inline-block","d-sm-block":"Switch-module__d-sm-block","d-sm-table":"Switch-module__d-sm-table","d-sm-table-row":"Switch-module__d-sm-table-row","d-sm-table-cell":"Switch-module__d-sm-table-cell","d-sm-flex":"Switch-module__d-sm-flex","d-sm-inline-flex":"Switch-module__d-sm-inline-flex","d-md-none":"Switch-module__d-md-none","d-md-inline":"Switch-module__d-md-inline","d-md-inline-block":"Switch-module__d-md-inline-block","d-md-block":"Switch-module__d-md-block","d-md-table":"Switch-module__d-md-table","d-md-table-row":"Switch-module__d-md-table-row","d-md-table-cell":"Switch-module__d-md-table-cell","d-md-flex":"Switch-module__d-md-flex","d-md-inline-flex":"Switch-module__d-md-inline-flex","d-lg-none":"Switch-module__d-lg-none","d-lg-inline":"Switch-module__d-lg-inline","d-lg-inline-block":"Switch-module__d-lg-inline-block","d-lg-block":"Switch-module__d-lg-block","d-lg-table":"Switch-module__d-lg-table","d-lg-table-row":"Switch-module__d-lg-table-row","d-lg-table-cell":"Switch-module__d-lg-table-cell","d-lg-flex":"Switch-module__d-lg-flex","d-lg-inline-flex":"Switch-module__d-lg-inline-flex","d-xl-none":"Switch-module__d-xl-none","d-xl-inline":"Switch-module__d-xl-inline","d-xl-inline-block":"Switch-module__d-xl-inline-block","d-xl-block":"Switch-module__d-xl-block","d-xl-table":"Switch-module__d-xl-table","d-xl-table-row":"Switch-module__d-xl-table-row","d-xl-table-cell":"Switch-module__d-xl-table-cell","d-xl-flex":"Switch-module__d-xl-flex","d-xl-inline-flex":"Switch-module__d-xl-inline-flex","d-print-none":"Switch-module__d-print-none","d-print-inline":"Switch-module__d-print-inline","d-print-inline-block":"Switch-module__d-print-inline-block","d-print-block":"Switch-module__d-print-block","d-print-table":"Switch-module__d-print-table","d-print-table-row":"Switch-module__d-print-table-row","d-print-table-cell":"Switch-module__d-print-table-cell","d-print-flex":"Switch-module__d-print-flex","d-print-inline-flex":"Switch-module__d-print-inline-flex",switch:"Switch-module__switch",button:"Switch-module__button","button-always-small":"Switch-module__button-always-small","label-end":"Switch-module__label-end","label-start":"Switch-module__label-start","button-large":"Switch-module__button-large","button-small":"Switch-module__button-small",unchecked:"Switch-module__unchecked",checked:"Switch-module__checked",disabled:"Switch-module__disabled",label:"Switch-module__label",icon:"Switch-module__icon","icon-end":"Switch-module__icon-end",input:"Switch-module__input"};function Jc(e){var t=e.value,n=e.type,l=e.name,o=e.className,a=e.checked,i=void 0!==a&&a,d=e.disabled,u=e.variant,s=void 0===u?"default":u,c=e.onChange,m=e.id,p=e.inputProps,f=void 0===p?{}:p,_=e.icon,h=void 0===_?"checkbox-unchecked":_,g=e.iconChecked,x=void 0===g?"checkbox-checked":g,b=e.iconVariant,v=void 0===b?0:b,y=e.iconVariantChecked,k=void 0===y?0:y,C=e.iconFontSize,F=void 0===C?"16px":C,E=e.label,P=e.labelPlacement,M=void 0===P?"end":P,T=e.labelProps,D=e.customIcon,z=e.customIconChecked,I=S(e,["value","type","name","className","checked","disabled","variant","onChange","id","inputProps","icon","iconChecked","iconVariant","iconVariantChecked","iconFontSize","label","labelPlacement","labelProps","customIcon","customIconChecked"]),B=m||"".concat(n||"switch","-").concat(l,"-").concat(t),O=[Zc.switch,i?Zc.checked:Zc.unchecked,d?Zc.disabled:"","default"!==s&&Zc.button,"default"!==s&&Zc[s],o].filter(Boolean).join(" "),R=[Zc.icon,"start"===M&&Zc["icon-end"]].filter(Boolean).join(" "),L=[Zc.label,Zc["label-".concat(M)]].filter(Boolean).join(" "),N="string"===typeof E||"number"===typeof E?r.createElement(V,w({className:L,fontSize:"body-xsmall"},T),E):E;return r.createElement("label",w({},I,{htmlFor:B,className:O}),D?i&&z?z:D:r.createElement(Gt,{className:R,name:i?x:h,variant:i?k:v,fontSize:F}),("default"===s||"button-large"===s)&&N,r.createElement("input",w({},f,{className:Zc.input,value:t,id:B,onChange:c,name:l,checked:i,disabled:d,type:n})))}var em={"d-none":"RadioGroup-module__d-none","d-inline":"RadioGroup-module__d-inline","d-inline-block":"RadioGroup-module__d-inline-block","d-block":"RadioGroup-module__d-block","d-table":"RadioGroup-module__d-table","d-table-row":"RadioGroup-module__d-table-row","d-table-cell":"RadioGroup-module__d-table-cell","d-flex":"RadioGroup-module__d-flex","d-inline-flex":"RadioGroup-module__d-inline-flex","d-sm-none":"RadioGroup-module__d-sm-none","d-sm-inline":"RadioGroup-module__d-sm-inline","d-sm-inline-block":"RadioGroup-module__d-sm-inline-block","d-sm-block":"RadioGroup-module__d-sm-block","d-sm-table":"RadioGroup-module__d-sm-table","d-sm-table-row":"RadioGroup-module__d-sm-table-row","d-sm-table-cell":"RadioGroup-module__d-sm-table-cell","d-sm-flex":"RadioGroup-module__d-sm-flex","d-sm-inline-flex":"RadioGroup-module__d-sm-inline-flex","d-md-none":"RadioGroup-module__d-md-none","d-md-inline":"RadioGroup-module__d-md-inline","d-md-inline-block":"RadioGroup-module__d-md-inline-block","d-md-block":"RadioGroup-module__d-md-block","d-md-table":"RadioGroup-module__d-md-table","d-md-table-row":"RadioGroup-module__d-md-table-row","d-md-table-cell":"RadioGroup-module__d-md-table-cell","d-md-flex":"RadioGroup-module__d-md-flex","d-md-inline-flex":"RadioGroup-module__d-md-inline-flex","d-lg-none":"RadioGroup-module__d-lg-none","d-lg-inline":"RadioGroup-module__d-lg-inline","d-lg-inline-block":"RadioGroup-module__d-lg-inline-block","d-lg-block":"RadioGroup-module__d-lg-block","d-lg-table":"RadioGroup-module__d-lg-table","d-lg-table-row":"RadioGroup-module__d-lg-table-row","d-lg-table-cell":"RadioGroup-module__d-lg-table-cell","d-lg-flex":"RadioGroup-module__d-lg-flex","d-lg-inline-flex":"RadioGroup-module__d-lg-inline-flex","d-xl-none":"RadioGroup-module__d-xl-none","d-xl-inline":"RadioGroup-module__d-xl-inline","d-xl-inline-block":"RadioGroup-module__d-xl-inline-block","d-xl-block":"RadioGroup-module__d-xl-block","d-xl-table":"RadioGroup-module__d-xl-table","d-xl-table-row":"RadioGroup-module__d-xl-table-row","d-xl-table-cell":"RadioGroup-module__d-xl-table-cell","d-xl-flex":"RadioGroup-module__d-xl-flex","d-xl-inline-flex":"RadioGroup-module__d-xl-inline-flex","d-print-none":"RadioGroup-module__d-print-none","d-print-inline":"RadioGroup-module__d-print-inline","d-print-inline-block":"RadioGroup-module__d-print-inline-block","d-print-block":"RadioGroup-module__d-print-block","d-print-table":"RadioGroup-module__d-print-table","d-print-table-row":"RadioGroup-module__d-print-table-row","d-print-table-cell":"RadioGroup-module__d-print-table-cell","d-print-flex":"RadioGroup-module__d-print-flex","d-print-inline-flex":"RadioGroup-module__d-print-inline-flex","radio-wrapper":"RadioGroup-module__radio-wrapper","button-large-wrapper":"RadioGroup-module__button-large-wrapper","button-small-wrapper":"RadioGroup-module__button-small-wrapper","button-always-small-wrapper":"RadioGroup-module__button-always-small-wrapper"};var tm={"d-none":"Table-module__d-none","d-inline":"Table-module__d-inline","d-inline-block":"Table-module__d-inline-block","d-block":"Table-module__d-block","d-table":"Table-module__d-table","d-table-row":"Table-module__d-table-row","d-table-cell":"Table-module__d-table-cell","d-flex":"Table-module__d-flex","d-inline-flex":"Table-module__d-inline-flex","d-sm-none":"Table-module__d-sm-none","d-sm-inline":"Table-module__d-sm-inline","d-sm-inline-block":"Table-module__d-sm-inline-block","d-sm-block":"Table-module__d-sm-block","d-sm-table":"Table-module__d-sm-table","d-sm-table-row":"Table-module__d-sm-table-row","d-sm-table-cell":"Table-module__d-sm-table-cell","d-sm-flex":"Table-module__d-sm-flex","d-sm-inline-flex":"Table-module__d-sm-inline-flex","d-md-none":"Table-module__d-md-none","d-md-inline":"Table-module__d-md-inline","d-md-inline-block":"Table-module__d-md-inline-block","d-md-block":"Table-module__d-md-block","d-md-table":"Table-module__d-md-table","d-md-table-row":"Table-module__d-md-table-row","d-md-table-cell":"Table-module__d-md-table-cell","d-md-flex":"Table-module__d-md-flex","d-md-inline-flex":"Table-module__d-md-inline-flex","d-lg-none":"Table-module__d-lg-none","d-lg-inline":"Table-module__d-lg-inline","d-lg-inline-block":"Table-module__d-lg-inline-block","d-lg-block":"Table-module__d-lg-block","d-lg-table":"Table-module__d-lg-table","d-lg-table-row":"Table-module__d-lg-table-row","d-lg-table-cell":"Table-module__d-lg-table-cell","d-lg-flex":"Table-module__d-lg-flex","d-lg-inline-flex":"Table-module__d-lg-inline-flex","d-xl-none":"Table-module__d-xl-none","d-xl-inline":"Table-module__d-xl-inline","d-xl-inline-block":"Table-module__d-xl-inline-block","d-xl-block":"Table-module__d-xl-block","d-xl-table":"Table-module__d-xl-table","d-xl-table-row":"Table-module__d-xl-table-row","d-xl-table-cell":"Table-module__d-xl-table-cell","d-xl-flex":"Table-module__d-xl-flex","d-xl-inline-flex":"Table-module__d-xl-inline-flex","d-print-none":"Table-module__d-print-none","d-print-inline":"Table-module__d-print-inline","d-print-inline-block":"Table-module__d-print-inline-block","d-print-block":"Table-module__d-print-block","d-print-table":"Table-module__d-print-table","d-print-table-row":"Table-module__d-print-table-row","d-print-table-cell":"Table-module__d-print-table-cell","d-print-flex":"Table-module__d-print-flex","d-print-inline-flex":"Table-module__d-print-inline-flex",Table:"Table-module__Table",Th:"Table-module__Th","sort-icon":"Table-module__sort-icon",clickable:"Table-module__clickable",sorted:"Table-module__sorted",asc:"Table-module__asc",desc:"Table-module__desc",Row:"Table-module__Row","solid-borders":"Table-module__solid-borders","dashed-borders":"Table-module__dashed-borders",Cell:"Table-module__Cell"};function nm(e){var t=e.className,n=e.tableStyle,l=void 0===n?"solid-borders":n,o=e.children,a=S(e,["className","tableStyle","children"]),i=$(tm.Table,t,tm[l]);return r.createElement("table",w({},a,{className:i}),o)}nm.Thead=function(e){return r.createElement("thead",e)},nm.Tfoot=function(e){return r.createElement("tfoot",e)},nm.Tbody=function(e){return r.createElement("tbody",e)},nm.Cell=function(e){var t=e.className,n=e.children,l=S(e,["className","children"]),o=$(tm.Cell,t);return r.createElement("td",w({},l,{className:o}),n)},nm.Row=function(e){var t=e.className,n=e.children,l=S(e,["className","children"]),o=$(tm.Row,t);return r.createElement("tr",w({},l,{className:o}),n)},nm.Th=function(e){var t=e.className,n=e.sort,l=e.onClick,o=e.children,a=S(e,["className","sort","onClick","children"]),i=$(tm.Th,t,n&&tm[n],n&&tm.sorted,l&&tm.clickable);return r.createElement("th",w({},a,{className:i}),"function"===typeof l?r.createElement("button",{onClick:l},"string"===typeof o?r.createElement("span",null,o):o,r.createElement(Gt,{className:tm["sort-icon"],name:"arrow-left",fontSize:"inherit"})):o)};var lm="Tabs-module__Tab",om="Tabs-module__isActive";function rm(e){var t=e.children,n=e.role,l=void 0===n?"tablist":n,o=S(e,["children","role"]);return r.createElement(Un,w({role:l},o),t)}rm.Tab=function(e){var t=e.className,n=e.children,l=e.isActive,o=e.onClick,a=e.role,i=void 0===a?"tab":a,d=e.as,u=S(e,["className","children","isActive","onClick","role","as"]),s=$(t,lm,l&&om),c=void 0===d?{href:"#",onClick:function(e){e.preventDefault(),"function"===typeof o&&(e.persist(),o(e))}}:{onClick:o},m=d||"a";return r.createElement(m,w({},c,{className:s,role:i,"aria-selected":l},u),n)};var am="HighlightedHeader-module__HighlightedHeader",im=function(e){C(n,e);var t=T(n);function n(){return g(this,n),t.apply(this,arguments)}return b(n,[{key:"render",value:function(){var e=this.props,t=e.className,n=e.children,l=S(e,["className","children"]);return o.createElement("div",w({className:$(am,t)},l),n)}}]),n}(o.PureComponent);var dm="Menu-module__Menu",um="Menu-module__Menu-nav",sm="Menu-module__Menu-item",cm="Menu-module__Menu-item--active",mm="Menu-module__Menu--startShadow",pm="Menu-module__Menu--endShadow";function fm(e){var t=e.isActive,n=void 0!==t&&t,l=e.amount,a=e.item,i=e.onScrollIntoView,d=e.render,u=S(e,["isActive","amount","item","onScrollIntoView","render"]),s=o.useRef(null),c=cm,m=$(sm,n&&c);return o.useEffect((function(){var e=s.current;n&&e&&(e.scrollIntoView({block:"end",inline:"center"}),i())}),[l,n,i]),r.createElement("li",w({className:m,role:"presentation",ref:s,tabIndex:1},u),d(c,a))}var _m,hm="Placeholder-module__Placeholder",gm={flash:"animations-module__flash"};function xm(e){var n=e.animation,l=void 0===n?t.Animation.Flash:n,o=$(hm,e.className,gm[l]),a=e.color,i=e.width,d=e.height;return r.createElement("div",{className:o,style:{backgroundColor:a,width:i,height:d}})}(_m=t.Animation||(t.Animation={})).None="none",_m.Flash="flash";var bm={Variant1:"Variant1-module__Variant1","Variant1__content--title":"Variant1-module__Variant1__content--title","Variant1__content--subtitle":"Variant1-module__Variant1__content--subtitle","Variant1__content--body":"Variant1-module__Variant1__content--body",Variant1__footer:"Variant1-module__Variant1__footer"};function vm(e){var t=$(bm.Variant1,e.className),n=e.height,l=e.animation,o=S(e,["height","animation"]);return r.createElement("div",w({style:{height:n}},o,{className:t}),r.createElement("div",{className:bm.Variant1__content},r.createElement(xm,{animation:l,width:"33%",height:22,className:bm["Variant1__content--title"]}),r.createElement(xm,{animation:l,width:"63%",className:bm["Variant1__content--subtitle"]}),r.createElement(xm,{animation:l,width:"63%",className:bm["Variant1__content--body"]}),r.createElement(xm,{animation:l,width:"63%",className:bm["Variant1__content--body"]})),r.createElement("div",{className:bm.Variant1__footer},r.createElement(xm,{animation:l,width:190})))}var wm="Variant2-module__Variant2",ym="Variant2-module__Variant2__text";function km(e){var t=$(wm,e.className),n=e.height,l=e.linesOfText,o=e.animation,a=S(e,["height","linesOfText","animation"]);return r.createElement("div",w({style:{height:n}},a,{className:t}),r.createElement("div",null,r.createElement(xm,{animation:o,width:"100%",height:200})),r.createElement("div",null,r.createElement(xm,{animation:o,width:65,height:65,color:"white"})),r.createElement("div",null,r.createElement(xm,{animation:o,width:"33%",height:22})),l&&l>0&&r.createElement("div",null,Array.from(Array(l)).map((function(e,t){return r.createElement(xm,{animation:o,width:t%2?"63%":"90%",key:t,className:ym})}))))}function Cm(e){switch(e.variant){case 1:return r.createElement(vm,e);case 2:return r.createElement(km,e);default:return null}}Cm.Block=xm;var Fm="NotificationPopup-module__notificationsWrapper",Em="NotificationPopup-module__title",Sm="NotificationPopup-module__notificationsContainer",Pm="NotificationPopup-module__notificationsTrigger",Mm="NotificationPopup-module__notificationsBullet",Tm="NotificationPopup-module__notificationsBell",Dm="NotificationPopup-module__close",zm=ln((function(e,t){"undefined"!=typeof self&&self,e.exports=function(e){return function(e){var t={};function n(l){if(t[l])return t[l].exports;var o=t[l]={i:l,l:!1,exports:{}};return e[l].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,l){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:l})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var l=Object.create(null);if(n.r(l),Object.defineProperty(l,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(l,o,function(t){return e[t]}.bind(null,o));return l},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=2)}([function(t,n){t.exports=e},function(e,t,n){var l={linear:function(e,t,n,l){return(n-t)*e/l+t},easeInQuad:function(e,t,n,l){return(n-t)*(e/=l)*e+t},easeOutQuad:function(e,t,n,l){return-(n-t)*(e/=l)*(e-2)+t},easeInOutQuad:function(e,t,n,l){var o=n-t;return(e/=l/2)<1?o/2*e*e+t:-o/2*(--e*(e-2)-1)+t},easeInCubic:function(e,t,n,l){return(n-t)*(e/=l)*e*e+t},easeOutCubic:function(e,t,n,l){return(n-t)*((e=e/l-1)*e*e+1)+t},easeInOutCubic:function(e,t,n,l){var o=n-t;return(e/=l/2)<1?o/2*e*e*e+t:o/2*((e-=2)*e*e+2)+t},easeInQuart:function(e,t,n,l){return(n-t)*(e/=l)*e*e*e+t},easeOutQuart:function(e,t,n,l){return-(n-t)*((e=e/l-1)*e*e*e-1)+t},easeInOutQuart:function(e,t,n,l){var o=n-t;return(e/=l/2)<1?o/2*e*e*e*e+t:-o/2*((e-=2)*e*e*e-2)+t},easeInQuint:function(e,t,n,l){return(n-t)*(e/=l)*e*e*e*e+t},easeOutQuint:function(e,t,n,l){return(n-t)*((e=e/l-1)*e*e*e*e+1)+t},easeInOutQuint:function(e,t,n,l){var o=n-t;return(e/=l/2)<1?o/2*e*e*e*e*e+t:o/2*((e-=2)*e*e*e*e+2)+t},easeInSine:function(e,t,n,l){var o=n-t;return-o*Math.cos(e/l*(Math.PI/2))+o+t},easeOutSine:function(e,t,n,l){return(n-t)*Math.sin(e/l*(Math.PI/2))+t},easeInOutSine:function(e,t,n,l){return-(n-t)/2*(Math.cos(Math.PI*e/l)-1)+t},easeInExpo:function(e,t,n,l){return 0==e?t:(n-t)*Math.pow(2,10*(e/l-1))+t},easeOutExpo:function(e,t,n,l){var o=n-t;return e==l?t+o:o*(1-Math.pow(2,-10*e/l))+t},easeInOutExpo:function(e,t,n,l){var o=n-t;return 0===e?t:e===l?t+o:(e/=l/2)<1?o/2*Math.pow(2,10*(e-1))+t:o/2*(2-Math.pow(2,-10*--e))+t},easeInCirc:function(e,t,n,l){return-(n-t)*(Math.sqrt(1-(e/=l)*e)-1)+t},easeOutCirc:function(e,t,n,l){return(n-t)*Math.sqrt(1-(e=e/l-1)*e)+t},easeInOutCirc:function(e,t,n,l){var o=n-t;return(e/=l/2)<1?-o/2*(Math.sqrt(1-e*e)-1)+t:o/2*(Math.sqrt(1-(e-=2)*e)+1)+t},easeInElastic:function(e,t,n,l){var o,r,a,i=n-t;return a=1.70158,0===e?t:1==(e/=l)?t+i:((r=0)||(r=.3*l),(o=i)=1&&this.rotationDirection===o.Positive?this.rotationDirection=o.Negative:this.rotateY<=-1&&this.rotationDirection===o.Negative&&(this.rotationDirection=o.Positive);var d=.1*this.rotationDirection;if(this.rotateY+=d,this.angle+=this.angularSpin,this.context.save(),this.context.translate(this.x,this.y),this.context.rotate(this.angle),this.context.scale(1,this.rotateY),this.context.rotate(this.angle),this.context.beginPath(),this.context.fillStyle=this.color,this.context.strokeStyle=this.color,this.context.globalAlpha=a,this.context.lineCap="round",this.context.lineWidth=2,i&&"function"==typeof i)i.call(this,this.context);else switch(this.shape){case l.Circle:this.context.beginPath(),this.context.arc(0,0,this.radius,0,2*Math.PI),this.context.fill();break;case l.Square:this.context.fillRect(-this.w/2,-this.h/2,this.w,this.h);break;case l.Strip:this.context.fillRect(-this.w/6,-this.h/2,this.w/3,this.h)}this.context.closePath(),this.context.restore()}}])&&s(e.prototype,t),e}();function p(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var f=function e(t,n){var l=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),p(this,"canvas",void 0),p(this,"context",void 0),p(this,"getOptions",void 0),p(this,"x",0),p(this,"y",0),p(this,"w",0),p(this,"h",0),p(this,"lastNumberOfPieces",0),p(this,"tweenInitTime",Date.now()),p(this,"particles",[]),p(this,"particlesGenerated",0),p(this,"removeParticleAt",(function(e){l.particles.splice(e,1)})),p(this,"getParticle",(function(){var e=u(l.x,l.w+l.x),t=u(l.y,l.h+l.y);return new m(l.context,l.getOptions,e,t)})),p(this,"animate",(function(){var e=l.canvas,t=l.context,n=l.particlesGenerated,o=l.lastNumberOfPieces,r=l.getOptions(),a=r.run,i=r.recycle,d=r.numberOfPieces,u=r.debug,s=r.tweenFunction,c=r.tweenDuration;if(!a)return!1;var m=l.particles.length,p=i?m:n,f=Date.now();if(pc?c:Math.max(0,f-_),p,d,c),g=Math.round(h-p),x=0;xe.height||t.y<-100||t.x>e.width+100||t.x<-100)&&(i&&p<=d?l.particles[n]=l.getParticle():l.removeParticleAt(n))})),m>0||p0&&n.call(l,l),l._options.run=!1)})),g(this,"reset",(function(){l.generator&&l.generator.particlesGenerated>0&&(l.generator.particlesGenerated=0,l.generator.particles=[],l.generator.lastNumberOfPieces=0)})),g(this,"stop",(function(){l.options={run:!1},l.rafId&&(cancelAnimationFrame(l.rafId),l.rafId=void 0)})),this.canvas=t;var o=this.canvas.getContext("2d");if(!o)throw new Error("Could not get canvas context");this.context=o,this.generator=new f(this.canvas,(function(){return l.options})),this.options=n,this.update()}var t;return(t=[{key:"options",get:function(){return this._options},set:function(e){var t=this._options&&this._options.run,n=this._options&&this._options.recycle;this.setOptionsWithDefaults(e),this.generator&&(Object.assign(this.generator,this.options.confettiSource),"boolean"==typeof e.recycle&&e.recycle&&!1===n&&(this.generator.lastNumberOfPieces=this.generator.particles.length)),"boolean"==typeof e.run&&e.run&&!1===t&&this.update()}}])&&h(e.prototype,t),e}();function v(e){return function(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t1?o-1:0),i=1;i0&&(e=setTimeout((function(){return p(a/2)}),.6*n),t=setTimeout((function(){return p(a/4)}),.8*n),l=setTimeout((function(){return p(0)}),n)),function(){n>0&&(clearTimeout(e),clearTimeout(t),clearTimeout(l))}}),[n,a]),r.createElement(ho,null,r.createElement(Im,w({style:{position:"fixed"},height:u,width:s,numberOfPieces:m,drawShape:Om?function(e){var t=Lm[this.shape];t&&e.fill(t)}:void 0},i)))},t.Confirmation=U,t.Container=K,t.ContentBlock=function(e){var t=e.children,n=e.flipped,l=e.images,r=e.imagesFlipped,a=e.className,i=e.noShadow,d=e.tagContent;return l.length>1?o.createElement(K,{className:[no["content-block"],a].filter(Boolean).join(" ")},o.createElement(wl,{alignItems:"center"},o.createElement("div",{className:[no["image-container"],n&&no.flipped].filter(Boolean).join(" ")},o.createElement(to,{images:l,flipped:r,noShadow:i,className:no["image-stack"]})),o.createElement(N,{col:12,lg:5,lgOffset:n?7:0},t))):o.createElement(Un,{alignItems:"center",wrap:"wrap",className:[no["content-block"],a].filter(Boolean).join(" ")},o.createElement("div",{className:[no["image-container"],n&&no.flipped,d&&no.withTag].filter(Boolean).join(" ")},o.createElement(Vn,w({},l[0],{className:[no["single-image"],i&&no["no-shadow"]].filter(Boolean).join(" ")})),d&&o.createElement("div",{className:no.tagContainer},o.createElement("div",{className:no.tag},d))),o.createElement(K,null,o.createElement(wl,null,o.createElement(N,{col:12,lg:5,lgOffset:n?7:0},t))))},t.DatePicker=function(e){var t=r.useRef(null),n=[$c.Calendar,e.className].filter(Boolean).join(" ");return r.createElement(Gc,w({customInput:r.createElement(_l,w({iconProps:{fontSize:"25px"},icon:"calendar",iconVariant:"alternate",onIconClick:function(){return t.current&&t.current.setOpen(!0)}},e.inputProps)),calendarClassName:n,ref:t},e))},t.Error=Z,t.Flex=Un,t.FloatingInfoBlock=Xt,t.H1=function(e){return o.createElement(Zt,w({size:"h1"},e))},t.H2=function(e){return o.createElement(Zt,w({size:"h2"},e))},t.H3=function(e){return o.createElement(Zt,w({size:"h3"},e))},t.H4=Jt,t.H5=en,t.H6=function(e){return o.createElement(Zt,w({size:"h6"},e))},t.HighlightedHeader=im,t.Icon=Gt,t.Image=Vn,t.ImageStack=to,t.Input=_l,t.Label=qn,t.Link=Tl,t.Loader=zl,t.Logo=_o,t.Menu=function(e){var t=e.className,n=e.menuItems,l=e.isActiveItem,a=e.renderItem,i=S(e,["className","menuItems","isActiveItem","renderItem"]),d=o.useRef(null),u=D(o.useState(!1),2),s=u[0],c=u[1],m=D(o.useState(!1),2),p=m[0],f=m[1],_=o.useCallback((function(){var e=d.current;if(e){var t=e.scrollLeft>1,n=e.scrollLeft0&&r.createElement(Gt,{name:"bullet",fontSize:"11px",className:Mm}),r.createElement(Gt,{name:"bell-small",fontSize:"18px",className:Tm})),s>0&&d&&r.createElement("div",{className:Sm},r.createElement("div",{className:Dm,onClick:function(){u(!1)}},r.createElement(Gt,{name:"close",fontSize:"12px"})),t&&r.createElement(en,{className:Em},t),r.createElement("div",{onMouseDown:function(e){return e.preventDefault()}},l)))},t.Pagination=function(e){var t=e.pages,n=e.page,l=e.onPageChange,r=e.PageButtonComponent,a=void 0===r?np:r,i=e.size,d=void 0===i?"small":i,u=e.className,s=$(tp.pagination,tp[d],u),c=function(e,t){return t<6?Array.from(Array(t).keys()):2===e?[0,1,2,"...",t-1]:e===t-3?[0,"...",t-3,t-2,t-1]:e>2&&e0,_=function(e){e!==n&&l(e)};return o.createElement("div",{className:s},o.createElement(a,{className:tp.pageButton,onClick:function(){m||_(n-1)},disabled:m||!f},o.createElement("span",null,o.createElement(Gt,{name:"arrow-left",fontSize:"100%"}))),c.map((function(e,t){return"string"===typeof e?o.createElement("div",{key:"".concat(e,"-").concat(t),className:tp.pageButton},o.createElement("span",null,e)):o.createElement(a,{key:e,className:$(tp.pageButton,e===n&&tp.active),onClick:function(){return _(e)}},o.createElement("span",null,e+1))})),o.createElement(a,{className:tp.pageButton,onClick:function(){p||_(n+1)},disabled:p||!f},o.createElement("span",null,o.createElement(Gt,{name:"arrow-right",fontSize:"100%"}))))},t.Paragraph=hl,t.Placeholder=Cm,t.ProgressBar=function(e){var t=e.className,n=e.progress,l=e.variant,o=void 0===l?"neutral":l,a=S(e,["className","progress","variant"]),i=[yo["progress-bar"],t].filter(Boolean).join(" "),d=[yo["progress-bar-progress"],yo["progress-bar-progress-".concat(o)]].filter(Boolean).join(" ");return r.createElement("div",w({className:i},a),r.createElement("div",{className:d,style:{width:"".concat(n,"%")}}))},t.ProgressTracker=Gm,t.Radio=function(e){var t=e.icon,n=void 0===t?"radio-unchecked":t,l=e.iconChecked,o=void 0===l?"radio-checked":l,a=e.customIcon,i=e.customIconChecked,d=e.customRadioIcon,u=e.customRadioIconChecked,s=S(e,["icon","iconChecked","customIcon","customIconChecked","customRadioIcon","customRadioIconChecked"]);return r.createElement(Jc,w({},s,{type:"radio",icon:n,iconChecked:o,customIcon:a||d,customIconChecked:i||u}))},t.RadioGroup=function(e){var t=e.children,n=e.name,l=e.variant,o=void 0===l?"default":l,a=e.iconVariant,i=e.iconVariantChecked,d=e.iconFontSize,u=e.value,s=e.onChange;return r.createElement("div",null,r.Children.map(t,(function(e){return r.isValidElement(e)?r.createElement("span",{className:em["".concat(o,"-wrapper")]},r.cloneElement(e,{name:n,variant:o,iconVariant:a,iconVariantChecked:i,iconFontSize:d,checked:u===e.props.value,onChange:function(){s(e.props.value)}})):null})))},t.RangeSlider=bl,t.Row=wl,t.Select=function(e){var t=e.className,n=e.children,l=e.label,o=e.id,a=e.style,i=e.error,d=S(e,["className","children","label","id","style","error"]),u=[lo.select,i&&lo.error,d.disabled&&lo.disabled].filter(Boolean).join(" ");return r.createElement(Un,{direction:"column",className:t,style:a},l&&r.createElement(qn,{htmlFor:o||""},l),r.createElement(Un,{alignItems:"center",className:u},r.createElement("select",w({id:o,className:lo["select-element"]},d),n),r.createElement(Gt,{className:lo["select-arrow"],name:"arrow-right",fontSize:"16px"})))},t.Span=gl,t.Table=nm,t.Tabs=rm,t.Text=V,t.TextArea=kl,t.Toggle=Fl,t.Wizard=function(e){var t=e.steps,n=e.currentStepIndex,l=e.title,o=e.subtitle,a=e.children,i=e.backButtonLabel,d=e.onBackButtonClick,u=e.mainControlsComponent;return r.createElement(r.Fragment,null,r.createElement(Gm,{steps:t,currentStepIndex:n}),r.createElement(R,{withShadow:!0,small:!0,className:Qm},r.createElement("div",{className:Km},r.createElement(V,{as:"div",fontSize:"h4"},l),o&&r.createElement("div",null,o)),a,r.createElement("div",{className:$m},i&&d&&r.createElement(ep,{buttonLabel:i,onClick:d}),u&&r.createElement("div",{className:Zm},u()))),i&&d&&r.createElement("div",{className:Jm},r.createElement(ep,{buttonLabel:i,onClick:d})))},t.registerLocale=function(e,t){var n=window;n.__localeData__||(n.__localeData__={}),n.__localeData__[e]=t},t.setDefaultLocale=function(e){window.__localeId__=e}}}]); \ No newline at end of file +(window.webpackJsonp_N_E=window.webpackJsonp_N_E||[]).push([[4],{jaOS:function(e,t,n){"use strict";function l(e){return e&&"object"===typeof e&&"default"in e?e.default:e}Object.defineProperty(t,"__esModule",{value:!0});var o=n("q1tI"),r=l(o),a=n("i8i4"),i=l(a),d=l(n("Qetd")),u=l(n("9/5/")),s=l(n("wrOu")),c=l(n("8OQS")),m=l(n("pVnL")),p=l(n("PJYZ")),f=l(n("VbXa")),_=l(n("lSNA")),h=l(n("RLeF"));function g(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function x(e,t){for(var n=0;n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function P(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function M(e,t){return!t||"object"!==typeof t&&"function"!==typeof t?P(e):t}function T(e){var t=function(){if("undefined"===typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"===typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(dn){return!1}}();return function(){var n,l=F(e);if(t){var o=F(this).constructor;n=Reflect.construct(l,arguments,o)}else n=l.apply(this,arguments);return M(this,n)}}function D(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if("undefined"===typeof Symbol||!(Symbol.iterator in Object(e)))return;var n=[],l=!0,o=!1,r=void 0;try{for(var a,i=e[Symbol.iterator]();!(l=(a=i.next()).done)&&(n.push(a.value),!t||n.length!==t);l=!0);}catch(d){o=!0,r=d}finally{try{l||null==i.return||i.return()}finally{if(o)throw r}}return n}(e,t)||function(e,t){if(!e)return;if("string"===typeof e)return z(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return z(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function z(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,l=new Array(t);n=0?l=setTimeout(d,t-u):(l=null,n||(i=e.apply(r,o),l||(r=null,o=null)))};return function(){r=this,o=arguments,a=+new Date;var u=n&&!l;return l||(l=setTimeout(d,t)),u&&(i=e.apply(r,o),r=null,o=null),i}}}));nn(On);var Rn=ln((function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,n){var l,o;return t||(t=250),function(){var r=n||this,a=+new Date,i=arguments;l&&a=0&&F-E[0]<=f&&F+y+E[1]>=0}(e,n):function(e){var t=o.default.findDOMNode(e);if(!(t.offsetWidth||t.offsetHeight||t.getClientRects().length))return!1;var n=void 0,l=void 0;try{var r=t.getBoundingClientRect();n=r.top,l=r.height}catch(dn){n=_,l=x}var a=window.innerHeight||document.documentElement.clientHeight,i=Array.isArray(e.props.offset)?e.props.offset:[e.props.offset,e.props.offset];return n-i[0]<=a&&n+l+i[1]>=0}(e))?e.visible||(e.props.once&&w.push(e),e.visible=!0,e.forceUpdate()):e.props.once&&e.visible||(e.visible=!1,e.props.unmountIfInvisible&&e.forceUpdate())}},E=function(){w.forEach((function(e){var t=v.indexOf(e);-1!==t&&v.splice(t,1)})),w=[]},S=function(){for(var e=0;e0&&void 0!==arguments[0]?arguments[0]:{};return function(t){return function(o){function r(){m(this,r);var e=p(this,(r.__proto__||Object.getPrototypeOf(r)).call(this));return e.displayName="LazyLoad"+D(t),e}return f(r,o),n(r,[{key:"render",value:function(){return l.default.createElement(T,e,l.default.createElement(t,this.props))}}]),r}(r.Component)}},t.default=T,t.forceCheck=S,t.forceVisible=function(){for(var e=0;e=0&&0===t[e];)e--;return-1===e?null:e}(o))?[null,null]:[o,t[o]-1]:[o,r-1]:0===t||0===r?[null,null]:null===r?[null,t-1]:[null,r-1]},isLast:function(e){return null===l(e)[1]}}},Zn=ln((function(e,t){Object.defineProperty(t,"__esModule",{value:!0});var n=function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],l=!0,o=!1,r=void 0;try{for(var a,i=e[Symbol.iterator]();!(l=(a=i.next()).done)&&(n.push(a.value),!t||n.length!==t);l=!0);}catch(d){o=!0,r=d}finally{try{!l&&i.return&&i.return()}finally{if(o)throw r}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")};function l(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t1?t-1:0),o=1;o2&&void 0!==arguments[2]?arguments[2]:[];if(e===t)return!1;var o=Object.keys(e),r=Object.keys(t);if(o.length!==r.length)return!0;var a={},i=void 0,d=void 0;for(i=0,d=l.length;i=0||Object.prototype.hasOwnProperty.call(e,l)&&(n[l]=e[l]);return n}(e,["isHighlighted","item","renderItem","renderItemData"]);return delete i.sectionIndex,delete i.itemIndex,"function"===typeof i.onMouseEnter&&(i.onMouseEnter=this.onMouseEnter),"function"===typeof i.onMouseLeave&&(i.onMouseLeave=this.onMouseLeave),"function"===typeof i.onMouseDown&&(i.onMouseDown=this.onMouseDown),"function"===typeof i.onClick&&(i.onClick=this.onClick),o.default.createElement("li",n({role:"option"},i,{ref:this.storeItemReference}),r(l,n({isHighlighted:t},a)))}}]),t}(r.Component);c.propTypes={sectionIndex:a.default.number,isHighlighted:a.default.bool.isRequired,itemIndex:a.default.number.isRequired,item:a.default.any.isRequired,renderItem:a.default.func.isRequired,renderItemData:a.default.object.isRequired,onMouseEnter:a.default.func,onMouseLeave:a.default.func,onMouseDown:a.default.func,onClick:a.default.func},t.default=c}));nn(tl);var nl=ln((function(e,t){Object.defineProperty(t,"__esModule",{value:!0});var n=Object.assign||function(e){for(var t=1;tl+t.offsetHeight&&(l=n+e.offsetHeight-t.offsetHeight),l!==t.scrollTop&&(t.scrollTop=l)}}},{key:"render",value:function(){var e=this.theme,t=this.props,l=t.id,o=t.multiSection,r=t.renderInputComponent,i=t.renderItemsContainer,d=t.highlightedSectionIndex,u=t.highlightedItemIndex,s=this.state.isInputFocused,c=o?this.renderSections():this.renderItems(),m=null!==c,p=this.getItemId(d,u),f="react-autowhatever-"+l,_=n({role:"combobox","aria-haspopup":"listbox","aria-owns":f,"aria-expanded":m},e("react-autowhatever-"+l+"-container","container",m&&"containerOpen"),this.props.containerProps),h=r(n({type:"text",value:"",autoComplete:"off","aria-autocomplete":"list","aria-controls":f,"aria-activedescendant":p},e("react-autowhatever-"+l+"-input","input",m&&"inputOpen",s&&"inputFocused"),this.props.inputProps,{onFocus:this.onFocus,onBlur:this.onBlur,onKeyDown:this.props.inputProps.onKeyDown&&this.onKeyDown,ref:this.storeInputReference})),g=i({containerProps:n({id:f,role:"listbox"},e("react-autowhatever-"+l+"-items-container","itemsContainer",m&&"itemsContainerOpen"),{ref:this.storeItemsContainerReference}),children:c});return a.default.createElement("div",_,h,g)}}]),t}(r.Component);f.propTypes={id:i.default.string,multiSection:i.default.bool,renderInputComponent:i.default.func,renderItemsContainer:i.default.func,items:i.default.array.isRequired,renderItem:i.default.func,renderItemData:i.default.object,renderSectionTitle:i.default.func,getSectionItems:i.default.func,containerProps:i.default.object,inputProps:i.default.object,itemProps:i.default.oneOfType([i.default.object,i.default.func]),highlightedSectionIndex:i.default.number,highlightedItemIndex:i.default.number,theme:i.default.oneOfType([i.default.object,i.default.array])},f.defaultProps={id:"1",multiSection:!1,renderInputComponent:function(e){return a.default.createElement("input",e)},renderItemsContainer:function(e){var t=e.containerProps,n=e.children;return a.default.createElement("div",t,n)},renderItem:function(){throw new Error("`renderItem` must be provided")},renderItemData:p,renderSectionTitle:function(){throw new Error("`renderSectionTitle` must be provided")},getSectionItems:function(){throw new Error("`getSectionItems` must be provided")},containerProps:p,inputProps:p,itemProps:p,highlightedSectionIndex:null,highlightedItemIndex:null,theme:{container:"react-autowhatever__container",containerOpen:"react-autowhatever__container--open",input:"react-autowhatever__input",inputOpen:"react-autowhatever__input--open",inputFocused:"react-autowhatever__input--focused",itemsContainer:"react-autowhatever__items-container",itemsContainerOpen:"react-autowhatever__items-container--open",itemsList:"react-autowhatever__items-list",item:"react-autowhatever__item",itemFirst:"react-autowhatever__item--first",itemHighlighted:"react-autowhatever__item--highlighted",sectionContainer:"react-autowhatever__section-container",sectionContainerFirst:"react-autowhatever__section-container--first",sectionTitle:"react-autowhatever__section-title"}},t.default=f}));nn(ll);var ol=ll.default,rl=ln((function(e,t){Object.defineProperty(t,"__esModule",{value:!0});t.defaultTheme={container:"react-autosuggest__container",containerOpen:"react-autosuggest__container--open",input:"react-autosuggest__input",inputOpen:"react-autosuggest__input--open",inputFocused:"react-autosuggest__input--focused",suggestionsContainer:"react-autosuggest__suggestions-container",suggestionsContainerOpen:"react-autosuggest__suggestions-container--open",suggestionsList:"react-autosuggest__suggestions-list",suggestion:"react-autosuggest__suggestion",suggestionFirst:"react-autosuggest__suggestion--first",suggestionHighlighted:"react-autosuggest__suggestion--highlighted",sectionContainer:"react-autosuggest__section-container",sectionContainerFirst:"react-autosuggest__section-container--first",sectionTitle:"react-autosuggest__section-title"},t.mapToAutowhateverTheme=function(e){var t={};for(var n in e)switch(n){case"suggestionsContainer":t.itemsContainer=e[n];break;case"suggestionsContainerOpen":t.itemsContainerOpen=e[n];break;case"suggestion":t.item=e[n];break;case"suggestionFirst":t.itemFirst=e[n];break;case"suggestionHighlighted":t.itemHighlighted=e[n];break;case"suggestionsList":t.itemsList=e[n];break;default:t[n]=e[n]}return t}}));nn(rl);rl.defaultTheme,rl.mapToAutowhateverTheme;var al=ln((function(e,t){Object.defineProperty(t,"__esModule",{value:!0});var n=Object.assign||function(e){for(var t=1;t0&&!1===this.justPressedUpDown&&!1===this.justMouseEntered&&this.highlightFirstSuggestion():this.willRenderSuggestions(e)?this.state.isCollapsed&&!this.justSelectedSuggestion&&this.revealSuggestions():this.resetHighlightedSuggestion()}},{key:"componentDidUpdate",value:function(e,t){var n=this.props,l=n.suggestions,o=n.onSuggestionHighlighted,r=n.highlightFirstSuggestion;if(!(0,i.default)(l,e.suggestions)&&l.length>0&&r)this.highlightFirstSuggestion();else if(o){var a=this.getHighlightedSuggestion();a!=t.highlightedSuggestion&&o({suggestion:a})}}},{key:"componentWillUnmount",value:function(){document.removeEventListener("mousedown",this.onDocumentMouseDown),document.removeEventListener("mouseup",this.onDocumentMouseUp)}},{key:"updateHighlightedSuggestion",value:function(e,t,n){var l=this;this.setState((function(o){var r=o.valueBeforeUpDown;return null===t?r=null:null===r&&"undefined"!==typeof n&&(r=n),{highlightedSectionIndex:e,highlightedSuggestionIndex:t,highlightedSuggestion:null===t?null:l.getSuggestion(e,t),valueBeforeUpDown:r}}))}},{key:"resetHighlightedSuggestion",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.setState((function(t){var n=t.valueBeforeUpDown;return{highlightedSectionIndex:null,highlightedSuggestionIndex:null,highlightedSuggestion:null,valueBeforeUpDown:e?null:n}}))}},{key:"revealSuggestions",value:function(){this.setState({isCollapsed:!1})}},{key:"closeSuggestions",value:function(){this.setState({highlightedSectionIndex:null,highlightedSuggestionIndex:null,highlightedSuggestion:null,valueBeforeUpDown:null,isCollapsed:!0})}},{key:"getSuggestion",value:function(e,t){var n=this.props,l=n.suggestions,o=n.multiSection,r=n.getSectionSuggestions;return o?r(l[e])[t]:l[t]}},{key:"getHighlightedSuggestion",value:function(){var e=this.state,t=e.highlightedSectionIndex,n=e.highlightedSuggestionIndex;return null===n?null:this.getSuggestion(t,n)}},{key:"getSuggestionValueByIndex",value:function(e,t){return(0,this.props.getSuggestionValue)(this.getSuggestion(e,t))}},{key:"getSuggestionIndices",value:function(e){var t=e.getAttribute("data-section-index"),n=e.getAttribute("data-suggestion-index");return{sectionIndex:"string"===typeof t?parseInt(t,10):null,suggestionIndex:parseInt(n,10)}}},{key:"findSuggestionElement",value:function(e){var t=e;do{if(null!==t.getAttribute("data-suggestion-index"))return t;t=t.parentNode}while(null!==t);throw console.error("Clicked element:",e),new Error("Couldn't find suggestion element")}},{key:"maybeCallOnChange",value:function(e,t,n){var l=this.props.inputProps,o=l.value,r=l.onChange;t!==o&&r(e,{newValue:t,method:n})}},{key:"willRenderSuggestions",value:function(e){var t=e.suggestions,n=e.inputProps,l=e.shouldRenderSuggestions,o=n.value;return t.length>0&&l(o)}},{key:"getQuery",value:function(){var e=this.props.inputProps.value,t=this.state.valueBeforeUpDown;return(null===t?e:t).trim()}},{key:"render",value:function(){var e=this,t=this.props,l=t.suggestions,r=t.renderInputComponent,a=t.onSuggestionsFetchRequested,i=t.renderSuggestion,u=t.inputProps,s=t.multiSection,m=t.renderSectionTitle,p=t.id,f=t.getSectionSuggestions,_=t.theme,h=t.getSuggestionValue,g=t.alwaysRenderSuggestions,x=t.highlightFirstSuggestion,b=this.state,v=b.isFocused,w=b.isCollapsed,y=b.highlightedSectionIndex,k=b.highlightedSuggestionIndex,C=b.valueBeforeUpDown,F=g?c:this.props.shouldRenderSuggestions,E=u.value,S=u.onFocus,P=u.onKeyDown,M=this.willRenderSuggestions(this.props),T=g||v&&!w&&M,D=T?l:[],z=n({},u,{onFocus:function(t){if(!e.justSelectedSuggestion&&!e.justClickedOnSuggestionsContainer){var n=F(E);e.setState({isFocused:!0,isCollapsed:!n}),S&&S(t),n&&a({value:E,reason:"input-focused"})}},onBlur:function(t){e.justClickedOnSuggestionsContainer?e.input.focus():(e.blurEvent=t,e.justSelectedSuggestion||(e.onBlur(),e.onSuggestionsClearRequested()))},onChange:function(t){var l=t.target.value,o=F(l);e.maybeCallOnChange(t,l,"type"),e.suggestionsContainer&&(e.suggestionsContainer.scrollTop=0),e.setState(n({},x?{}:{highlightedSectionIndex:null,highlightedSuggestionIndex:null,highlightedSuggestion:null},{valueBeforeUpDown:null,isCollapsed:!o})),o?a({value:l,reason:"input-changed"}):e.onSuggestionsClearRequested()},onKeyDown:function(t,n){var o=t.keyCode;switch(o){case 40:case 38:if(w)F(E)&&(a({value:E,reason:"suggestions-revealed"}),e.revealSuggestions());else if(l.length>0){var r=n.newHighlightedSectionIndex,i=n.newHighlightedItemIndex,d=void 0;d=null===i?null===C?E:C:e.getSuggestionValueByIndex(r,i),e.updateHighlightedSuggestion(r,i,E),e.maybeCallOnChange(t,d,40===o?"down":"up")}t.preventDefault(),e.justPressedUpDown=!0,setTimeout((function(){e.justPressedUpDown=!1}));break;case 13:if(229===t.keyCode)break;var u=e.getHighlightedSuggestion();if(T&&!g&&e.closeSuggestions(),null!=u){var s=h(u);e.maybeCallOnChange(t,s,"enter"),e.onSuggestionSelected(t,{suggestion:u,suggestionValue:s,suggestionIndex:k,sectionIndex:y,method:"enter"}),e.justSelectedSuggestion=!0,setTimeout((function(){e.justSelectedSuggestion=!1}))}break;case 27:T&&t.preventDefault();var c=T&&!g;if(null===C){if(!c){e.maybeCallOnChange(t,"","escape"),F("")?a({value:"",reason:"escape-pressed"}):e.onSuggestionsClearRequested()}}else e.maybeCallOnChange(t,C,"escape");c?(e.onSuggestionsClearRequested(),e.closeSuggestions()):e.resetHighlightedSuggestion()}P&&P(t)}}),I={query:this.getQuery()};return o.default.createElement(d.default,{multiSection:s,items:D,renderInputComponent:r,renderItemsContainer:this.renderSuggestionsContainer,renderItem:i,renderItemData:I,renderSectionTitle:m,getSectionItems:f,highlightedSectionIndex:y,highlightedItemIndex:k,inputProps:z,itemProps:this.itemProps,theme:(0,rl.mapToAutowhateverTheme)(_),id:p,ref:this.storeAutowhateverRef})}}]),t}(r.Component);m.propTypes={suggestions:a.default.array.isRequired,onSuggestionsFetchRequested:function(e,t){var n=e[t];if("function"!==typeof n)throw new Error("'onSuggestionsFetchRequested' must be implemented. See: https://github.com/moroshko/react-autosuggest#onSuggestionsFetchRequestedProp")},onSuggestionsClearRequested:function(e,t){var n=e[t];if(!1===e.alwaysRenderSuggestions&&"function"!==typeof n)throw new Error("'onSuggestionsClearRequested' must be implemented. See: https://github.com/moroshko/react-autosuggest#onSuggestionsClearRequestedProp")},onSuggestionSelected:a.default.func,onSuggestionHighlighted:a.default.func,renderInputComponent:a.default.func,renderSuggestionsContainer:a.default.func,getSuggestionValue:a.default.func.isRequired,renderSuggestion:a.default.func.isRequired,inputProps:function(e,t){var n=e[t];if(!n.hasOwnProperty("value"))throw new Error("'inputProps' must have 'value'.");if(!n.hasOwnProperty("onChange"))throw new Error("'inputProps' must have 'onChange'.")},shouldRenderSuggestions:a.default.func,alwaysRenderSuggestions:a.default.bool,multiSection:a.default.bool,renderSectionTitle:function(e,t){var n=e[t];if(!0===e.multiSection&&"function"!==typeof n)throw new Error("'renderSectionTitle' must be implemented. See: https://github.com/moroshko/react-autosuggest#renderSectionTitleProp")},getSectionSuggestions:function(e,t){var n=e[t];if(!0===e.multiSection&&"function"!==typeof n)throw new Error("'getSectionSuggestions' must be implemented. See: https://github.com/moroshko/react-autosuggest#getSectionSuggestionsProp")},focusInputOnSuggestionClick:a.default.bool,highlightFirstSuggestion:a.default.bool,theme:a.default.object,id:a.default.string},m.defaultProps={renderSuggestionsContainer:function(e){var t=e.containerProps,n=e.children;return o.default.createElement("div",t,n)},shouldRenderSuggestions:function(e){return e.trim().length>0},alwaysRenderSuggestions:!1,multiSection:!1,focusInputOnSuggestionClick:!0,highlightFirstSuggestion:!1,theme:rl.defaultTheme,id:"1"};var p=function(){var e=this;this.onDocumentMouseDown=function(t){e.justClickedOnSuggestionsContainer=!1;for(var n=t.detail&&t.detail.target||t.target;null!==n&&n!==document;){if(null!==n.getAttribute("data-suggestion-index"))return;if(n===e.suggestionsContainer)return void(e.justClickedOnSuggestionsContainer=!0);n=n.parentNode}},this.storeAutowhateverRef=function(t){null!==t&&(e.autowhatever=t)},this.onSuggestionMouseEnter=function(t,n){var l=n.sectionIndex,o=n.itemIndex;e.updateHighlightedSuggestion(l,o),t.target===e.pressedSuggestion&&(e.justSelectedSuggestion=!0),e.justMouseEntered=!0,setTimeout((function(){e.justMouseEntered=!1}))},this.highlightFirstSuggestion=function(){e.updateHighlightedSuggestion(e.props.multiSection?0:null,0)},this.onDocumentMouseUp=function(){e.pressedSuggestion&&!e.justSelectedSuggestion&&e.input.focus(),e.pressedSuggestion=null},this.onSuggestionMouseDown=function(t){e.justSelectedSuggestion||(e.justSelectedSuggestion=!0,e.pressedSuggestion=t.target)},this.onSuggestionsClearRequested=function(){var t=e.props.onSuggestionsClearRequested;t&&t()},this.onSuggestionSelected=function(t,n){var l=e.props,o=l.alwaysRenderSuggestions,r=l.onSuggestionSelected,a=l.onSuggestionsFetchRequested;r&&r(t,n),o?a({value:n.suggestionValue,reason:"suggestion-selected"}):e.onSuggestionsClearRequested(),e.resetHighlightedSuggestion()},this.onSuggestionClick=function(t){var n=e.props,l=n.alwaysRenderSuggestions,o=n.focusInputOnSuggestionClick,r=e.getSuggestionIndices(e.findSuggestionElement(t.target)),a=r.sectionIndex,i=r.suggestionIndex,d=e.getSuggestion(a,i),u=e.props.getSuggestionValue(d);e.maybeCallOnChange(t,u,"click"),e.onSuggestionSelected(t,{suggestion:d,suggestionValue:u,suggestionIndex:i,sectionIndex:a,method:"click"}),l||e.closeSuggestions(),!0===o?e.input.focus():e.onBlur(),setTimeout((function(){e.justSelectedSuggestion=!1}))},this.onBlur=function(){var t=e.props,n=t.inputProps,l=t.shouldRenderSuggestions,o=n.value,r=n.onBlur,a=e.getHighlightedSuggestion(),i=l(o);e.setState({isFocused:!1,highlightedSectionIndex:null,highlightedSuggestionIndex:null,highlightedSuggestion:null,valueBeforeUpDown:null,isCollapsed:!i}),r&&r(e.blurEvent,{highlightedSuggestion:a})},this.onSuggestionMouseLeave=function(t){e.resetHighlightedSuggestion(!1),e.justSelectedSuggestion&&t.target===e.pressedSuggestion&&(e.justSelectedSuggestion=!1)},this.onSuggestionTouchStart=function(){e.justSelectedSuggestion=!0},this.onSuggestionTouchMove=function(){e.justSelectedSuggestion=!1,e.pressedSuggestion=null,e.input.focus()},this.itemProps=function(t){return{"data-section-index":t.sectionIndex,"data-suggestion-index":t.itemIndex,onMouseEnter:e.onSuggestionMouseEnter,onMouseLeave:e.onSuggestionMouseLeave,onMouseDown:e.onSuggestionMouseDown,onTouchStart:e.onSuggestionTouchStart,onTouchMove:e.onSuggestionTouchMove,onClick:e.onSuggestionClick}},this.renderSuggestionsContainer=function(t){var n=t.containerProps,l=t.children;return(0,e.props.renderSuggestionsContainer)({containerProps:n,children:l,query:e.getQuery()})}};t.default=m}));nn(al);var il=al.default,dl="AutoSuggestInput-module__container",ul="AutoSuggestInput-module__suggestionsContainer",sl="AutoSuggestInput-module__suggestionsList",cl="AutoSuggestInput-module__suggestion",ml="AutoSuggestInput-module__suggestionHighlighted";function pl(e,t){var n=function(e,t){if(!e||!t)return[];for(var n,l=new RegExp(e,"gi"),o=[];n=l.exec(t);){var r=n.index,a=l.lastIndex;a>r&&o.push({start:r,end:a}),n.index===l.lastIndex&&l.lastIndex++}return o}(e,t);if(0===n.length)return t;var l=0;return n.map((function(e,o){var a=e.start,i=e.end,d=r.createElement(r.Fragment,null,t.slice(l,a),r.createElement("strong",null,t.slice(a,i)),o===n.length-1&&t.slice(i));return l=i,d}))}var fl=o.forwardRef((function(e,t){var n=e.suggestions,l=e.onSuggestionSelected,a=e.onSuggestionHighlighted,i=e.value,d=void 0===i?"":i,u=e.onChange,s=void 0===u?function(){}:u,c=S(e,["suggestions","onSuggestionSelected","onSuggestionHighlighted","value","onChange"]);fl.displayName="AutoSuggestInput";var m=D(o.useState(n),2),p=m[0],f=m[1];return r.createElement(il,{ref:t,suggestions:p,onSuggestionsFetchRequested:function(e){var t=e.value.toLowerCase();f(n.filter((function(e){return e.value.toString().toLowerCase().includes(t)})))},onSuggestionsClearRequested:function(){return f([])},getSuggestionValue:function(e){return e.value},renderSuggestion:function(e,t){return pl(t.query,e.value)},inputProps:{onChange:s,value:d.toString()},renderInputComponent:function(e){return r.createElement(Kn,w({},c,e))},onSuggestionSelected:"function"===typeof l?function(e,t){var n=t.suggestion;e.stopPropagation(),e.preventDefault(),l(n)}:void 0,onSuggestionHighlighted:"function"===typeof a?function(e){return a(e.suggestion.value)}:void 0,shouldRenderSuggestions:function(){return!0},theme:{container:dl,suggestionsContainer:ul,suggestionsList:sl,suggestion:cl,suggestionHighlighted:ml}})})),_l=o.forwardRef((function(e,t){_l.displayName="Input";var n=e.id,l=e.label,o=e.className,a=e.hideErrorText,i=e.error,d=e.touched,u=e.onChange,s=e.value,c=e.suggestions,m=e.onSuggestionSelected,p=e.onSuggestionHighlighted,f=S(e,["id","label","className","hideErrorText","error","touched","onChange","value","suggestions","onSuggestionSelected","onSuggestionHighlighted"]),_=[o,Gn.wrapper].filter(Boolean).join(" "),h=n||l&&"".concat(l.toString().split(" ").join("-"),"-input")||"";return r.createElement(Un,{className:_,direction:"column"},l&&r.createElement(qn,{htmlFor:h},l),c?r.createElement(fl,w({ref:t,error:i,id:n,touched:d,onChange:u,value:s,suggestions:c,onSuggestionSelected:m,onSuggestionHighlighted:p},f)):r.createElement(Kn,w({ref:t,error:i,id:n,touched:d,onChange:u,value:s},f)),i&&d&&!a&&r.createElement(Z,null,i))})),hl=function(e){C(n,e);var t=T(n);function n(){return g(this,n),t.apply(this,arguments)}return b(n,[{key:"render",value:function(){var e=this.props,t=e.children,n=e.as,l=S(e,["children","as"]);return o.createElement(V,w({as:n},l),t)}}]),n}(o.PureComponent);v(hl,"defaultProps",{as:"p",fontSize:"body"});var gl=function(e){C(n,e);var t=T(n);function n(){return g(this,n),t.apply(this,arguments)}return b(n,[{key:"render",value:function(){var e=this.props,t=e.children,n=e.as,l=S(e,["children","as"]);return o.createElement(V,w({as:n},l),t)}}]),n}(o.PureComponent);v(gl,"defaultProps",{as:"span",fontSize:"body"});var xl={"d-none":"RangeSlider-module__d-none","d-inline":"RangeSlider-module__d-inline","d-inline-block":"RangeSlider-module__d-inline-block","d-block":"RangeSlider-module__d-block","d-table":"RangeSlider-module__d-table","d-table-row":"RangeSlider-module__d-table-row","d-table-cell":"RangeSlider-module__d-table-cell","d-flex":"RangeSlider-module__d-flex","d-inline-flex":"RangeSlider-module__d-inline-flex","d-sm-none":"RangeSlider-module__d-sm-none","d-sm-inline":"RangeSlider-module__d-sm-inline","d-sm-inline-block":"RangeSlider-module__d-sm-inline-block","d-sm-block":"RangeSlider-module__d-sm-block","d-sm-table":"RangeSlider-module__d-sm-table","d-sm-table-row":"RangeSlider-module__d-sm-table-row","d-sm-table-cell":"RangeSlider-module__d-sm-table-cell","d-sm-flex":"RangeSlider-module__d-sm-flex","d-sm-inline-flex":"RangeSlider-module__d-sm-inline-flex","d-md-none":"RangeSlider-module__d-md-none","d-md-inline":"RangeSlider-module__d-md-inline","d-md-inline-block":"RangeSlider-module__d-md-inline-block","d-md-block":"RangeSlider-module__d-md-block","d-md-table":"RangeSlider-module__d-md-table","d-md-table-row":"RangeSlider-module__d-md-table-row","d-md-table-cell":"RangeSlider-module__d-md-table-cell","d-md-flex":"RangeSlider-module__d-md-flex","d-md-inline-flex":"RangeSlider-module__d-md-inline-flex","d-lg-none":"RangeSlider-module__d-lg-none","d-lg-inline":"RangeSlider-module__d-lg-inline","d-lg-inline-block":"RangeSlider-module__d-lg-inline-block","d-lg-block":"RangeSlider-module__d-lg-block","d-lg-table":"RangeSlider-module__d-lg-table","d-lg-table-row":"RangeSlider-module__d-lg-table-row","d-lg-table-cell":"RangeSlider-module__d-lg-table-cell","d-lg-flex":"RangeSlider-module__d-lg-flex","d-lg-inline-flex":"RangeSlider-module__d-lg-inline-flex","d-xl-none":"RangeSlider-module__d-xl-none","d-xl-inline":"RangeSlider-module__d-xl-inline","d-xl-inline-block":"RangeSlider-module__d-xl-inline-block","d-xl-block":"RangeSlider-module__d-xl-block","d-xl-table":"RangeSlider-module__d-xl-table","d-xl-table-row":"RangeSlider-module__d-xl-table-row","d-xl-table-cell":"RangeSlider-module__d-xl-table-cell","d-xl-flex":"RangeSlider-module__d-xl-flex","d-xl-inline-flex":"RangeSlider-module__d-xl-inline-flex","d-print-none":"RangeSlider-module__d-print-none","d-print-inline":"RangeSlider-module__d-print-inline","d-print-inline-block":"RangeSlider-module__d-print-inline-block","d-print-block":"RangeSlider-module__d-print-block","d-print-table":"RangeSlider-module__d-print-table","d-print-table-row":"RangeSlider-module__d-print-table-row","d-print-table-cell":"RangeSlider-module__d-print-table-cell","d-print-flex":"RangeSlider-module__d-print-flex","d-print-inline-flex":"RangeSlider-module__d-print-inline-flex",slider:"RangeSlider-module__slider"},bl=function(e){C(n,e);var t=T(n);function n(){return g(this,n),t.apply(this,arguments)}return b(n,[{key:"render",value:function(){var e=this.props,t=e.className,n=S(e,["className"]);return o.createElement("input",w({},n,{type:"range",className:t?[xl.slider,t].join(" "):xl.slider}))}}]),n}(o.PureComponent),vl={row:"Row-module__row","no-gutters":"Row-module__no-gutters",col:"Row-module__col","justify-content-start":"Row-module__justify-content-start","justify-content-end":"Row-module__justify-content-end","justify-content-center":"Row-module__justify-content-center","justify-content-between":"Row-module__justify-content-between","justify-content-around":"Row-module__justify-content-around","justify-content-evenly":"Row-module__justify-content-evenly","align-items-start":"Row-module__align-items-start","align-items-end":"Row-module__align-items-end","align-items-center":"Row-module__align-items-center","align-items-baseline":"Row-module__align-items-baseline","align-items-stretch":"Row-module__align-items-stretch","align-content-start":"Row-module__align-content-start","align-content-end":"Row-module__align-content-end","align-content-center":"Row-module__align-content-center","align-content-between":"Row-module__align-content-between","align-content-around":"Row-module__align-content-around","align-content-stretch":"Row-module__align-content-stretch","justify-content-sm-start":"Row-module__justify-content-sm-start","justify-content-sm-end":"Row-module__justify-content-sm-end","justify-content-sm-center":"Row-module__justify-content-sm-center","justify-content-sm-between":"Row-module__justify-content-sm-between","justify-content-sm-around":"Row-module__justify-content-sm-around","justify-content-sm-evenly":"Row-module__justify-content-sm-evenly","align-items-sm-start":"Row-module__align-items-sm-start","align-items-sm-end":"Row-module__align-items-sm-end","align-items-sm-center":"Row-module__align-items-sm-center","align-items-sm-baseline":"Row-module__align-items-sm-baseline","align-items-sm-stretch":"Row-module__align-items-sm-stretch","align-content-sm-start":"Row-module__align-content-sm-start","align-content-sm-end":"Row-module__align-content-sm-end","align-content-sm-center":"Row-module__align-content-sm-center","align-content-sm-between":"Row-module__align-content-sm-between","align-content-sm-around":"Row-module__align-content-sm-around","align-content-sm-stretch":"Row-module__align-content-sm-stretch","justify-content-md-start":"Row-module__justify-content-md-start","justify-content-md-end":"Row-module__justify-content-md-end","justify-content-md-center":"Row-module__justify-content-md-center","justify-content-md-between":"Row-module__justify-content-md-between","justify-content-md-around":"Row-module__justify-content-md-around","justify-content-md-evenly":"Row-module__justify-content-md-evenly","align-items-md-start":"Row-module__align-items-md-start","align-items-md-end":"Row-module__align-items-md-end","align-items-md-center":"Row-module__align-items-md-center","align-items-md-baseline":"Row-module__align-items-md-baseline","align-items-md-stretch":"Row-module__align-items-md-stretch","align-content-md-start":"Row-module__align-content-md-start","align-content-md-end":"Row-module__align-content-md-end","align-content-md-center":"Row-module__align-content-md-center","align-content-md-between":"Row-module__align-content-md-between","align-content-md-around":"Row-module__align-content-md-around","align-content-md-stretch":"Row-module__align-content-md-stretch","justify-content-lg-start":"Row-module__justify-content-lg-start","justify-content-lg-end":"Row-module__justify-content-lg-end","justify-content-lg-center":"Row-module__justify-content-lg-center","justify-content-lg-between":"Row-module__justify-content-lg-between","justify-content-lg-around":"Row-module__justify-content-lg-around","justify-content-lg-evenly":"Row-module__justify-content-lg-evenly","align-items-lg-start":"Row-module__align-items-lg-start","align-items-lg-end":"Row-module__align-items-lg-end","align-items-lg-center":"Row-module__align-items-lg-center","align-items-lg-baseline":"Row-module__align-items-lg-baseline","align-items-lg-stretch":"Row-module__align-items-lg-stretch","align-content-lg-start":"Row-module__align-content-lg-start","align-content-lg-end":"Row-module__align-content-lg-end","align-content-lg-center":"Row-module__align-content-lg-center","align-content-lg-between":"Row-module__align-content-lg-between","align-content-lg-around":"Row-module__align-content-lg-around","align-content-lg-stretch":"Row-module__align-content-lg-stretch","justify-content-xl-start":"Row-module__justify-content-xl-start","justify-content-xl-end":"Row-module__justify-content-xl-end","justify-content-xl-center":"Row-module__justify-content-xl-center","justify-content-xl-between":"Row-module__justify-content-xl-between","justify-content-xl-around":"Row-module__justify-content-xl-around","justify-content-xl-evenly":"Row-module__justify-content-xl-evenly","align-items-xl-start":"Row-module__align-items-xl-start","align-items-xl-end":"Row-module__align-items-xl-end","align-items-xl-center":"Row-module__align-items-xl-center","align-items-xl-baseline":"Row-module__align-items-xl-baseline","align-items-xl-stretch":"Row-module__align-items-xl-stretch","align-content-xl-start":"Row-module__align-content-xl-start","align-content-xl-end":"Row-module__align-content-xl-end","align-content-xl-center":"Row-module__align-content-xl-center","align-content-xl-between":"Row-module__align-content-xl-between","align-content-xl-around":"Row-module__align-content-xl-around","align-content-xl-stretch":"Row-module__align-content-xl-stretch"},wl=function(e){C(n,e);var t=T(n);function n(){return g(this,n),t.apply(this,arguments)}return b(n,[{key:"render",value:function(){var e=this.props,t=e.className,n=e.children,l=e.alignItems,r=e.smAlignItems,a=e.mdAlignItems,i=e.lgAlignItems,d=e.xlAlignItems,u=e.justifyContent,s=e.smJustifyContent,c=e.mdJustifyContent,m=e.lgJustifyContent,p=e.xlJustifyContent,f=e.noGutters,_=S(e,["className","children","alignItems","smAlignItems","mdAlignItems","lgAlignItems","xlAlignItems","justifyContent","smJustifyContent","mdJustifyContent","lgJustifyContent","xlJustifyContent","noGutters"]);return o.createElement("div",w({className:[vl.row,l&&vl["align-items-".concat(l)],r&&vl["align-items-sm-".concat(r)],a&&vl["align-items-md-".concat(a)],i&&vl["align-items-lg-".concat(i)],d&&vl["align-items-xl-".concat(d)],u&&vl["justify-content-".concat(u)],s&&vl["justify-content-sm-".concat(s)],c&&vl["justify-content-md-".concat(c)],m&&vl["justify-content-lg-".concat(m)],p&&vl["justify-content-xl-".concat(p)],f&&vl["no-gutters"],t].filter(Boolean).join(" ")},_),n)}}]),n}(o.PureComponent),yl={"d-none":"TextArea-module__d-none","d-inline":"TextArea-module__d-inline","d-inline-block":"TextArea-module__d-inline-block","d-block":"TextArea-module__d-block","d-table":"TextArea-module__d-table","d-table-row":"TextArea-module__d-table-row","d-table-cell":"TextArea-module__d-table-cell","d-flex":"TextArea-module__d-flex","d-inline-flex":"TextArea-module__d-inline-flex","d-sm-none":"TextArea-module__d-sm-none","d-sm-inline":"TextArea-module__d-sm-inline","d-sm-inline-block":"TextArea-module__d-sm-inline-block","d-sm-block":"TextArea-module__d-sm-block","d-sm-table":"TextArea-module__d-sm-table","d-sm-table-row":"TextArea-module__d-sm-table-row","d-sm-table-cell":"TextArea-module__d-sm-table-cell","d-sm-flex":"TextArea-module__d-sm-flex","d-sm-inline-flex":"TextArea-module__d-sm-inline-flex","d-md-none":"TextArea-module__d-md-none","d-md-inline":"TextArea-module__d-md-inline","d-md-inline-block":"TextArea-module__d-md-inline-block","d-md-block":"TextArea-module__d-md-block","d-md-table":"TextArea-module__d-md-table","d-md-table-row":"TextArea-module__d-md-table-row","d-md-table-cell":"TextArea-module__d-md-table-cell","d-md-flex":"TextArea-module__d-md-flex","d-md-inline-flex":"TextArea-module__d-md-inline-flex","d-lg-none":"TextArea-module__d-lg-none","d-lg-inline":"TextArea-module__d-lg-inline","d-lg-inline-block":"TextArea-module__d-lg-inline-block","d-lg-block":"TextArea-module__d-lg-block","d-lg-table":"TextArea-module__d-lg-table","d-lg-table-row":"TextArea-module__d-lg-table-row","d-lg-table-cell":"TextArea-module__d-lg-table-cell","d-lg-flex":"TextArea-module__d-lg-flex","d-lg-inline-flex":"TextArea-module__d-lg-inline-flex","d-xl-none":"TextArea-module__d-xl-none","d-xl-inline":"TextArea-module__d-xl-inline","d-xl-inline-block":"TextArea-module__d-xl-inline-block","d-xl-block":"TextArea-module__d-xl-block","d-xl-table":"TextArea-module__d-xl-table","d-xl-table-row":"TextArea-module__d-xl-table-row","d-xl-table-cell":"TextArea-module__d-xl-table-cell","d-xl-flex":"TextArea-module__d-xl-flex","d-xl-inline-flex":"TextArea-module__d-xl-inline-flex","d-print-none":"TextArea-module__d-print-none","d-print-inline":"TextArea-module__d-print-inline","d-print-inline-block":"TextArea-module__d-print-inline-block","d-print-block":"TextArea-module__d-print-block","d-print-table":"TextArea-module__d-print-table","d-print-table-row":"TextArea-module__d-print-table-row","d-print-table-cell":"TextArea-module__d-print-table-cell","d-print-flex":"TextArea-module__d-print-flex","d-print-inline-flex":"TextArea-module__d-print-inline-flex","vdb-textarea-container":"TextArea-module__vdb-textarea-container","vdb-textarea":"TextArea-module__vdb-textarea","vdb-textarea-icon":"TextArea-module__vdb-textarea-icon","vdb-textarea-icon-focus":"TextArea-module__vdb-textarea-icon-focus"},kl=function(e){C(n,e);var t=T(n);function n(e){var l;return g(this,n),v(P(l=t.call(this,e)),"emitChangeDebounced",void 0),v(P(l),"state",{isFocused:!1}),v(P(l),"handleChange",(function(e){l.emitChangeDebounced(e.target.value),l.props.onChange&&l.props.onChange(e)})),v(P(l),"onTextAreaFocus",(function(){l.setState({isFocused:!0})})),v(P(l),"onTextAreaBlur",(function(){l.setState({isFocused:!1})})),l.emitChangeDebounced=u(l.emitChange,l.props.debounceTime||250),l}return b(n,[{key:"componentWillUnmount",value:function(){this.emitChangeDebounced.cancel()}},{key:"render",value:function(){var e=this.state.isFocused,t=this.props,n=t.className,l=(t.debounceTime,t.onDebouncedChange,t.icon),r=S(t,["className","debounceTime","onDebouncedChange","icon"]);return o.createElement("div",{className:["".concat(n||""),yl["vdb-textarea-container"]].join(" ")},o.createElement("textarea",w({className:yl["vdb-textarea"]},r,{onChange:this.handleChange,onFocus:this.onTextAreaFocus,onBlur:this.onTextAreaBlur})),l?o.createElement(Gt,{name:l,className:e?yl["vdb-textarea-icon-focus"]:yl["vdb-textarea-icon"],fontSize:"16"}):null)}},{key:"emitChange",value:function(e){this.props.onDebouncedChange&&this.props.onDebouncedChange(e)}}]),n}(o.PureComponent),Cl={"d-none":"Toggle-module__d-none","d-inline":"Toggle-module__d-inline","d-inline-block":"Toggle-module__d-inline-block","d-block":"Toggle-module__d-block","d-table":"Toggle-module__d-table","d-table-row":"Toggle-module__d-table-row","d-table-cell":"Toggle-module__d-table-cell","d-flex":"Toggle-module__d-flex","d-inline-flex":"Toggle-module__d-inline-flex","d-sm-none":"Toggle-module__d-sm-none","d-sm-inline":"Toggle-module__d-sm-inline","d-sm-inline-block":"Toggle-module__d-sm-inline-block","d-sm-block":"Toggle-module__d-sm-block","d-sm-table":"Toggle-module__d-sm-table","d-sm-table-row":"Toggle-module__d-sm-table-row","d-sm-table-cell":"Toggle-module__d-sm-table-cell","d-sm-flex":"Toggle-module__d-sm-flex","d-sm-inline-flex":"Toggle-module__d-sm-inline-flex","d-md-none":"Toggle-module__d-md-none","d-md-inline":"Toggle-module__d-md-inline","d-md-inline-block":"Toggle-module__d-md-inline-block","d-md-block":"Toggle-module__d-md-block","d-md-table":"Toggle-module__d-md-table","d-md-table-row":"Toggle-module__d-md-table-row","d-md-table-cell":"Toggle-module__d-md-table-cell","d-md-flex":"Toggle-module__d-md-flex","d-md-inline-flex":"Toggle-module__d-md-inline-flex","d-lg-none":"Toggle-module__d-lg-none","d-lg-inline":"Toggle-module__d-lg-inline","d-lg-inline-block":"Toggle-module__d-lg-inline-block","d-lg-block":"Toggle-module__d-lg-block","d-lg-table":"Toggle-module__d-lg-table","d-lg-table-row":"Toggle-module__d-lg-table-row","d-lg-table-cell":"Toggle-module__d-lg-table-cell","d-lg-flex":"Toggle-module__d-lg-flex","d-lg-inline-flex":"Toggle-module__d-lg-inline-flex","d-xl-none":"Toggle-module__d-xl-none","d-xl-inline":"Toggle-module__d-xl-inline","d-xl-inline-block":"Toggle-module__d-xl-inline-block","d-xl-block":"Toggle-module__d-xl-block","d-xl-table":"Toggle-module__d-xl-table","d-xl-table-row":"Toggle-module__d-xl-table-row","d-xl-table-cell":"Toggle-module__d-xl-table-cell","d-xl-flex":"Toggle-module__d-xl-flex","d-xl-inline-flex":"Toggle-module__d-xl-inline-flex","d-print-none":"Toggle-module__d-print-none","d-print-inline":"Toggle-module__d-print-inline","d-print-inline-block":"Toggle-module__d-print-inline-block","d-print-block":"Toggle-module__d-print-block","d-print-table":"Toggle-module__d-print-table","d-print-table-row":"Toggle-module__d-print-table-row","d-print-table-cell":"Toggle-module__d-print-table-cell","d-print-flex":"Toggle-module__d-print-flex","d-print-inline-flex":"Toggle-module__d-print-inline-flex",switch:"Toggle-module__switch","switch-input":"Toggle-module__switch-input","switch-wrapper":"Toggle-module__switch-wrapper","switch-label--on":"Toggle-module__switch-label--on","switch-toggle":"Toggle-module__switch-toggle","switch-label":"Toggle-module__switch-label","switch-label--off":"Toggle-module__switch-label--off","switch-icon":"Toggle-module__switch-icon","switch-icon-right":"Toggle-module__switch-icon-right",dark:"Toggle-module__dark",switchChecked:"Toggle-module__switchChecked"},Fl=function(e){C(n,e);var t=T(n);function n(e){var l;return g(this,n),(l=t.call(this,e)).state={checked:!!e.checked},l}return b(n,[{key:"handleChange",value:function(e){this.setState({checked:e}),"function"===typeof this.props.onChange&&this.props.onChange(e)}},{key:"render",value:function(){var e,t=this,n=this.props,l=n.name,r=n.customIcons,a=n.setCheckedByParent,i=n.theme,d=n.iconSize,u=S(n,["name","customIcons","setCheckedByParent","theme","iconSize"]),s=(a?this.props:this.state).checked,c=s?Cl.switchChecked:"";return e="dark"===i?s?1:0:2,o.createElement("div",{className:[Cl.switch,Cl[i],c].filter(Boolean).join(" ")},o.createElement("input",w({},u,{type:"checkbox",id:l,name:l,checked:s,className:Cl["switch-input"],onChange:function(e){return t.handleChange(e.target.checked)}})),o.createElement("label",{htmlFor:l,className:Cl["switch-wrapper"]},o.createElement("div",{className:Cl["switch-toggle"]}),o.createElement("div",{className:[Cl["switch-label"],Cl["switch-label--on"]].join(" ")},o.createElement(Gt,{className:Cl["switch-icon"],name:r&&r.left||"check",variant:e,fontSize:d}),r&&r.right&&o.createElement(Gt,{className:Cl["switch-icon-right"],name:r.right,variant:e,fontSize:d}))))}}]),n}(o.Component);v(Fl,"defaultProps",{theme:"light",iconSize:"11px"});var El={"d-none":"Pressable-module__d-none","d-inline":"Pressable-module__d-inline","d-inline-block":"Pressable-module__d-inline-block","d-block":"Pressable-module__d-block","d-table":"Pressable-module__d-table","d-table-row":"Pressable-module__d-table-row","d-table-cell":"Pressable-module__d-table-cell","d-flex":"Pressable-module__d-flex","d-inline-flex":"Pressable-module__d-inline-flex","d-sm-none":"Pressable-module__d-sm-none","d-sm-inline":"Pressable-module__d-sm-inline","d-sm-inline-block":"Pressable-module__d-sm-inline-block","d-sm-block":"Pressable-module__d-sm-block","d-sm-table":"Pressable-module__d-sm-table","d-sm-table-row":"Pressable-module__d-sm-table-row","d-sm-table-cell":"Pressable-module__d-sm-table-cell","d-sm-flex":"Pressable-module__d-sm-flex","d-sm-inline-flex":"Pressable-module__d-sm-inline-flex","d-md-none":"Pressable-module__d-md-none","d-md-inline":"Pressable-module__d-md-inline","d-md-inline-block":"Pressable-module__d-md-inline-block","d-md-block":"Pressable-module__d-md-block","d-md-table":"Pressable-module__d-md-table","d-md-table-row":"Pressable-module__d-md-table-row","d-md-table-cell":"Pressable-module__d-md-table-cell","d-md-flex":"Pressable-module__d-md-flex","d-md-inline-flex":"Pressable-module__d-md-inline-flex","d-lg-none":"Pressable-module__d-lg-none","d-lg-inline":"Pressable-module__d-lg-inline","d-lg-inline-block":"Pressable-module__d-lg-inline-block","d-lg-block":"Pressable-module__d-lg-block","d-lg-table":"Pressable-module__d-lg-table","d-lg-table-row":"Pressable-module__d-lg-table-row","d-lg-table-cell":"Pressable-module__d-lg-table-cell","d-lg-flex":"Pressable-module__d-lg-flex","d-lg-inline-flex":"Pressable-module__d-lg-inline-flex","d-xl-none":"Pressable-module__d-xl-none","d-xl-inline":"Pressable-module__d-xl-inline","d-xl-inline-block":"Pressable-module__d-xl-inline-block","d-xl-block":"Pressable-module__d-xl-block","d-xl-table":"Pressable-module__d-xl-table","d-xl-table-row":"Pressable-module__d-xl-table-row","d-xl-table-cell":"Pressable-module__d-xl-table-cell","d-xl-flex":"Pressable-module__d-xl-flex","d-xl-inline-flex":"Pressable-module__d-xl-inline-flex","d-print-none":"Pressable-module__d-print-none","d-print-inline":"Pressable-module__d-print-inline","d-print-inline-block":"Pressable-module__d-print-inline-block","d-print-block":"Pressable-module__d-print-block","d-print-table":"Pressable-module__d-print-table","d-print-table-row":"Pressable-module__d-print-table-row","d-print-table-cell":"Pressable-module__d-print-table-cell","d-print-flex":"Pressable-module__d-print-flex","d-print-inline-flex":"Pressable-module__d-print-inline-flex",button:"Pressable-module__button","button-speadIcon":"Pressable-module__button-speadIcon","button-primary":"Pressable-module__button-primary","icon-variant-1":"Pressable-module__icon-variant-1","icon-variant-2":"Pressable-module__icon-variant-2","icon-variant-3":"Pressable-module__icon-variant-3","icon-variant-4":"Pressable-module__icon-variant-4","button-alternate":"Pressable-module__button-alternate","button-outline":"Pressable-module__button-outline","button-red":"Pressable-module__button-red","button-start":"Pressable-module__button-start","button-icon":"Pressable-module__button-icon","button-small":"Pressable-module__button-small","button-end":"Pressable-module__button-end","button-xsmall":"Pressable-module__button-xsmall","button-icononly":"Pressable-module__button-icononly",text:"Pressable-module__text","text-with-icon":"Pressable-module__text-with-icon",white:"Pressable-module__white","charcoal-gray":"Pressable-module__charcoal-gray","warm-gray":"Pressable-module__warm-gray"},Sl=function(e,t,n){return!t&&o.createElement(o.Fragment,null,o.createElement(Gt,{name:e,className:[El["button-icon"],El["icon-variant-1"]].join(" "),variant:1,fontSize:n}),o.createElement(Gt,{name:e,className:[El["button-icon"],El["icon-variant-2"]].join(" "),variant:2,fontSize:n}),o.createElement(Gt,{name:e,className:[El["button-icon"],El["icon-variant-3"]].join(" "),variant:3,fontSize:n}),o.createElement(Gt,{name:e,className:[El["button-icon"],El["icon-variant-4"]].join(" "),variant:4,fontSize:n}))},Pl=function(e){C(n,e);var t=T(n);function n(){return g(this,n),t.apply(this,arguments)}return b(n,[{key:"render",value:function(){var e,t=this.props,n=t.children,l=t.className,r=t.variant,a=t.small,i=t.iconplacement,d=t.icon,u=t.icononly,s=t.color,c=t.hideicon,m=t.size,p=t.iconSize,f=t.as,_=t.spreadIcon,h=S(t,["children","className","variant","small","iconplacement","icon","icononly","color","hideicon","size","iconSize","as","spreadIcon"]),g="xsmall"===m,x="small"===m||a;e=p||(x?"11px":"14px");var b="text"===r||!!c,v=f;if(!r)return null;var y=$(El.button,El[r],g&&El["button-xsmall"],x&&El["button-small"],El["button-".concat(i)],u&&El["button-icononly"],s&&El[s],_&&El["button-speadIcon"],l);return o.createElement(v,w({className:y},h),"start"===i&&d&&Sl(d,b,e),!u&&n,"end"===i&&d&&Sl(d,b,e))}}]),n}(o.PureComponent),Ml=function(e){C(n,e);var t=T(n);function n(){var e;g(this,n);for(var l=arguments.length,r=new Array(l),a=0;a1?"s":"")+" required, but only "+t.length+" present")}function Fo(e){return Co(1,arguments),e instanceof Date||"object"===typeof e&&"[object Date]"===Object.prototype.toString.call(e)}function Eo(e){Co(1,arguments);var t=Object.prototype.toString.call(e);return e instanceof Date||"object"===typeof e&&"[object Date]"===t?new Date(e.getTime()):"number"===typeof e||"[object Number]"===t?new Date(e):("string"!==typeof e&&"[object String]"!==t||"undefined"===typeof console||(console.warn("Starting with v2.0.0-beta.1 date-fns doesn't accept strings as date arguments. Please use `parseISO` to parse strings. See: https://git.io/fjule"),console.warn((new Error).stack)),new Date(NaN))}function So(e){Co(1,arguments);var t=Eo(e);return!isNaN(t)}var Po={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"1 second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"about 1 hour",other:"about {{count}} hours"},xHours:{one:"1 hour",other:"{{count}} hours"},xDays:{one:"1 day",other:"{{count}} days"},aboutXWeeks:{one:"about 1 week",other:"about {{count}} weeks"},xWeeks:{one:"1 week",other:"{{count}} weeks"},aboutXMonths:{one:"about 1 month",other:"about {{count}} months"},xMonths:{one:"1 month",other:"{{count}} months"},aboutXYears:{one:"about 1 year",other:"about {{count}} years"},xYears:{one:"1 year",other:"{{count}} years"},overXYears:{one:"over 1 year",other:"over {{count}} years"},almostXYears:{one:"almost 1 year",other:"almost {{count}} years"}};function Mo(e){return function(t){var n=t||{},l=n.width?String(n.width):e.defaultWidth;return e.formats[l]||e.formats[e.defaultWidth]}}var To={date:Mo({formats:{full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},defaultWidth:"full"}),time:Mo({formats:{full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},defaultWidth:"full"}),dateTime:Mo({formats:{full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},defaultWidth:"full"})},Do={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"};function zo(e){return function(t,n){var l,o=n||{};if("formatting"===(o.context?String(o.context):"standalone")&&e.formattingValues){var r=e.defaultFormattingWidth||e.defaultWidth,a=o.width?String(o.width):r;l=e.formattingValues[a]||e.formattingValues[r]}else{var i=e.defaultWidth,d=o.width?String(o.width):e.defaultWidth;l=e.values[d]||e.values[i]}return l[e.argumentCallback?e.argumentCallback(t):t]}}function Io(e){return function(t,n){var l=String(t),o=n||{},r=o.width,a=r&&e.matchPatterns[r]||e.matchPatterns[e.defaultMatchWidth],i=l.match(a);if(!i)return null;var d,u=i[0],s=r&&e.parsePatterns[r]||e.parsePatterns[e.defaultParseWidth];return d="[object Array]"===Object.prototype.toString.call(s)?function(e,t){for(var n=0;n0?"in "+l:l+" ago":l},formatLong:To,formatRelative:function(e,t,n,l){return Do[e]},localize:{ordinalNumber:function(e,t){var n=Number(e),l=n%100;if(l>20||l<10)switch(l%10){case 1:return n+"st";case 2:return n+"nd";case 3:return n+"rd"}return n+"th"},era:zo({values:{narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},defaultWidth:"wide"}),quarter:zo({values:{narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},defaultWidth:"wide",argumentCallback:function(e){return Number(e)-1}}),month:zo({values:{narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},defaultWidth:"wide"}),day:zo({values:{narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},defaultWidth:"wide"}),dayPeriod:zo({values:{narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},defaultWidth:"wide",formattingValues:{narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},defaultFormattingWidth:"wide"})},match:{ordinalNumber:(Bo={matchPattern:/^(\d+)(th|st|nd|rd)?/i,parsePattern:/\d+/i,valueCallback:function(e){return parseInt(e,10)}},function(e,t){var n=String(e),l=t||{},o=n.match(Bo.matchPattern);if(!o)return null;var r=o[0],a=n.match(Bo.parsePattern);if(!a)return null;var i=Bo.valueCallback?Bo.valueCallback(a[0]):a[0];return{value:i=l.valueCallback?l.valueCallback(i):i,rest:n.slice(r.length)}}),era:Io({matchPatterns:{narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},defaultMatchWidth:"wide",parsePatterns:{any:[/^b/i,/^(a|c)/i]},defaultParseWidth:"any"}),quarter:Io({matchPatterns:{narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},defaultMatchWidth:"wide",parsePatterns:{any:[/1/i,/2/i,/3/i,/4/i]},defaultParseWidth:"any",valueCallback:function(e){return e+1}}),month:Io({matchPatterns:{narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},defaultMatchWidth:"wide",parsePatterns:{narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},defaultParseWidth:"any"}),day:Io({matchPatterns:{narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},defaultMatchWidth:"wide",parsePatterns:{narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},defaultParseWidth:"any"}),dayPeriod:Io({matchPatterns:{narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},defaultMatchWidth:"any",parsePatterns:{any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},defaultParseWidth:"any"})},options:{weekStartsOn:0,firstWeekContainsDate:1}};function Ro(e){if(null===e||!0===e||!1===e)return NaN;var t=Number(e);return isNaN(t)?t:t<0?Math.ceil(t):Math.floor(t)}function Lo(e,t){Co(2,arguments);var n=Eo(e).getTime(),l=Ro(t);return new Date(n+l)}function No(e,t){Co(2,arguments);var n=Ro(t);return Lo(e,-n)}function Ho(e,t){for(var n=e<0?"-":"",l=Math.abs(e).toString();l.length0?n:1-n;return Ho("yy"===t?l%100:l,t.length)},Ao=function(e,t){var n=e.getUTCMonth();return"M"===t?String(n+1):Ho(n+1,2)},Vo=function(e,t){return Ho(e.getUTCDate(),t.length)},Yo=function(e,t){return Ho(e.getUTCHours()%12||12,t.length)},Uo=function(e,t){return Ho(e.getUTCHours(),t.length)},Wo=function(e,t){return Ho(e.getUTCMinutes(),t.length)},qo=function(e,t){return Ho(e.getUTCSeconds(),t.length)},Go=function(e,t){var n=t.length,l=e.getUTCMilliseconds();return Ho(Math.floor(l*Math.pow(10,n-3)),t.length)},Qo=864e5;function Ko(e){Co(1,arguments);var t=1,n=Eo(e),l=n.getUTCDay(),o=(l=o.getTime()?n+1:t.getTime()>=a.getTime()?n:n-1}function Xo(e){Co(1,arguments);var t=$o(e),n=new Date(0);n.setUTCFullYear(t,0,4),n.setUTCHours(0,0,0,0);var l=Ko(n);return l}var Zo=6048e5;function Jo(e){Co(1,arguments);var t=Eo(e),n=Ko(t).getTime()-Xo(t).getTime();return Math.round(n/Zo)+1}function er(e,t){Co(1,arguments);var n=t||{},l=n.locale,o=l&&l.options&&l.options.weekStartsOn,r=null==o?0:Ro(o),a=null==n.weekStartsOn?r:Ro(n.weekStartsOn);if(!(a>=0&&a<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");var i=Eo(e),d=i.getUTCDay(),u=(d=1&&d<=7))throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var u=new Date(0);u.setUTCFullYear(l+1,0,d),u.setUTCHours(0,0,0,0);var s=er(u,t),c=new Date(0);c.setUTCFullYear(l,0,d),c.setUTCHours(0,0,0,0);var m=er(c,t);return n.getTime()>=s.getTime()?l+1:n.getTime()>=m.getTime()?l:l-1}function nr(e,t){Co(1,arguments);var n=t||{},l=n.locale,o=l&&l.options&&l.options.firstWeekContainsDate,r=null==o?1:Ro(o),a=null==n.firstWeekContainsDate?r:Ro(n.firstWeekContainsDate),i=tr(e,t),d=new Date(0);d.setUTCFullYear(i,0,a),d.setUTCHours(0,0,0,0);var u=er(d,t);return u}var lr=6048e5;function or(e,t){Co(1,arguments);var n=Eo(e),l=er(n,t).getTime()-nr(n,t).getTime();return Math.round(l/lr)+1}var rr="midnight",ar="noon",ir="morning",dr="afternoon",ur="evening",sr="night",cr={G:function(e,t,n){var l=e.getUTCFullYear()>0?1:0;switch(t){case"G":case"GG":case"GGG":return n.era(l,{width:"abbreviated"});case"GGGGG":return n.era(l,{width:"narrow"});case"GGGG":default:return n.era(l,{width:"wide"})}},y:function(e,t,n){if("yo"===t){var l=e.getUTCFullYear(),o=l>0?l:1-l;return n.ordinalNumber(o,{unit:"year"})}return jo(e,t)},Y:function(e,t,n,l){var o=tr(e,l),r=o>0?o:1-o;return"YY"===t?Ho(r%100,2):"Yo"===t?n.ordinalNumber(r,{unit:"year"}):Ho(r,t.length)},R:function(e,t){return Ho($o(e),t.length)},u:function(e,t){return Ho(e.getUTCFullYear(),t.length)},Q:function(e,t,n){var l=Math.ceil((e.getUTCMonth()+1)/3);switch(t){case"Q":return String(l);case"QQ":return Ho(l,2);case"Qo":return n.ordinalNumber(l,{unit:"quarter"});case"QQQ":return n.quarter(l,{width:"abbreviated",context:"formatting"});case"QQQQQ":return n.quarter(l,{width:"narrow",context:"formatting"});case"QQQQ":default:return n.quarter(l,{width:"wide",context:"formatting"})}},q:function(e,t,n){var l=Math.ceil((e.getUTCMonth()+1)/3);switch(t){case"q":return String(l);case"qq":return Ho(l,2);case"qo":return n.ordinalNumber(l,{unit:"quarter"});case"qqq":return n.quarter(l,{width:"abbreviated",context:"standalone"});case"qqqqq":return n.quarter(l,{width:"narrow",context:"standalone"});case"qqqq":default:return n.quarter(l,{width:"wide",context:"standalone"})}},M:function(e,t,n){var l=e.getUTCMonth();switch(t){case"M":case"MM":return Ao(e,t);case"Mo":return n.ordinalNumber(l+1,{unit:"month"});case"MMM":return n.month(l,{width:"abbreviated",context:"formatting"});case"MMMMM":return n.month(l,{width:"narrow",context:"formatting"});case"MMMM":default:return n.month(l,{width:"wide",context:"formatting"})}},L:function(e,t,n){var l=e.getUTCMonth();switch(t){case"L":return String(l+1);case"LL":return Ho(l+1,2);case"Lo":return n.ordinalNumber(l+1,{unit:"month"});case"LLL":return n.month(l,{width:"abbreviated",context:"standalone"});case"LLLLL":return n.month(l,{width:"narrow",context:"standalone"});case"LLLL":default:return n.month(l,{width:"wide",context:"standalone"})}},w:function(e,t,n,l){var o=or(e,l);return"wo"===t?n.ordinalNumber(o,{unit:"week"}):Ho(o,t.length)},I:function(e,t,n){var l=Jo(e);return"Io"===t?n.ordinalNumber(l,{unit:"week"}):Ho(l,t.length)},d:function(e,t,n){return"do"===t?n.ordinalNumber(e.getUTCDate(),{unit:"date"}):Vo(e,t)},D:function(e,t,n){var l=function(e){Co(1,arguments);var t=Eo(e),n=t.getTime();t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0);var l=t.getTime(),o=n-l;return Math.floor(o/Qo)+1}(e);return"Do"===t?n.ordinalNumber(l,{unit:"dayOfYear"}):Ho(l,t.length)},E:function(e,t,n){var l=e.getUTCDay();switch(t){case"E":case"EE":case"EEE":return n.day(l,{width:"abbreviated",context:"formatting"});case"EEEEE":return n.day(l,{width:"narrow",context:"formatting"});case"EEEEEE":return n.day(l,{width:"short",context:"formatting"});case"EEEE":default:return n.day(l,{width:"wide",context:"formatting"})}},e:function(e,t,n,l){var o=e.getUTCDay(),r=(o-l.weekStartsOn+8)%7||7;switch(t){case"e":return String(r);case"ee":return Ho(r,2);case"eo":return n.ordinalNumber(r,{unit:"day"});case"eee":return n.day(o,{width:"abbreviated",context:"formatting"});case"eeeee":return n.day(o,{width:"narrow",context:"formatting"});case"eeeeee":return n.day(o,{width:"short",context:"formatting"});case"eeee":default:return n.day(o,{width:"wide",context:"formatting"})}},c:function(e,t,n,l){var o=e.getUTCDay(),r=(o-l.weekStartsOn+8)%7||7;switch(t){case"c":return String(r);case"cc":return Ho(r,t.length);case"co":return n.ordinalNumber(r,{unit:"day"});case"ccc":return n.day(o,{width:"abbreviated",context:"standalone"});case"ccccc":return n.day(o,{width:"narrow",context:"standalone"});case"cccccc":return n.day(o,{width:"short",context:"standalone"});case"cccc":default:return n.day(o,{width:"wide",context:"standalone"})}},i:function(e,t,n){var l=e.getUTCDay(),o=0===l?7:l;switch(t){case"i":return String(o);case"ii":return Ho(o,t.length);case"io":return n.ordinalNumber(o,{unit:"day"});case"iii":return n.day(l,{width:"abbreviated",context:"formatting"});case"iiiii":return n.day(l,{width:"narrow",context:"formatting"});case"iiiiii":return n.day(l,{width:"short",context:"formatting"});case"iiii":default:return n.day(l,{width:"wide",context:"formatting"})}},a:function(e,t,n){var l=e.getUTCHours()/12>=1?"pm":"am";switch(t){case"a":case"aa":case"aaa":return n.dayPeriod(l,{width:"abbreviated",context:"formatting"});case"aaaaa":return n.dayPeriod(l,{width:"narrow",context:"formatting"});case"aaaa":default:return n.dayPeriod(l,{width:"wide",context:"formatting"})}},b:function(e,t,n){var l,o=e.getUTCHours();switch(l=12===o?ar:0===o?rr:o/12>=1?"pm":"am",t){case"b":case"bb":case"bbb":return n.dayPeriod(l,{width:"abbreviated",context:"formatting"});case"bbbbb":return n.dayPeriod(l,{width:"narrow",context:"formatting"});case"bbbb":default:return n.dayPeriod(l,{width:"wide",context:"formatting"})}},B:function(e,t,n){var l,o=e.getUTCHours();switch(l=o>=17?ur:o>=12?dr:o>=4?ir:sr,t){case"B":case"BB":case"BBB":return n.dayPeriod(l,{width:"abbreviated",context:"formatting"});case"BBBBB":return n.dayPeriod(l,{width:"narrow",context:"formatting"});case"BBBB":default:return n.dayPeriod(l,{width:"wide",context:"formatting"})}},h:function(e,t,n){if("ho"===t){var l=e.getUTCHours()%12;return 0===l&&(l=12),n.ordinalNumber(l,{unit:"hour"})}return Yo(e,t)},H:function(e,t,n){return"Ho"===t?n.ordinalNumber(e.getUTCHours(),{unit:"hour"}):Uo(e,t)},K:function(e,t,n){var l=e.getUTCHours()%12;return"Ko"===t?n.ordinalNumber(l,{unit:"hour"}):Ho(l,t.length)},k:function(e,t,n){var l=e.getUTCHours();return 0===l&&(l=24),"ko"===t?n.ordinalNumber(l,{unit:"hour"}):Ho(l,t.length)},m:function(e,t,n){return"mo"===t?n.ordinalNumber(e.getUTCMinutes(),{unit:"minute"}):Wo(e,t)},s:function(e,t,n){return"so"===t?n.ordinalNumber(e.getUTCSeconds(),{unit:"second"}):qo(e,t)},S:function(e,t){return Go(e,t)},X:function(e,t,n,l){var o=(l._originalDate||e).getTimezoneOffset();if(0===o)return"Z";switch(t){case"X":return pr(o);case"XXXX":case"XX":return fr(o);case"XXXXX":case"XXX":default:return fr(o,":")}},x:function(e,t,n,l){var o=(l._originalDate||e).getTimezoneOffset();switch(t){case"x":return pr(o);case"xxxx":case"xx":return fr(o);case"xxxxx":case"xxx":default:return fr(o,":")}},O:function(e,t,n,l){var o=(l._originalDate||e).getTimezoneOffset();switch(t){case"O":case"OO":case"OOO":return"GMT"+mr(o,":");case"OOOO":default:return"GMT"+fr(o,":")}},z:function(e,t,n,l){var o=(l._originalDate||e).getTimezoneOffset();switch(t){case"z":case"zz":case"zzz":return"GMT"+mr(o,":");case"zzzz":default:return"GMT"+fr(o,":")}},t:function(e,t,n,l){var o=l._originalDate||e;return Ho(Math.floor(o.getTime()/1e3),t.length)},T:function(e,t,n,l){return Ho((l._originalDate||e).getTime(),t.length)}};function mr(e,t){var n=e>0?"-":"+",l=Math.abs(e),o=Math.floor(l/60),r=l%60;if(0===r)return n+String(o);var a=t||"";return n+String(o)+a+Ho(r,2)}function pr(e,t){return e%60===0?(e>0?"-":"+")+Ho(Math.abs(e)/60,2):fr(e,t)}function fr(e,t){var n=t||"",l=e>0?"-":"+",o=Math.abs(e);return l+Ho(Math.floor(o/60),2)+n+Ho(o%60,2)}function _r(e,t){switch(e){case"P":return t.date({width:"short"});case"PP":return t.date({width:"medium"});case"PPP":return t.date({width:"long"});case"PPPP":default:return t.date({width:"full"})}}function hr(e,t){switch(e){case"p":return t.time({width:"short"});case"pp":return t.time({width:"medium"});case"ppp":return t.time({width:"long"});case"pppp":default:return t.time({width:"full"})}}var gr={p:hr,P:function(e,t){var n,l=e.match(/(P+)(p+)?/),o=l[1],r=l[2];if(!r)return _r(e,t);switch(o){case"P":n=t.dateTime({width:"short"});break;case"PP":n=t.dateTime({width:"medium"});break;case"PPP":n=t.dateTime({width:"long"});break;case"PPPP":default:n=t.dateTime({width:"full"})}return n.replace("{{date}}",_r(o,t)).replace("{{time}}",hr(r,t))}},xr=6e4;function br(e){return e.getTime()%xr}function vr(e){var t=new Date(e.getTime()),n=Math.ceil(t.getTimezoneOffset());t.setSeconds(0,0);var l=n>0?(xr+br(t))%xr:br(t);return n*xr+l}var wr=["D","DD"],yr=["YY","YYYY"];function kr(e){return-1!==wr.indexOf(e)}function Cr(e){return-1!==yr.indexOf(e)}function Fr(e,t,n){if("YYYY"===e)throw new RangeError("Use `yyyy` instead of `YYYY` (in `".concat(t,"`) for formatting years to the input `").concat(n,"`; see: https://git.io/fxCyr"));if("YY"===e)throw new RangeError("Use `yy` instead of `YY` (in `".concat(t,"`) for formatting years to the input `").concat(n,"`; see: https://git.io/fxCyr"));if("D"===e)throw new RangeError("Use `d` instead of `D` (in `".concat(t,"`) for formatting days of the month to the input `").concat(n,"`; see: https://git.io/fxCyr"));if("DD"===e)throw new RangeError("Use `dd` instead of `DD` (in `".concat(t,"`) for formatting days of the month to the input `").concat(n,"`; see: https://git.io/fxCyr"))}var Er=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,Sr=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,Pr=/^'([^]*?)'?$/,Mr=/''/g,Tr=/[a-zA-Z]/;function Dr(e,t,n){Co(2,arguments);var l=String(t),o=n||{},r=o.locale||Oo,a=r.options&&r.options.firstWeekContainsDate,i=null==a?1:Ro(a),d=null==o.firstWeekContainsDate?i:Ro(o.firstWeekContainsDate);if(!(d>=1&&d<=7))throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var u=r.options&&r.options.weekStartsOn,s=null==u?0:Ro(u),c=null==o.weekStartsOn?s:Ro(o.weekStartsOn);if(!(c>=0&&c<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");if(!r.localize)throw new RangeError("locale must contain localize property");if(!r.formatLong)throw new RangeError("locale must contain formatLong property");var m=Eo(e);if(!So(m))throw new RangeError("Invalid time value");var p=vr(m),f=No(m,p),_={firstWeekContainsDate:d,weekStartsOn:c,locale:r,_originalDate:m},h=l.match(Sr).map((function(e){var t=e[0];return"p"===t||"P"===t?(0,gr[t])(e,r.formatLong,_):e})).join("").match(Er).map((function(n){if("''"===n)return"'";var l=n[0];if("'"===l)return zr(n);var a=cr[l];if(a)return!o.useAdditionalWeekYearTokens&&Cr(n)&&Fr(n,t,e),!o.useAdditionalDayOfYearTokens&&kr(n)&&Fr(n,t,e),a(f,n,r.localize,_);if(l.match(Tr))throw new RangeError("Format string contains an unescaped latin alphabet character `"+l+"`");return n})).join("");return h}function zr(e){return e.match(Pr)[1].replace(Mr,"'")}function Ir(e,t){Co(2,arguments);var n=Ro(t);return Lo(e,6e4*n)}var Br=36e5;function Or(e,t){Co(2,arguments);var n=Ro(t);return Lo(e,n*Br)}function Rr(e,t){Co(2,arguments);var n=Eo(e),l=Ro(t);return isNaN(l)?new Date(NaN):l?(n.setDate(n.getDate()+l),n):n}function Lr(e,t){Co(2,arguments);var n=Ro(t),l=7*n;return Rr(e,l)}function Nr(e,t){Co(2,arguments);var n=Eo(e),l=Ro(t);if(isNaN(l))return new Date(NaN);if(!l)return n;var o=n.getDate(),r=new Date(n.getTime());r.setMonth(n.getMonth()+l+1,0);var a=r.getDate();return o>=a?r:(n.setFullYear(r.getFullYear(),r.getMonth(),o),n)}function Hr(e,t){Co(2,arguments);var n=Ro(t);return Nr(e,12*n)}function jr(e,t){Co(2,arguments);var n=Ro(t);return Nr(e,-n)}function Ar(e,t){Co(2,arguments);var n=Ro(t);return Hr(e,-n)}function Vr(e){Co(1,arguments);var t=Eo(e),n=t.getSeconds();return n}function Yr(e){Co(1,arguments);var t=Eo(e),n=t.getMinutes();return n}function Ur(e){Co(1,arguments);var t=Eo(e),n=t.getHours();return n}function Wr(e){Co(1,arguments);var t=Eo(e),n=t.getDay();return n}function qr(e){Co(1,arguments);var t=Eo(e),n=t.getDate();return n}function Gr(e,t){Co(1,arguments);var n=t||{},l=n.locale,o=l&&l.options&&l.options.weekStartsOn,r=null==o?0:Ro(o),a=null==n.weekStartsOn?r:Ro(n.weekStartsOn);if(!(a>=0&&a<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");var i=Eo(e),d=i.getDay(),u=(d=1&&d<=7))throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var u=new Date(0);u.setFullYear(l+1,0,d),u.setHours(0,0,0,0);var s=Gr(u,t),c=new Date(0);c.setFullYear(l,0,d),c.setHours(0,0,0,0);var m=Gr(c,t);return n.getTime()>=s.getTime()?l+1:n.getTime()>=m.getTime()?l:l-1}function Kr(e,t){Co(1,arguments);var n=t||{},l=n.locale,o=l&&l.options&&l.options.firstWeekContainsDate,r=null==o?1:Ro(o),a=null==n.firstWeekContainsDate?r:Ro(n.firstWeekContainsDate),i=Qr(e,t),d=new Date(0);d.setFullYear(i,0,a),d.setHours(0,0,0,0);var u=Gr(d,t);return u}var $r=6048e5;function Xr(e){Co(1,arguments);var t=Eo(e),n=t.getMonth();return n}function Zr(e){Co(1,arguments);var t=Eo(e),n=Math.floor(t.getMonth()/3)+1;return n}function Jr(e){Co(1,arguments);var t=Eo(e),n=t.getFullYear();return n}function ea(e){Co(1,arguments);var t=Eo(e),n=t.getTime();return n}function ta(e,t){Co(2,arguments);var n=Eo(e),l=Ro(t);return n.setMinutes(l),n}function na(e,t){Co(2,arguments);var n=Eo(e),l=Ro(t);return n.setHours(l),n}function la(e){Co(1,arguments);var t=Eo(e),n=t.getFullYear(),l=t.getMonth(),o=new Date(0);return o.setFullYear(n,l+1,0),o.setHours(0,0,0,0),o.getDate()}function oa(e,t){Co(2,arguments);var n=Eo(e),l=Ro(t),o=n.getFullYear(),r=n.getDate(),a=new Date(0);a.setFullYear(o,l,15),a.setHours(0,0,0,0);var i=la(a);return n.setMonth(l,Math.min(r,i)),n}function ra(e,t){Co(2,arguments);var n=Eo(e),l=Ro(t),o=Math.floor(n.getMonth()/3)+1,r=l-o;return oa(n,n.getMonth()+3*r)}function aa(e,t){Co(2,arguments);var n=Eo(e),l=Ro(t);return isNaN(n)?new Date(NaN):(n.setFullYear(l),n)}function ia(e){var t,n;if(Co(1,arguments),e&&"function"===typeof e.forEach)t=e;else{if("object"!==typeof e||null===e)return new Date(NaN);t=Array.prototype.slice.call(e)}return t.forEach((function(e){var t=Eo(e);(void 0===n||n>t||isNaN(t))&&(n=t)})),n||new Date(NaN)}function da(e){var t,n;if(Co(1,arguments),e&&"function"===typeof e.forEach)t=e;else{if("object"!==typeof e||null===e)return new Date(NaN);t=Array.prototype.slice.call(e)}return t.forEach((function(e){var t=Eo(e);(void 0===n||nl.getTime()}function ha(e,t){Co(2,arguments);var n=Eo(e),l=Eo(t);return n.getTime()=o&&l<=r}function xa(e,t){if(null==e)throw new TypeError("assign requires that input parameter not be null or undefined");for(var n in t=t||{})t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function ba(e,t,n){Co(2,arguments);var l=n||{},o=l.locale,r=o&&o.options&&o.options.weekStartsOn,a=null==r?0:Ro(r),i=null==l.weekStartsOn?a:Ro(l.weekStartsOn);if(!(i>=0&&i<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");var d=Eo(e),u=Ro(t),s=d.getUTCDay(),c=u%7,m=(c+7)%7,p=(m0,o=l?t:1-t;if(o<=50)n=e||100;else{var r=o+50;n=e+100*Math.floor(r/100)-(e>=r%100?100:0)}return l?n:1-n}var Xa=[31,28,31,30,31,30,31,31,30,31,30,31],Za=[31,29,31,30,31,30,31,31,30,31,30,31];function Ja(e){return e%400===0||e%4===0&&e%100!==0}var ei={G:{priority:140,parse:function(e,t,n,l){switch(t){case"G":case"GG":case"GGG":return n.era(e,{width:"abbreviated"})||n.era(e,{width:"narrow"});case"GGGGG":return n.era(e,{width:"narrow"});case"GGGG":default:return n.era(e,{width:"wide"})||n.era(e,{width:"abbreviated"})||n.era(e,{width:"narrow"})}},set:function(e,t,n,l){return t.era=n,e.setUTCFullYear(n,0,1),e.setUTCHours(0,0,0,0),e},incompatibleTokens:["R","u","t","T"]},y:{priority:130,parse:function(e,t,n,l){var o=function(e){return{year:e,isTwoDigitYear:"yy"===t}};switch(t){case"y":return Ga(4,e,o);case"yo":return n.ordinalNumber(e,{unit:"year",valueCallback:o});default:return Ga(t.length,e,o)}},validate:function(e,t,n){return t.isTwoDigitYear||t.year>0},set:function(e,t,n,l){var o=e.getUTCFullYear();if(n.isTwoDigitYear){var r=$a(n.year,o);return e.setUTCFullYear(r,0,1),e.setUTCHours(0,0,0,0),e}var a="era"in t&&1!==t.era?1-n.year:n.year;return e.setUTCFullYear(a,0,1),e.setUTCHours(0,0,0,0),e},incompatibleTokens:["Y","R","u","w","I","i","e","c","t","T"]},Y:{priority:130,parse:function(e,t,n,l){var o=function(e){return{year:e,isTwoDigitYear:"YY"===t}};switch(t){case"Y":return Ga(4,e,o);case"Yo":return n.ordinalNumber(e,{unit:"year",valueCallback:o});default:return Ga(t.length,e,o)}},validate:function(e,t,n){return t.isTwoDigitYear||t.year>0},set:function(e,t,n,l){var o=tr(e,l);if(n.isTwoDigitYear){var r=$a(n.year,o);return e.setUTCFullYear(r,0,l.firstWeekContainsDate),e.setUTCHours(0,0,0,0),er(e,l)}var a="era"in t&&1!==t.era?1-n.year:n.year;return e.setUTCFullYear(a,0,l.firstWeekContainsDate),e.setUTCHours(0,0,0,0),er(e,l)},incompatibleTokens:["y","R","u","Q","q","M","L","I","d","D","i","t","T"]},R:{priority:130,parse:function(e,t,n,l){return Qa("R"===t?4:t.length,e)},set:function(e,t,n,l){var o=new Date(0);return o.setUTCFullYear(n,0,4),o.setUTCHours(0,0,0,0),Ko(o)},incompatibleTokens:["G","y","Y","u","Q","q","M","L","w","d","D","e","c","t","T"]},u:{priority:130,parse:function(e,t,n,l){return Qa("u"===t?4:t.length,e)},set:function(e,t,n,l){return e.setUTCFullYear(n,0,1),e.setUTCHours(0,0,0,0),e},incompatibleTokens:["G","y","Y","R","w","I","i","e","c","t","T"]},Q:{priority:120,parse:function(e,t,n,l){switch(t){case"Q":case"QQ":return Ga(t.length,e);case"Qo":return n.ordinalNumber(e,{unit:"quarter"});case"QQQ":return n.quarter(e,{width:"abbreviated",context:"formatting"})||n.quarter(e,{width:"narrow",context:"formatting"});case"QQQQQ":return n.quarter(e,{width:"narrow",context:"formatting"});case"QQQQ":default:return n.quarter(e,{width:"wide",context:"formatting"})||n.quarter(e,{width:"abbreviated",context:"formatting"})||n.quarter(e,{width:"narrow",context:"formatting"})}},validate:function(e,t,n){return t>=1&&t<=4},set:function(e,t,n,l){return e.setUTCMonth(3*(n-1),1),e.setUTCHours(0,0,0,0),e},incompatibleTokens:["Y","R","q","M","L","w","I","d","D","i","e","c","t","T"]},q:{priority:120,parse:function(e,t,n,l){switch(t){case"q":case"qq":return Ga(t.length,e);case"qo":return n.ordinalNumber(e,{unit:"quarter"});case"qqq":return n.quarter(e,{width:"abbreviated",context:"standalone"})||n.quarter(e,{width:"narrow",context:"standalone"});case"qqqqq":return n.quarter(e,{width:"narrow",context:"standalone"});case"qqqq":default:return n.quarter(e,{width:"wide",context:"standalone"})||n.quarter(e,{width:"abbreviated",context:"standalone"})||n.quarter(e,{width:"narrow",context:"standalone"})}},validate:function(e,t,n){return t>=1&&t<=4},set:function(e,t,n,l){return e.setUTCMonth(3*(n-1),1),e.setUTCHours(0,0,0,0),e},incompatibleTokens:["Y","R","Q","M","L","w","I","d","D","i","e","c","t","T"]},M:{priority:110,parse:function(e,t,n,l){var o=function(e){return e-1};switch(t){case"M":return Ua(va,e,o);case"MM":return Ga(2,e,o);case"Mo":return n.ordinalNumber(e,{unit:"month",valueCallback:o});case"MMM":return n.month(e,{width:"abbreviated",context:"formatting"})||n.month(e,{width:"narrow",context:"formatting"});case"MMMMM":return n.month(e,{width:"narrow",context:"formatting"});case"MMMM":default:return n.month(e,{width:"wide",context:"formatting"})||n.month(e,{width:"abbreviated",context:"formatting"})||n.month(e,{width:"narrow",context:"formatting"})}},validate:function(e,t,n){return t>=0&&t<=11},set:function(e,t,n,l){return e.setUTCMonth(n,1),e.setUTCHours(0,0,0,0),e},incompatibleTokens:["Y","R","q","Q","L","w","I","D","i","e","c","t","T"]},L:{priority:110,parse:function(e,t,n,l){var o=function(e){return e-1};switch(t){case"L":return Ua(va,e,o);case"LL":return Ga(2,e,o);case"Lo":return n.ordinalNumber(e,{unit:"month",valueCallback:o});case"LLL":return n.month(e,{width:"abbreviated",context:"standalone"})||n.month(e,{width:"narrow",context:"standalone"});case"LLLLL":return n.month(e,{width:"narrow",context:"standalone"});case"LLLL":default:return n.month(e,{width:"wide",context:"standalone"})||n.month(e,{width:"abbreviated",context:"standalone"})||n.month(e,{width:"narrow",context:"standalone"})}},validate:function(e,t,n){return t>=0&&t<=11},set:function(e,t,n,l){return e.setUTCMonth(n,1),e.setUTCHours(0,0,0,0),e},incompatibleTokens:["Y","R","q","Q","M","w","I","D","i","e","c","t","T"]},w:{priority:100,parse:function(e,t,n,l){switch(t){case"w":return Ua(ka,e);case"wo":return n.ordinalNumber(e,{unit:"week"});default:return Ga(t.length,e)}},validate:function(e,t,n){return t>=1&&t<=53},set:function(e,t,n,l){return er(function(e,t,n){Co(2,arguments);var l=Eo(e),o=Ro(t),r=or(l,n)-o;return l.setUTCDate(l.getUTCDate()-7*r),l}(e,n,l),l)},incompatibleTokens:["y","R","u","q","Q","M","L","I","d","D","i","t","T"]},I:{priority:100,parse:function(e,t,n,l){switch(t){case"I":return Ua(ka,e);case"Io":return n.ordinalNumber(e,{unit:"week"});default:return Ga(t.length,e)}},validate:function(e,t,n){return t>=1&&t<=53},set:function(e,t,n,l){return Ko(function(e,t){Co(2,arguments);var n=Eo(e),l=Ro(t),o=Jo(n)-l;return n.setUTCDate(n.getUTCDate()-7*o),n}(e,n,l),l)},incompatibleTokens:["y","Y","u","q","Q","M","L","w","d","D","e","c","t","T"]},d:{priority:90,subPriority:1,parse:function(e,t,n,l){switch(t){case"d":return Ua(wa,e);case"do":return n.ordinalNumber(e,{unit:"date"});default:return Ga(t.length,e)}},validate:function(e,t,n){var l=Ja(e.getUTCFullYear()),o=e.getUTCMonth();return l?t>=1&&t<=Za[o]:t>=1&&t<=Xa[o]},set:function(e,t,n,l){return e.setUTCDate(n),e.setUTCHours(0,0,0,0),e},incompatibleTokens:["Y","R","q","Q","w","I","D","i","e","c","t","T"]},D:{priority:90,subPriority:1,parse:function(e,t,n,l){switch(t){case"D":case"DD":return Ua(ya,e);case"Do":return n.ordinalNumber(e,{unit:"date"});default:return Ga(t.length,e)}},validate:function(e,t,n){return Ja(e.getUTCFullYear())?t>=1&&t<=366:t>=1&&t<=365},set:function(e,t,n,l){return e.setUTCMonth(0,n),e.setUTCHours(0,0,0,0),e},incompatibleTokens:["Y","R","q","Q","M","L","w","I","d","E","i","e","c","t","T"]},E:{priority:90,parse:function(e,t,n,l){switch(t){case"E":case"EE":case"EEE":return n.day(e,{width:"abbreviated",context:"formatting"})||n.day(e,{width:"short",context:"formatting"})||n.day(e,{width:"narrow",context:"formatting"});case"EEEEE":return n.day(e,{width:"narrow",context:"formatting"});case"EEEEEE":return n.day(e,{width:"short",context:"formatting"})||n.day(e,{width:"narrow",context:"formatting"});case"EEEE":default:return n.day(e,{width:"wide",context:"formatting"})||n.day(e,{width:"abbreviated",context:"formatting"})||n.day(e,{width:"short",context:"formatting"})||n.day(e,{width:"narrow",context:"formatting"})}},validate:function(e,t,n){return t>=0&&t<=6},set:function(e,t,n,l){return(e=ba(e,n,l)).setUTCHours(0,0,0,0),e},incompatibleTokens:["D","i","e","c","t","T"]},e:{priority:90,parse:function(e,t,n,l){var o=function(e){var t=7*Math.floor((e-1)/7);return(e+l.weekStartsOn+6)%7+t};switch(t){case"e":case"ee":return Ga(t.length,e,o);case"eo":return n.ordinalNumber(e,{unit:"day",valueCallback:o});case"eee":return n.day(e,{width:"abbreviated",context:"formatting"})||n.day(e,{width:"short",context:"formatting"})||n.day(e,{width:"narrow",context:"formatting"});case"eeeee":return n.day(e,{width:"narrow",context:"formatting"});case"eeeeee":return n.day(e,{width:"short",context:"formatting"})||n.day(e,{width:"narrow",context:"formatting"});case"eeee":default:return n.day(e,{width:"wide",context:"formatting"})||n.day(e,{width:"abbreviated",context:"formatting"})||n.day(e,{width:"short",context:"formatting"})||n.day(e,{width:"narrow",context:"formatting"})}},validate:function(e,t,n){return t>=0&&t<=6},set:function(e,t,n,l){return(e=ba(e,n,l)).setUTCHours(0,0,0,0),e},incompatibleTokens:["y","R","u","q","Q","M","L","I","d","D","E","i","c","t","T"]},c:{priority:90,parse:function(e,t,n,l){var o=function(e){var t=7*Math.floor((e-1)/7);return(e+l.weekStartsOn+6)%7+t};switch(t){case"c":case"cc":return Ga(t.length,e,o);case"co":return n.ordinalNumber(e,{unit:"day",valueCallback:o});case"ccc":return n.day(e,{width:"abbreviated",context:"standalone"})||n.day(e,{width:"short",context:"standalone"})||n.day(e,{width:"narrow",context:"standalone"});case"ccccc":return n.day(e,{width:"narrow",context:"standalone"});case"cccccc":return n.day(e,{width:"short",context:"standalone"})||n.day(e,{width:"narrow",context:"standalone"});case"cccc":default:return n.day(e,{width:"wide",context:"standalone"})||n.day(e,{width:"abbreviated",context:"standalone"})||n.day(e,{width:"short",context:"standalone"})||n.day(e,{width:"narrow",context:"standalone"})}},validate:function(e,t,n){return t>=0&&t<=6},set:function(e,t,n,l){return(e=ba(e,n,l)).setUTCHours(0,0,0,0),e},incompatibleTokens:["y","R","u","q","Q","M","L","I","d","D","E","i","e","t","T"]},i:{priority:90,parse:function(e,t,n,l){var o=function(e){return 0===e?7:e};switch(t){case"i":case"ii":return Ga(t.length,e);case"io":return n.ordinalNumber(e,{unit:"day"});case"iii":return n.day(e,{width:"abbreviated",context:"formatting",valueCallback:o})||n.day(e,{width:"short",context:"formatting",valueCallback:o})||n.day(e,{width:"narrow",context:"formatting",valueCallback:o});case"iiiii":return n.day(e,{width:"narrow",context:"formatting",valueCallback:o});case"iiiiii":return n.day(e,{width:"short",context:"formatting",valueCallback:o})||n.day(e,{width:"narrow",context:"formatting",valueCallback:o});case"iiii":default:return n.day(e,{width:"wide",context:"formatting",valueCallback:o})||n.day(e,{width:"abbreviated",context:"formatting",valueCallback:o})||n.day(e,{width:"short",context:"formatting",valueCallback:o})||n.day(e,{width:"narrow",context:"formatting",valueCallback:o})}},validate:function(e,t,n){return t>=1&&t<=7},set:function(e,t,n,l){return(e=function(e,t){Co(2,arguments);var n=Ro(t);n%7===0&&(n-=7);var l=1,o=Eo(e),r=o.getUTCDay(),a=((n%7+7)%7=1&&t<=12},set:function(e,t,n,l){var o=e.getUTCHours()>=12;return o&&n<12?e.setUTCHours(n+12,0,0,0):o||12!==n?e.setUTCHours(n,0,0,0):e.setUTCHours(0,0,0,0),e},incompatibleTokens:["H","K","k","t","T"]},H:{priority:70,parse:function(e,t,n,l){switch(t){case"H":return Ua(Ca,e);case"Ho":return n.ordinalNumber(e,{unit:"hour"});default:return Ga(t.length,e)}},validate:function(e,t,n){return t>=0&&t<=23},set:function(e,t,n,l){return e.setUTCHours(n,0,0,0),e},incompatibleTokens:["a","b","h","K","k","t","T"]},K:{priority:70,parse:function(e,t,n,l){switch(t){case"K":return Ua(Ea,e);case"Ko":return n.ordinalNumber(e,{unit:"hour"});default:return Ga(t.length,e)}},validate:function(e,t,n){return t>=0&&t<=11},set:function(e,t,n,l){return e.getUTCHours()>=12&&n<12?e.setUTCHours(n+12,0,0,0):e.setUTCHours(n,0,0,0),e},incompatibleTokens:["a","b","h","H","k","t","T"]},k:{priority:70,parse:function(e,t,n,l){switch(t){case"k":return Ua(Fa,e);case"ko":return n.ordinalNumber(e,{unit:"hour"});default:return Ga(t.length,e)}},validate:function(e,t,n){return t>=1&&t<=24},set:function(e,t,n,l){var o=n<=24?n%24:n;return e.setUTCHours(o,0,0,0),e},incompatibleTokens:["a","b","h","H","K","t","T"]},m:{priority:60,parse:function(e,t,n,l){switch(t){case"m":return Ua(Pa,e);case"mo":return n.ordinalNumber(e,{unit:"minute"});default:return Ga(t.length,e)}},validate:function(e,t,n){return t>=0&&t<=59},set:function(e,t,n,l){return e.setUTCMinutes(n,0,0),e},incompatibleTokens:["t","T"]},s:{priority:50,parse:function(e,t,n,l){switch(t){case"s":return Ua(Ma,e);case"so":return n.ordinalNumber(e,{unit:"second"});default:return Ga(t.length,e)}},validate:function(e,t,n){return t>=0&&t<=59},set:function(e,t,n,l){return e.setUTCSeconds(n,0),e},incompatibleTokens:["t","T"]},S:{priority:30,parse:function(e,t,n,l){return Ga(t.length,e,(function(e){return Math.floor(e*Math.pow(10,3-t.length))}))},set:function(e,t,n,l){return e.setUTCMilliseconds(n),e},incompatibleTokens:["t","T"]},X:{priority:10,parse:function(e,t,n,l){switch(t){case"X":return Wa(Ha,e);case"XX":return Wa(ja,e);case"XXXX":return Wa(Aa,e);case"XXXXX":return Wa(Ya,e);case"XXX":default:return Wa(Va,e)}},set:function(e,t,n,l){return t.timestampIsSet?e:new Date(e.getTime()-n)},incompatibleTokens:["t","T","x"]},x:{priority:10,parse:function(e,t,n,l){switch(t){case"x":return Wa(Ha,e);case"xx":return Wa(ja,e);case"xxxx":return Wa(Aa,e);case"xxxxx":return Wa(Ya,e);case"xxx":default:return Wa(Va,e)}},set:function(e,t,n,l){return t.timestampIsSet?e:new Date(e.getTime()-n)},incompatibleTokens:["t","T","X"]},t:{priority:40,parse:function(e,t,n,l){return qa(e)},set:function(e,t,n,l){return[new Date(1e3*n),{timestampIsSet:!0}]},incompatibleTokens:"*"},T:{priority:20,parse:function(e,t,n,l){return qa(e)},set:function(e,t,n,l){return[new Date(n),{timestampIsSet:!0}]},incompatibleTokens:"*"}},ti=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,ni=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,li=/^'([^]*?)'?$/,oi=/''/g,ri=/\S/,ai=/[a-zA-Z]/;function ii(e,t,n,l){Co(3,arguments);var o=String(e),r=String(t),a=l||{},i=a.locale||Oo;if(!i.match)throw new RangeError("locale must contain match property");var d=i.options&&i.options.firstWeekContainsDate,u=null==d?1:Ro(d),s=null==a.firstWeekContainsDate?u:Ro(a.firstWeekContainsDate);if(!(s>=1&&s<=7))throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var c=i.options&&i.options.weekStartsOn,m=null==c?0:Ro(c),p=null==a.weekStartsOn?m:Ro(a.weekStartsOn);if(!(p>=0&&p<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");if(""===r)return""===o?Eo(n):new Date(NaN);var f,_={firstWeekContainsDate:s,weekStartsOn:p,locale:i},h=[{priority:10,subPriority:-1,set:di,index:0}],g=r.match(ni).map((function(e){var t=e[0];return"p"===t||"P"===t?(0,gr[t])(e,i.formatLong,_):e})).join("").match(ti),x=[];for(f=0;f0&&ri.test(o))return new Date(NaN);var S=h.map((function(e){return e.priority})).sort((function(e,t){return t-e})).filter((function(e,t,n){return n.indexOf(e)===t})).map((function(e){return h.filter((function(t){return t.priority===e})).sort((function(e,t){return t.subPriority-e.subPriority}))})).map((function(e){return e[0]})),P=Eo(n);if(isNaN(P))return new Date(NaN);var M=No(P,vr(P)),T={};for(f=0;f2)return n;if(/:/.test(l[0])?(n.date=null,t=l[0]):(n.date=l[0],t=l[1],ci.timeZoneDelimiter.test(n.date)&&(n.date=e.split(ci.timeZoneDelimiter)[0],t=e.substr(n.date.length,e.length))),t){var o=ci.timezone.exec(t);o?(n.time=t.replace(o[1],""),n.timezone=o[1]):n.time=t}return n}function hi(e,t){var n=new RegExp("^(?:(\\d{4}|[+-]\\d{"+(4+t)+"})|(\\d{2}|[+-]\\d{"+(2+t)+"})$)"),l=e.match(n);if(!l)return{year:null};var o=l[1]&&parseInt(l[1]),r=l[2]&&parseInt(l[2]);return{year:null==r?o:100*r,restDateString:e.slice((l[1]||l[2]).length)}}function gi(e,t){if(null===t)return null;var n=e.match(mi);if(!n)return null;var l=!!n[4],o=xi(n[1]),r=xi(n[2])-1,a=xi(n[3]),i=xi(n[4]),d=xi(n[5])-1;if(l)return function(e,t,n){return t>=1&&t<=53&&n>=0&&n<=6}(0,i,d)?function(e,t,n){var l=new Date(0);l.setUTCFullYear(e,0,4);var o=l.getUTCDay()||7,r=7*(t-1)+n+1-o;return l.setUTCDate(l.getUTCDate()+r),l}(t,i,d):new Date(NaN);var u=new Date(0);return function(e,t,n){return t>=0&&t<=11&&n>=1&&n<=(yi[t]||(ki(e)?29:28))}(t,r,a)&&function(e,t){return t>=1&&t<=(ki(e)?366:365)}(t,o)?(u.setUTCFullYear(t,r,Math.max(o,a)),u):new Date(NaN)}function xi(e){return e?parseInt(e):1}function bi(e){var t=e.match(pi);if(!t)return null;var n=vi(t[1]),l=vi(t[2]),o=vi(t[3]);return function(e,t,n){if(24===e)return 0===t&&0===n;return n>=0&&n<60&&t>=0&&t<60&&e>=0&&e<25}(n,l,o)?n*si+6e4*l+1e3*o:NaN}function vi(e){return e&&parseFloat(e.replace(",","."))||0}function wi(e){if("Z"===e)return 0;var t=e.match(fi);if(!t)return 0;var n="+"===t[1]?-1:1,l=parseInt(t[2]),o=t[3]&&parseInt(t[3])||0;return function(e,t){return t>=0&&t<=59}(0,o)?n*(l*si+6e4*o):NaN}var yi=[31,null,31,30,31,30,31,31,30,31,30,31];function ki(e){return e%400===0||e%4===0&&e%100}function Ci(e,t,n){return e===t||(e.correspondingElement?e.correspondingElement.classList.contains(n):e.classList.contains(n))}var Fi,Ei,Si=(void 0===Fi&&(Fi=0),function(){return++Fi}),Pi={},Mi={},Ti=["touchstart","touchmove"];function Di(e,t){var n=null;return-1!==Ti.indexOf(t)&&Ei&&(n={passive:!e.props.preventDefault}),n}function zi(e,t){var n,l,r=e.displayName||e.name||"Component";return l=n=function(n){var l,i;function d(e){var l;return(l=n.call(this,e)||this).__outsideClickHandler=function(e){if("function"!==typeof l.__clickOutsideHandlerProp){var t=l.getInstance();if("function"!==typeof t.props.handleClickOutside){if("function"!==typeof t.handleClickOutside)throw new Error("WrappedComponent: "+r+" lacks a handleClickOutside(event) function for processing outside click events.");t.handleClickOutside(e)}else t.props.handleClickOutside(e)}else l.__clickOutsideHandlerProp(e)},l.__getComponentNode=function(){var e=l.getInstance();return t&&"function"===typeof t.setClickOutsideRef?t.setClickOutsideRef()(e):"function"===typeof e.setClickOutsideRef?e.setClickOutsideRef():a.findDOMNode(e)},l.enableOnClickOutside=function(){if("undefined"!==typeof document&&!Mi[l._uid]){"undefined"===typeof Ei&&(Ei=function(){if("function"===typeof window.addEventListener){var e=!1,t=Object.defineProperty({},"passive",{get:function(){e=!0}}),n=function(){};return window.addEventListener("testPassiveEventSupport",n,t),window.removeEventListener("testPassiveEventSupport",n,t),e}}()),Mi[l._uid]=!0;var e=l.props.eventTypes;e.forEach||(e=[e]),Pi[l._uid]=function(e){var t;null!==l.componentNode&&(l.props.preventDefault&&e.preventDefault(),l.props.stopPropagation&&e.stopPropagation(),l.props.excludeScrollbar&&(t=e,document.documentElement.clientWidth<=t.clientX||document.documentElement.clientHeight<=t.clientY)||function(e,t,n){if(e===t)return!0;for(;e.parentNode;){if(Ci(e,t,n))return!0;e=e.parentNode}return e}(e.target,l.componentNode,l.props.outsideClickIgnoreClass)===document&&l.__outsideClickHandler(e))},e.forEach((function(e){document.addEventListener(e,Pi[l._uid],Di(l,e))}))}},l.disableOnClickOutside=function(){delete Mi[l._uid];var e=Pi[l._uid];if(e&&"undefined"!==typeof document){var t=l.props.eventTypes;t.forEach||(t=[t]),t.forEach((function(t){return document.removeEventListener(t,e,Di(l,t))})),delete Pi[l._uid]}},l.getRef=function(e){return l.instanceRef=e},l._uid=Si(),l}i=n,(l=d).prototype=Object.create(i.prototype),l.prototype.constructor=l,l.__proto__=i;var u=d.prototype;return u.getInstance=function(){if(!e.prototype.isReactComponent)return this;var t=this.instanceRef;return t.getInstance?t.getInstance():t},u.componentDidMount=function(){if("undefined"!==typeof document&&document.createElement){var e=this.getInstance();if(t&&"function"===typeof t.handleClickOutside&&(this.__clickOutsideHandlerProp=t.handleClickOutside(e),"function"!==typeof this.__clickOutsideHandlerProp))throw new Error("WrappedComponent: "+r+" lacks a function for processing outside click events specified by the handleClickOutside config option.");this.componentNode=this.__getComponentNode(),this.props.disableOnClickOutside||this.enableOnClickOutside()}},u.componentDidUpdate=function(){this.componentNode=this.__getComponentNode()},u.componentWillUnmount=function(){this.disableOnClickOutside()},u.render=function(){var t=this.props,n=(t.excludeScrollbar,function(e,t){if(null==e)return{};var n,l,o={},r=Object.keys(e);for(l=0;l=0||(o[n]=e[n]);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(t,["excludeScrollbar"]));return e.prototype.isReactComponent?n.ref=this.getRef:n.wrappedRef=this.getRef,n.disableOnClickOutside=this.disableOnClickOutside,n.enableOnClickOutside=this.enableOnClickOutside,o.createElement(e,n)},d}(o.Component),n.displayName="OnClickOutside("+r+")",n.defaultProps={eventTypes:["mousedown","touchstart"],excludeScrollbar:t&&t.excludeScrollbar||!1,outsideClickIgnoreClass:"ignore-react-onclickoutside",preventDefault:!1,stopPropagation:!1},n.getClass=function(){return e.getClass?e.getClass():e},l}var Ii,Bi=Object.prototype.toString,Oi=function(e){var t=Bi.call(e),n="[object Arguments]"===t;return n||(n="[object Array]"!==t&&null!==e&&"object"===typeof e&&"number"===typeof e.length&&e.length>=0&&"[object Function]"===Bi.call(e.callee)),n};if(!Object.keys){var Ri=Object.prototype.hasOwnProperty,Li=Object.prototype.toString,Ni=Oi,Hi=Object.prototype.propertyIsEnumerable,ji=!Hi.call({toString:null},"toString"),Ai=Hi.call((function(){}),"prototype"),Vi=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],Yi=function(e){var t=e.constructor;return t&&t.prototype===e},Ui={$applicationCache:!0,$console:!0,$external:!0,$frame:!0,$frameElement:!0,$frames:!0,$innerHeight:!0,$innerWidth:!0,$onmozfullscreenchange:!0,$onmozfullscreenerror:!0,$outerHeight:!0,$outerWidth:!0,$pageXOffset:!0,$pageYOffset:!0,$parent:!0,$scrollLeft:!0,$scrollTop:!0,$scrollX:!0,$scrollY:!0,$self:!0,$webkitIndexedDB:!0,$webkitStorageInfo:!0,$window:!0},Wi=function(){for(var e in window)try{if(!Ui["$"+e]&&Ri.call(window,e)&&null!==window[e]&&"object"===typeof window[e])try{Yi(window[e])}catch(dn){return!0}}catch(dn){return!0}return!1}();Ii=function(e){var t=null!==e&&"object"===typeof e,n="[object Function]"===Li.call(e),l=Ni(e),o=t&&"[object String]"===Li.call(e),r=[];if(!t&&!n&&!l)throw new TypeError("Object.keys called on a non-object");var a=Ai&&n;if(o&&e.length>0&&!Ri.call(e,0))for(var i=0;i0)for(var d=0;d=0&&"[object Array]"!==Ji.call(e)&&"[object Function]"===Ji.call(e.callee)},nd=function(){return ed(arguments)}();ed.isLegacyArguments=td;var ld=nd?ed:td,od="function"===typeof Symbol&&"symbol"===typeof Symbol("foo"),rd=Object.prototype.toString,ad=Array.prototype.concat,id=Object.defineProperty,dd=id&&function(){var e={};try{for(var t in id(e,"x",{enumerable:!1,value:e}),e)return!1;return e.x===e}catch(dn){return!1}}(),ud=function(e,t,n,l){var o;(!(t in e)||"function"===typeof(o=l)&&"[object Function]"===rd.call(o)&&l())&&(dd?id(e,t,{configurable:!0,enumerable:!1,value:n,writable:!0}):e[t]=n)},sd=function(e,t){var n=arguments.length>2?arguments[2]:{},l=Xi(t);od&&(l=ad.call(l,Object.getOwnPropertySymbols(t)));for(var o=0;o=0;l--)if(u[l]!=s[l])return!1;for(l=u.length-1;l>=0;l--)if(!Gd(e[o=u[l]],t[o],n))return!1;return!0}(e,t,l))}function Qd(e){return null===e||void 0===e}function Kd(e){return!(!e||"object"!==typeof e||"number"!==typeof e.length)&&("function"===typeof e.copy&&"function"===typeof e.slice&&!(e.length>0&&"number"!==typeof e[0]))}var $d=Gd,Xd="undefined"!==typeof document&&"undefined"!==typeof navigator,Zd=function(){for(var e=["Edge","Trident","Firefox"],t=0;t=0)return 1;return 0}();var Jd=Xd&&window.Promise?function(e){var t=!1;return function(){t||(t=!0,window.Promise.resolve().then((function(){t=!1,e()})))}}:function(e){var t=!1;return function(){t||(t=!0,setTimeout((function(){t=!1,e()}),Zd))}};function eu(e){return e&&"[object Function]"==={}.toString.call(e)}function tu(e,t){if(1!==e.nodeType)return[];var n=e.ownerDocument.defaultView.getComputedStyle(e,null);return t?n[t]:n}function nu(e){return"HTML"===e.nodeName?e:e.parentNode||e.host}function lu(e){if(!e)return document.body;switch(e.nodeName){case"HTML":case"BODY":return e.ownerDocument.body;case"#document":return e.body}var t=tu(e),n=t.overflow,l=t.overflowX,o=t.overflowY;return/(auto|scroll|overlay)/.test(n+o+l)?e:lu(nu(e))}function ou(e){return e&&e.referenceNode?e.referenceNode:e}var ru=Xd&&!(!window.MSInputMethodContext||!document.documentMode),au=Xd&&/MSIE 10/.test(navigator.userAgent);function iu(e){return 11===e?ru:10===e?au:ru||au}function du(e){if(!e)return document.documentElement;for(var t=iu(10)?document.body:null,n=e.offsetParent||null;n===t&&e.nextElementSibling;)n=(e=e.nextElementSibling).offsetParent;var l=n&&n.nodeName;return l&&"BODY"!==l&&"HTML"!==l?-1!==["TH","TD","TABLE"].indexOf(n.nodeName)&&"static"===tu(n,"position")?du(n):n:e?e.ownerDocument.documentElement:document.documentElement}function uu(e){return null!==e.parentNode?uu(e.parentNode):e}function su(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return document.documentElement;var n=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,l=n?e:t,o=n?t:e,r=document.createRange();r.setStart(l,0),r.setEnd(o,0);var a=r.commonAncestorContainer;if(e!==a&&t!==a||l.contains(o))return function(e){var t=e.nodeName;return"BODY"!==t&&("HTML"===t||du(e.firstElementChild)===e)}(a)?a:du(a);var i=uu(e);return i.host?su(i.host,t):su(e,uu(t).host)}function cu(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"top",n="top"===t?"scrollTop":"scrollLeft",l=e.nodeName;if("BODY"===l||"HTML"===l){var o=e.ownerDocument.documentElement,r=e.ownerDocument.scrollingElement||o;return r[n]}return e[n]}function mu(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],l=cu(t,"top"),o=cu(t,"left"),r=n?-1:1;return e.top+=l*r,e.bottom+=l*r,e.left+=o*r,e.right+=o*r,e}function pu(e,t){var n="x"===t?"Left":"Top",l="Left"===n?"Right":"Bottom";return parseFloat(e["border"+n+"Width"])+parseFloat(e["border"+l+"Width"])}function fu(e,t,n,l){return Math.max(t["offset"+e],t["scroll"+e],n["client"+e],n["offset"+e],n["scroll"+e],iu(10)?parseInt(n["offset"+e])+parseInt(l["margin"+("Height"===e?"Top":"Left")])+parseInt(l["margin"+("Height"===e?"Bottom":"Right")]):0)}function _u(e){var t=e.body,n=e.documentElement,l=iu(10)&&getComputedStyle(n);return{height:fu("Height",t,n,l),width:fu("Width",t,n,l)}}var hu=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},gu=function(){function e(e,t){for(var n=0;n2&&void 0!==arguments[2]&&arguments[2],l=iu(10),o="HTML"===t.nodeName,r=wu(e),a=wu(t),i=lu(e),d=tu(t),u=parseFloat(d.borderTopWidth),s=parseFloat(d.borderLeftWidth);n&&o&&(a.top=Math.max(a.top,0),a.left=Math.max(a.left,0));var c=vu({top:r.top-a.top-u,left:r.left-a.left-s,width:r.width,height:r.height});if(c.marginTop=0,c.marginLeft=0,!l&&o){var m=parseFloat(d.marginTop),p=parseFloat(d.marginLeft);c.top-=u-m,c.bottom-=u-m,c.left-=s-p,c.right-=s-p,c.marginTop=m,c.marginLeft=p}return(l&&!n?t.contains(i):t===i&&"BODY"!==i.nodeName)&&(c=mu(c,t)),c}function ku(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=e.ownerDocument.documentElement,l=yu(e,n),o=Math.max(n.clientWidth,window.innerWidth||0),r=Math.max(n.clientHeight,window.innerHeight||0),a=t?0:cu(n),i=t?0:cu(n,"left"),d={top:a-l.top+l.marginTop,left:i-l.left+l.marginLeft,width:o,height:r};return vu(d)}function Cu(e){var t=e.nodeName;if("BODY"===t||"HTML"===t)return!1;if("fixed"===tu(e,"position"))return!0;var n=nu(e);return!!n&&Cu(n)}function Fu(e){if(!e||!e.parentElement||iu())return document.documentElement;for(var t=e.parentElement;t&&"none"===tu(t,"transform");)t=t.parentElement;return t||document.documentElement}function Eu(e,t,n,l){var o=arguments.length>4&&void 0!==arguments[4]&&arguments[4],r={top:0,left:0},a=o?Fu(e):su(e,ou(t));if("viewport"===l)r=ku(a,o);else{var i=void 0;"scrollParent"===l?"BODY"===(i=lu(nu(t))).nodeName&&(i=e.ownerDocument.documentElement):i="window"===l?e.ownerDocument.documentElement:l;var d=yu(i,a,o);if("HTML"!==i.nodeName||Cu(a))r=d;else{var u=_u(e.ownerDocument),s=u.height,c=u.width;r.top+=d.top-d.marginTop,r.bottom=s+d.top,r.left+=d.left-d.marginLeft,r.right=c+d.left}}var m="number"===typeof(n=n||0);return r.left+=m?n:n.left||0,r.top+=m?n:n.top||0,r.right-=m?n:n.right||0,r.bottom-=m?n:n.bottom||0,r}function Su(e){return e.width*e.height}function Pu(e,t,n,l,o){var r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0;if(-1===e.indexOf("auto"))return e;var a=Eu(n,l,r,o),i={top:{width:a.width,height:t.top-a.top},right:{width:a.right-t.right,height:a.height},bottom:{width:a.width,height:a.bottom-t.bottom},left:{width:t.left-a.left,height:a.height}},d=Object.keys(i).map((function(e){return bu({key:e},i[e],{area:Su(i[e])})})).sort((function(e,t){return t.area-e.area})),u=d.filter((function(e){var t=e.width,l=e.height;return t>=n.clientWidth&&l>=n.clientHeight})),s=u.length>0?u[0].key:d[0].key,c=e.split("-")[1];return s+(c?"-"+c:"")}function Mu(e,t,n){var l=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,o=l?Fu(t):su(t,ou(n));return yu(n,o,l)}function Tu(e){var t=e.ownerDocument.defaultView.getComputedStyle(e),n=parseFloat(t.marginTop||0)+parseFloat(t.marginBottom||0),l=parseFloat(t.marginLeft||0)+parseFloat(t.marginRight||0);return{width:e.offsetWidth+l,height:e.offsetHeight+n}}function Du(e){var t={left:"right",right:"left",bottom:"top",top:"bottom"};return e.replace(/left|right|bottom|top/g,(function(e){return t[e]}))}function zu(e,t,n){n=n.split("-")[0];var l=Tu(e),o={width:l.width,height:l.height},r=-1!==["right","left"].indexOf(n),a=r?"top":"left",i=r?"left":"top",d=r?"height":"width",u=r?"width":"height";return o[a]=t[a]+t[d]/2-l[d]/2,o[i]=n===i?t[i]-l[u]:t[Du(i)],o}function Iu(e,t){return Array.prototype.find?e.find(t):e.filter(t)[0]}function Bu(e,t,n){return(void 0===n?e:e.slice(0,function(e,t,n){if(Array.prototype.findIndex)return e.findIndex((function(e){return e[t]===n}));var l=Iu(e,(function(e){return e[t]===n}));return e.indexOf(l)}(e,"name",n))).forEach((function(e){e.function&&console.warn("`modifier.function` is deprecated, use `modifier.fn`!");var n=e.function||e.fn;e.enabled&&eu(n)&&(t.offsets.popper=vu(t.offsets.popper),t.offsets.reference=vu(t.offsets.reference),t=n(t,e))})),t}function Ou(){if(!this.state.isDestroyed){var e={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:!1,offsets:{}};e.offsets.reference=Mu(this.state,this.popper,this.reference,this.options.positionFixed),e.placement=Pu(this.options.placement,e.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding),e.originalPlacement=e.placement,e.positionFixed=this.options.positionFixed,e.offsets.popper=zu(this.popper,e.offsets.reference,e.placement),e.offsets.popper.position=this.options.positionFixed?"fixed":"absolute",e=Bu(this.modifiers,e),this.state.isCreated?this.options.onUpdate(e):(this.state.isCreated=!0,this.options.onCreate(e))}}function Ru(e,t){return e.some((function(e){var n=e.name;return e.enabled&&n===t}))}function Lu(e){for(var t=[!1,"ms","Webkit","Moz","O"],n=e.charAt(0).toUpperCase()+e.slice(1),l=0;l1&&void 0!==arguments[1]&&arguments[1],n=Ku.indexOf(e),l=Ku.slice(n+1).concat(Ku.slice(0,n));return t?l.reverse():l}var Xu="flip",Zu="clockwise",Ju="counterclockwise";function es(e,t,n,l){var o=[0,0],r=-1!==["right","left"].indexOf(l),a=e.split(/(\+|\-)/).map((function(e){return e.trim()})),i=a.indexOf(Iu(a,(function(e){return-1!==e.search(/,|\s/)})));a[i]&&-1===a[i].indexOf(",")&&console.warn("Offsets separated by white space(s) are deprecated, use a comma (,) instead.");var d=/\s*,\s*|\s+/,u=-1!==i?[a.slice(0,i).concat([a[i].split(d)[0]]),[a[i].split(d)[1]].concat(a.slice(i+1))]:[a];return(u=u.map((function(e,l){var o=(1===l?!r:r)?"height":"width",a=!1;return e.reduce((function(e,t){return""===e[e.length-1]&&-1!==["+","-"].indexOf(t)?(e[e.length-1]=t,a=!0,e):a?(e[e.length-1]+=t,a=!1,e):e.concat(t)}),[]).map((function(e){return function(e,t,n,l){var o=e.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),r=+o[1],a=o[2];if(!r)return e;if(0===a.indexOf("%")){var i=void 0;switch(a){case"%p":i=n;break;case"%":case"%r":default:i=l}return vu(i)[t]/100*r}if("vh"===a||"vw"===a)return("vh"===a?Math.max(document.documentElement.clientHeight,window.innerHeight||0):Math.max(document.documentElement.clientWidth,window.innerWidth||0))/100*r;return r}(e,o,t,n)}))}))).forEach((function(e,t){e.forEach((function(n,l){Uu(n)&&(o[t]+=n*("-"===e[l-1]?-1:1))}))})),o}var ts={placement:"bottom",positionFixed:!1,eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(e){var t=e.placement,n=t.split("-")[0],l=t.split("-")[1];if(l){var o=e.offsets,r=o.reference,a=o.popper,i=-1!==["bottom","top"].indexOf(n),d=i?"left":"top",u=i?"width":"height",s={start:xu({},d,r[d]),end:xu({},d,r[d]+r[u]-a[u])};e.offsets.popper=bu({},a,s[l])}return e}},offset:{order:200,enabled:!0,fn:function(e,t){var n=t.offset,l=e.placement,o=e.offsets,r=o.popper,a=o.reference,i=l.split("-")[0],d=void 0;return d=Uu(+n)?[+n,0]:es(n,r,a,i),"left"===i?(r.top+=d[0],r.left-=d[1]):"right"===i?(r.top+=d[0],r.left+=d[1]):"top"===i?(r.left+=d[0],r.top-=d[1]):"bottom"===i&&(r.left+=d[0],r.top+=d[1]),e.popper=r,e},offset:0},preventOverflow:{order:300,enabled:!0,fn:function(e,t){var n=t.boundariesElement||du(e.instance.popper);e.instance.reference===n&&(n=du(n));var l=Lu("transform"),o=e.instance.popper.style,r=o.top,a=o.left,i=o[l];o.top="",o.left="",o[l]="";var d=Eu(e.instance.popper,e.instance.reference,t.padding,n,e.positionFixed);o.top=r,o.left=a,o[l]=i,t.boundaries=d;var u=t.priority,s=e.offsets.popper,c={primary:function(e){var n=s[e];return s[e]d[e]&&!t.escapeWithReference&&(l=Math.min(s[n],d[e]-("right"===e?s.width:s.height))),xu({},n,l)}};return u.forEach((function(e){var t=-1!==["left","top"].indexOf(e)?"primary":"secondary";s=bu({},s,c[t](e))})),e.offsets.popper=s,e},priority:["left","right","top","bottom"],padding:5,boundariesElement:"scrollParent"},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,n=t.popper,l=t.reference,o=e.placement.split("-")[0],r=Math.floor,a=-1!==["top","bottom"].indexOf(o),i=a?"right":"bottom",d=a?"left":"top",u=a?"width":"height";return n[i]r(l[i])&&(e.offsets.popper[d]=r(l[i])),e}},arrow:{order:500,enabled:!0,fn:function(e,t){var n;if(!Gu(e.instance.modifiers,"arrow","keepTogether"))return e;var l=t.element;if("string"===typeof l){if(!(l=e.instance.popper.querySelector(l)))return e}else if(!e.instance.popper.contains(l))return console.warn("WARNING: `arrow.element` must be child of its popper element!"),e;var o=e.placement.split("-")[0],r=e.offsets,a=r.popper,i=r.reference,d=-1!==["left","right"].indexOf(o),u=d?"height":"width",s=d?"Top":"Left",c=s.toLowerCase(),m=d?"left":"top",p=d?"bottom":"right",f=Tu(l)[u];i[p]-fa[p]&&(e.offsets.popper[c]+=i[c]+f-a[p]),e.offsets.popper=vu(e.offsets.popper);var _=i[c]+i[u]/2-f/2,h=tu(e.instance.popper),g=parseFloat(h["margin"+s]),x=parseFloat(h["border"+s+"Width"]),b=_-e.offsets.popper[c]-g-x;return b=Math.max(Math.min(a[u]-f,b),0),e.arrowElement=l,e.offsets.arrow=(xu(n={},c,Math.round(b)),xu(n,m,""),n),e},element:"[x-arrow]"},flip:{order:600,enabled:!0,fn:function(e,t){if(Ru(e.instance.modifiers,"inner"))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var n=Eu(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement,e.positionFixed),l=e.placement.split("-")[0],o=Du(l),r=e.placement.split("-")[1]||"",a=[];switch(t.behavior){case Xu:a=[l,o];break;case Zu:a=$u(l);break;case Ju:a=$u(l,!0);break;default:a=t.behavior}return a.forEach((function(i,d){if(l!==i||a.length===d+1)return e;l=e.placement.split("-")[0],o=Du(l);var u=e.offsets.popper,s=e.offsets.reference,c=Math.floor,m="left"===l&&c(u.right)>c(s.left)||"right"===l&&c(u.left)c(s.top)||"bottom"===l&&c(u.top)c(n.right),_=c(u.top)c(n.bottom),g="left"===l&&p||"right"===l&&f||"top"===l&&_||"bottom"===l&&h,x=-1!==["top","bottom"].indexOf(l),b=!!t.flipVariations&&(x&&"start"===r&&p||x&&"end"===r&&f||!x&&"start"===r&&_||!x&&"end"===r&&h),v=!!t.flipVariationsByContent&&(x&&"start"===r&&f||x&&"end"===r&&p||!x&&"start"===r&&h||!x&&"end"===r&&_),w=b||v;(m||g||w)&&(e.flipped=!0,(m||g)&&(l=a[d+1]),w&&(r=function(e){return"end"===e?"start":"start"===e?"end":e}(r)),e.placement=l+(r?"-"+r:""),e.offsets.popper=bu({},e.offsets.popper,zu(e.instance.popper,e.offsets.reference,e.placement)),e=Bu(e.instance.modifiers,e,"flip"))})),e},behavior:"flip",padding:5,boundariesElement:"viewport",flipVariations:!1,flipVariationsByContent:!1},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,n=t.split("-")[0],l=e.offsets,o=l.popper,r=l.reference,a=-1!==["left","right"].indexOf(n),i=-1===["top","left"].indexOf(n);return o[a?"left":"top"]=r[n]-(i?o[a?"width":"height"]:0),e.placement=Du(t),e.offsets.popper=vu(o),e}},hide:{order:800,enabled:!0,fn:function(e){if(!Gu(e.instance.modifiers,"hide","preventOverflow"))return e;var t=e.offsets.reference,n=Iu(e.instance.modifiers,(function(e){return"preventOverflow"===e.name})).boundaries;if(t.bottomn.right||t.top>n.bottom||t.right2&&void 0!==arguments[2]?arguments[2]:{};hu(this,e),this.scheduleUpdate=function(){return requestAnimationFrame(l.update)},this.update=Jd(this.update.bind(this)),this.options=bu({},e.Defaults,o),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=t&&t.jquery?t[0]:t,this.popper=n&&n.jquery?n[0]:n,this.options.modifiers={},Object.keys(bu({},e.Defaults.modifiers,o.modifiers)).forEach((function(t){l.options.modifiers[t]=bu({},e.Defaults.modifiers[t]||{},o.modifiers?o.modifiers[t]:{})})),this.modifiers=Object.keys(this.options.modifiers).map((function(e){return bu({name:e},l.options.modifiers[e])})).sort((function(e,t){return e.order-t.order})),this.modifiers.forEach((function(e){e.enabled&&eu(e.onLoad)&&e.onLoad(l.reference,l.popper,l.options,e,l.state)})),this.update();var r=this.options.eventsEnabled;r&&this.enableEventListeners(),this.state.eventsEnabled=r}return gu(e,[{key:"update",value:function(){return Ou.call(this)}},{key:"destroy",value:function(){return Nu.call(this)}},{key:"enableEventListeners",value:function(){return Vu.call(this)}},{key:"disableEventListeners",value:function(){return Yu.call(this)}}]),e}();ns.Utils=window.PopperUtils,ns.placements=Qu,ns.Defaults=ts;var ls="__global_unique_id__",os=function(){return tn[ls]=(tn[ls]||0)+1},rs=function(){},as=rs,is=ln((function(e,t){t.__esModule=!0;o(r);var n=o(zn),l=o(os);o(as);function o(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!==typeof t&&"function"!==typeof t?e:t}function d(e,t){if("function"!==typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var u=1073741823;function s(e){var t=[];return{on:function(e){t.push(e)},off:function(e){t=t.filter((function(t){return t!==e}))},get:function(){return e},set:function(n,l){e=n,t.forEach((function(t){return t(e,l)}))}}}t.default=function(e,t){var o,c,m="__create-react-context-"+(0,l.default)()+"__",p=function(e){function n(){var t,l;a(this,n);for(var o=arguments.length,r=Array(o),d=0;d1?t-1:0),l=1;l0&&(o=ii(e,t.slice(0,e.length),new Date)),As(o)||(o=new Date(e))),As(o)&&a?o:null)}function As(e){return So(e)&&_a(e,new Date("1/1/1000"))}function Vs(e,t,n){if("en"===n)return Dr(e,t,{awareOfUnicodeTokens:!0});var l=lc(n);return n&&!l&&console.warn('A locale object was not found for the provided string ["'.concat(n,'"].')),!l&&nc()&&lc(nc())&&(l=lc(nc())),Dr(e,t,{locale:l||null,awareOfUnicodeTokens:!0})}function Ys(e,t){var n=t.hour,l=void 0===n?0:n,o=t.minute,r=void 0===o?0:o,a=t.second;return na(ta(function(e,t){Co(2,arguments);var n=Eo(e),l=Ro(t);return n.setSeconds(l),n}(e,void 0===a?0:a),r),l)}function Us(e,t){var n=t&&lc(t)||nc()&&lc(nc());return function(e,t){Co(1,arguments);var n=Eo(e),l=Gr(n,t).getTime()-Kr(n,t).getTime();return Math.round(l/$r)+1}(e,n?{locale:n}:null)}function Ws(e,t){return Vs(e,"ddd",t)}function qs(e){return ua(e)}function Gs(e,t){return Gr(e,{locale:lc(t||nc())})}function Qs(e){return function(e){Co(1,arguments);var t=Eo(e);return t.setDate(1),t.setHours(0,0,0,0),t}(e)}function Ks(e){return fa(e)}function $s(e,t){return e&&t?function(e,t){Co(2,arguments);var n=Eo(e),l=Eo(t);return n.getFullYear()===l.getFullYear()}(e,t):!e&&!t}function Xs(e,t){return e&&t?function(e,t){Co(2,arguments);var n=Eo(e),l=Eo(t);return n.getFullYear()===l.getFullYear()&&n.getMonth()===l.getMonth()}(e,t):!e&&!t}function Zs(e,t){return e&&t?function(e,t){Co(2,arguments);var n=fa(e),l=fa(t);return n.getTime()===l.getTime()}(e,t):!e&&!t}function Js(e,t){return e&&t?function(e,t){Co(2,arguments);var n=ua(e),l=ua(t);return n.getTime()===l.getTime()}(e,t):!e&&!t}function ec(e,t){return e&&t?function(e,t){Co(2,arguments);var n=Eo(e),l=Eo(t);return n.getTime()===l.getTime()}(e,t):!e&&!t}function tc(e,t,n){var l,o=ua(t),r=function(e){Co(1,arguments);var t=Eo(e);return t.setHours(23,59,59,999),t}(n);try{l=ga(e,{start:o,end:r})}catch(e){l=!1}return l}function nc(){return window.__localeId__}function lc(e){if("string"==typeof e){var t=window;return t.__localeData__?t.__localeData__[e]:null}return e}function oc(e,t){return Vs(oa(Hs(),e),"LLLL",t)}function rc(e,t){return Vs(oa(Hs(),e),"LLL",t)}function ac(e,t){return Vs(ra(Hs(),e),"QQQ",t)}function ic(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.minDate,l=t.maxDate,o=t.excludeDates,r=t.includeDates,a=t.filterDate;return pc(e,{minDate:n,maxDate:l})||o&&o.some((function(t){return Js(e,t)}))||r&&!r.some((function(t){return Js(e,t)}))||a&&!a(Hs(e))||!1}function dc(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.excludeDates;return n&&n.some((function(t){return Js(e,t)}))||!1}function uc(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.minDate,l=t.maxDate,o=t.excludeDates,r=t.includeDates,a=t.filterDate;return pc(e,{minDate:n,maxDate:l})||o&&o.some((function(t){return Xs(e,t)}))||r&&!r.some((function(t){return Xs(e,t)}))||a&&!a(Hs(e))||!1}function sc(e,t,n,l){var o=Jr(e),r=Xr(e),a=Jr(t),i=Xr(t),d=Jr(l);return o===a&&o===d?r<=n&&n<=i:o=n||do:void 0}function cc(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.minDate,l=t.maxDate,o=t.excludeDates,r=t.includeDates,a=t.filterDate;return pc(e,{minDate:n,maxDate:l})||o&&o.some((function(t){return Zs(e,t)}))||r&&!r.some((function(t){return Zs(e,t)}))||a&&!a(Hs(e))||!1}function mc(e,t,n,l){var o=Jr(e),r=Zr(e),a=Jr(t),i=Zr(t),d=Jr(l);return o===a&&o===d?r<=n&&n<=i:o=n||do:void 0}function pc(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.minDate,l=t.maxDate;return n&&ca(e,n)<0||l&&ca(e,l)>0}function fc(e,t){for(var n=t.length,l=0;l1&&void 0!==arguments[1]?arguments[1]:{},n=t.minDate,l=t.includeDates,o=jr(e,1);return n&&ma(n,o)>0||l&&l.every((function(e){return ma(e,o)>0}))||!1}function gc(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.maxDate,l=t.includeDates,o=Nr(e,1);return n&&ma(o,n)>0||l&&l.every((function(e){return ma(o,e)>0}))||!1}function xc(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.minDate,l=t.includeDates,o=Ar(e,1);return n&&pa(n,o)>0||l&&l.every((function(e){return pa(e,o)>0}))||!1}function bc(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.maxDate,l=t.includeDates,o=Hr(e,1);return n&&pa(o,n)>0||l&&l.every((function(e){return pa(o,e)>0}))||!1}function vc(e){var t=e.minDate,n=e.includeDates;return n&&t?ia(n.filter((function(e){return ca(e,t)>=0}))):n?ia(n):t}function wc(e){var t=e.maxDate,n=e.includeDates;return n&&t?da(n.filter((function(e){return ca(e,t)<=0}))):n?da(n):t}function yc(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"react-datepicker__day--highlighted",n=new Map,l=0,o=e.length;l=a),i&&o.push(a)}return o}var Ec=zi(function(e){Ms(n,r.Component);var t=Bs(n);function n(e){var l;ys(this,n),Fs(zs(l=t.call(this,e)),"renderOptions",(function(){var e=l.props.year,t=l.state.yearsList.map((function(t){return r.createElement("div",{className:e===t?"react-datepicker__year-option react-datepicker__year-option--selected_year":"react-datepicker__year-option",key:t,onClick:l.onChange.bind(zs(l),t)},e===t?r.createElement("span",{className:"react-datepicker__year-option--selected"},"\u2713"):"",t)})),n=l.props.minDate?Jr(l.props.minDate):null,o=l.props.maxDate?Jr(l.props.maxDate):null;return o&&l.state.yearsList.find((function(e){return e===o}))||t.unshift(r.createElement("div",{className:"react-datepicker__year-option",key:"upcoming",onClick:l.incrementYears},r.createElement("a",{className:"react-datepicker__navigation react-datepicker__navigation--years react-datepicker__navigation--years-upcoming"}))),n&&l.state.yearsList.find((function(e){return e===n}))||t.push(r.createElement("div",{className:"react-datepicker__year-option",key:"previous",onClick:l.decrementYears},r.createElement("a",{className:"react-datepicker__navigation react-datepicker__navigation--years react-datepicker__navigation--years-previous"}))),t})),Fs(zs(l),"onChange",(function(e){l.props.onChange(e)})),Fs(zs(l),"handleClickOutside",(function(){l.props.onCancel()})),Fs(zs(l),"shiftYears",(function(e){var t=l.state.yearsList.map((function(t){return t+e}));l.setState({yearsList:t})})),Fs(zs(l),"incrementYears",(function(){return l.shiftYears(1)})),Fs(zs(l),"decrementYears",(function(){return l.shiftYears(-1)}));var o=e.yearDropdownItemNumber,a=e.scrollableYearDropdown,i=o||(a?10:5);return l.state={yearsList:Fc(l.props.year,i,l.props.minDate,l.props.maxDate)},l}return Cs(n,[{key:"render",value:function(){var e=ko({"react-datepicker__year-dropdown":!0,"react-datepicker__year-dropdown--scrollable":this.props.scrollableYearDropdown});return r.createElement("div",{className:e},this.renderOptions())}}]),n}()),Sc=function(e){Ms(n,r.Component);var t=Bs(n);function n(){var e;ys(this,n);for(var l=arguments.length,o=new Array(l),a=0;a0&&void 0!==arguments[0]?arguments[0]:{},n=!1;0===e.getTabIndex()&&!t.isInputFocused&&e.isSameDay(e.props.preSelection)&&(document.activeElement&&document.activeElement!==document.body||(n=!0),e.props.containerRef&&e.props.containerRef.current&&e.props.containerRef.current.contains(document.activeElement)&&document.activeElement.classList.contains("react-datepicker__day")&&(n=!0)),n&&e.dayEl.current.focus()})),Fs(zs(e),"render",(function(){return r.createElement("div",{ref:e.dayEl,className:e.getClassNames(e.props.day),onKeyDown:e.handleOnKeyDown,onClick:e.handleClick,onMouseEnter:e.handleMouseEnter,tabIndex:e.getTabIndex(),"aria-label":e.getAriaLabel(),role:"button","aria-disabled":e.isDisabled()},e.props.renderDayContents?e.props.renderDayContents(qr(e.props.day),e.props.day):qr(e.props.day))})),e}return Cs(n,[{key:"componentDidMount",value:function(){this.handleFocusDay()}},{key:"componentDidUpdate",value:function(e){this.handleFocusDay(e)}}]),n}(),Bc=function(e){Ms(n,r.Component);var t=Bs(n);function n(){var e;ys(this,n);for(var l=arguments.length,o=new Array(l),r=0;r=6,d=!n&&!e.isWeekInMonth(l);if(i||d){if(!e.props.peekNextMonth)break;a=!0}}return t})),Fs(zs(e),"onMonthClick",(function(t,n){e.handleDayClick(Qs(oa(e.props.day,n)),t)})),Fs(zs(e),"onQuarterClick",(function(t,n){e.handleDayClick(Ks(ra(e.props.day,n)),t)})),Fs(zs(e),"getMonthClassNames",(function(t){var n=e.props,l=n.day,o=n.startDate,r=n.endDate,a=n.selected,i=n.minDate,d=n.maxDate;return ko("react-datepicker__month-text","react-datepicker__month-".concat(t),{"react-datepicker__month--disabled":(i||d)&&uc(oa(l,t),e.props),"react-datepicker__month--selected":Xr(l)===t&&Jr(l)===Jr(a),"react-datepicker__month--in-range":sc(o,r,t,l),"react-datepicker__month--range-start":e.isRangeStartMonth(t),"react-datepicker__month--range-end":e.isRangeEndMonth(t)})})),Fs(zs(e),"getQuarterClassNames",(function(t){var n=e.props,l=n.day,o=n.startDate,r=n.endDate,a=n.selected,i=n.minDate,d=n.maxDate;return ko("react-datepicker__quarter-text","react-datepicker__quarter-".concat(t),{"react-datepicker__quarter--disabled":(i||d)&&cc(ra(l,t),e.props),"react-datepicker__quarter--selected":Zr(l)===t&&Jr(l)===Jr(a),"react-datepicker__quarter--in-range":mc(o,r,t,l),"react-datepicker__quarter--range-start":e.isRangeStartQuarter(t),"react-datepicker__quarter--range-end":e.isRangeEndQuarter(t)})})),Fs(zs(e),"renderMonths",(function(){var t=e.props,n=t.showFullMonthYearPicker,l=t.locale;return[[0,1,2],[3,4,5],[6,7,8],[9,10,11]].map((function(t,o){return r.createElement("div",{className:"react-datepicker__month-wrapper",key:o},t.map((function(t,o){return r.createElement("div",{key:o,onClick:function(n){e.onMonthClick(n,t)},className:e.getMonthClassNames(t)},n?oc(t,l):rc(t,l))})))}))})),Fs(zs(e),"renderQuarters",(function(){return r.createElement("div",{className:"react-datepicker__quarter-wrapper"},[1,2,3,4].map((function(t,n){return r.createElement("div",{key:n,onClick:function(n){e.onQuarterClick(n,t)},className:e.getQuarterClassNames(t)},ac(t,e.props.locale))})))})),Fs(zs(e),"getClassNames",(function(){var t=e.props,n=t.selectingDate,l=t.selectsStart,o=t.selectsEnd,r=t.showMonthYearPicker,a=t.showQuarterYearPicker;return ko("react-datepicker__month",{"react-datepicker__month--selecting-range":n&&(l||o)},{"react-datepicker__monthPicker":r},{"react-datepicker__quarterPicker":a})})),e}return Cs(n,[{key:"render",value:function(){var e=this.props,t=e.showMonthYearPicker,n=e.showQuarterYearPicker,l=e.day,o=e.ariaLabelPrefix,a=void 0===o?"month ":o;return r.createElement("div",{className:this.getClassNames(),onMouseLeave:this.handleMouseLeave,"aria-label":"".concat(a," ").concat(Vs(l,"yyyy-MM"))},t?this.renderMonths():n?this.renderQuarters():this.renderWeeks())}}]),n}(),Lc=function(e){Ms(n,r.Component);var t=Bs(n);function n(){var e;ys(this,n);for(var l=arguments.length,o=new Array(l),a=0;a=Yr(t)&&(e.centerLi=n)}},Vs(t,n,e.props.locale))}))})),e}return Cs(n,[{key:"componentDidMount",value:function(){this.list.scrollTop=n.calcCenterPosition(this.props.monthRef?this.props.monthRef.clientHeight-this.header.clientHeight:this.list.clientHeight,this.centerLi),this.props.monthRef&&this.header&&this.setState({height:this.props.monthRef.clientHeight-this.header.clientHeight})}},{key:"render",value:function(){var e=this,t=this.state.height;return r.createElement("div",{className:"react-datepicker__time-container ".concat(this.props.todayButton?"react-datepicker__time-container--with-today-button":"")},r.createElement("div",{className:"react-datepicker__header react-datepicker__header--time",ref:function(t){e.header=t}},r.createElement("div",{className:"react-datepicker-time__header"},this.props.timeCaption)),r.createElement("div",{className:"react-datepicker__time"},r.createElement("div",{className:"react-datepicker__time-box"},r.createElement("ul",{className:"react-datepicker__time-list",ref:function(t){e.list=t},style:t?{height:t}:{}},this.renderTimes()))))}}],[{key:"defaultProps",get:function(){return{intervals:30,onTimeChange:function(){},todayButton:null,timeCaption:"Time"}}}]),n}();Fs(Lc,"calcCenterPosition",(function(e,t){return t.offsetTop-(e/2-t.clientHeight/2)}));var Nc=function(e){Ms(n,r.Component);var t=Bs(n);function n(e){var l;return ys(this,n),Fs(zs(l=t.call(this,e)),"handleYearClick",(function(e,t){l.props.onDayClick&&l.props.onDayClick(e,t)})),Fs(zs(l),"onYearClick",(function(e,t){l.handleYearClick(function(e){Co(1,arguments);var t=Eo(e),n=new Date(0);return n.setFullYear(t.getFullYear(),0,1),n.setHours(0,0,0,0),n}(aa(l.props.date,t)),e)})),l}return Cs(n,[{key:"render",value:function(){for(var e=this,t=[],n=this.props.date,l=function(n,l){t.push(r.createElement("div",{onClick:function(t){e.onYearClick(t,n)},className:"react-datepicker__year-container-text",key:n},n))},o=Jr(n)-11,a=0;o<=Jr(n);o++,a++)l(o);return r.createElement("div",{className:"react-datepicker__year-container"},t)}}]),n}(),Hc=function(e){Ms(n,r.Component);var t=Bs(n);function n(e){var l;return ys(this,n),Fs(zs(l=t.call(this,e)),"onTimeChange",(function(e){l.setState({time:e});var t=new Date;t.setHours(e.split(":")[0]),t.setMinutes(e.split(":")[1]),l.props.onChange(t)})),Fs(zs(l),"renderTimeInput",(function(){var e=l.state.time,t=l.props,n=t.timeString,o=t.customTimeInput;return o?r.cloneElement(o,{value:e,onChange:l.onTimeChange}):r.createElement("input",{type:"time",className:"react-datepicker-time__input",placeholder:"Time",name:"time-input",required:!0,value:e,onChange:function(e){l.onTimeChange(e.target.value||n)}})})),l.state={time:l.props.timeString},l}return Cs(n,[{key:"render",value:function(){return r.createElement("div",{className:"react-datepicker__input-time-container"},r.createElement("div",{className:"react-datepicker-time__caption"},this.props.timeInputLabel),r.createElement("div",{className:"react-datepicker-time__input-container"},r.createElement("div",{className:"react-datepicker-time__input"},this.renderTimeInput())))}}]),n}();function jc(e){var t=e.className,n=e.children,l=e.showPopperArrow,o=e.arrowProps,a=void 0===o?{}:o;return r.createElement("div",{className:t},l&&r.createElement("div",Es({className:"react-datepicker__triangle"},a)),n)}var Ac=["react-datepicker__year-select","react-datepicker__month-select","react-datepicker__month-year-select"],Vc=function(e){Ms(n,r.Component);var t=Bs(n);function n(e){var l;return ys(this,n),Fs(zs(l=t.call(this,e)),"handleClickOutside",(function(e){l.props.onClickOutside(e)})),Fs(zs(l),"setClickOutsideRef",(function(){return l.containerRef.current})),Fs(zs(l),"handleDropdownFocus",(function(e){(function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=(e.className||"").split(/\s+/);return Ac.some((function(e){return t.indexOf(e)>=0}))})(e.target)&&l.props.onDropdownFocus()})),Fs(zs(l),"getDateInView",(function(){var e=l.props,t=e.preSelection,n=e.selected,o=e.openToDate,r=vc(l.props),a=wc(l.props),i=Hs();return o||n||t||(r&&ha(i,r)?r:a&&_a(i,a)?a:i)})),Fs(zs(l),"increaseMonth",(function(){l.setState((function(e){return{date:Nr(e.date,1)}}),(function(){return l.handleMonthChange(l.state.date)}))})),Fs(zs(l),"decreaseMonth",(function(){l.setState((function(e){return{date:jr(e.date,1)}}),(function(){return l.handleMonthChange(l.state.date)}))})),Fs(zs(l),"handleDayClick",(function(e,t,n){return l.props.onSelect(e,t,n)})),Fs(zs(l),"handleDayMouseEnter",(function(e){l.setState({selectingDate:e}),l.props.onDayMouseEnter&&l.props.onDayMouseEnter(e)})),Fs(zs(l),"handleMonthMouseLeave",(function(){l.setState({selectingDate:null}),l.props.onMonthMouseLeave&&l.props.onMonthMouseLeave()})),Fs(zs(l),"handleYearChange",(function(e){l.props.onYearChange&&l.props.onYearChange(e)})),Fs(zs(l),"handleMonthChange",(function(e){l.props.onMonthChange&&l.props.onMonthChange(e),l.props.adjustDateOnChange&&(l.props.onSelect&&l.props.onSelect(e),l.props.setOpen&&l.props.setOpen(!0)),l.props.setPreSelection&&l.props.setPreSelection(e)})),Fs(zs(l),"handleMonthYearChange",(function(e){l.handleYearChange(e),l.handleMonthChange(e)})),Fs(zs(l),"changeYear",(function(e){l.setState((function(t){return{date:aa(t.date,e)}}),(function(){return l.handleYearChange(l.state.date)}))})),Fs(zs(l),"changeMonth",(function(e){l.setState((function(t){return{date:oa(t.date,e)}}),(function(){return l.handleMonthChange(l.state.date)}))})),Fs(zs(l),"changeMonthYear",(function(e){l.setState((function(t){return{date:aa(oa(t.date,Xr(e)),Jr(e))}}),(function(){return l.handleMonthYearChange(l.state.date)}))})),Fs(zs(l),"header",(function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:l.state.date,t=Gs(e,l.props.locale),n=[];return l.props.showWeekNumbers&&n.push(r.createElement("div",{key:"W",className:"react-datepicker__day-name"},l.props.weekLabel||"#")),n.concat([0,1,2,3,4,5,6].map((function(e){var n=Rr(t,e),o=l.formatWeekday(n,l.props.locale),a=l.props.weekDayClassName?l.props.weekDayClassName(n):void 0;return r.createElement("div",{key:e,className:ko("react-datepicker__day-name",a)},o)})))})),Fs(zs(l),"formatWeekday",(function(e,t){return l.props.formatWeekDay?function(e,t,n){return t(Vs(e,"EEEE",n))}(e,l.props.formatWeekDay,t):l.props.useWeekdaysShort?function(e,t){return Vs(e,"EEE",t)}(e,t):function(e,t){return Vs(e,"EEEEEE",t)}(e,t)})),Fs(zs(l),"decreaseYear",(function(){l.setState((function(e){return{date:Ar(e.date,l.props.showYearPicker?11:1)}}),(function(){return l.handleYearChange(l.state.date)}))})),Fs(zs(l),"renderPreviousButton",(function(){if(!l.props.renderCustomHeader){var e=l.props.showMonthYearPicker?xc(l.state.date,l.props):hc(l.state.date,l.props);if((l.props.forceShowMonthNavigation||l.props.showDisabledMonthNavigation||!e)&&!l.props.showTimeSelectOnly){var t=["react-datepicker__navigation","react-datepicker__navigation--previous"],n=l.decreaseMonth;(l.props.showMonthYearPicker||l.props.showQuarterYearPicker||l.props.showYearPicker)&&(n=l.decreaseYear),e&&l.props.showDisabledMonthNavigation&&(t.push("react-datepicker__navigation--previous--disabled"),n=null);var o=l.props.showMonthYearPicker||l.props.showQuarterYearPicker,a=l.props,i=a.previousMonthAriaLabel,d=void 0===i?"Previous Month":i,u=a.previousYearAriaLabel,s=void 0===u?"Previous Year":u;return r.createElement("button",{type:"button",className:t.join(" "),onClick:n,"aria-label":o?s:d},o?l.props.previousYearButtonLabel:l.props.previousMonthButtonLabel)}}})),Fs(zs(l),"increaseYear",(function(){l.setState((function(e){return{date:Hr(e.date,l.props.showYearPicker?11:1)}}),(function(){return l.handleYearChange(l.state.date)}))})),Fs(zs(l),"renderNextButton",(function(){if(!l.props.renderCustomHeader){var e=l.props.showMonthYearPicker?bc(l.state.date,l.props):gc(l.state.date,l.props);if((l.props.forceShowMonthNavigation||l.props.showDisabledMonthNavigation||!e)&&!l.props.showTimeSelectOnly){var t=["react-datepicker__navigation","react-datepicker__navigation--next"];l.props.showTimeSelect&&t.push("react-datepicker__navigation--next--with-time"),l.props.todayButton&&t.push("react-datepicker__navigation--next--with-today-button");var n=l.increaseMonth;(l.props.showMonthYearPicker||l.props.showQuarterYearPicker||l.props.showYearPicker)&&(n=l.increaseYear),e&&l.props.showDisabledMonthNavigation&&(t.push("react-datepicker__navigation--next--disabled"),n=null);var o=l.props.showMonthYearPicker||l.props.showQuarterYearPicker,a=l.props,i=a.nextMonthAriaLabel,d=void 0===i?"Next Month":i,u=a.nextYearAriaLabel,s=void 0===u?"Next Year":u;return r.createElement("button",{type:"button",className:t.join(" "),onClick:n,"aria-label":o?s:d},o?l.props.nextYearButtonLabel:l.props.nextMonthButtonLabel)}}})),Fs(zs(l),"renderCurrentMonth",(function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:l.state.date,t=["react-datepicker__current-month"];return l.props.showYearDropdown&&t.push("react-datepicker__current-month--hasYearDropdown"),l.props.showMonthDropdown&&t.push("react-datepicker__current-month--hasMonthDropdown"),l.props.showMonthYearDropdown&&t.push("react-datepicker__current-month--hasMonthYearDropdown"),r.createElement("div",{className:t.join(" ")},Vs(e,l.props.dateFormat,l.props.locale))})),Fs(zs(l),"renderYearDropdown",(function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(l.props.showYearDropdown&&!e)return r.createElement(Sc,{adjustDateOnChange:l.props.adjustDateOnChange,date:l.state.date,onSelect:l.props.onSelect,setOpen:l.props.setOpen,dropdownMode:l.props.dropdownMode,onChange:l.changeYear,minDate:l.props.minDate,maxDate:l.props.maxDate,year:Jr(l.state.date),scrollableYearDropdown:l.props.scrollableYearDropdown,yearDropdownItemNumber:l.props.yearDropdownItemNumber})})),Fs(zs(l),"renderMonthDropdown",(function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(l.props.showMonthDropdown&&!e)return r.createElement(Mc,{dropdownMode:l.props.dropdownMode,locale:l.props.locale,onChange:l.changeMonth,month:Xr(l.state.date),useShortMonthInDropdown:l.props.useShortMonthInDropdown})})),Fs(zs(l),"renderMonthYearDropdown",(function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(l.props.showMonthYearDropdown&&!e)return r.createElement(zc,{dropdownMode:l.props.dropdownMode,locale:l.props.locale,dateFormat:l.props.dateFormat,onChange:l.changeMonthYear,minDate:l.props.minDate,maxDate:l.props.maxDate,date:l.state.date,scrollableMonthYearDropdown:l.props.scrollableMonthYearDropdown})})),Fs(zs(l),"renderTodayButton",(function(){if(l.props.todayButton&&!l.props.showTimeSelectOnly)return r.createElement("div",{className:"react-datepicker__today-button",onClick:function(e){return l.props.onSelect(ua(Hs()),e)}},l.props.todayButton)})),Fs(zs(l),"renderDefaultHeader",(function(e){var t=e.monthDate,n=e.i;return r.createElement("div",{className:"react-datepicker__header"},l.renderCurrentMonth(t),r.createElement("div",{className:"react-datepicker__header__dropdown react-datepicker__header__dropdown--".concat(l.props.dropdownMode),onFocus:l.handleDropdownFocus},l.renderMonthDropdown(0!==n),l.renderMonthYearDropdown(0!==n),l.renderYearDropdown(0!==n)),r.createElement("div",{className:"react-datepicker__day-names"},l.header(t)))})),Fs(zs(l),"renderCustomHeader",(function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.monthDate,n=e.i;if(0!==n&&void 0!==n)return null;var o=hc(l.state.date,l.props),a=gc(l.state.date,l.props),i=xc(l.state.date,l.props),d=bc(l.state.date,l.props),u=!l.props.showMonthYearPicker&&!l.props.showQuarterYearPicker&&!l.props.showYearPicker;return r.createElement("div",{className:"react-datepicker__header react-datepicker__header--custom",onFocus:l.props.onDropdownFocus},l.props.renderCustomHeader(Ps(Ps({},l.state),{},{changeMonth:l.changeMonth,changeYear:l.changeYear,decreaseMonth:l.decreaseMonth,increaseMonth:l.increaseMonth,decreaseYear:l.decreaseYear,increaseYear:l.increaseYear,prevMonthButtonDisabled:o,nextMonthButtonDisabled:a,prevYearButtonDisabled:i,nextYearButtonDisabled:d})),u&&r.createElement("div",{className:"react-datepicker__day-names"},l.header(t)))})),Fs(zs(l),"renderYearHeader",(function(){return r.createElement("div",{className:"react-datepicker__header react-datepicker-year-header"},l.props.showYearPicker?"".concat(Jr(l.state.date)-11," - ").concat(Jr(l.state.date)):Jr(l.state.date))})),Fs(zs(l),"renderHeader",(function(e){switch(!0){case void 0!==l.props.renderCustomHeader:return l.renderCustomHeader(e);case l.props.showMonthYearPicker||l.props.showQuarterYearPicker||l.props.showYearPicker:return l.renderYearHeader(e);default:return l.renderDefaultHeader(e)}})),Fs(zs(l),"renderMonths",(function(){if(!l.props.showTimeSelectOnly&&!l.props.showYearPicker){for(var e=[],t=l.props.showPreviousMonths?l.props.monthsShown-1:0,n=jr(l.state.date,t),o=0;o1&&t[t.length-1].focus()})),Fs(zs(l),"handleFocusEnd",(function(e){var t=l.getTabChildren();t&&t.length>1&&t[0].focus()})),l.tabLoopRef=r.createRef(),l}return Cs(n,null,[{key:"defaultProps",get:function(){return{enableTabLoop:!0}}}]),Cs(n,[{key:"render",value:function(){return this.props.enableTabLoop?r.createElement("div",{className:"react-datepicker__tab-loop",ref:this.tabLoopRef},r.createElement("div",{className:"react-datepicker__tab-loop__start",tabIndex:"0",onFocus:this.handleFocusStart}),this.props.children,r.createElement("div",{className:"react-datepicker__tab-loop__end",tabIndex:"0",onFocus:this.handleFocusEnd})):this.props.children}}]),n}(),Wc=function(e){Ms(n,r.Component);var t=Bs(n);function n(){return ys(this,n),t.apply(this,arguments)}return Cs(n,[{key:"render",value:function(){var e,t=this.props,n=t.className,l=t.wrapperClassName,o=t.hidePopper,a=t.popperComponent,i=t.popperModifiers,d=t.popperPlacement,u=t.popperProps,s=t.targetComponent,c=t.enableTabLoop,m=t.popperOnKeyDown;if(!o){var p=ko("react-datepicker-popper",n);e=r.createElement(xs,Es({modifiers:i,placement:d},u),(function(e){var t=e.ref,n=e.style,l=e.placement,o=e.arrowProps;return r.createElement(Uc,{enableTabLoop:c},r.createElement("div",Es({ref:t,style:n},{className:p,"data-placement":l,onKeyDown:m}),r.cloneElement(a,{arrowProps:o})))}))}this.props.popperContainer&&(e=r.createElement(this.props.popperContainer,{},e));var f=ko("react-datepicker-wrapper",l);return r.createElement(cs,{className:"react-datepicker-manager"},r.createElement(vs,null,(function(e){var t=e.ref;return r.createElement("div",{ref:t,className:f},s)})),e)}}],[{key:"defaultProps",get:function(){return{hidePopper:!0,popperModifiers:{preventOverflow:{enabled:!0,escapeWithReference:!0,boundariesElement:"viewport"}},popperProps:{},popperPlacement:"bottom-start"}}}]),n}(),qc=zi(Vc),Gc=function(e){Ms(n,r.Component);var t=Bs(n);function n(e){var l;return ys(this,n),Fs(zs(l=t.call(this,e)),"getPreSelection",(function(){return l.props.openToDate?l.props.openToDate:l.props.selectsEnd&&l.props.startDate?l.props.startDate:l.props.selectsStart&&l.props.endDate?l.props.endDate:Hs()})),Fs(zs(l),"calcInitialState",(function(){var e=l.getPreSelection(),t=vc(l.props),n=wc(l.props),o=t&&ha(e,t)?t:n&&_a(e,n)?n:e;return{open:l.props.startOpen||!1,preventFocus:!1,preSelection:l.props.selected?l.props.selected:o,highlightDates:yc(l.props.highlightDates),focused:!1}})),Fs(zs(l),"clearPreventFocusTimeout",(function(){l.preventFocusTimeout&&clearTimeout(l.preventFocusTimeout)})),Fs(zs(l),"setFocus",(function(){l.input&&l.input.focus&&l.input.focus()})),Fs(zs(l),"setBlur",(function(){l.input&&l.input.blur&&l.input.blur(),l.cancelFocusInput()})),Fs(zs(l),"setOpen",(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];l.setState({open:e,preSelection:e&&l.state.open?l.state.preSelection:l.calcInitialState().preSelection,lastPreSelectChange:Kc},(function(){e||l.setState((function(e){return{focused:!!t&&e.focused}}),(function(){!t&&l.setBlur(),l.setState({inputValue:null})}))}))})),Fs(zs(l),"inputOk",(function(){return Fo(l.state.preSelection)})),Fs(zs(l),"isCalendarOpen",(function(){return void 0===l.props.open?l.state.open&&!l.props.disabled&&!l.props.readOnly:l.props.open})),Fs(zs(l),"handleFocus",(function(e){l.state.preventFocus||(l.props.onFocus(e),l.props.preventOpenOnFocus||l.props.readOnly||l.setOpen(!0)),l.setState({focused:!0})})),Fs(zs(l),"cancelFocusInput",(function(){clearTimeout(l.inputFocusTimeout),l.inputFocusTimeout=null})),Fs(zs(l),"deferFocusInput",(function(){l.cancelFocusInput(),l.inputFocusTimeout=setTimeout((function(){return l.setFocus()}),1)})),Fs(zs(l),"handleDropdownFocus",(function(){l.cancelFocusInput()})),Fs(zs(l),"handleBlur",(function(e){(!l.state.open||l.props.withPortal||l.props.showTimeInput)&&l.props.onBlur(e),l.setState({focused:!1})})),Fs(zs(l),"handleCalendarClickOutside",(function(e){l.props.inline||l.setOpen(!1),l.props.onClickOutside(e),l.props.withPortal&&e.preventDefault()})),Fs(zs(l),"handleChange",(function(){for(var e=arguments.length,t=new Array(e),n=0;n1&&!l.props.inlineFocusSelectedMonth&&l.setState({monthSelectedIn:o})),l.props.onChange(r,t)),l.props.onSelect(r,t),n||l.setState({inputValue:null}))})),Fs(zs(l),"setPreSelection",(function(e){var t=void 0!==l.props.minDate,n=void 0!==l.props.maxDate,o=!0;e&&(t&&n?o=tc(e,l.props.minDate,l.props.maxDate):t?o=_a(e,l.props.minDate):n&&(o=ha(e,l.props.maxDate))),o&&l.setState({preSelection:e})})),Fs(zs(l),"handleTimeChange",(function(e){var t=Ys(l.props.selected?l.props.selected:l.getPreSelection(),{hour:Ur(e),minute:Yr(e)});l.setState({preSelection:t}),l.props.onChange(t),l.props.shouldCloseOnSelect&&l.setOpen(!1),l.props.showTimeInput&&l.setOpen(!0),l.setState({inputValue:null})})),Fs(zs(l),"onInputClick",(function(){l.props.disabled||l.props.readOnly||l.setOpen(!0),l.props.onInputClick()})),Fs(zs(l),"onInputKeyDown",(function(e){l.props.onKeyDown(e);var t=e.key;if(l.state.open||l.props.inline||l.props.preventOpenOnFocus){if(l.state.open){if("ArrowDown"===t||"ArrowUp"===t){e.preventDefault();var n=l.calendar.componentNode&&l.calendar.componentNode.querySelector('.react-datepicker__day[tabindex="0"]');return void(n&&n.focus())}var o=Hs(l.state.preSelection);"Enter"===t?(e.preventDefault(),l.inputOk()&&l.state.lastPreSelectChange===Kc?(l.handleSelect(o,e),!l.props.shouldCloseOnSelect&&l.setPreSelection(o)):l.setOpen(!1)):"Escape"===t&&(e.preventDefault(),l.setOpen(!1)),l.inputOk()||l.props.onInputError({code:1,msg:"Date input not valid."})}}else"ArrowDown"!==t&&"ArrowUp"!==t&&"Enter"!==t||l.onInputClick()})),Fs(zs(l),"onDayKeyDown",(function(e){l.props.onKeyDown(e);var t=e.key,n=Hs(l.state.preSelection);if("Enter"===t)e.preventDefault(),l.handleSelect(n,e),!l.props.shouldCloseOnSelect&&l.setPreSelection(n);else if("Escape"===t)e.preventDefault(),l.setOpen(!1),l.inputOk()||l.props.onInputError({code:1,msg:"Date input not valid."});else if(!l.props.disabledKeyboardNavigation){var o;switch(t){case"ArrowLeft":o=function(e,t){Co(2,arguments);var n=Ro(t);return Rr(e,-n)}(n,1);break;case"ArrowRight":o=Rr(n,1);break;case"ArrowUp":o=function(e,t){Co(2,arguments);var n=Ro(t);return Lr(e,-n)}(n,1);break;case"ArrowDown":o=Lr(n,1);break;case"PageUp":o=jr(n,1);break;case"PageDown":o=Nr(n,1);break;case"Home":o=Ar(n,1);break;case"End":o=Hr(n,1)}if(!o)return void(l.props.onInputError&&l.props.onInputError({code:1,msg:"Date input not valid."}));e.preventDefault(),l.setState({lastPreSelectChange:Kc}),l.props.adjustDateOnChange&&l.setSelected(o),l.setPreSelection(o)}})),Fs(zs(l),"onPopperKeyDown",(function(e){"Escape"===e.key&&(e.preventDefault(),l.setState({preventFocus:!0},(function(){l.setOpen(!1),setTimeout((function(){l.setFocus(),l.setState({preventFocus:!1})}))})))})),Fs(zs(l),"onClearClick",(function(e){e&&e.preventDefault&&e.preventDefault(),l.props.onChange(null,e),l.setState({inputValue:null})})),Fs(zs(l),"clear",(function(){l.onClearClick()})),Fs(zs(l),"renderCalendar",(function(){return l.props.inline||l.isCalendarOpen()?r.createElement(qc,{ref:function(e){l.calendar=e},locale:l.props.locale,chooseDayAriaLabelPrefix:l.props.chooseDayAriaLabelPrefix,disabledDayAriaLabelPrefix:l.props.disabledDayAriaLabelPrefix,weekAriaLabelPrefix:l.props.weekAriaLabelPrefix,adjustDateOnChange:l.props.adjustDateOnChange,setOpen:l.setOpen,shouldCloseOnSelect:l.props.shouldCloseOnSelect,dateFormat:l.props.dateFormatCalendar,useWeekdaysShort:l.props.useWeekdaysShort,formatWeekDay:l.props.formatWeekDay,dropdownMode:l.props.dropdownMode,selected:l.props.selected,preSelection:l.state.preSelection,onSelect:l.handleSelect,onWeekSelect:l.props.onWeekSelect,openToDate:l.props.openToDate,minDate:l.props.minDate,maxDate:l.props.maxDate,selectsStart:l.props.selectsStart,selectsEnd:l.props.selectsEnd,startDate:l.props.startDate,endDate:l.props.endDate,excludeDates:l.props.excludeDates,filterDate:l.props.filterDate,onClickOutside:l.handleCalendarClickOutside,formatWeekNumber:l.props.formatWeekNumber,highlightDates:l.state.highlightDates,includeDates:l.props.includeDates,includeTimes:l.props.includeTimes,injectTimes:l.props.injectTimes,inline:l.props.inline,peekNextMonth:l.props.peekNextMonth,showMonthDropdown:l.props.showMonthDropdown,showPreviousMonths:l.props.showPreviousMonths,useShortMonthInDropdown:l.props.useShortMonthInDropdown,showMonthYearDropdown:l.props.showMonthYearDropdown,showWeekNumbers:l.props.showWeekNumbers,showYearDropdown:l.props.showYearDropdown,withPortal:l.props.withPortal,forceShowMonthNavigation:l.props.forceShowMonthNavigation,showDisabledMonthNavigation:l.props.showDisabledMonthNavigation,scrollableYearDropdown:l.props.scrollableYearDropdown,scrollableMonthYearDropdown:l.props.scrollableMonthYearDropdown,todayButton:l.props.todayButton,weekLabel:l.props.weekLabel,outsideClickIgnoreClass:"react-datepicker-ignore-onclickoutside",fixedHeight:l.props.fixedHeight,monthsShown:l.props.monthsShown,monthSelectedIn:l.state.monthSelectedIn,onDropdownFocus:l.handleDropdownFocus,onMonthChange:l.props.onMonthChange,onYearChange:l.props.onYearChange,dayClassName:l.props.dayClassName,weekDayClassName:l.props.weekDayClassName,monthClassName:l.props.monthClassName,timeClassName:l.props.timeClassName,showTimeSelect:l.props.showTimeSelect,showTimeSelectOnly:l.props.showTimeSelectOnly,onTimeChange:l.handleTimeChange,timeFormat:l.props.timeFormat,timeIntervals:l.props.timeIntervals,minTime:l.props.minTime,maxTime:l.props.maxTime,excludeTimes:l.props.excludeTimes,timeCaption:l.props.timeCaption,className:l.props.calendarClassName,container:l.props.calendarContainer,yearDropdownItemNumber:l.props.yearDropdownItemNumber,previousMonthButtonLabel:l.props.previousMonthButtonLabel,nextMonthButtonLabel:l.props.nextMonthButtonLabel,previousYearButtonLabel:l.props.previousYearButtonLabel,nextYearButtonLabel:l.props.nextYearButtonLabel,timeInputLabel:l.props.timeInputLabel,disabledKeyboardNavigation:l.props.disabledKeyboardNavigation,renderCustomHeader:l.props.renderCustomHeader,popperProps:l.props.popperProps,renderDayContents:l.props.renderDayContents,onDayMouseEnter:l.props.onDayMouseEnter,onMonthMouseLeave:l.props.onMonthMouseLeave,showTimeInput:l.props.showTimeInput,showMonthYearPicker:l.props.showMonthYearPicker,showFullMonthYearPicker:l.props.showFullMonthYearPicker,showYearPicker:l.props.showYearPicker,showQuarterYearPicker:l.props.showQuarterYearPicker,showPopperArrow:l.props.showPopperArrow,excludeScrollbar:l.props.excludeScrollbar,handleOnKeyDown:l.onDayKeyDown,isInputFocused:l.state.focused,customTimeInput:l.props.customTimeInput,setPreSelection:l.setPreSelection},l.props.children):null})),Fs(zs(l),"renderDateInput",(function(){var e,t,n,o,a,i=ko(l.props.className,Fs({},"react-datepicker-ignore-onclickoutside",l.state.open)),d=l.props.customInput||r.createElement("input",{type:"text"}),u=l.props.customInputRef||"ref",s="string"==typeof l.props.value?l.props.value:"string"==typeof l.state.inputValue?l.state.inputValue:(t=l.props.selected,o=(n=l.props).dateFormat,a=n.locale,t&&Vs(t,Array.isArray(o)?o[0]:o,a)||"");return r.cloneElement(d,(Fs(e={},u,(function(e){l.input=e})),Fs(e,"value",s),Fs(e,"onBlur",l.handleBlur),Fs(e,"onChange",l.handleChange),Fs(e,"onClick",l.onInputClick),Fs(e,"onFocus",l.handleFocus),Fs(e,"onKeyDown",l.onInputKeyDown),Fs(e,"id",l.props.id),Fs(e,"name",l.props.name),Fs(e,"autoFocus",l.props.autoFocus),Fs(e,"placeholder",l.props.placeholderText),Fs(e,"disabled",l.props.disabled),Fs(e,"autoComplete",l.props.autoComplete),Fs(e,"className",ko(d.props.className,i)),Fs(e,"title",l.props.title),Fs(e,"readOnly",l.props.readOnly),Fs(e,"required",l.props.required),Fs(e,"tabIndex",l.props.tabIndex),Fs(e,"aria-labelledby",l.props.ariaLabelledBy),e))})),Fs(zs(l),"renderClearButton",(function(){var e=l.props,t=e.isClearable,n=e.selected,o=e.clearButtonTitle,a=e.ariaLabelClose,i=void 0===a?"Close":a;return t&&null!=n?r.createElement("button",{type:"button",className:"react-datepicker__close-icon","aria-label":i,onClick:l.onClearClick,title:o,tabIndex:-1}):null})),l.state=l.calcInitialState(),l}return Cs(n,null,[{key:"defaultProps",get:function(){return{allowSameDay:!1,dateFormat:"MM/dd/yyyy",dateFormatCalendar:"LLLL yyyy",onChange:function(){},disabled:!1,disabledKeyboardNavigation:!1,dropdownMode:"scroll",onFocus:function(){},onBlur:function(){},onKeyDown:function(){},onInputClick:function(){},onSelect:function(){},onClickOutside:function(){},onMonthChange:function(){},onCalendarOpen:function(){},onCalendarClose:function(){},preventOpenOnFocus:!1,onYearChange:function(){},onInputError:function(){},monthsShown:1,readOnly:!1,withPortal:!1,shouldCloseOnSelect:!0,showTimeSelect:!1,showTimeInput:!1,showPreviousMonths:!1,showMonthYearPicker:!1,showFullMonthYearPicker:!1,showYearPicker:!1,showQuarterYearPicker:!1,strictParsing:!1,timeIntervals:30,timeCaption:"Time",previousMonthButtonLabel:"Previous Month",nextMonthButtonLabel:"Next Month",previousYearButtonLabel:"Previous Year",nextYearButtonLabel:"Next Year",timeInputLabel:"Time",enableTabLoop:!0,renderDayContents:function(e){return e},inlineFocusSelectedMonth:!1,showPopperArrow:!0,excludeScrollbar:!0,customTimeInput:null}}}]),Cs(n,[{key:"componentDidUpdate",value:function(e,t){var n,l;e.inline&&(n=e.selected,l=this.props.selected,n&&l?Xr(n)!==Xr(l)||Jr(n)!==Jr(l):n!==l)&&this.setPreSelection(this.props.selected),void 0!==this.state.monthSelectedIn&&e.monthsShown!==this.props.monthsShown&&this.setState({monthSelectedIn:0}),e.highlightDates!==this.props.highlightDates&&this.setState({highlightDates:yc(this.props.highlightDates)}),t.focused||ec(e.selected,this.props.selected)||this.setState({inputValue:null}),t.open!==this.state.open&&(!1===t.open&&!0===this.state.open&&this.props.onCalendarOpen(),!0===t.open&&!1===this.state.open&&this.props.onCalendarClose())}},{key:"componentWillUnmount",value:function(){this.clearPreventFocusTimeout()}},{key:"render",value:function(){var e=this.renderCalendar();return this.props.inline&&!this.props.withPortal?e:this.props.withPortal?r.createElement("div",null,this.props.inline?null:r.createElement("div",{className:"react-datepicker__input-container"},this.renderDateInput(),this.renderClearButton()),this.state.open||this.props.inline?r.createElement("div",{className:"react-datepicker__portal"},e):null):r.createElement(Wc,{className:this.props.popperClassName,wrapperClassName:this.props.wrapperClassName,hidePopper:!this.isCalendarOpen(),popperModifiers:this.props.popperModifiers,targetComponent:r.createElement("div",{className:"react-datepicker__input-container"},this.renderDateInput(),this.renderClearButton()),popperContainer:this.props.popperContainer,popperComponent:e,popperPlacement:this.props.popperPlacement,popperProps:this.props.popperProps,popperOnKeyDown:this.onPopperKeyDown,enableTabLoop:this.props.enableTabLoop})}}]),n}(),Qc="input",Kc="navigate",$c={"d-none":"DatePicker-module__d-none","d-inline":"DatePicker-module__d-inline","d-inline-block":"DatePicker-module__d-inline-block","d-block":"DatePicker-module__d-block","d-table":"DatePicker-module__d-table","d-table-row":"DatePicker-module__d-table-row","d-table-cell":"DatePicker-module__d-table-cell","d-flex":"DatePicker-module__d-flex","d-inline-flex":"DatePicker-module__d-inline-flex","d-sm-none":"DatePicker-module__d-sm-none","d-sm-inline":"DatePicker-module__d-sm-inline","d-sm-inline-block":"DatePicker-module__d-sm-inline-block","d-sm-block":"DatePicker-module__d-sm-block","d-sm-table":"DatePicker-module__d-sm-table","d-sm-table-row":"DatePicker-module__d-sm-table-row","d-sm-table-cell":"DatePicker-module__d-sm-table-cell","d-sm-flex":"DatePicker-module__d-sm-flex","d-sm-inline-flex":"DatePicker-module__d-sm-inline-flex","d-md-none":"DatePicker-module__d-md-none","d-md-inline":"DatePicker-module__d-md-inline","d-md-inline-block":"DatePicker-module__d-md-inline-block","d-md-block":"DatePicker-module__d-md-block","d-md-table":"DatePicker-module__d-md-table","d-md-table-row":"DatePicker-module__d-md-table-row","d-md-table-cell":"DatePicker-module__d-md-table-cell","d-md-flex":"DatePicker-module__d-md-flex","d-md-inline-flex":"DatePicker-module__d-md-inline-flex","d-lg-none":"DatePicker-module__d-lg-none","d-lg-inline":"DatePicker-module__d-lg-inline","d-lg-inline-block":"DatePicker-module__d-lg-inline-block","d-lg-block":"DatePicker-module__d-lg-block","d-lg-table":"DatePicker-module__d-lg-table","d-lg-table-row":"DatePicker-module__d-lg-table-row","d-lg-table-cell":"DatePicker-module__d-lg-table-cell","d-lg-flex":"DatePicker-module__d-lg-flex","d-lg-inline-flex":"DatePicker-module__d-lg-inline-flex","d-xl-none":"DatePicker-module__d-xl-none","d-xl-inline":"DatePicker-module__d-xl-inline","d-xl-inline-block":"DatePicker-module__d-xl-inline-block","d-xl-block":"DatePicker-module__d-xl-block","d-xl-table":"DatePicker-module__d-xl-table","d-xl-table-row":"DatePicker-module__d-xl-table-row","d-xl-table-cell":"DatePicker-module__d-xl-table-cell","d-xl-flex":"DatePicker-module__d-xl-flex","d-xl-inline-flex":"DatePicker-module__d-xl-inline-flex","d-print-none":"DatePicker-module__d-print-none","d-print-inline":"DatePicker-module__d-print-inline","d-print-inline-block":"DatePicker-module__d-print-inline-block","d-print-block":"DatePicker-module__d-print-block","d-print-table":"DatePicker-module__d-print-table","d-print-table-row":"DatePicker-module__d-print-table-row","d-print-table-cell":"DatePicker-module__d-print-table-cell","d-print-flex":"DatePicker-module__d-print-flex","d-print-inline-flex":"DatePicker-module__d-print-inline-flex",Calendar:"DatePicker-module__Calendar"},Xc={"d-none":"Collapsible-module__d-none","d-inline":"Collapsible-module__d-inline","d-inline-block":"Collapsible-module__d-inline-block","d-block":"Collapsible-module__d-block","d-table":"Collapsible-module__d-table","d-table-row":"Collapsible-module__d-table-row","d-table-cell":"Collapsible-module__d-table-cell","d-flex":"Collapsible-module__d-flex","d-inline-flex":"Collapsible-module__d-inline-flex","d-sm-none":"Collapsible-module__d-sm-none","d-sm-inline":"Collapsible-module__d-sm-inline","d-sm-inline-block":"Collapsible-module__d-sm-inline-block","d-sm-block":"Collapsible-module__d-sm-block","d-sm-table":"Collapsible-module__d-sm-table","d-sm-table-row":"Collapsible-module__d-sm-table-row","d-sm-table-cell":"Collapsible-module__d-sm-table-cell","d-sm-flex":"Collapsible-module__d-sm-flex","d-sm-inline-flex":"Collapsible-module__d-sm-inline-flex","d-md-none":"Collapsible-module__d-md-none","d-md-inline":"Collapsible-module__d-md-inline","d-md-inline-block":"Collapsible-module__d-md-inline-block","d-md-block":"Collapsible-module__d-md-block","d-md-table":"Collapsible-module__d-md-table","d-md-table-row":"Collapsible-module__d-md-table-row","d-md-table-cell":"Collapsible-module__d-md-table-cell","d-md-flex":"Collapsible-module__d-md-flex","d-md-inline-flex":"Collapsible-module__d-md-inline-flex","d-lg-none":"Collapsible-module__d-lg-none","d-lg-inline":"Collapsible-module__d-lg-inline","d-lg-inline-block":"Collapsible-module__d-lg-inline-block","d-lg-block":"Collapsible-module__d-lg-block","d-lg-table":"Collapsible-module__d-lg-table","d-lg-table-row":"Collapsible-module__d-lg-table-row","d-lg-table-cell":"Collapsible-module__d-lg-table-cell","d-lg-flex":"Collapsible-module__d-lg-flex","d-lg-inline-flex":"Collapsible-module__d-lg-inline-flex","d-xl-none":"Collapsible-module__d-xl-none","d-xl-inline":"Collapsible-module__d-xl-inline","d-xl-inline-block":"Collapsible-module__d-xl-inline-block","d-xl-block":"Collapsible-module__d-xl-block","d-xl-table":"Collapsible-module__d-xl-table","d-xl-table-row":"Collapsible-module__d-xl-table-row","d-xl-table-cell":"Collapsible-module__d-xl-table-cell","d-xl-flex":"Collapsible-module__d-xl-flex","d-xl-inline-flex":"Collapsible-module__d-xl-inline-flex","d-print-none":"Collapsible-module__d-print-none","d-print-inline":"Collapsible-module__d-print-inline","d-print-inline-block":"Collapsible-module__d-print-inline-block","d-print-block":"Collapsible-module__d-print-block","d-print-table":"Collapsible-module__d-print-table","d-print-table-row":"Collapsible-module__d-print-table-row","d-print-table-cell":"Collapsible-module__d-print-table-cell","d-print-flex":"Collapsible-module__d-print-flex","d-print-inline-flex":"Collapsible-module__d-print-inline-flex",container:"Collapsible-module__container",buttonOnBottom:"Collapsible-module__buttonOnBottom",button:"Collapsible-module__button",content:"Collapsible-module__content",chevron:"Collapsible-module__chevron",chevronCollapsed:"Collapsible-module__chevronCollapsed",title:"Collapsible-module__title",small:"Collapsible-module__small",buttonRight:"Collapsible-module__buttonRight",contentCollapsed:"Collapsible-module__contentCollapsed"},Zc={"d-none":"Switch-module__d-none","d-inline":"Switch-module__d-inline","d-inline-block":"Switch-module__d-inline-block","d-block":"Switch-module__d-block","d-table":"Switch-module__d-table","d-table-row":"Switch-module__d-table-row","d-table-cell":"Switch-module__d-table-cell","d-flex":"Switch-module__d-flex","d-inline-flex":"Switch-module__d-inline-flex","d-sm-none":"Switch-module__d-sm-none","d-sm-inline":"Switch-module__d-sm-inline","d-sm-inline-block":"Switch-module__d-sm-inline-block","d-sm-block":"Switch-module__d-sm-block","d-sm-table":"Switch-module__d-sm-table","d-sm-table-row":"Switch-module__d-sm-table-row","d-sm-table-cell":"Switch-module__d-sm-table-cell","d-sm-flex":"Switch-module__d-sm-flex","d-sm-inline-flex":"Switch-module__d-sm-inline-flex","d-md-none":"Switch-module__d-md-none","d-md-inline":"Switch-module__d-md-inline","d-md-inline-block":"Switch-module__d-md-inline-block","d-md-block":"Switch-module__d-md-block","d-md-table":"Switch-module__d-md-table","d-md-table-row":"Switch-module__d-md-table-row","d-md-table-cell":"Switch-module__d-md-table-cell","d-md-flex":"Switch-module__d-md-flex","d-md-inline-flex":"Switch-module__d-md-inline-flex","d-lg-none":"Switch-module__d-lg-none","d-lg-inline":"Switch-module__d-lg-inline","d-lg-inline-block":"Switch-module__d-lg-inline-block","d-lg-block":"Switch-module__d-lg-block","d-lg-table":"Switch-module__d-lg-table","d-lg-table-row":"Switch-module__d-lg-table-row","d-lg-table-cell":"Switch-module__d-lg-table-cell","d-lg-flex":"Switch-module__d-lg-flex","d-lg-inline-flex":"Switch-module__d-lg-inline-flex","d-xl-none":"Switch-module__d-xl-none","d-xl-inline":"Switch-module__d-xl-inline","d-xl-inline-block":"Switch-module__d-xl-inline-block","d-xl-block":"Switch-module__d-xl-block","d-xl-table":"Switch-module__d-xl-table","d-xl-table-row":"Switch-module__d-xl-table-row","d-xl-table-cell":"Switch-module__d-xl-table-cell","d-xl-flex":"Switch-module__d-xl-flex","d-xl-inline-flex":"Switch-module__d-xl-inline-flex","d-print-none":"Switch-module__d-print-none","d-print-inline":"Switch-module__d-print-inline","d-print-inline-block":"Switch-module__d-print-inline-block","d-print-block":"Switch-module__d-print-block","d-print-table":"Switch-module__d-print-table","d-print-table-row":"Switch-module__d-print-table-row","d-print-table-cell":"Switch-module__d-print-table-cell","d-print-flex":"Switch-module__d-print-flex","d-print-inline-flex":"Switch-module__d-print-inline-flex",switch:"Switch-module__switch",button:"Switch-module__button","button-always-small":"Switch-module__button-always-small","label-end":"Switch-module__label-end","label-start":"Switch-module__label-start","button-large":"Switch-module__button-large","button-small":"Switch-module__button-small",unchecked:"Switch-module__unchecked",checked:"Switch-module__checked",disabled:"Switch-module__disabled",label:"Switch-module__label",icon:"Switch-module__icon","icon-end":"Switch-module__icon-end",input:"Switch-module__input"};function Jc(e){var t=e.value,n=e.type,l=e.name,o=e.className,a=e.checked,i=void 0!==a&&a,d=e.disabled,u=e.variant,s=void 0===u?"default":u,c=e.onChange,m=e.id,p=e.inputProps,f=void 0===p?{}:p,_=e.icon,h=void 0===_?"checkbox-unchecked":_,g=e.iconChecked,x=void 0===g?"checkbox-checked":g,b=e.iconVariant,v=void 0===b?0:b,y=e.iconVariantChecked,k=void 0===y?0:y,C=e.iconFontSize,F=void 0===C?"16px":C,E=e.label,P=e.labelPlacement,M=void 0===P?"end":P,T=e.labelProps,D=e.customIcon,z=e.customIconChecked,I=S(e,["value","type","name","className","checked","disabled","variant","onChange","id","inputProps","icon","iconChecked","iconVariant","iconVariantChecked","iconFontSize","label","labelPlacement","labelProps","customIcon","customIconChecked"]),B=m||"".concat(n||"switch","-").concat(l,"-").concat(t),O=[Zc.switch,i?Zc.checked:Zc.unchecked,d?Zc.disabled:"","default"!==s&&Zc.button,"default"!==s&&Zc[s],o].filter(Boolean).join(" "),R=[Zc.icon,"start"===M&&Zc["icon-end"]].filter(Boolean).join(" "),L=[Zc.label,Zc["label-".concat(M)]].filter(Boolean).join(" "),N="string"===typeof E||"number"===typeof E?r.createElement(V,w({className:L,fontSize:"body-xsmall"},T),E):E;return r.createElement("label",w({},I,{htmlFor:B,className:O}),D?i&&z?z:D:r.createElement(Gt,{className:R,name:i?x:h,variant:i?k:v,fontSize:F}),("default"===s||"button-large"===s)&&N,r.createElement("input",w({},f,{className:Zc.input,value:t,id:B,onChange:c,name:l,checked:i,disabled:d,type:n})))}var em={"d-none":"RadioGroup-module__d-none","d-inline":"RadioGroup-module__d-inline","d-inline-block":"RadioGroup-module__d-inline-block","d-block":"RadioGroup-module__d-block","d-table":"RadioGroup-module__d-table","d-table-row":"RadioGroup-module__d-table-row","d-table-cell":"RadioGroup-module__d-table-cell","d-flex":"RadioGroup-module__d-flex","d-inline-flex":"RadioGroup-module__d-inline-flex","d-sm-none":"RadioGroup-module__d-sm-none","d-sm-inline":"RadioGroup-module__d-sm-inline","d-sm-inline-block":"RadioGroup-module__d-sm-inline-block","d-sm-block":"RadioGroup-module__d-sm-block","d-sm-table":"RadioGroup-module__d-sm-table","d-sm-table-row":"RadioGroup-module__d-sm-table-row","d-sm-table-cell":"RadioGroup-module__d-sm-table-cell","d-sm-flex":"RadioGroup-module__d-sm-flex","d-sm-inline-flex":"RadioGroup-module__d-sm-inline-flex","d-md-none":"RadioGroup-module__d-md-none","d-md-inline":"RadioGroup-module__d-md-inline","d-md-inline-block":"RadioGroup-module__d-md-inline-block","d-md-block":"RadioGroup-module__d-md-block","d-md-table":"RadioGroup-module__d-md-table","d-md-table-row":"RadioGroup-module__d-md-table-row","d-md-table-cell":"RadioGroup-module__d-md-table-cell","d-md-flex":"RadioGroup-module__d-md-flex","d-md-inline-flex":"RadioGroup-module__d-md-inline-flex","d-lg-none":"RadioGroup-module__d-lg-none","d-lg-inline":"RadioGroup-module__d-lg-inline","d-lg-inline-block":"RadioGroup-module__d-lg-inline-block","d-lg-block":"RadioGroup-module__d-lg-block","d-lg-table":"RadioGroup-module__d-lg-table","d-lg-table-row":"RadioGroup-module__d-lg-table-row","d-lg-table-cell":"RadioGroup-module__d-lg-table-cell","d-lg-flex":"RadioGroup-module__d-lg-flex","d-lg-inline-flex":"RadioGroup-module__d-lg-inline-flex","d-xl-none":"RadioGroup-module__d-xl-none","d-xl-inline":"RadioGroup-module__d-xl-inline","d-xl-inline-block":"RadioGroup-module__d-xl-inline-block","d-xl-block":"RadioGroup-module__d-xl-block","d-xl-table":"RadioGroup-module__d-xl-table","d-xl-table-row":"RadioGroup-module__d-xl-table-row","d-xl-table-cell":"RadioGroup-module__d-xl-table-cell","d-xl-flex":"RadioGroup-module__d-xl-flex","d-xl-inline-flex":"RadioGroup-module__d-xl-inline-flex","d-print-none":"RadioGroup-module__d-print-none","d-print-inline":"RadioGroup-module__d-print-inline","d-print-inline-block":"RadioGroup-module__d-print-inline-block","d-print-block":"RadioGroup-module__d-print-block","d-print-table":"RadioGroup-module__d-print-table","d-print-table-row":"RadioGroup-module__d-print-table-row","d-print-table-cell":"RadioGroup-module__d-print-table-cell","d-print-flex":"RadioGroup-module__d-print-flex","d-print-inline-flex":"RadioGroup-module__d-print-inline-flex","radio-wrapper":"RadioGroup-module__radio-wrapper","button-large-wrapper":"RadioGroup-module__button-large-wrapper","button-small-wrapper":"RadioGroup-module__button-small-wrapper","button-always-small-wrapper":"RadioGroup-module__button-always-small-wrapper"};var tm={"d-none":"Table-module__d-none","d-inline":"Table-module__d-inline","d-inline-block":"Table-module__d-inline-block","d-block":"Table-module__d-block","d-table":"Table-module__d-table","d-table-row":"Table-module__d-table-row","d-table-cell":"Table-module__d-table-cell","d-flex":"Table-module__d-flex","d-inline-flex":"Table-module__d-inline-flex","d-sm-none":"Table-module__d-sm-none","d-sm-inline":"Table-module__d-sm-inline","d-sm-inline-block":"Table-module__d-sm-inline-block","d-sm-block":"Table-module__d-sm-block","d-sm-table":"Table-module__d-sm-table","d-sm-table-row":"Table-module__d-sm-table-row","d-sm-table-cell":"Table-module__d-sm-table-cell","d-sm-flex":"Table-module__d-sm-flex","d-sm-inline-flex":"Table-module__d-sm-inline-flex","d-md-none":"Table-module__d-md-none","d-md-inline":"Table-module__d-md-inline","d-md-inline-block":"Table-module__d-md-inline-block","d-md-block":"Table-module__d-md-block","d-md-table":"Table-module__d-md-table","d-md-table-row":"Table-module__d-md-table-row","d-md-table-cell":"Table-module__d-md-table-cell","d-md-flex":"Table-module__d-md-flex","d-md-inline-flex":"Table-module__d-md-inline-flex","d-lg-none":"Table-module__d-lg-none","d-lg-inline":"Table-module__d-lg-inline","d-lg-inline-block":"Table-module__d-lg-inline-block","d-lg-block":"Table-module__d-lg-block","d-lg-table":"Table-module__d-lg-table","d-lg-table-row":"Table-module__d-lg-table-row","d-lg-table-cell":"Table-module__d-lg-table-cell","d-lg-flex":"Table-module__d-lg-flex","d-lg-inline-flex":"Table-module__d-lg-inline-flex","d-xl-none":"Table-module__d-xl-none","d-xl-inline":"Table-module__d-xl-inline","d-xl-inline-block":"Table-module__d-xl-inline-block","d-xl-block":"Table-module__d-xl-block","d-xl-table":"Table-module__d-xl-table","d-xl-table-row":"Table-module__d-xl-table-row","d-xl-table-cell":"Table-module__d-xl-table-cell","d-xl-flex":"Table-module__d-xl-flex","d-xl-inline-flex":"Table-module__d-xl-inline-flex","d-print-none":"Table-module__d-print-none","d-print-inline":"Table-module__d-print-inline","d-print-inline-block":"Table-module__d-print-inline-block","d-print-block":"Table-module__d-print-block","d-print-table":"Table-module__d-print-table","d-print-table-row":"Table-module__d-print-table-row","d-print-table-cell":"Table-module__d-print-table-cell","d-print-flex":"Table-module__d-print-flex","d-print-inline-flex":"Table-module__d-print-inline-flex",Table:"Table-module__Table",Th:"Table-module__Th","sort-icon":"Table-module__sort-icon",clickable:"Table-module__clickable",sorted:"Table-module__sorted",asc:"Table-module__asc",desc:"Table-module__desc",Row:"Table-module__Row","solid-borders":"Table-module__solid-borders","dashed-borders":"Table-module__dashed-borders",Cell:"Table-module__Cell"};function nm(e){var t=e.className,n=e.tableStyle,l=void 0===n?"solid-borders":n,o=e.children,a=S(e,["className","tableStyle","children"]),i=$(tm.Table,t,tm[l]);return r.createElement("table",w({},a,{className:i}),o)}nm.Thead=function(e){return r.createElement("thead",e)},nm.Tfoot=function(e){return r.createElement("tfoot",e)},nm.Tbody=function(e){return r.createElement("tbody",e)},nm.Cell=function(e){var t=e.className,n=e.children,l=S(e,["className","children"]),o=$(tm.Cell,t);return r.createElement("td",w({},l,{className:o}),n)},nm.Row=function(e){var t=e.className,n=e.children,l=S(e,["className","children"]),o=$(tm.Row,t);return r.createElement("tr",w({},l,{className:o}),n)},nm.Th=function(e){var t=e.className,n=e.sort,l=e.onClick,o=e.children,a=S(e,["className","sort","onClick","children"]),i=$(tm.Th,t,n&&tm[n],n&&tm.sorted,l&&tm.clickable);return r.createElement("th",w({},a,{className:i}),"function"===typeof l?r.createElement("button",{onClick:l},"string"===typeof o?r.createElement("span",null,o):o,r.createElement(Gt,{className:tm["sort-icon"],name:"arrow-left",fontSize:"inherit"})):o)};var lm="Tabs-module__Tab",om="Tabs-module__isActive";function rm(e){var t=e.children,n=e.role,l=void 0===n?"tablist":n,o=S(e,["children","role"]);return r.createElement(Un,w({role:l},o),t)}rm.Tab=function(e){var t=e.className,n=e.children,l=e.isActive,o=e.onClick,a=e.role,i=void 0===a?"tab":a,d=e.as,u=S(e,["className","children","isActive","onClick","role","as"]),s=$(t,lm,l&&om),c=void 0===d?{href:"#",onClick:function(e){e.preventDefault(),"function"===typeof o&&(e.persist(),o(e))}}:{onClick:o},m=d||"a";return r.createElement(m,w({},c,{className:s,role:i,"aria-selected":l},u),n)};var am="HighlightedHeader-module__HighlightedHeader",im=function(e){C(n,e);var t=T(n);function n(){return g(this,n),t.apply(this,arguments)}return b(n,[{key:"render",value:function(){var e=this.props,t=e.className,n=e.children,l=S(e,["className","children"]);return o.createElement("div",w({className:$(am,t)},l),n)}}]),n}(o.PureComponent);var dm="Menu-module__Menu",um="Menu-module__Menu-nav",sm="Menu-module__Menu-item",cm="Menu-module__Menu-item--active",mm="Menu-module__Menu--startShadow",pm="Menu-module__Menu--endShadow";function fm(e){var t=e.isActive,n=void 0!==t&&t,l=e.amount,a=e.item,i=e.onScrollIntoView,d=e.render,u=S(e,["isActive","amount","item","onScrollIntoView","render"]),s=o.useRef(null),c=cm,m=$(sm,n&&c);return o.useEffect((function(){var e=s.current;n&&e&&(e.scrollIntoView({block:"end",inline:"center"}),i())}),[l,n,i]),r.createElement("li",w({className:m,role:"presentation",ref:s,tabIndex:1},u),d(c,a))}var _m,hm="Placeholder-module__Placeholder",gm={flash:"animations-module__flash"};function xm(e){var n=e.animation,l=void 0===n?t.Animation.Flash:n,o=$(hm,e.className,gm[l]),a=e.color,i=e.width,d=e.height;return r.createElement("div",{className:o,style:{backgroundColor:a,width:i,height:d}})}(_m=t.Animation||(t.Animation={})).None="none",_m.Flash="flash";var bm={Variant1:"Variant1-module__Variant1","Variant1__content--title":"Variant1-module__Variant1__content--title","Variant1__content--subtitle":"Variant1-module__Variant1__content--subtitle","Variant1__content--body":"Variant1-module__Variant1__content--body",Variant1__footer:"Variant1-module__Variant1__footer"};function vm(e){var t=$(bm.Variant1,e.className),n=e.height,l=e.animation,o=S(e,["height","animation"]);return r.createElement("div",w({style:{height:n}},o,{className:t}),r.createElement("div",{className:bm.Variant1__content},r.createElement(xm,{animation:l,width:"33%",height:22,className:bm["Variant1__content--title"]}),r.createElement(xm,{animation:l,width:"63%",className:bm["Variant1__content--subtitle"]}),r.createElement(xm,{animation:l,width:"63%",className:bm["Variant1__content--body"]}),r.createElement(xm,{animation:l,width:"63%",className:bm["Variant1__content--body"]})),r.createElement("div",{className:bm.Variant1__footer},r.createElement(xm,{animation:l,width:190})))}var wm="Variant2-module__Variant2",ym="Variant2-module__Variant2__text";function km(e){var t=$(wm,e.className),n=e.height,l=e.linesOfText,o=e.animation,a=S(e,["height","linesOfText","animation"]);return r.createElement("div",w({style:{height:n}},a,{className:t}),r.createElement("div",null,r.createElement(xm,{animation:o,width:"100%",height:200})),r.createElement("div",null,r.createElement(xm,{animation:o,width:65,height:65,color:"white"})),r.createElement("div",null,r.createElement(xm,{animation:o,width:"33%",height:22})),l&&l>0&&r.createElement("div",null,Array.from(Array(l)).map((function(e,t){return r.createElement(xm,{animation:o,width:t%2?"63%":"90%",key:t,className:ym})}))))}function Cm(e){switch(e.variant){case 1:return r.createElement(vm,e);case 2:return r.createElement(km,e);default:return null}}Cm.Block=xm;var Fm="NotificationPopup-module__notificationsWrapper",Em="NotificationPopup-module__title",Sm="NotificationPopup-module__notificationsContainer",Pm="NotificationPopup-module__notificationsTrigger",Mm="NotificationPopup-module__notificationsBullet",Tm="NotificationPopup-module__notificationsBell",Dm="NotificationPopup-module__close",zm=ln((function(e,t){"undefined"!=typeof self&&self,e.exports=function(e){return function(e){var t={};function n(l){if(t[l])return t[l].exports;var o=t[l]={i:l,l:!1,exports:{}};return e[l].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,l){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:l})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var l=Object.create(null);if(n.r(l),Object.defineProperty(l,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(l,o,function(t){return e[t]}.bind(null,o));return l},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=2)}([function(t,n){t.exports=e},function(e,t,n){var l={linear:function(e,t,n,l){return(n-t)*e/l+t},easeInQuad:function(e,t,n,l){return(n-t)*(e/=l)*e+t},easeOutQuad:function(e,t,n,l){return-(n-t)*(e/=l)*(e-2)+t},easeInOutQuad:function(e,t,n,l){var o=n-t;return(e/=l/2)<1?o/2*e*e+t:-o/2*(--e*(e-2)-1)+t},easeInCubic:function(e,t,n,l){return(n-t)*(e/=l)*e*e+t},easeOutCubic:function(e,t,n,l){return(n-t)*((e=e/l-1)*e*e+1)+t},easeInOutCubic:function(e,t,n,l){var o=n-t;return(e/=l/2)<1?o/2*e*e*e+t:o/2*((e-=2)*e*e+2)+t},easeInQuart:function(e,t,n,l){return(n-t)*(e/=l)*e*e*e+t},easeOutQuart:function(e,t,n,l){return-(n-t)*((e=e/l-1)*e*e*e-1)+t},easeInOutQuart:function(e,t,n,l){var o=n-t;return(e/=l/2)<1?o/2*e*e*e*e+t:-o/2*((e-=2)*e*e*e-2)+t},easeInQuint:function(e,t,n,l){return(n-t)*(e/=l)*e*e*e*e+t},easeOutQuint:function(e,t,n,l){return(n-t)*((e=e/l-1)*e*e*e*e+1)+t},easeInOutQuint:function(e,t,n,l){var o=n-t;return(e/=l/2)<1?o/2*e*e*e*e*e+t:o/2*((e-=2)*e*e*e*e+2)+t},easeInSine:function(e,t,n,l){var o=n-t;return-o*Math.cos(e/l*(Math.PI/2))+o+t},easeOutSine:function(e,t,n,l){return(n-t)*Math.sin(e/l*(Math.PI/2))+t},easeInOutSine:function(e,t,n,l){return-(n-t)/2*(Math.cos(Math.PI*e/l)-1)+t},easeInExpo:function(e,t,n,l){return 0==e?t:(n-t)*Math.pow(2,10*(e/l-1))+t},easeOutExpo:function(e,t,n,l){var o=n-t;return e==l?t+o:o*(1-Math.pow(2,-10*e/l))+t},easeInOutExpo:function(e,t,n,l){var o=n-t;return 0===e?t:e===l?t+o:(e/=l/2)<1?o/2*Math.pow(2,10*(e-1))+t:o/2*(2-Math.pow(2,-10*--e))+t},easeInCirc:function(e,t,n,l){return-(n-t)*(Math.sqrt(1-(e/=l)*e)-1)+t},easeOutCirc:function(e,t,n,l){return(n-t)*Math.sqrt(1-(e=e/l-1)*e)+t},easeInOutCirc:function(e,t,n,l){var o=n-t;return(e/=l/2)<1?-o/2*(Math.sqrt(1-e*e)-1)+t:o/2*(Math.sqrt(1-(e-=2)*e)+1)+t},easeInElastic:function(e,t,n,l){var o,r,a,i=n-t;return a=1.70158,0===e?t:1==(e/=l)?t+i:((r=0)||(r=.3*l),(o=i)=1&&this.rotationDirection===o.Positive?this.rotationDirection=o.Negative:this.rotateY<=-1&&this.rotationDirection===o.Negative&&(this.rotationDirection=o.Positive);var d=.1*this.rotationDirection;if(this.rotateY+=d,this.angle+=this.angularSpin,this.context.save(),this.context.translate(this.x,this.y),this.context.rotate(this.angle),this.context.scale(1,this.rotateY),this.context.rotate(this.angle),this.context.beginPath(),this.context.fillStyle=this.color,this.context.strokeStyle=this.color,this.context.globalAlpha=a,this.context.lineCap="round",this.context.lineWidth=2,i&&"function"==typeof i)i.call(this,this.context);else switch(this.shape){case l.Circle:this.context.beginPath(),this.context.arc(0,0,this.radius,0,2*Math.PI),this.context.fill();break;case l.Square:this.context.fillRect(-this.w/2,-this.h/2,this.w,this.h);break;case l.Strip:this.context.fillRect(-this.w/6,-this.h/2,this.w/3,this.h)}this.context.closePath(),this.context.restore()}}])&&s(e.prototype,t),e}();function p(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var f=function e(t,n){var l=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),p(this,"canvas",void 0),p(this,"context",void 0),p(this,"getOptions",void 0),p(this,"x",0),p(this,"y",0),p(this,"w",0),p(this,"h",0),p(this,"lastNumberOfPieces",0),p(this,"tweenInitTime",Date.now()),p(this,"particles",[]),p(this,"particlesGenerated",0),p(this,"removeParticleAt",(function(e){l.particles.splice(e,1)})),p(this,"getParticle",(function(){var e=u(l.x,l.w+l.x),t=u(l.y,l.h+l.y);return new m(l.context,l.getOptions,e,t)})),p(this,"animate",(function(){var e=l.canvas,t=l.context,n=l.particlesGenerated,o=l.lastNumberOfPieces,r=l.getOptions(),a=r.run,i=r.recycle,d=r.numberOfPieces,u=r.debug,s=r.tweenFunction,c=r.tweenDuration;if(!a)return!1;var m=l.particles.length,p=i?m:n,f=Date.now();if(pc?c:Math.max(0,f-_),p,d,c),g=Math.round(h-p),x=0;xe.height||t.y<-100||t.x>e.width+100||t.x<-100)&&(i&&p<=d?l.particles[n]=l.getParticle():l.removeParticleAt(n))})),m>0||p0&&n.call(l,l),l._options.run=!1)})),g(this,"reset",(function(){l.generator&&l.generator.particlesGenerated>0&&(l.generator.particlesGenerated=0,l.generator.particles=[],l.generator.lastNumberOfPieces=0)})),g(this,"stop",(function(){l.options={run:!1},l.rafId&&(cancelAnimationFrame(l.rafId),l.rafId=void 0)})),this.canvas=t;var o=this.canvas.getContext("2d");if(!o)throw new Error("Could not get canvas context");this.context=o,this.generator=new f(this.canvas,(function(){return l.options})),this.options=n,this.update()}var t;return(t=[{key:"options",get:function(){return this._options},set:function(e){var t=this._options&&this._options.run,n=this._options&&this._options.recycle;this.setOptionsWithDefaults(e),this.generator&&(Object.assign(this.generator,this.options.confettiSource),"boolean"==typeof e.recycle&&e.recycle&&!1===n&&(this.generator.lastNumberOfPieces=this.generator.particles.length)),"boolean"==typeof e.run&&e.run&&!1===t&&this.update()}}])&&h(e.prototype,t),e}();function v(e){return function(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t1?o-1:0),i=1;i0&&(e=setTimeout((function(){return p(a/2)}),.6*n),t=setTimeout((function(){return p(a/4)}),.8*n),l=setTimeout((function(){return p(0)}),n)),function(){n>0&&(clearTimeout(e),clearTimeout(t),clearTimeout(l))}}),[n,a]),r.createElement(ho,null,r.createElement(Im,w({style:{position:"fixed"},height:u,width:s,numberOfPieces:m,drawShape:Om?function(e){var t=Lm[this.shape];t&&e.fill(t)}:void 0},i)))},t.Confirmation=U,t.Container=K,t.ContentBlock=function(e){var t=e.children,n=e.flipped,l=e.images,r=e.imagesFlipped,a=e.className,i=e.noShadow,d=e.tagContent;return l.length>1?o.createElement(K,{className:[no["content-block"],a].filter(Boolean).join(" ")},o.createElement(wl,{alignItems:"center"},o.createElement("div",{className:[no["image-container"],n&&no.flipped].filter(Boolean).join(" ")},o.createElement(to,{images:l,flipped:r,noShadow:i,className:no["image-stack"]})),o.createElement(N,{col:12,lg:5,lgOffset:n?7:0},t))):o.createElement(Un,{alignItems:"center",wrap:"wrap",className:[no["content-block"],a].filter(Boolean).join(" ")},o.createElement("div",{className:[no["image-container"],n&&no.flipped,d&&no.withTag].filter(Boolean).join(" ")},o.createElement(Vn,w({},l[0],{className:[no["single-image"],i&&no["no-shadow"]].filter(Boolean).join(" ")})),d&&o.createElement("div",{className:no.tagContainer},o.createElement("div",{className:no.tag},d))),o.createElement(K,null,o.createElement(wl,null,o.createElement(N,{col:12,lg:5,lgOffset:n?7:0},t))))},t.DatePicker=function(e){var t=r.useRef(null),n=[$c.Calendar,e.className].filter(Boolean).join(" ");return r.createElement(Gc,w({customInput:r.createElement(_l,w({iconProps:{fontSize:"25px"},icon:"calendar",iconVariant:"alternate",onIconClick:function(){return t.current&&t.current.setOpen(!0)}},e.inputProps)),calendarClassName:n,ref:t},e))},t.Error=Z,t.Flex=Un,t.FloatingInfoBlock=Xt,t.H1=function(e){return o.createElement(Zt,w({size:"h1"},e))},t.H2=function(e){return o.createElement(Zt,w({size:"h2"},e))},t.H3=function(e){return o.createElement(Zt,w({size:"h3"},e))},t.H4=Jt,t.H5=en,t.H6=function(e){return o.createElement(Zt,w({size:"h6"},e))},t.HighlightedHeader=im,t.Icon=Gt,t.Image=Vn,t.ImageStack=to,t.Input=_l,t.Label=qn,t.Link=Tl,t.Loader=zl,t.Logo=_o,t.Menu=function(e){var t=e.className,n=e.menuItems,l=e.isActiveItem,a=e.renderItem,i=S(e,["className","menuItems","isActiveItem","renderItem"]),d=o.useRef(null),u=D(o.useState(!1),2),s=u[0],c=u[1],m=D(o.useState(!1),2),p=m[0],f=m[1],_=o.useCallback((function(){var e=d.current;if(e){var t=e.scrollLeft>1,n=e.scrollLeft0&&r.createElement(Gt,{name:"bullet",fontSize:"11px",className:Mm}),r.createElement(Gt,{name:"bell-small",fontSize:"18px",className:Tm})),s>0&&d&&r.createElement("div",{className:Sm},r.createElement("div",{className:Dm,onClick:function(){u(!1)}},r.createElement(Gt,{name:"close",fontSize:"12px"})),t&&r.createElement(en,{className:Em},t),r.createElement("div",{onMouseDown:function(e){return e.preventDefault()}},l)))},t.Pagination=function(e){var t=e.pages,n=e.page,l=e.onPageChange,r=e.PageButtonComponent,a=void 0===r?np:r,i=e.size,d=void 0===i?"small":i,u=e.className,s=$(tp.pagination,tp[d],u),c=function(e,t){return t<6?Array.from(Array(t).keys()):2===e?[0,1,2,"...",t-1]:e===t-3?[0,"...",t-3,t-2,t-1]:e>2&&e0,_=function(e){e!==n&&l(e)};return o.createElement("div",{className:s},o.createElement(a,{className:tp.pageButton,onClick:function(){m||_(n-1)},disabled:m||!f},o.createElement("span",null,o.createElement(Gt,{name:"arrow-left",fontSize:"100%"}))),c.map((function(e,t){return"string"===typeof e?o.createElement("div",{key:"".concat(e,"-").concat(t),className:tp.pageButton},o.createElement("span",null,e)):o.createElement(a,{key:e,className:$(tp.pageButton,e===n&&tp.active),onClick:function(){return _(e)}},o.createElement("span",null,e+1))})),o.createElement(a,{className:tp.pageButton,onClick:function(){p||_(n+1)},disabled:p||!f},o.createElement("span",null,o.createElement(Gt,{name:"arrow-right",fontSize:"100%"}))))},t.Paragraph=hl,t.Placeholder=Cm,t.ProgressBar=function(e){var t=e.className,n=e.progress,l=e.variant,o=void 0===l?"neutral":l,a=S(e,["className","progress","variant"]),i=[yo["progress-bar"],t].filter(Boolean).join(" "),d=[yo["progress-bar-progress"],yo["progress-bar-progress-".concat(o)]].filter(Boolean).join(" ");return r.createElement("div",w({className:i},a),r.createElement("div",{className:d,style:{width:"".concat(n,"%")}}))},t.ProgressTracker=Gm,t.Radio=function(e){var t=e.icon,n=void 0===t?"radio-unchecked":t,l=e.iconChecked,o=void 0===l?"radio-checked":l,a=e.customIcon,i=e.customIconChecked,d=e.customRadioIcon,u=e.customRadioIconChecked,s=S(e,["icon","iconChecked","customIcon","customIconChecked","customRadioIcon","customRadioIconChecked"]);return r.createElement(Jc,w({},s,{type:"radio",icon:n,iconChecked:o,customIcon:a||d,customIconChecked:i||u}))},t.RadioGroup=function(e){var t=e.children,n=e.name,l=e.variant,o=void 0===l?"default":l,a=e.iconVariant,i=e.iconVariantChecked,d=e.iconFontSize,u=e.value,s=e.onChange;return r.createElement("div",null,r.Children.map(t,(function(e){return r.isValidElement(e)?r.createElement("span",{className:em["".concat(o,"-wrapper")]},r.cloneElement(e,{name:n,variant:o,iconVariant:a,iconVariantChecked:i,iconFontSize:d,checked:u===e.props.value,onChange:function(){s(e.props.value)}})):null})))},t.RangeSlider=bl,t.Row=wl,t.Select=function(e){var t=e.className,n=e.children,l=e.label,o=e.id,a=e.style,i=e.error,d=S(e,["className","children","label","id","style","error"]),u=[lo.select,i&&lo.error,d.disabled&&lo.disabled].filter(Boolean).join(" ");return r.createElement(Un,{direction:"column",className:t,style:a},l&&r.createElement(qn,{htmlFor:o||""},l),r.createElement(Un,{alignItems:"center",className:u},r.createElement("select",w({id:o,className:lo["select-element"]},d),n),r.createElement(Gt,{className:lo["select-arrow"],name:"arrow-right",fontSize:"16px"})))},t.Span=gl,t.Table=nm,t.Tabs=rm,t.Text=V,t.TextArea=kl,t.Toggle=Fl,t.Wizard=function(e){var t=e.steps,n=e.currentStepIndex,l=e.title,o=e.subtitle,a=e.children,i=e.backButtonLabel,d=e.onBackButtonClick,u=e.mainControlsComponent;return r.createElement(r.Fragment,null,r.createElement(Gm,{steps:t,currentStepIndex:n}),r.createElement(R,{withShadow:!0,small:!0,className:Qm},r.createElement("div",{className:Km},r.createElement(V,{as:"div",fontSize:"h4"},l),o&&r.createElement("div",null,o)),a,r.createElement("div",{className:$m},i&&d&&r.createElement(ep,{buttonLabel:i,onClick:d}),u&&r.createElement("div",{className:Zm},u()))),i&&d&&r.createElement("div",{className:Jm},r.createElement(ep,{buttonLabel:i,onClick:d})))},t.registerLocale=function(e,t){var n=window;n.__localeData__||(n.__localeData__={}),n.__localeData__[e]=t},t.setDefaultLocale=function(e){window.__localeId__=e}}}]); \ No newline at end of file diff --git a/_next/static/chunks/amp.js b/_next/static/chunks/amp.js deleted file mode 100644 index 807c75cda..000000000 --- a/_next/static/chunks/amp.js +++ /dev/null @@ -1,119 +0,0 @@ -_N_E = -(window["webpackJsonp_N_E"] = window["webpackJsonp_N_E"] || []).push([["amp"],{ - -/***/ "./node_modules/next/dist/client/dev/amp-dev.js": -/*!******************************************************!*\ - !*** ./node_modules/next/dist/client/dev/amp-dev.js ***! - \******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nvar _regeneratorRuntime = __webpack_require__(/*! ./node_modules/next/node_modules/@babel/runtime/regenerator */ \"./node_modules/next/node_modules/@babel/runtime/regenerator/index.js\");\n\nvar _asyncToGenerator = __webpack_require__(/*! ./node_modules/next/node_modules/@babel/runtime/helpers/asyncToGenerator */ \"./node_modules/next/node_modules/@babel/runtime/helpers/asyncToGenerator.js\");\n\nvar _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ \"./node_modules/next/node_modules/@babel/runtime/helpers/interopRequireDefault.js\");\n\nvar _eventSourcePolyfill = _interopRequireDefault(__webpack_require__(/*! ./event-source-polyfill */ \"./node_modules/next/dist/client/dev/event-source-polyfill.js\"));\n\nvar _eventsource = __webpack_require__(/*! ./error-overlay/eventsource */ \"./node_modules/next/dist/client/dev/error-overlay/eventsource.js\");\n\nvar _onDemandEntriesUtils = __webpack_require__(/*! ./on-demand-entries-utils */ \"./node_modules/next/dist/client/dev/on-demand-entries-utils.js\");\n\nvar _fouc = __webpack_require__(/*! ./fouc */ \"./node_modules/next/dist/client/dev/fouc.js\");\n/* globals __webpack_hash__ */\n\n\nif (!window.EventSource) {\n window.EventSource = _eventSourcePolyfill[\"default\"];\n}\n\nvar data = JSON.parse(document.getElementById('__NEXT_DATA__').textContent);\nvar assetPrefix = data.assetPrefix,\n page = data.page;\nassetPrefix = assetPrefix || '';\nvar mostRecentHash = null;\n/* eslint-disable-next-line */\n\nvar curHash = __webpack_require__.h();\nvar hotUpdatePath = assetPrefix + (assetPrefix.endsWith('/') ? '' : '/') + '_next/static/webpack/'; // Is there a newer version of this code available?\n\nfunction isUpdateAvailable() {\n // __webpack_hash__ is the hash of the current compilation.\n // It's a global variable injected by Webpack.\n\n /* eslint-disable-next-line */\n return mostRecentHash !== __webpack_require__.h();\n} // Webpack disallows updates in other states.\n\n\nfunction canApplyUpdates() {\n return module.hot.status() === 'idle';\n} // This function reads code updates on the fly and hard\n// reloads the page when it has changed.\n\n\nfunction tryApplyUpdates() {\n return _tryApplyUpdates.apply(this, arguments);\n}\n\nfunction _tryApplyUpdates() {\n _tryApplyUpdates = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {\n var res, jsonData, curPage, pageUpdated;\n return _regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n if (!(!isUpdateAvailable() || !canApplyUpdates())) {\n _context.next = 2;\n break;\n }\n\n return _context.abrupt(\"return\");\n\n case 2:\n _context.prev = 2;\n _context.next = 5;\n return fetch(\"\".concat(hotUpdatePath).concat(curHash, \".hot-update.json\"));\n\n case 5:\n res = _context.sent;\n _context.next = 8;\n return res.json();\n\n case 8:\n jsonData = _context.sent;\n curPage = page === '/' ? 'index' : page; // webpack 5 uses an array instead\n\n pageUpdated = (Array.isArray(jsonData.c) ? jsonData.c : Object.keys(jsonData.c)).some(function (mod) {\n return mod.indexOf(\"pages\".concat(curPage.substr(0, 1) === '/' ? curPage : \"/\".concat(curPage))) !== -1 || mod.indexOf(\"pages\".concat(curPage.substr(0, 1) === '/' ? curPage : \"/\".concat(curPage)).replace(/\\//g, '\\\\')) !== -1;\n });\n\n if (pageUpdated) {\n document.location.reload(true);\n } else {\n curHash = mostRecentHash;\n }\n\n _context.next = 18;\n break;\n\n case 14:\n _context.prev = 14;\n _context.t0 = _context[\"catch\"](2);\n console.error('Error occurred checking for update', _context.t0);\n document.location.reload(true);\n\n case 18:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee, null, [[2, 14]]);\n }));\n return _tryApplyUpdates.apply(this, arguments);\n}\n\n(0, _eventsource.addMessageListener)(function (event) {\n if (event.data === \"\\uD83D\\uDC93\") {\n return;\n }\n\n try {\n var message = JSON.parse(event.data);\n\n if (message.action === 'sync' || message.action === 'built') {\n if (!message.hash) {\n return;\n }\n\n mostRecentHash = message.hash;\n tryApplyUpdates();\n } else if (message.action === 'reloadPage') {\n document.location.reload(true);\n }\n } catch (ex) {\n console.warn('Invalid HMR message: ' + event.data + '\\n' + ex);\n }\n});\n(0, _onDemandEntriesUtils.setupPing)(assetPrefix, function () {\n return page;\n});\n(0, _fouc.displayContent)();\n\n;\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n var currentExports = module.__proto__.exports;\n var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports on update so we can compare the boundary\n // signatures.\n module.hot.dispose(function (data) {\n data.prevExports = currentExports;\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevExports !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevExports !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ \"./node_modules/next/dist/compiled/webpack/module.js\")(module)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4uLy4uLy4uL2NsaWVudC9kZXYvYW1wLWRldi5qcz80NDc3Il0sIm5hbWVzIjpbIndpbmRvdyIsIkV2ZW50U291cmNlUG9seWZpbGwiLCJkYXRhIiwiSlNPTiIsImRvY3VtZW50IiwiYXNzZXRQcmVmaXgiLCJtb3N0UmVjZW50SGFzaCIsImN1ckhhc2giLCJob3RVcGRhdGVQYXRoIiwibW9kdWxlIiwiaXNVcGRhdGVBdmFpbGFibGUiLCJjYW5BcHBseVVwZGF0ZXMiLCJmZXRjaCIsInJlcyIsImpzb25EYXRhIiwiY3VyUGFnZSIsInBhZ2UiLCJwYWdlVXBkYXRlZCIsIkFycmF5IiwiT2JqZWN0IiwibW9kIiwiY29uc29sZSIsImV2ZW50IiwibWVzc2FnZSIsInRyeUFwcGx5VXBkYXRlcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTtBQUpBOzs7QUFNQSxJQUFJLENBQUNBLE1BQU0sQ0FBWCxhQUF5QjtBQUN2QkEsUUFBTSxDQUFOQSxjQUFxQkMsb0JBQXJCRDtBQUdGOztBQUFBLElBQU1FLElBQUksR0FBR0MsSUFBSSxDQUFKQSxNQUFXQyxRQUFRLENBQVJBLGdDQUF4QixXQUFhRCxDQUFiO0lBQ0ksVyxHQUFKLEksQ0FBSSxXO0lBQUEsSSxHQUFKLEksQ0FBSSxJO0FBQ0pFLFdBQVcsR0FBR0EsV0FBVyxJQUF6QkE7QUFDQSxJQUFJQyxjQUFjLEdBQWxCO0FBQ0E7O0FBQ0EsSUFBSUMsT0FBTyxHQUFYO0FBQ0EsSUFBTUMsYUFBYSxHQUNqQkgsV0FBVyxJQUFJQSxXQUFXLENBQVhBLHFCQUFmQSxHQUFXLENBQVhBLEdBREYsd0IsQ0FHQTs7QUFDQSw2QkFBNkI7QUFDM0I7QUFDQTs7QUFDQTtBQUNBLFNBQU9DLGNBQWMsS0FBckI7QUFHRixDLENBQUE7OztBQUNBLDJCQUEyQjtBQUN6QixTQUFPRyxNQUFNLENBQU5BLGlCQUFQO0FBR0YsQyxDQUFBO0FBQ0E7OztTQUNBLGU7Ozs7OzhFQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGtCQUNNLENBQUNDLGlCQUFELE1BQXdCLENBQUNDLGVBQTdCLEVBREY7QUFBQTtBQUFBO0FBQUE7O0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBS3NCQyxLQUFLLFdBQUlKLGFBQUosU0FBdkIsT0FBdUIsc0JBTDNCOztBQUFBO0FBS1VLLGVBTFY7QUFBQTtBQUFBLG1CQU0yQkEsR0FBRyxDQUExQixJQUF1QkEsRUFOM0I7O0FBQUE7QUFNVUMsb0JBTlY7QUFPVUMsbUJBUFYsR0FPb0JDLElBQUksS0FBSkEsZ0JBQWhCLElBUEosRUFRSTs7QUFDTUMsdUJBVFYsR0FTd0IsQ0FBQ0MsS0FBSyxDQUFMQSxRQUFjSixRQUFRLENBQXRCSSxLQUNqQkosUUFBUSxDQURTSSxJQUVqQkMsTUFBTSxDQUFOQSxLQUFZTCxRQUFRLENBRkosQ0FFaEJLLENBRmdCLE9BR1pDLGFBQUQsRUFBUztBQUNkLHFCQUNFQSxHQUFHLENBQUhBLHVCQUNVTCxPQUFPLENBQVBBLDRDQURWSyxPQUNVTCxDQURWSyxPQUVNLENBRk5BLEtBR0FBLEdBQUcsQ0FBSEEsUUFDRyxlQUNDTCxPQUFPLENBQVBBLDRDQURGLE9BQ0VBLENBREQsRUFBRCxPQUFDLENBQUQsS0FBQyxFQURISyxJQUNHLENBREhBLE1BSU0sQ0FSUjtBQUpGLGFBQW9CLENBVHhCOztBQXlCSSw2QkFBaUI7QUFDZmhCLHNCQUFRLENBQVJBO0FBREYsbUJBRU87QUFDTEcscUJBQU8sR0FBUEE7QUFFSDs7QUE5Qkg7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUErQkljLG1CQUFPLENBQVBBO0FBQ0FqQixvQkFBUSxDQUFSQTs7QUFoQ0o7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRzs7OztBQW9DQSxxQ0FBb0JrQixlQUFELEVBQVc7QUFDNUIsTUFBSUEsS0FBSyxDQUFMQSxTQUFKLGdCQUFtQztBQUNqQztBQUdGOztBQUFBLE1BQUk7QUFDRixRQUFNQyxPQUFPLEdBQUdwQixJQUFJLENBQUpBLE1BQVdtQixLQUFLLENBQWhDLElBQWdCbkIsQ0FBaEI7O0FBRUEsUUFBSW9CLE9BQU8sQ0FBUEEscUJBQTZCQSxPQUFPLENBQVBBLFdBQWpDLFNBQTZEO0FBQzNELFVBQUksQ0FBQ0EsT0FBTyxDQUFaLE1BQW1CO0FBQ2pCO0FBRUZqQjs7QUFBQUEsb0JBQWMsR0FBR2lCLE9BQU8sQ0FBeEJqQjtBQUNBa0IscUJBQWU7QUFMakIsV0FNTyxJQUFJRCxPQUFPLENBQVBBLFdBQUosY0FBcUM7QUFDMUNuQixjQUFRLENBQVJBO0FBRUg7QUFBQyxHQVpGLENBWUUsV0FBVztBQUNYaUIsV0FBTyxDQUFQQSxLQUFhLDBCQUEwQkMsS0FBSyxDQUEvQixjQUFiRDtBQUVIO0FBcEJEO0FBc0JBLGtEQUF1QjtBQUFBLFNBQXZCLElBQXVCO0FBQUEsQ0FBdkI7QUFDQSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvY2xpZW50L2Rldi9hbXAtZGV2LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFscyBfX3dlYnBhY2tfaGFzaF9fICovXG5pbXBvcnQgRXZlbnRTb3VyY2VQb2x5ZmlsbCBmcm9tICcuL2V2ZW50LXNvdXJjZS1wb2x5ZmlsbCdcbmltcG9ydCB7IGFkZE1lc3NhZ2VMaXN0ZW5lciB9IGZyb20gJy4vZXJyb3Itb3ZlcmxheS9ldmVudHNvdXJjZSdcbmltcG9ydCB7IHNldHVwUGluZyB9IGZyb20gJy4vb24tZGVtYW5kLWVudHJpZXMtdXRpbHMnXG5pbXBvcnQgeyBkaXNwbGF5Q29udGVudCB9IGZyb20gJy4vZm91YydcblxuaWYgKCF3aW5kb3cuRXZlbnRTb3VyY2UpIHtcbiAgd2luZG93LkV2ZW50U291cmNlID0gRXZlbnRTb3VyY2VQb2x5ZmlsbFxufVxuXG5jb25zdCBkYXRhID0gSlNPTi5wYXJzZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnX19ORVhUX0RBVEFfXycpLnRleHRDb250ZW50KVxubGV0IHsgYXNzZXRQcmVmaXgsIHBhZ2UgfSA9IGRhdGFcbmFzc2V0UHJlZml4ID0gYXNzZXRQcmVmaXggfHwgJydcbmxldCBtb3N0UmVjZW50SGFzaCA9IG51bGxcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSAqL1xubGV0IGN1ckhhc2ggPSBfX3dlYnBhY2tfaGFzaF9fXG5jb25zdCBob3RVcGRhdGVQYXRoID1cbiAgYXNzZXRQcmVmaXggKyAoYXNzZXRQcmVmaXguZW5kc1dpdGgoJy8nKSA/ICcnIDogJy8nKSArICdfbmV4dC9zdGF0aWMvd2VicGFjay8nXG5cbi8vIElzIHRoZXJlIGEgbmV3ZXIgdmVyc2lvbiBvZiB0aGlzIGNvZGUgYXZhaWxhYmxlP1xuZnVuY3Rpb24gaXNVcGRhdGVBdmFpbGFibGUoKSB7XG4gIC8vIF9fd2VicGFja19oYXNoX18gaXMgdGhlIGhhc2ggb2YgdGhlIGN1cnJlbnQgY29tcGlsYXRpb24uXG4gIC8vIEl0J3MgYSBnbG9iYWwgdmFyaWFibGUgaW5qZWN0ZWQgYnkgV2VicGFjay5cbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICovXG4gIHJldHVybiBtb3N0UmVjZW50SGFzaCAhPT0gX193ZWJwYWNrX2hhc2hfX1xufVxuXG4vLyBXZWJwYWNrIGRpc2FsbG93cyB1cGRhdGVzIGluIG90aGVyIHN0YXRlcy5cbmZ1bmN0aW9uIGNhbkFwcGx5VXBkYXRlcygpIHtcbiAgcmV0dXJuIG1vZHVsZS5ob3Quc3RhdHVzKCkgPT09ICdpZGxlJ1xufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIHJlYWRzIGNvZGUgdXBkYXRlcyBvbiB0aGUgZmx5IGFuZCBoYXJkXG4vLyByZWxvYWRzIHRoZSBwYWdlIHdoZW4gaXQgaGFzIGNoYW5nZWQuXG5hc3luYyBmdW5jdGlvbiB0cnlBcHBseVVwZGF0ZXMoKSB7XG4gIGlmICghaXNVcGRhdGVBdmFpbGFibGUoKSB8fCAhY2FuQXBwbHlVcGRhdGVzKCkpIHtcbiAgICByZXR1cm5cbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke2hvdFVwZGF0ZVBhdGh9JHtjdXJIYXNofS5ob3QtdXBkYXRlLmpzb25gKVxuICAgIGNvbnN0IGpzb25EYXRhID0gYXdhaXQgcmVzLmpzb24oKVxuICAgIGNvbnN0IGN1clBhZ2UgPSBwYWdlID09PSAnLycgPyAnaW5kZXgnIDogcGFnZVxuICAgIC8vIHdlYnBhY2sgNSB1c2VzIGFuIGFycmF5IGluc3RlYWRcbiAgICBjb25zdCBwYWdlVXBkYXRlZCA9IChBcnJheS5pc0FycmF5KGpzb25EYXRhLmMpXG4gICAgICA/IGpzb25EYXRhLmNcbiAgICAgIDogT2JqZWN0LmtleXMoanNvbkRhdGEuYylcbiAgICApLnNvbWUoKG1vZCkgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgbW9kLmluZGV4T2YoXG4gICAgICAgICAgYHBhZ2VzJHtjdXJQYWdlLnN1YnN0cigwLCAxKSA9PT0gJy8nID8gY3VyUGFnZSA6IGAvJHtjdXJQYWdlfWB9YFxuICAgICAgICApICE9PSAtMSB8fFxuICAgICAgICBtb2QuaW5kZXhPZihcbiAgICAgICAgICBgcGFnZXMke1xuICAgICAgICAgICAgY3VyUGFnZS5zdWJzdHIoMCwgMSkgPT09ICcvJyA/IGN1clBhZ2UgOiBgLyR7Y3VyUGFnZX1gXG4gICAgICAgICAgfWAucmVwbGFjZSgvXFwvL2csICdcXFxcJylcbiAgICAgICAgKSAhPT0gLTFcbiAgICAgIClcbiAgICB9KVxuXG4gICAgaWYgKHBhZ2VVcGRhdGVkKSB7XG4gICAgICBkb2N1bWVudC5sb2NhdGlvbi5yZWxvYWQodHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgY3VySGFzaCA9IG1vc3RSZWNlbnRIYXNoXG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zb2xlLmVycm9yKCdFcnJvciBvY2N1cnJlZCBjaGVja2luZyBmb3IgdXBkYXRlJywgZXJyKVxuICAgIGRvY3VtZW50LmxvY2F0aW9uLnJlbG9hZCh0cnVlKVxuICB9XG59XG5cbmFkZE1lc3NhZ2VMaXN0ZW5lcigoZXZlbnQpID0+IHtcbiAgaWYgKGV2ZW50LmRhdGEgPT09ICdcXHVEODNEXFx1REM5MycpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSlcblxuICAgIGlmIChtZXNzYWdlLmFjdGlvbiA9PT0gJ3N5bmMnIHx8IG1lc3NhZ2UuYWN0aW9uID09PSAnYnVpbHQnKSB7XG4gICAgICBpZiAoIW1lc3NhZ2UuaGFzaCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIG1vc3RSZWNlbnRIYXNoID0gbWVzc2FnZS5oYXNoXG4gICAgICB0cnlBcHBseVVwZGF0ZXMoKVxuICAgIH0gZWxzZSBpZiAobWVzc2FnZS5hY3Rpb24gPT09ICdyZWxvYWRQYWdlJykge1xuICAgICAgZG9jdW1lbnQubG9jYXRpb24ucmVsb2FkKHRydWUpXG4gICAgfVxuICB9IGNhdGNoIChleCkge1xuICAgIGNvbnNvbGUud2FybignSW52YWxpZCBITVIgbWVzc2FnZTogJyArIGV2ZW50LmRhdGEgKyAnXFxuJyArIGV4KVxuICB9XG59KVxuXG5zZXR1cFBpbmcoYXNzZXRQcmVmaXgsICgpID0+IHBhZ2UpXG5kaXNwbGF5Q29udGVudCgpXG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/next/dist/client/dev/amp-dev.js\n"); - -/***/ }), - -/***/ "./node_modules/next/dist/client/dev/error-overlay/eventsource.js": -/*!************************************************************************!*\ - !*** ./node_modules/next/dist/client/dev/error-overlay/eventsource.js ***! - \************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nexports.__esModule = true;\nexports.addMessageListener = addMessageListener;\nexports.getEventSourceWrapper = getEventSourceWrapper;\nvar eventCallbacks = [];\n\nfunction EventSourceWrapper(options) {\n var source;\n var lastActivity = new Date();\n var listeners = [];\n\n if (!options.timeout) {\n options.timeout = 20 * 1000;\n }\n\n init();\n var timer = setInterval(function () {\n if (new Date() - lastActivity > options.timeout) {\n handleDisconnect();\n }\n }, options.timeout / 2);\n\n function init() {\n source = new window.EventSource(options.path);\n source.onopen = handleOnline;\n source.onerror = handleDisconnect;\n source.onmessage = handleMessage;\n }\n\n function handleOnline() {\n if (options.log) console.log('[HMR] connected');\n lastActivity = new Date();\n }\n\n function handleMessage(event) {\n lastActivity = new Date();\n\n for (var i = 0; i < listeners.length; i++) {\n listeners[i](event);\n }\n\n eventCallbacks.forEach(function (cb) {\n if (!cb.unfiltered && event.data.indexOf('action') === -1) return;\n cb(event);\n });\n }\n\n function handleDisconnect() {\n clearInterval(timer);\n source.close();\n setTimeout(init, options.timeout);\n }\n\n return {\n close: function close() {\n clearInterval(timer);\n source.close();\n },\n addMessageListener: function addMessageListener(fn) {\n listeners.push(fn);\n }\n };\n}\n\n_c = EventSourceWrapper;\n\nfunction addMessageListener(cb) {\n eventCallbacks.push(cb);\n}\n\nfunction getEventSourceWrapper(options) {\n return EventSourceWrapper(options);\n}\n\nvar _c;\n\n$RefreshReg$(_c, \"EventSourceWrapper\");\n\n;\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n var currentExports = module.__proto__.exports;\n var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports on update so we can compare the boundary\n // signatures.\n module.hot.dispose(function (data) {\n data.prevExports = currentExports;\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevExports !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevExports !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../compiled/webpack/module.js */ \"./node_modules/next/dist/compiled/webpack/module.js\")(module)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4uLy4uLy4uLy4uL2NsaWVudC9kZXYvZXJyb3Itb3ZlcmxheS9ldmVudHNvdXJjZS5qcz85YjQyIl0sIm5hbWVzIjpbImV2ZW50Q2FsbGJhY2tzIiwibGFzdEFjdGl2aXR5IiwibGlzdGVuZXJzIiwib3B0aW9ucyIsImluaXQiLCJ0aW1lciIsInNldEludGVydmFsIiwiaGFuZGxlRGlzY29ubmVjdCIsInNvdXJjZSIsIndpbmRvdyIsImNvbnNvbGUiLCJpIiwiY2IiLCJldmVudCIsImNsZWFySW50ZXJ2YWwiLCJzZXRUaW1lb3V0IiwiY2xvc2UiLCJhZGRNZXNzYWdlTGlzdGVuZXIiLCJFdmVudFNvdXJjZVdyYXBwZXIiXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsSUFBTUEsY0FBYyxHQUFwQjs7QUFFQSxxQ0FBcUM7QUFDbkM7QUFDQSxNQUFJQyxZQUFZLEdBQUcsSUFBbkIsSUFBbUIsRUFBbkI7QUFDQSxNQUFJQyxTQUFTLEdBQWI7O0FBRUEsTUFBSSxDQUFDQyxPQUFPLENBQVosU0FBc0I7QUFDcEJBLFdBQU8sQ0FBUEEsVUFBa0IsS0FBbEJBO0FBR0ZDOztBQUFBQSxNQUFJO0FBQ0osTUFBSUMsS0FBSyxHQUFHQyxXQUFXLENBQUMsWUFBWTtBQUNsQyxRQUFJLDRCQUE0QkgsT0FBTyxDQUF2QyxTQUFpRDtBQUMvQ0ksc0JBQWdCO0FBRW5CO0FBSnNCLEtBSXBCSixPQUFPLENBQVBBLFVBSkgsQ0FBdUIsQ0FBdkI7O0FBTUEsa0JBQWdCO0FBQ2RLLFVBQU0sR0FBRyxJQUFJQyxNQUFNLENBQVYsWUFBdUJOLE9BQU8sQ0FBdkNLLElBQVMsQ0FBVEE7QUFDQUEsVUFBTSxDQUFOQTtBQUNBQSxVQUFNLENBQU5BO0FBQ0FBLFVBQU0sQ0FBTkE7QUFHRjs7QUFBQSwwQkFBd0I7QUFDdEIsUUFBSUwsT0FBTyxDQUFYLEtBQWlCTyxPQUFPLENBQVBBO0FBQ2pCVCxnQkFBWSxHQUFHLElBQWZBLElBQWUsRUFBZkE7QUFHRjs7QUFBQSxnQ0FBOEI7QUFDNUJBLGdCQUFZLEdBQUcsSUFBZkEsSUFBZSxFQUFmQTs7QUFDQSxTQUFLLElBQUlVLENBQUMsR0FBVixHQUFnQkEsQ0FBQyxHQUFHVCxTQUFTLENBQTdCLFFBQXNDUyxDQUF0QyxJQUEyQztBQUN6Q1QsZUFBUyxDQUFUQSxDQUFTLENBQVRBO0FBR0ZGOztBQUFBQSxrQkFBYyxDQUFkQSxRQUF3QlksWUFBRCxFQUFRO0FBQzdCLFVBQUksQ0FBQ0EsRUFBRSxDQUFILGNBQWtCQyxLQUFLLENBQUxBLDJCQUFpQyxDQUF2RCxHQUEyRDtBQUMzREQsUUFBRSxDQUFGQSxLQUFFLENBQUZBO0FBRkZaO0FBTUY7O0FBQUEsOEJBQTRCO0FBQzFCYyxpQkFBYSxDQUFiQSxLQUFhLENBQWJBO0FBQ0FOLFVBQU0sQ0FBTkE7QUFDQU8sY0FBVSxPQUFPWixPQUFPLENBQXhCWSxPQUFVLENBQVZBO0FBR0Y7O0FBQUEsU0FBTztBQUNMQyxTQUFLLEVBQUUsaUJBQU07QUFDWEYsbUJBQWEsQ0FBYkEsS0FBYSxDQUFiQTtBQUNBTixZQUFNLENBQU5BO0FBSEc7QUFLTFMsc0JBQWtCLEVBQUUsZ0NBQWM7QUFDaENmLGVBQVMsQ0FBVEE7QUFOSjtBQUFPLEdBQVA7QUFXSzs7S0F6RFAsa0I7O0FBeURPLGdDQUFnQztBQUNyQ0YsZ0JBQWMsQ0FBZEE7QUFHSzs7QUFBQSx3Q0FBd0M7QUFDN0MsU0FBT2tCLGtCQUFrQixDQUF6QixPQUF5QixDQUF6QjtBQUNEIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL25leHQvZGlzdC9jbGllbnQvZGV2L2Vycm9yLW92ZXJsYXkvZXZlbnRzb3VyY2UuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBldmVudENhbGxiYWNrcyA9IFtdXG5cbmZ1bmN0aW9uIEV2ZW50U291cmNlV3JhcHBlcihvcHRpb25zKSB7XG4gIHZhciBzb3VyY2VcbiAgdmFyIGxhc3RBY3Rpdml0eSA9IG5ldyBEYXRlKClcbiAgdmFyIGxpc3RlbmVycyA9IFtdXG5cbiAgaWYgKCFvcHRpb25zLnRpbWVvdXQpIHtcbiAgICBvcHRpb25zLnRpbWVvdXQgPSAyMCAqIDEwMDBcbiAgfVxuXG4gIGluaXQoKVxuICB2YXIgdGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKG5ldyBEYXRlKCkgLSBsYXN0QWN0aXZpdHkgPiBvcHRpb25zLnRpbWVvdXQpIHtcbiAgICAgIGhhbmRsZURpc2Nvbm5lY3QoKVxuICAgIH1cbiAgfSwgb3B0aW9ucy50aW1lb3V0IC8gMilcblxuICBmdW5jdGlvbiBpbml0KCkge1xuICAgIHNvdXJjZSA9IG5ldyB3aW5kb3cuRXZlbnRTb3VyY2Uob3B0aW9ucy5wYXRoKVxuICAgIHNvdXJjZS5vbm9wZW4gPSBoYW5kbGVPbmxpbmVcbiAgICBzb3VyY2Uub25lcnJvciA9IGhhbmRsZURpc2Nvbm5lY3RcbiAgICBzb3VyY2Uub25tZXNzYWdlID0gaGFuZGxlTWVzc2FnZVxuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlT25saW5lKCkge1xuICAgIGlmIChvcHRpb25zLmxvZykgY29uc29sZS5sb2coJ1tITVJdIGNvbm5lY3RlZCcpXG4gICAgbGFzdEFjdGl2aXR5ID0gbmV3IERhdGUoKVxuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlTWVzc2FnZShldmVudCkge1xuICAgIGxhc3RBY3Rpdml0eSA9IG5ldyBEYXRlKClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgbGlzdGVuZXJzW2ldKGV2ZW50KVxuICAgIH1cblxuICAgIGV2ZW50Q2FsbGJhY2tzLmZvckVhY2goKGNiKSA9PiB7XG4gICAgICBpZiAoIWNiLnVuZmlsdGVyZWQgJiYgZXZlbnQuZGF0YS5pbmRleE9mKCdhY3Rpb24nKSA9PT0gLTEpIHJldHVyblxuICAgICAgY2IoZXZlbnQpXG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZURpc2Nvbm5lY3QoKSB7XG4gICAgY2xlYXJJbnRlcnZhbCh0aW1lcilcbiAgICBzb3VyY2UuY2xvc2UoKVxuICAgIHNldFRpbWVvdXQoaW5pdCwgb3B0aW9ucy50aW1lb3V0KVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjbG9zZTogKCkgPT4ge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcilcbiAgICAgIHNvdXJjZS5jbG9zZSgpXG4gICAgfSxcbiAgICBhZGRNZXNzYWdlTGlzdGVuZXI6IGZ1bmN0aW9uIChmbikge1xuICAgICAgbGlzdGVuZXJzLnB1c2goZm4pXG4gICAgfSxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkTWVzc2FnZUxpc3RlbmVyKGNiKSB7XG4gIGV2ZW50Q2FsbGJhY2tzLnB1c2goY2IpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFdmVudFNvdXJjZVdyYXBwZXIob3B0aW9ucykge1xuICByZXR1cm4gRXZlbnRTb3VyY2VXcmFwcGVyKG9wdGlvbnMpXG59XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/next/dist/client/dev/error-overlay/eventsource.js\n"); - -/***/ }), - -/***/ "./node_modules/next/dist/client/dev/event-source-polyfill.js": -/*!********************************************************************!*\ - !*** ./node_modules/next/dist/client/dev/event-source-polyfill.js ***! - \********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nexports.__esModule = true;\nexports[\"default\"] = void 0;\n/* eslint-disable */\n// Improved version of https://github.com/Yaffle/EventSource/\n// Available under MIT License (MIT)\n// Only tries to support IE11 and nothing below\n\nvar document = window.document;\nvar Response = window.Response;\nvar TextDecoder = window.TextDecoder;\nvar TextEncoder = window.TextEncoder;\nvar AbortController = window.AbortController;\n\nif (AbortController == undefined) {\n AbortController = function AbortController() {\n this.signal = null;\n\n this.abort = function () {};\n };\n}\n\nfunction TextDecoderPolyfill() {\n this.bitsNeeded = 0;\n this.codePoint = 0;\n}\n\n_c = TextDecoderPolyfill;\n\nTextDecoderPolyfill.prototype.decode = function (octets) {\n function valid(codePoint, shift, octetsCount) {\n if (octetsCount === 1) {\n return codePoint >= 0x0080 >> shift && codePoint << shift <= 0x07ff;\n }\n\n if (octetsCount === 2) {\n return codePoint >= 0x0800 >> shift && codePoint << shift <= 0xd7ff || codePoint >= 0xe000 >> shift && codePoint << shift <= 0xffff;\n }\n\n if (octetsCount === 3) {\n return codePoint >= 0x010000 >> shift && codePoint << shift <= 0x10ffff;\n }\n\n throw new Error();\n }\n\n function octetsCount(bitsNeeded, codePoint) {\n if (bitsNeeded === 6 * 1) {\n return codePoint >> 6 > 15 ? 3 : codePoint > 31 ? 2 : 1;\n }\n\n if (bitsNeeded === 6 * 2) {\n return codePoint > 15 ? 3 : 2;\n }\n\n if (bitsNeeded === 6 * 3) {\n return 3;\n }\n\n throw new Error();\n }\n\n var REPLACER = 0xfffd;\n var string = '';\n var bitsNeeded = this.bitsNeeded;\n var codePoint = this.codePoint;\n\n for (var i = 0; i < octets.length; i += 1) {\n var octet = octets[i];\n\n if (bitsNeeded !== 0) {\n if (octet < 128 || octet > 191 || !valid(codePoint << 6 | octet & 63, bitsNeeded - 6, octetsCount(bitsNeeded, codePoint))) {\n bitsNeeded = 0;\n codePoint = REPLACER;\n string += String.fromCharCode(codePoint);\n }\n }\n\n if (bitsNeeded === 0) {\n if (octet >= 0 && octet <= 127) {\n bitsNeeded = 0;\n codePoint = octet;\n } else if (octet >= 192 && octet <= 223) {\n bitsNeeded = 6 * 1;\n codePoint = octet & 31;\n } else if (octet >= 224 && octet <= 239) {\n bitsNeeded = 6 * 2;\n codePoint = octet & 15;\n } else if (octet >= 240 && octet <= 247) {\n bitsNeeded = 6 * 3;\n codePoint = octet & 7;\n } else {\n bitsNeeded = 0;\n codePoint = REPLACER;\n }\n\n if (bitsNeeded !== 0 && !valid(codePoint, bitsNeeded, octetsCount(bitsNeeded, codePoint))) {\n bitsNeeded = 0;\n codePoint = REPLACER;\n }\n } else {\n bitsNeeded -= 6;\n codePoint = codePoint << 6 | octet & 63;\n }\n\n if (bitsNeeded === 0) {\n if (codePoint <= 0xffff) {\n string += String.fromCharCode(codePoint);\n } else {\n string += String.fromCharCode(0xd800 + (codePoint - 0xffff - 1 >> 10));\n string += String.fromCharCode(0xdc00 + (codePoint - 0xffff - 1 & 0x3ff));\n }\n }\n }\n\n this.bitsNeeded = bitsNeeded;\n this.codePoint = codePoint;\n return string;\n}; // Firefox < 38 throws an error with stream option\n\n\nvar supportsStreamOption = function supportsStreamOption() {\n try {\n return new TextDecoder().decode(new TextEncoder().encode('test'), {\n stream: true\n }) === 'test';\n } catch (error) {\n console.log(error);\n }\n\n return false;\n}; // IE, Edge\n\n\nif (TextDecoder == undefined || TextEncoder == undefined || !supportsStreamOption()) {\n TextDecoder = TextDecoderPolyfill;\n}\n\nvar k = function k() {};\n\nfunction XHRWrapper(xhr) {\n this.withCredentials = false;\n this.responseType = '';\n this.readyState = 0;\n this.status = 0;\n this.statusText = '';\n this.responseText = '';\n this.onprogress = k;\n this.onreadystatechange = k;\n this._contentType = '';\n this._xhr = xhr;\n this._sendTimeout = 0;\n this._abort = k;\n}\n\n_c2 = XHRWrapper;\n\nXHRWrapper.prototype.open = function (method, url) {\n this._abort(true);\n\n var that = this;\n var xhr = this._xhr;\n var state = 1;\n var timeout = 0;\n\n this._abort = function (silent) {\n if (that._sendTimeout !== 0) {\n clearTimeout(that._sendTimeout);\n that._sendTimeout = 0;\n }\n\n if (state === 1 || state === 2 || state === 3) {\n state = 4;\n xhr.onload = k;\n xhr.onerror = k;\n xhr.onabort = k;\n xhr.onprogress = k;\n xhr.onreadystatechange = k; // IE 8 - 9: XDomainRequest#abort() does not fire any event\n // Opera < 10: XMLHttpRequest#abort() does not fire any event\n\n xhr.abort();\n\n if (timeout !== 0) {\n clearTimeout(timeout);\n timeout = 0;\n }\n\n if (!silent) {\n that.readyState = 4;\n that.onreadystatechange();\n }\n }\n\n state = 0;\n };\n\n var onStart = function onStart() {\n if (state === 1) {\n // state = 2;\n var status = 0;\n var statusText = '';\n var contentType = undefined;\n\n if (!('contentType' in xhr)) {\n try {\n status = xhr.status;\n statusText = xhr.statusText;\n contentType = xhr.getResponseHeader('Content-Type');\n } catch (error) {\n // IE < 10 throws exception for `xhr.status` when xhr.readyState === 2 || xhr.readyState === 3\n // Opera < 11 throws exception for `xhr.status` when xhr.readyState === 2\n // https://bugs.webkit.org/show_bug.cgi?id=29121\n status = 0;\n statusText = '';\n contentType = undefined; // Firefox < 14, Chrome ?, Safari ?\n // https://bugs.webkit.org/show_bug.cgi?id=29658\n // https://bugs.webkit.org/show_bug.cgi?id=77854\n }\n } else {\n status = 200;\n statusText = 'OK';\n contentType = xhr.contentType;\n }\n\n if (status !== 0) {\n state = 2;\n that.readyState = 2;\n that.status = status;\n that.statusText = statusText;\n that._contentType = contentType;\n that.onreadystatechange();\n }\n }\n };\n\n var onProgress = function onProgress() {\n onStart();\n\n if (state === 2 || state === 3) {\n state = 3;\n var responseText = '';\n\n try {\n responseText = xhr.responseText;\n } catch (error) {// IE 8 - 9 with XMLHttpRequest\n }\n\n that.readyState = 3;\n that.responseText = responseText;\n that.onprogress();\n }\n };\n\n var onFinish = function onFinish() {\n // Firefox 52 fires \"readystatechange\" (xhr.readyState === 4) without final \"readystatechange\" (xhr.readyState === 3)\n // IE 8 fires \"onload\" without \"onprogress\"\n onProgress();\n\n if (state === 1 || state === 2 || state === 3) {\n state = 4;\n\n if (timeout !== 0) {\n clearTimeout(timeout);\n timeout = 0;\n }\n\n that.readyState = 4;\n that.onreadystatechange();\n }\n };\n\n var onReadyStateChange = function onReadyStateChange() {\n if (xhr != undefined) {\n // Opera 12\n if (xhr.readyState === 4) {\n onFinish();\n } else if (xhr.readyState === 3) {\n onProgress();\n } else if (xhr.readyState === 2) {\n onStart();\n }\n }\n };\n\n var onTimeout = function onTimeout() {\n timeout = setTimeout(function () {\n onTimeout();\n }, 500);\n\n if (xhr.readyState === 3) {\n onProgress();\n }\n }; // XDomainRequest#abort removes onprogress, onerror, onload\n\n\n xhr.onload = onFinish;\n xhr.onerror = onFinish; // improper fix to match Firefox behavior, but it is better than just ignore abort\n // see https://bugzilla.mozilla.org/show_bug.cgi?id=768596\n // https://bugzilla.mozilla.org/show_bug.cgi?id=880200\n // https://code.google.com/p/chromium/issues/detail?id=153570\n // IE 8 fires \"onload\" without \"onprogress\n\n xhr.onabort = onFinish; // https://bugzilla.mozilla.org/show_bug.cgi?id=736723\n\n if (!('sendAsBinary' in XMLHttpRequest.prototype) && !('mozAnon' in XMLHttpRequest.prototype)) {\n xhr.onprogress = onProgress;\n } // IE 8 - 9 (XMLHTTPRequest)\n // Opera < 12\n // Firefox < 3.5\n // Firefox 3.5 - 3.6 - ? < 9.0\n // onprogress is not fired sometimes or delayed\n // see also #64\n\n\n xhr.onreadystatechange = onReadyStateChange;\n\n if ('contentType' in xhr) {\n url += (url.indexOf('?') === -1 ? '?' : '&') + 'padding=true';\n }\n\n xhr.open(method, url, true);\n\n if ('readyState' in xhr) {\n // workaround for Opera 12 issue with \"progress\" events\n // #91\n timeout = setTimeout(function () {\n onTimeout();\n }, 0);\n }\n};\n\nXHRWrapper.prototype.abort = function () {\n this._abort(false);\n};\n\nXHRWrapper.prototype.getResponseHeader = function (name) {\n return this._contentType;\n};\n\nXHRWrapper.prototype.setRequestHeader = function (name, value) {\n var xhr = this._xhr;\n\n if ('setRequestHeader' in xhr) {\n xhr.setRequestHeader(name, value);\n }\n};\n\nXHRWrapper.prototype.getAllResponseHeaders = function () {\n return this._xhr.getAllResponseHeaders != undefined ? this._xhr.getAllResponseHeaders() : '';\n};\n\nXHRWrapper.prototype.send = function () {\n // loading indicator in Safari < ? (6), Chrome < 14, Firefox\n if (!('ontimeout' in XMLHttpRequest.prototype) && document != undefined && document.readyState != undefined && document.readyState !== 'complete') {\n var that = this;\n that._sendTimeout = setTimeout(function () {\n that._sendTimeout = 0;\n that.send();\n }, 4);\n return;\n }\n\n var xhr = this._xhr; // withCredentials should be set after \"open\" for Safari and Chrome (< 19 ?)\n\n xhr.withCredentials = this.withCredentials;\n xhr.responseType = this.responseType;\n\n try {\n // xhr.send(); throws \"Not enough arguments\" in Firefox 3.0\n xhr.send(undefined);\n } catch (error1) {\n // Safari 5.1.7, Opera 12\n throw error1;\n }\n};\n\nfunction toLowerCase(name) {\n return name.replace(/[A-Z]/g, function (c) {\n return String.fromCharCode(c.charCodeAt(0) + 0x20);\n });\n}\n\nfunction HeadersPolyfill(all) {\n // Get headers: implemented according to mozilla's example code: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/getAllResponseHeaders#Example\n var map = Object.create(null);\n var array = all.split('\\r\\n');\n\n for (var i = 0; i < array.length; i += 1) {\n var line = array[i];\n var parts = line.split(': ');\n var name = parts.shift();\n var value = parts.join(': ');\n map[toLowerCase(name)] = value;\n }\n\n this._map = map;\n}\n\n_c3 = HeadersPolyfill;\n\nHeadersPolyfill.prototype.get = function (name) {\n return this._map[toLowerCase(name)];\n};\n\nfunction XHRTransport() {}\n\n_c4 = XHRTransport;\n\nXHRTransport.prototype.open = function (xhr, onStartCallback, onProgressCallback, onFinishCallback, url, withCredentials, headers) {\n xhr.open('GET', url);\n var offset = 0;\n\n xhr.onprogress = function () {\n var responseText = xhr.responseText;\n var chunk = responseText.slice(offset);\n offset += chunk.length;\n onProgressCallback(chunk);\n };\n\n xhr.onreadystatechange = function () {\n if (xhr.readyState === 2) {\n var status = xhr.status;\n var statusText = xhr.statusText;\n var contentType = xhr.getResponseHeader('Content-Type');\n var headers = xhr.getAllResponseHeaders();\n onStartCallback(status, statusText, contentType, new HeadersPolyfill(headers), function () {\n xhr.abort();\n });\n } else if (xhr.readyState === 4) {\n onFinishCallback();\n }\n };\n\n xhr.withCredentials = withCredentials;\n xhr.responseType = 'text';\n\n for (var name in headers) {\n if (Object.prototype.hasOwnProperty.call(headers, name)) {\n xhr.setRequestHeader(name, headers[name]);\n }\n }\n\n xhr.send();\n};\n\nfunction HeadersWrapper(headers) {\n this._headers = headers;\n}\n\n_c5 = HeadersWrapper;\n\nHeadersWrapper.prototype.get = function (name) {\n return this._headers.get(name);\n};\n\nfunction FetchTransport() {}\n\n_c6 = FetchTransport;\n\nFetchTransport.prototype.open = function (xhr, onStartCallback, onProgressCallback, onFinishCallback, url, withCredentials, headers) {\n var controller = new AbortController();\n var signal = controller.signal; // see #120\n\n var textDecoder = new TextDecoder();\n fetch(url, {\n headers: headers,\n credentials: withCredentials ? 'include' : 'same-origin',\n signal: signal,\n cache: 'no-store'\n }).then(function (response) {\n var reader = response.body.getReader();\n onStartCallback(response.status, response.statusText, response.headers.get('Content-Type'), new HeadersWrapper(response.headers), function () {\n controller.abort();\n reader.cancel();\n });\n return new Promise(function (resolve, reject) {\n var readNextChunk = function readNextChunk() {\n reader.read().then(function (result) {\n if (result.done) {\n // Note: bytes in textDecoder are ignored\n resolve(undefined);\n } else {\n var chunk = textDecoder.decode(result.value, {\n stream: true\n });\n onProgressCallback(chunk);\n readNextChunk();\n }\n })['catch'](function (error) {\n reject(error);\n });\n };\n\n readNextChunk();\n });\n }).then(function (result) {\n onFinishCallback();\n return result;\n }, function (error) {\n onFinishCallback();\n return Promise.reject(error);\n });\n};\n\nfunction EventTarget() {\n this._listeners = Object.create(null);\n}\n\n_c7 = EventTarget;\n\nfunction throwError(e) {\n setTimeout(function () {\n throw e;\n }, 0);\n}\n\nEventTarget.prototype.dispatchEvent = function (event) {\n event.target = this;\n var typeListeners = this._listeners[event.type];\n\n if (typeListeners != undefined) {\n var length = typeListeners.length;\n\n for (var i = 0; i < length; i += 1) {\n var listener = typeListeners[i];\n\n try {\n if (typeof listener.handleEvent === 'function') {\n listener.handleEvent(event);\n } else {\n listener.call(this, event);\n }\n } catch (e) {\n throwError(e);\n }\n }\n }\n};\n\nEventTarget.prototype.addEventListener = function (type, listener) {\n type = String(type);\n var listeners = this._listeners;\n var typeListeners = listeners[type];\n\n if (typeListeners == undefined) {\n typeListeners = [];\n listeners[type] = typeListeners;\n }\n\n var found = false;\n\n for (var i = 0; i < typeListeners.length; i += 1) {\n if (typeListeners[i] === listener) {\n found = true;\n }\n }\n\n if (!found) {\n typeListeners.push(listener);\n }\n};\n\nEventTarget.prototype.removeEventListener = function (type, listener) {\n type = String(type);\n var listeners = this._listeners;\n var typeListeners = listeners[type];\n\n if (typeListeners != undefined) {\n var filtered = [];\n\n for (var i = 0; i < typeListeners.length; i += 1) {\n if (typeListeners[i] !== listener) {\n filtered.push(typeListeners[i]);\n }\n }\n\n if (filtered.length === 0) {\n delete listeners[type];\n } else {\n listeners[type] = filtered;\n }\n }\n};\n\nfunction Event(type) {\n this.type = type;\n this.target = undefined;\n}\n\n_c8 = Event;\n\nfunction MessageEvent(type, options) {\n Event.call(this, type);\n this.data = options.data;\n this.lastEventId = options.lastEventId;\n}\n\n_c9 = MessageEvent;\nMessageEvent.prototype = Object.create(Event.prototype);\n\nfunction ConnectionEvent(type, options) {\n Event.call(this, type);\n this.status = options.status;\n this.statusText = options.statusText;\n this.headers = options.headers;\n}\n\n_c10 = ConnectionEvent;\nConnectionEvent.prototype = Object.create(Event.prototype);\nvar WAITING = -1;\nvar CONNECTING = 0;\nvar OPEN = 1;\nvar CLOSED = 2;\nvar AFTER_CR = -1;\nvar FIELD_START = 0;\nvar FIELD = 1;\nvar VALUE_START = 2;\nvar VALUE = 3;\nvar contentTypeRegExp = /^text\\/event\\-stream;?(\\s*charset\\=utf\\-8)?$/i;\nvar MINIMUM_DURATION = 1000;\nvar MAXIMUM_DURATION = 18000000;\n\nvar parseDuration = function parseDuration(value, def) {\n var n = parseInt(value, 10);\n\n if (n !== n) {\n n = def;\n }\n\n return clampDuration(n);\n};\n\nvar clampDuration = function clampDuration(n) {\n return Math.min(Math.max(n, MINIMUM_DURATION), MAXIMUM_DURATION);\n};\n\nvar fire = function fire(that, f, event) {\n try {\n if (typeof f === 'function') {\n f.call(that, event);\n }\n } catch (e) {\n throwError(e);\n }\n};\n\nfunction EventSourcePolyfill(url, options) {\n EventTarget.call(this);\n this.onopen = undefined;\n this.onmessage = undefined;\n this.onerror = undefined;\n this.url = undefined;\n this.readyState = undefined;\n this.withCredentials = undefined;\n this._close = undefined;\n start(this, url, options);\n}\n\n_c11 = EventSourcePolyfill;\nvar isFetchSupported = fetch != undefined && Response != undefined && 'body' in Response.prototype;\n\nfunction start(es, url, options) {\n url = String(url);\n var withCredentials = options != undefined && Boolean(options.withCredentials);\n var initialRetry = clampDuration(1000);\n var heartbeatTimeout = options != undefined && options.heartbeatTimeout != undefined ? parseDuration(options.heartbeatTimeout, 45000) : clampDuration(45000);\n var lastEventId = '';\n var retry = initialRetry;\n var wasActivity = false;\n var headers = options != undefined && options.headers != undefined ? JSON.parse(JSON.stringify(options.headers)) : undefined;\n var CurrentTransport = options != undefined && options.Transport != undefined ? options.Transport : XMLHttpRequest;\n var xhr = isFetchSupported && !(options != undefined && options.Transport != undefined) ? undefined : new XHRWrapper(new CurrentTransport());\n var transport = xhr == undefined ? new FetchTransport() : new XHRTransport();\n var cancelFunction = undefined;\n var timeout = 0;\n var currentState = WAITING;\n var dataBuffer = '';\n var lastEventIdBuffer = '';\n var eventTypeBuffer = '';\n var textBuffer = '';\n var state = FIELD_START;\n var fieldStart = 0;\n var valueStart = 0;\n\n var onStart = function onStart(status, statusText, contentType, headers, cancel) {\n if (currentState === CONNECTING) {\n cancelFunction = cancel;\n\n if (status === 200 && contentType != undefined && contentTypeRegExp.test(contentType)) {\n currentState = OPEN;\n wasActivity = true;\n retry = initialRetry;\n es.readyState = OPEN;\n var event = new ConnectionEvent('open', {\n status: status,\n statusText: statusText,\n headers: headers\n });\n es.dispatchEvent(event);\n fire(es, es.onopen, event);\n } else {\n var message = '';\n\n if (status !== 200) {\n if (statusText) {\n statusText = statusText.replace(/\\s+/g, ' ');\n }\n\n message = \"EventSource's response has a status \" + status + ' ' + statusText + ' that is not 200. Aborting the connection.';\n } else {\n message = \"EventSource's response has a Content-Type specifying an unsupported type: \" + (contentType == undefined ? '-' : contentType.replace(/\\s+/g, ' ')) + '. Aborting the connection.';\n }\n\n throwError(new Error(message));\n close();\n var event = new ConnectionEvent('error', {\n status: status,\n statusText: statusText,\n headers: headers\n });\n es.dispatchEvent(event);\n fire(es, es.onerror, event);\n }\n }\n };\n\n var onProgress = function onProgress(textChunk) {\n if (currentState === OPEN) {\n var n = -1;\n\n for (var i = 0; i < textChunk.length; i += 1) {\n var c = textChunk.charCodeAt(i);\n\n if (c === '\\n'.charCodeAt(0) || c === '\\r'.charCodeAt(0)) {\n n = i;\n }\n }\n\n var chunk = (n !== -1 ? textBuffer : '') + textChunk.slice(0, n + 1);\n textBuffer = (n === -1 ? textBuffer : '') + textChunk.slice(n + 1);\n\n if (chunk !== '') {\n wasActivity = true;\n }\n\n for (var position = 0; position < chunk.length; position += 1) {\n var c = chunk.charCodeAt(position);\n\n if (state === AFTER_CR && c === '\\n'.charCodeAt(0)) {\n state = FIELD_START;\n } else {\n if (state === AFTER_CR) {\n state = FIELD_START;\n }\n\n if (c === '\\r'.charCodeAt(0) || c === '\\n'.charCodeAt(0)) {\n if (state !== FIELD_START) {\n if (state === FIELD) {\n valueStart = position + 1;\n }\n\n var field = chunk.slice(fieldStart, valueStart - 1);\n var value = chunk.slice(valueStart + (valueStart < position && chunk.charCodeAt(valueStart) === ' '.charCodeAt(0) ? 1 : 0), position);\n\n if (field === 'data') {\n dataBuffer += '\\n';\n dataBuffer += value;\n } else if (field === 'id') {\n lastEventIdBuffer = value;\n } else if (field === 'event') {\n eventTypeBuffer = value;\n } else if (field === 'retry') {\n initialRetry = parseDuration(value, initialRetry);\n retry = initialRetry;\n } else if (field === 'heartbeatTimeout') {\n heartbeatTimeout = parseDuration(value, heartbeatTimeout);\n\n if (timeout !== 0) {\n clearTimeout(timeout);\n timeout = setTimeout(function () {\n onTimeout();\n }, heartbeatTimeout);\n }\n }\n }\n\n if (state === FIELD_START) {\n if (dataBuffer !== '') {\n lastEventId = lastEventIdBuffer;\n\n if (eventTypeBuffer === '') {\n eventTypeBuffer = 'message';\n }\n\n var event = new MessageEvent(eventTypeBuffer, {\n data: dataBuffer.slice(1),\n lastEventId: lastEventIdBuffer\n });\n es.dispatchEvent(event);\n\n if (eventTypeBuffer === 'message') {\n fire(es, es.onmessage, event);\n }\n\n if (currentState === CLOSED) {\n return;\n }\n }\n\n dataBuffer = '';\n eventTypeBuffer = '';\n }\n\n state = c === '\\r'.charCodeAt(0) ? AFTER_CR : FIELD_START;\n } else {\n if (state === FIELD_START) {\n fieldStart = position;\n state = FIELD;\n }\n\n if (state === FIELD) {\n if (c === ':'.charCodeAt(0)) {\n valueStart = position + 1;\n state = VALUE_START;\n }\n } else if (state === VALUE_START) {\n state = VALUE;\n }\n }\n }\n }\n }\n };\n\n var onFinish = function onFinish() {\n if (currentState === OPEN || currentState === CONNECTING) {\n currentState = WAITING;\n\n if (timeout !== 0) {\n clearTimeout(timeout);\n timeout = 0;\n }\n\n timeout = setTimeout(function () {\n onTimeout();\n }, retry);\n retry = clampDuration(Math.min(initialRetry * 16, retry * 2));\n es.readyState = CONNECTING;\n var event = new Event('error');\n es.dispatchEvent(event);\n fire(es, es.onerror, event);\n }\n };\n\n var close = function close() {\n currentState = CLOSED;\n\n if (cancelFunction != undefined) {\n cancelFunction();\n cancelFunction = undefined;\n }\n\n if (timeout !== 0) {\n clearTimeout(timeout);\n timeout = 0;\n }\n\n es.readyState = CLOSED;\n };\n\n var onTimeout = function onTimeout() {\n timeout = 0;\n\n if (currentState !== WAITING) {\n if (!wasActivity && cancelFunction != undefined) {\n throwError(new Error('No activity within ' + heartbeatTimeout + ' milliseconds. Reconnecting.'));\n cancelFunction();\n cancelFunction = undefined;\n } else {\n wasActivity = false;\n timeout = setTimeout(function () {\n onTimeout();\n }, heartbeatTimeout);\n }\n\n return;\n }\n\n wasActivity = false;\n timeout = setTimeout(function () {\n onTimeout();\n }, heartbeatTimeout);\n currentState = CONNECTING;\n dataBuffer = '';\n eventTypeBuffer = '';\n lastEventIdBuffer = lastEventId;\n textBuffer = '';\n fieldStart = 0;\n valueStart = 0;\n state = FIELD_START; // https://bugzilla.mozilla.org/show_bug.cgi?id=428916\n // Request header field Last-Event-ID is not allowed by Access-Control-Allow-Headers.\n\n var requestURL = url;\n\n if (url.slice(0, 5) !== 'data:' && url.slice(0, 5) !== 'blob:') {\n if (lastEventId !== '') {\n requestURL += (url.indexOf('?') === -1 ? '?' : '&') + 'lastEventId=' + encodeURIComponent(lastEventId);\n }\n }\n\n var requestHeaders = {};\n requestHeaders['Accept'] = 'text/event-stream';\n\n if (headers != undefined) {\n for (var name in headers) {\n if (Object.prototype.hasOwnProperty.call(headers, name)) {\n requestHeaders[name] = headers[name];\n }\n }\n }\n\n try {\n transport.open(xhr, onStart, onProgress, onFinish, requestURL, withCredentials, requestHeaders);\n } catch (error) {\n close();\n throw error;\n }\n };\n\n es.url = url;\n es.readyState = CONNECTING;\n es.withCredentials = withCredentials;\n es._close = close;\n onTimeout();\n}\n\nEventSourcePolyfill.prototype = Object.create(EventTarget.prototype);\nEventSourcePolyfill.prototype.CONNECTING = CONNECTING;\nEventSourcePolyfill.prototype.OPEN = OPEN;\nEventSourcePolyfill.prototype.CLOSED = CLOSED;\n\nEventSourcePolyfill.prototype.close = function () {\n this._close();\n};\n\nEventSourcePolyfill.CONNECTING = CONNECTING;\nEventSourcePolyfill.OPEN = OPEN;\nEventSourcePolyfill.CLOSED = CLOSED;\nEventSourcePolyfill.prototype.withCredentials = undefined;\nvar _default = EventSourcePolyfill;\nexports[\"default\"] = _default;\n\nvar _c, _c2, _c3, _c4, _c5, _c6, _c7, _c8, _c9, _c10, _c11;\n\n$RefreshReg$(_c, \"TextDecoderPolyfill\");\n$RefreshReg$(_c2, \"XHRWrapper\");\n$RefreshReg$(_c3, \"HeadersPolyfill\");\n$RefreshReg$(_c4, \"XHRTransport\");\n$RefreshReg$(_c5, \"HeadersWrapper\");\n$RefreshReg$(_c6, \"FetchTransport\");\n$RefreshReg$(_c7, \"EventTarget\");\n$RefreshReg$(_c8, \"Event\");\n$RefreshReg$(_c9, \"MessageEvent\");\n$RefreshReg$(_c10, \"ConnectionEvent\");\n$RefreshReg$(_c11, \"EventSourcePolyfill\");\n\n;\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n var currentExports = module.__proto__.exports;\n var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports on update so we can compare the boundary\n // signatures.\n module.hot.dispose(function (data) {\n data.prevExports = currentExports;\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevExports !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevExports !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ \"./node_modules/next/dist/compiled/webpack/module.js\")(module)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4uLy4uLy4uL2NsaWVudC9kZXYvZXZlbnQtc291cmNlLXBvbHlmaWxsLmpzPzYzZDQiXSwibmFtZXMiOlsiZG9jdW1lbnQiLCJ3aW5kb3ciLCJSZXNwb25zZSIsIlRleHREZWNvZGVyIiwiVGV4dEVuY29kZXIiLCJBYm9ydENvbnRyb2xsZXIiLCJUZXh0RGVjb2RlclBvbHlmaWxsIiwib2N0ZXRzQ291bnQiLCJjb2RlUG9pbnQiLCJiaXRzTmVlZGVkIiwiUkVQTEFDRVIiLCJzdHJpbmciLCJpIiwib2N0ZXRzIiwib2N0ZXQiLCJ2YWxpZCIsIlN0cmluZyIsInN1cHBvcnRzU3RyZWFtT3B0aW9uIiwic3RyZWFtIiwiY29uc29sZSIsImsiLCJ0aGF0IiwieGhyIiwic3RhdGUiLCJ0aW1lb3V0IiwiY2xlYXJUaW1lb3V0Iiwib25TdGFydCIsInN0YXR1cyIsInN0YXR1c1RleHQiLCJjb250ZW50VHlwZSIsIm9uUHJvZ3Jlc3MiLCJyZXNwb25zZVRleHQiLCJvbkZpbmlzaCIsIm9uUmVhZHlTdGF0ZUNoYW5nZSIsIm9uVGltZW91dCIsInNldFRpbWVvdXQiLCJYTUxIdHRwUmVxdWVzdCIsInVybCIsIlhIUldyYXBwZXIiLCJuYW1lIiwiYyIsIm1hcCIsIk9iamVjdCIsImFycmF5IiwiYWxsIiwibGluZSIsInBhcnRzIiwidmFsdWUiLCJ0b0xvd2VyQ2FzZSIsIkhlYWRlcnNQb2x5ZmlsbCIsIlhIUlRyYW5zcG9ydCIsIm9mZnNldCIsImNodW5rIiwib25Qcm9ncmVzc0NhbGxiYWNrIiwiaGVhZGVycyIsIm9uU3RhcnRDYWxsYmFjayIsIm9uRmluaXNoQ2FsbGJhY2siLCJIZWFkZXJzV3JhcHBlciIsImNvbnRyb2xsZXIiLCJzaWduYWwiLCJ0ZXh0RGVjb2RlciIsImZldGNoIiwiY3JlZGVudGlhbHMiLCJ3aXRoQ3JlZGVudGlhbHMiLCJjYWNoZSIsInJlYWRlciIsInJlc3BvbnNlIiwicmVhZE5leHRDaHVuayIsInJlc3VsdCIsInJlc29sdmUiLCJyZWplY3QiLCJQcm9taXNlIiwiRXZlbnRUYXJnZXQiLCJldmVudCIsInR5cGVMaXN0ZW5lcnMiLCJsZW5ndGgiLCJsaXN0ZW5lciIsInRocm93RXJyb3IiLCJ0eXBlIiwibGlzdGVuZXJzIiwiZm91bmQiLCJmaWx0ZXJlZCIsIkV2ZW50Iiwib3B0aW9ucyIsIk1lc3NhZ2VFdmVudCIsIkNvbm5lY3Rpb25FdmVudCIsIldBSVRJTkciLCJDT05ORUNUSU5HIiwiT1BFTiIsIkNMT1NFRCIsIkFGVEVSX0NSIiwiRklFTERfU1RBUlQiLCJGSUVMRCIsIlZBTFVFX1NUQVJUIiwiVkFMVUUiLCJjb250ZW50VHlwZVJlZ0V4cCIsIk1JTklNVU1fRFVSQVRJT04iLCJNQVhJTVVNX0RVUkFUSU9OIiwicGFyc2VEdXJhdGlvbiIsIm4iLCJwYXJzZUludCIsImNsYW1wRHVyYXRpb24iLCJNYXRoIiwiZmlyZSIsImYiLCJzdGFydCIsImlzRmV0Y2hTdXBwb3J0ZWQiLCJCb29sZWFuIiwiaW5pdGlhbFJldHJ5IiwiaGVhcnRiZWF0VGltZW91dCIsImxhc3RFdmVudElkIiwicmV0cnkiLCJ3YXNBY3Rpdml0eSIsIkpTT04iLCJDdXJyZW50VHJhbnNwb3J0IiwidHJhbnNwb3J0IiwiY2FuY2VsRnVuY3Rpb24iLCJjdXJyZW50U3RhdGUiLCJkYXRhQnVmZmVyIiwibGFzdEV2ZW50SWRCdWZmZXIiLCJldmVudFR5cGVCdWZmZXIiLCJ0ZXh0QnVmZmVyIiwiZmllbGRTdGFydCIsInZhbHVlU3RhcnQiLCJlcyIsIm1lc3NhZ2UiLCJjbG9zZSIsInRleHRDaHVuayIsInBvc2l0aW9uIiwiZmllbGQiLCJkYXRhIiwicmVxdWVzdFVSTCIsImVuY29kZVVSSUNvbXBvbmVudCIsInJlcXVlc3RIZWFkZXJzIiwiRXZlbnRTb3VyY2VQb2x5ZmlsbCJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLElBQUlBLFFBQVEsR0FBR0MsTUFBTSxDQUFyQjtBQUNBLElBQUlDLFFBQVEsR0FBR0QsTUFBTSxDQUFyQjtBQUNBLElBQUlFLFdBQVcsR0FBR0YsTUFBTSxDQUF4QjtBQUNBLElBQUlHLFdBQVcsR0FBR0gsTUFBTSxDQUF4QjtBQUNBLElBQUlJLGVBQWUsR0FBR0osTUFBTSxDQUE1Qjs7QUFFQSxJQUFJSSxlQUFlLElBQW5CLFdBQWtDO0FBQ2hDQSxpQkFBZSxHQUFHLDJCQUFZO0FBQzVCOztBQUNBLGlCQUFhLFlBQVksQ0FBekI7QUFGRkE7QUFNRjs7QUFBQSwrQkFBK0I7QUFDN0I7QUFDQTtBQUdGQzs7S0FMQSxtQjs7QUFLQUEsbUJBQW1CLENBQW5CQSxtQkFBdUMsa0JBQWtCO0FBQ3ZELGdEQUE4QztBQUM1QyxRQUFJQyxXQUFXLEtBQWYsR0FBdUI7QUFDckIsYUFBT0MsU0FBUyxJQUFJLFVBQWJBLFNBQWdDQSxTQUFTLElBQVRBLFNBQXZDO0FBRUY7O0FBQUEsUUFBSUQsV0FBVyxLQUFmLEdBQXVCO0FBQ3JCLGFBQ0dDLFNBQVMsSUFBSSxVQUFiQSxTQUFnQ0EsU0FBUyxJQUFUQSxTQUFqQyxNQUFDQSxJQUNBQSxTQUFTLElBQUksVUFBYkEsU0FBZ0NBLFNBQVMsSUFBVEEsU0FGbkM7QUFLRjs7QUFBQSxRQUFJRCxXQUFXLEtBQWYsR0FBdUI7QUFDckIsYUFBT0MsU0FBUyxJQUFJLFlBQWJBLFNBQWtDQSxTQUFTLElBQVRBLFNBQXpDO0FBRUY7O0FBQUEsVUFBTSxJQUFOLEtBQU0sRUFBTjtBQUVGOztBQUFBLDhDQUE0QztBQUMxQyxRQUFJQyxVQUFVLEtBQUssSUFBbkIsR0FBMEI7QUFDeEIsYUFBT0QsU0FBUyxJQUFUQSxhQUEwQkEsU0FBUyxHQUFUQSxTQUFqQztBQUVGOztBQUFBLFFBQUlDLFVBQVUsS0FBSyxJQUFuQixHQUEwQjtBQUN4QixhQUFPRCxTQUFTLEdBQVRBLFNBQVA7QUFFRjs7QUFBQSxRQUFJQyxVQUFVLEtBQUssSUFBbkIsR0FBMEI7QUFDeEI7QUFFRjs7QUFBQSxVQUFNLElBQU4sS0FBTSxFQUFOO0FBRUY7O0FBQUEsTUFBSUMsUUFBUSxHQUFaO0FBQ0EsTUFBSUMsTUFBTSxHQUFWO0FBQ0EsTUFBSUYsVUFBVSxHQUFHLEtBQWpCO0FBQ0EsTUFBSUQsU0FBUyxHQUFHLEtBQWhCOztBQUNBLE9BQUssSUFBSUksQ0FBQyxHQUFWLEdBQWdCQSxDQUFDLEdBQUdDLE1BQU0sQ0FBMUIsUUFBbUNELENBQUMsSUFBcEMsR0FBMkM7QUFDekMsUUFBSUUsS0FBSyxHQUFHRCxNQUFNLENBQWxCLENBQWtCLENBQWxCOztBQUNBLFFBQUlKLFVBQVUsS0FBZCxHQUFzQjtBQUNwQixVQUNFSyxLQUFLLEdBQUxBLE9BQ0FBLEtBQUssR0FETEEsT0FFQSxDQUFDQyxLQUFLLENBQ0hQLFNBQVMsSUFBVixDQUFDQSxHQUFtQk0sS0FBSyxHQURyQixJQUVKTCxVQUFVLEdBRk4sR0FHSkYsV0FBVyxhQU5mLFNBTWUsQ0FIUCxDQUhSLEVBUUU7QUFDQUUsa0JBQVUsR0FBVkE7QUFDQUQsaUJBQVMsR0FBVEE7QUFDQUcsY0FBTSxJQUFJSyxNQUFNLENBQU5BLGFBQVZMLFNBQVVLLENBQVZMO0FBRUg7QUFDRDs7QUFBQSxRQUFJRixVQUFVLEtBQWQsR0FBc0I7QUFDcEIsVUFBSUssS0FBSyxJQUFMQSxLQUFjQSxLQUFLLElBQXZCLEtBQWdDO0FBQzlCTCxrQkFBVSxHQUFWQTtBQUNBRCxpQkFBUyxHQUFUQTtBQUZGLGFBR08sSUFBSU0sS0FBSyxJQUFMQSxPQUFnQkEsS0FBSyxJQUF6QixLQUFrQztBQUN2Q0wsa0JBQVUsR0FBRyxJQUFiQTtBQUNBRCxpQkFBUyxHQUFHTSxLQUFLLEdBQWpCTjtBQUZLLGFBR0EsSUFBSU0sS0FBSyxJQUFMQSxPQUFnQkEsS0FBSyxJQUF6QixLQUFrQztBQUN2Q0wsa0JBQVUsR0FBRyxJQUFiQTtBQUNBRCxpQkFBUyxHQUFHTSxLQUFLLEdBQWpCTjtBQUZLLGFBR0EsSUFBSU0sS0FBSyxJQUFMQSxPQUFnQkEsS0FBSyxJQUF6QixLQUFrQztBQUN2Q0wsa0JBQVUsR0FBRyxJQUFiQTtBQUNBRCxpQkFBUyxHQUFHTSxLQUFLLEdBQWpCTjtBQUZLLGFBR0E7QUFDTEMsa0JBQVUsR0FBVkE7QUFDQUQsaUJBQVMsR0FBVEE7QUFFRjs7QUFBQSxVQUNFQyxVQUFVLEtBQVZBLEtBQ0EsQ0FBQ00sS0FBSyx3QkFBd0JSLFdBQVcsYUFGM0MsU0FFMkMsQ0FBbkMsQ0FGUixFQUdFO0FBQ0FFLGtCQUFVLEdBQVZBO0FBQ0FELGlCQUFTLEdBQVRBO0FBRUg7QUF4QkQsV0F3Qk87QUFDTEMsZ0JBQVUsSUFBVkE7QUFDQUQsZUFBUyxHQUFJQSxTQUFTLElBQVYsQ0FBQ0EsR0FBbUJNLEtBQUssR0FBckNOO0FBRUY7O0FBQUEsUUFBSUMsVUFBVSxLQUFkLEdBQXNCO0FBQ3BCLFVBQUlELFNBQVMsSUFBYixRQUF5QjtBQUN2QkcsY0FBTSxJQUFJSyxNQUFNLENBQU5BLGFBQVZMLFNBQVVLLENBQVZMO0FBREYsYUFFTztBQUNMQSxjQUFNLElBQUlLLE1BQU0sQ0FBTkEsYUFBb0IsVUFBV1IsU0FBUyxHQUFUQSxTQUFELENBQUNBLElBQXpDRyxFQUE4QixDQUFwQkssQ0FBVkw7QUFDQUEsY0FBTSxJQUFJSyxNQUFNLENBQU5BLGFBQ1IsVUFBV1IsU0FBUyxHQUFUQSxTQUFELENBQUNBLEdBRGJHLEtBQ0UsQ0FEUUssQ0FBVkw7QUFJSDtBQUNGO0FBQ0Q7O0FBQUE7QUFDQTtBQUNBO0FBMUZGTCxFLENBNkZBOzs7QUFDQSxJQUFJVyxvQkFBb0IsR0FBcEJBLGdDQUFtQztBQUNyQyxNQUFJO0FBQ0YsV0FDRSx5QkFBeUIseUJBQXpCLE1BQXlCLENBQXpCLEVBQTJEO0FBQ3pEQyxZQUFNLEVBRFI7QUFBMkQsS0FBM0QsTUFERjtBQUtBLEdBTkYsQ0FNRSxjQUFjO0FBQ2RDLFdBQU8sQ0FBUEE7QUFFRjs7QUFBQTtBQVZGLEUsQ0FhQTs7O0FBQ0EsSUFDRWhCLFdBQVcsSUFBWEEsYUFDQUMsV0FBVyxJQURYRCxhQUVBLENBQUNjLG9CQUhILElBSUU7QUFDQWQsYUFBVyxHQUFYQTtBQUdGOztBQUFBLElBQUlpQixDQUFDLEdBQURBLGFBQWdCLENBQXBCOztBQUVBLHlCQUF5QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHRjs7TUFmQSxVOztBQWVBLFVBQVUsQ0FBVixpQkFBNEIsdUJBQXVCO0FBQ2pEOztBQUVBLE1BQUlDLElBQUksR0FBUjtBQUNBLE1BQUlDLEdBQUcsR0FBRyxLQUFWO0FBQ0EsTUFBSUMsS0FBSyxHQUFUO0FBQ0EsTUFBSUMsT0FBTyxHQUFYOztBQUVBLGdCQUFjLGtCQUFrQjtBQUM5QixRQUFJSCxJQUFJLENBQUpBLGlCQUFKLEdBQTZCO0FBQzNCSSxrQkFBWSxDQUFDSixJQUFJLENBQWpCSSxZQUFZLENBQVpBO0FBQ0FKLFVBQUksQ0FBSkE7QUFFRjs7QUFBQSxRQUFJRSxLQUFLLEtBQUxBLEtBQWVBLEtBQUssS0FBcEJBLEtBQThCQSxLQUFLLEtBQXZDLEdBQStDO0FBQzdDQSxXQUFLLEdBQUxBO0FBQ0FELFNBQUcsQ0FBSEE7QUFDQUEsU0FBRyxDQUFIQTtBQUNBQSxTQUFHLENBQUhBO0FBQ0FBLFNBQUcsQ0FBSEE7QUFDQUEsU0FBRyxDQUFIQSx1QkFONkMsQ0FPN0M7QUFDQTs7QUFDQUEsU0FBRyxDQUFIQTs7QUFDQSxVQUFJRSxPQUFPLEtBQVgsR0FBbUI7QUFDakJDLG9CQUFZLENBQVpBLE9BQVksQ0FBWkE7QUFDQUQsZUFBTyxHQUFQQTtBQUVGOztBQUFBLFVBQUksQ0FBSixRQUFhO0FBQ1hILFlBQUksQ0FBSkE7QUFDQUEsWUFBSSxDQUFKQTtBQUVIO0FBQ0RFOztBQUFBQSxTQUFLLEdBQUxBO0FBeEJGOztBQTJCQSxNQUFJRyxPQUFPLEdBQVBBLG1CQUFzQjtBQUN4QixRQUFJSCxLQUFLLEtBQVQsR0FBaUI7QUFDZjtBQUNBLFVBQUlJLE1BQU0sR0FBVjtBQUNBLFVBQUlDLFVBQVUsR0FBZDtBQUNBLFVBQUlDLFdBQVcsR0FBZjs7QUFDQSxVQUFJLEVBQUUsaUJBQU4sR0FBSSxDQUFKLEVBQTZCO0FBQzNCLFlBQUk7QUFDRkYsZ0JBQU0sR0FBR0wsR0FBRyxDQUFaSztBQUNBQyxvQkFBVSxHQUFHTixHQUFHLENBQWhCTTtBQUNBQyxxQkFBVyxHQUFHUCxHQUFHLENBQUhBLGtCQUFkTyxjQUFjUCxDQUFkTztBQUNBLFNBSkYsQ0FJRSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0FGLGdCQUFNLEdBQU5BO0FBQ0FDLG9CQUFVLEdBQVZBO0FBQ0FDLHFCQUFXLEdBQVhBLFVBTmMsQ0FPZDtBQUNBO0FBQ0E7QUFFSDtBQWhCRCxhQWdCTztBQUNMRixjQUFNLEdBQU5BO0FBQ0FDLGtCQUFVLEdBQVZBO0FBQ0FDLG1CQUFXLEdBQUdQLEdBQUcsQ0FBakJPO0FBRUY7O0FBQUEsVUFBSUYsTUFBTSxLQUFWLEdBQWtCO0FBQ2hCSixhQUFLLEdBQUxBO0FBQ0FGLFlBQUksQ0FBSkE7QUFDQUEsWUFBSSxDQUFKQTtBQUNBQSxZQUFJLENBQUpBO0FBQ0FBLFlBQUksQ0FBSkE7QUFDQUEsWUFBSSxDQUFKQTtBQUVIO0FBQ0Y7QUFwQ0Q7O0FBcUNBLE1BQUlTLFVBQVUsR0FBVkEsc0JBQXlCO0FBQzNCSixXQUFPOztBQUNQLFFBQUlILEtBQUssS0FBTEEsS0FBZUEsS0FBSyxLQUF4QixHQUFnQztBQUM5QkEsV0FBSyxHQUFMQTtBQUNBLFVBQUlRLFlBQVksR0FBaEI7O0FBQ0EsVUFBSTtBQUNGQSxvQkFBWSxHQUFHVCxHQUFHLENBQWxCUztBQUNBLE9BRkYsQ0FFRSxjQUFjLENBQ2Q7QUFFRlY7O0FBQUFBLFVBQUksQ0FBSkE7QUFDQUEsVUFBSSxDQUFKQTtBQUNBQSxVQUFJLENBQUpBO0FBRUg7QUFkRDs7QUFlQSxNQUFJVyxRQUFRLEdBQVJBLG9CQUF1QjtBQUN6QjtBQUNBO0FBQ0FGLGNBQVU7O0FBQ1YsUUFBSVAsS0FBSyxLQUFMQSxLQUFlQSxLQUFLLEtBQXBCQSxLQUE4QkEsS0FBSyxLQUF2QyxHQUErQztBQUM3Q0EsV0FBSyxHQUFMQTs7QUFDQSxVQUFJQyxPQUFPLEtBQVgsR0FBbUI7QUFDakJDLG9CQUFZLENBQVpBLE9BQVksQ0FBWkE7QUFDQUQsZUFBTyxHQUFQQTtBQUVGSDs7QUFBQUEsVUFBSSxDQUFKQTtBQUNBQSxVQUFJLENBQUpBO0FBRUg7QUFiRDs7QUFjQSxNQUFJWSxrQkFBa0IsR0FBbEJBLDhCQUFpQztBQUNuQyxRQUFJWCxHQUFHLElBQVAsV0FBc0I7QUFDcEI7QUFDQSxVQUFJQSxHQUFHLENBQUhBLGVBQUosR0FBMEI7QUFDeEJVLGdCQUFRO0FBRFYsYUFFTyxJQUFJVixHQUFHLENBQUhBLGVBQUosR0FBMEI7QUFDL0JRLGtCQUFVO0FBREwsYUFFQSxJQUFJUixHQUFHLENBQUhBLGVBQUosR0FBMEI7QUFDL0JJLGVBQU87QUFFVjtBQUNGO0FBWEQ7O0FBWUEsTUFBSVEsU0FBUyxHQUFUQSxxQkFBd0I7QUFDMUJWLFdBQU8sR0FBR1csVUFBVSxDQUFDLFlBQVk7QUFDL0JELGVBQVM7QUFEUyxPQUFwQlYsR0FBb0IsQ0FBcEJBOztBQUdBLFFBQUlGLEdBQUcsQ0FBSEEsZUFBSixHQUEwQjtBQUN4QlEsZ0JBQVU7QUFFYjtBQVBELElBakhpRCxDQTBIakQ7OztBQUNBUixLQUFHLENBQUhBO0FBQ0FBLEtBQUcsQ0FBSEEsbUJBNUhpRCxDQTZIakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQUEsS0FBRyxDQUFIQSxtQkFsSWlELENBb0lqRDs7QUFDQSxNQUNFLEVBQUUsa0JBQWtCYyxjQUFjLENBQWxDLGNBQ0EsRUFBRSxhQUFhQSxjQUFjLENBRi9CLFNBRUUsQ0FGRixFQUdFO0FBQ0FkLE9BQUcsQ0FBSEE7QUFHRixHQTVJaUQsQ0E0SWpEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0FBLEtBQUcsQ0FBSEE7O0FBRUEsTUFBSSxpQkFBSixLQUEwQjtBQUN4QmUsT0FBRyxJQUFJLENBQUNBLEdBQUcsQ0FBSEEsaUJBQXFCLENBQXJCQSxVQUFELE9BQVBBO0FBRUZmOztBQUFBQSxLQUFHLENBQUhBOztBQUVBLE1BQUksZ0JBQUosS0FBeUI7QUFDdkI7QUFDQTtBQUNBRSxXQUFPLEdBQUdXLFVBQVUsQ0FBQyxZQUFZO0FBQy9CRCxlQUFTO0FBRFMsT0FBcEJWLENBQW9CLENBQXBCQTtBQUlIO0FBaEtEOztBQWlLQWMsVUFBVSxDQUFWQSxrQkFBNkIsWUFBWTtBQUN2QztBQURGQTs7QUFHQUEsVUFBVSxDQUFWQSw4QkFBeUMsZ0JBQWdCO0FBQ3ZELFNBQU8sS0FBUDtBQURGQTs7QUFHQUEsVUFBVSxDQUFWQSw2QkFBd0MsdUJBQXVCO0FBQzdELE1BQUloQixHQUFHLEdBQUcsS0FBVjs7QUFDQSxNQUFJLHNCQUFKLEtBQStCO0FBQzdCQSxPQUFHLENBQUhBO0FBRUg7QUFMRGdCOztBQU1BQSxVQUFVLENBQVZBLGtDQUE2QyxZQUFZO0FBQ3ZELFNBQU8sK0NBQ0gsVUFERyxxQkFDSCxFQURHLEdBQVA7QUFERkE7O0FBS0EsVUFBVSxDQUFWLGlCQUE0QixZQUFZO0FBQ3RDO0FBQ0EsTUFDRSxFQUFFLGVBQWVGLGNBQWMsQ0FBL0IsY0FDQXBDLFFBQVEsSUFEUixhQUVBQSxRQUFRLENBQVJBLGNBRkEsYUFHQUEsUUFBUSxDQUFSQSxlQUpGLFlBS0U7QUFDQSxRQUFJcUIsSUFBSSxHQUFSO0FBQ0FBLFFBQUksQ0FBSkEsZUFBb0JjLFVBQVUsQ0FBQyxZQUFZO0FBQ3pDZCxVQUFJLENBQUpBO0FBQ0FBLFVBQUksQ0FBSkE7QUFGNEIsT0FBOUJBLENBQThCLENBQTlCQTtBQUlBO0FBR0Y7O0FBQUEsTUFBSUMsR0FBRyxHQUFHLEtBQVYsS0FoQnNDLENBaUJ0Qzs7QUFDQUEsS0FBRyxDQUFIQSxrQkFBc0IsS0FBdEJBO0FBQ0FBLEtBQUcsQ0FBSEEsZUFBbUIsS0FBbkJBOztBQUNBLE1BQUk7QUFDRjtBQUNBQSxPQUFHLENBQUhBO0FBQ0EsR0FIRixDQUdFLGVBQWU7QUFDZjtBQUNBO0FBRUg7QUEzQkQ7O0FBNkJBLDJCQUEyQjtBQUN6QixTQUFPaUIsSUFBSSxDQUFKQSxrQkFBdUIsYUFBYTtBQUN6QyxXQUFPdkIsTUFBTSxDQUFOQSxhQUFvQndCLENBQUMsQ0FBREEsZ0JBQTNCLElBQU94QixDQUFQO0FBREYsR0FBT3VCLENBQVA7QUFLRjs7QUFBQSw4QkFBOEI7QUFDNUI7QUFDQSxNQUFJRSxHQUFHLEdBQUdDLE1BQU0sQ0FBTkEsT0FBVixJQUFVQSxDQUFWO0FBQ0EsTUFBSUMsS0FBSyxHQUFHQyxHQUFHLENBQUhBLE1BQVosTUFBWUEsQ0FBWjs7QUFDQSxPQUFLLElBQUloQyxDQUFDLEdBQVYsR0FBZ0JBLENBQUMsR0FBRytCLEtBQUssQ0FBekIsUUFBa0MvQixDQUFDLElBQW5DLEdBQTBDO0FBQ3hDLFFBQUlpQyxJQUFJLEdBQUdGLEtBQUssQ0FBaEIsQ0FBZ0IsQ0FBaEI7QUFDQSxRQUFJRyxLQUFLLEdBQUdELElBQUksQ0FBSkEsTUFBWixJQUFZQSxDQUFaO0FBQ0EsUUFBSU4sSUFBSSxHQUFHTyxLQUFLLENBQWhCLEtBQVdBLEVBQVg7QUFDQSxRQUFJQyxLQUFLLEdBQUdELEtBQUssQ0FBTEEsS0FBWixJQUFZQSxDQUFaO0FBQ0FMLE9BQUcsQ0FBQ08sV0FBVyxDQUFmUCxJQUFlLENBQVosQ0FBSEE7QUFFRjs7QUFBQTtBQUVGUTs7TUFiQSxlOztBQWFBQSxlQUFlLENBQWZBLGdCQUFnQyxnQkFBZ0I7QUFDOUMsU0FBTyxVQUFVRCxXQUFXLENBQTVCLElBQTRCLENBQXJCLENBQVA7QUFERkM7O0FBSUEsd0JBQXdCLENBRXhCQzs7TUFGQSxZOztBQUVBQSxZQUFZLENBQVpBLGlCQUE4QixxR0FRNUI7QUFDQTVCLEtBQUcsQ0FBSEE7QUFDQSxNQUFJNkIsTUFBTSxHQUFWOztBQUNBN0IsS0FBRyxDQUFIQSxhQUFpQixZQUFZO0FBQzNCLFFBQUlTLFlBQVksR0FBR1QsR0FBRyxDQUF0QjtBQUNBLFFBQUk4QixLQUFLLEdBQUdyQixZQUFZLENBQVpBLE1BQVosTUFBWUEsQ0FBWjtBQUNBb0IsVUFBTSxJQUFJQyxLQUFLLENBQWZEO0FBQ0FFLHNCQUFrQixDQUFsQkEsS0FBa0IsQ0FBbEJBO0FBSkYvQjs7QUFNQUEsS0FBRyxDQUFIQSxxQkFBeUIsWUFBWTtBQUNuQyxRQUFJQSxHQUFHLENBQUhBLGVBQUosR0FBMEI7QUFDeEIsVUFBSUssTUFBTSxHQUFHTCxHQUFHLENBQWhCO0FBQ0EsVUFBSU0sVUFBVSxHQUFHTixHQUFHLENBQXBCO0FBQ0EsVUFBSU8sV0FBVyxHQUFHUCxHQUFHLENBQUhBLGtCQUFsQixjQUFrQkEsQ0FBbEI7QUFDQSxVQUFJZ0MsT0FBTyxHQUFHaEMsR0FBRyxDQUFqQixxQkFBY0EsRUFBZDtBQUNBaUMscUJBQWUsa0NBSWIsb0JBSmEsT0FJYixDQUphLEVBS2IsWUFBWTtBQUNWakMsV0FBRyxDQUFIQTtBQU5KaUMsT0FBZSxDQUFmQTtBQUxGLFdBY08sSUFBSWpDLEdBQUcsQ0FBSEEsZUFBSixHQUEwQjtBQUMvQmtDLHNCQUFnQjtBQUVuQjtBQWxCRGxDOztBQW1CQUEsS0FBRyxDQUFIQTtBQUNBQSxLQUFHLENBQUhBOztBQUNBLE9BQUssSUFBTCxpQkFBMEI7QUFDeEIsUUFBSW9CLE1BQU0sQ0FBTkEsdUNBQUosSUFBSUEsQ0FBSixFQUF5RDtBQUN2RHBCLFNBQUcsQ0FBSEEsdUJBQTJCZ0MsT0FBTyxDQUFsQ2hDLElBQWtDLENBQWxDQTtBQUVIO0FBQ0RBOztBQUFBQSxLQUFHLENBQUhBO0FBM0NGNEI7O0FBOENBLGlDQUFpQztBQUMvQjtBQUVGTzs7TUFIQSxjOztBQUdBQSxjQUFjLENBQWRBLGdCQUErQixnQkFBZ0I7QUFDN0MsU0FBTyxrQkFBUCxJQUFPLENBQVA7QUFERkE7O0FBSUEsMEJBQTBCLENBRTFCOztNQUZBLGM7O0FBRUEsY0FBYyxDQUFkLGlCQUFnQyxxR0FROUI7QUFDQSxNQUFJQyxVQUFVLEdBQUcsSUFBakIsZUFBaUIsRUFBakI7QUFDQSxNQUFJQyxNQUFNLEdBQUdELFVBQVUsQ0FBdkIsT0FGQSxDQUUrQjs7QUFDL0IsTUFBSUUsV0FBVyxHQUFHLElBQWxCLFdBQWtCLEVBQWxCO0FBQ0FDLE9BQUssTUFBTTtBQUNUUCxXQUFPLEVBREU7QUFFVFEsZUFBVyxFQUFFQyxlQUFlLGVBRm5CO0FBR1RKLFVBQU0sRUFIRztBQUlUSyxTQUFLLEVBSlBIO0FBQVcsR0FBTixDQUFMQSxNQU1RLG9CQUFvQjtBQUN4QixRQUFJSSxNQUFNLEdBQUdDLFFBQVEsQ0FBUkEsS0FBYixTQUFhQSxFQUFiO0FBQ0FYLG1CQUFlLENBQ2JXLFFBQVEsQ0FESyxRQUViQSxRQUFRLENBRkssWUFHYkEsUUFBUSxDQUFSQSxZQUhhLGNBR2JBLENBSGEsRUFJYixtQkFBbUJBLFFBQVEsQ0FKZCxPQUliLENBSmEsRUFLYixZQUFZO0FBQ1ZSLGdCQUFVLENBQVZBO0FBQ0FPLFlBQU0sQ0FBTkE7QUFQSlYsS0FBZSxDQUFmQTtBQVVBLFdBQU8sWUFBWSwyQkFBMkI7QUFDNUMsVUFBSVksYUFBYSxHQUFiQSx5QkFBNEI7QUFDOUIsY0FBTSxDQUFOLFlBRVEsa0JBQWtCO0FBQ3RCLGNBQUlDLE1BQU0sQ0FBVixNQUFpQjtBQUNmO0FBQ0FDLG1CQUFPLENBQVBBLFNBQU8sQ0FBUEE7QUFGRixpQkFHTztBQUNMLGdCQUFJakIsS0FBSyxHQUFHUSxXQUFXLENBQVhBLE9BQW1CUSxNQUFNLENBQXpCUixPQUFpQztBQUFFMUMsb0JBQU0sRUFBckQ7QUFBNkMsYUFBakMwQyxDQUFaO0FBQ0FQLDhCQUFrQixDQUFsQkEsS0FBa0IsQ0FBbEJBO0FBQ0FjLHlCQUFhO0FBRWhCO0FBWEgsb0JBWVksaUJBQWlCO0FBQ3pCRyxnQkFBTSxDQUFOQSxLQUFNLENBQU5BO0FBYko7QUFERjs7QUFpQkFILG1CQUFhO0FBbEJmLEtBQU8sQ0FBUDtBQWxCSk4sVUF3Q0ksa0JBQWtCO0FBQ2hCTCxvQkFBZ0I7QUFDaEI7QUExQ05LLEtBNENJLGlCQUFpQjtBQUNmTCxvQkFBZ0I7QUFDaEIsV0FBT2UsT0FBTyxDQUFQQSxPQUFQLEtBQU9BLENBQVA7QUE5Q05WO0FBWkY7O0FBK0RBLHVCQUF1QjtBQUNyQixvQkFBa0JuQixNQUFNLENBQU5BLE9BQWxCLElBQWtCQSxDQUFsQjtBQUdGOztNQUpBLFc7O0FBSUEsdUJBQXVCO0FBQ3JCUCxZQUFVLENBQUMsWUFBWTtBQUNyQjtBQURRLEtBQVZBLENBQVUsQ0FBVkE7QUFLRnFDOztBQUFBQSxXQUFXLENBQVhBLDBCQUFzQyxpQkFBaUI7QUFDckRDLE9BQUssQ0FBTEE7QUFDQSxNQUFJQyxhQUFhLEdBQUcsZ0JBQWdCRCxLQUFLLENBQXpDLElBQW9CLENBQXBCOztBQUNBLE1BQUlDLGFBQWEsSUFBakIsV0FBZ0M7QUFDOUIsUUFBSUMsTUFBTSxHQUFHRCxhQUFhLENBQTFCOztBQUNBLFNBQUssSUFBSTlELENBQUMsR0FBVixHQUFnQkEsQ0FBQyxHQUFqQixRQUE0QkEsQ0FBQyxJQUE3QixHQUFvQztBQUNsQyxVQUFJZ0UsUUFBUSxHQUFHRixhQUFhLENBQTVCLENBQTRCLENBQTVCOztBQUNBLFVBQUk7QUFDRixZQUFJLE9BQU9FLFFBQVEsQ0FBZixnQkFBSixZQUFnRDtBQUM5Q0Esa0JBQVEsQ0FBUkE7QUFERixlQUVPO0FBQ0xBLGtCQUFRLENBQVJBO0FBRUg7QUFBQyxPQU5GLENBTUUsVUFBVTtBQUNWQyxrQkFBVSxDQUFWQSxDQUFVLENBQVZBO0FBRUg7QUFDRjtBQUNGO0FBbEJETDs7QUFtQkFBLFdBQVcsQ0FBWEEsNkJBQXlDLDBCQUEwQjtBQUNqRU0sTUFBSSxHQUFHOUQsTUFBTSxDQUFiOEQsSUFBYSxDQUFiQTtBQUNBLE1BQUlDLFNBQVMsR0FBRyxLQUFoQjtBQUNBLE1BQUlMLGFBQWEsR0FBR0ssU0FBUyxDQUE3QixJQUE2QixDQUE3Qjs7QUFDQSxNQUFJTCxhQUFhLElBQWpCLFdBQWdDO0FBQzlCQSxpQkFBYSxHQUFiQTtBQUNBSyxhQUFTLENBQVRBLElBQVMsQ0FBVEE7QUFFRjs7QUFBQSxNQUFJQyxLQUFLLEdBQVQ7O0FBQ0EsT0FBSyxJQUFJcEUsQ0FBQyxHQUFWLEdBQWdCQSxDQUFDLEdBQUc4RCxhQUFhLENBQWpDLFFBQTBDOUQsQ0FBQyxJQUEzQyxHQUFrRDtBQUNoRCxRQUFJOEQsYUFBYSxDQUFiQSxDQUFhLENBQWJBLEtBQUosVUFBbUM7QUFDakNNLFdBQUssR0FBTEE7QUFFSDtBQUNEOztBQUFBLE1BQUksQ0FBSixPQUFZO0FBQ1ZOLGlCQUFhLENBQWJBO0FBRUg7QUFqQkRGOztBQWtCQUEsV0FBVyxDQUFYQSxnQ0FBNEMsMEJBQTBCO0FBQ3BFTSxNQUFJLEdBQUc5RCxNQUFNLENBQWI4RCxJQUFhLENBQWJBO0FBQ0EsTUFBSUMsU0FBUyxHQUFHLEtBQWhCO0FBQ0EsTUFBSUwsYUFBYSxHQUFHSyxTQUFTLENBQTdCLElBQTZCLENBQTdCOztBQUNBLE1BQUlMLGFBQWEsSUFBakIsV0FBZ0M7QUFDOUIsUUFBSU8sUUFBUSxHQUFaOztBQUNBLFNBQUssSUFBSXJFLENBQUMsR0FBVixHQUFnQkEsQ0FBQyxHQUFHOEQsYUFBYSxDQUFqQyxRQUEwQzlELENBQUMsSUFBM0MsR0FBa0Q7QUFDaEQsVUFBSThELGFBQWEsQ0FBYkEsQ0FBYSxDQUFiQSxLQUFKLFVBQW1DO0FBQ2pDTyxnQkFBUSxDQUFSQSxLQUFjUCxhQUFhLENBQTNCTyxDQUEyQixDQUEzQkE7QUFFSDtBQUNEOztBQUFBLFFBQUlBLFFBQVEsQ0FBUkEsV0FBSixHQUEyQjtBQUN6QixhQUFPRixTQUFTLENBQWhCLElBQWdCLENBQWhCO0FBREYsV0FFTztBQUNMQSxlQUFTLENBQVRBLElBQVMsQ0FBVEE7QUFFSDtBQUNGO0FBakJEUDs7QUFtQkEscUJBQXFCO0FBQ25CO0FBQ0E7QUFHRjs7TUFMQSxLOztBQUtBLHFDQUFxQztBQUNuQ1UsT0FBSyxDQUFMQTtBQUNBLGNBQVlDLE9BQU8sQ0FBbkI7QUFDQSxxQkFBbUJBLE9BQU8sQ0FBMUI7QUFHRkM7O01BTkEsWTtBQU1BQSxZQUFZLENBQVpBLFlBQXlCMUMsTUFBTSxDQUFOQSxPQUFjd0MsS0FBSyxDQUE1Q0UsU0FBeUIxQyxDQUF6QjBDOztBQUVBLHdDQUF3QztBQUN0Q0YsT0FBSyxDQUFMQTtBQUNBLGdCQUFjQyxPQUFPLENBQXJCO0FBQ0Esb0JBQWtCQSxPQUFPLENBQXpCO0FBQ0EsaUJBQWVBLE9BQU8sQ0FBdEI7QUFHRkU7O09BUEEsZTtBQU9BQSxlQUFlLENBQWZBLFlBQTRCM0MsTUFBTSxDQUFOQSxPQUFjd0MsS0FBSyxDQUEvQ0csU0FBNEIzQyxDQUE1QjJDO0FBRUEsSUFBSUMsT0FBTyxHQUFHLENBQWQ7QUFDQSxJQUFJQyxVQUFVLEdBQWQ7QUFDQSxJQUFJQyxJQUFJLEdBQVI7QUFDQSxJQUFJQyxNQUFNLEdBQVY7QUFFQSxJQUFJQyxRQUFRLEdBQUcsQ0FBZjtBQUNBLElBQUlDLFdBQVcsR0FBZjtBQUNBLElBQUlDLEtBQUssR0FBVDtBQUNBLElBQUlDLFdBQVcsR0FBZjtBQUNBLElBQUlDLEtBQUssR0FBVDtBQUVBLElBQUlDLGlCQUFpQixHQUFyQjtBQUVBLElBQUlDLGdCQUFnQixHQUFwQjtBQUNBLElBQUlDLGdCQUFnQixHQUFwQjs7QUFFQSxJQUFJQyxhQUFhLEdBQWJBLHVCQUFnQixLQUFoQkEsRUFBZ0IsR0FBaEJBLEVBQXNDO0FBQ3hDLE1BQUlDLENBQUMsR0FBR0MsUUFBUSxRQUFoQixFQUFnQixDQUFoQjs7QUFDQSxNQUFJRCxDQUFDLEtBQUwsR0FBYTtBQUNYQSxLQUFDLEdBQURBO0FBRUY7O0FBQUEsU0FBT0UsYUFBYSxDQUFwQixDQUFvQixDQUFwQjtBQUxGOztBQU9BLElBQUlBLGFBQWEsR0FBYkEsdUJBQWdCLENBQWhCQSxFQUE2QjtBQUMvQixTQUFPQyxJQUFJLENBQUpBLElBQVNBLElBQUksQ0FBSkEsT0FBVEEsZ0JBQVNBLENBQVRBLEVBQVAsZ0JBQU9BLENBQVA7QUFERjs7QUFJQSxJQUFJQyxJQUFJLEdBQUpBLGNBQU8sSUFBUEEsRUFBTyxDQUFQQSxFQUFPLEtBQVBBLEVBQWlDO0FBQ25DLE1BQUk7QUFDRixRQUFJLGFBQUosWUFBNkI7QUFDM0JDLE9BQUMsQ0FBREE7QUFFSDtBQUFDLEdBSkYsQ0FJRSxVQUFVO0FBQ1YzQixjQUFVLENBQVZBLENBQVUsQ0FBVkE7QUFFSDtBQVJEOztBQVVBLDJDQUEyQztBQUN6Q0wsYUFBVyxDQUFYQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUFpQyxPQUFLLFlBQUxBLE9BQUssQ0FBTEE7QUFHRjs7T0FoQkEsbUI7QUFnQkEsSUFBSUMsZ0JBQWdCLEdBQ2xCN0MsS0FBSyxJQUFMQSxhQUFzQjNELFFBQVEsSUFBOUIyRCxhQUErQyxVQUFVM0QsUUFBUSxDQURuRTs7QUFHQSxpQ0FBaUM7QUFDL0JtQyxLQUFHLEdBQUdyQixNQUFNLENBQVpxQixHQUFZLENBQVpBO0FBQ0EsTUFBSTBCLGVBQWUsR0FBR29CLE9BQU8sSUFBUEEsYUFBd0J3QixPQUFPLENBQUN4QixPQUFPLENBQTdELGVBQXFELENBQXJEO0FBRUEsTUFBSXlCLFlBQVksR0FBR1AsYUFBYSxDQUFoQyxJQUFnQyxDQUFoQztBQUNBLE1BQUlRLGdCQUFnQixHQUNsQjFCLE9BQU8sSUFBUEEsYUFBd0JBLE9BQU8sQ0FBUEEsb0JBQXhCQSxZQUNJZSxhQUFhLENBQUNmLE9BQU8sQ0FBUixrQkFEakJBLEtBQ2lCLENBRGpCQSxHQUVJa0IsYUFBYSxDQUhuQixLQUdtQixDQUhuQjtBQUtBLE1BQUlTLFdBQVcsR0FBZjtBQUNBLE1BQUlDLEtBQUssR0FBVDtBQUNBLE1BQUlDLFdBQVcsR0FBZjtBQUNBLE1BQUkxRCxPQUFPLEdBQ1Q2QixPQUFPLElBQVBBLGFBQXdCQSxPQUFPLENBQVBBLFdBQXhCQSxZQUNJOEIsSUFBSSxDQUFKQSxNQUFXQSxJQUFJLENBQUpBLFVBQWU5QixPQUFPLENBRHJDQSxPQUNlOEIsQ0FBWEEsQ0FESjlCLEdBREY7QUFJQSxNQUFJK0IsZ0JBQWdCLEdBQ2xCL0IsT0FBTyxJQUFQQSxhQUF3QkEsT0FBTyxDQUFQQSxhQUF4QkEsWUFDSUEsT0FBTyxDQURYQSxZQURGO0FBSUEsTUFBSTdELEdBQUcsR0FDTG9GLGdCQUFnQixJQUNoQixFQUFFdkIsT0FBTyxJQUFQQSxhQUF3QkEsT0FBTyxDQUFQQSxhQUQxQnVCLFNBQ0EsQ0FEQUEsZUFHSSxlQUFlLElBSnJCLGdCQUlxQixFQUFmLENBSk47QUFLQSxNQUFJUyxTQUFTLEdBQUc3RixHQUFHLElBQUhBLFlBQW1CLElBQW5CQSxjQUFtQixFQUFuQkEsR0FBMEMsSUFBMUQsWUFBMEQsRUFBMUQ7QUFDQSxNQUFJOEYsY0FBYyxHQUFsQjtBQUNBLE1BQUk1RixPQUFPLEdBQVg7QUFDQSxNQUFJNkYsWUFBWSxHQUFoQjtBQUNBLE1BQUlDLFVBQVUsR0FBZDtBQUNBLE1BQUlDLGlCQUFpQixHQUFyQjtBQUNBLE1BQUlDLGVBQWUsR0FBbkI7QUFFQSxNQUFJQyxVQUFVLEdBQWQ7QUFDQSxNQUFJbEcsS0FBSyxHQUFUO0FBQ0EsTUFBSW1HLFVBQVUsR0FBZDtBQUNBLE1BQUlDLFVBQVUsR0FBZDs7QUFFQSxNQUFJakcsT0FBTyxHQUFQQSxpQkFBVSxNQUFWQSxFQUFVLFVBQVZBLEVBQVUsV0FBVkEsRUFBVSxPQUFWQSxFQUFVLE1BQVZBLEVBQXNFO0FBQ3hFLFFBQUkyRixZQUFZLEtBQWhCLFlBQWlDO0FBQy9CRCxvQkFBYyxHQUFkQTs7QUFDQSxVQUNFekYsTUFBTSxLQUFOQSxPQUNBRSxXQUFXLElBRFhGLGFBRUFvRSxpQkFBaUIsQ0FBakJBLEtBSEYsV0FHRUEsQ0FIRixFQUlFO0FBQ0FzQixvQkFBWSxHQUFaQTtBQUNBTCxtQkFBVyxHQUFYQTtBQUNBRCxhQUFLLEdBQUxBO0FBQ0FhLFVBQUUsQ0FBRkE7QUFDQSxZQUFJbkQsS0FBSyxHQUFHLDRCQUE0QjtBQUN0QzlDLGdCQUFNLEVBRGdDO0FBRXRDQyxvQkFBVSxFQUY0QjtBQUd0QzBCLGlCQUFPLEVBSFQ7QUFBd0MsU0FBNUIsQ0FBWjtBQUtBc0UsVUFBRSxDQUFGQTtBQUNBckIsWUFBSSxLQUFLcUIsRUFBRSxDQUFQLFFBQUpyQixLQUFJLENBQUpBO0FBZkYsYUFnQk87QUFDTCxZQUFJc0IsT0FBTyxHQUFYOztBQUNBLFlBQUlsRyxNQUFNLEtBQVYsS0FBb0I7QUFDbEIsMEJBQWdCO0FBQ2RDLHNCQUFVLEdBQUdBLFVBQVUsQ0FBVkEsZ0JBQWJBLEdBQWFBLENBQWJBO0FBRUZpRzs7QUFBQUEsaUJBQU8sR0FDTCxxRUFERkE7QUFKRixlQVVPO0FBQ0xBLGlCQUFPLEdBQ0wsZ0ZBQ0NoRyxXQUFXLElBQVhBLGtCQUVHQSxXQUFXLENBQVhBLGdCQUhKLEdBR0lBLENBSEosSUFERmdHO0FBT0ZoRDs7QUFBQUEsa0JBQVUsQ0FBQyxVQUFYQSxPQUFXLENBQUQsQ0FBVkE7QUFDQWlELGFBQUs7QUFDTCxZQUFJckQsS0FBSyxHQUFHLDZCQUE2QjtBQUN2QzlDLGdCQUFNLEVBRGlDO0FBRXZDQyxvQkFBVSxFQUY2QjtBQUd2QzBCLGlCQUFPLEVBSFQ7QUFBeUMsU0FBN0IsQ0FBWjtBQUtBc0UsVUFBRSxDQUFGQTtBQUNBckIsWUFBSSxLQUFLcUIsRUFBRSxDQUFQLFNBQUpyQixLQUFJLENBQUpBO0FBRUg7QUFDRjtBQWxERDs7QUFvREEsTUFBSXpFLFVBQVUsR0FBVkEsb0JBQWEsU0FBYkEsRUFBa0M7QUFDcEMsUUFBSXVGLFlBQVksS0FBaEIsTUFBMkI7QUFDekIsVUFBSWxCLENBQUMsR0FBRyxDQUFSOztBQUNBLFdBQUssSUFBSXZGLENBQUMsR0FBVixHQUFnQkEsQ0FBQyxHQUFHbUgsU0FBUyxDQUE3QixRQUFzQ25ILENBQUMsSUFBdkMsR0FBOEM7QUFDNUMsWUFBSTRCLENBQUMsR0FBR3VGLFNBQVMsQ0FBVEEsV0FBUixDQUFRQSxDQUFSOztBQUNBLFlBQUl2RixDQUFDLEtBQUssZ0JBQU5BLENBQU0sQ0FBTkEsSUFBNEJBLENBQUMsS0FBSyxnQkFBdEMsQ0FBc0MsQ0FBdEMsRUFBMEQ7QUFDeEQyRCxXQUFDLEdBQURBO0FBRUg7QUFDRDs7QUFBQSxVQUFJL0MsS0FBSyxHQUFHLENBQUMrQyxDQUFDLEtBQUssQ0FBTkEsaUJBQUQsTUFBK0I0QixTQUFTLENBQVRBLFNBQW1CNUIsQ0FBQyxHQUEvRCxDQUEyQzRCLENBQTNDO0FBQ0FOLGdCQUFVLEdBQUcsQ0FBQ3RCLENBQUMsS0FBSyxDQUFOQSxpQkFBRCxNQUErQjRCLFNBQVMsQ0FBVEEsTUFBZ0I1QixDQUFDLEdBQTdEc0IsQ0FBNENNLENBQTVDTjs7QUFDQSxVQUFJckUsS0FBSyxLQUFULElBQWtCO0FBQ2hCNEQsbUJBQVcsR0FBWEE7QUFFRjs7QUFBQSxXQUFLLElBQUlnQixRQUFRLEdBQWpCLEdBQXVCQSxRQUFRLEdBQUc1RSxLQUFLLENBQXZDLFFBQWdENEUsUUFBUSxJQUF4RCxHQUErRDtBQUM3RCxZQUFJeEYsQ0FBQyxHQUFHWSxLQUFLLENBQUxBLFdBQVIsUUFBUUEsQ0FBUjs7QUFDQSxZQUFJN0IsS0FBSyxLQUFMQSxZQUFzQmlCLENBQUMsS0FBSyxnQkFBaEMsQ0FBZ0MsQ0FBaEMsRUFBb0Q7QUFDbERqQixlQUFLLEdBQUxBO0FBREYsZUFFTztBQUNMLGNBQUlBLEtBQUssS0FBVCxVQUF3QjtBQUN0QkEsaUJBQUssR0FBTEE7QUFFRjs7QUFBQSxjQUFJaUIsQ0FBQyxLQUFLLGdCQUFOQSxDQUFNLENBQU5BLElBQTRCQSxDQUFDLEtBQUssZ0JBQXRDLENBQXNDLENBQXRDLEVBQTBEO0FBQ3hELGdCQUFJakIsS0FBSyxLQUFULGFBQTJCO0FBQ3pCLGtCQUFJQSxLQUFLLEtBQVQsT0FBcUI7QUFDbkJvRywwQkFBVSxHQUFHSyxRQUFRLEdBQXJCTDtBQUVGOztBQUFBLGtCQUFJTSxLQUFLLEdBQUc3RSxLQUFLLENBQUxBLGtCQUF3QnVFLFVBQVUsR0FBOUMsQ0FBWXZFLENBQVo7QUFDQSxrQkFBSUwsS0FBSyxHQUFHSyxLQUFLLENBQUxBLE1BQ1Z1RSxVQUFVLElBQ1BBLFVBQVUsR0FBVkEsWUFDRHZFLEtBQUssQ0FBTEEsMkJBQWlDLGVBRGhDdUUsQ0FDZ0MsQ0FEaENBLE9BRk92RSxDQUNBLENBREFBLEVBQVosUUFBWUEsQ0FBWjs7QUFRQSxrQkFBSTZFLEtBQUssS0FBVCxRQUFzQjtBQUNwQlgsMEJBQVUsSUFBVkE7QUFDQUEsMEJBQVUsSUFBVkE7QUFGRixxQkFHTyxJQUFJVyxLQUFLLEtBQVQsTUFBb0I7QUFDekJWLGlDQUFpQixHQUFqQkE7QUFESyxxQkFFQSxJQUFJVSxLQUFLLEtBQVQsU0FBdUI7QUFDNUJULCtCQUFlLEdBQWZBO0FBREsscUJBRUEsSUFBSVMsS0FBSyxLQUFULFNBQXVCO0FBQzVCckIsNEJBQVksR0FBR1YsYUFBYSxRQUE1QlUsWUFBNEIsQ0FBNUJBO0FBQ0FHLHFCQUFLLEdBQUxBO0FBRksscUJBR0EsSUFBSWtCLEtBQUssS0FBVCxvQkFBa0M7QUFDdkNwQixnQ0FBZ0IsR0FBR1gsYUFBYSxRQUFoQ1csZ0JBQWdDLENBQWhDQTs7QUFDQSxvQkFBSXJGLE9BQU8sS0FBWCxHQUFtQjtBQUNqQkMsOEJBQVksQ0FBWkEsT0FBWSxDQUFaQTtBQUNBRCx5QkFBTyxHQUFHVyxVQUFVLENBQUMsWUFBWTtBQUMvQkQsNkJBQVM7QUFEUyxxQkFBcEJWLGdCQUFvQixDQUFwQkE7QUFJSDtBQUNGO0FBQ0Q7O0FBQUEsZ0JBQUlELEtBQUssS0FBVCxhQUEyQjtBQUN6QixrQkFBSStGLFVBQVUsS0FBZCxJQUF1QjtBQUNyQlIsMkJBQVcsR0FBWEE7O0FBQ0Esb0JBQUlVLGVBQWUsS0FBbkIsSUFBNEI7QUFDMUJBLGlDQUFlLEdBQWZBO0FBRUY7O0FBQUEsb0JBQUkvQyxLQUFLLEdBQUcsa0NBQWtDO0FBQzVDeUQsc0JBQUksRUFBRVosVUFBVSxDQUFWQSxNQURzQyxDQUN0Q0EsQ0FEc0M7QUFFNUNSLDZCQUFXLEVBRmI7QUFBOEMsaUJBQWxDLENBQVo7QUFJQWMsa0JBQUUsQ0FBRkE7O0FBQ0Esb0JBQUlKLGVBQWUsS0FBbkIsV0FBbUM7QUFDakNqQixzQkFBSSxLQUFLcUIsRUFBRSxDQUFQLFdBQUpyQixLQUFJLENBQUpBO0FBRUY7O0FBQUEsb0JBQUljLFlBQVksS0FBaEIsUUFBNkI7QUFDM0I7QUFFSDtBQUNEQzs7QUFBQUEsd0JBQVUsR0FBVkE7QUFDQUUsNkJBQWUsR0FBZkE7QUFFRmpHOztBQUFBQSxpQkFBSyxHQUFHaUIsQ0FBQyxLQUFLLGdCQUFOQSxDQUFNLENBQU5BLGNBQVJqQjtBQXZERixpQkF3RE87QUFDTCxnQkFBSUEsS0FBSyxLQUFULGFBQTJCO0FBQ3pCbUcsd0JBQVUsR0FBVkE7QUFDQW5HLG1CQUFLLEdBQUxBO0FBRUY7O0FBQUEsZ0JBQUlBLEtBQUssS0FBVCxPQUFxQjtBQUNuQixrQkFBSWlCLENBQUMsS0FBSyxlQUFWLENBQVUsQ0FBVixFQUE2QjtBQUMzQm1GLDBCQUFVLEdBQUdLLFFBQVEsR0FBckJMO0FBQ0FwRyxxQkFBSyxHQUFMQTtBQUVIO0FBTEQsbUJBS08sSUFBSUEsS0FBSyxLQUFULGFBQTJCO0FBQ2hDQSxtQkFBSyxHQUFMQTtBQUVIO0FBQ0Y7QUFDRjtBQUNGO0FBQ0Y7QUEvRkQ7O0FBaUdBLE1BQUlTLFFBQVEsR0FBUkEsb0JBQXVCO0FBQ3pCLFFBQUlxRixZQUFZLEtBQVpBLFFBQXlCQSxZQUFZLEtBQXpDLFlBQTBEO0FBQ3hEQSxrQkFBWSxHQUFaQTs7QUFDQSxVQUFJN0YsT0FBTyxLQUFYLEdBQW1CO0FBQ2pCQyxvQkFBWSxDQUFaQSxPQUFZLENBQVpBO0FBQ0FELGVBQU8sR0FBUEE7QUFFRkE7O0FBQUFBLGFBQU8sR0FBR1csVUFBVSxDQUFDLFlBQVk7QUFDL0JELGlCQUFTO0FBRFMsU0FBcEJWLEtBQW9CLENBQXBCQTtBQUdBdUYsV0FBSyxHQUFHVixhQUFhLENBQUNDLElBQUksQ0FBSkEsSUFBU00sWUFBWSxHQUFyQk4sSUFBNEJTLEtBQUssR0FBdkRBLENBQXNCVCxDQUFELENBQXJCUztBQUVBYSxRQUFFLENBQUZBO0FBQ0EsVUFBSW5ELEtBQUssR0FBRyxVQUFaLE9BQVksQ0FBWjtBQUNBbUQsUUFBRSxDQUFGQTtBQUNBckIsVUFBSSxLQUFLcUIsRUFBRSxDQUFQLFNBQUpyQixLQUFJLENBQUpBO0FBRUg7QUFqQkQ7O0FBbUJBLE1BQUl1QixLQUFLLEdBQUxBLGlCQUFvQjtBQUN0QlQsZ0JBQVksR0FBWkE7O0FBQ0EsUUFBSUQsY0FBYyxJQUFsQixXQUFpQztBQUMvQkEsb0JBQWM7QUFDZEEsb0JBQWMsR0FBZEE7QUFFRjs7QUFBQSxRQUFJNUYsT0FBTyxLQUFYLEdBQW1CO0FBQ2pCQyxrQkFBWSxDQUFaQSxPQUFZLENBQVpBO0FBQ0FELGFBQU8sR0FBUEE7QUFFRm9HOztBQUFBQSxNQUFFLENBQUZBO0FBVkY7O0FBYUEsTUFBSTFGLFNBQVMsR0FBVEEscUJBQXdCO0FBQzFCVixXQUFPLEdBQVBBOztBQUVBLFFBQUk2RixZQUFZLEtBQWhCLFNBQThCO0FBQzVCLFVBQUksZ0JBQWdCRCxjQUFjLElBQWxDLFdBQWlEO0FBQy9DdkMsa0JBQVUsQ0FDUixVQUNFLDJDQUZKQSw4QkFDRSxDQURRLENBQVZBO0FBT0F1QyxzQkFBYztBQUNkQSxzQkFBYyxHQUFkQTtBQVRGLGFBVU87QUFDTEosbUJBQVcsR0FBWEE7QUFDQXhGLGVBQU8sR0FBR1csVUFBVSxDQUFDLFlBQVk7QUFDL0JELG1CQUFTO0FBRFMsV0FBcEJWLGdCQUFvQixDQUFwQkE7QUFJRjs7QUFBQTtBQUdGd0Y7O0FBQUFBLGVBQVcsR0FBWEE7QUFDQXhGLFdBQU8sR0FBR1csVUFBVSxDQUFDLFlBQVk7QUFDL0JELGVBQVM7QUFEUyxPQUFwQlYsZ0JBQW9CLENBQXBCQTtBQUlBNkYsZ0JBQVksR0FBWkE7QUFDQUMsY0FBVSxHQUFWQTtBQUNBRSxtQkFBZSxHQUFmQTtBQUNBRCxxQkFBaUIsR0FBakJBO0FBQ0FFLGNBQVUsR0FBVkE7QUFDQUMsY0FBVSxHQUFWQTtBQUNBQyxjQUFVLEdBQVZBO0FBQ0FwRyxTQUFLLEdBQUxBLFlBbkMwQixDQXFDMUI7QUFDQTs7QUFDQSxRQUFJNEcsVUFBVSxHQUFkOztBQUNBLFFBQUk5RixHQUFHLENBQUhBLDJCQUErQkEsR0FBRyxDQUFIQSxnQkFBbkMsU0FBZ0U7QUFDOUQsVUFBSXlFLFdBQVcsS0FBZixJQUF3QjtBQUN0QnFCLGtCQUFVLElBQ1IsQ0FBQzlGLEdBQUcsQ0FBSEEsaUJBQXFCLENBQXJCQSxVQUFELHdCQUVBK0Ysa0JBQWtCLENBSHBCRCxXQUdvQixDQUhwQkE7QUFLSDtBQUNEOztBQUFBLFFBQUlFLGNBQWMsR0FBbEI7QUFDQUEsa0JBQWMsQ0FBZEEsUUFBYyxDQUFkQTs7QUFDQSxRQUFJL0UsT0FBTyxJQUFYLFdBQTBCO0FBQ3hCLFdBQUssSUFBTCxpQkFBMEI7QUFDeEIsWUFBSVosTUFBTSxDQUFOQSx1Q0FBSixJQUFJQSxDQUFKLEVBQXlEO0FBQ3ZEMkYsd0JBQWMsQ0FBZEEsSUFBYyxDQUFkQSxHQUF1Qi9FLE9BQU8sQ0FBOUIrRSxJQUE4QixDQUE5QkE7QUFFSDtBQUNGO0FBQ0Q7O0FBQUEsUUFBSTtBQUNGbEIsZUFBUyxDQUFUQTtBQVNBLEtBVkYsQ0FVRSxjQUFjO0FBQ2RXLFdBQUs7QUFDTDtBQUVIO0FBdkVEOztBQXlFQUYsSUFBRSxDQUFGQTtBQUNBQSxJQUFFLENBQUZBO0FBQ0FBLElBQUUsQ0FBRkE7QUFDQUEsSUFBRSxDQUFGQTtBQUVBMUYsV0FBUztBQUdYb0c7O0FBQUFBLG1CQUFtQixDQUFuQkEsWUFBZ0M1RixNQUFNLENBQU5BLE9BQWM4QixXQUFXLENBQXpEOEQsU0FBZ0M1RixDQUFoQzRGO0FBQ0FBLG1CQUFtQixDQUFuQkE7QUFDQUEsbUJBQW1CLENBQW5CQTtBQUNBQSxtQkFBbUIsQ0FBbkJBOztBQUNBQSxtQkFBbUIsQ0FBbkJBLGtCQUFzQyxZQUFZO0FBQ2hEO0FBREZBOztBQUlBQSxtQkFBbUIsQ0FBbkJBO0FBQ0FBLG1CQUFtQixDQUFuQkE7QUFDQUEsbUJBQW1CLENBQW5CQTtBQUNBQSxtQkFBbUIsQ0FBbkJBO2VBRWVBLG1CIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL25leHQvZGlzdC9jbGllbnQvZGV2L2V2ZW50LXNvdXJjZS1wb2x5ZmlsbC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlICovXG4vLyBJbXByb3ZlZCB2ZXJzaW9uIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9ZYWZmbGUvRXZlbnRTb3VyY2UvXG4vLyBBdmFpbGFibGUgdW5kZXIgTUlUIExpY2Vuc2UgKE1JVClcbi8vIE9ubHkgdHJpZXMgdG8gc3VwcG9ydCBJRTExIGFuZCBub3RoaW5nIGJlbG93XG52YXIgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnRcbnZhciBSZXNwb25zZSA9IHdpbmRvdy5SZXNwb25zZVxudmFyIFRleHREZWNvZGVyID0gd2luZG93LlRleHREZWNvZGVyXG52YXIgVGV4dEVuY29kZXIgPSB3aW5kb3cuVGV4dEVuY29kZXJcbnZhciBBYm9ydENvbnRyb2xsZXIgPSB3aW5kb3cuQWJvcnRDb250cm9sbGVyXG5cbmlmIChBYm9ydENvbnRyb2xsZXIgPT0gdW5kZWZpbmVkKSB7XG4gIEFib3J0Q29udHJvbGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnNpZ25hbCA9IG51bGxcbiAgICB0aGlzLmFib3J0ID0gZnVuY3Rpb24gKCkge31cbiAgfVxufVxuXG5mdW5jdGlvbiBUZXh0RGVjb2RlclBvbHlmaWxsKCkge1xuICB0aGlzLmJpdHNOZWVkZWQgPSAwXG4gIHRoaXMuY29kZVBvaW50ID0gMFxufVxuXG5UZXh0RGVjb2RlclBvbHlmaWxsLnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiAob2N0ZXRzKSB7XG4gIGZ1bmN0aW9uIHZhbGlkKGNvZGVQb2ludCwgc2hpZnQsIG9jdGV0c0NvdW50KSB7XG4gICAgaWYgKG9jdGV0c0NvdW50ID09PSAxKSB7XG4gICAgICByZXR1cm4gY29kZVBvaW50ID49IDB4MDA4MCA+PiBzaGlmdCAmJiBjb2RlUG9pbnQgPDwgc2hpZnQgPD0gMHgwN2ZmXG4gICAgfVxuICAgIGlmIChvY3RldHNDb3VudCA9PT0gMikge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKGNvZGVQb2ludCA+PSAweDA4MDAgPj4gc2hpZnQgJiYgY29kZVBvaW50IDw8IHNoaWZ0IDw9IDB4ZDdmZikgfHxcbiAgICAgICAgKGNvZGVQb2ludCA+PSAweGUwMDAgPj4gc2hpZnQgJiYgY29kZVBvaW50IDw8IHNoaWZ0IDw9IDB4ZmZmZilcbiAgICAgIClcbiAgICB9XG4gICAgaWYgKG9jdGV0c0NvdW50ID09PSAzKSB7XG4gICAgICByZXR1cm4gY29kZVBvaW50ID49IDB4MDEwMDAwID4+IHNoaWZ0ICYmIGNvZGVQb2ludCA8PCBzaGlmdCA8PSAweDEwZmZmZlxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoKVxuICB9XG4gIGZ1bmN0aW9uIG9jdGV0c0NvdW50KGJpdHNOZWVkZWQsIGNvZGVQb2ludCkge1xuICAgIGlmIChiaXRzTmVlZGVkID09PSA2ICogMSkge1xuICAgICAgcmV0dXJuIGNvZGVQb2ludCA+PiA2ID4gMTUgPyAzIDogY29kZVBvaW50ID4gMzEgPyAyIDogMVxuICAgIH1cbiAgICBpZiAoYml0c05lZWRlZCA9PT0gNiAqIDIpIHtcbiAgICAgIHJldHVybiBjb2RlUG9pbnQgPiAxNSA/IDMgOiAyXG4gICAgfVxuICAgIGlmIChiaXRzTmVlZGVkID09PSA2ICogMykge1xuICAgICAgcmV0dXJuIDNcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKClcbiAgfVxuICB2YXIgUkVQTEFDRVIgPSAweGZmZmRcbiAgdmFyIHN0cmluZyA9ICcnXG4gIHZhciBiaXRzTmVlZGVkID0gdGhpcy5iaXRzTmVlZGVkXG4gIHZhciBjb2RlUG9pbnQgPSB0aGlzLmNvZGVQb2ludFxuICBmb3IgKHZhciBpID0gMDsgaSA8IG9jdGV0cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIHZhciBvY3RldCA9IG9jdGV0c1tpXVxuICAgIGlmIChiaXRzTmVlZGVkICE9PSAwKSB7XG4gICAgICBpZiAoXG4gICAgICAgIG9jdGV0IDwgMTI4IHx8XG4gICAgICAgIG9jdGV0ID4gMTkxIHx8XG4gICAgICAgICF2YWxpZChcbiAgICAgICAgICAoY29kZVBvaW50IDw8IDYpIHwgKG9jdGV0ICYgNjMpLFxuICAgICAgICAgIGJpdHNOZWVkZWQgLSA2LFxuICAgICAgICAgIG9jdGV0c0NvdW50KGJpdHNOZWVkZWQsIGNvZGVQb2ludClcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIGJpdHNOZWVkZWQgPSAwXG4gICAgICAgIGNvZGVQb2ludCA9IFJFUExBQ0VSXG4gICAgICAgIHN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGVQb2ludClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGJpdHNOZWVkZWQgPT09IDApIHtcbiAgICAgIGlmIChvY3RldCA+PSAwICYmIG9jdGV0IDw9IDEyNykge1xuICAgICAgICBiaXRzTmVlZGVkID0gMFxuICAgICAgICBjb2RlUG9pbnQgPSBvY3RldFxuICAgICAgfSBlbHNlIGlmIChvY3RldCA+PSAxOTIgJiYgb2N0ZXQgPD0gMjIzKSB7XG4gICAgICAgIGJpdHNOZWVkZWQgPSA2ICogMVxuICAgICAgICBjb2RlUG9pbnQgPSBvY3RldCAmIDMxXG4gICAgICB9IGVsc2UgaWYgKG9jdGV0ID49IDIyNCAmJiBvY3RldCA8PSAyMzkpIHtcbiAgICAgICAgYml0c05lZWRlZCA9IDYgKiAyXG4gICAgICAgIGNvZGVQb2ludCA9IG9jdGV0ICYgMTVcbiAgICAgIH0gZWxzZSBpZiAob2N0ZXQgPj0gMjQwICYmIG9jdGV0IDw9IDI0Nykge1xuICAgICAgICBiaXRzTmVlZGVkID0gNiAqIDNcbiAgICAgICAgY29kZVBvaW50ID0gb2N0ZXQgJiA3XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiaXRzTmVlZGVkID0gMFxuICAgICAgICBjb2RlUG9pbnQgPSBSRVBMQUNFUlxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBiaXRzTmVlZGVkICE9PSAwICYmXG4gICAgICAgICF2YWxpZChjb2RlUG9pbnQsIGJpdHNOZWVkZWQsIG9jdGV0c0NvdW50KGJpdHNOZWVkZWQsIGNvZGVQb2ludCkpXG4gICAgICApIHtcbiAgICAgICAgYml0c05lZWRlZCA9IDBcbiAgICAgICAgY29kZVBvaW50ID0gUkVQTEFDRVJcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYml0c05lZWRlZCAtPSA2XG4gICAgICBjb2RlUG9pbnQgPSAoY29kZVBvaW50IDw8IDYpIHwgKG9jdGV0ICYgNjMpXG4gICAgfVxuICAgIGlmIChiaXRzTmVlZGVkID09PSAwKSB7XG4gICAgICBpZiAoY29kZVBvaW50IDw9IDB4ZmZmZikge1xuICAgICAgICBzdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlUG9pbnQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgweGQ4MDAgKyAoKGNvZGVQb2ludCAtIDB4ZmZmZiAtIDEpID4+IDEwKSlcbiAgICAgICAgc3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoXG4gICAgICAgICAgMHhkYzAwICsgKChjb2RlUG9pbnQgLSAweGZmZmYgLSAxKSAmIDB4M2ZmKVxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHRoaXMuYml0c05lZWRlZCA9IGJpdHNOZWVkZWRcbiAgdGhpcy5jb2RlUG9pbnQgPSBjb2RlUG9pbnRcbiAgcmV0dXJuIHN0cmluZ1xufVxuXG4vLyBGaXJlZm94IDwgMzggdGhyb3dzIGFuIGVycm9yIHdpdGggc3RyZWFtIG9wdGlvblxudmFyIHN1cHBvcnRzU3RyZWFtT3B0aW9uID0gZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIHJldHVybiAoXG4gICAgICBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUobmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKCd0ZXN0JyksIHtcbiAgICAgICAgc3RyZWFtOiB0cnVlLFxuICAgICAgfSkgPT09ICd0ZXN0J1xuICAgIClcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmxvZyhlcnJvcilcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuLy8gSUUsIEVkZ2VcbmlmIChcbiAgVGV4dERlY29kZXIgPT0gdW5kZWZpbmVkIHx8XG4gIFRleHRFbmNvZGVyID09IHVuZGVmaW5lZCB8fFxuICAhc3VwcG9ydHNTdHJlYW1PcHRpb24oKVxuKSB7XG4gIFRleHREZWNvZGVyID0gVGV4dERlY29kZXJQb2x5ZmlsbFxufVxuXG52YXIgayA9IGZ1bmN0aW9uICgpIHt9XG5cbmZ1bmN0aW9uIFhIUldyYXBwZXIoeGhyKSB7XG4gIHRoaXMud2l0aENyZWRlbnRpYWxzID0gZmFsc2VcbiAgdGhpcy5yZXNwb25zZVR5cGUgPSAnJ1xuICB0aGlzLnJlYWR5U3RhdGUgPSAwXG4gIHRoaXMuc3RhdHVzID0gMFxuICB0aGlzLnN0YXR1c1RleHQgPSAnJ1xuICB0aGlzLnJlc3BvbnNlVGV4dCA9ICcnXG4gIHRoaXMub25wcm9ncmVzcyA9IGtcbiAgdGhpcy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBrXG4gIHRoaXMuX2NvbnRlbnRUeXBlID0gJydcbiAgdGhpcy5feGhyID0geGhyXG4gIHRoaXMuX3NlbmRUaW1lb3V0ID0gMFxuICB0aGlzLl9hYm9ydCA9IGtcbn1cblxuWEhSV3JhcHBlci5wcm90b3R5cGUub3BlbiA9IGZ1bmN0aW9uIChtZXRob2QsIHVybCkge1xuICB0aGlzLl9hYm9ydCh0cnVlKVxuXG4gIHZhciB0aGF0ID0gdGhpc1xuICB2YXIgeGhyID0gdGhpcy5feGhyXG4gIHZhciBzdGF0ZSA9IDFcbiAgdmFyIHRpbWVvdXQgPSAwXG5cbiAgdGhpcy5fYWJvcnQgPSBmdW5jdGlvbiAoc2lsZW50KSB7XG4gICAgaWYgKHRoYXQuX3NlbmRUaW1lb3V0ICE9PSAwKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhhdC5fc2VuZFRpbWVvdXQpXG4gICAgICB0aGF0Ll9zZW5kVGltZW91dCA9IDBcbiAgICB9XG4gICAgaWYgKHN0YXRlID09PSAxIHx8IHN0YXRlID09PSAyIHx8IHN0YXRlID09PSAzKSB7XG4gICAgICBzdGF0ZSA9IDRcbiAgICAgIHhoci5vbmxvYWQgPSBrXG4gICAgICB4aHIub25lcnJvciA9IGtcbiAgICAgIHhoci5vbmFib3J0ID0ga1xuICAgICAgeGhyLm9ucHJvZ3Jlc3MgPSBrXG4gICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0ga1xuICAgICAgLy8gSUUgOCAtIDk6IFhEb21haW5SZXF1ZXN0I2Fib3J0KCkgZG9lcyBub3QgZmlyZSBhbnkgZXZlbnRcbiAgICAgIC8vIE9wZXJhIDwgMTA6IFhNTEh0dHBSZXF1ZXN0I2Fib3J0KCkgZG9lcyBub3QgZmlyZSBhbnkgZXZlbnRcbiAgICAgIHhoci5hYm9ydCgpXG4gICAgICBpZiAodGltZW91dCAhPT0gMCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dClcbiAgICAgICAgdGltZW91dCA9IDBcbiAgICAgIH1cbiAgICAgIGlmICghc2lsZW50KSB7XG4gICAgICAgIHRoYXQucmVhZHlTdGF0ZSA9IDRcbiAgICAgICAgdGhhdC5vbnJlYWR5c3RhdGVjaGFuZ2UoKVxuICAgICAgfVxuICAgIH1cbiAgICBzdGF0ZSA9IDBcbiAgfVxuXG4gIHZhciBvblN0YXJ0ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChzdGF0ZSA9PT0gMSkge1xuICAgICAgLy8gc3RhdGUgPSAyO1xuICAgICAgdmFyIHN0YXR1cyA9IDBcbiAgICAgIHZhciBzdGF0dXNUZXh0ID0gJydcbiAgICAgIHZhciBjb250ZW50VHlwZSA9IHVuZGVmaW5lZFxuICAgICAgaWYgKCEoJ2NvbnRlbnRUeXBlJyBpbiB4aHIpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3RhdHVzID0geGhyLnN0YXR1c1xuICAgICAgICAgIHN0YXR1c1RleHQgPSB4aHIuc3RhdHVzVGV4dFxuICAgICAgICAgIGNvbnRlbnRUeXBlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdDb250ZW50LVR5cGUnKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIElFIDwgMTAgdGhyb3dzIGV4Y2VwdGlvbiBmb3IgYHhoci5zdGF0dXNgIHdoZW4geGhyLnJlYWR5U3RhdGUgPT09IDIgfHwgeGhyLnJlYWR5U3RhdGUgPT09IDNcbiAgICAgICAgICAvLyBPcGVyYSA8IDExIHRocm93cyBleGNlcHRpb24gZm9yIGB4aHIuc3RhdHVzYCB3aGVuIHhoci5yZWFkeVN0YXRlID09PSAyXG4gICAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI5MTIxXG4gICAgICAgICAgc3RhdHVzID0gMFxuICAgICAgICAgIHN0YXR1c1RleHQgPSAnJ1xuICAgICAgICAgIGNvbnRlbnRUeXBlID0gdW5kZWZpbmVkXG4gICAgICAgICAgLy8gRmlyZWZveCA8IDE0LCBDaHJvbWUgPywgU2FmYXJpID9cbiAgICAgICAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mjk2NThcbiAgICAgICAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc4NTRcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdHVzID0gMjAwXG4gICAgICAgIHN0YXR1c1RleHQgPSAnT0snXG4gICAgICAgIGNvbnRlbnRUeXBlID0geGhyLmNvbnRlbnRUeXBlXG4gICAgICB9XG4gICAgICBpZiAoc3RhdHVzICE9PSAwKSB7XG4gICAgICAgIHN0YXRlID0gMlxuICAgICAgICB0aGF0LnJlYWR5U3RhdGUgPSAyXG4gICAgICAgIHRoYXQuc3RhdHVzID0gc3RhdHVzXG4gICAgICAgIHRoYXQuc3RhdHVzVGV4dCA9IHN0YXR1c1RleHRcbiAgICAgICAgdGhhdC5fY29udGVudFR5cGUgPSBjb250ZW50VHlwZVxuICAgICAgICB0aGF0Lm9ucmVhZHlzdGF0ZWNoYW5nZSgpXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHZhciBvblByb2dyZXNzID0gZnVuY3Rpb24gKCkge1xuICAgIG9uU3RhcnQoKVxuICAgIGlmIChzdGF0ZSA9PT0gMiB8fCBzdGF0ZSA9PT0gMykge1xuICAgICAgc3RhdGUgPSAzXG4gICAgICB2YXIgcmVzcG9uc2VUZXh0ID0gJydcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3BvbnNlVGV4dCA9IHhoci5yZXNwb25zZVRleHRcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIElFIDggLSA5IHdpdGggWE1MSHR0cFJlcXVlc3RcbiAgICAgIH1cbiAgICAgIHRoYXQucmVhZHlTdGF0ZSA9IDNcbiAgICAgIHRoYXQucmVzcG9uc2VUZXh0ID0gcmVzcG9uc2VUZXh0XG4gICAgICB0aGF0Lm9ucHJvZ3Jlc3MoKVxuICAgIH1cbiAgfVxuICB2YXIgb25GaW5pc2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gRmlyZWZveCA1MiBmaXJlcyBcInJlYWR5c3RhdGVjaGFuZ2VcIiAoeGhyLnJlYWR5U3RhdGUgPT09IDQpIHdpdGhvdXQgZmluYWwgXCJyZWFkeXN0YXRlY2hhbmdlXCIgKHhoci5yZWFkeVN0YXRlID09PSAzKVxuICAgIC8vIElFIDggZmlyZXMgXCJvbmxvYWRcIiB3aXRob3V0IFwib25wcm9ncmVzc1wiXG4gICAgb25Qcm9ncmVzcygpXG4gICAgaWYgKHN0YXRlID09PSAxIHx8IHN0YXRlID09PSAyIHx8IHN0YXRlID09PSAzKSB7XG4gICAgICBzdGF0ZSA9IDRcbiAgICAgIGlmICh0aW1lb3V0ICE9PSAwKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KVxuICAgICAgICB0aW1lb3V0ID0gMFxuICAgICAgfVxuICAgICAgdGhhdC5yZWFkeVN0YXRlID0gNFxuICAgICAgdGhhdC5vbnJlYWR5c3RhdGVjaGFuZ2UoKVxuICAgIH1cbiAgfVxuICB2YXIgb25SZWFkeVN0YXRlQ2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh4aHIgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBPcGVyYSAxMlxuICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICAgIG9uRmluaXNoKClcbiAgICAgIH0gZWxzZSBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDMpIHtcbiAgICAgICAgb25Qcm9ncmVzcygpXG4gICAgICB9IGVsc2UgaWYgKHhoci5yZWFkeVN0YXRlID09PSAyKSB7XG4gICAgICAgIG9uU3RhcnQoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICB2YXIgb25UaW1lb3V0ID0gZnVuY3Rpb24gKCkge1xuICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIG9uVGltZW91dCgpXG4gICAgfSwgNTAwKVxuICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gMykge1xuICAgICAgb25Qcm9ncmVzcygpXG4gICAgfVxuICB9XG5cbiAgLy8gWERvbWFpblJlcXVlc3QjYWJvcnQgcmVtb3ZlcyBvbnByb2dyZXNzLCBvbmVycm9yLCBvbmxvYWRcbiAgeGhyLm9ubG9hZCA9IG9uRmluaXNoXG4gIHhoci5vbmVycm9yID0gb25GaW5pc2hcbiAgLy8gaW1wcm9wZXIgZml4IHRvIG1hdGNoIEZpcmVmb3ggYmVoYXZpb3IsIGJ1dCBpdCBpcyBiZXR0ZXIgdGhhbiBqdXN0IGlnbm9yZSBhYm9ydFxuICAvLyBzZWUgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY4NTk2XG4gIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTg4MDIwMFxuICAvLyBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MTUzNTcwXG4gIC8vIElFIDggZmlyZXMgXCJvbmxvYWRcIiB3aXRob3V0IFwib25wcm9ncmVzc1xuICB4aHIub25hYm9ydCA9IG9uRmluaXNoXG5cbiAgLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2NzIzXG4gIGlmIChcbiAgICAhKCdzZW5kQXNCaW5hcnknIGluIFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZSkgJiZcbiAgICAhKCdtb3pBbm9uJyBpbiBYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUpXG4gICkge1xuICAgIHhoci5vbnByb2dyZXNzID0gb25Qcm9ncmVzc1xuICB9XG5cbiAgLy8gSUUgOCAtIDkgKFhNTEhUVFBSZXF1ZXN0KVxuICAvLyBPcGVyYSA8IDEyXG4gIC8vIEZpcmVmb3ggPCAzLjVcbiAgLy8gRmlyZWZveCAzLjUgLSAzLjYgLSA/IDwgOS4wXG4gIC8vIG9ucHJvZ3Jlc3MgaXMgbm90IGZpcmVkIHNvbWV0aW1lcyBvciBkZWxheWVkXG4gIC8vIHNlZSBhbHNvICM2NFxuICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gb25SZWFkeVN0YXRlQ2hhbmdlXG5cbiAgaWYgKCdjb250ZW50VHlwZScgaW4geGhyKSB7XG4gICAgdXJsICs9ICh1cmwuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJykgKyAncGFkZGluZz10cnVlJ1xuICB9XG4gIHhoci5vcGVuKG1ldGhvZCwgdXJsLCB0cnVlKVxuXG4gIGlmICgncmVhZHlTdGF0ZScgaW4geGhyKSB7XG4gICAgLy8gd29ya2Fyb3VuZCBmb3IgT3BlcmEgMTIgaXNzdWUgd2l0aCBcInByb2dyZXNzXCIgZXZlbnRzXG4gICAgLy8gIzkxXG4gICAgdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgb25UaW1lb3V0KClcbiAgICB9LCAwKVxuICB9XG59XG5YSFJXcmFwcGVyLnByb3RvdHlwZS5hYm9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5fYWJvcnQoZmFsc2UpXG59XG5YSFJXcmFwcGVyLnByb3RvdHlwZS5nZXRSZXNwb25zZUhlYWRlciA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiB0aGlzLl9jb250ZW50VHlwZVxufVxuWEhSV3JhcHBlci5wcm90b3R5cGUuc2V0UmVxdWVzdEhlYWRlciA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICB2YXIgeGhyID0gdGhpcy5feGhyXG4gIGlmICgnc2V0UmVxdWVzdEhlYWRlcicgaW4geGhyKSB7XG4gICAgeGhyLnNldFJlcXVlc3RIZWFkZXIobmFtZSwgdmFsdWUpXG4gIH1cbn1cblhIUldyYXBwZXIucHJvdG90eXBlLmdldEFsbFJlc3BvbnNlSGVhZGVycyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3hoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMgIT0gdW5kZWZpbmVkXG4gICAgPyB0aGlzLl94aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKClcbiAgICA6ICcnXG59XG5YSFJXcmFwcGVyLnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24gKCkge1xuICAvLyBsb2FkaW5nIGluZGljYXRvciBpbiBTYWZhcmkgPCA/ICg2KSwgQ2hyb21lIDwgMTQsIEZpcmVmb3hcbiAgaWYgKFxuICAgICEoJ29udGltZW91dCcgaW4gWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlKSAmJlxuICAgIGRvY3VtZW50ICE9IHVuZGVmaW5lZCAmJlxuICAgIGRvY3VtZW50LnJlYWR5U3RhdGUgIT0gdW5kZWZpbmVkICYmXG4gICAgZG9jdW1lbnQucmVhZHlTdGF0ZSAhPT0gJ2NvbXBsZXRlJ1xuICApIHtcbiAgICB2YXIgdGhhdCA9IHRoaXNcbiAgICB0aGF0Ll9zZW5kVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgdGhhdC5fc2VuZFRpbWVvdXQgPSAwXG4gICAgICB0aGF0LnNlbmQoKVxuICAgIH0sIDQpXG4gICAgcmV0dXJuXG4gIH1cblxuICB2YXIgeGhyID0gdGhpcy5feGhyXG4gIC8vIHdpdGhDcmVkZW50aWFscyBzaG91bGQgYmUgc2V0IGFmdGVyIFwib3BlblwiIGZvciBTYWZhcmkgYW5kIENocm9tZSAoPCAxOSA/KVxuICB4aHIud2l0aENyZWRlbnRpYWxzID0gdGhpcy53aXRoQ3JlZGVudGlhbHNcbiAgeGhyLnJlc3BvbnNlVHlwZSA9IHRoaXMucmVzcG9uc2VUeXBlXG4gIHRyeSB7XG4gICAgLy8geGhyLnNlbmQoKTsgdGhyb3dzIFwiTm90IGVub3VnaCBhcmd1bWVudHNcIiBpbiBGaXJlZm94IDMuMFxuICAgIHhoci5zZW5kKHVuZGVmaW5lZClcbiAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgLy8gU2FmYXJpIDUuMS43LCBPcGVyYSAxMlxuICAgIHRocm93IGVycm9yMVxuICB9XG59XG5cbmZ1bmN0aW9uIHRvTG93ZXJDYXNlKG5hbWUpIHtcbiAgcmV0dXJuIG5hbWUucmVwbGFjZSgvW0EtWl0vZywgZnVuY3Rpb24gKGMpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjLmNoYXJDb2RlQXQoMCkgKyAweDIwKVxuICB9KVxufVxuXG5mdW5jdGlvbiBIZWFkZXJzUG9seWZpbGwoYWxsKSB7XG4gIC8vIEdldCBoZWFkZXJzOiBpbXBsZW1lbnRlZCBhY2NvcmRpbmcgdG8gbW96aWxsYSdzIGV4YW1wbGUgY29kZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1hNTEh0dHBSZXF1ZXN0L2dldEFsbFJlc3BvbnNlSGVhZGVycyNFeGFtcGxlXG4gIHZhciBtYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gIHZhciBhcnJheSA9IGFsbC5zcGxpdCgnXFxyXFxuJylcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkgKz0gMSkge1xuICAgIHZhciBsaW5lID0gYXJyYXlbaV1cbiAgICB2YXIgcGFydHMgPSBsaW5lLnNwbGl0KCc6ICcpXG4gICAgdmFyIG5hbWUgPSBwYXJ0cy5zaGlmdCgpXG4gICAgdmFyIHZhbHVlID0gcGFydHMuam9pbignOiAnKVxuICAgIG1hcFt0b0xvd2VyQ2FzZShuYW1lKV0gPSB2YWx1ZVxuICB9XG4gIHRoaXMuX21hcCA9IG1hcFxufVxuSGVhZGVyc1BvbHlmaWxsLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gdGhpcy5fbWFwW3RvTG93ZXJDYXNlKG5hbWUpXVxufVxuXG5mdW5jdGlvbiBYSFJUcmFuc3BvcnQoKSB7fVxuXG5YSFJUcmFuc3BvcnQucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbiAoXG4gIHhocixcbiAgb25TdGFydENhbGxiYWNrLFxuICBvblByb2dyZXNzQ2FsbGJhY2ssXG4gIG9uRmluaXNoQ2FsbGJhY2ssXG4gIHVybCxcbiAgd2l0aENyZWRlbnRpYWxzLFxuICBoZWFkZXJzXG4pIHtcbiAgeGhyLm9wZW4oJ0dFVCcsIHVybClcbiAgdmFyIG9mZnNldCA9IDBcbiAgeGhyLm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlc3BvbnNlVGV4dCA9IHhoci5yZXNwb25zZVRleHRcbiAgICB2YXIgY2h1bmsgPSByZXNwb25zZVRleHQuc2xpY2Uob2Zmc2V0KVxuICAgIG9mZnNldCArPSBjaHVuay5sZW5ndGhcbiAgICBvblByb2dyZXNzQ2FsbGJhY2soY2h1bmspXG4gIH1cbiAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDIpIHtcbiAgICAgIHZhciBzdGF0dXMgPSB4aHIuc3RhdHVzXG4gICAgICB2YXIgc3RhdHVzVGV4dCA9IHhoci5zdGF0dXNUZXh0XG4gICAgICB2YXIgY29udGVudFR5cGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0NvbnRlbnQtVHlwZScpXG4gICAgICB2YXIgaGVhZGVycyA9IHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKVxuICAgICAgb25TdGFydENhbGxiYWNrKFxuICAgICAgICBzdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQsXG4gICAgICAgIGNvbnRlbnRUeXBlLFxuICAgICAgICBuZXcgSGVhZGVyc1BvbHlmaWxsKGhlYWRlcnMpLFxuICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgeGhyLmFib3J0KClcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQpIHtcbiAgICAgIG9uRmluaXNoQ2FsbGJhY2soKVxuICAgIH1cbiAgfVxuICB4aHIud2l0aENyZWRlbnRpYWxzID0gd2l0aENyZWRlbnRpYWxzXG4gIHhoci5yZXNwb25zZVR5cGUgPSAndGV4dCdcbiAgZm9yICh2YXIgbmFtZSBpbiBoZWFkZXJzKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChoZWFkZXJzLCBuYW1lKSkge1xuICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIobmFtZSwgaGVhZGVyc1tuYW1lXSlcbiAgICB9XG4gIH1cbiAgeGhyLnNlbmQoKVxufVxuXG5mdW5jdGlvbiBIZWFkZXJzV3JhcHBlcihoZWFkZXJzKSB7XG4gIHRoaXMuX2hlYWRlcnMgPSBoZWFkZXJzXG59XG5IZWFkZXJzV3JhcHBlci5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIHRoaXMuX2hlYWRlcnMuZ2V0KG5hbWUpXG59XG5cbmZ1bmN0aW9uIEZldGNoVHJhbnNwb3J0KCkge31cblxuRmV0Y2hUcmFuc3BvcnQucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbiAoXG4gIHhocixcbiAgb25TdGFydENhbGxiYWNrLFxuICBvblByb2dyZXNzQ2FsbGJhY2ssXG4gIG9uRmluaXNoQ2FsbGJhY2ssXG4gIHVybCxcbiAgd2l0aENyZWRlbnRpYWxzLFxuICBoZWFkZXJzXG4pIHtcbiAgdmFyIGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgdmFyIHNpZ25hbCA9IGNvbnRyb2xsZXIuc2lnbmFsIC8vIHNlZSAjMTIwXG4gIHZhciB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpXG4gIGZldGNoKHVybCwge1xuICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgY3JlZGVudGlhbHM6IHdpdGhDcmVkZW50aWFscyA/ICdpbmNsdWRlJyA6ICdzYW1lLW9yaWdpbicsXG4gICAgc2lnbmFsOiBzaWduYWwsXG4gICAgY2FjaGU6ICduby1zdG9yZScsXG4gIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICB2YXIgcmVhZGVyID0gcmVzcG9uc2UuYm9keS5nZXRSZWFkZXIoKVxuICAgICAgb25TdGFydENhbGxiYWNrKFxuICAgICAgICByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgIHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICAgIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKSxcbiAgICAgICAgbmV3IEhlYWRlcnNXcmFwcGVyKHJlc3BvbnNlLmhlYWRlcnMpLFxuICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpXG4gICAgICAgICAgcmVhZGVyLmNhbmNlbCgpXG4gICAgICAgIH1cbiAgICAgIClcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciByZWFkTmV4dENodW5rID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJlYWRlclxuICAgICAgICAgICAgLnJlYWQoKVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICAgICAgICAvLyBOb3RlOiBieXRlcyBpbiB0ZXh0RGVjb2RlciBhcmUgaWdub3JlZFxuICAgICAgICAgICAgICAgIHJlc29sdmUodW5kZWZpbmVkKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBjaHVuayA9IHRleHREZWNvZGVyLmRlY29kZShyZXN1bHQudmFsdWUsIHsgc3RyZWFtOiB0cnVlIH0pXG4gICAgICAgICAgICAgICAgb25Qcm9ncmVzc0NhbGxiYWNrKGNodW5rKVxuICAgICAgICAgICAgICAgIHJlYWROZXh0Q2h1bmsoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgWydjYXRjaCddKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIHJlYWROZXh0Q2h1bmsoKVxuICAgICAgfSlcbiAgICB9KVxuICAgIC50aGVuKFxuICAgICAgZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICBvbkZpbmlzaENhbGxiYWNrKClcbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICBvbkZpbmlzaENhbGxiYWNrKClcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKVxuICAgICAgfVxuICAgIClcbn1cblxuZnVuY3Rpb24gRXZlbnRUYXJnZXQoKSB7XG4gIHRoaXMuX2xpc3RlbmVycyA9IE9iamVjdC5jcmVhdGUobnVsbClcbn1cblxuZnVuY3Rpb24gdGhyb3dFcnJvcihlKSB7XG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIHRocm93IGVcbiAgfSwgMClcbn1cblxuRXZlbnRUYXJnZXQucHJvdG90eXBlLmRpc3BhdGNoRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgZXZlbnQudGFyZ2V0ID0gdGhpc1xuICB2YXIgdHlwZUxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyc1tldmVudC50eXBlXVxuICBpZiAodHlwZUxpc3RlbmVycyAhPSB1bmRlZmluZWQpIHtcbiAgICB2YXIgbGVuZ3RoID0gdHlwZUxpc3RlbmVycy5sZW5ndGhcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB2YXIgbGlzdGVuZXIgPSB0eXBlTGlzdGVuZXJzW2ldXG4gICAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGxpc3RlbmVyLmhhbmRsZUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgbGlzdGVuZXIuaGFuZGxlRXZlbnQoZXZlbnQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBldmVudClcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvd0Vycm9yKGUpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5FdmVudFRhcmdldC5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uICh0eXBlLCBsaXN0ZW5lcikge1xuICB0eXBlID0gU3RyaW5nKHR5cGUpXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnNcbiAgdmFyIHR5cGVMaXN0ZW5lcnMgPSBsaXN0ZW5lcnNbdHlwZV1cbiAgaWYgKHR5cGVMaXN0ZW5lcnMgPT0gdW5kZWZpbmVkKSB7XG4gICAgdHlwZUxpc3RlbmVycyA9IFtdXG4gICAgbGlzdGVuZXJzW3R5cGVdID0gdHlwZUxpc3RlbmVyc1xuICB9XG4gIHZhciBmb3VuZCA9IGZhbHNlXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdHlwZUxpc3RlbmVycy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmICh0eXBlTGlzdGVuZXJzW2ldID09PSBsaXN0ZW5lcikge1xuICAgICAgZm91bmQgPSB0cnVlXG4gICAgfVxuICB9XG4gIGlmICghZm91bmQpIHtcbiAgICB0eXBlTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpXG4gIH1cbn1cbkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHR5cGUgPSBTdHJpbmcodHlwZSlcbiAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyc1xuICB2YXIgdHlwZUxpc3RlbmVycyA9IGxpc3RlbmVyc1t0eXBlXVxuICBpZiAodHlwZUxpc3RlbmVycyAhPSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZmlsdGVyZWQgPSBbXVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHlwZUxpc3RlbmVycy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgaWYgKHR5cGVMaXN0ZW5lcnNbaV0gIT09IGxpc3RlbmVyKSB7XG4gICAgICAgIGZpbHRlcmVkLnB1c2godHlwZUxpc3RlbmVyc1tpXSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIGxpc3RlbmVyc1t0eXBlXVxuICAgIH0gZWxzZSB7XG4gICAgICBsaXN0ZW5lcnNbdHlwZV0gPSBmaWx0ZXJlZFxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBFdmVudCh0eXBlKSB7XG4gIHRoaXMudHlwZSA9IHR5cGVcbiAgdGhpcy50YXJnZXQgPSB1bmRlZmluZWRcbn1cblxuZnVuY3Rpb24gTWVzc2FnZUV2ZW50KHR5cGUsIG9wdGlvbnMpIHtcbiAgRXZlbnQuY2FsbCh0aGlzLCB0eXBlKVxuICB0aGlzLmRhdGEgPSBvcHRpb25zLmRhdGFcbiAgdGhpcy5sYXN0RXZlbnRJZCA9IG9wdGlvbnMubGFzdEV2ZW50SWRcbn1cblxuTWVzc2FnZUV2ZW50LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXZlbnQucHJvdG90eXBlKVxuXG5mdW5jdGlvbiBDb25uZWN0aW9uRXZlbnQodHlwZSwgb3B0aW9ucykge1xuICBFdmVudC5jYWxsKHRoaXMsIHR5cGUpXG4gIHRoaXMuc3RhdHVzID0gb3B0aW9ucy5zdGF0dXNcbiAgdGhpcy5zdGF0dXNUZXh0ID0gb3B0aW9ucy5zdGF0dXNUZXh0XG4gIHRoaXMuaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVyc1xufVxuXG5Db25uZWN0aW9uRXZlbnQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFdmVudC5wcm90b3R5cGUpXG5cbnZhciBXQUlUSU5HID0gLTFcbnZhciBDT05ORUNUSU5HID0gMFxudmFyIE9QRU4gPSAxXG52YXIgQ0xPU0VEID0gMlxuXG52YXIgQUZURVJfQ1IgPSAtMVxudmFyIEZJRUxEX1NUQVJUID0gMFxudmFyIEZJRUxEID0gMVxudmFyIFZBTFVFX1NUQVJUID0gMlxudmFyIFZBTFVFID0gM1xuXG52YXIgY29udGVudFR5cGVSZWdFeHAgPSAvXnRleHRcXC9ldmVudFxcLXN0cmVhbTs/KFxccypjaGFyc2V0XFw9dXRmXFwtOCk/JC9pXG5cbnZhciBNSU5JTVVNX0RVUkFUSU9OID0gMTAwMFxudmFyIE1BWElNVU1fRFVSQVRJT04gPSAxODAwMDAwMFxuXG52YXIgcGFyc2VEdXJhdGlvbiA9IGZ1bmN0aW9uICh2YWx1ZSwgZGVmKSB7XG4gIHZhciBuID0gcGFyc2VJbnQodmFsdWUsIDEwKVxuICBpZiAobiAhPT0gbikge1xuICAgIG4gPSBkZWZcbiAgfVxuICByZXR1cm4gY2xhbXBEdXJhdGlvbihuKVxufVxudmFyIGNsYW1wRHVyYXRpb24gPSBmdW5jdGlvbiAobikge1xuICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgobiwgTUlOSU1VTV9EVVJBVElPTiksIE1BWElNVU1fRFVSQVRJT04pXG59XG5cbnZhciBmaXJlID0gZnVuY3Rpb24gKHRoYXQsIGYsIGV2ZW50KSB7XG4gIHRyeSB7XG4gICAgaWYgKHR5cGVvZiBmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBmLmNhbGwodGhhdCwgZXZlbnQpXG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3dFcnJvcihlKVxuICB9XG59XG5cbmZ1bmN0aW9uIEV2ZW50U291cmNlUG9seWZpbGwodXJsLCBvcHRpb25zKSB7XG4gIEV2ZW50VGFyZ2V0LmNhbGwodGhpcylcblxuICB0aGlzLm9ub3BlbiA9IHVuZGVmaW5lZFxuICB0aGlzLm9ubWVzc2FnZSA9IHVuZGVmaW5lZFxuICB0aGlzLm9uZXJyb3IgPSB1bmRlZmluZWRcblxuICB0aGlzLnVybCA9IHVuZGVmaW5lZFxuICB0aGlzLnJlYWR5U3RhdGUgPSB1bmRlZmluZWRcbiAgdGhpcy53aXRoQ3JlZGVudGlhbHMgPSB1bmRlZmluZWRcblxuICB0aGlzLl9jbG9zZSA9IHVuZGVmaW5lZFxuXG4gIHN0YXJ0KHRoaXMsIHVybCwgb3B0aW9ucylcbn1cblxudmFyIGlzRmV0Y2hTdXBwb3J0ZWQgPVxuICBmZXRjaCAhPSB1bmRlZmluZWQgJiYgUmVzcG9uc2UgIT0gdW5kZWZpbmVkICYmICdib2R5JyBpbiBSZXNwb25zZS5wcm90b3R5cGVcblxuZnVuY3Rpb24gc3RhcnQoZXMsIHVybCwgb3B0aW9ucykge1xuICB1cmwgPSBTdHJpbmcodXJsKVxuICB2YXIgd2l0aENyZWRlbnRpYWxzID0gb3B0aW9ucyAhPSB1bmRlZmluZWQgJiYgQm9vbGVhbihvcHRpb25zLndpdGhDcmVkZW50aWFscylcblxuICB2YXIgaW5pdGlhbFJldHJ5ID0gY2xhbXBEdXJhdGlvbigxMDAwKVxuICB2YXIgaGVhcnRiZWF0VGltZW91dCA9XG4gICAgb3B0aW9ucyAhPSB1bmRlZmluZWQgJiYgb3B0aW9ucy5oZWFydGJlYXRUaW1lb3V0ICE9IHVuZGVmaW5lZFxuICAgICAgPyBwYXJzZUR1cmF0aW9uKG9wdGlvbnMuaGVhcnRiZWF0VGltZW91dCwgNDUwMDApXG4gICAgICA6IGNsYW1wRHVyYXRpb24oNDUwMDApXG5cbiAgdmFyIGxhc3RFdmVudElkID0gJydcbiAgdmFyIHJldHJ5ID0gaW5pdGlhbFJldHJ5XG4gIHZhciB3YXNBY3Rpdml0eSA9IGZhbHNlXG4gIHZhciBoZWFkZXJzID1cbiAgICBvcHRpb25zICE9IHVuZGVmaW5lZCAmJiBvcHRpb25zLmhlYWRlcnMgIT0gdW5kZWZpbmVkXG4gICAgICA/IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5oZWFkZXJzKSlcbiAgICAgIDogdW5kZWZpbmVkXG4gIHZhciBDdXJyZW50VHJhbnNwb3J0ID1cbiAgICBvcHRpb25zICE9IHVuZGVmaW5lZCAmJiBvcHRpb25zLlRyYW5zcG9ydCAhPSB1bmRlZmluZWRcbiAgICAgID8gb3B0aW9ucy5UcmFuc3BvcnRcbiAgICAgIDogWE1MSHR0cFJlcXVlc3RcbiAgdmFyIHhociA9XG4gICAgaXNGZXRjaFN1cHBvcnRlZCAmJlxuICAgICEob3B0aW9ucyAhPSB1bmRlZmluZWQgJiYgb3B0aW9ucy5UcmFuc3BvcnQgIT0gdW5kZWZpbmVkKVxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogbmV3IFhIUldyYXBwZXIobmV3IEN1cnJlbnRUcmFuc3BvcnQoKSlcbiAgdmFyIHRyYW5zcG9ydCA9IHhociA9PSB1bmRlZmluZWQgPyBuZXcgRmV0Y2hUcmFuc3BvcnQoKSA6IG5ldyBYSFJUcmFuc3BvcnQoKVxuICB2YXIgY2FuY2VsRnVuY3Rpb24gPSB1bmRlZmluZWRcbiAgdmFyIHRpbWVvdXQgPSAwXG4gIHZhciBjdXJyZW50U3RhdGUgPSBXQUlUSU5HXG4gIHZhciBkYXRhQnVmZmVyID0gJydcbiAgdmFyIGxhc3RFdmVudElkQnVmZmVyID0gJydcbiAgdmFyIGV2ZW50VHlwZUJ1ZmZlciA9ICcnXG5cbiAgdmFyIHRleHRCdWZmZXIgPSAnJ1xuICB2YXIgc3RhdGUgPSBGSUVMRF9TVEFSVFxuICB2YXIgZmllbGRTdGFydCA9IDBcbiAgdmFyIHZhbHVlU3RhcnQgPSAwXG5cbiAgdmFyIG9uU3RhcnQgPSBmdW5jdGlvbiAoc3RhdHVzLCBzdGF0dXNUZXh0LCBjb250ZW50VHlwZSwgaGVhZGVycywgY2FuY2VsKSB7XG4gICAgaWYgKGN1cnJlbnRTdGF0ZSA9PT0gQ09OTkVDVElORykge1xuICAgICAgY2FuY2VsRnVuY3Rpb24gPSBjYW5jZWxcbiAgICAgIGlmIChcbiAgICAgICAgc3RhdHVzID09PSAyMDAgJiZcbiAgICAgICAgY29udGVudFR5cGUgIT0gdW5kZWZpbmVkICYmXG4gICAgICAgIGNvbnRlbnRUeXBlUmVnRXhwLnRlc3QoY29udGVudFR5cGUpXG4gICAgICApIHtcbiAgICAgICAgY3VycmVudFN0YXRlID0gT1BFTlxuICAgICAgICB3YXNBY3Rpdml0eSA9IHRydWVcbiAgICAgICAgcmV0cnkgPSBpbml0aWFsUmV0cnlcbiAgICAgICAgZXMucmVhZHlTdGF0ZSA9IE9QRU5cbiAgICAgICAgdmFyIGV2ZW50ID0gbmV3IENvbm5lY3Rpb25FdmVudCgnb3BlbicsIHtcbiAgICAgICAgICBzdGF0dXM6IHN0YXR1cyxcbiAgICAgICAgICBzdGF0dXNUZXh0OiBzdGF0dXNUZXh0LFxuICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgIH0pXG4gICAgICAgIGVzLmRpc3BhdGNoRXZlbnQoZXZlbnQpXG4gICAgICAgIGZpcmUoZXMsIGVzLm9ub3BlbiwgZXZlbnQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgbWVzc2FnZSA9ICcnXG4gICAgICAgIGlmIChzdGF0dXMgIT09IDIwMCkge1xuICAgICAgICAgIGlmIChzdGF0dXNUZXh0KSB7XG4gICAgICAgICAgICBzdGF0dXNUZXh0ID0gc3RhdHVzVGV4dC5yZXBsYWNlKC9cXHMrL2csICcgJylcbiAgICAgICAgICB9XG4gICAgICAgICAgbWVzc2FnZSA9XG4gICAgICAgICAgICBcIkV2ZW50U291cmNlJ3MgcmVzcG9uc2UgaGFzIGEgc3RhdHVzIFwiICtcbiAgICAgICAgICAgIHN0YXR1cyArXG4gICAgICAgICAgICAnICcgK1xuICAgICAgICAgICAgc3RhdHVzVGV4dCArXG4gICAgICAgICAgICAnIHRoYXQgaXMgbm90IDIwMC4gQWJvcnRpbmcgdGhlIGNvbm5lY3Rpb24uJ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1lc3NhZ2UgPVxuICAgICAgICAgICAgXCJFdmVudFNvdXJjZSdzIHJlc3BvbnNlIGhhcyBhIENvbnRlbnQtVHlwZSBzcGVjaWZ5aW5nIGFuIHVuc3VwcG9ydGVkIHR5cGU6IFwiICtcbiAgICAgICAgICAgIChjb250ZW50VHlwZSA9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyAnLSdcbiAgICAgICAgICAgICAgOiBjb250ZW50VHlwZS5yZXBsYWNlKC9cXHMrL2csICcgJykpICtcbiAgICAgICAgICAgICcuIEFib3J0aW5nIHRoZSBjb25uZWN0aW9uLidcbiAgICAgICAgfVxuICAgICAgICB0aHJvd0Vycm9yKG5ldyBFcnJvcihtZXNzYWdlKSlcbiAgICAgICAgY2xvc2UoKVxuICAgICAgICB2YXIgZXZlbnQgPSBuZXcgQ29ubmVjdGlvbkV2ZW50KCdlcnJvcicsIHtcbiAgICAgICAgICBzdGF0dXM6IHN0YXR1cyxcbiAgICAgICAgICBzdGF0dXNUZXh0OiBzdGF0dXNUZXh0LFxuICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgIH0pXG4gICAgICAgIGVzLmRpc3BhdGNoRXZlbnQoZXZlbnQpXG4gICAgICAgIGZpcmUoZXMsIGVzLm9uZXJyb3IsIGV2ZW50KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBvblByb2dyZXNzID0gZnVuY3Rpb24gKHRleHRDaHVuaykge1xuICAgIGlmIChjdXJyZW50U3RhdGUgPT09IE9QRU4pIHtcbiAgICAgIHZhciBuID0gLTFcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dENodW5rLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBjID0gdGV4dENodW5rLmNoYXJDb2RlQXQoaSlcbiAgICAgICAgaWYgKGMgPT09ICdcXG4nLmNoYXJDb2RlQXQoMCkgfHwgYyA9PT0gJ1xccicuY2hhckNvZGVBdCgwKSkge1xuICAgICAgICAgIG4gPSBpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBjaHVuayA9IChuICE9PSAtMSA/IHRleHRCdWZmZXIgOiAnJykgKyB0ZXh0Q2h1bmsuc2xpY2UoMCwgbiArIDEpXG4gICAgICB0ZXh0QnVmZmVyID0gKG4gPT09IC0xID8gdGV4dEJ1ZmZlciA6ICcnKSArIHRleHRDaHVuay5zbGljZShuICsgMSlcbiAgICAgIGlmIChjaHVuayAhPT0gJycpIHtcbiAgICAgICAgd2FzQWN0aXZpdHkgPSB0cnVlXG4gICAgICB9XG4gICAgICBmb3IgKHZhciBwb3NpdGlvbiA9IDA7IHBvc2l0aW9uIDwgY2h1bmsubGVuZ3RoOyBwb3NpdGlvbiArPSAxKSB7XG4gICAgICAgIHZhciBjID0gY2h1bmsuY2hhckNvZGVBdChwb3NpdGlvbilcbiAgICAgICAgaWYgKHN0YXRlID09PSBBRlRFUl9DUiAmJiBjID09PSAnXFxuJy5jaGFyQ29kZUF0KDApKSB7XG4gICAgICAgICAgc3RhdGUgPSBGSUVMRF9TVEFSVFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChzdGF0ZSA9PT0gQUZURVJfQ1IpIHtcbiAgICAgICAgICAgIHN0YXRlID0gRklFTERfU1RBUlRcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGMgPT09ICdcXHInLmNoYXJDb2RlQXQoMCkgfHwgYyA9PT0gJ1xcbicuY2hhckNvZGVBdCgwKSkge1xuICAgICAgICAgICAgaWYgKHN0YXRlICE9PSBGSUVMRF9TVEFSVCkge1xuICAgICAgICAgICAgICBpZiAoc3RhdGUgPT09IEZJRUxEKSB7XG4gICAgICAgICAgICAgICAgdmFsdWVTdGFydCA9IHBvc2l0aW9uICsgMVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhciBmaWVsZCA9IGNodW5rLnNsaWNlKGZpZWxkU3RhcnQsIHZhbHVlU3RhcnQgLSAxKVxuICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBjaHVuay5zbGljZShcbiAgICAgICAgICAgICAgICB2YWx1ZVN0YXJ0ICtcbiAgICAgICAgICAgICAgICAgICh2YWx1ZVN0YXJ0IDwgcG9zaXRpb24gJiZcbiAgICAgICAgICAgICAgICAgIGNodW5rLmNoYXJDb2RlQXQodmFsdWVTdGFydCkgPT09ICcgJy5jaGFyQ29kZUF0KDApXG4gICAgICAgICAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgICAgICAgICA6IDApLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgaWYgKGZpZWxkID09PSAnZGF0YScpIHtcbiAgICAgICAgICAgICAgICBkYXRhQnVmZmVyICs9ICdcXG4nXG4gICAgICAgICAgICAgICAgZGF0YUJ1ZmZlciArPSB2YWx1ZVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkID09PSAnaWQnKSB7XG4gICAgICAgICAgICAgICAgbGFzdEV2ZW50SWRCdWZmZXIgPSB2YWx1ZVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkID09PSAnZXZlbnQnKSB7XG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlQnVmZmVyID0gdmFsdWVcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZCA9PT0gJ3JldHJ5Jykge1xuICAgICAgICAgICAgICAgIGluaXRpYWxSZXRyeSA9IHBhcnNlRHVyYXRpb24odmFsdWUsIGluaXRpYWxSZXRyeSlcbiAgICAgICAgICAgICAgICByZXRyeSA9IGluaXRpYWxSZXRyeVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkID09PSAnaGVhcnRiZWF0VGltZW91dCcpIHtcbiAgICAgICAgICAgICAgICBoZWFydGJlYXRUaW1lb3V0ID0gcGFyc2VEdXJhdGlvbih2YWx1ZSwgaGVhcnRiZWF0VGltZW91dClcbiAgICAgICAgICAgICAgICBpZiAodGltZW91dCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpXG4gICAgICAgICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIG9uVGltZW91dCgpXG4gICAgICAgICAgICAgICAgICB9LCBoZWFydGJlYXRUaW1lb3V0KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlID09PSBGSUVMRF9TVEFSVCkge1xuICAgICAgICAgICAgICBpZiAoZGF0YUJ1ZmZlciAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICBsYXN0RXZlbnRJZCA9IGxhc3RFdmVudElkQnVmZmVyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50VHlwZUJ1ZmZlciA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZUJ1ZmZlciA9ICdtZXNzYWdlJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZXZlbnQgPSBuZXcgTWVzc2FnZUV2ZW50KGV2ZW50VHlwZUJ1ZmZlciwge1xuICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YUJ1ZmZlci5zbGljZSgxKSxcbiAgICAgICAgICAgICAgICAgIGxhc3RFdmVudElkOiBsYXN0RXZlbnRJZEJ1ZmZlcixcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGVzLmRpc3BhdGNoRXZlbnQoZXZlbnQpXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50VHlwZUJ1ZmZlciA9PT0gJ21lc3NhZ2UnKSB7XG4gICAgICAgICAgICAgICAgICBmaXJlKGVzLCBlcy5vbm1lc3NhZ2UsIGV2ZW50KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFN0YXRlID09PSBDTE9TRUQpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBkYXRhQnVmZmVyID0gJydcbiAgICAgICAgICAgICAgZXZlbnRUeXBlQnVmZmVyID0gJydcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlID0gYyA9PT0gJ1xccicuY2hhckNvZGVBdCgwKSA/IEFGVEVSX0NSIDogRklFTERfU1RBUlRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHN0YXRlID09PSBGSUVMRF9TVEFSVCkge1xuICAgICAgICAgICAgICBmaWVsZFN0YXJ0ID0gcG9zaXRpb25cbiAgICAgICAgICAgICAgc3RhdGUgPSBGSUVMRFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlID09PSBGSUVMRCkge1xuICAgICAgICAgICAgICBpZiAoYyA9PT0gJzonLmNoYXJDb2RlQXQoMCkpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZVN0YXJ0ID0gcG9zaXRpb24gKyAxXG4gICAgICAgICAgICAgICAgc3RhdGUgPSBWQUxVRV9TVEFSVFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBWQUxVRV9TVEFSVCkge1xuICAgICAgICAgICAgICBzdGF0ZSA9IFZBTFVFXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIG9uRmluaXNoID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChjdXJyZW50U3RhdGUgPT09IE9QRU4gfHwgY3VycmVudFN0YXRlID09PSBDT05ORUNUSU5HKSB7XG4gICAgICBjdXJyZW50U3RhdGUgPSBXQUlUSU5HXG4gICAgICBpZiAodGltZW91dCAhPT0gMCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dClcbiAgICAgICAgdGltZW91dCA9IDBcbiAgICAgIH1cbiAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgb25UaW1lb3V0KClcbiAgICAgIH0sIHJldHJ5KVxuICAgICAgcmV0cnkgPSBjbGFtcER1cmF0aW9uKE1hdGgubWluKGluaXRpYWxSZXRyeSAqIDE2LCByZXRyeSAqIDIpKVxuXG4gICAgICBlcy5yZWFkeVN0YXRlID0gQ09OTkVDVElOR1xuICAgICAgdmFyIGV2ZW50ID0gbmV3IEV2ZW50KCdlcnJvcicpXG4gICAgICBlcy5kaXNwYXRjaEV2ZW50KGV2ZW50KVxuICAgICAgZmlyZShlcywgZXMub25lcnJvciwgZXZlbnQpXG4gICAgfVxuICB9XG5cbiAgdmFyIGNsb3NlID0gZnVuY3Rpb24gKCkge1xuICAgIGN1cnJlbnRTdGF0ZSA9IENMT1NFRFxuICAgIGlmIChjYW5jZWxGdW5jdGlvbiAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGNhbmNlbEZ1bmN0aW9uKClcbiAgICAgIGNhbmNlbEZ1bmN0aW9uID0gdW5kZWZpbmVkXG4gICAgfVxuICAgIGlmICh0aW1lb3V0ICE9PSAwKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dClcbiAgICAgIHRpbWVvdXQgPSAwXG4gICAgfVxuICAgIGVzLnJlYWR5U3RhdGUgPSBDTE9TRURcbiAgfVxuXG4gIHZhciBvblRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGltZW91dCA9IDBcblxuICAgIGlmIChjdXJyZW50U3RhdGUgIT09IFdBSVRJTkcpIHtcbiAgICAgIGlmICghd2FzQWN0aXZpdHkgJiYgY2FuY2VsRnVuY3Rpb24gIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93RXJyb3IoXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ05vIGFjdGl2aXR5IHdpdGhpbiAnICtcbiAgICAgICAgICAgICAgaGVhcnRiZWF0VGltZW91dCArXG4gICAgICAgICAgICAgICcgbWlsbGlzZWNvbmRzLiBSZWNvbm5lY3RpbmcuJ1xuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICBjYW5jZWxGdW5jdGlvbigpXG4gICAgICAgIGNhbmNlbEZ1bmN0aW9uID0gdW5kZWZpbmVkXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXNBY3Rpdml0eSA9IGZhbHNlXG4gICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBvblRpbWVvdXQoKVxuICAgICAgICB9LCBoZWFydGJlYXRUaW1lb3V0KVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgd2FzQWN0aXZpdHkgPSBmYWxzZVxuICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIG9uVGltZW91dCgpXG4gICAgfSwgaGVhcnRiZWF0VGltZW91dClcblxuICAgIGN1cnJlbnRTdGF0ZSA9IENPTk5FQ1RJTkdcbiAgICBkYXRhQnVmZmVyID0gJydcbiAgICBldmVudFR5cGVCdWZmZXIgPSAnJ1xuICAgIGxhc3RFdmVudElkQnVmZmVyID0gbGFzdEV2ZW50SWRcbiAgICB0ZXh0QnVmZmVyID0gJydcbiAgICBmaWVsZFN0YXJ0ID0gMFxuICAgIHZhbHVlU3RhcnQgPSAwXG4gICAgc3RhdGUgPSBGSUVMRF9TVEFSVFxuXG4gICAgLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDI4OTE2XG4gICAgLy8gUmVxdWVzdCBoZWFkZXIgZmllbGQgTGFzdC1FdmVudC1JRCBpcyBub3QgYWxsb3dlZCBieSBBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzLlxuICAgIHZhciByZXF1ZXN0VVJMID0gdXJsXG4gICAgaWYgKHVybC5zbGljZSgwLCA1KSAhPT0gJ2RhdGE6JyAmJiB1cmwuc2xpY2UoMCwgNSkgIT09ICdibG9iOicpIHtcbiAgICAgIGlmIChsYXN0RXZlbnRJZCAhPT0gJycpIHtcbiAgICAgICAgcmVxdWVzdFVSTCArPVxuICAgICAgICAgICh1cmwuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJykgK1xuICAgICAgICAgICdsYXN0RXZlbnRJZD0nICtcbiAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQobGFzdEV2ZW50SWQpXG4gICAgICB9XG4gICAgfVxuICAgIHZhciByZXF1ZXN0SGVhZGVycyA9IHt9XG4gICAgcmVxdWVzdEhlYWRlcnNbJ0FjY2VwdCddID0gJ3RleHQvZXZlbnQtc3RyZWFtJ1xuICAgIGlmIChoZWFkZXJzICE9IHVuZGVmaW5lZCkge1xuICAgICAgZm9yICh2YXIgbmFtZSBpbiBoZWFkZXJzKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaGVhZGVycywgbmFtZSkpIHtcbiAgICAgICAgICByZXF1ZXN0SGVhZGVyc1tuYW1lXSA9IGhlYWRlcnNbbmFtZV1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgdHJhbnNwb3J0Lm9wZW4oXG4gICAgICAgIHhocixcbiAgICAgICAgb25TdGFydCxcbiAgICAgICAgb25Qcm9ncmVzcyxcbiAgICAgICAgb25GaW5pc2gsXG4gICAgICAgIHJlcXVlc3RVUkwsXG4gICAgICAgIHdpdGhDcmVkZW50aWFscyxcbiAgICAgICAgcmVxdWVzdEhlYWRlcnNcbiAgICAgIClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY2xvc2UoKVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICBlcy51cmwgPSB1cmxcbiAgZXMucmVhZHlTdGF0ZSA9IENPTk5FQ1RJTkdcbiAgZXMud2l0aENyZWRlbnRpYWxzID0gd2l0aENyZWRlbnRpYWxzXG4gIGVzLl9jbG9zZSA9IGNsb3NlXG5cbiAgb25UaW1lb3V0KClcbn1cblxuRXZlbnRTb3VyY2VQb2x5ZmlsbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEV2ZW50VGFyZ2V0LnByb3RvdHlwZSlcbkV2ZW50U291cmNlUG9seWZpbGwucHJvdG90eXBlLkNPTk5FQ1RJTkcgPSBDT05ORUNUSU5HXG5FdmVudFNvdXJjZVBvbHlmaWxsLnByb3RvdHlwZS5PUEVOID0gT1BFTlxuRXZlbnRTb3VyY2VQb2x5ZmlsbC5wcm90b3R5cGUuQ0xPU0VEID0gQ0xPU0VEXG5FdmVudFNvdXJjZVBvbHlmaWxsLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5fY2xvc2UoKVxufVxuXG5FdmVudFNvdXJjZVBvbHlmaWxsLkNPTk5FQ1RJTkcgPSBDT05ORUNUSU5HXG5FdmVudFNvdXJjZVBvbHlmaWxsLk9QRU4gPSBPUEVOXG5FdmVudFNvdXJjZVBvbHlmaWxsLkNMT1NFRCA9IENMT1NFRFxuRXZlbnRTb3VyY2VQb2x5ZmlsbC5wcm90b3R5cGUud2l0aENyZWRlbnRpYWxzID0gdW5kZWZpbmVkXG5cbmV4cG9ydCBkZWZhdWx0IEV2ZW50U291cmNlUG9seWZpbGxcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/next/dist/client/dev/event-source-polyfill.js\n"); - -/***/ }), - -/***/ "./node_modules/next/dist/client/dev/fouc.js": -/*!***************************************************!*\ - !*** ./node_modules/next/dist/client/dev/fouc.js ***! - \***************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nexports.__esModule = true;\nexports.displayContent = displayContent; // This function is used to remove Next.js' no-FOUC styles workaround for using\n// `style-loader` in development. It must be called before hydration, or else\n// rendering won't have the correct computed values in effects.\n\nfunction displayContent(callback) {\n ;\n (window.requestAnimationFrame || setTimeout)(function () {\n for (var x = document.querySelectorAll('[data-next-hide-fouc]'), i = x.length; i--;) {\n x[i].parentNode.removeChild(x[i]);\n }\n\n if (callback) {\n callback();\n }\n });\n}\n\n;\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n var currentExports = module.__proto__.exports;\n var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports on update so we can compare the boundary\n // signatures.\n module.hot.dispose(function (data) {\n data.prevExports = currentExports;\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevExports !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevExports !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ \"./node_modules/next/dist/compiled/webpack/module.js\")(module)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4uLy4uLy4uL2NsaWVudC9kZXYvZm91Yy5qcz85MzdhIl0sIm5hbWVzIjpbIndpbmRvdyIsIngiLCJkb2N1bWVudCIsImkiLCJjYWxsYmFjayJdLCJtYXBwaW5ncyI6Ijs7O3lDQUFBO0FBQ0E7QUFDQTs7QUFDTyxrQ0FBa0M7QUFDdkM7QUFBQyxHQUFDQSxNQUFNLENBQU5BLHlCQUFELFlBQTZDLFlBQVk7QUFDeEQsU0FDRSxJQUFJQyxDQUFDLEdBQUdDLFFBQVEsQ0FBUkEsaUJBQVIsdUJBQVFBLENBQVIsRUFBNERDLENBQUMsR0FBR0YsQ0FBQyxDQURuRSxRQUVFRSxDQUZGLEtBSUU7QUFDQUYsT0FBQyxDQUFEQSxDQUFDLENBQURBLHdCQUE0QkEsQ0FBQyxDQUE3QkEsQ0FBNkIsQ0FBN0JBO0FBRUY7O0FBQUEsa0JBQWM7QUFDWkcsY0FBUTtBQUVYO0FBWEE7QUFZRiIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvY2xpZW50L2Rldi9mb3VjLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlbW92ZSBOZXh0LmpzJyBuby1GT1VDIHN0eWxlcyB3b3JrYXJvdW5kIGZvciB1c2luZ1xuLy8gYHN0eWxlLWxvYWRlcmAgaW4gZGV2ZWxvcG1lbnQuIEl0IG11c3QgYmUgY2FsbGVkIGJlZm9yZSBoeWRyYXRpb24sIG9yIGVsc2Vcbi8vIHJlbmRlcmluZyB3b24ndCBoYXZlIHRoZSBjb3JyZWN0IGNvbXB1dGVkIHZhbHVlcyBpbiBlZmZlY3RzLlxuZXhwb3J0IGZ1bmN0aW9uIGRpc3BsYXlDb250ZW50KGNhbGxiYWNrKSB7XG4gIDsod2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCBzZXRUaW1lb3V0KShmdW5jdGlvbiAoKSB7XG4gICAgZm9yIChcbiAgICAgIHZhciB4ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtbmV4dC1oaWRlLWZvdWNdJyksIGkgPSB4Lmxlbmd0aDtcbiAgICAgIGktLTtcblxuICAgICkge1xuICAgICAgeFtpXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHhbaV0pXG4gICAgfVxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2soKVxuICAgIH1cbiAgfSlcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/next/dist/client/dev/fouc.js\n"); - -/***/ }), - -/***/ "./node_modules/next/dist/client/dev/on-demand-entries-utils.js": -/*!**********************************************************************!*\ - !*** ./node_modules/next/dist/client/dev/on-demand-entries-utils.js ***! - \**********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nexports.__esModule = true;\nexports.closePing = closePing;\nexports.setupPing = setupPing;\nexports.currentPage = void 0;\n\nvar _eventsource = __webpack_require__(/*! ./error-overlay/eventsource */ \"./node_modules/next/dist/client/dev/error-overlay/eventsource.js\");\n/* global location */\n\n\nvar evtSource;\nvar currentPage;\nexports.currentPage = currentPage;\n\nfunction closePing() {\n if (evtSource) evtSource.close();\n evtSource = null;\n}\n\nfunction setupPing(assetPrefix, pathnameFn, retry) {\n var pathname = pathnameFn(); // Make sure to only create new EventSource request if page has changed\n\n if (pathname === currentPage && !retry) return;\n exports.currentPage = currentPage = pathname; // close current EventSource connection\n\n closePing();\n evtSource = (0, _eventsource.getEventSourceWrapper)({\n path: \"\".concat(assetPrefix, \"/_next/webpack-hmr?page=\").concat(currentPage),\n timeout: 5000\n });\n evtSource.addMessageListener(function (event) {\n if (event.data.indexOf('{') === -1) return;\n\n try {\n var payload = JSON.parse(event.data);\n\n if (payload.invalid) {\n // Payload can be invalid even if the page does not exist.\n // So, we need to make sure it exists before reloading.\n fetch(location.href, {\n credentials: 'same-origin'\n }).then(function (pageRes) {\n if (pageRes.status === 200) {\n location.reload();\n }\n });\n }\n } catch (err) {\n console.error('on-demand-entries failed to parse response', err);\n }\n });\n}\n\n;\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n var currentExports = module.__proto__.exports;\n var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports on update so we can compare the boundary\n // signatures.\n module.hot.dispose(function (data) {\n data.prevExports = currentExports;\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevExports !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevExports !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ \"./node_modules/next/dist/compiled/webpack/module.js\")(module)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4uLy4uLy4uL2NsaWVudC9kZXYvb24tZGVtYW5kLWVudHJpZXMtdXRpbHMuanM/OWZhZSJdLCJuYW1lcyI6WyJldnRTb3VyY2UiLCJwYXRobmFtZSIsInBhdGhuYW1lRm4iLCJjbG9zZVBpbmciLCJwYXRoIiwiYXNzZXRQcmVmaXgiLCJ0aW1lb3V0IiwiZXZlbnQiLCJwYXlsb2FkIiwiSlNPTiIsImZldGNoIiwibG9jYXRpb24iLCJjcmVkZW50aWFscyIsInBhZ2VSZXMiLCJjb25zb2xlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQ0E7QUFEQTs7O0FBR0E7QUFDTzs7O0FBRUEscUJBQXFCO0FBQzFCLGlCQUFlQSxTQUFTLENBQVRBO0FBQ2ZBLFdBQVMsR0FBVEE7QUFHSzs7QUFBQSxtREFBbUQ7QUFDeEQsTUFBTUMsUUFBUSxHQUFHQyxVQUFqQixHQUR3RCxDQUd4RDs7QUFDQSxNQUFJRCxRQUFRLEtBQVJBLGVBQTRCLENBQWhDLE9BQXdDO0FBQ3hDLG1DQUFXLEdBQVgsU0FMd0QsQ0FNeEQ7O0FBQ0FFLFdBQVM7QUFFVEgsV0FBUyxHQUFHLHdDQUFzQjtBQUNoQ0ksUUFBSSxZQUFLQyxXQUFMLHFDQUQ0QixXQUM1QixDQUQ0QjtBQUVoQ0MsV0FBTyxFQUZUTjtBQUFrQyxHQUF0QixDQUFaQTtBQUtBQSxXQUFTLENBQVRBLG1CQUE4Qk8sZUFBRCxFQUFXO0FBQ3RDLFFBQUlBLEtBQUssQ0FBTEEsc0JBQTRCLENBQWhDLEdBQW9DOztBQUNwQyxRQUFJO0FBQ0YsVUFBTUMsT0FBTyxHQUFHQyxJQUFJLENBQUpBLE1BQVdGLEtBQUssQ0FBaEMsSUFBZ0JFLENBQWhCOztBQUNBLFVBQUlELE9BQU8sQ0FBWCxTQUFxQjtBQUNuQjtBQUNBO0FBQ0FFLGFBQUssQ0FBQ0MsUUFBUSxDQUFULE1BQWdCO0FBQ25CQyxxQkFBVyxFQURiRjtBQUFxQixTQUFoQixDQUFMQSxNQUVTRyxpQkFBRCxFQUFhO0FBQ25CLGNBQUlBLE9BQU8sQ0FBUEEsV0FBSixLQUE0QjtBQUMxQkYsb0JBQVEsQ0FBUkE7QUFFSDtBQU5ERDtBQVFIO0FBQUMsS0FiRixDQWFFLFlBQVk7QUFDWkksYUFBTyxDQUFQQTtBQUVIO0FBbEJEZDtBQW1CRCIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvY2xpZW50L2Rldi9vbi1kZW1hbmQtZW50cmllcy11dGlscy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGdsb2JhbCBsb2NhdGlvbiAqL1xuaW1wb3J0IHsgZ2V0RXZlbnRTb3VyY2VXcmFwcGVyIH0gZnJvbSAnLi9lcnJvci1vdmVybGF5L2V2ZW50c291cmNlJ1xuXG5sZXQgZXZ0U291cmNlXG5leHBvcnQgbGV0IGN1cnJlbnRQYWdlXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9zZVBpbmcoKSB7XG4gIGlmIChldnRTb3VyY2UpIGV2dFNvdXJjZS5jbG9zZSgpXG4gIGV2dFNvdXJjZSA9IG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwUGluZyhhc3NldFByZWZpeCwgcGF0aG5hbWVGbiwgcmV0cnkpIHtcbiAgY29uc3QgcGF0aG5hbWUgPSBwYXRobmFtZUZuKClcblxuICAvLyBNYWtlIHN1cmUgdG8gb25seSBjcmVhdGUgbmV3IEV2ZW50U291cmNlIHJlcXVlc3QgaWYgcGFnZSBoYXMgY2hhbmdlZFxuICBpZiAocGF0aG5hbWUgPT09IGN1cnJlbnRQYWdlICYmICFyZXRyeSkgcmV0dXJuXG4gIGN1cnJlbnRQYWdlID0gcGF0aG5hbWVcbiAgLy8gY2xvc2UgY3VycmVudCBFdmVudFNvdXJjZSBjb25uZWN0aW9uXG4gIGNsb3NlUGluZygpXG5cbiAgZXZ0U291cmNlID0gZ2V0RXZlbnRTb3VyY2VXcmFwcGVyKHtcbiAgICBwYXRoOiBgJHthc3NldFByZWZpeH0vX25leHQvd2VicGFjay1obXI/cGFnZT0ke2N1cnJlbnRQYWdlfWAsXG4gICAgdGltZW91dDogNTAwMCxcbiAgfSlcblxuICBldnRTb3VyY2UuYWRkTWVzc2FnZUxpc3RlbmVyKChldmVudCkgPT4ge1xuICAgIGlmIChldmVudC5kYXRhLmluZGV4T2YoJ3snKSA9PT0gLTEpIHJldHVyblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0gSlNPTi5wYXJzZShldmVudC5kYXRhKVxuICAgICAgaWYgKHBheWxvYWQuaW52YWxpZCkge1xuICAgICAgICAvLyBQYXlsb2FkIGNhbiBiZSBpbnZhbGlkIGV2ZW4gaWYgdGhlIHBhZ2UgZG9lcyBub3QgZXhpc3QuXG4gICAgICAgIC8vIFNvLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBpdCBleGlzdHMgYmVmb3JlIHJlbG9hZGluZy5cbiAgICAgICAgZmV0Y2gobG9jYXRpb24uaHJlZiwge1xuICAgICAgICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nLFxuICAgICAgICB9KS50aGVuKChwYWdlUmVzKSA9PiB7XG4gICAgICAgICAgaWYgKHBhZ2VSZXMuc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignb24tZGVtYW5kLWVudHJpZXMgZmFpbGVkIHRvIHBhcnNlIHJlc3BvbnNlJywgZXJyKVxuICAgIH1cbiAgfSlcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/next/dist/client/dev/on-demand-entries-utils.js\n"); - -/***/ }), - -/***/ "./node_modules/next/dist/compiled/webpack/module.js": -/*!***********************************!*\ - !*** (webpack)/webpack/module.js ***! - \***********************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -eval("/* WEBPACK VAR INJECTION */(function(__dirname) {module.exports =\n/******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 880:\n/***/ (function(module) {\n\nmodule.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __nccwpck_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\tvar threw = true;\n/******/ \t\ttry {\n/******/ \t\t\t__webpack_modules__[moduleId](module, module.exports, __nccwpck_require__);\n/******/ \t\t\tthrew = false;\n/******/ \t\t} finally {\n/******/ \t\t\tif(threw) delete __webpack_module_cache__[moduleId];\n/******/ \t\t}\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat */\n/******/ \t\n/******/ \t__nccwpck_require__.ab = __dirname + \"/\";/************************************************************************/\n/******/ \t// module exports must be returned from runtime so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \treturn __nccwpck_require__(880);\n/******/ })()\n;\n/* WEBPACK VAR INJECTION */}.call(this, \"/\"))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLyh3ZWJwYWNrKS93ZWJwYWNrL21vZHVsZS5qcz8zZTczIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0Esc0JBQXNCO0FBQ3RCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPOztBQUVQLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixDIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL25leHQvZGlzdC9jb21waWxlZC93ZWJwYWNrL21vZHVsZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID1cbi8qKioqKiovIChmdW5jdGlvbigpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX21vZHVsZXNfXyA9ICh7XG5cbi8qKiovIDg4MDpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihtb2R1bGUpIHtcblx0aWYgKCFtb2R1bGUud2VicGFja1BvbHlmaWxsKSB7XG5cdFx0bW9kdWxlLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKCkge307XG5cdFx0bW9kdWxlLnBhdGhzID0gW107XG5cdFx0Ly8gbW9kdWxlLnBhcmVudCA9IHVuZGVmaW5lZCBieSBkZWZhdWx0XG5cdFx0aWYgKCFtb2R1bGUuY2hpbGRyZW4pIG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwibG9hZGVkXCIsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmw7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJpZFwiLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdG1vZHVsZS53ZWJwYWNrUG9seWZpbGwgPSAxO1xuXHR9XG5cdHJldHVybiBtb2R1bGU7XG59O1xuXG5cbi8qKiovIH0pXG5cbi8qKioqKiovIFx0fSk7XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fbmNjd3Bja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdKSB7XG4vKioqKioqLyBcdFx0XHRyZXR1cm4gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuLyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0dmFyIHRocmV3ID0gdHJ1ZTtcbi8qKioqKiovIFx0XHR0cnkge1xuLyoqKioqKi8gXHRcdFx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX19uY2N3cGNrX3JlcXVpcmVfXyk7XG4vKioqKioqLyBcdFx0XHR0aHJldyA9IGZhbHNlO1xuLyoqKioqKi8gXHRcdH0gZmluYWxseSB7XG4vKioqKioqLyBcdFx0XHRpZih0aHJldykgZGVsZXRlIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi8gXHRcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyBcdC8qIHdlYnBhY2svcnVudGltZS9jb21wYXQgKi9cbi8qKioqKiovIFx0XG4vKioqKioqLyBcdF9fbmNjd3Bja19yZXF1aXJlX18uYWIgPSBfX2Rpcm5hbWUgKyBcIi9cIjsvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gXHQvLyBtb2R1bGUgZXhwb3J0cyBtdXN0IGJlIHJldHVybmVkIGZyb20gcnVudGltZSBzbyBlbnRyeSBpbmxpbmluZyBpcyBkaXNhYmxlZFxuLyoqKioqKi8gXHQvLyBzdGFydHVwXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX19uY2N3cGNrX3JlcXVpcmVfXyg4ODApO1xuLyoqKioqKi8gfSkoKVxuOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/next/dist/compiled/webpack/module.js\n"); - -/***/ }), - -/***/ "./node_modules/next/node_modules/@babel/runtime/helpers/asyncToGenerator.js": -/*!***********************************************************************************!*\ - !*** ./node_modules/next/node_modules/@babel/runtime/helpers/asyncToGenerator.js ***! - \***********************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -eval("function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\n\nfunction _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\n}\n\nmodule.exports = _asyncToGenerator;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL25leHQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvci5qcz9hOTU0Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL25leHQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvci5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHtcbiAgdHJ5IHtcbiAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7XG4gICAgdmFyIHZhbHVlID0gaW5mby52YWx1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZWplY3QoZXJyb3IpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChpbmZvLmRvbmUpIHtcbiAgICByZXNvbHZlKHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcblxuICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHtcbiAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcIm5leHRcIiwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBfdGhyb3coZXJyKSB7XG4gICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJ0aHJvd1wiLCBlcnIpO1xuICAgICAgfVxuXG4gICAgICBfbmV4dCh1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hc3luY1RvR2VuZXJhdG9yOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/next/node_modules/@babel/runtime/helpers/asyncToGenerator.js\n"); - -/***/ }), - -/***/ "./node_modules/next/node_modules/@babel/runtime/helpers/interopRequireDefault.js": -/*!****************************************************************************************!*\ - !*** ./node_modules/next/node_modules/@babel/runtime/helpers/interopRequireDefault.js ***! - \****************************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -eval("function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n \"default\": obj\n };\n}\n\nmodule.exports = _interopRequireDefault;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL25leHQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0LmpzPzAyYmEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9uZXh0L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7XG4gIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7XG4gICAgXCJkZWZhdWx0XCI6IG9ialxuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQ7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/next/node_modules/@babel/runtime/helpers/interopRequireDefault.js\n"); - -/***/ }), - -/***/ "./node_modules/next/node_modules/@babel/runtime/regenerator/index.js": -/*!****************************************************************************!*\ - !*** ./node_modules/next/node_modules/@babel/runtime/regenerator/index.js ***! - \****************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("module.exports = __webpack_require__(/*! regenerator-runtime */ \"./node_modules/regenerator-runtime/runtime.js\");\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL25leHQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yL2luZGV4LmpzP2JjOTIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUJBQWlCLG1CQUFPLENBQUMsMEVBQXFCIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL25leHQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yL2luZGV4LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVnZW5lcmF0b3ItcnVudGltZVwiKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/next/node_modules/@babel/runtime/regenerator/index.js\n"); - -/***/ }), - -/***/ "./node_modules/regenerator-runtime/runtime.js": -/*!*****************************************************!*\ - !*** ./node_modules/regenerator-runtime/runtime.js ***! - \*****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; };\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n function define(obj, key, value) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n return obj[key];\n }\n try {\n // IE 8 has a broken Object.defineProperty that only works on DOM objects.\n define({}, \"\");\n } catch (err) {\n define = function(obj, key, value) {\n return obj[key] = value;\n };\n }\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n defineProperty(generator, \"_invoke\", { value: makeInvokeMethod(innerFn, self, context) });\n\n return generator;\n }\n exports.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n define(IteratorPrototype, iteratorSymbol, function () {\n return this;\n });\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = GeneratorFunctionPrototype;\n defineProperty(Gp, \"constructor\", { value: GeneratorFunctionPrototype, configurable: true });\n defineProperty(\n GeneratorFunctionPrototype,\n \"constructor\",\n { value: GeneratorFunction, configurable: true }\n );\n GeneratorFunction.displayName = define(\n GeneratorFunctionPrototype,\n toStringTagSymbol,\n \"GeneratorFunction\"\n );\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n define(prototype, method, function(arg) {\n return this._invoke(method, arg);\n });\n });\n }\n\n exports.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n exports.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n define(genFun, toStringTagSymbol, \"GeneratorFunction\");\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n exports.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return PromiseImpl.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return PromiseImpl.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n defineProperty(this, \"_invoke\", { value: enqueue });\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n define(AsyncIterator.prototype, asyncIteratorSymbol, function () {\n return this;\n });\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList),\n PromiseImpl\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var methodName = context.method;\n var method = delegate.iterator[methodName];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method, or a missing .next mehtod, always terminate the\n // yield* loop.\n context.delegate = null;\n\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (methodName === \"throw\" && delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n if (methodName !== \"return\") {\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a '\" + methodName + \"' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n define(Gp, toStringTagSymbol, \"Generator\");\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n define(Gp, iteratorSymbol, function() {\n return this;\n });\n\n define(Gp, \"toString\", function() {\n return \"[object Generator]\";\n });\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(val) {\n var object = Object(val);\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n true ? module.exports : undefined\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, in modern engines\n // we can explicitly access globalThis. In older engines we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n if (typeof globalThis === \"object\") {\n globalThis.regeneratorRuntime = runtime;\n } else {\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qcz85NmNmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwyRUFBMkUsdUJBQXVCO0FBQ2xHLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDBDQUEwQyxrREFBa0Q7O0FBRTVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2QsS0FBSztBQUNMLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlEO0FBQ3pEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsd0RBQXdEO0FBQzdGO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBLHdDQUF3QyxXQUFXO0FBQ25EO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQ0FBcUMsaUJBQWlCO0FBQ3REOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsU0FBUztBQUNUO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQ0FBb0MsY0FBYztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQ0FBaUMsa0JBQWtCO0FBQ25EO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsaUJBQWlCOztBQUVqQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsaUJBQWlCO0FBQ3pDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDhDQUE4QyxRQUFRO0FBQ3REO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUEsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLDhDQUE4QyxRQUFRO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0EsOENBQThDLFFBQVE7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsOENBQThDLFFBQVE7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLEtBQTBCLG9CQUFvQixTQUFFO0FBQ2xEOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbnZhciBydW50aW1lID0gKGZ1bmN0aW9uIChleHBvcnRzKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIHZhciBPcCA9IE9iamVjdC5wcm90b3R5cGU7XG4gIHZhciBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5IHx8IGZ1bmN0aW9uIChvYmosIGtleSwgZGVzYykgeyBvYmpba2V5XSA9IGRlc2MudmFsdWU7IH07XG4gIHZhciB1bmRlZmluZWQ7IC8vIE1vcmUgY29tcHJlc3NpYmxlIHRoYW4gdm9pZCAwLlxuICB2YXIgJFN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiA/IFN5bWJvbCA6IHt9O1xuICB2YXIgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8IFwiQEBpdGVyYXRvclwiO1xuICB2YXIgYXN5bmNJdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCBcIkBAYXN5bmNJdGVyYXRvclwiO1xuICB2YXIgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiO1xuXG4gIGZ1bmN0aW9uIGRlZmluZShvYmosIGtleSwgdmFsdWUpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBvYmpba2V5XTtcbiAgfVxuICB0cnkge1xuICAgIC8vIElFIDggaGFzIGEgYnJva2VuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB0aGF0IG9ubHkgd29ya3Mgb24gRE9NIG9iamVjdHMuXG4gICAgZGVmaW5lKHt9LCBcIlwiKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZGVmaW5lID0gZnVuY3Rpb24ob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgICByZXR1cm4gb2JqW2tleV0gPSB2YWx1ZTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIC8vIElmIG91dGVyRm4gcHJvdmlkZWQgYW5kIG91dGVyRm4ucHJvdG90eXBlIGlzIGEgR2VuZXJhdG9yLCB0aGVuIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yLlxuICAgIHZhciBwcm90b0dlbmVyYXRvciA9IG91dGVyRm4gJiYgb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBvdXRlckZuIDogR2VuZXJhdG9yO1xuICAgIHZhciBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSk7XG4gICAgdmFyIGNvbnRleHQgPSBuZXcgQ29udGV4dCh0cnlMb2NzTGlzdCB8fCBbXSk7XG5cbiAgICAvLyBUaGUgLl9pbnZva2UgbWV0aG9kIHVuaWZpZXMgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzLlxuICAgIGRlZmluZVByb3BlcnR5KGdlbmVyYXRvciwgXCJfaW52b2tlXCIsIHsgdmFsdWU6IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkgfSk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9XG4gIGV4cG9ydHMud3JhcCA9IHdyYXA7XG5cbiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uXG4gIC8vIHJlY29yZCBsaWtlIGNvbnRleHQudHJ5RW50cmllc1tpXS5jb21wbGV0aW9uLiBUaGlzIGludGVyZmFjZSBjb3VsZFxuICAvLyBoYXZlIGJlZW4gKGFuZCB3YXMgcHJldmlvdXNseSkgZGVzaWduZWQgdG8gdGFrZSBhIGNsb3N1cmUgdG8gYmVcbiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbWV0aG9kIHdlIHdhbnQgdG8gY2FsbCwgc28gdGhlcmUncyBubyBuZWVkXG4gIC8vIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBvYmplY3QuIFdlIGNhbiBldmVuIGdldCBhd2F5IHdpdGggYXNzdW1pbmdcbiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWVcbiAgLy8gaW4gZXZlcnkgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB0b3VjaCB0aGUgYXJndW1lbnRzIG9iamVjdC4gVGhlXG4gIC8vIG9ubHkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHJlcXVpcmVkIGlzIHRoZSBjb21wbGV0aW9uIHJlY29yZCwgd2hpY2hcbiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLlxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJub3JtYWxcIiwgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKSB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0aHJvd1wiLCBhcmc6IGVyciB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0ID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9IFwic3VzcGVuZGVkWWllbGRcIjtcbiAgdmFyIEdlblN0YXRlRXhlY3V0aW5nID0gXCJleGVjdXRpbmdcIjtcbiAgdmFyIEdlblN0YXRlQ29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcblxuICAvLyBSZXR1cm5pbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgaW5uZXJGbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzXG4gIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC5cbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcblxuICAvLyBEdW1teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmRcbiAgLy8gLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gR2VuZXJhdG9yXG4gIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyXG4gIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fVxuXG4gIC8vIFRoaXMgaXMgYSBwb2x5ZmlsbCBmb3IgJUl0ZXJhdG9yUHJvdG90eXBlJSBmb3IgZW52aXJvbm1lbnRzIHRoYXRcbiAgLy8gZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBpdC5cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIGRlZmluZShJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSk7XG5cbiAgdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuICB2YXIgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90byAmJiBnZXRQcm90byhnZXRQcm90byh2YWx1ZXMoW10pKSk7XG4gIGlmIChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAmJlxuICAgICAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgIT09IE9wICYmXG4gICAgICBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpKSB7XG4gICAgLy8gVGhpcyBlbnZpcm9ubWVudCBoYXMgYSBuYXRpdmUgJUl0ZXJhdG9yUHJvdG90eXBlJTsgdXNlIGl0IGluc3RlYWRcbiAgICAvLyBvZiB0aGUgcG9seWZpbGwuXG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBOYXRpdmVJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxuXG4gIHZhciBHcCA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZSA9XG4gICAgR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgZGVmaW5lUHJvcGVydHkoR3AsIFwiY29uc3RydWN0b3JcIiwgeyB2YWx1ZTogR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTtcbiAgZGVmaW5lUHJvcGVydHkoXG4gICAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsXG4gICAgXCJjb25zdHJ1Y3RvclwiLFxuICAgIHsgdmFsdWU6IEdlbmVyYXRvckZ1bmN0aW9uLCBjb25maWd1cmFibGU6IHRydWUgfVxuICApO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IGRlZmluZShcbiAgICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSxcbiAgICB0b1N0cmluZ1RhZ1N5bWJvbCxcbiAgICBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgKTtcblxuICAvLyBIZWxwZXIgZm9yIGRlZmluaW5nIHRoZSAubmV4dCwgLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzIG9mIHRoZVxuICAvLyBJdGVyYXRvciBpbnRlcmZhY2UgaW4gdGVybXMgb2YgYSBzaW5nbGUgLl9pbnZva2UgbWV0aG9kLlxuICBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7XG4gICAgW1wibmV4dFwiLCBcInRocm93XCIsIFwicmV0dXJuXCJdLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICBkZWZpbmUocHJvdG90eXBlLCBtZXRob2QsIGZ1bmN0aW9uKGFyZykge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgdmFyIGN0b3IgPSB0eXBlb2YgZ2VuRnVuID09PSBcImZ1bmN0aW9uXCIgJiYgZ2VuRnVuLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBjdG9yXG4gICAgICA/IGN0b3IgPT09IEdlbmVyYXRvckZ1bmN0aW9uIHx8XG4gICAgICAgIC8vIEZvciB0aGUgbmF0aXZlIEdlbmVyYXRvckZ1bmN0aW9uIGNvbnN0cnVjdG9yLCB0aGUgYmVzdCB3ZSBjYW5cbiAgICAgICAgLy8gZG8gaXMgdG8gY2hlY2sgaXRzIC5uYW1lIHByb3BlcnR5LlxuICAgICAgICAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpID09PSBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgICAgIDogZmFsc2U7XG4gIH07XG5cbiAgZXhwb3J0cy5tYXJrID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gICAgICBkZWZpbmUoZ2VuRnVuLCB0b1N0cmluZ1RhZ1N5bWJvbCwgXCJHZW5lcmF0b3JGdW5jdGlvblwiKTtcbiAgICB9XG4gICAgZ2VuRnVuLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoR3ApO1xuICAgIHJldHVybiBnZW5GdW47XG4gIH07XG5cbiAgLy8gV2l0aGluIHRoZSBib2R5IG9mIGFueSBhc3luYyBmdW5jdGlvbiwgYGF3YWl0IHhgIGlzIHRyYW5zZm9ybWVkIHRvXG4gIC8vIGB5aWVsZCByZWdlbmVyYXRvclJ1bnRpbWUuYXdyYXAoeClgLCBzbyB0aGF0IHRoZSBydW50aW1lIGNhbiB0ZXN0XG4gIC8vIGBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpYCB0byBkZXRlcm1pbmUgaWYgdGhlIHlpZWxkZWQgdmFsdWUgaXNcbiAgLy8gbWVhbnQgdG8gYmUgYXdhaXRlZC5cbiAgZXhwb3J0cy5hd3JhcCA9IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB7IF9fYXdhaXQ6IGFyZyB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IoZ2VuZXJhdG9yLCBQcm9taXNlSW1wbCkge1xuICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goZ2VuZXJhdG9yW21ldGhvZF0sIGdlbmVyYXRvciwgYXJnKTtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHJlamVjdChyZWNvcmQuYXJnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWNvcmQuYXJnO1xuICAgICAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZSAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgaW52b2tlKFwibmV4dFwiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgIGludm9rZShcInRocm93XCIsIGVyciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uKHVud3JhcHBlZCkge1xuICAgICAgICAgIC8vIFdoZW4gYSB5aWVsZGVkIFByb21pc2UgaXMgcmVzb2x2ZWQsIGl0cyBmaW5hbCB2YWx1ZSBiZWNvbWVzXG4gICAgICAgICAgLy8gdGhlIC52YWx1ZSBvZiB0aGUgUHJvbWlzZTx7dmFsdWUsZG9uZX0+IHJlc3VsdCBmb3IgdGhlXG4gICAgICAgICAgLy8gY3VycmVudCBpdGVyYXRpb24uXG4gICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkO1xuICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSwgZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAvLyBJZiBhIHJlamVjdGVkIFByb21pc2Ugd2FzIHlpZWxkZWQsIHRocm93IHRoZSByZWplY3Rpb24gYmFja1xuICAgICAgICAgIC8vIGludG8gdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBzbyBpdCBjYW4gYmUgaGFuZGxlZCB0aGVyZS5cbiAgICAgICAgICByZXR1cm4gaW52b2tlKFwidGhyb3dcIiwgZXJyb3IsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwcmV2aW91c1Byb21pc2U7XG5cbiAgICBmdW5jdGlvbiBlbnF1ZXVlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlSW1wbChmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID1cbiAgICAgICAgLy8gSWYgZW5xdWV1ZSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gd2FpdCB1bnRpbFxuICAgICAgICAvLyBhbGwgcHJldmlvdXMgUHJvbWlzZXMgaGF2ZSBiZWVuIHJlc29sdmVkIGJlZm9yZSBjYWxsaW5nIGludm9rZSxcbiAgICAgICAgLy8gc28gdGhhdCByZXN1bHRzIGFyZSBhbHdheXMgZGVsaXZlcmVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBJZlxuICAgICAgICAvLyBlbnF1ZXVlIGhhcyBub3QgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIGl0IGlzIGltcG9ydGFudCB0b1xuICAgICAgICAvLyBjYWxsIGludm9rZSBpbW1lZGlhdGVseSwgd2l0aG91dCB3YWl0aW5nIG9uIGEgY2FsbGJhY2sgdG8gZmlyZSxcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhcyB0aGUgb3Bwb3J0dW5pdHkgdG8gZG9cbiAgICAgICAgLy8gYW55IG5lY2Vzc2FyeSBzZXR1cCBpbiBhIHByZWRpY3RhYmxlIHdheS4gVGhpcyBwcmVkaWN0YWJpbGl0eVxuICAgICAgICAvLyBpcyB3aHkgdGhlIFByb21pc2UgY29uc3RydWN0b3Igc3luY2hyb25vdXNseSBpbnZva2VzIGl0c1xuICAgICAgICAvLyBleGVjdXRvciBjYWxsYmFjaywgYW5kIHdoeSBhc3luYyBmdW5jdGlvbnMgc3luY2hyb25vdXNseVxuICAgICAgICAvLyBleGVjdXRlIGNvZGUgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdC4gU2luY2Ugd2UgaW1wbGVtZW50IHNpbXBsZVxuICAgICAgICAvLyBhc3luYyBmdW5jdGlvbnMgaW4gdGVybXMgb2YgYXN5bmMgZ2VuZXJhdG9ycywgaXQgaXMgZXNwZWNpYWxseVxuICAgICAgICAvLyBpbXBvcnRhbnQgdG8gZ2V0IHRoaXMgcmlnaHQsIGV2ZW4gdGhvdWdoIGl0IHJlcXVpcmVzIGNhcmUuXG4gICAgICAgIHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKFxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLFxuICAgICAgICAgIC8vIEF2b2lkIHByb3BhZ2F0aW5nIGZhaWx1cmVzIHRvIFByb21pc2VzIHJldHVybmVkIGJ5IGxhdGVyXG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgb2YgdGhlIGl0ZXJhdG9yLlxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnXG4gICAgICAgICkgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpO1xuICAgIH1cblxuICAgIC8vIERlZmluZSB0aGUgdW5pZmllZCBoZWxwZXIgbWV0aG9kIHRoYXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiAoc2VlIGRlZmluZUl0ZXJhdG9yTWV0aG9kcykuXG4gICAgZGVmaW5lUHJvcGVydHkodGhpcywgXCJfaW52b2tlXCIsIHsgdmFsdWU6IGVucXVldWUgfSk7XG4gIH1cblxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpO1xuICBkZWZpbmUoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUsIGFzeW5jSXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSk7XG4gIGV4cG9ydHMuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3I7XG5cbiAgLy8gTm90ZSB0aGF0IHNpbXBsZSBhc3luYyBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZlxuICAvLyBBc3luY0l0ZXJhdG9yIG9iamVjdHM7IHRoZXkganVzdCByZXR1cm4gYSBQcm9taXNlIGZvciB0aGUgdmFsdWUgb2ZcbiAgLy8gdGhlIGZpbmFsIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgaXRlcmF0b3IuXG4gIGV4cG9ydHMuYXN5bmMgPSBmdW5jdGlvbihpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCwgUHJvbWlzZUltcGwpIHtcbiAgICBpZiAoUHJvbWlzZUltcGwgPT09IHZvaWQgMCkgUHJvbWlzZUltcGwgPSBQcm9taXNlO1xuXG4gICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcihcbiAgICAgIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpLFxuICAgICAgUHJvbWlzZUltcGxcbiAgICApO1xuXG4gICAgcmV0dXJuIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKVxuICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUNvbXBsZXRlZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lXG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kO1xuICAgICAgY29udGV4dC5hcmcgPSBhcmc7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgICAgdGhyb3cgY29udGV4dC5hcmc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7XG5cbiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09XG4gICAgICAgICAgLy8gR2VuU3RhdGVFeGVjdXRpbmcgYW5kIGxvb3AgYmFjayBmb3IgYW5vdGhlciBpbnZvY2F0aW9uLlxuICAgICAgICAgIHN0YXRlID0gY29udGV4dC5kb25lXG4gICAgICAgICAgICA/IEdlblN0YXRlQ29tcGxldGVkXG4gICAgICAgICAgICA6IEdlblN0YXRlU3VzcGVuZGVkWWllbGQ7XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLFxuICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lXG4gICAgICAgICAgfTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgIC8vIERpc3BhdGNoIHRoZSBleGNlcHRpb24gYnkgbG9vcGluZyBiYWNrIGFyb3VuZCB0byB0aGVcbiAgICAgICAgICAvLyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGVcbiAgLy8gcmVzdWx0LCBlaXRoZXIgYnkgcmV0dXJuaW5nIGEgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdCBmcm9tIHRoZVxuICAvLyBkZWxlZ2F0ZSBpdGVyYXRvciwgb3IgYnkgbW9kaWZ5aW5nIGNvbnRleHQubWV0aG9kIGFuZCBjb250ZXh0LmFyZyxcbiAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuXG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kTmFtZSA9IGNvbnRleHQubWV0aG9kO1xuICAgIHZhciBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvclttZXRob2ROYW1lXTtcbiAgICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEEgLnRocm93IG9yIC5yZXR1cm4gd2hlbiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIG5vIC50aHJvd1xuICAgICAgLy8gbWV0aG9kLCBvciBhIG1pc3NpbmcgLm5leHQgbWVodG9kLCBhbHdheXMgdGVybWluYXRlIHRoZVxuICAgICAgLy8geWllbGQqIGxvb3AuXG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgLy8gTm90ZTogW1wicmV0dXJuXCJdIG11c3QgYmUgdXNlZCBmb3IgRVMzIHBhcnNpbmcgY29tcGF0aWJpbGl0eS5cbiAgICAgIGlmIChtZXRob2ROYW1lID09PSBcInRocm93XCIgJiYgZGVsZWdhdGUuaXRlcmF0b3JbXCJyZXR1cm5cIl0pIHtcbiAgICAgICAgLy8gSWYgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBhIHJldHVybiBtZXRob2QsIGdpdmUgaXQgYVxuICAgICAgICAvLyBjaGFuY2UgdG8gY2xlYW4gdXAuXG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuXG4gICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgLy8gSWYgbWF5YmVJbnZva2VEZWxlZ2F0ZShjb250ZXh0KSBjaGFuZ2VkIGNvbnRleHQubWV0aG9kIGZyb21cbiAgICAgICAgICAvLyBcInJldHVyblwiIHRvIFwidGhyb3dcIiwgbGV0IHRoYXQgb3ZlcnJpZGUgdGhlIFR5cGVFcnJvciBiZWxvdy5cbiAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1ldGhvZE5hbWUgIT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBcIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJ1wiICsgbWV0aG9kTmFtZSArIFwiJyBtZXRob2RcIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChtZXRob2QsIGRlbGVnYXRlLml0ZXJhdG9yLCBjb250ZXh0LmFyZyk7XG5cbiAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciBpbmZvID0gcmVjb3JkLmFyZztcblxuICAgIGlmICghIGluZm8pIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFwiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3RcIik7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgIC8vIEFzc2lnbiB0aGUgcmVzdWx0IG9mIHRoZSBmaW5pc2hlZCBkZWxlZ2F0ZSB0byB0aGUgdGVtcG9yYXJ5XG4gICAgICAvLyB2YXJpYWJsZSBzcGVjaWZpZWQgYnkgZGVsZWdhdGUucmVzdWx0TmFtZSAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dFtkZWxlZ2F0ZS5yZXN1bHROYW1lXSA9IGluZm8udmFsdWU7XG5cbiAgICAgIC8vIFJlc3VtZSBleGVjdXRpb24gYXQgdGhlIGRlc2lyZWQgbG9jYXRpb24gKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2M7XG5cbiAgICAgIC8vIElmIGNvbnRleHQubWV0aG9kIHdhcyBcInRocm93XCIgYnV0IHRoZSBkZWxlZ2F0ZSBoYW5kbGVkIHRoZVxuICAgICAgLy8gZXhjZXB0aW9uLCBsZXQgdGhlIG91dGVyIGdlbmVyYXRvciBwcm9jZWVkIG5vcm1hbGx5LiBJZlxuICAgICAgLy8gY29udGV4dC5tZXRob2Qgd2FzIFwibmV4dFwiLCBmb3JnZXQgY29udGV4dC5hcmcgc2luY2UgaXQgaGFzIGJlZW5cbiAgICAgIC8vIFwiY29uc3VtZWRcIiBieSB0aGUgZGVsZWdhdGUgaXRlcmF0b3IuIElmIGNvbnRleHQubWV0aG9kIHdhc1xuICAgICAgLy8gXCJyZXR1cm5cIiwgYWxsb3cgdGhlIG9yaWdpbmFsIC5yZXR1cm4gY2FsbCB0byBjb250aW51ZSBpbiB0aGVcbiAgICAgIC8vIG91dGVyIGdlbmVyYXRvci5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCAhPT0gXCJyZXR1cm5cIikge1xuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZS15aWVsZCB0aGUgcmVzdWx0IHJldHVybmVkIGJ5IHRoZSBkZWxlZ2F0ZSBtZXRob2QuXG4gICAgICByZXR1cm4gaW5mbztcbiAgICB9XG5cbiAgICAvLyBUaGUgZGVsZWdhdGUgaXRlcmF0b3IgaXMgZmluaXNoZWQsIHNvIGZvcmdldCBpdCBhbmQgY29udGludWUgd2l0aFxuICAgIC8vIHRoZSBvdXRlciBnZW5lcmF0b3IuXG4gICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gIH1cblxuICAvLyBEZWZpbmUgR2VuZXJhdG9yLnByb3RvdHlwZS57bmV4dCx0aHJvdyxyZXR1cm59IGluIHRlcm1zIG9mIHRoZVxuICAvLyB1bmlmaWVkIC5faW52b2tlIGhlbHBlciBtZXRob2QuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCk7XG5cbiAgZGVmaW5lKEdwLCB0b1N0cmluZ1RhZ1N5bWJvbCwgXCJHZW5lcmF0b3JcIik7XG5cbiAgLy8gQSBHZW5lcmF0b3Igc2hvdWxkIGFsd2F5cyByZXR1cm4gaXRzZWxmIGFzIHRoZSBpdGVyYXRvciBvYmplY3Qgd2hlbiB0aGVcbiAgLy8gQEBpdGVyYXRvciBmdW5jdGlvbiBpcyBjYWxsZWQgb24gaXQuIFNvbWUgYnJvd3NlcnMnIGltcGxlbWVudGF0aW9ucyBvZiB0aGVcbiAgLy8gaXRlcmF0b3IgcHJvdG90eXBlIGNoYWluIGluY29ycmVjdGx5IGltcGxlbWVudCB0aGlzLCBjYXVzaW5nIHRoZSBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0IHRvIG5vdCBiZSByZXR1cm5lZCBmcm9tIHRoaXMgY2FsbC4gVGhpcyBlbnN1cmVzIHRoYXQgZG9lc24ndCBoYXBwZW4uXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvaXNzdWVzLzI3NCBmb3IgbW9yZSBkZXRhaWxzLlxuICBkZWZpbmUoR3AsIGl0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSk7XG5cbiAgZGVmaW5lKEdwLCBcInRvU3RyaW5nXCIsIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcIltvYmplY3QgR2VuZXJhdG9yXVwiO1xuICB9KTtcblxuICBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykge1xuICAgIHZhciBlbnRyeSA9IHsgdHJ5TG9jOiBsb2NzWzBdIH07XG5cbiAgICBpZiAoMSBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV07XG4gICAgfVxuXG4gICAgaWYgKDIgaW4gbG9jcykge1xuICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07XG4gICAgICBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM107XG4gICAgfVxuXG4gICAgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9O1xuICAgIHJlY29yZC50eXBlID0gXCJub3JtYWxcIjtcbiAgICBkZWxldGUgcmVjb3JkLmFyZztcbiAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgIC8vIFRoZSByb290IGVudHJ5IG9iamVjdCAoZWZmZWN0aXZlbHkgYSB0cnkgc3RhdGVtZW50IHdpdGhvdXQgYSBjYXRjaFxuICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb21cbiAgICAvLyBsb2NhdGlvbnMgd2hlcmUgdGhlcmUgaXMgbm8gZW5jbG9zaW5nIHRyeSBzdGF0ZW1lbnQuXG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XTtcbiAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7XG4gICAgdGhpcy5yZXNldCh0cnVlKTtcbiAgfVxuXG4gIGV4cG9ydHMua2V5cyA9IGZ1bmN0aW9uKHZhbCkge1xuICAgIHZhciBvYmplY3QgPSBPYmplY3QodmFsKTtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgICBrZXlzLnJldmVyc2UoKTtcblxuICAgIC8vIFJhdGhlciB0aGFuIHJldHVybmluZyBhbiBvYmplY3Qgd2l0aCBhIG5leHQgbWV0aG9kLCB3ZSBrZWVwXG4gICAgLy8gdGhpbmdzIHNpbXBsZSBhbmQgcmV0dXJuIHRoZSBuZXh0IGZ1bmN0aW9uIGl0c2VsZi5cbiAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTtcbiAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICBuZXh0LnZhbHVlID0ga2V5O1xuICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRvIGF2b2lkIGNyZWF0aW5nIGFuIGFkZGl0aW9uYWwgb2JqZWN0LCB3ZSBqdXN0IGhhbmcgdGhlIC52YWx1ZVxuICAgICAgLy8gYW5kIC5kb25lIHByb3BlcnRpZXMgb2ZmIHRoZSBuZXh0IGZ1bmN0aW9uIG9iamVjdCBpdHNlbGYuIFRoaXNcbiAgICAgIC8vIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBtaW5pZmllciB3aWxsIG5vdCBhbm9ueW1pemUgdGhlIGZ1bmN0aW9uLlxuICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7XG4gICAgaWYgKGl0ZXJhYmxlKSB7XG4gICAgICB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07XG4gICAgICBpZiAoaXRlcmF0b3JNZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGl0ZXJhYmxlLm5leHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gaXRlcmFibGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkge1xuICAgICAgICB2YXIgaSA9IC0xLCBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgaXRlcmFibGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoaXRlcmFibGUsIGkpKSB7XG4gICAgICAgICAgICAgIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXTtcbiAgICAgICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG5leHQudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBhbiBpdGVyYXRvciB3aXRoIG5vIHZhbHVlcy5cbiAgICByZXR1cm4geyBuZXh0OiBkb25lUmVzdWx0IH07XG4gIH1cbiAgZXhwb3J0cy52YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHtcbiAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIH1cblxuICBDb250ZXh0LnByb3RvdHlwZSA9IHtcbiAgICBjb25zdHJ1Y3RvcjogQ29udGV4dCxcblxuICAgIHJlc2V0OiBmdW5jdGlvbihza2lwVGVtcFJlc2V0KSB7XG4gICAgICB0aGlzLnByZXYgPSAwO1xuICAgICAgdGhpcy5uZXh0ID0gMDtcbiAgICAgIC8vIFJlc2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcblxuICAgICAgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSk7XG5cbiAgICAgIGlmICghc2tpcFRlbXBSZXNldCkge1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHtcbiAgICAgICAgICAvLyBOb3Qgc3VyZSBhYm91dCB0aGUgb3B0aW1hbCBvcmRlciBvZiB0aGVzZSBjb25kaXRpb25zOlxuICAgICAgICAgIGlmIChuYW1lLmNoYXJBdCgwKSA9PT0gXCJ0XCIgJiZcbiAgICAgICAgICAgICAgaGFzT3duLmNhbGwodGhpcywgbmFtZSkgJiZcbiAgICAgICAgICAgICAgIWlzTmFOKCtuYW1lLnNsaWNlKDEpKSkge1xuICAgICAgICAgICAgdGhpc1tuYW1lXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuXG4gICAgICB2YXIgcm9vdEVudHJ5ID0gdGhpcy50cnlFbnRyaWVzWzBdO1xuICAgICAgdmFyIHJvb3RSZWNvcmQgPSByb290RW50cnkuY29tcGxldGlvbjtcbiAgICAgIGlmIChyb290UmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByb290UmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucnZhbDtcbiAgICB9LFxuXG4gICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uKGV4Y2VwdGlvbikge1xuICAgICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgICB0aHJvdyBleGNlcHRpb247XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkge1xuICAgICAgICByZWNvcmQudHlwZSA9IFwidGhyb3dcIjtcbiAgICAgICAgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbjtcbiAgICAgICAgY29udGV4dC5uZXh0ID0gbG9jO1xuXG4gICAgICAgIGlmIChjYXVnaHQpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGlzcGF0Y2hlZCBleGNlcHRpb24gd2FzIGNhdWdodCBieSBhIGNhdGNoIGJsb2NrLFxuICAgICAgICAgIC8vIHRoZW4gbGV0IHRoYXQgY2F0Y2ggYmxvY2sgaGFuZGxlIHRoZSBleGNlcHRpb24gbm9ybWFsbHkuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhISBjYXVnaHQ7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSBcInJvb3RcIikge1xuICAgICAgICAgIC8vIEV4Y2VwdGlvbiB0aHJvd24gb3V0c2lkZSBvZiBhbnkgdHJ5IGJsb2NrIHRoYXQgY291bGQgaGFuZGxlXG4gICAgICAgICAgLy8gaXQsIHNvIHNldCB0aGUgY29tcGxldGlvbiB2YWx1ZSBvZiB0aGUgZW50aXJlIGZ1bmN0aW9uIHRvXG4gICAgICAgICAgLy8gdGhyb3cgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICByZXR1cm4gaGFuZGxlKFwiZW5kXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHtcbiAgICAgICAgICB2YXIgaGFzQ2F0Y2ggPSBoYXNPd24uY2FsbChlbnRyeSwgXCJjYXRjaExvY1wiKTtcbiAgICAgICAgICB2YXIgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIik7XG5cbiAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHlcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFicnVwdDogZnVuY3Rpb24odHlwZSwgYXJnKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIikgJiZcbiAgICAgICAgICAgIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB2YXIgZmluYWxseUVudHJ5ID0gZW50cnk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSAmJlxuICAgICAgICAgICh0eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICAgdHlwZSA9PT0gXCJjb250aW51ZVwiKSAmJlxuICAgICAgICAgIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmXG4gICAgICAgICAgYXJnIDw9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgIC8vIElnbm9yZSB0aGUgZmluYWxseSBlbnRyeSBpZiBjb250cm9sIGlzIG5vdCBqdW1waW5nIHRvIGFcbiAgICAgICAgLy8gbG9jYXRpb24gb3V0c2lkZSB0aGUgdHJ5L2NhdGNoIGJsb2NrLlxuICAgICAgICBmaW5hbGx5RW50cnkgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVjb3JkID0gZmluYWxseUVudHJ5ID8gZmluYWxseUVudHJ5LmNvbXBsZXRpb24gOiB7fTtcbiAgICAgIHJlY29yZC50eXBlID0gdHlwZTtcbiAgICAgIHJlY29yZC5hcmcgPSBhcmc7XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkpIHtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2M7XG4gICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZShyZWNvcmQpO1xuICAgIH0sXG5cbiAgICBjb21wbGV0ZTogZnVuY3Rpb24ocmVjb3JkLCBhZnRlckxvYykge1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICByZWNvcmQudHlwZSA9PT0gXCJjb250aW51ZVwiKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IHJlY29yZC5hcmc7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInJldHVyblwiKSB7XG4gICAgICAgIHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICB0aGlzLm5leHQgPSBcImVuZFwiO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIiAmJiBhZnRlckxvYykge1xuICAgICAgICB0aGlzLm5leHQgPSBhZnRlckxvYztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oZmluYWxseUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyk7XG4gICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgXCJjYXRjaFwiOiBmdW5jdGlvbih0cnlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHtcbiAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcbiAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRocm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgY29udGV4dC5jYXRjaCBtZXRob2QgbXVzdCBvbmx5IGJlIGNhbGxlZCB3aXRoIGEgbG9jYXRpb25cbiAgICAgIC8vIGFyZ3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBrbm93biBjYXRjaCBibG9jay5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTtcbiAgICB9LFxuXG4gICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24oaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLFxuICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLFxuICAgICAgICBuZXh0TG9jOiBuZXh0TG9jXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgIC8vIERlbGliZXJhdGVseSBmb3JnZXQgdGhlIGxhc3Qgc2VudCB2YWx1ZSBzbyB0aGF0IHdlIGRvbid0XG4gICAgICAgIC8vIGFjY2lkZW50YWxseSBwYXNzIGl0IG9uIHRvIHRoZSBkZWxlZ2F0ZS5cbiAgICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cbiAgfTtcblxuICAvLyBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhpcyBzY3JpcHQgaXMgZXhlY3V0aW5nIGFzIGEgQ29tbW9uSlMgbW9kdWxlXG4gIC8vIG9yIG5vdCwgcmV0dXJuIHRoZSBydW50aW1lIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBkZWNsYXJlIHRoZSB2YXJpYWJsZVxuICAvLyByZWdlbmVyYXRvclJ1bnRpbWUgaW4gdGhlIG91dGVyIHNjb3BlLCB3aGljaCBhbGxvd3MgdGhpcyBtb2R1bGUgdG8gYmVcbiAgLy8gaW5qZWN0ZWQgZWFzaWx5IGJ5IGBiaW4vcmVnZW5lcmF0b3IgLS1pbmNsdWRlLXJ1bnRpbWUgc2NyaXB0LmpzYC5cbiAgcmV0dXJuIGV4cG9ydHM7XG5cbn0oXG4gIC8vIElmIHRoaXMgc2NyaXB0IGlzIGV4ZWN1dGluZyBhcyBhIENvbW1vbkpTIG1vZHVsZSwgdXNlIG1vZHVsZS5leHBvcnRzXG4gIC8vIGFzIHRoZSByZWdlbmVyYXRvclJ1bnRpbWUgbmFtZXNwYWNlLiBPdGhlcndpc2UgY3JlYXRlIGEgbmV3IGVtcHR5XG4gIC8vIG9iamVjdC4gRWl0aGVyIHdheSwgdGhlIHJlc3VsdGluZyBvYmplY3Qgd2lsbCBiZSB1c2VkIHRvIGluaXRpYWxpemVcbiAgLy8gdGhlIHJlZ2VuZXJhdG9yUnVudGltZSB2YXJpYWJsZSBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS5cbiAgdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiA/IG1vZHVsZS5leHBvcnRzIDoge31cbikpO1xuXG50cnkge1xuICByZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lO1xufSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHtcbiAgLy8gVGhpcyBtb2R1bGUgc2hvdWxkIG5vdCBiZSBydW5uaW5nIGluIHN0cmljdCBtb2RlLCBzbyB0aGUgYWJvdmVcbiAgLy8gYXNzaWdubWVudCBzaG91bGQgYWx3YXlzIHdvcmsgdW5sZXNzIHNvbWV0aGluZyBpcyBtaXNjb25maWd1cmVkLiBKdXN0XG4gIC8vIGluIGNhc2UgcnVudGltZS5qcyBhY2NpZGVudGFsbHkgcnVucyBpbiBzdHJpY3QgbW9kZSwgaW4gbW9kZXJuIGVuZ2luZXNcbiAgLy8gd2UgY2FuIGV4cGxpY2l0bHkgYWNjZXNzIGdsb2JhbFRoaXMuIEluIG9sZGVyIGVuZ2luZXMgd2UgY2FuIGVzY2FwZVxuICAvLyBzdHJpY3QgbW9kZSB1c2luZyBhIGdsb2JhbCBGdW5jdGlvbiBjYWxsLiBUaGlzIGNvdWxkIGNvbmNlaXZhYmx5IGZhaWxcbiAgLy8gaWYgYSBDb250ZW50IFNlY3VyaXR5IFBvbGljeSBmb3JiaWRzIHVzaW5nIEZ1bmN0aW9uLCBidXQgaW4gdGhhdCBjYXNlXG4gIC8vIHRoZSBwcm9wZXIgc29sdXRpb24gaXMgdG8gZml4IHRoZSBhY2NpZGVudGFsIHN0cmljdCBtb2RlIHByb2JsZW0uIElmXG4gIC8vIHlvdSd2ZSBtaXNjb25maWd1cmVkIHlvdXIgYnVuZGxlciB0byBmb3JjZSBzdHJpY3QgbW9kZSBhbmQgYXBwbGllZCBhXG4gIC8vIENTUCB0byBmb3JiaWQgRnVuY3Rpb24sIGFuZCB5b3UncmUgbm90IHdpbGxpbmcgdG8gZml4IGVpdGhlciBvZiB0aG9zZVxuICAvLyBwcm9ibGVtcywgcGxlYXNlIGRldGFpbCB5b3VyIHVuaXF1ZSBwcmVkaWNhbWVudCBpbiBhIEdpdEh1YiBpc3N1ZS5cbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSBcIm9iamVjdFwiKSB7XG4gICAgZ2xvYmFsVGhpcy5yZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lO1xuICB9IGVsc2Uge1xuICAgIEZ1bmN0aW9uKFwiclwiLCBcInJlZ2VuZXJhdG9yUnVudGltZSA9IHJcIikocnVudGltZSk7XG4gIH1cbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/regenerator-runtime/runtime.js\n"); - -/***/ }) - -},[["./node_modules/next/dist/client/dev/amp-dev.js","webpack"]]]); \ No newline at end of file diff --git a/_next/static/chunks/commons.2e0df298e5fe50ac3b9f.js b/_next/static/chunks/commons.2e0df298e5fe50ac3b9f.js new file mode 100644 index 000000000..a3ca559d3 --- /dev/null +++ b/_next/static/chunks/commons.2e0df298e5fe50ac3b9f.js @@ -0,0 +1 @@ +(window.webpackJsonp_N_E=window.webpackJsonp_N_E||[]).push([[0],{"7W2i":function(t,r,e){var n=e("SksO");t.exports=function(t,r){if("function"!==typeof r&&null!==r)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(r&&r.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),r&&n(t,r)}},FYa8:function(t,r,e){"use strict";var n;r.__esModule=!0,r.HeadManagerContext=void 0;var o=((n=e("q1tI"))&&n.__esModule?n:{default:n}).default.createContext({});r.HeadManagerContext=o},Nsbk:function(t,r){function e(r){return t.exports=e=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)},e(r)}t.exports=e},PJYZ:function(t,r){t.exports=function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}},Qetd:function(t,r,e){"use strict";var n=Object.assign.bind(Object);t.exports=n,t.exports.default=t.exports},SksO:function(t,r){function e(r,n){return t.exports=e=Object.setPrototypeOf||function(t,r){return t.__proto__=r,t},e(r,n)}t.exports=e},TqRt:function(t,r){t.exports=function(t){return t&&t.__esModule?t:{default:t}}},W8MJ:function(t,r){function e(t,r){for(var e=0;et.length)&&(r=t.length);for(var e=0,n=new Array(r);e=0;--i){var a=this.tryEntries[i],c=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var u=n.call(a,"catchLoc"),f=n.call(a,"finallyLoc");if(u&&f){if(this.prev=0;--e){var o=this.tryEntries[e];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--r){var e=this.tryEntries[r];if(e.finallyLoc===t)return this.complete(e.completion,e.afterLoc),S(e),v}},catch:function(t){for(var r=this.tryEntries.length-1;r>=0;--r){var e=this.tryEntries[r];if(e.tryLoc===t){var n=e.completion;if("throw"===n.type){var o=n.arg;S(e)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:N(t),resultName:e,nextLoc:n},"next"===this.method&&(this.arg=r),v}},t}(t.exports);try{regeneratorRuntime=n}catch(o){"object"===typeof globalThis?globalThis.regeneratorRuntime=n:Function("r","regeneratorRuntime = r")(n)}},lwsE:function(t,r){t.exports=function(t,r){if(!(t instanceof r))throw new TypeError("Cannot call a class as a function")}},ntbh:function(t,r){(function(r){t.exports=function(){var t={149:function(t){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(e){"object"===typeof window&&(r=window)}t.exports=r}},e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={exports:{}},i=!0;try{t[r](o,o.exports,n),i=!1}finally{i&&delete e[r]}return o.exports}return n.ab=r+"/",n(149)}()}).call(this,"/")},o0o1:function(t,r,e){t.exports=e("ls82")},pVnL:function(t,r){function e(){return t.exports=e=Object.assign||function(t){for(var r=1;r=t){r=e;break}e=e.next}while(e!==n);null===r?r=n:r===n&&(n=u,c()),(t=r.previous).next=r.previous=u,u.next=r,u.previous=t}}function f(){if(-1===i&&null!==n&&1===n.priorityLevel){o=!0;try{do{s()}while(null!==n&&1===n.priorityLevel)}finally{o=!1,null!==n?c():u=!1}}}function d(e){o=!0;var l=r;r=e;try{if(e)for(;null!==n;){var i=t.unstable_now();if(!(n.expirationTime<=i))break;do{s()}while(null!==n&&n.expirationTime<=i)}else if(null!==n)do{s()}while(null!==n&&!_())}finally{o=!1,r=l,null!==n?c():u=!1,f()}}var p,m,h=Date,v="function"===typeof setTimeout?setTimeout:void 0,y="function"===typeof clearTimeout?clearTimeout:void 0,g="function"===typeof requestAnimationFrame?requestAnimationFrame:void 0,b="function"===typeof cancelAnimationFrame?cancelAnimationFrame:void 0;function k(e){p=g((function(t){y(m),e(t)})),m=v((function(){b(p),e(t.unstable_now())}),100)}if("object"===typeof performance&&"function"===typeof performance.now){var x=performance;t.unstable_now=function(){return x.now()}}else t.unstable_now=function(){return h.now()};var w,T,_,S=null;if("undefined"!==typeof window?S=window:"undefined"!==typeof e&&(S=e),S&&S._schedMock){var E=S._schedMock;w=E[0],T=E[1],_=E[2],t.unstable_now=E[3]}else if("undefined"===typeof window||"function"!==typeof MessageChannel){var C=null,P=function(e){if(null!==C)try{C(e)}finally{C=null}};w=function(e){null!==C?setTimeout(w,0,e):(C=e,setTimeout(P,0,!1))},T=function(){C=null},_=function(){return!1}}else{"undefined"!==typeof console&&("function"!==typeof g&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"),"function"!==typeof b&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"));var N=null,R=!1,O=-1,z=!1,I=!1,U=0,M=33,D=33;_=function(){return U<=t.unstable_now()};var F=new MessageChannel,L=F.port2;F.port1.onmessage=function(){R=!1;var e=N,n=O;N=null,O=-1;var r=t.unstable_now(),l=!1;if(0>=U-r){if(!(-1!==n&&n<=r))return z||(z=!0,k(A)),N=e,void(O=n);l=!0}if(null!==e){I=!0;try{e(l)}finally{I=!1}}};var A=function(e){if(null!==N){k(A);var t=e-U+D;tt&&(t=8),D=tt?L.postMessage(void 0):z||(z=!0,k(A))},T=function(){N=null,R=!1,O=-1}}t.unstable_ImmediatePriority=1,t.unstable_UserBlockingPriority=2,t.unstable_NormalPriority=3,t.unstable_IdlePriority=5,t.unstable_LowPriority=4,t.unstable_runWithPriority=function(e,n){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var r=l,a=i;l=e,i=t.unstable_now();try{return n()}finally{l=r,i=a,f()}},t.unstable_next=function(e){switch(l){case 1:case 2:case 3:var n=3;break;default:n=l}var r=l,a=i;l=n,i=t.unstable_now();try{return e()}finally{l=r,i=a,f()}},t.unstable_scheduleCallback=function(e,r){var a=-1!==i?i:t.unstable_now();if("object"===typeof r&&null!==r&&"number"===typeof r.timeout)r=a+r.timeout;else switch(l){case 1:r=a+-1;break;case 2:r=a+250;break;case 5:r=a+1073741823;break;case 4:r=a+1e4;break;default:r=a+5e3}if(e={callback:e,priorityLevel:l,expirationTime:r,next:null,previous:null},null===n)n=e.next=e.previous=e,c();else{a=null;var o=n;do{if(o.expirationTime>r){a=o;break}o=o.next}while(o!==n);null===a?a=n:a===n&&(n=e,c()),(r=a.previous).next=a.previous=e,e.next=a,e.previous=r}return e},t.unstable_cancelCallback=function(e){var t=e.next;if(null!==t){if(t===e)n=null;else{e===n&&(n=t);var r=e.previous;r.next=t,t.previous=r}e.next=e.previous=null}},t.unstable_wrapCallback=function(e){var n=l;return function(){var r=l,a=i;l=n,i=t.unstable_now();try{return e.apply(this,arguments)}finally{l=r,i=a,f()}}},t.unstable_getCurrentPriorityLevel=function(){return l},t.unstable_shouldYield=function(){return!r&&(null!==n&&n.expirationTimeI.length&&I.push(e)}function D(e,t,n,r){var l=typeof e;"undefined"!==l&&"boolean"!==l||(e=null);var o=!1;if(null===e)o=!0;else switch(l){case"string":case"number":o=!0;break;case"object":switch(e.$$typeof){case i:case a:o=!0}}if(o)return n(r,e,""===t?"."+L(e,0):t),1;if(o=0,t=""===t?".":t+":",Array.isArray(e))for(var u=0;uthis.eventPool.length&&this.eventPool.push(e)}function pe(e){e.eventPool=[],e.getPooled=fe,e.release=de}l(se.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!==typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=ue)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!==typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=ue)},persist:function(){this.isPersistent=ue},isPersistent:ce,destructor:function(){var e,t=this.constructor.Interface;for(e in t)this[e]=null;this.nativeEvent=this._targetInst=this.dispatchConfig=null,this.isPropagationStopped=this.isDefaultPrevented=ce,this._dispatchInstances=this._dispatchListeners=null}}),se.Interface={type:null,target:null,currentTarget:function(){return null},eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null},se.extend=function(e){function t(){}function n(){return r.apply(this,arguments)}var r=this;t.prototype=r.prototype;var i=new t;return l(i,n.prototype),n.prototype=i,n.prototype.constructor=n,n.Interface=l({},r.Interface,e),n.extend=r.extend,pe(n),n},pe(se);var me=se.extend({data:null}),he=se.extend({data:null}),ve=[9,13,27,32],ye=q&&"CompositionEvent"in window,ge=null;q&&"documentMode"in document&&(ge=document.documentMode);var be=q&&"TextEvent"in window&&!ge,ke=q&&(!ye||ge&&8=ge),xe=String.fromCharCode(32),we={beforeInput:{phasedRegistrationNames:{bubbled:"onBeforeInput",captured:"onBeforeInputCapture"},dependencies:["compositionend","keypress","textInput","paste"]},compositionEnd:{phasedRegistrationNames:{bubbled:"onCompositionEnd",captured:"onCompositionEndCapture"},dependencies:"blur compositionend keydown keypress keyup mousedown".split(" ")},compositionStart:{phasedRegistrationNames:{bubbled:"onCompositionStart",captured:"onCompositionStartCapture"},dependencies:"blur compositionstart keydown keypress keyup mousedown".split(" ")},compositionUpdate:{phasedRegistrationNames:{bubbled:"onCompositionUpdate",captured:"onCompositionUpdateCapture"},dependencies:"blur compositionupdate keydown keypress keyup mousedown".split(" ")}},Te=!1;function _e(e,t){switch(e){case"keyup":return-1!==ve.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"blur":return!0;default:return!1}}function Se(e){return"object"===typeof(e=e.detail)&&"data"in e?e.data:null}var Ee=!1;var Ce={eventTypes:we,extractEvents:function(e,t,n,r){var l=void 0,i=void 0;if(ye)e:{switch(e){case"compositionstart":l=we.compositionStart;break e;case"compositionend":l=we.compositionEnd;break e;case"compositionupdate":l=we.compositionUpdate;break e}l=void 0}else Ee?_e(e,n)&&(l=we.compositionEnd):"keydown"===e&&229===n.keyCode&&(l=we.compositionStart);return l?(ke&&"ko"!==n.locale&&(Ee||l!==we.compositionStart?l===we.compositionEnd&&Ee&&(i=oe()):(ie="value"in(le=r)?le.value:le.textContent,Ee=!0)),l=me.getPooled(l,t,n,r),i?l.data=i:null!==(i=Se(n))&&(l.data=i),Q(l),i=l):i=null,(e=be?function(e,t){switch(e){case"compositionend":return Se(t);case"keypress":return 32!==t.which?null:(Te=!0,xe);case"textInput":return(e=t.data)===xe&&Te?null:e;default:return null}}(e,n):function(e,t){if(Ee)return"compositionend"===e||!ye&&_e(e,t)?(e=oe(),ae=ie=le=null,Ee=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1